2023-03-29 18:18:17 +02:00
using System ;
2026-05-14 16:06:09 +00:00
using System.Collections.Generic ;
2022-04-21 08:54:59 +01:00
using System.IO ;
2015-12-30 11:19:42 +00:00
using System.Linq ;
2023-11-15 11:05:30 +00:00
using System.Text ;
2016-09-26 11:49:49 +01:00
using SharpCompress.Archives ;
using SharpCompress.Archives.Tar ;
2015-12-30 11:19:42 +00:00
using SharpCompress.Common ;
2019-06-26 17:34:12 +09:00
using SharpCompress.Readers ;
using SharpCompress.Readers.Tar ;
2026-02-12 08:50:18 +00:00
using SharpCompress.Test.Mocks ;
2023-11-15 11:05:30 +00:00
using SharpCompress.Writers ;
using SharpCompress.Writers.Tar ;
using Xunit ;
2015-12-30 11:19:42 +00:00
2022-12-20 15:20:49 +00:00
namespace SharpCompress.Test.Tar ;
2015-12-30 11:19:42 +00:00
2022-12-20 15:20:49 +00:00
public class TarArchiveTests : ArchiveTests
{
public TarArchiveTests ( ) = > UseExtensionInsteadOfNameToVerify = true ;
2019-06-26 17:34:12 +09:00
2022-12-20 15:20:49 +00:00
[Fact]
public void TarArchiveStreamRead ( ) = > ArchiveStreamRead ( "Tar.tar" ) ;
2018-07-23 19:48:01 +02:00
2022-12-20 15:20:49 +00:00
[Fact]
public void TarArchivePathRead ( ) = > ArchiveFileRead ( "Tar.tar" ) ;
2015-12-30 11:19:42 +00:00
2026-02-12 08:50:18 +00:00
[Fact]
public void TarArchiveStreamRead_Throws_On_NonSeekable_Stream ( )
{
using Stream stream = new ForwardOnlyStream (
File . OpenRead ( Path . Combine ( TEST_ARCHIVES_PATH , "Tar.tar" ) )
) ;
Assert . Throws < ArgumentException > ( ( ) = > ArchiveFactory . OpenArchive ( stream ) ) ;
}
2026-04-23 10:19:37 +01:00
[Fact]
public void TarArchiveStreamRead_Throws_On_Unreadable_Stream ( )
{
using var unreadable = new TestStream (
File . OpenRead ( Path . Combine ( TEST_ARCHIVES_PATH , "Tar.tar" ) ) ,
false ,
true ,
true
) ;
Assert . Throws < ArgumentException > ( ( ) = > TarArchive . OpenArchive ( unreadable ) ) ;
}
2026-04-23 09:56:26 +01:00
[Fact]
public void TarArchive_StreamCollection_Throws_On_NonSeekable_Stream ( )
{
using var nonSeekable = new ForwardOnlyStream ( new MemoryStream ( ) ) ;
using var seekable = new MemoryStream ( ) ;
Assert . Throws < ArgumentException > ( ( ) = > TarArchive . OpenArchive ( [ nonSeekable , seekable ] ) ) ;
}
2022-12-20 15:20:49 +00:00
[Fact]
public void Tar_FileName_Exactly_100_Characters ( )
{
2024-03-14 08:38:12 +00:00
var archive = "Tar_FileName_Exactly_100_Characters.tar" ;
2018-07-23 19:48:01 +02:00
2022-12-20 15:20:49 +00:00
// create the 100 char filename
2024-03-14 08:38:12 +00:00
var filename =
2022-12-20 15:20:49 +00:00
"filename_with_exactly_100_characters_______________________________________________________________X" ;
2018-07-23 19:48:01 +02:00
2022-12-20 15:20:49 +00:00
// Step 1: create a tar file containing a file with the test name
using ( Stream stream = File . OpenWrite ( Path . Combine ( SCRATCH2_FILES_PATH , archive ) ) )
2026-02-06 15:16:45 +00:00
using (
var writer = WriterFactory . OpenWriter (
stream ,
ArchiveType . Tar ,
new WriterOptions ( CompressionType . None )
)
)
2022-12-20 15:20:49 +00:00
using ( Stream inputStream = new MemoryStream ( ) )
{
2026-02-13 14:22:22 +00:00
var sw = new StreamWriter ( inputStream ) ;
sw . Write ( "dummy filecontent" ) ;
sw . Flush ( ) ;
2018-07-23 19:48:01 +02:00
2022-12-20 15:20:49 +00:00
inputStream . Position = 0 ;
writer . Write ( filename , inputStream , null ) ;
2018-07-23 19:48:01 +02:00
}
2015-12-30 11:19:42 +00:00
2022-12-20 15:20:49 +00:00
// Step 2: check if the written tar file can be read correctly
2024-03-14 08:38:12 +00:00
var unmodified = Path . Combine ( SCRATCH2_FILES_PATH , archive ) ;
2026-02-12 08:50:18 +00:00
using ( var archive2 = ArchiveFactory . OpenArchive ( unmodified ) )
2015-12-30 11:19:42 +00:00
{
2026-01-12 14:57:13 +00:00
Assert . Equal ( 1 , archive2 . Entries . Count ( ) ) ;
2022-12-20 15:20:49 +00:00
Assert . Contains ( filename , archive2 . Entries . Select ( entry = > entry . Key ) ) ;
foreach ( var entry in archive2 . Entries )
2015-12-30 11:19:42 +00:00
{
2026-02-13 14:26:54 +00:00
using ( var sr = new StreamReader ( entry . OpenEntryStream ( ) ) )
{
Assert . Equal ( "dummy filecontent" , sr . ReadLine ( ) ) ;
}
2015-12-30 11:19:42 +00:00
}
}
2022-12-20 15:20:49 +00:00
}
2015-12-30 11:19:42 +00:00
2022-12-20 15:20:49 +00:00
[Fact]
public void Tar_NonUstarArchiveWithLongNameDoesNotSkipEntriesAfterTheLongOne ( )
{
2024-03-14 08:38:12 +00:00
var unmodified = Path . Combine ( TEST_ARCHIVES_PATH , "very long filename.tar" ) ;
2026-02-12 08:50:18 +00:00
using var archive = ArchiveFactory . OpenArchive ( unmodified ) ;
2026-01-12 14:57:13 +00:00
Assert . Equal ( 5 , archive . Entries . Count ( ) ) ;
2024-03-14 08:37:17 +00:00
Assert . Contains ( "very long filename/" , archive . Entries . Select ( entry = > entry . Key ) ) ;
Assert . Contains (
"very long filename/very long filename very long filename very long filename very long filename very long filename very long filename very long filename very long filename very long filename very long filename.jpg" ,
archive . Entries . Select ( entry = > entry . Key )
) ;
Assert . Contains ( "z_file 1.txt" , archive . Entries . Select ( entry = > entry . Key ) ) ;
Assert . Contains ( "z_file 2.txt" , archive . Entries . Select ( entry = > entry . Key ) ) ;
Assert . Contains ( "z_file 3.txt" , archive . Entries . Select ( entry = > entry . Key ) ) ;
2022-12-20 15:20:49 +00:00
}
2020-05-14 13:47:21 +01:00
2022-12-20 15:20:49 +00:00
[Fact]
public void Tar_VeryLongFilepathReadback ( )
{
2024-03-14 08:38:12 +00:00
var archive = "Tar_VeryLongFilepathReadback.tar" ;
2015-12-30 11:19:42 +00:00
2022-12-20 15:20:49 +00:00
// create a very long filename
2024-03-14 08:38:12 +00:00
var longFilename = "" ;
for ( var i = 0 ; i < 600 ; i = longFilename . Length )
2022-12-20 15:20:49 +00:00
{
longFilename + = i . ToString ( "D10" ) + "-" ;
}
2015-12-30 11:19:42 +00:00
2022-12-20 15:20:49 +00:00
longFilename + = ".txt" ;
2015-12-30 11:19:42 +00:00
2022-12-20 15:20:49 +00:00
// Step 1: create a tar file containing a file with a long name
using ( Stream stream = File . OpenWrite ( Path . Combine ( SCRATCH2_FILES_PATH , archive ) ) )
2026-02-06 15:16:45 +00:00
using (
var writer = WriterFactory . OpenWriter (
stream ,
ArchiveType . Tar ,
new WriterOptions ( CompressionType . None )
)
)
2022-12-20 15:20:49 +00:00
using ( Stream inputStream = new MemoryStream ( ) )
{
2026-02-13 14:22:22 +00:00
var sw = new StreamWriter ( inputStream ) ;
sw . Write ( "dummy filecontent" ) ;
sw . Flush ( ) ;
2015-12-30 11:19:42 +00:00
2022-12-20 15:20:49 +00:00
inputStream . Position = 0 ;
writer . Write ( longFilename , inputStream , null ) ;
2015-12-30 11:19:42 +00:00
}
2022-12-20 15:20:49 +00:00
// Step 2: check if the written tar file can be read correctly
2024-03-14 08:38:12 +00:00
var unmodified = Path . Combine ( SCRATCH2_FILES_PATH , archive ) ;
2026-02-12 08:50:18 +00:00
using ( var archive2 = ArchiveFactory . OpenArchive ( unmodified ) )
2015-12-30 11:19:42 +00:00
{
2026-01-12 14:57:13 +00:00
Assert . Equal ( 1 , archive2 . Entries . Count ( ) ) ;
2022-12-20 15:20:49 +00:00
Assert . Contains ( longFilename , archive2 . Entries . Select ( entry = > entry . Key ) ) ;
foreach ( var entry in archive2 . Entries )
2015-12-30 11:19:42 +00:00
{
2026-02-13 14:26:54 +00:00
using ( var sr = new StreamReader ( entry . OpenEntryStream ( ) ) )
{
Assert . Equal ( "dummy filecontent" , sr . ReadLine ( ) ) ;
}
2015-12-30 11:19:42 +00:00
}
}
2022-12-20 15:20:49 +00:00
}
2015-12-30 11:19:42 +00:00
2022-12-20 15:20:49 +00:00
[Fact]
public void Tar_UstarArchivePathReadLongName ( )
{
2024-03-14 08:38:12 +00:00
var unmodified = Path . Combine ( TEST_ARCHIVES_PATH , "ustar with long names.tar" ) ;
2026-02-12 08:50:18 +00:00
using var archive = ArchiveFactory . OpenArchive ( unmodified ) ;
2026-01-12 14:57:13 +00:00
Assert . Equal ( 6 , archive . Entries . Count ( ) ) ;
2024-03-14 08:37:17 +00:00
Assert . Contains ( "Directory/" , archive . Entries . Select ( entry = > entry . Key ) ) ;
Assert . Contains (
"Directory/Some file with veeeeeeeeeery loooooooooong name" ,
archive . Entries . Select ( entry = > entry . Key )
) ;
Assert . Contains (
"Directory/Directory with veeeeeeeeeery loooooooooong name/" ,
archive . Entries . Select ( entry = > entry . Key )
) ;
Assert . Contains (
"Directory/Directory with veeeeeeeeeery loooooooooong name/Some file with veeeeeeeeeery loooooooooong name" ,
archive . Entries . Select ( entry = > entry . Key )
) ;
Assert . Contains (
"Directory/Directory with veeeeeeeeeery loooooooooong name/Directory with veeeeeeeeeery loooooooooong name/" ,
archive . Entries . Select ( entry = > entry . Key )
) ;
Assert . Contains (
"Directory/Directory with veeeeeeeeeery loooooooooong name/Directory with veeeeeeeeeery loooooooooong name/Some file with veeeeeeeeeery loooooooooong name" ,
archive . Entries . Select ( entry = > entry . Key )
) ;
2022-12-20 15:20:49 +00:00
}
2015-12-30 11:19:42 +00:00
2026-04-19 15:17:35 +01:00
[Fact]
public void Tar_PaxLocalHeader_Archive ( )
{
var archivePath = Path . Combine ( TEST_ARCHIVES_PATH , "Tar.PaxLocalHeader.tar" ) ;
using var archive = TarArchive . OpenArchive ( archivePath ) ;
var firstEntry = ( TarArchiveEntry )
archive . Entries . Single ( entry = > entry . Key = = "pax/overridden-name.txt" ) ;
Assert . Equal ( 10 , firstEntry . Size ) ;
Assert . Equal ( 1234 , firstEntry . UserID ) ;
Assert . Equal ( 2345 , firstEntry . GroupId ) ;
Assert . Equal ( Convert . ToInt64 ( "640" , 8 ) , firstEntry . Mode ) ;
var expectedTime = DateTimeOffset . FromUnixTimeSeconds ( 1700000000 ) . LocalDateTime ;
Assert . Equal ( expectedTime , firstEntry . LastModifiedTime ) ;
var secondEntry = ( TarArchiveEntry )
archive . Entries . Single ( entry = > entry . Key = = "second.txt" ) ;
Assert . Equal ( 2 , secondEntry . Size ) ;
Assert . Equal ( 11 , secondEntry . UserID ) ;
Assert . Equal ( 22 , secondEntry . GroupId ) ;
Assert . Equal ( Convert . ToInt64 ( "644" , 8 ) , secondEntry . Mode ) ;
}
[Fact]
public void Tar_PaxLocalHeader_Link_Archive ( )
{
var archivePath = Path . Combine ( TEST_ARCHIVES_PATH , "Tar.PaxLocalHeader.Link.tar" ) ;
using var archive = TarArchive . OpenArchive ( archivePath ) ;
var entry = ( TarArchiveEntry ) archive . Entries . Single ( ) ;
Assert . Equal ( "pax/link-entry" , entry . Key ) ;
Assert . Equal ( "pax/target-entry" , entry . LinkTarget ) ;
}
2026-04-20 08:26:11 +01:00
[Fact]
public void Tar_PaxGlobalHeader_Archive ( )
{
var archivePath = Path . Combine ( TEST_ARCHIVES_PATH , "Tar.PaxGlobalHeader.tar" ) ;
using var archive = TarArchive . OpenArchive ( archivePath ) ;
var globalTime = DateTimeOffset . FromUnixTimeSeconds ( 1700000100 ) . LocalDateTime ;
var localOverrideTime = DateTimeOffset . FromUnixTimeSeconds ( 1700000200 ) . LocalDateTime ;
var firstEntry = ( TarArchiveEntry )
archive . Entries . Single ( entry = > entry . Key = = "global-one.txt" ) ;
Assert . Equal ( 4000 , firstEntry . UserID ) ;
Assert . Equal ( 5000 , firstEntry . GroupId ) ;
Assert . Equal ( Convert . ToInt64 ( "640" , 8 ) , firstEntry . Mode ) ;
Assert . Equal ( globalTime , firstEntry . LastModifiedTime ) ;
var secondEntry = ( TarArchiveEntry )
archive . Entries . Single ( entry = > entry . Key = = "global-local-override.txt" ) ;
Assert . Equal ( 4010 , secondEntry . UserID ) ;
Assert . Equal ( 5010 , secondEntry . GroupId ) ;
Assert . Equal ( Convert . ToInt64 ( "600" , 8 ) , secondEntry . Mode ) ;
Assert . Equal ( localOverrideTime , secondEntry . LastModifiedTime ) ;
var thirdEntry = ( TarArchiveEntry )
archive . Entries . Single ( entry = > entry . Key = = "global-three.txt" ) ;
Assert . Equal ( 4000 , thirdEntry . UserID ) ;
Assert . Equal ( 5000 , thirdEntry . GroupId ) ;
Assert . Equal ( Convert . ToInt64 ( "640" , 8 ) , thirdEntry . Mode ) ;
Assert . Equal ( globalTime , thirdEntry . LastModifiedTime ) ;
}
[Fact]
public void Tar_PaxGlobalHeader_Link_Archive ( )
{
var archivePath = Path . Combine ( TEST_ARCHIVES_PATH , "Tar.PaxGlobalHeader.Link.tar" ) ;
using var archive = TarArchive . OpenArchive ( archivePath ) ;
var globalLink = ( TarArchiveEntry )
archive . Entries . Single ( entry = > entry . Key = = "global-link" ) ;
Assert . Equal ( "global-target" , globalLink . LinkTarget ) ;
Assert . Equal ( 4100 , globalLink . UserID ) ;
Assert . Equal ( 5100 , globalLink . GroupId ) ;
Assert . Equal ( Convert . ToInt64 ( "777" , 8 ) , globalLink . Mode ) ;
var localOverrideLink = ( TarArchiveEntry )
archive . Entries . Single ( entry = > entry . Key = = "local-link-override" ) ;
Assert . Equal ( "local-target" , localOverrideLink . LinkTarget ) ;
Assert . Equal ( 4100 , localOverrideLink . UserID ) ;
Assert . Equal ( 5100 , localOverrideLink . GroupId ) ;
Assert . Equal ( Convert . ToInt64 ( "777" , 8 ) , localOverrideLink . Mode ) ;
}
2022-12-20 15:20:49 +00:00
[Fact]
public void Tar_Create_New ( )
{
2024-03-14 08:38:12 +00:00
var scratchPath = Path . Combine ( SCRATCH_FILES_PATH , "Tar.tar" ) ;
var unmodified = Path . Combine ( TEST_ARCHIVES_PATH , "Tar.noEmptyDirs.tar" ) ;
2019-06-26 17:34:12 +09:00
2022-12-20 15:20:49 +00:00
// var aropt = new Ar
2022-12-20 13:45:47 +00:00
2026-01-15 11:41:30 +00:00
using ( var archive = TarArchive . CreateArchive ( ) )
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:20:49 +00:00
archive . AddAllFromDirectory ( ORIGINAL_FILES_PATH ) ;
2026-02-06 15:16:45 +00:00
var twopt = new TarWriterOptions ( CompressionType . None , true )
{
ArchiveEncoding = new ArchiveEncoding { Default = Encoding . GetEncoding ( 866 ) } ,
} ;
2022-12-20 15:20:49 +00:00
archive . SaveTo ( scratchPath , twopt ) ;
2015-12-30 11:19:42 +00:00
}
2022-12-20 15:20:49 +00:00
CompareArchivesByPath ( unmodified , scratchPath ) ;
}
[Fact]
public void Tar_Random_Write_Add ( )
{
2024-03-14 08:38:12 +00:00
var jpg = Path . Combine ( ORIGINAL_FILES_PATH , "jpg" , "test.jpg" ) ;
var scratchPath = Path . Combine ( SCRATCH_FILES_PATH , "Tar.mod.tar" ) ;
var unmodified = Path . Combine ( TEST_ARCHIVES_PATH , "Tar.mod.tar" ) ;
var modified = Path . Combine ( TEST_ARCHIVES_PATH , "Tar.noEmptyDirs.tar" ) ;
2015-12-30 11:19:42 +00:00
2026-01-15 11:41:30 +00:00
using ( var archive = TarArchive . OpenArchive ( unmodified ) )
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:20:49 +00:00
archive . AddEntry ( "jpg\\test.jpg" , jpg ) ;
2026-02-10 10:48:42 +00:00
archive . SaveTo ( scratchPath , new TarWriterOptions ( CompressionType . None , true ) ) ;
2022-12-20 15:20:49 +00:00
}
CompareArchivesByPath ( modified , scratchPath ) ;
}
2015-12-30 11:19:42 +00:00
2022-12-20 15:20:49 +00:00
[Fact]
public void Tar_Random_Write_Remove ( )
{
2024-03-14 08:38:12 +00:00
var scratchPath = Path . Combine ( SCRATCH_FILES_PATH , "Tar.mod.tar" ) ;
var modified = Path . Combine ( TEST_ARCHIVES_PATH , "Tar.mod.tar" ) ;
var unmodified = Path . Combine ( TEST_ARCHIVES_PATH , "Tar.noEmptyDirs.tar" ) ;
2022-12-20 15:20:49 +00:00
2026-01-15 11:41:30 +00:00
using ( var archive = TarArchive . OpenArchive ( unmodified ) )
2022-12-20 15:20:49 +00:00
{
2024-03-14 08:29:30 +00:00
var entry = archive . Entries . Single ( x = >
2024-04-18 14:25:10 +01:00
x . Key . NotNull ( ) . EndsWith ( "jpg" , StringComparison . OrdinalIgnoreCase )
2023-12-18 09:04:04 +00:00
) ;
2022-12-20 15:20:49 +00:00
archive . RemoveEntry ( entry ) ;
2026-02-10 10:48:42 +00:00
archive . SaveTo ( scratchPath , new TarWriterOptions ( CompressionType . None , true ) ) ;
2015-12-30 11:19:42 +00:00
}
2022-12-20 15:20:49 +00:00
CompareArchivesByPath ( modified , scratchPath ) ;
}
2016-02-13 09:24:44 +00:00
2022-12-20 15:20:49 +00:00
[Fact]
public void Tar_Containing_Rar_Archive ( )
{
2024-03-14 08:38:12 +00:00
var archiveFullPath = Path . Combine ( TEST_ARCHIVES_PATH , "Tar.ContainsRar.tar" ) ;
2024-03-14 08:37:17 +00:00
using Stream stream = File . OpenRead ( archiveFullPath ) ;
2026-01-15 11:41:30 +00:00
using var archive = ArchiveFactory . OpenArchive ( stream ) ;
2024-03-14 08:37:17 +00:00
Assert . True ( archive . Type = = ArchiveType . Tar ) ;
2022-12-20 15:20:49 +00:00
}
2018-08-16 09:44:08 +01:00
2022-12-20 15:20:49 +00:00
[Fact]
public void Tar_Empty_Archive ( )
{
2024-03-14 08:38:12 +00:00
var archiveFullPath = Path . Combine ( TEST_ARCHIVES_PATH , "Tar.Empty.tar" ) ;
2024-03-14 08:37:17 +00:00
using Stream stream = File . OpenRead ( archiveFullPath ) ;
2026-01-15 11:41:30 +00:00
using var archive = ArchiveFactory . OpenArchive ( stream ) ;
2024-07-11 19:52:33 +02:00
Assert . True ( archive . Type = = ArchiveType . Tar ) ;
2022-12-20 15:20:49 +00:00
}
2022-12-20 13:45:47 +00:00
2022-12-20 15:20:49 +00:00
[Theory]
[InlineData(10)]
[InlineData(128)]
public void Tar_Japanese_Name ( int length )
{
2024-03-14 08:37:17 +00:00
using var mstm = new MemoryStream ( ) ;
var enc = new ArchiveEncoding { Default = Encoding . UTF8 } ;
2026-02-06 15:16:45 +00:00
var twopt = new TarWriterOptions ( CompressionType . None , true ) { ArchiveEncoding = enc } ;
2024-03-14 08:37:17 +00:00
var fname = new string ( ( char ) 0x3042 , length ) ;
using ( var tw = new TarWriter ( mstm , twopt ) )
using ( var input = new MemoryStream ( new byte [ 32 ] ) )
2019-06-26 17:34:12 +09:00
{
2024-03-14 08:37:17 +00:00
tw . Write ( fname , input , null ) ;
}
using ( var inputMemory = new MemoryStream ( mstm . ToArray ( ) ) )
{
2026-04-21 11:04:14 +01:00
var tropt = ReaderOptions . ForExternalStream . WithArchiveEncoding ( enc ) ;
2026-01-15 11:41:30 +00:00
using ( var tr = TarReader . OpenReader ( inputMemory , tropt ) )
2022-12-20 15:20:49 +00:00
{
2024-03-14 08:37:17 +00:00
while ( tr . MoveToNextEntry ( ) )
2019-06-26 17:34:12 +09:00
{
2024-03-14 08:37:17 +00:00
Assert . Equal ( fname , tr . Entry . Key ) ;
2019-06-26 17:34:12 +09:00
}
}
}
2022-12-20 15:20:49 +00:00
}
2020-07-20 12:57:39 -04:00
2022-12-20 15:20:49 +00:00
[Fact]
public void Tar_Read_One_At_A_Time ( )
{
2025-01-14 09:07:40 +00:00
var archiveEncoding = new ArchiveEncoding { Default = Encoding . UTF8 } ;
2022-12-20 15:20:49 +00:00
var tarWriterOptions = new TarWriterOptions ( CompressionType . None , true )
2020-07-20 12:57:39 -04:00
{
2022-12-20 15:20:49 +00:00
ArchiveEncoding = archiveEncoding ,
} ;
var testBytes = Encoding . UTF8 . GetBytes ( "This is a test." ) ;
2020-07-20 12:57:39 -04:00
2024-03-14 08:37:17 +00:00
using var memoryStream = new MemoryStream ( ) ;
using ( var tarWriter = new TarWriter ( memoryStream , tarWriterOptions ) )
using ( var testFileStream = new MemoryStream ( testBytes ) )
2022-12-20 15:20:49 +00:00
{
2024-03-14 08:37:17 +00:00
tarWriter . Write ( "test1.txt" , testFileStream ) ;
testFileStream . Position = 0 ;
tarWriter . Write ( "test2.txt" , testFileStream ) ;
}
2020-07-20 12:57:39 -04:00
2024-03-14 08:37:17 +00:00
memoryStream . Position = 0 ;
2020-07-20 12:57:39 -04:00
2024-03-14 08:37:17 +00:00
var numberOfEntries = 0 ;
2020-07-20 12:57:39 -04:00
2026-02-12 08:50:18 +00:00
using ( var archive = ArchiveFactory . OpenArchive ( memoryStream ) )
2024-03-14 08:37:17 +00:00
{
2026-02-12 08:50:18 +00:00
foreach ( var entry in archive . Entries )
2022-12-20 15:20:49 +00:00
{
2024-03-14 08:37:17 +00:00
+ + numberOfEntries ;
2022-12-20 15:20:49 +00:00
2024-03-14 08:37:17 +00:00
using var tarEntryStream = entry . OpenEntryStream ( ) ;
using var testFileStream = new MemoryStream ( ) ;
tarEntryStream . CopyTo ( testFileStream ) ;
Assert . Equal ( testBytes . Length , testFileStream . Length ) ;
}
2020-07-20 12:57:39 -04:00
}
2024-03-14 08:37:17 +00:00
Assert . Equal ( 2 , numberOfEntries ) ;
2015-12-30 11:19:42 +00:00
}
2024-07-10 19:53:32 +02:00
2026-05-14 16:06:09 +00:00
[Fact]
public void Tar_Read_One_At_A_Time_Without_Disposing_Entry_Stream ( )
{
var archiveEncoding = new ArchiveEncoding { Default = Encoding . UTF8 } ;
var tarWriterOptions = new TarWriterOptions ( CompressionType . None , true )
{
ArchiveEncoding = archiveEncoding ,
} ;
var testBytes = Encoding . UTF8 . GetBytes ( "This is a test." ) ;
using var memoryStream = new MemoryStream ( ) ;
using ( var tarWriter = new TarWriter ( memoryStream , tarWriterOptions ) )
using ( var testFileStream = new MemoryStream ( testBytes ) )
{
tarWriter . Write ( "file0.txt" , testFileStream ) ;
testFileStream . Position = 0 ;
tarWriter . Write ( "file1.txt" , testFileStream ) ;
tarWriter . WriteDirectory ( "folder0" , null ) ;
testFileStream . Position = 0 ;
tarWriter . Write ( "folder0/file_in_folder0.txt" , testFileStream ) ;
}
memoryStream . Position = 0 ;
var entryKeys = new List < string? > ( ) ;
var openEntryStreams = new List < Stream > ( ) ;
using ( var archive = ArchiveFactory . OpenArchive ( memoryStream ) )
{
foreach ( var entry in archive . Entries )
{
entryKeys . Add ( entry . Key ) ;
if ( entry . IsDirectory )
{
continue ;
}
var tarEntryStream = entry . OpenEntryStream ( ) ;
openEntryStreams . Add ( tarEntryStream ) ;
using var testFileStream = new MemoryStream ( ) ;
tarEntryStream . CopyTo ( testFileStream ) ;
Assert . Equal ( testBytes . Length , testFileStream . Length ) ;
}
Assert . Equal ( 4 , archive . Entries . Count ( ) ) ;
}
openEntryStreams . ForEach ( stream = > stream . Dispose ( ) ) ;
Assert . Equal (
["file0.txt", "file1.txt", "folder0/", "folder0/file_in_folder0.txt"] ,
entryKeys
) ;
}
2024-07-10 19:53:32 +02:00
[Fact]
public void Tar_Detect_Test ( )
{
var isTar = TarArchive . IsTarFile ( Path . Combine ( TEST_ARCHIVES_PATH , "false.positive.tar" ) ) ;
Assert . False ( isTar ) ;
}
2026-02-12 09:48:06 +00:00
[Fact]
public void TarArchiveStreamRead_Autodetect_CompressedTar ( )
{
using Stream stream = File . OpenRead ( Path . Combine ( TEST_ARCHIVES_PATH , "Tar.tar.gz" ) ) ;
using var archive = ArchiveFactory . OpenArchive ( stream ) ;
Assert . Equal ( ArchiveType . Tar , archive . Type ) ;
Assert . NotEmpty ( archive . Entries ) ;
}
[Fact]
public void TarReaderStreamRead_Autodetect_CompressedTar ( )
{
using Stream stream = File . OpenRead ( Path . Combine ( TEST_ARCHIVES_PATH , "Tar.tar.gz" ) ) ;
using var reader = ReaderFactory . OpenReader ( stream ) ;
2026-03-06 11:22:09 +00:00
Assert . Equal ( ArchiveType . Tar , reader . Type ) ;
2026-02-12 09:48:06 +00:00
Assert . True ( reader . MoveToNextEntry ( ) ) ;
}
2015-12-30 11:19:42 +00:00
}