Files
sharpcompress/tests/SharpCompress.Test/Rar/RarReaderTests.cs

411 lines
13 KiB
C#
Raw Permalink Normal View History

2022-12-20 15:06:44 +00:00
using System;
2025-05-14 10:27:30 +02:00
using System.Collections;
2022-12-20 13:09:16 +00:00
using System.IO;
2015-12-30 11:19:42 +00:00
using System.Linq;
2025-05-14 10:27:30 +02:00
using SharpCompress.Archives.Rar;
2015-12-30 11:19:42 +00:00
using SharpCompress.Common;
2016-09-26 11:49:49 +01:00
using SharpCompress.Readers;
using SharpCompress.Readers.Rar;
2015-12-30 11:19:42 +00:00
using Xunit;
2022-12-20 15:06:44 +00:00
namespace SharpCompress.Test.Rar;
public class RarReaderTests : ReaderTests
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
[Fact]
2022-12-20 15:20:49 +00:00
public void Rar_Multi_Reader() =>
2025-11-25 11:50:21 +00:00
DoRar_Multi_Reader([
"Rar.multi.part01.rar",
"Rar.multi.part02.rar",
"Rar.multi.part03.rar",
"Rar.multi.part04.rar",
"Rar.multi.part05.rar",
"Rar.multi.part06.rar",
]);
2022-12-20 15:06:44 +00:00
[Fact]
2022-12-20 15:20:49 +00:00
public void Rar5_Multi_Reader() =>
2025-11-25 11:50:21 +00:00
DoRar_Multi_Reader([
"Rar5.multi.part01.rar",
"Rar5.multi.part02.rar",
"Rar5.multi.part03.rar",
"Rar5.multi.part04.rar",
"Rar5.multi.part05.rar",
"Rar5.multi.part06.rar",
]);
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
private void DoRar_Multi_Reader(string[] archives)
{
using (
2026-01-15 11:41:30 +00:00
var reader = RarReader.OpenReader(
2022-12-20 15:06:44 +00:00
archives
.Select(s => Path.Combine(TEST_ARCHIVES_PATH, s))
.Select(p => File.OpenRead(p))
)
)
2021-01-09 13:33:34 +00:00
{
2022-12-20 15:06:44 +00:00
while (reader.MoveToNextEntry())
{
reader.WriteEntryToDirectory(SCRATCH_FILES_PATH);
2022-12-20 15:06:44 +00:00
}
2017-12-17 08:08:02 -05:00
}
2022-12-20 15:06:44 +00:00
VerifyFiles();
}
[Fact]
2022-12-20 15:20:49 +00:00
public void Rar_Multi_Reader_Encrypted() =>
2025-11-25 11:50:21 +00:00
DoRar_Multi_Reader_Encrypted([
"Rar.EncryptedParts.part01.rar",
"Rar.EncryptedParts.part02.rar",
"Rar.EncryptedParts.part03.rar",
"Rar.EncryptedParts.part04.rar",
"Rar.EncryptedParts.part05.rar",
"Rar.EncryptedParts.part06.rar",
]);
2015-12-30 11:19:42 +00:00
2022-12-20 15:20:49 +00:00
private void DoRar_Multi_Reader_Encrypted(string[] archives) =>
2022-12-20 15:06:44 +00:00
Assert.Throws<InvalidFormatException>(() =>
2017-12-17 08:08:02 -05:00
{
2022-12-20 13:45:47 +00:00
using (
2026-01-15 11:41:30 +00:00
var reader = RarReader.OpenReader(
2022-12-20 13:45:47 +00:00
archives
.Select(s => Path.Combine(TEST_ARCHIVES_PATH, s))
2022-12-20 15:06:44 +00:00
.Select(p => File.OpenRead(p)),
2024-03-14 08:37:17 +00:00
new ReaderOptions { Password = "test" }
2022-12-20 13:45:47 +00:00
)
)
2015-12-30 11:19:42 +00:00
{
while (reader.MoveToNextEntry())
{
reader.WriteEntryToDirectory(SCRATCH_FILES_PATH);
2015-12-30 11:19:42 +00:00
}
}
VerifyFiles();
2022-12-20 15:06:44 +00:00
});
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
[Fact]
2022-12-20 15:20:49 +00:00
public void Rar_Multi_Reader_Delete_Files() =>
2025-11-25 11:50:21 +00:00
DoRar_Multi_Reader_Delete_Files([
"Rar.multi.part01.rar",
"Rar.multi.part02.rar",
"Rar.multi.part03.rar",
"Rar.multi.part04.rar",
"Rar.multi.part05.rar",
"Rar.multi.part06.rar",
]);
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
[Fact]
2022-12-20 15:20:49 +00:00
public void Rar5_Multi_Reader_Delete_Files() =>
2025-11-25 11:50:21 +00:00
DoRar_Multi_Reader_Delete_Files([
"Rar5.multi.part01.rar",
"Rar5.multi.part02.rar",
"Rar5.multi.part03.rar",
"Rar5.multi.part04.rar",
"Rar5.multi.part05.rar",
"Rar5.multi.part06.rar",
]);
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
private void DoRar_Multi_Reader_Delete_Files(string[] archives)
{
foreach (var file in archives)
2021-01-09 13:33:34 +00:00
{
2022-12-20 15:06:44 +00:00
File.Copy(
Path.Combine(TEST_ARCHIVES_PATH, file),
Path.Combine(SCRATCH2_FILES_PATH, file)
2022-12-20 13:45:47 +00:00
);
2017-12-17 08:08:02 -05:00
}
2022-12-20 15:06:44 +00:00
var streams = archives
.Select(s => Path.Combine(SCRATCH2_FILES_PATH, s))
.Select(File.OpenRead)
.ToList();
2026-01-15 11:41:30 +00:00
using (var reader = RarReader.OpenReader(streams))
2017-12-17 08:08:02 -05:00
{
2022-12-20 15:06:44 +00:00
while (reader.MoveToNextEntry())
2015-12-30 11:19:42 +00:00
{
reader.WriteEntryToDirectory(SCRATCH_FILES_PATH);
2015-12-30 11:19:42 +00:00
}
}
2022-12-20 15:06:44 +00:00
foreach (var stream in streams)
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
stream.Dispose();
2015-12-30 11:19:42 +00:00
}
2022-12-20 15:06:44 +00:00
VerifyFiles();
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
foreach (var file in archives.Select(s => Path.Combine(SCRATCH2_FILES_PATH, s)))
2017-12-17 08:08:02 -05:00
{
2022-12-20 15:06:44 +00:00
File.Delete(file);
2017-12-17 08:08:02 -05:00
}
2022-12-20 15:06:44 +00:00
}
2017-12-17 08:08:02 -05:00
2022-12-20 15:06:44 +00:00
[Fact]
2022-12-20 15:20:49 +00:00
public void Rar_None_Reader() => Read("Rar.none.rar", CompressionType.Rar);
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
[Fact]
2022-12-20 15:20:49 +00:00
public void Rar5_None_Reader() => Read("Rar5.none.rar", CompressionType.Rar);
2017-12-17 08:08:02 -05:00
2022-12-20 15:06:44 +00:00
[Fact]
2022-12-20 15:20:49 +00:00
public void Rar_Reader() => Read("Rar.rar", CompressionType.Rar);
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
[Fact]
2022-12-20 15:20:49 +00:00
public void Rar5_Reader() => Read("Rar5.rar", CompressionType.Rar);
2015-12-30 11:19:42 +00:00
2024-01-02 20:46:55 +01:00
[Fact]
public void Rar5_CRC_Blake2_Reader() => Read("Rar5.crc_blake2.rar", CompressionType.Rar);
2022-12-20 15:06:44 +00:00
[Fact]
2022-12-20 15:20:49 +00:00
public void Rar_EncryptedFileAndHeader_Reader() =>
2022-12-20 15:06:44 +00:00
ReadRar("Rar.encrypted_filesAndHeader.rar", "test");
2015-12-30 11:19:42 +00:00
2024-01-02 20:46:55 +01:00
[Fact]
public void Rar5_EncryptedFileAndHeader_Reader() =>
2022-12-20 15:06:44 +00:00
ReadRar("Rar5.encrypted_filesAndHeader.rar", "test");
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
[Fact]
2022-12-20 15:20:49 +00:00
public void Rar_EncryptedFileOnly_Reader() => ReadRar("Rar.encrypted_filesOnly.rar", "test");
2017-12-17 08:08:02 -05:00
2024-01-02 20:46:55 +01:00
[Fact]
2024-01-02 21:25:40 +01:00
public void Rar5_EncryptedFileOnly_Reader() => ReadRar("Rar5.encrypted_filesOnly.rar", "test");
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
[Fact]
2022-12-20 15:20:49 +00:00
public void Rar_Encrypted_Reader() => ReadRar("Rar.Encrypted.rar", "test");
2015-12-30 11:19:42 +00:00
2024-01-02 20:46:55 +01:00
[Fact]
2024-01-02 21:25:40 +01:00
public void Rar5_Encrypted_Reader() => ReadRar("Rar5.encrypted_filesOnly.rar", "test");
2017-12-17 08:08:02 -05:00
2022-12-20 15:20:49 +00:00
private void ReadRar(string testArchive, string password) =>
2022-12-20 15:06:44 +00:00
Read(testArchive, CompressionType.Rar, new ReaderOptions { Password = password });
[Fact]
2022-12-20 15:20:49 +00:00
public void Rar_Entry_Stream() => DoRar_Entry_Stream("Rar.rar");
2017-12-17 08:08:02 -05:00
2022-12-20 15:06:44 +00:00
[Fact]
2022-12-20 15:20:49 +00:00
public void Rar5_Entry_Stream() => DoRar_Entry_Stream("Rar5.rar");
2022-12-20 15:06:44 +00:00
private void DoRar_Entry_Stream(string filename)
{
using (Stream stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, filename)))
2026-01-15 11:41:30 +00:00
using (var reader = ReaderFactory.OpenReader(stream))
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
while (reader.MoveToNextEntry())
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
if (!reader.Entry.IsDirectory)
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
Assert.Equal(CompressionType.Rar, reader.Entry.CompressionType);
using var entryStream = reader.OpenEntryStream();
var file = Path.GetFileName(reader.Entry.Key).NotNull();
2022-12-20 15:06:44 +00:00
var folder =
Path.GetDirectoryName(reader.Entry.Key)
2026-02-11 11:04:25 +00:00
?? throw new InvalidOperationException(
"Entry key must have a directory name."
);
2022-12-20 15:06:44 +00:00
var destdir = Path.Combine(SCRATCH_FILES_PATH, folder);
if (!Directory.Exists(destdir))
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
Directory.CreateDirectory(destdir);
2015-12-30 11:19:42 +00:00
}
2022-12-20 15:06:44 +00:00
var destinationFileName = Path.Combine(destdir, file);
using var fs = File.OpenWrite(destinationFileName);
2025-10-22 09:17:13 +01:00
entryStream.CopyTo(fs);
2015-12-30 11:19:42 +00:00
}
}
}
2022-12-20 15:06:44 +00:00
VerifyFiles();
}
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
[Fact]
public void Rar_Reader_Audio_program()
{
using (
2022-12-20 15:14:22 +00:00
var stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "Rar.Audio_program.rar"))
2022-12-20 15:06:44 +00:00
)
2026-01-15 12:06:54 +00:00
using (
var reader = ReaderFactory.OpenReader(
stream,
new ReaderOptions { LookForHeader = true }
)
)
2022-12-20 15:06:44 +00:00
{
while (reader.MoveToNextEntry())
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
Assert.Equal(CompressionType.Rar, reader.Entry.CompressionType);
reader.WriteEntryToDirectory(SCRATCH_FILES_PATH);
2015-12-30 11:19:42 +00:00
}
}
2022-12-20 15:06:44 +00:00
CompareFilesByPath(
Path.Combine(SCRATCH_FILES_PATH, "test.dat"),
Path.Combine(MISC_TEST_FILES_PATH, "test.dat")
);
}
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
[Fact]
public void Rar_Jpg_Reader()
{
using (var stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "Rar.jpeg.jpg")))
2026-01-15 12:06:54 +00:00
using (
var reader = RarReader.OpenReader(stream, new ReaderOptions { LookForHeader = true })
)
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
while (reader.MoveToNextEntry())
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
Assert.Equal(CompressionType.Rar, reader.Entry.CompressionType);
reader.WriteEntryToDirectory(SCRATCH_FILES_PATH);
2015-12-30 11:19:42 +00:00
}
}
2022-12-20 15:06:44 +00:00
VerifyFiles();
}
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
[Fact]
2022-12-20 15:20:49 +00:00
public void Rar_Solid_Reader() => Read("Rar.solid.rar", CompressionType.Rar);
2015-12-30 11:19:42 +00:00
2023-12-04 20:19:11 +01:00
[Fact]
public void Rar_Comment_Reader() => Read("Rar.comment.rar", CompressionType.Rar);
[Fact]
public void Rar5_Comment_Reader() => Read("Rar5.comment.rar", CompressionType.Rar);
2022-12-20 15:06:44 +00:00
[Fact]
2022-12-20 15:20:49 +00:00
public void Rar5_Solid_Reader() => Read("Rar5.solid.rar", CompressionType.Rar);
2017-12-17 08:08:02 -05:00
2022-12-20 15:06:44 +00:00
[Fact]
2022-12-20 15:20:49 +00:00
public void Rar_Solid_Skip_Reader() => DoRar_Solid_Skip_Reader("Rar.solid.rar");
2017-12-17 08:08:02 -05:00
2022-12-20 15:06:44 +00:00
[Fact]
2022-12-20 15:20:49 +00:00
public void Rar5_Solid_Skip_Reader() => DoRar_Solid_Skip_Reader("Rar5.solid.rar");
2017-12-17 08:08:02 -05:00
2022-12-20 15:06:44 +00:00
private void DoRar_Solid_Skip_Reader(string filename)
{
using var stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, filename));
2026-01-15 12:06:54 +00:00
using var reader = ReaderFactory.OpenReader(
stream,
new ReaderOptions { LookForHeader = true }
);
2022-12-20 15:06:44 +00:00
while (reader.MoveToNextEntry())
2015-12-30 11:19:42 +00:00
{
if (reader.Entry.Key.NotNull().Contains("jpg"))
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
Assert.Equal(CompressionType.Rar, reader.Entry.CompressionType);
reader.WriteEntryToDirectory(SCRATCH_FILES_PATH);
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
[Fact]
2022-12-20 15:20:49 +00:00
public void Rar_Reader_Skip() => DoRar_Reader_Skip("Rar.rar");
2017-12-17 08:08:02 -05:00
2022-12-20 15:06:44 +00:00
[Fact]
2022-12-20 15:20:49 +00:00
public void Rar5_Reader_Skip() => DoRar_Reader_Skip("Rar5.rar");
2017-12-17 08:08:02 -05:00
2022-12-20 15:06:44 +00:00
private void DoRar_Reader_Skip(string filename)
{
using var stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, filename));
2026-01-15 12:06:54 +00:00
using var reader = ReaderFactory.OpenReader(
stream,
new ReaderOptions { LookForHeader = true }
);
2022-12-20 15:06:44 +00:00
while (reader.MoveToNextEntry())
2015-12-30 11:19:42 +00:00
{
if (reader.Entry.Key.NotNull().Contains("jpg"))
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
Assert.Equal(CompressionType.Rar, reader.Entry.CompressionType);
reader.WriteEntryToDirectory(SCRATCH_FILES_PATH);
2015-12-30 11:19:42 +00:00
}
}
}
[Fact]
public void Rar_SkipEncryptedFilesWithoutPassword()
{
using var stream = File.OpenRead(
Path.Combine(TEST_ARCHIVES_PATH, "Rar.encrypted_filesOnly.rar")
);
2026-01-15 12:06:54 +00:00
using var reader = ReaderFactory.OpenReader(
stream,
new ReaderOptions { LookForHeader = true }
);
while (reader.MoveToNextEntry())
{
//
}
}
2024-01-04 21:16:07 +01:00
[Fact]
public void Rar_Iterate_Reader() =>
Iterate(
"Rar.rar",
"Failure jpg exe Empty jpg\\test.jpg exe\\test.exe тест.txt",
CompressionType.Rar
);
[Fact]
public void Rar2_Iterate_Archive() =>
Iterate(
"Rar2.rar",
"Failure Empty тест.txt jpg\\test.jpg exe\\test.exe jpg exe",
CompressionType.Rar
);
[Fact]
public void Rar4_Iterate_Archive() =>
Iterate(
"Rar4.rar",
"Failure Empty jpg exe тест.txt jpg\\test.jpg exe\\test.exe",
CompressionType.Rar
);
[Fact]
public void Rar5_Iterate_Archive() =>
Iterate(
"Rar5.rar",
"Failure jpg exe Empty тест.txt jpg\\test.jpg exe\\test.exe",
CompressionType.Rar
);
[Fact]
public void Rar_Encrypted_Iterate_Archive() =>
Iterate(
"Rar.encrypted_filesOnly.rar",
"Failure jpg exe Empty тест.txt jpg\\test.jpg exe\\test.exe",
CompressionType.Rar
);
[Fact]
public void Rar5_Encrypted_Iterate_Archive() =>
2025-04-28 16:18:01 +01:00
Assert.Throws<CryptographicException>(() =>
Iterate(
"Rar5.encrypted_filesOnly.rar",
"Failure jpg exe Empty тест.txt jpg\\test.jpg exe\\test.exe",
CompressionType.Rar
)
2024-01-04 21:16:07 +01:00
);
2025-05-14 10:27:30 +02:00
[Fact]
public void Rar_Iterate_Multipart()
{
2025-05-14 11:42:52 +02:00
var expectedOrder = new Stack(
new[]
{
"Failure",
"jpg",
"exe",
"Empty",
"тест.txt",
Path.Combine("jpg", "test.jpg"),
Path.Combine("exe", "test.exe"),
}
);
2026-01-15 11:41:30 +00:00
using var reader = RarReader.OpenReader([
2025-11-25 11:50:21 +00:00
Path.Combine(TEST_ARCHIVES_PATH, "Rar.multi.part01.rar"),
Path.Combine(TEST_ARCHIVES_PATH, "Rar.multi.part02.rar"),
Path.Combine(TEST_ARCHIVES_PATH, "Rar.multi.part03.rar"),
Path.Combine(TEST_ARCHIVES_PATH, "Rar.multi.part04.rar"),
Path.Combine(TEST_ARCHIVES_PATH, "Rar.multi.part05.rar"),
Path.Combine(TEST_ARCHIVES_PATH, "Rar.multi.part06.rar"),
]);
2025-05-14 10:27:30 +02:00
while (reader.MoveToNextEntry())
{
Assert.Equal(expectedOrder.Pop(), reader.Entry.Key);
}
}
2015-12-30 11:19:42 +00:00
}