Files
sharpcompress/tests/SharpCompress.Test/TestBase.cs

250 lines
8.6 KiB
C#
Raw Permalink Normal View History

2022-12-20 15:06:44 +00:00
using System;
2016-06-06 14:35:33 +01:00
using System.Collections.Generic;
2015-12-30 11:19:42 +00:00
using System.IO;
using System.Linq;
using System.Text;
2026-01-08 16:24:11 +00:00
using System.Threading;
2026-01-12 10:19:01 +00:00
using System.Threading.Tasks;
2016-09-26 11:49:49 +01:00
using SharpCompress.Readers;
2015-12-30 11:19:42 +00:00
using Xunit;
2022-12-20 15:06:44 +00:00
namespace SharpCompress.Test;
2026-01-12 10:19:01 +00:00
public class TestBase : IAsyncDisposable
2015-12-30 11:19:42 +00:00
{
2026-01-08 14:01:35 +00:00
private static readonly string SOLUTION_BASE_PATH;
public static readonly string TEST_ARCHIVES_PATH;
public static readonly string ORIGINAL_FILES_PATH;
public static readonly string MISC_TEST_FILES_PATH;
private static readonly string SCRATCH_BASE_PATH;
2024-03-14 08:57:16 +00:00
2026-01-08 14:01:35 +00:00
private static readonly string SCRATCH_DIRECTORY;
private static readonly string SCRATCH2_DIRECTORY;
static TestBase()
2022-12-20 15:06:44 +00:00
{
2023-12-18 09:04:04 +00:00
var index = AppDomain.CurrentDomain.BaseDirectory.IndexOf(
"SharpCompress.Test",
StringComparison.OrdinalIgnoreCase
);
2022-12-20 15:06:44 +00:00
var path = AppDomain.CurrentDomain.BaseDirectory.Substring(0, index);
SOLUTION_BASE_PATH = Path.GetDirectoryName(path) ?? throw new ArgumentNullException();
TEST_ARCHIVES_PATH = Path.Combine(SOLUTION_BASE_PATH, "TestArchives", "Archives");
ORIGINAL_FILES_PATH = Path.Combine(SOLUTION_BASE_PATH, "TestArchives", "Original");
MISC_TEST_FILES_PATH = Path.Combine(SOLUTION_BASE_PATH, "TestArchives", "MiscTest");
2026-01-08 16:24:11 +00:00
SCRATCH_BASE_PATH = Path.Combine(SOLUTION_BASE_PATH, "TestArchives");
2026-01-08 14:01:35 +00:00
SCRATCH_DIRECTORY = Path.Combine(SCRATCH_BASE_PATH, "Scratch");
SCRATCH2_DIRECTORY = Path.Combine(SCRATCH_BASE_PATH, "Scratch2");
Directory.CreateDirectory(SCRATCH_DIRECTORY);
Directory.CreateDirectory(SCRATCH2_DIRECTORY);
}
private readonly Guid _testGuid = Guid.NewGuid();
protected readonly string SCRATCH_FILES_PATH;
protected readonly string SCRATCH2_FILES_PATH;
protected TestBase()
{
SCRATCH_FILES_PATH = Path.Combine(SCRATCH_DIRECTORY, _testGuid.ToString());
SCRATCH2_FILES_PATH = Path.Combine(SCRATCH2_DIRECTORY, _testGuid.ToString());
2022-12-20 15:06:44 +00:00
Directory.CreateDirectory(SCRATCH_FILES_PATH);
Directory.CreateDirectory(SCRATCH2_FILES_PATH);
}
//always use async dispose since we have I/O and sync Dispose doesn't wait when using xunit
2026-01-12 10:19:01 +00:00
public async ValueTask DisposeAsync()
2026-01-08 14:01:35 +00:00
{
2026-01-12 10:19:01 +00:00
await Task.CompletedTask;
2026-01-08 14:01:35 +00:00
Directory.Delete(SCRATCH_FILES_PATH, true);
Directory.Delete(SCRATCH2_FILES_PATH, true);
}
2022-12-20 15:06:44 +00:00
public void VerifyFiles()
{
if (UseExtensionInsteadOfNameToVerify)
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
VerifyFilesByExtension();
}
2022-12-20 15:06:44 +00:00
else
{
2022-12-20 15:06:44 +00:00
VerifyFilesByName();
2015-12-30 11:19:42 +00:00
}
2022-12-20 15:06:44 +00:00
}
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
/// <summary>
/// Verifies the files also check modified time and attributes.
/// </summary>
public void VerifyFilesEx()
{
if (UseExtensionInsteadOfNameToVerify)
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
VerifyFilesByExtensionEx();
2015-12-30 11:19:42 +00:00
}
2022-12-20 15:06:44 +00:00
else
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
VerifyFilesByNameEx();
2015-12-30 11:19:42 +00:00
}
2022-12-20 15:06:44 +00:00
}
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
protected void VerifyFilesByName()
{
var extracted = Directory
.EnumerateFiles(SCRATCH_FILES_PATH, "*.*", SearchOption.AllDirectories)
.ToLookup(path => path.Substring(SCRATCH_FILES_PATH.Length));
var original = Directory
.EnumerateFiles(ORIGINAL_FILES_PATH, "*.*", SearchOption.AllDirectories)
.ToLookup(path => path.Substring(ORIGINAL_FILES_PATH.Length));
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
Assert.Equal(extracted.Count, original.Count);
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
foreach (var orig in original)
{
Assert.True(extracted.Contains(orig.Key));
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
CompareFilesByPath(orig.Single(), extracted[orig.Key].Single());
2015-12-30 11:19:42 +00:00
}
2022-12-20 15:06:44 +00:00
}
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
/// <summary>
/// Verifies the files by name also check modified time and attributes.
/// </summary>
protected void VerifyFilesByNameEx()
{
var extracted = Directory
.EnumerateFiles(SCRATCH_FILES_PATH, "*.*", SearchOption.AllDirectories)
.ToLookup(path => path.Substring(SCRATCH_FILES_PATH.Length));
var original = Directory
.EnumerateFiles(ORIGINAL_FILES_PATH, "*.*", SearchOption.AllDirectories)
.ToLookup(path => path.Substring(ORIGINAL_FILES_PATH.Length));
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
Assert.Equal(extracted.Count, original.Count);
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
foreach (var orig in original)
{
Assert.True(extracted.Contains(orig.Key));
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
CompareFilesByPath(orig.Single(), extracted[orig.Key].Single());
2024-03-14 08:57:16 +00:00
CompareFilesByTimeAndAttribute(orig.Single(), extracted[orig.Key].Single());
2015-12-30 11:19:42 +00:00
}
2022-12-20 15:06:44 +00:00
}
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
/// <summary>
/// Verifies the files by extension also check modified time and attributes.
/// </summary>
2024-03-14 08:57:16 +00:00
private void VerifyFilesByExtensionEx()
2022-12-20 15:06:44 +00:00
{
var extracted = Directory
.EnumerateFiles(SCRATCH_FILES_PATH, "*.*", SearchOption.AllDirectories)
.ToLookup(path => Path.GetExtension(path));
var original = Directory
.EnumerateFiles(ORIGINAL_FILES_PATH, "*.*", SearchOption.AllDirectories)
.ToLookup(path => Path.GetExtension(path));
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
Assert.Equal(extracted.Count, original.Count);
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
foreach (var orig in original)
{
Assert.True(extracted.Contains(orig.Key));
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
CompareFilesByPath(orig.Single(), extracted[orig.Key].Single());
2024-03-14 08:57:16 +00:00
CompareFilesByTimeAndAttribute(orig.Single(), extracted[orig.Key].Single());
2015-12-30 11:19:42 +00:00
}
2022-12-20 15:06:44 +00:00
}
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
protected bool UseExtensionInsteadOfNameToVerify { get; set; }
protected bool UseCaseInsensitiveToVerify { get; set; }
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
protected void VerifyFilesByExtension()
{
ILookup<string, string> extracted;
if (UseCaseInsensitiveToVerify)
{
extracted = Directory
.EnumerateFiles(SCRATCH_FILES_PATH, "*.*", SearchOption.AllDirectories)
.ToLookup(path => Path.GetExtension(path).ToLowerInvariant());
}
else
{
extracted = Directory
.EnumerateFiles(SCRATCH_FILES_PATH, "*.*", SearchOption.AllDirectories)
.ToLookup(path => Path.GetExtension(path));
}
2022-12-20 15:06:44 +00:00
var original = Directory
.EnumerateFiles(ORIGINAL_FILES_PATH, "*.*", SearchOption.AllDirectories)
.ToLookup(path => Path.GetExtension(path));
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
Assert.Equal(extracted.Count, original.Count);
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
foreach (var orig in original)
{
Assert.True(extracted.Contains(orig.Key));
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
CompareFilesByPath(orig.Single(), extracted[orig.Key].Single());
2015-12-30 11:19:42 +00:00
}
2022-12-20 15:06:44 +00:00
}
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
protected void CompareFilesByPath(string file1, string file2)
{
//TODO: fix line ending issues with the text file
if (file1.EndsWith("txt", StringComparison.OrdinalIgnoreCase))
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
return;
}
2018-04-22 11:19:11 +01:00
2022-12-20 15:06:44 +00:00
using var file1Stream = File.OpenRead(file1);
using var file2Stream = File.OpenRead(file2);
Assert.Equal(file1Stream.Length, file2Stream.Length);
var byte1 = 0;
var byte2 = 0;
for (var counter = 0; byte1 != -1; counter++)
{
byte1 = file1Stream.ReadByte();
byte2 = file2Stream.ReadByte();
if (byte1 != byte2)
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
//string.Format("Byte {0} differ between {1} and {2}", counter, file1, file2)
Assert.Equal(byte1, byte2);
2015-12-30 11:19:42 +00:00
}
}
2022-12-20 15:06:44 +00:00
}
2015-12-30 11:19:42 +00:00
2024-03-14 08:57:16 +00:00
private void CompareFilesByTimeAndAttribute(string file1, string file2)
2022-12-20 15:06:44 +00:00
{
var fi1 = new FileInfo(file1);
var fi2 = new FileInfo(file2);
Assert.NotEqual(fi1.LastWriteTime, fi2.LastWriteTime);
Assert.Equal(fi1.Attributes, fi2.Attributes);
}
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
protected void CompareArchivesByPath(string file1, string file2, Encoding? encoding = null)
{
var readerOptions = new ReaderOptions { LeaveStreamOpen = false };
readerOptions.ArchiveEncoding.Default = encoding ?? Encoding.Default;
//don't compare the order. OS X reads files from the file system in a different order therefore makes the archive ordering different
var archive1Entries = new List<string>();
var archive2Entries = new List<string>();
2026-01-15 11:55:56 +00:00
using (var archive1 = ReaderFactory.OpenReader(File.OpenRead(file1), readerOptions))
using (var archive2 = ReaderFactory.OpenReader(File.OpenRead(file2), readerOptions))
2021-01-09 13:33:34 +00:00
{
2022-12-20 15:06:44 +00:00
while (archive1.MoveToNextEntry())
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
Assert.True(archive2.MoveToNextEntry());
archive1Entries.Add(archive1.Entry.Key.NotNull());
archive2Entries.Add(archive2.Entry.Key.NotNull());
2017-01-25 09:29:13 +00:00
}
2022-12-20 15:06:44 +00:00
Assert.False(archive2.MoveToNextEntry());
}
archive1Entries.Sort();
archive2Entries.Sort();
for (var i = 0; i < archive1Entries.Count; i++)
{
Assert.Equal(archive1Entries[i], archive2Entries[i]);
2015-12-30 11:19:42 +00:00
}
}
}