@@ -732,3 +732,44 @@ func TestDoDownload_CancelStopsRetry(t *testing.T) {
732732 }
733733}
734734
735+ // ─── classifyUpdateErr:UI 弹窗按 kind 查 i18n,分类错了用户看到的就是错文案 ──
736+
737+ type fakeTimeoutErr struct {}
738+
739+ func (fakeTimeoutErr ) Error () string { return "i/o timeout" }
740+ func (fakeTimeoutErr ) Timeout () bool { return true }
741+ func (fakeTimeoutErr ) Temporary () bool { return true }
742+
743+ func TestClassifyUpdateErr (t * testing.T ) {
744+ cases := []struct {
745+ name string
746+ err error
747+ want string
748+ }{
749+ {"nil" , nil , "unknown" },
750+ {"http_404" , & httpStatusError {code : 404 }, "http_404" },
751+ {"http_500" , & httpStatusError {code : 500 }, "http_5xx" },
752+ {"http_502" , & httpStatusError {code : 502 }, "http_5xx" },
753+ {"http_403" , & httpStatusError {code : 403 }, "unknown" },
754+ {"net_timeout" , fakeTimeoutErr {}, "network_timeout" },
755+ {"tls_handshake" , errors .New (`Get "https://x": net/http: TLS handshake timeout` ), "tls_handshake" },
756+ {"no_such_host" , errors .New ("dial tcp: lookup x: no such host" ), "conn_failed" },
757+ {"conn_refused" , errors .New ("dial tcp 1.2.3.4:443: connection refused" ), "conn_failed" },
758+ {"conn_reset" , errors .New ("read tcp: connection reset by peer" ), "conn_failed" },
759+ {"checksum" , errors .New ("完整性校验失败: 期望 abc, 实际 def" ), "checksum_mismatch" },
760+ {"sums_missing" , errors .New ("SHA256SUMS 中未找到 x" ), "checksum_mismatch" },
761+ {"url_blocked" , errors .New ("拒绝下载:非预期的更新包 URL: https://evil" ), "url_not_trusted" },
762+ {"tmpfile" , errors .New ("创建临时文件失败: permission denied" ), "disk_io" },
763+ {"write_fail" , errors .New ("写入失败: no space left on device" ), "disk_io" },
764+ {"generic_timeout" , errors .New ("context deadline exceeded" ), "network_timeout" },
765+ {"unknown_fallback" , errors .New ("something completely different" ), "unknown" },
766+ }
767+ for _ , tc := range cases {
768+ t .Run (tc .name , func (t * testing.T ) {
769+ if got := classifyUpdateErr (tc .err ); got != tc .want {
770+ t .Errorf ("classifyUpdateErr(%v) = %q, want %q" , tc .err , got , tc .want )
771+ }
772+ })
773+ }
774+ }
775+
0 commit comments