Files
arcrun-collector/cloud_version_test.go
T
Leo e516e0dbce t177 修「知識庫需要更新」永遠消不掉:semver 打爆字串比較(兩份都修)
【leo 08-04 實撞】「刷新完兩個雲端,為什麼還要我去更新?」
實測坐實**更新其實成功了**:youlin 實例 /health = 1.4.6、daemon 已 v0.15.3,
但托盤兩個帳號都掛「⚠ 知識庫需要更新(點我)」。

【真兇】版本號 08-02 由 `2026-07-31+8e83589` 改成 semver(`1.4.6`)後,
判斷式仍是 `date < "2026-07-28"` ——**字串比較**:
    "1.4.6"      < "2026-07-28" → true   ⚠️ 最新版被判過舊
    "2026-07-31" < "2026-07-28" → false  舊格式才會對
⇒ **任何 semver 都恆判過舊,更新幾次都消不掉。** 這是 wiki 事故 D,08-02 立案未修。

【修法】照事故 D 定案③「兩種格式都要認」:
semver(X.Y.Z 純數字三段)⇒ 視為新契約、不判過舊;
舊日期格式 ⇒ 維持日期比較,讓尚未更新的老實例仍被正確提示(不為修 A 而漏報 B)。

⚠️ **這 bug 有兩份**(tasks.md:2592 早就寫明),兩份都修:
  collector/cloud_version.go  的 cloudVersionStale
  cmd/arcrun-tray/main.go     的 trayCloudVersionStale

【為什麼會出貨】collector 那份**一直有測試**、tray 那份**完全沒有**
⇒ 沒有任何閘擋得住。本 commit 補上 cmd/arcrun-tray/cloudversion_test.go。

【測試證明有效,非裝飾】暫時把 semver 分支拿掉重跑 → 三個 case 立刻紅
(含「leo 08-04 實撞的那一版」);裝回去即綠。
兩模組全測試綠(collector/supervisor/tray)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 09:38:19 +08:00

77 lines
3.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// cloud_version_test.go — t103 雲端版本判定函式 4 案單元測試。
package main
import (
"os"
"testing"
)
// TestMain 在所有測試執行前把 fetchCloudVersion 換成 stub(回 ("", false)),
// 避免各測試的假 httptest.Server 或離線環境因真實 /health 呼叫炸掉測試。
// TestCloudVersionStale 直接測 cloudVersionStale 邏輯,不受此 stub 影響。
func TestMain(m *testing.M) {
fetchCloudVersion = func(string) (string, bool) { return "", false }
os.Exit(m.Run())
}
// TestCloudVersionStale 驗證四種判定情境:空版本/過舊/正常/解析失敗。
func TestCloudVersionStale(t *testing.T) {
cases := []struct {
name string
version string
checkOK bool
wantStale bool
}{
{
// 老實例:/health 可達但 bundle_version 為空字串 → 需要更新
name: "空版本(老實例)", version: "", checkOK: true, wantStale: true,
},
{
// 日期早於 minCloudBuilt → 需要更新
name: "過舊日期", version: "2026-07-27+abc1234", checkOK: true, wantStale: true,
},
{
// 日期等於 minCloudBuilt → 正常(剛好達標)
name: "正常(剛好達標)", version: "2026-07-28+abc1234", checkOK: true, wantStale: false,
},
{
// /health 不可達(解析失敗/逾時)→ 靜默不判定
name: "解析失敗(/health 不可達)", version: "", checkOK: false, wantStale: false,
},
// ── t177 回歸守衛(wiki 事故 D)──────────────────────────────────────
// leo 08-04 實撞:「刷新完兩個雲端,為什麼還要我去更新?」——實例已 1.4.6
// 卻仍掛「知識庫需要更新」。真兇=字串比較 `"1.4.6" < "2026-07-28"` 恆為 true
//(因為 "1" < "2")⇒ 任何 semver 都被判過舊,更新幾次都消不掉。
{
name: "t177 semver 最新版不得判過舊(leo 實撞的那一版)",
version: "1.4.6", checkOK: true, wantStale: false,
},
{
name: "t177 semver 舊版也不判過舊(semver 世代一律視為新契約)",
version: "1.4.1", checkOK: true, wantStale: false,
},
{
name: "t177 semver 帶 +sha 後綴同樣正確解析",
version: "1.4.6+deadbee", checkOK: true, wantStale: false,
},
{
// 相容性守衛:舊格式仍要能判出過舊,否則尚未更新的老實例會被漏報
name: "t177 舊日期格式仍正確判過舊(不可為修 semver 而漏報老實例)",
version: "2026-07-01+abc1234", checkOK: true, wantStale: true,
},
{
// 非 semver、非日期的怪字串 → 走舊路徑(字串比較),不當成 semver 放行
name: "t177 怪字串不得被誤認為 semver",
version: "1.4", checkOK: true, wantStale: true,
},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
got := cloudVersionStale(tc.version, tc.checkOK)
if got != tc.wantStale {
t.Errorf("cloudVersionStale(%q, %v) = %vwant %v", tc.version, tc.checkOK, got, tc.wantStale)
}
})
}
}