2024-03-14 08:53:08 +00:00
using System ;
2024-01-04 21:16:07 +01:00
using System.Collections.Generic ;
2022-06-19 22:05:52 +02:00
using System.IO ;
2015-12-30 11:19:42 +00:00
using SharpCompress.Common ;
2018-04-22 11:19:11 +01:00
using SharpCompress.IO ;
2016-09-26 11:49:49 +01:00
using SharpCompress.Readers ;
2018-07-10 10:15:21 -07:00
using SharpCompress.Test.Mocks ;
2015-12-30 11:19:42 +00:00
using Xunit ;
2022-12-20 15:06:44 +00:00
namespace SharpCompress.Test ;
public abstract class ReaderTests : TestBase
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
protected void Read (
string testArchive ,
CompressionType expectedCompression ,
ReaderOptions ? options = null
)
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
testArchive = Path . Combine ( TEST_ARCHIVES_PATH , testArchive ) ;
2015-12-30 11:19:42 +00:00
2025-07-20 17:35:22 +01:00
options ? ? = new ReaderOptions ( ) { BufferSize = 0x20000 } ; //test larger buffer size (need test rather than eyeballing debug logs :P)
2018-07-11 18:37:49 -07:00
2022-12-20 15:06:44 +00:00
options . LeaveStreamOpen = true ;
ReadImpl ( testArchive , expectedCompression , options ) ;
2018-07-11 18:37:49 -07:00
2022-12-20 15:06:44 +00:00
options . LeaveStreamOpen = false ;
ReadImpl ( testArchive , expectedCompression , options ) ;
VerifyFiles ( ) ;
}
2018-07-11 15:34:57 -07:00
2022-12-20 15:06:44 +00:00
private void ReadImpl (
string testArchive ,
CompressionType expectedCompression ,
ReaderOptions options
)
{
using var file = File . OpenRead ( testArchive ) ;
2025-07-20 17:35:22 +01:00
using var protectedStream = SharpCompressStream . Create (
new ForwardOnlyStream ( file , options . BufferSize ) ,
leaveOpen : true ,
throwOnDispose : true ,
bufferSize : options . BufferSize
2022-12-20 15:14:22 +00:00
) ;
2022-12-20 15:06:44 +00:00
using var testStream = new TestStream ( protectedStream ) ;
using ( var reader = ReaderFactory . Open ( testStream , options ) )
2018-07-11 15:34:57 -07:00
{
2022-12-20 15:06:44 +00:00
UseReader ( reader , expectedCompression ) ;
protectedStream . ThrowOnDispose = false ;
2025-08-01 21:47:09 +01:00
Assert . False ( testStream . IsDisposed , $"{nameof(testStream)} prematurely closed" ) ;
2015-12-30 11:19:42 +00:00
}
2022-12-20 15:06:44 +00:00
// Boolean XOR -- If the stream should be left open (true), then the stream should not be diposed (false)
// and if the stream should be closed (false), then the stream should be disposed (true)
var message =
$"{nameof(options.LeaveStreamOpen)} is set to '{options.LeaveStreamOpen}', so {nameof(testStream.IsDisposed)} should be set to '{!testStream.IsDisposed}', but is set to {testStream.IsDisposed}" ;
Assert . True ( options . LeaveStreamOpen ! = testStream . IsDisposed , message ) ;
}
public void UseReader ( IReader reader , CompressionType expectedCompression )
{
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 ( expectedCompression , reader . Entry . CompressionType ) ;
reader . WriteEntryToDirectory (
SCRATCH_FILES_PATH ,
2024-03-14 08:37:17 +00:00
new ExtractionOptions { ExtractFullPath = true , Overwrite = true }
2022-12-20 15:06:44 +00:00
) ;
2015-12-30 11:19:42 +00:00
}
}
}
2024-01-04 21:16:07 +01:00
protected void Iterate (
string testArchive ,
string fileOrder ,
CompressionType expectedCompression ,
ReaderOptions ? options = null
)
{
2024-04-23 08:52:10 +01:00
if ( ! Environment . OSVersion . IsWindows ( ) )
2024-01-05 00:35:24 +01:00
{
fileOrder = fileOrder . Replace ( '\\' , '/' ) ;
}
2024-01-04 21:16:07 +01:00
var expected = new Stack < string > ( fileOrder . Split ( ' ' ) ) ;
testArchive = Path . Combine ( TEST_ARCHIVES_PATH , testArchive ) ;
using var file = File . OpenRead ( testArchive ) ;
using var forward = new ForwardOnlyStream ( file ) ;
2024-03-14 08:37:17 +00:00
using var reader = ReaderFactory . Open ( forward , options ) ;
while ( reader . MoveToNextEntry ( ) )
2024-01-04 21:16:07 +01:00
{
2024-03-14 08:37:17 +00:00
Assert . Equal ( expectedCompression , reader . Entry . CompressionType ) ;
Assert . Equal ( expected . Pop ( ) , reader . Entry . Key ) ;
2024-01-04 21:16:07 +01:00
}
}
2015-12-30 11:19:42 +00:00
}