Files
sharpcompress/tests/SharpCompress.Test/Xz/XZStreamTests.cs
copilot-swe-agent[bot] e5ef31bdaf Fix XZBlock exception when accessing Position on non-seekable streams
XZBlock accesses stream.Position in its constructor and SkipPadding(),
which throws NotSupportedException for non-seekable streams (e.g., HTTP).

Fix: XZStream now auto-wraps non-seekable streams with
SharpCompressStream.Create() to provide position tracking via ring buffer.

Add tests for raw non-seekable streams (sync and async).

Co-authored-by: adamhathcock <527620+adamhathcock@users.noreply.github.com>
2026-02-23 21:11:00 +00:00

78 lines
2.3 KiB
C#

using System.IO;
using SharpCompress.Compressors.Xz;
using SharpCompress.IO;
using SharpCompress.Test.Mocks;
using Xunit;
namespace SharpCompress.Test.Xz;
public class XzStreamTests : XzTestsBase
{
[Fact]
public void CanReadEmptyStream()
{
var xz = new XZStream(CompressedEmptyStream);
using var sr = new StreamReader(xz);
var uncompressed = sr.ReadToEnd();
Assert.Equal(OriginalEmpty, uncompressed);
}
[Fact]
public void CanReadStream()
{
var xz = new XZStream(CompressedStream);
using var sr = new StreamReader(xz);
var uncompressed = sr.ReadToEnd();
Assert.Equal(Original, uncompressed);
}
[Fact]
public void CanReadIndexedStream()
{
var xz = new XZStream(CompressedIndexedStream);
using var sr = new StreamReader(xz);
var uncompressed = sr.ReadToEnd();
Assert.Equal(OriginalIndexed, uncompressed);
}
[Fact]
public void CanReadNonSeekableStream()
{
var nonSeekable = new ForwardOnlyStream(new MemoryStream(Compressed));
var xz = new XZStream(SharpCompressStream.Create(nonSeekable));
using var sr = new StreamReader(xz);
var uncompressed = sr.ReadToEnd();
Assert.Equal(Original, uncompressed);
}
[Fact]
public void CanReadNonSeekableEmptyStream()
{
var nonSeekable = new ForwardOnlyStream(new MemoryStream(CompressedEmpty));
var xz = new XZStream(SharpCompressStream.Create(nonSeekable));
using var sr = new StreamReader(xz);
var uncompressed = sr.ReadToEnd();
Assert.Equal(OriginalEmpty, uncompressed);
}
[Fact]
public void CanReadRawNonSeekableStream()
{
var nonSeekable = new ForwardOnlyStream(new MemoryStream(Compressed));
var xz = new XZStream(nonSeekable);
using var sr = new StreamReader(xz);
var uncompressed = sr.ReadToEnd();
Assert.Equal(Original, uncompressed);
}
[Fact]
public void CanReadRawNonSeekableEmptyStream()
{
var nonSeekable = new ForwardOnlyStream(new MemoryStream(CompressedEmpty));
var xz = new XZStream(nonSeekable);
using var sr = new StreamReader(xz);
var uncompressed = sr.ReadToEnd();
Assert.Equal(OriginalEmpty, uncompressed);
}
}