package version import ( "gitgud.io/mike/mpv-manager/pkg/releasemanifest" "github.com/stretchr/testify/require" "os" "runtime" "testing" ) func TestOctAuditRollbackReplayAfterBackupConsumed(t *testing.T) { if runtime.GOOS != "linux" { t.Skip("audit reproduction is qualified only for Linux and uses Linux config isolation") } p, primary, _, oldBytes, _ := prepareTransactionFixture(t, false) j, err := loadUpdateJournal(p.JournalPath) require.NoError(t, err) target := &j.Targets[0] require.NoError(t, replaceUpdateFile(target.Path, target.StagedPath, target.BackupPath)) target.Applied = true j.State = UpdateTransactionApplying j.ParentPID = 1 << 30 j.HelperPID = 0 require.NoError(t, writeUpdateJournal(p.JournalPath, j)) require.NoError(t, restoreUpdateFile(target.Path, target.BackupPath)) require.NoError(t, p.lock.release()) p.lock = nil err = recoverTransactionsLocked(primary) require.ErrorContains(t, err, "backup unavailable") restored, readErr := os.ReadFile(primary) require.NoError(t, readErr) require.Equal(t, oldBytes, restored) persisted, loadErr := loadUpdateJournal(p.JournalPath) require.NoError(t, loadErr) t.Logf("replay_error=%v restored_original=%v retained_state=%s", err, string(restored) == string(oldBytes), persisted.State) } func TestOctAuditCommittedJournalAfterManualReplacement(t *testing.T) { if runtime.GOOS != "linux" { t.Skip("audit reproduction is qualified only for Linux and uses Linux config isolation") } p, primary, _, oldBytes, _ := prepareTransactionFixture(t, false) j, err := loadUpdateJournal(p.JournalPath) require.NoError(t, err) j.State = UpdateTransactionHelperStarted j.ParentPID = 1 << 30 j.HelperPID = 0 require.NoError(t, writeUpdateJournal(p.JournalPath, j)) require.NoError(t, p.lock.release()) p.lock = nil require.NoError(t, runUpdateHelper(p.JournalPath, false)) require.NoError(t, os.WriteFile(primary, oldBytes, 0755)) err = recoverTransactionsLocked(primary) require.ErrorContains(t, err, "backup unavailable") persisted, loadErr := loadUpdateJournal(p.JournalPath) require.NoError(t, loadErr) t.Logf("recovery_error=%v retained_state=%s", err, persisted.State) } func TestOctAuditPublicReleaseInfoCreatesProofWithoutVerification(t *testing.T) { if runtime.GOOS != "linux" { t.Skip("audit reproduction is qualified only for Linux and uses Linux config isolation") } release := &ReleaseInfo{ Version: "9.9.9", MinimumUpdaterVersion: "1.0.0", Channel: "stable", PublishedAt: "2026-10-03T12:00:00Z", Signature: &releasemanifest.Signature{KeyID: "not-trusted", Algorithm: "ed25519", Value: "bogus"}, Components: map[string]releasemanifest.Component{ComponentID: {Version: "9.9.9", Assets: []releasemanifest.Asset{{GOOS: GetBinaryIdentity().GOOS, GOARCH: GetBinaryIdentity().GOARCH, URL: "https://attacker.invalid/manager", BLAKE3: "blake3:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", Size: 1}}}}, } result := CheckForUpdateFromReleaseInfo(release) require.NoError(t, result.Error) require.NoError(t, validateAuthenticatedUpdateSelection(result)) t.Logf("forged_signature_key=%s update_available=%v trusted_proof_accepted=true", result.ManifestKeyID, result.UpdateAvailable) }