Skip to content
Prev Previous commit
Next Next commit
Add tests for unseekable streams
  • Loading branch information
jozkee authored and github-actions committed Sep 28, 2022
commit 14571b03af2c71fcf42d46fdd596eb12c4696cf5
Original file line number Diff line number Diff line change
Expand Up @@ -12,42 +12,47 @@ public class TarWriter_WriteEntry_Roundtrip_Tests : TarTestsBase
{
public static IEnumerable<object[]> NameRoundtripsTheoryData()
{
foreach (TarEntryType entryType in new[] { TarEntryType.RegularFile, TarEntryType.Directory })
foreach (bool unseekableStream in new[] { false, true })
{
foreach (string name in GetNamesNonAsciiTestData(NameCapabilities.Name).Concat(GetNamesPrefixedTestData(NameCapabilities.Name)))
foreach (TarEntryType entryType in new[] { TarEntryType.RegularFile, TarEntryType.Directory })
{
TarEntryType v7EntryType = entryType is TarEntryType.RegularFile ? TarEntryType.V7RegularFile : entryType;
yield return new object[] { TarEntryFormat.V7, v7EntryType, name };
}

foreach (string name in GetNamesNonAsciiTestData(NameCapabilities.NameAndPrefix).Concat(GetNamesPrefixedTestData(NameCapabilities.NameAndPrefix)))
{
yield return new object[] { TarEntryFormat.Ustar, entryType, name };
}

foreach (string name in GetNamesNonAsciiTestData(NameCapabilities.Unlimited).Concat(GetNamesPrefixedTestData(NameCapabilities.Unlimited)))
{
yield return new object[] { TarEntryFormat.Pax, entryType, name };
yield return new object[] { TarEntryFormat.Gnu, entryType, name };
foreach (string name in GetNamesNonAsciiTestData(NameCapabilities.Name).Concat(GetNamesPrefixedTestData(NameCapabilities.Name)))
{
TarEntryType v7EntryType = entryType is TarEntryType.RegularFile ? TarEntryType.V7RegularFile : entryType;
yield return new object[] { TarEntryFormat.V7, v7EntryType, unseekableStream, name };
}

foreach (string name in GetNamesNonAsciiTestData(NameCapabilities.NameAndPrefix).Concat(GetNamesPrefixedTestData(NameCapabilities.NameAndPrefix)))
{
yield return new object[] { TarEntryFormat.Ustar, entryType, unseekableStream, name };
}

foreach (string name in GetNamesNonAsciiTestData(NameCapabilities.Unlimited).Concat(GetNamesPrefixedTestData(NameCapabilities.Unlimited)))
{
yield return new object[] { TarEntryFormat.Pax, entryType, unseekableStream, name };
yield return new object[] { TarEntryFormat.Gnu, entryType, unseekableStream, name };
}
}
}
}

[Theory]
[MemberData(nameof(NameRoundtripsTheoryData))]
public void NameRoundtrips(TarEntryFormat entryFormat, TarEntryType entryType, string name)
public void NameRoundtrips(TarEntryFormat entryFormat, TarEntryType entryType, bool unseekableStream, string name)
{
TarEntry entry = InvokeTarEntryCreationConstructor(entryFormat, entryType, name);
entry.Name = name;

MemoryStream ms = new();
using (TarWriter writer = new(ms, leaveOpen: true))
Stream s = unseekableStream ? new WrappedStream(ms, ms.CanRead, ms.CanWrite, canSeek: false) : ms;

using (TarWriter writer = new(s, leaveOpen: true))
{
writer.WriteEntry(entry);
}

ms.Position = 0;
using TarReader reader = new(ms);
using TarReader reader = new(s);

entry = reader.GetNextEntry();
Assert.Null(reader.GetNextEntry());
Expand All @@ -56,38 +61,43 @@ public void NameRoundtrips(TarEntryFormat entryFormat, TarEntryType entryType, s

public static IEnumerable<object[]> LinkNameRoundtripsTheoryData()
{
foreach (TarEntryType entryType in new[] { TarEntryType.SymbolicLink, TarEntryType.HardLink })
foreach (bool unseekableStream in new[] { false, true })
{
foreach (string name in GetNamesNonAsciiTestData(NameCapabilities.Name).Concat(GetNamesPrefixedTestData(NameCapabilities.Name)))
foreach (TarEntryType entryType in new[] { TarEntryType.SymbolicLink, TarEntryType.HardLink })
{
yield return new object[] { TarEntryFormat.V7, entryType, name };
yield return new object[] { TarEntryFormat.Ustar, entryType, name };
}

foreach (string name in GetNamesNonAsciiTestData(NameCapabilities.Unlimited).Concat(GetNamesPrefixedTestData(NameCapabilities.Unlimited)))
{
yield return new object[] { TarEntryFormat.Pax, entryType, name };
yield return new object[] { TarEntryFormat.Gnu, entryType, name };
foreach (string name in GetNamesNonAsciiTestData(NameCapabilities.Name).Concat(GetNamesPrefixedTestData(NameCapabilities.Name)))
{
yield return new object[] { TarEntryFormat.V7, entryType, unseekableStream, name };
yield return new object[] { TarEntryFormat.Ustar, entryType, unseekableStream, name };
}

foreach (string name in GetNamesNonAsciiTestData(NameCapabilities.Unlimited).Concat(GetNamesPrefixedTestData(NameCapabilities.Unlimited)))
{
yield return new object[] { TarEntryFormat.Pax, entryType, unseekableStream, name };
yield return new object[] { TarEntryFormat.Gnu, entryType, unseekableStream, name };
}
}
}
}

[Theory]
[MemberData(nameof(LinkNameRoundtripsTheoryData))]
public void LinkNameRoundtrips(TarEntryFormat entryFormat, TarEntryType entryType, string linkName)
public void LinkNameRoundtrips(TarEntryFormat entryFormat, TarEntryType entryType, bool unseekableStream, string linkName)
{
string name = "foo";
TarEntry entry = InvokeTarEntryCreationConstructor(entryFormat, entryType, name);
entry.LinkName = linkName;

MemoryStream ms = new();
using (TarWriter writer = new(ms, leaveOpen: true))
Stream s = unseekableStream ? new WrappedStream(ms, ms.CanRead, ms.CanWrite, canSeek: false) : ms;

using (TarWriter writer = new(s, leaveOpen: true))
{
writer.WriteEntry(entry);
}

ms.Position = 0;
using TarReader reader = new(ms);
using TarReader reader = new(s);

entry = reader.GetNextEntry();
Assert.Null(reader.GetNextEntry());
Expand All @@ -97,17 +107,20 @@ public void LinkNameRoundtrips(TarEntryFormat entryFormat, TarEntryType entryTyp

public static IEnumerable<object[]> UserNameGroupNameRoundtripsTheoryData()
{
foreach (TarEntryFormat entryFormat in new[] { TarEntryFormat.Ustar, TarEntryFormat.Pax, TarEntryFormat.Gnu })
foreach (bool unseekableStream in new[] { false, true })
{
yield return new object[] { entryFormat, Repeat(OneByteCharacter, 32) };
yield return new object[] { entryFormat, Repeat(TwoBytesCharacter, 32 / 2) };
yield return new object[] { entryFormat, Repeat(FourBytesCharacter, 32 / 4) };
foreach (TarEntryFormat entryFormat in new[] { TarEntryFormat.Ustar, TarEntryFormat.Pax, TarEntryFormat.Gnu })
{
yield return new object[] { entryFormat, unseekableStream, Repeat(OneByteCharacter, 32) };
yield return new object[] { entryFormat, unseekableStream, Repeat(TwoBytesCharacter, 32 / 2) };
yield return new object[] { entryFormat, unseekableStream, Repeat(FourBytesCharacter, 32 / 4) };
}
}
}

[Theory]
[MemberData(nameof(UserNameGroupNameRoundtripsTheoryData))]
public void UserNameGroupNameRoundtrips(TarEntryFormat entryFormat, string userGroupName)
public void UserNameGroupNameRoundtrips(TarEntryFormat entryFormat, bool unseekableStream, string userGroupName)
{
string name = "foo";
TarEntry entry = InvokeTarEntryCreationConstructor(entryFormat, TarEntryType.RegularFile, name);
Expand All @@ -116,13 +129,15 @@ public void UserNameGroupNameRoundtrips(TarEntryFormat entryFormat, string userG
posixEntry.GroupName = userGroupName;

MemoryStream ms = new();
using (TarWriter writer = new(ms, leaveOpen: true))
Stream s = unseekableStream ? new WrappedStream(ms, ms.CanRead, ms.CanWrite, canSeek: false) : ms;

using (TarWriter writer = new(s, leaveOpen: true))
{
writer.WriteEntry(posixEntry);
}

ms.Position = 0;
using TarReader reader = new(ms);
using TarReader reader = new(s);

entry = reader.GetNextEntry();
posixEntry = Assert.IsAssignableFrom<PosixTarEntry>(entry);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,21 @@ public static IEnumerable<object[]> NameRoundtripsAsyncTheoryData()

[Theory]
[MemberData(nameof(NameRoundtripsAsyncTheoryData))]
public async Task NameRoundtripsAsync(TarEntryFormat entryFormat, TarEntryType entryType, string name)
public async Task NameRoundtripsAsync(TarEntryFormat entryFormat, TarEntryType entryType, bool unseekableStream, string name)
{
TarEntry entry = InvokeTarEntryCreationConstructor(entryFormat, entryType, name);
entry.Name = name;

MemoryStream ms = new();
using (TarWriter writer = new(ms, leaveOpen: true))
Stream s = unseekableStream ? new WrappedStream(ms, ms.CanRead, ms.CanWrite, canSeek: false) : ms;

using (TarWriter writer = new(s, leaveOpen: true))
{
await writer.WriteEntryAsync(entry);
}

ms.Position = 0;
using TarReader reader = new(ms);
using TarReader reader = new(s);

entry = await reader.GetNextEntryAsync();
Assert.Null(await reader.GetNextEntryAsync());
Expand All @@ -39,20 +41,22 @@ public static IEnumerable<object[]> LinkNameRoundtripsAsyncTheoryData()

[Theory]
[MemberData(nameof(LinkNameRoundtripsAsyncTheoryData))]
public async Task LinkNameRoundtrips(TarEntryFormat entryFormat, TarEntryType entryType, string linkName)
public async Task LinkNameRoundtrips(TarEntryFormat entryFormat, TarEntryType entryType, bool unseekableStream, string linkName)
{
string name = "foo";
TarEntry entry = InvokeTarEntryCreationConstructor(entryFormat, entryType, name);
entry.LinkName = linkName;

MemoryStream ms = new();
using (TarWriter writer = new(ms, leaveOpen: true))
Stream s = unseekableStream ? new WrappedStream(ms, ms.CanRead, ms.CanWrite, canSeek: false) : ms;

using (TarWriter writer = new(s, leaveOpen: true))
{
await writer.WriteEntryAsync(entry);
}

ms.Position = 0;
using TarReader reader = new(ms);
using TarReader reader = new(s);

entry = await reader.GetNextEntryAsync();
Assert.Null(await reader.GetNextEntryAsync());
Expand All @@ -65,7 +69,7 @@ public static IEnumerable<object[]> UserNameGroupNameRoundtripsAsyncTheoryData()

[Theory]
[MemberData(nameof(UserNameGroupNameRoundtripsAsyncTheoryData))]
public async Task UserNameGroupNameRoundtrips(TarEntryFormat entryFormat, string userGroupName)
public async Task UserNameGroupNameRoundtrips(TarEntryFormat entryFormat, bool unseekableStream, string userGroupName)
{
string name = "foo";
TarEntry entry = InvokeTarEntryCreationConstructor(entryFormat, TarEntryType.RegularFile, name);
Expand All @@ -74,13 +78,15 @@ public async Task UserNameGroupNameRoundtrips(TarEntryFormat entryFormat, string
posixEntry.GroupName = userGroupName;

MemoryStream ms = new();
using (TarWriter writer = new(ms, leaveOpen: true))
Stream s = unseekableStream ? new WrappedStream(ms, ms.CanRead, ms.CanWrite, canSeek: false) : ms;

using (TarWriter writer = new(s, leaveOpen: true))
{
await writer.WriteEntryAsync(posixEntry);
}

ms.Position = 0;
using TarReader reader = new(ms);
using TarReader reader = new(s);

entry = await reader.GetNextEntryAsync();
posixEntry = Assert.IsAssignableFrom<PosixTarEntry>(entry);
Expand Down