Esempio n. 1
0
 public async Task NullStream_Throws_Async()
 {
     await using (MemoryStream archiveStream = new MemoryStream())
     {
         await Assert.ThrowsAsync <ArgumentNullException>(() => TarFile.CreateFromDirectoryAsync(sourceDirectoryName: "path", destination: null, includeBaseDirectory: false));
     }
 }
Esempio n. 2
0
        public async Task IncludeBaseDirectoryIfEmpty_Async()
        {
            using (TempDirectory source = new TempDirectory())
                using (TempDirectory destination = new TempDirectory())
                {
                    string destinationArchiveFileName = Path.Join(destination.Path, "output.tar");

                    await TarFile.CreateFromDirectoryAsync(source.Path, destinationArchiveFileName, includeBaseDirectory : true);

                    FileStreamOptions readOptions = new()
                    {
                        Access  = FileAccess.Read,
                        Mode    = FileMode.Open,
                        Options = FileOptions.Asynchronous,
                    };

                    await using (FileStream fileStream = File.Open(destinationArchiveFileName, readOptions))
                    {
                        await using (TarReader reader = new TarReader(fileStream))
                        {
                            TarEntry entry = await reader.GetNextEntryAsync();

                            Assert.NotNull(entry);
                            Assert.Equal(TarEntryType.Directory, entry.EntryType);
                            Assert.Equal(Path.GetFileName(source.Path) + '/', entry.Name);

                            Assert.Null(await reader.GetNextEntryAsync());
                        }
                    }
                }
        }
Esempio n. 3
0
        public async Task SkipRecursionIntoBaseDirectorySymlinkAsync()
        {
            using TempDirectory root = new TempDirectory();

            string destinationArchive = Path.Join(root.Path, "destination.tar");

            string externalDirectory = Path.Join(root.Path, "externalDirectory");

            Directory.CreateDirectory(externalDirectory);

            string subDirectory = Path.Join(externalDirectory, "subDirectory");

            Directory.CreateDirectory(subDirectory);

            string sourceDirectoryName = Path.Join(root.Path, "baseDirectory");

            Directory.CreateSymbolicLink(sourceDirectoryName, externalDirectory);

            await TarFile.CreateFromDirectoryAsync(sourceDirectoryName, destinationArchive, includeBaseDirectory : true); // Base directory is a symlink, do not recurse

            await using FileStream archiveStream = File.OpenRead(destinationArchive);
            await using TarReader reader         = new(archiveStream, leaveOpen : false);

            TarEntry entry = await reader.GetNextEntryAsync();

            Assert.NotNull(entry);
            Assert.Equal("baseDirectory/", entry.Name);
            Assert.Equal(TarEntryType.SymbolicLink, entry.EntryType);

            Assert.Null(await reader.GetNextEntryAsync()); // subDirectory should not be found
        }
Esempio n. 4
0
        public Task CreateFromDirectoryAsync_Cancel()
        {
            CancellationTokenSource cs = new CancellationTokenSource();

            cs.Cancel();
            return(Assert.ThrowsAsync <TaskCanceledException>(() => TarFile.CreateFromDirectoryAsync("directory", "file.tar", includeBaseDirectory: false, cs.Token)));
        }
        public async Task SetsLastModifiedTimeOnExtractedFiles()
        {
            using TempDirectory root = new TempDirectory();

            string inDir  = Path.Join(root.Path, "indir");
            string inFile = Path.Join(inDir, "file");

            string tarFile = Path.Join(root.Path, "file.tar");

            string outDir  = Path.Join(root.Path, "outdir");
            string outFile = Path.Join(outDir, "file");

            Directory.CreateDirectory(inDir);
            File.Create(inFile).Dispose();
            var dt = new DateTime(2001, 1, 2, 3, 4, 5, DateTimeKind.Local);

            File.SetLastWriteTime(inFile, dt);

            await TarFile.CreateFromDirectoryAsync(sourceDirectoryName : inDir, destinationFileName : tarFile, includeBaseDirectory : false);

            Directory.CreateDirectory(outDir);
            await TarFile.ExtractToDirectoryAsync(sourceFileName : tarFile, destinationDirectoryName : outDir, overwriteFiles : false);

            Assert.True(File.Exists(outFile));
            Assert.InRange(File.GetLastWriteTime(outFile).Ticks, dt.AddSeconds(-3).Ticks, dt.AddSeconds(3).Ticks); // include some slop for filesystem granularity
        }
