package updatecdn import ( "crypto/sha256" "encoding/hex" "encoding/json" "os" "path/filepath" "strings" "testing" ) func TestCatalogDesktopMapAndResolve(t *testing.T) { dir := t.TempDir() filesDir := filepath.Join(dir, "files") if err := os.Mkdir(filesDir, 0o755); err != nil { t.Fatal(err) } packageData := []byte("signed-tdesktop-update-package") packageName := "tx64upd7007000" if err := os.WriteFile(filepath.Join(filesDir, packageName), packageData, 0o600); err != nil { t.Fatal(err) } hash := sha256.Sum256(packageData) manifest := Manifest{ SchemaVersion: ManifestSchemaVersion, Desktop: map[string]map[string]DesktopRelease{ "win64": {"stable": { Build: 7007000, Version: "7.0.7", File: packageName, SHA256: hex.EncodeToString(hash[:]), Size: int64(len(packageData)), }}, }, Apps: map[string]map[string]ApplicationRelease{ "android": {"stable": { ID: 77, Version: "12.9.1", URL: "https://updates.example/app.apk", URLBySource: map[string]string{"com.example.store": "https://store.example/app"}, Notes: map[string]string{"en": "New version", "ru": "Новая версия"}, }}, }, } manifestPath := writeTestManifest(t, dir, manifest) catalog, err := LoadCatalog(manifestPath, filesDir) if err != nil { t.Fatal(err) } entry := catalog.DesktopMap()["win64"]["stable"] if entry["released"] != uint64(7007000) || entry["link"] != "/files/tx64upd7007000" { t.Fatalf("desktop entry = %#v", entry) } resolved, err := catalog.Resolve(ResolveRequest{ Platform: "android", Version: "12.9.0 (500)", Source: "com.example.store", LangCode: "ru-RU", }) if err != nil { t.Fatal(err) } if resolved == nil || resolved.ID != 77 || resolved.Text != "Новая версия" || resolved.URL != "https://store.example/app" { t.Fatalf("resolved update = %#v", resolved) } current, err := catalog.Resolve(ResolveRequest{Platform: "android", Version: "12.9.1", LangCode: "en"}) if err != nil { t.Fatal(err) } if current != nil { t.Fatalf("current client got update %#v", current) } } func TestLoadCatalogRejectsPackageHashMismatch(t *testing.T) { dir := t.TempDir() filesDir := filepath.Join(dir, "files") if err := os.Mkdir(filesDir, 0o755); err != nil { t.Fatal(err) } if err := os.WriteFile(filepath.Join(filesDir, "tx64upd7007000"), []byte("package"), 0o600); err != nil { t.Fatal(err) } manifestPath := writeTestManifest(t, dir, Manifest{ SchemaVersion: ManifestSchemaVersion, Desktop: map[string]map[string]DesktopRelease{ "win64": {"stable": {Build: 7007000, File: "tx64upd7007000", SHA256: strings.Repeat("0", 64)}}, }, }) if _, err := LoadCatalog(manifestPath, filesDir); err == nil { t.Fatal("hash mismatch accepted") } } func writeTestManifest(t *testing.T, dir string, manifest Manifest) string { t.Helper() data, err := json.Marshal(manifest) if err != nil { t.Fatal(err) } path := filepath.Join(dir, "manifest.json") if err := os.WriteFile(path, data, 0o600); err != nil { t.Fatal(err) } return path }