using System; using System.IO; using Paca.Mobile.Core; using Xunit; namespace Paca.Tests.Core; public class MediaIntegrityVerifierGateTests { [Fact] public void Gate273_MediaIntegrityVerifier_IdentifiesValidMp4() { // MP4 signature: 00 00 00 18 66 74 79 70 (ftyp) 69 73 6F 6D (isom) var mp4Bytes = new byte[] { 0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70, 0x69, 0x73, 0x6F, 0x6D, 0x00, 0x00, 0x02, 0x00, 0x69, 0x73, 0x6F, 0x6D, 0x69, 0x73, 0x6F, 0x32, 0x00, 0x00, 0x00, 0x08, 0x6D, 0x6F, 0x6F, 0x76 // moov }; var result = MediaIntegrityVerifier.Verify(mp4Bytes); Assert.Equal(MediaIntegrityStatus.Healthy, result.Status); Assert.Equal("mp4", result.DetectedFormat); } [Fact] public void Gate274_MediaIntegrityVerifier_IdentifiesValidWebmAndMp3() { // EBML (WebM/MKV): 1A 45 DF A3 var webmBytes = new byte[] { 0x1A, 0x45, 0xDF, 0xA3, 0x9F, 0x42, 0x86, 0x81 }; var webmResult = MediaIntegrityVerifier.Verify(webmBytes); Assert.Equal(MediaIntegrityStatus.Healthy, webmResult.Status); Assert.Equal("webm", webmResult.DetectedFormat); // MP3 ID3: 49 44 33 (ID3) var mp3Bytes = new byte[] { 0x49, 0x44, 0x33, 0x03, 0x00, 0x00, 0x00, 0x00 }; var mp3Result = MediaIntegrityVerifier.Verify(mp3Bytes); Assert.Equal(MediaIntegrityStatus.Healthy, mp3Result.Status); Assert.Equal("mp3", mp3Result.DetectedFormat); } [Fact] public void Gate275_MediaIntegrityVerifier_DetectsZeroByteAndTruncatedFiles() { var zeroResult = MediaIntegrityVerifier.Verify(Array.Empty()); Assert.Equal(MediaIntegrityStatus.FatalCorruption, zeroResult.Status); Assert.Equal(CorruptionReason.ZeroByteFile, zeroResult.Reason); var truncated = new byte[] { 0x00, 0x00, 0x00 }; var truncResult = MediaIntegrityVerifier.Verify(truncated); Assert.Equal(MediaIntegrityStatus.FatalCorruption, truncResult.Status); Assert.Equal(CorruptionReason.TruncatedHeader, truncResult.Reason); } [Fact] public void Gate276_MediaIntegrityVerifier_SuggestsRemuxRecovery_ForMissingMoovAtom() { // MP4 with ftyp and mdat but no moov atom (interrupted recording/mux) var brokenMp4 = new byte[] { 0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70, 0x69, 0x73, 0x6F, 0x6D, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x6D, 0x64, 0x61, 0x74 // mdat (no moov) }; var result = MediaIntegrityVerifier.Verify(brokenMp4); Assert.Equal(MediaIntegrityStatus.RecoverableByRemux, result.Status); Assert.Equal(CorruptionReason.MissingMoovAtom, result.Reason); } }