Esempio n. 6
0
        public async Task InvalidPath_Throws_Async()
        {
            await using (MemoryStream archiveStream = new MemoryStream())
            {
                await Assert.ThrowsAsync <ArgumentNullException>(() => TarFile.CreateFromDirectoryAsync(sourceDirectoryName: null, destination: archiveStream, includeBaseDirectory: false));

                await Assert.ThrowsAsync <ArgumentException>(() => TarFile.CreateFromDirectoryAsync(sourceDirectoryName: string.Empty, destination: archiveStream, includeBaseDirectory: false));
            }
        }
Esempio n. 7
0
 public async Task UnwritableStream_Throws_Async()
 {
     await using (MemoryStream archiveStream = new MemoryStream())
     {
         await using (WrappedStream unwritable = new WrappedStream(archiveStream, canRead: true, canWrite: false, canSeek: true))
         {
             await Assert.ThrowsAsync <IOException>(() => TarFile.CreateFromDirectoryAsync(sourceDirectoryName: "path", destination: unwritable, includeBaseDirectory: false));
         }
     }
 }
Esempio n. 8
0
        public async Task NonExistentDirectory_Throws_Async()
        {
            using (TempDirectory root = new TempDirectory())
            {
                string dirPath  = Path.Join(root.Path, "dir");
                string filePath = Path.Join(root.Path, "file.tar");

                await Assert.ThrowsAsync <DirectoryNotFoundException>(() => TarFile.CreateFromDirectoryAsync(sourceDirectoryName: "IDontExist", destinationFileName: filePath, includeBaseDirectory: false));
            }
        }
Esempio n. 9
0
        public async Task InvalidPaths_Throw_Async()
        {
            await Assert.ThrowsAsync <ArgumentNullException>(() => TarFile.CreateFromDirectoryAsync(sourceDirectoryName: null, destinationFileName: "path", includeBaseDirectory: false));

            await Assert.ThrowsAsync <ArgumentException>(() => TarFile.CreateFromDirectoryAsync(sourceDirectoryName: string.Empty, destinationFileName: "path", includeBaseDirectory: false));

            await Assert.ThrowsAsync <ArgumentNullException>(() => TarFile.CreateFromDirectoryAsync(sourceDirectoryName: "path", destinationFileName: null, includeBaseDirectory: false));

            await Assert.ThrowsAsync <ArgumentException>(() => TarFile.CreateFromDirectoryAsync(sourceDirectoryName: "path", destinationFileName: string.Empty, includeBaseDirectory: false));
        }
Esempio n. 10
0
        public async Task TarGz_TarFile_CreateFromDir_ExtractToDir_Async()
        {
            using (TempDirectory root = new TempDirectory())
            {
                string archivePath = Path.Join(root.Path, "compressed.tar.gz");

                string sourceDirectory = Path.Join(root.Path, "source");
                Directory.CreateDirectory(sourceDirectory);

                string destinationDirectory = Path.Join(root.Path, "destination");
                Directory.CreateDirectory(destinationDirectory);

                string fileName = "file.txt";
                string filePath = Path.Join(sourceDirectory, fileName);
                File.Create(filePath).Dispose();

                FileStreamOptions createOptions = new()
                {
                    Mode    = FileMode.CreateNew,
                    Access  = FileAccess.Write,
                    Options = FileOptions.Asynchronous
                };

                await using (FileStream streamToCompress = File.Open(archivePath, createOptions))
                {
                    await using (GZipStream compressorStream = new GZipStream(streamToCompress, CompressionMode.Compress))
                    {
                        await TarFile.CreateFromDirectoryAsync(sourceDirectory, compressorStream, includeBaseDirectory : false);
                    }
                }

                FileInfo fileInfo = new FileInfo(archivePath);
                Assert.True(fileInfo.Exists);
                Assert.True(fileInfo.Length > 0);

                FileStreamOptions readOptions = new()
                {
                    Mode    = FileMode.Open,
                    Access  = FileAccess.Read,
                    Options = FileOptions.Asynchronous
                };

                await using (FileStream streamToDecompress = File.Open(archivePath, readOptions))
                {
                    await using (GZipStream decompressorStream = new GZipStream(streamToDecompress, CompressionMode.Decompress))
                    {
                        await TarFile.ExtractToDirectoryAsync(decompressorStream, destinationDirectory, overwriteFiles : true);

                        Assert.True(File.Exists(filePath));
                    }
                }
            }
        }
    }
}
Esempio n. 11
0
        public async Task CreateFromDirectoryAsync_Cancel()
        {
            CancellationTokenSource cs = new CancellationTokenSource();

            cs.Cancel();

            await using (MemoryStream archiveStream = new MemoryStream())
            {
                await Assert.ThrowsAsync <TaskCanceledException>(() => TarFile.CreateFromDirectoryAsync("directory", archiveStream, includeBaseDirectory: false, cs.Token));
            }
        }
