using System; using System.IO; using System.Text; using Paca.Mobile.Core; using Xunit; namespace Paca.Tests.Core; public class MediaChecksumVerifierGateTests { [Fact] public void Gate369_MediaChecksumVerifier_ComputesSha256StreamHash_Correctly() { // "Hello Paca Media!" in UTF-8 var bytes = Encoding.UTF8.GetBytes("Hello Paca Media!"); using var stream = new MemoryStream(bytes); var sha256 = MediaChecksumVerifier.ComputeHash(stream, ChecksumAlgorithm.Sha256); // Known SHA-256 for "Hello Paca Media!" Assert.StartsWith("f14b916b33d6270011bcd23995bf4d4a2ae0199ec", sha256.ToLowerInvariant()); } [Fact] public void Gate370_MediaChecksumVerifier_ComputesMd5StreamHash_Correctly() { var bytes = Encoding.UTF8.GetBytes("PacaDownloadEngine"); using var stream = new MemoryStream(bytes); var md5 = MediaChecksumVerifier.ComputeHash(stream, ChecksumAlgorithm.Md5); // Known MD5 for "PacaDownloadEngine" Assert.Equal("1d95ac097022b5c556252b43a2f5929a", md5.ToLowerInvariant()); } [Fact] public void Gate371_MediaChecksumVerifier_VerifiesEtagWithQuotesAndWeakPrefix() { var computed = "93700ce818c3937ec89f2a00908eb82f"; // Quoted ETag: "\"93700ce818c3937ec89f2a00908eb82f\"" Assert.True(MediaChecksumVerifier.VerifyHash(computed, "\"93700ce818c3937ec89f2a00908eb82f\"")); // Weak ETag: "W/\"93700CE818C3937EC89F2A00908EB82F\"" Assert.True(MediaChecksumVerifier.VerifyHash(computed, "W/\"93700CE818C3937EC89F2A00908EB82F\"")); } [Fact] public void Gate372_MediaChecksumVerifier_DetectsMismatchAndGeneratesReport() { var computed = "aaaa1111"; var expected = "bbbb2222"; var result = MediaChecksumVerifier.EvaluateIntegrity("file.mp4", computed, expected); Assert.False(result.IsIntact); Assert.Equal("aaaa1111", result.ComputedHash); Assert.Equal("bbbb2222", result.ExpectedHash); Assert.Contains("해시 불일치", result.StatusMessage); } }