package version import ( "encoding/json" "os" "path/filepath" "testing" "gitgud.io/mike/mpv-manager/pkg/releasemanifest" "github.com/stretchr/testify/require" ) func TestReleaseChannelsRejectCrossFeedAndKeepSeparateTrust(t *testing.T) { original := CurrentVersion t.Cleanup(func() { CurrentVersion = original }) stableJSON := signedManifestJSON(t, `{"version":"1.3.0"}`) CurrentVersion = "1.3.0" require.Equal(t, ReleasesURL, releaseFeedURL()) _, err := decodeReleaseManifest([]byte(stableJSON)) require.NoError(t, err) stableState, err := os.ReadFile(filepath.Join(releaseTrustStateDirectory(), releaseTrustStateName)) require.NoError(t, err) var rc ReleaseInfo require.NoError(t, json.Unmarshal([]byte(stableJSON), &rc)) rc.Channel = releasemanifest.ReleaseCandidateChannel rc.Version = "1.3.0-rc.2" component := rc.Components[ComponentID] component.Version = rc.Version rc.Components[ComponentID] = component require.NoError(t, rc.Sign("test-release-key", testManifestPrivateKey)) rcJSON, err := json.Marshal(rc) require.NoError(t, err) _, err = decodeReleaseManifest(rcJSON) require.ErrorContains(t, err, "does not match this build channel") CurrentVersion = "1.3.0-rc.1+local-build" require.Equal(t, ReleaseCandidatesURL, releaseFeedURL()) _, err = decodeReleaseManifest([]byte(stableJSON)) require.ErrorContains(t, err, "does not match this build channel") _, err = decodeReleaseManifest(rcJSON) require.NoError(t, err) stateAfter, err := os.ReadFile(filepath.Join(releaseTrustStateDirectory(), releaseTrustStateName)) require.NoError(t, err) require.Equal(t, stableState, stateAfter) require.FileExists(t, filepath.Join(releaseTrustStateDirectory(), "release-trust-state-rc.json")) // A final-version artifact can be announced on the RC feed so testers // graduate to a final binary, whose next launch uses the stable feed. rc.Version = "1.3.0" component.Version = rc.Version rc.Components[ComponentID] = component rc.PublishedAt = "2026-08-30T12:01:00Z" require.NoError(t, rc.Sign("test-release-key", testManifestPrivateKey)) finalJSON, err := json.Marshal(rc) require.NoError(t, err) _, err = decodeReleaseManifest(finalJSON) require.NoError(t, err) require.Equal(t, -1, CompareVersions(CurrentVersion, rc.Version)) _, err = decodeReleaseManifest(rcJSON) require.ErrorContains(t, err, "older than the highest accepted publication") }