70 lines
2.7 KiB
C#
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);
|
|
}
|
|
}
|