Esempio n. 12
0
        public async Task NonExistentDirectory_Throws_Async()
        {
            using (TempDirectory root = new TempDirectory())
            {
                string dirPath = Path.Join(root.Path, "dir");

                await using (MemoryStream archive = new MemoryStream())
                {
                    await Assert.ThrowsAsync <DirectoryNotFoundException>(() => TarFile.CreateFromDirectoryAsync(sourceDirectoryName: dirPath, destination: archive, includeBaseDirectory: false));
                }
            }
        }
        public async Task IncludeAllSegmentsOfPath_Async(bool includeBaseDirectory)
        {
            using (TempDirectory source = new TempDirectory())
                using (TempDirectory destination = new TempDirectory())
                {
                    string segment1 = Path.Join(source.Path, "segment1");
                    Directory.CreateDirectory(segment1);
                    string segment2 = Path.Join(segment1, "segment2");
                    Directory.CreateDirectory(segment2);
                    string textFile = Path.Join(segment2, "file.txt");
                    File.Create(textFile).Dispose();

                    string destinationArchiveFileName = Path.Join(destination.Path, "output.tar");

                    await TarFile.CreateFromDirectoryAsync(source.Path, destinationArchiveFileName, includeBaseDirectory);

                    FileStreamOptions readOptions = new()
                    {
                        Access  = FileAccess.Read,
                        Mode    = FileMode.Open,
                        Options = FileOptions.Asynchronous,
                    };

                    await using (FileStream fileStream = File.Open(destinationArchiveFileName, readOptions))
                    {
                        await using (TarReader reader = new TarReader(fileStream))
                        {
                            string prefix = includeBaseDirectory ? Path.GetFileName(source.Path) + '/' : string.Empty;

                            TarEntry entry = await reader.GetNextEntryAsync();

                            Assert.NotNull(entry);
                            Assert.Equal(TarEntryType.Directory, entry.EntryType);
                            Assert.Equal(prefix + "segment1/", entry.Name);

                            entry = await reader.GetNextEntryAsync();

                            Assert.NotNull(entry);
                            Assert.Equal(TarEntryType.Directory, entry.EntryType);
                            Assert.Equal(prefix + "segment1/segment2/", entry.Name);

                            entry = await reader.GetNextEntryAsync();

                            Assert.NotNull(entry);
                            Assert.Equal(TarEntryType.RegularFile, entry.EntryType);
                            Assert.Equal(prefix + "segment1/segment2/file.txt", entry.Name);

                            Assert.Null(await reader.GetNextEntryAsync());
                        }
                    }
                }
        }
Esempio n. 14
0
        public async Task DestinationExists_Throws_Async()
        {
            using (TempDirectory root = new TempDirectory())
            {
                string dirPath = Path.Join(root.Path, "dir");
                Directory.CreateDirectory(dirPath);

                string filePath = Path.Join(root.Path, "file.tar");
                File.Create(filePath).Dispose();

                await Assert.ThrowsAsync <IOException>(() => TarFile.CreateFromDirectoryAsync(sourceDirectoryName: dirPath, destinationFileName: filePath, includeBaseDirectory: false));
            }
        }