Release owned Squeeze buffers and failed PPMd models

This commit is contained in:
Adam Hathcock
2026-10-13 10:24:19 +01:00
parent 46437bbbbc
commit b3fac7e04a
4 changed files with 102 additions and 21 deletions

View File

@@ -0,0 +1,42 @@
using System;
using System.IO;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using SharpCompress.Compressors.PPMd;
using SharpCompress.Compressors.Squeezed;
using Xunit;
namespace SharpCompress.Test.Streams;
public class SqueezeLifetimeTests
{
[Theory]
[InlineData(false)]
[InlineData(true)]
public async Task DisposeReleasesOwnedHuffmanStream(bool asyncOpen)
{
// One Huffman node: literal A on zero, end marker on one.
using var source = new MemoryStream(new byte[] { 1, 0, 190, 255, 255, 254, 2 });
var stream = asyncOpen
? await SqueezeStream.CreateAsync(source, 7, CancellationToken.None)
: SqueezeStream.Create(source, 7);
var owned = (Stream)
typeof(SqueezeStream)
.GetField("_huffmanDecoded", BindingFlags.Instance | BindingFlags.NonPublic)!
.GetValue(stream)!;
Assert.True(owned.CanRead);
stream.Dispose();
Assert.False(owned.CanRead);
Assert.True(source.CanRead);
}
[Fact]
public void UnsupportedPpmdCompressionLeavesInputOpen()
{
using var source = new MemoryStream();
var properties = new PpmdProperties(new byte[] { 2, 0, 0, 16, 0 });
Assert.Throws<NotImplementedException>(() => PpmdStream.Create(properties, source, true));
Assert.True(source.CanRead);
}
}