package version import ( "bytes" "crypto/ed25519" "encoding/base64" "encoding/json" "testing" "gitgud.io/mike/mpv-manager/pkg/releasemanifest" "github.com/stretchr/testify/require" ) var testManifestPrivateKey = ed25519.NewKeyFromSeed(bytes.Repeat([]byte{0x42}, ed25519.SeedSize)) func signedManifestJSON(t *testing.T, raw string) string { t.Helper() previousTrustStateDirectory := releaseTrustStateDirectory trustStateDirectory := t.TempDir() releaseTrustStateDirectory = func() string { return trustStateDirectory } t.Cleanup(func() { releaseTrustStateDirectory = previousTrustStateDirectory }) var manifest ReleaseInfo require.NoError(t, json.Unmarshal([]byte(raw), &manifest)) if manifest.Version == "" { manifest.Version = "1.3.0" } manifest.SchemaVersion = releasemanifest.SchemaVersion manifest.Channel = releasemanifest.StableChannel manifest.PublishedAt = "2026-08-30T12:00:00Z" manifest.MinimumUpdaterVersion = "1.2.0" const digest = "blake3:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" legacyEntries := []struct { entry *struct{ URL, BLAKE3 string } goos string goarch string }{ {&manifest.Manager.LinuxAMD64, "linux", "amd64"}, {&manifest.Manager.LinuxARM64, "linux", "arm64"}, {&manifest.Manager.WinX86_64, "windows", "amd64"}, {&manifest.Manager.WinARM64, "windows", "arm64"}, {&manifest.Manager.MacosIntel, "darwin", "amd64"}, {&manifest.Manager.MacosARM, "darwin", "arm64"}, } for _, legacy := range legacyEntries { if legacy.entry.URL == "" { legacy.entry.URL = "https://example.test/mpv-manager-" + legacy.goos + "-" + legacy.goarch } // Legacy fixtures predate the authenticated schema and use mnemonic // placeholder hashes. Replace them with a valid matching digest before // constructing and signing the v2 component. legacy.entry.BLAKE3 = digest } asset := func(goos, goarch, url, hash string) releasemanifest.Asset { if url == "" { url = "https://example.test/mpv-manager-" + goos + "-" + goarch } cpuBaseline := "arm64" if goarch == "amd64" { cpuBaseline = "x86-64-v2" } return releasemanifest.Asset{ GOOS: goos, GOARCH: goarch, CPUBaseline: cpuBaseline, Format: releasemanifest.ManagerAssetFormat, URL: url, BLAKE3: hash, Size: 1024, InstallScope: releasemanifest.ManagerInstallScope, UpdateStrategy: releasemanifest.ManagerUpdateStrategy, ExpectedProduct: ProductID, ExpectedComponent: ComponentID, } } manifest.Components = map[string]releasemanifest.Component{ ComponentID: { Version: manifest.Version, Assets: []releasemanifest.Asset{ asset("linux", "amd64", manifest.Manager.LinuxAMD64.URL, manifest.Manager.LinuxAMD64.BLAKE3), asset("linux", "arm64", manifest.Manager.LinuxARM64.URL, manifest.Manager.LinuxARM64.BLAKE3), asset("windows", "amd64", manifest.Manager.WinX86_64.URL, manifest.Manager.WinX86_64.BLAKE3), asset("windows", "arm64", manifest.Manager.WinARM64.URL, manifest.Manager.WinARM64.BLAKE3), asset("darwin", "amd64", manifest.Manager.MacosIntel.URL, manifest.Manager.MacosIntel.BLAKE3), asset("darwin", "arm64", manifest.Manager.MacosARM.URL, manifest.Manager.MacosARM.BLAKE3), }, }, } require.NoError(t, manifest.Sign("test-release-key", testManifestPrivateKey)) data, err := json.Marshal(manifest) require.NoError(t, err) previous := ManifestPublicKeys ManifestPublicKeys = "test-release-key=" + base64.StdEncoding.EncodeToString(testManifestPrivateKey.Public().(ed25519.PublicKey)) t.Cleanup(func() { ManifestPublicKeys = previous }) return string(data) }