Files
arcrun-collector/cmd/arcrun-tray/cloudversion_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

57 lines
2.6 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.
// cloudversion_test.go — t177:托盤「知識庫需要更新」的判斷(wiki 事故 D)。
//
// 🔴 為什麼補這支:這個 bug **有兩份**collector/cloud_version.go 本 package 的
// trayCloudVersionStale),collector 那份一直有測試、**tray 這份沒有** ⇒ 沒人擋得住它出貨。
// leo 08-04 實撞:兩個帳號都更新到 1.4.6 了,托盤仍掛「知識庫需要更新(點我)」。
// 真兇=`"1.4.6" < "2026-07-28"` 是**字串比較**"1" < "2" 恆成立)⇒ 任何 semver 都被判過舊。
package main
import "testing"
func TestTrayCloudVersionStale(t *testing.T) {
cases := []struct {
name string
version string
checkOK bool
wantStale bool
}{
// ── t177 回歸守衛:semver 世代 ────────────────────────────────────
{"semver 最新版不得判過舊(leo 08-04 實撞的那一版)", "1.4.6", true, false},
{"semver 舊版也不判過舊(吐得出 semver=已是新契約)", "1.4.1", true, false},
{"semver 帶 +sha 後綴同樣正確解析", "1.4.6+deadbee", true, false},
// ── 相容性:舊格式仍要判得出過舊,否則老實例被漏報 ──────────────────
{"舊日期格式過舊仍要提示(不可為修 semver 而漏報)", "2026-07-01+abc1234", true, true},
{"舊日期格式剛好達標=不提示", "2026-07-28+abc1234", true, false},
// ── 邊界 ──────────────────────────────────────────────────────────
{"空版本(老實例)→ 提示", "", true, true},
{"/health 不可達 → 不判定(呼叫端另以『查不到版本』誠實顯示)", "", false, false},
{"怪字串不得被誤認為 semver", "1.4", true, true},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
if got := trayCloudVersionStale(tc.version, tc.checkOK); got != tc.wantStale {
t.Errorf("trayCloudVersionStale(%q, %v) = %vwant %v",
tc.version, tc.checkOK, got, tc.wantStale)
}
})
}
}
// isSemverLike 是上面那條判斷的關鍵——它認錯格式就會整條判斷跟著錯,故單獨釘死。
func TestIsSemverLike(t *testing.T) {
yes := []string{"1.4.6", "0.0.1", "10.20.30", "1.4.10"}
no := []string{"1.4", "1.4.6.7", "2026-07-28", "v1.4.6", "1.4.x", "", "a.b.c", "1..6"}
for _, s := range yes {
if !isSemverLike(s) {
t.Errorf("isSemverLike(%q) = falsewant true", s)
}
}
for _, s := range no {
if isSemverLike(s) {
t.Errorf("isSemverLike(%q) = truewant false", s)
}
}
}