Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Pipelines/recursive-extractor-pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ extends:
poolName: MSSecurity-1ES-Build-Agents-Pool
poolImage: MSSecurity-1ES-Windows-2022
poolOs: windows
dotnetTestArgs: '-- --coverage --report-trx'
dotnetTestArgs: '--logger trx --results-directory TestResults -- --coverage'
includeNuGetOrg: false
nugetFeedsToUse: 'config'
nugetConfigPath: 'nuget.config'
Expand All @@ -57,7 +57,7 @@ extends:
poolName: MSSecurity-1ES-Build-Agents-Pool
poolImage: MSSecurity-1ES-Windows-2022
poolOs: windows
dotnetTestArgs: '-- --coverage --report-trx'
dotnetTestArgs: '--logger trx --results-directory TestResults -- --coverage'
includeNuGetOrg: false
nugetFeedsToUse: 'config'
nugetConfigPath: 'nuget.config'
Expand Down
4 changes: 2 additions & 2 deletions Pipelines/recursive-extractor-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ extends:
poolName: MSSecurity-1ES-Build-Agents-Pool
poolImage: MSSecurity-1ES-Windows-2022
poolOs: windows
dotnetTestArgs: '-- --coverage --report-trx'
dotnetTestArgs: '--logger trx --results-directory TestResults -- --coverage'
includeNuGetOrg: false
nugetFeedsToUse: 'config'
nugetConfigPath: 'nuget.config'
Expand All @@ -57,7 +57,7 @@ extends:
poolName: MSSecurity-1ES-Build-Agents-Pool
poolImage: MSSecurity-1ES-Windows-2022
poolOs: windows
dotnetTestArgs: '-- --coverage --report-trx'
dotnetTestArgs: '--logger trx --results-directory TestResults -- --coverage'
includeNuGetOrg: false
nugetFeedsToUse: 'config'
nugetConfigPath: 'nuget.config'
Expand Down
3 changes: 3 additions & 0 deletions RecursiveExtractor.Tests/AssemblyInfo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;

[assembly: Parallelize(Workers = 0, Scope = ExecutionScope.MethodLevel)]
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ namespace RecursiveExtractor.Tests.ExtractorTests;

public class BaseExtractorTestClass
{
public TestContext TestContext { get; set; } = null!;

[ClassCleanup]
public static void ClassCleanup()
{
Expand Down
26 changes: 14 additions & 12 deletions RecursiveExtractor.Tests/ExtractorTests/CustomExtractorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ namespace RecursiveExtractor.Tests.ExtractorTests;
[TestClass]
public class CustomExtractorTests
{
public TestContext TestContext { get; set; } = null!;

/// <summary>
/// A simple test custom extractor that extracts files with a specific magic number
/// For testing purposes, it recognizes files starting with "CUSTOM1"
Expand Down Expand Up @@ -127,7 +129,7 @@ public void Constructor_WithCustomExtractors_RegistersExtractors()
var customExtractor = new TestCustomExtractor(null!);
var extractor = new Extractor(new[] { customExtractor });

Assert.AreEqual(1, extractor.CustomExtractors.Count);
Assert.HasCount(1, extractor.CustomExtractors);
}

[TestMethod]
Expand All @@ -137,7 +139,7 @@ public void Constructor_WithMultipleCustomExtractors_RegistersAll()
var customExtractor2 = new SecondTestCustomExtractor(null!);
var extractor = new Extractor(new ICustomAsyncExtractor[] { customExtractor1, customExtractor2 });

Assert.AreEqual(2, extractor.CustomExtractors.Count);
Assert.HasCount(2, extractor.CustomExtractors);
}

[TestMethod]
Expand All @@ -146,15 +148,15 @@ public void Constructor_WithNullInCollection_IgnoresNull()
var customExtractor = new TestCustomExtractor(null!);
var extractor = new Extractor(new ICustomAsyncExtractor[] { customExtractor, null! });

Assert.AreEqual(1, extractor.CustomExtractors.Count);
Assert.HasCount(1, extractor.CustomExtractors);
}

