releases/tests/Paca.Tests/Core/MediaIntegrityVerifierGateTests.cs

70 lines
2.7 KiB
C#

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<byte>());
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);
}
}