mirror of
https://github.com/adamhathcock/sharpcompress.git
synced 2026-09-22 23:15:20 +00:00
more tar async fixes
This commit is contained in:
@@ -31,6 +31,30 @@ public static class EnumerableExtensions
|
||||
|
||||
public static class AsyncEnumerableExtensions
|
||||
{
|
||||
public static async IAsyncEnumerable<TResult> Select<T, TResult>(
|
||||
this IAsyncEnumerable<T> source,
|
||||
Func<T, TResult> selector)
|
||||
{
|
||||
await foreach (var element in source)
|
||||
{
|
||||
yield return selector(element);
|
||||
}
|
||||
}
|
||||
public static async ValueTask<int> CountAsync<T>(
|
||||
this IAsyncEnumerable<T> source,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
await using var e = source.GetAsyncEnumerator(cancellationToken);
|
||||
|
||||
var count = 0;
|
||||
while (await e.MoveNextAsync())
|
||||
{
|
||||
checked { count++; }
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
public static async IAsyncEnumerable<T> TakeAsync<T>(
|
||||
this IAsyncEnumerable<T> source,
|
||||
int count)
|
||||
|
||||
@@ -643,7 +643,7 @@ public class ArchiveTests : ReaderTests
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ArchiveFactory_Open_WithPreWrappedStream()
|
||||
public async Task ArchiveFactory_Open_WithPreWrappedStream()
|
||||
{
|
||||
// Test that ArchiveFactory.Open works correctly with a stream that's already wrapped
|
||||
// This addresses the issue where ZIP files fail to open on Linux
|
||||
@@ -652,25 +652,25 @@ public class ArchiveTests : ReaderTests
|
||||
// Open with a pre-wrapped stream
|
||||
using (var fileStream = File.OpenRead(testArchive))
|
||||
using (var wrappedStream = SharpCompressStream.Create(fileStream, bufferSize: 32768))
|
||||
using (var archive = ArchiveFactory.Open(wrappedStream))
|
||||
await using (var archive = await ArchiveFactory.OpenAsync(new AsyncOnlyStream(wrappedStream)))
|
||||
{
|
||||
Assert.Equal(ArchiveType.Zip, archive.Type);
|
||||
Assert.Equal(3, archive.Entries.Count());
|
||||
Assert.Equal(3, await archive.EntriesAsync.CountAsync());
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ArchiveFactory_Open_WithRawFileStream()
|
||||
public async Task ArchiveFactory_Open_WithRawFileStream()
|
||||
{
|
||||
// Test that ArchiveFactory.Open works correctly with a raw FileStream
|
||||
// This is the common use case reported in the issue
|
||||
var testArchive = Path.Combine(TEST_ARCHIVES_PATH, "Zip.bzip2.noEmptyDirs.zip");
|
||||
|
||||
using (var stream = File.OpenRead(testArchive))
|
||||
using (var archive = ArchiveFactory.Open(stream))
|
||||
await using (var archive = await ArchiveFactory.OpenAsync(new AsyncOnlyStream(stream)))
|
||||
{
|
||||
Assert.Equal(ArchiveType.Zip, archive.Type);
|
||||
Assert.Equal(3, archive.Entries.Count());
|
||||
Assert.Equal(3, await archive.EntriesAsync.CountAsync());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ using SharpCompress.Archives.Tar;
|
||||
using SharpCompress.Common;
|
||||
using SharpCompress.Readers;
|
||||
using SharpCompress.Readers.Tar;
|
||||
using SharpCompress.Test.Mocks;
|
||||
using SharpCompress.Writers;
|
||||
using SharpCompress.Writers.Tar;
|
||||
using Xunit;
|
||||
@@ -45,12 +46,12 @@ public class TarArchiveAsyncTests : ArchiveTests
|
||||
|
||||
// Step 2: check if the written tar file can be read correctly
|
||||
var unmodified = Path.Combine(SCRATCH2_FILES_PATH, archive);
|
||||
using (var archive2 = TarArchive.Open(unmodified))
|
||||
await using (var archive2 = TarArchive.OpenAsync(new AsyncOnlyStream(File.OpenRead(unmodified))))
|
||||
{
|
||||
Assert.Equal(1, archive2.Entries.Count());
|
||||
Assert.Contains(filename, archive2.Entries.Select(entry => entry.Key));
|
||||
Assert.Equal(1, await archive2.EntriesAsync.CountAsync());
|
||||
Assert.Contains(filename, await archive2.EntriesAsync.Select(entry => entry.Key).ToListAsync());
|
||||
|
||||
foreach (var entry in archive2.Entries)
|
||||
await foreach (var entry in archive2.EntriesAsync)
|
||||
{
|
||||
Assert.Equal(
|
||||
"dummy filecontent",
|
||||
@@ -89,12 +90,12 @@ public class TarArchiveAsyncTests : ArchiveTests
|
||||
|
||||
// Step 2: check if the written tar file can be read correctly
|
||||
var unmodified = Path.Combine(SCRATCH2_FILES_PATH, archive);
|
||||
using (var archive2 = TarArchive.Open(unmodified))
|
||||
await using (var archive2 = TarArchive.OpenAsync(new AsyncOnlyStream(File.OpenRead(unmodified))))
|
||||
{
|
||||
Assert.Equal(1, archive2.Entries.Count());
|
||||
Assert.Contains(longFilename, archive2.Entries.Select(entry => entry.Key));
|
||||
Assert.Equal(1, await archive2.EntriesAsync.CountAsync());
|
||||
Assert.Contains(longFilename, await archive2.EntriesAsync.Select(entry => entry.Key).ToListAsync());
|
||||
|
||||
foreach (var entry in archive2.Entries)
|
||||
await foreach (var entry in archive2.EntriesAsync)
|
||||
{
|
||||
Assert.Equal(
|
||||
"dummy filecontent",
|
||||
@@ -172,9 +173,9 @@ public class TarArchiveAsyncTests : ArchiveTests
|
||||
using (var inputMemory = new MemoryStream(mstm.ToArray()))
|
||||
{
|
||||
var tropt = new ReaderOptions { ArchiveEncoding = enc };
|
||||
using (var tr = TarReader.Open(inputMemory, tropt))
|
||||
await using (var tr = ReaderFactory.OpenAsync(inputMemory, tropt))
|
||||
{
|
||||
while (tr.MoveToNextEntry())
|
||||
while (await tr.MoveToNextEntryAsync())
|
||||
{
|
||||
Assert.Equal(fname, tr.Entry.Key);
|
||||
}
|
||||
@@ -205,9 +206,9 @@ public class TarArchiveAsyncTests : ArchiveTests
|
||||
|
||||
var numberOfEntries = 0;
|
||||
|
||||
using (var archiveFactory = TarArchive.Open(memoryStream))
|
||||
await using (var archiveFactory = TarArchive.OpenAsync(new AsyncOnlyStream(memoryStream)))
|
||||
{
|
||||
foreach (var entry in archiveFactory.Entries)
|
||||
await foreach (var entry in archiveFactory.EntriesAsync)
|
||||
{
|
||||
++numberOfEntries;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user