2017-06-11 13:44:01 +01:00
|
|
|
using System.IO;
|
2024-04-23 14:47:40 +01:00
|
|
|
using SharpCompress.Common;
|
2023-11-15 11:05:30 +00:00
|
|
|
using SharpCompress.Compressors.Xz;
|
2017-06-11 13:44:01 +01:00
|
|
|
using Xunit;
|
|
|
|
|
|
2022-12-20 15:20:49 +00:00
|
|
|
namespace SharpCompress.Test.Xz;
|
|
|
|
|
|
2024-03-14 08:53:08 +00:00
|
|
|
public class XzHeaderTests : XzTestsBase
|
2017-06-11 13:44:01 +01:00
|
|
|
{
|
2022-12-20 15:20:49 +00:00
|
|
|
[Fact]
|
|
|
|
|
public void ChecksMagicNumber()
|
2017-06-11 13:44:01 +01:00
|
|
|
{
|
2022-12-20 15:20:49 +00:00
|
|
|
var bytes = (byte[])Compressed.Clone();
|
|
|
|
|
bytes[3]++;
|
2024-03-14 08:37:17 +00:00
|
|
|
using Stream badMagicNumberStream = new MemoryStream(bytes);
|
2026-02-13 14:26:54 +00:00
|
|
|
using var br = new BinaryReader(badMagicNumberStream);
|
2024-03-14 08:37:17 +00:00
|
|
|
var header = new XZHeader(br);
|
2024-04-23 14:47:40 +01:00
|
|
|
var ex = Assert.Throws<InvalidFormatException>(() =>
|
2017-06-11 13:44:01 +01:00
|
|
|
{
|
2024-03-14 08:37:17 +00:00
|
|
|
header.Process();
|
|
|
|
|
});
|
|
|
|
|
Assert.Equal("Invalid XZ Stream", ex.Message);
|
2022-12-20 15:20:49 +00:00
|
|
|
}
|
2017-06-11 13:44:01 +01:00
|
|
|
|
2022-12-20 15:20:49 +00:00
|
|
|
[Fact]
|
|
|
|
|
public void CorruptHeaderThrows()
|
|
|
|
|
{
|
|
|
|
|
var bytes = (byte[])Compressed.Clone();
|
|
|
|
|
bytes[8]++;
|
2024-03-14 08:37:17 +00:00
|
|
|
using Stream badCrcStream = new MemoryStream(bytes);
|
2026-02-13 14:26:54 +00:00
|
|
|
using var br = new BinaryReader(badCrcStream);
|
2024-03-14 08:37:17 +00:00
|
|
|
var header = new XZHeader(br);
|
2024-04-23 14:47:40 +01:00
|
|
|
var ex = Assert.Throws<InvalidFormatException>(() =>
|
2017-06-11 13:44:01 +01:00
|
|
|
{
|
2024-03-14 08:37:17 +00:00
|
|
|
header.Process();
|
|
|
|
|
});
|
|
|
|
|
Assert.Equal("Stream header corrupt", ex.Message);
|
2022-12-20 15:20:49 +00:00
|
|
|
}
|
2017-06-11 13:44:01 +01:00
|
|
|
|
2022-12-20 15:20:49 +00:00
|
|
|
[Fact]
|
|
|
|
|
public void BadVersionIfCrcOkButStreamFlagUnknown()
|
|
|
|
|
{
|
|
|
|
|
var bytes = (byte[])Compressed.Clone();
|
2024-03-14 08:57:16 +00:00
|
|
|
byte[] streamFlags = [0x00, 0xF4];
|
2024-03-14 08:38:12 +00:00
|
|
|
var crc = Crc32.Compute(streamFlags).ToLittleEndianBytes();
|
2022-12-20 15:20:49 +00:00
|
|
|
streamFlags.CopyTo(bytes, 6);
|
|
|
|
|
crc.CopyTo(bytes, 8);
|
2024-03-14 08:37:17 +00:00
|
|
|
using Stream badFlagStream = new MemoryStream(bytes);
|
2026-02-13 14:26:54 +00:00
|
|
|
using var br = new BinaryReader(badFlagStream);
|
2024-03-14 08:37:17 +00:00
|
|
|
var header = new XZHeader(br);
|
2024-04-23 14:47:40 +01:00
|
|
|
var ex = Assert.Throws<InvalidFormatException>(() =>
|
2021-01-09 13:33:34 +00:00
|
|
|
{
|
2024-03-14 08:37:17 +00:00
|
|
|
header.Process();
|
|
|
|
|
});
|
|
|
|
|
Assert.Equal("Unknown XZ Stream Version", ex.Message);
|
2022-12-20 15:20:49 +00:00
|
|
|
}
|
2017-06-11 13:44:01 +01:00
|
|
|
|
2022-12-20 15:20:49 +00:00
|
|
|
[Fact]
|
|
|
|
|
public void ProcessesBlockCheckType()
|
|
|
|
|
{
|
2026-02-13 14:26:54 +00:00
|
|
|
using var br = new BinaryReader(CompressedStream);
|
2022-12-20 15:20:49 +00:00
|
|
|
var header = new XZHeader(br);
|
|
|
|
|
header.Process();
|
|
|
|
|
Assert.Equal(CheckType.CRC64, header.BlockCheckType);
|
|
|
|
|
}
|
2017-06-11 13:44:01 +01:00
|
|
|
|
2022-12-20 15:20:49 +00:00
|
|
|
[Fact]
|
|
|
|
|
public void CanCalculateBlockCheckSize()
|
|
|
|
|
{
|
2026-02-13 14:26:54 +00:00
|
|
|
using var br = new BinaryReader(CompressedStream);
|
2022-12-20 15:20:49 +00:00
|
|
|
var header = new XZHeader(br);
|
|
|
|
|
header.Process();
|
|
|
|
|
Assert.Equal(8, header.BlockCheckSize);
|
|
|
|
|
}
|
2017-06-11 13:44:01 +01:00
|
|
|
|
2022-12-20 15:20:49 +00:00
|
|
|
[Fact]
|
|
|
|
|
public void ProcessesStreamHeaderFromFactory()
|
|
|
|
|
{
|
|
|
|
|
var header = XZHeader.FromStream(CompressedStream);
|
|
|
|
|
Assert.Equal(CheckType.CRC64, header.BlockCheckType);
|
2017-06-11 13:44:01 +01:00
|
|
|
}
|
|
|
|
|
}
|