[TestMethod]
public void Constructor_WithNullCollection_CreatesEmptyExtractor()
{
var extractor = new Extractor((IEnumerable<ICustomAsyncExtractor>)null!);

Assert.AreEqual(0, extractor.CustomExtractors.Count);
Assert.IsEmpty(extractor.CustomExtractors);
}

[TestMethod]
Expand All @@ -167,7 +169,7 @@ public void Extract_WithMatchingCustomExtractor_UsesCustomExtractor()
var testData = System.Text.Encoding.ASCII.GetBytes("CUSTOM1 This is test data");
var results = extractor.Extract("test.custom", testData).ToList();

Assert.AreEqual(1, results.Count);
Assert.HasCount(1, results);
Assert.AreEqual("extracted_from_custom.txt", results[0].Name);

// Read the content to verify it was processed by our custom extractor
Expand All @@ -185,9 +187,9 @@ public async Task ExtractAsync_WithMatchingCustomExtractor_UsesCustomExtractor()

// Create a test file with the custom magic bytes
var testData = System.Text.Encoding.ASCII.GetBytes("CUSTOM1 This is test data");
var results = await extractor.ExtractAsync("test.custom", testData).ToListAsync();
var results = await extractor.ExtractAsync("test.custom", testData).ToListAsync(TestContext.CancellationTokenSource.Token);

Assert.AreEqual(1, results.Count);
Assert.HasCount(1, results);
Assert.AreEqual("extracted_from_custom.txt", results[0].Name);

// Read the content to verify it was processed by our custom extractor
Expand All @@ -208,7 +210,7 @@ public void Extract_WithoutMatchingCustomExtractor_ReturnsOriginalFile()
var results = extractor.Extract("test.txt", testData).ToList();

// Should return the original file since no custom extractor matched
Assert.AreEqual(1, results.Count);
Assert.HasCount(1, results);
Assert.AreEqual("test.txt", results[0].Name);

// Verify it's the original content
Expand All @@ -230,13 +232,13 @@ public void Extract_MultipleCustomExtractors_UsesCorrectOne()
// Test with first custom format
var testData1 = System.Text.Encoding.ASCII.GetBytes("CUSTOM1 data");
var results1 = extractor.Extract("test1.custom", testData1).ToList();
Assert.AreEqual(1, results1.Count);
Assert.HasCount(1, results1);
Assert.AreEqual("extracted_from_custom.txt", results1[0].Name);

// Test with second custom format
var testData2 = System.Text.Encoding.ASCII.GetBytes("CUSTOM2 data");
var results2 = extractor.Extract("test2.custom", testData2).ToList();
Assert.AreEqual(1, results2.Count);
Assert.HasCount(1, results2);
Assert.AreEqual("extracted_from_second_custom.txt", results2[0].Name);
}

Expand All @@ -250,7 +252,7 @@ public void Extract_NoCustomExtractors_ReturnsOriginalFile()
var results = extractor.Extract("test.custom", testData).ToList();

// Should return the original file since no custom extractor is registered
Assert.AreEqual(1, results.Count);
Assert.HasCount(1, results);
Assert.AreEqual("test.custom", results[0].Name);
}

Expand All @@ -267,7 +269,7 @@ public void Extract_CustomExtractorForKnownFormat_UsesBuiltInExtractor()
var results = extractor.Extract(path).ToList();

// Should extract the ZIP normally, not use the custom extractor
Assert.IsTrue(results.Count > 0);
Assert.IsGreaterThan(results.Count, 0);
Assert.IsTrue(results.Any(r => r.Name.Contains("EmptyFile")));
}
}
Expand Down
16 changes: 6 additions & 10 deletions RecursiveExtractor.Tests/ExtractorTests/DisposeBehaviorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace RecursiveExtractor.Tests.ExtractorTests;
[TestClass]
public class DisposeBehaviorTests : BaseExtractorTestClass
{
[DataTestMethod]
[TestMethod]
[DataRow("TestData.7z", 3, false)]
[DataRow("TestData.tar", 6, false)]
[DataRow("TestData.rar", 3, false)]
Expand Down Expand Up @@ -43,8 +43,6 @@ public class DisposeBehaviorTests : BaseExtractorTestClass
[DataRow("EmptyFile.txt", 1, true)]
[DataRow("TestDataArchivesNested.Zip", 54, true)]
[DataRow("TestDataArchivesNested.Zip", 54, false)]
[DataRow("TestDataArchivesNested.Zip", 54, true)]
[DataRow("TestDataArchivesNested.Zip", 54, false)]
public void ExtractArchiveAndDisposeWhileEnumerating(string fileName, int expectedNumFiles = 3,
bool parallel = false)
{
Expand All @@ -63,11 +61,11 @@ public void ExtractArchiveAndDisposeWhileEnumerating(string fileName, int expect
Assert.AreEqual(expectedNumFiles, disposedResults.Count);
foreach (var disposedResult in disposedResults)
{
Assert.ThrowsException<ObjectDisposedException>(() => disposedResult.Content.Position);
Assert.ThrowsExactly<ObjectDisposedException>(() => disposedResult.Content.Position);
}
}

[DataTestMethod]
[TestMethod]
[DataRow("TestData.7z", 3, false)]
[DataRow("TestData.tar", 6, false)]
[DataRow("TestData.rar", 3, false)]
Expand Down Expand Up @@ -99,8 +97,6 @@ public void ExtractArchiveAndDisposeWhileEnumerating(string fileName, int expect
[DataRow("EmptyFile.txt", 1, true)]
[DataRow("TestDataArchivesNested.Zip", 54, true)]
[DataRow("TestDataArchivesNested.Zip", 54, false)]
[DataRow("TestDataArchivesNested.Zip", 54, true)]
[DataRow("TestDataArchivesNested.Zip", 54, false)]
public async Task ExtractArchiveAndDisposeWhileEnumeratingAsync(string fileName, int expectedNumFiles = 3,
bool parallel = false)
{
Expand All @@ -119,11 +115,11 @@ public async Task ExtractArchiveAndDisposeWhileEnumeratingAsync(string fileName,
Assert.AreEqual(expectedNumFiles, disposedResults.Count);
foreach (var disposedResult in disposedResults)
{
Assert.ThrowsException<ObjectDisposedException>(() => disposedResult.Content.Position);
Assert.ThrowsExactly<ObjectDisposedException>(() => disposedResult.Content.Position);
}
}

[DataTestMethod]
[TestMethod]
[DataRow("TestData.zip")]
public void EnsureDisposedWithExtractToDirectory(string fileName)
{
Expand All @@ -146,7 +142,7 @@ public void EnsureDisposedWithExtractToDirectory(string fileName)
}
}

[DataTestMethod]
[TestMethod]
[DataRow("TestData.zip")]
public async Task EnsureDisposedWithExtractToDirectoryAsync(string fileName)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace RecursiveExtractor.Tests.ExtractorTests;
[TestClass]
public class EncryptedArchiveTests : BaseExtractorTestClass
{
[DataTestMethod]
[TestMethod]
[DataRow("TestDataEncryptedZipCrypto.zip")]
[DataRow("TestDataEncryptedAes.zip")]
[DataRow("TestDataEncrypted.7z")]
Expand All @@ -26,7 +26,7 @@ public void FileTypeSetCorrectlyForEncryptedArchives(string fileName, int expect
Assert.AreEqual(FileEntryStatus.EncryptedArchive, results.First().EntryStatus);
}

[DataTestMethod]
[TestMethod]
[DataRow("TestDataEncryptedZipCrypto.zip")]
[DataRow("TestDataEncryptedAes.zip")]
[DataRow("TestDataEncrypted.7z")]
Expand All @@ -46,7 +46,7 @@ public async Task FileTypeSetCorrectlyForEncryptedArchivesAsync(string fileName,
Assert.AreEqual(FileEntryStatus.EncryptedArchive, results.First().EntryStatus);
}

[DataTestMethod]
[TestMethod]
[DataRow("TestDataEncryptedZipCrypto.zip")]
[DataRow("TestDataEncryptedAes.zip")]
[DataRow("TestDataEncrypted.7z")]
Expand All @@ -64,7 +64,7 @@ public void ExtractEncryptedArchive(string fileName, int expectedNumFiles = 3)
Assert.AreEqual(0, results.Count(x => x.EntryStatus == FileEntryStatus.EncryptedArchive || x.EntryStatus == FileEntryStatus.FailedArchive));
}

[DataTestMethod]
[TestMethod]
[DataRow("TestDataEncryptedZipCrypto.zip")]
[DataRow("TestDataEncryptedAes.zip")]
[DataRow("TestDataEncrypted.7z")]
Expand Down
12 changes: 8 additions & 4 deletions RecursiveExtractor.Tests/ExtractorTests/ExpectedNumFilesTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ public static IEnumerable<object[]> ArchiveData
new object[] { "TestDataArchivesNested.Zip", 54 },
new object[] { "UdfTest.iso", 3 },
new object[] { "UdfTestWithMultiSystem.iso", 3 },
new object[] { "TestData.arj", 1 },
new object[] { "TestData.arc", 1 },
// new object[] { "HfsSampleUDCO.dmg", 2 }
};
}
Expand Down Expand Up @@ -75,6 +77,8 @@ public static IEnumerable<object[]> NoRecursionData
new object[] { "EmptyFile.txt", 1 },
new object[] { "TestDataArchivesNested.Zip", 14 },
new object[] { "UdfTestWithMultiSystem.iso", 3 },
new object[] { "TestData.arj", 1 },
new object[] { "TestData.arc", 1 },
// new object[] { "HfsSampleUDCO.dmg", 2 }
};
}
Expand Down Expand Up @@ -223,9 +227,9 @@ public async Task ExtractArchiveAsync(string fileName, int expectedNumFiles)
[DynamicData(nameof(ArchiveData))]
public async Task ExtractArchiveFromStreamAsync(string fileName, int expectedNumFiles)
{
var extractor = new Extractor();
var extractor = new Extractor();
var path = Path.Combine(Directory.GetCurrentDirectory(), "TestData", "TestDataArchives", fileName);
using var stream = new FileStream(path, FileMode.Open);
using var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
var results = extractor.ExtractAsync(path, stream, new ExtractorOptions());
var numFiles = 0;
await foreach (var result in results)
Expand All @@ -240,9 +244,9 @@ public async Task ExtractArchiveFromStreamAsync(string fileName, int expectedNum
[DynamicData(nameof(ArchiveData))]
public void ExtractArchiveFromStream(string fileName, int expectedNumFiles)
{
var extractor = new Extractor();
var extractor = new Extractor();
var path = Path.Combine(Directory.GetCurrentDirectory(), "TestData", "TestDataArchives", fileName);
using var stream = new FileStream(path, FileMode.Open);
using var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
var results = extractor.Extract(path, stream, GetExtractorOptions());
Assert.AreEqual(expectedNumFiles, results.Count());
stream.Close();
Expand Down
14 changes: 7 additions & 7 deletions RecursiveExtractor.Tests/ExtractorTests/FilterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ namespace RecursiveExtractor.Tests.ExtractorTests;
[TestClass]
public class FilterTests : BaseExtractorTestClass
{
[DataTestMethod]
[TestMethod]
[DataRow("TestData.zip")]
[DataRow("TestData.7z")]
[DataRow("TestData.tar")]
Expand Down Expand Up @@ -42,7 +42,7 @@ public async Task ExtractArchiveAsyncAllowFiltered(string fileName, int expected
Assert.AreEqual(expectedNumFiles, numResults);
}

[DataTestMethod]
[TestMethod]
[DataRow("TestData.zip")]
[DataRow("TestData.7z")]
[DataRow("TestData.tar")]
Expand All @@ -68,7 +68,7 @@ public void ExtractArchiveAllowFiltered(string fileName, int expectedNumFiles =
Assert.AreEqual(expectedNumFiles, results.Count());
}

[DataTestMethod]
[TestMethod]
[DataRow("TestData.zip")]
[DataRow("TestData.7z")]
[DataRow("TestData.tar")]
Expand All @@ -94,7 +94,7 @@ public void ExtractArchiveParallelAllowFiltered(string fileName, int expectedNum
Assert.AreEqual(expectedNumFiles, results.Count());
}

[DataTestMethod]
[TestMethod]
[DataRow("TestData.zip", 4)]
[DataRow("TestData.7z")]
[DataRow("TestData.tar", 5)]
Expand All @@ -119,7 +119,7 @@ public void ExtractArchiveDenyFiltered(string fileName, int expectedNumFiles = 2
Assert.AreEqual(expectedNumFiles, results.Count());
}

[DataTestMethod]
[TestMethod]
[DataRow("TestData.zip", 4)]
[DataRow("TestData.7z")]
[DataRow("TestData.tar", 5)]
Expand All @@ -145,7 +145,7 @@ public void ExtractArchiveParallelDenyFiltered(string fileName, int expectedNumF
Assert.AreEqual(expectedNumFiles, results.Count());
}

[DataTestMethod]
[TestMethod]
[DataRow("TestData.zip", 4)]
[DataRow("TestData.7z")]
[DataRow("TestData.tar", 5)]
Expand Down Expand Up @@ -177,7 +177,7 @@ public async Task ExtractArchiveAsyncDenyFiltered(string fileName, int expectedN
Assert.AreEqual(expectedNumFiles, numResults);
}

[DataTestMethod]
[TestMethod]
[DataRow(ArchiveFileType.ZIP, new[] { ArchiveFileType.ZIP }, new ArchiveFileType[] { }, false)]
[DataRow(ArchiveFileType.ZIP, new[] { ArchiveFileType.TAR }, new ArchiveFileType[] { }, true)]
[DataRow(ArchiveFileType.ZIP, new ArchiveFileType[] { }, new[] { ArchiveFileType.ZIP }, true)]
Expand Down
6 changes: 4 additions & 2 deletions RecursiveExtractor.Tests/ExtractorTests/MiniMagicTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace RecursiveExtractor.Tests.ExtractorTests;
[TestClass]
public class MiniMagicTests : BaseExtractorTestClass
{
[DataTestMethod]
[TestMethod]
[DataRow("TestData.zip", ArchiveFileType.ZIP)]
[DataRow("TestData.7z", ArchiveFileType.P7ZIP)]
[DataRow("TestData.Tar", ArchiveFileType.TAR)]
Expand All @@ -24,11 +24,13 @@ public class MiniMagicTests : BaseExtractorTestClass
[DataRow("TestData.wim", ArchiveFileType.WIM)]
[DataRow("Empty.vmdk", ArchiveFileType.VMDK)]
[DataRow("HfsSampleUDCO.dmg", ArchiveFileType.DMG)]
[DataRow("TestData.arj", ArchiveFileType.ARJ)]
[DataRow("TestData.arc", ArchiveFileType.ARC)]
[DataRow("EmptyFile.txt", ArchiveFileType.UNKNOWN)]
public void TestMiniMagic(string fileName, ArchiveFileType expectedArchiveFileType)
{
var path = Path.Combine(Directory.GetCurrentDirectory(), "TestData", "TestDataArchives", fileName);
using var fs = new FileStream(path, FileMode.Open);
using var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
// Test just based on the content
var fileEntry = new FileEntry("NoName", fs);

Expand Down
Loading
Loading