Skip to content

Commit a3bed39

Browse files
committed
Extra test for updating zips whose entries have descriptors with no signature bytes
1 parent 3b33af9 commit a3bed39

File tree

1 file changed

+59
-1
lines changed

1 file changed

+59
-1
lines changed

test/ICSharpCode.SharpZipLib.Tests/Zip/ZipFileHandling.cs

+59-1
Original file line numberDiff line numberDiff line change
@@ -1692,7 +1692,7 @@ public void TestDescriptorUpdateOnAdd([Values] UseZip64 useZip64, [Values] FileU
16921692
/// <param name="updateMode">Whether safe or direct updates should be used</param>
16931693
[Test]
16941694
[Category("Zip")]
1695-
public void TestDescriptorUpdateOnReplacee([Values] UseZip64 useZip64, [Values] FileUpdateMode updateMode)
1695+
public void TestDescriptorUpdateOnReplace([Values] UseZip64 useZip64, [Values] FileUpdateMode updateMode)
16961696
{
16971697
MemoryStream msw = new MemoryStreamWithoutSeek();
16981698
using (ZipOutputStream outStream = new ZipOutputStream(msw))
@@ -1742,5 +1742,63 @@ public void TestDescriptorUpdateOnReplacee([Values] UseZip64 useZip64, [Values]
17421742
}
17431743
}
17441744
}
1745+
1746+
// This is the initial zipfile generated by the 'TestDescriptorUpdateOnReplace' test, but with descriptor
1747+
// fields that don't have the signature bytes.
1748+
const string TestZipFileWithSignaturelessDescriptors = @"UEsDBBQACAAIAHO8E1EAAAAAAAAAAAAAAAANAAAA
1749+
U3RyaXBlZE1hcmxpbosEAN0GtcADAAAAAQAAAFBLAwQUAAgACABzvBNRAAAAAAAAAAAAAAAACwAAAFdoaXRlTWFybGlui
1750+
wYA8We7LgMAAAABAAAAUEsDBBQACAAIAHO8E1EAAAAAAAAAAAAAAAAIAAAAU2FpbGZpc2hjBgA3vgtLAwAAAAEAAABQSw
1751+
ECMwAUAAgACABzvBNR3Qa1wAMAAAABAAAADQAAAAAAAAAAAAAAAAAAAAAAU3RyaXBlZE1hcmxpblBLAQIzABQACAAIAHO
1752+
8E1HxZ7suAwAAAAEAAAALAAAAAAAAAAAAAAAAADoAAABXaGl0ZU1hcmxpblBLAQIzABQACAAIAHO8E1E3vgtLAwAAAAEA
1753+
AAAIAAAAAAAAAAAAAAAAAHIAAABTYWlsZmlzaFBLBQYAAAAAAwADAKoAAACnAAAAAAA=";
1754+
1755+
/// <summary>
1756+
/// Test for https://github.com/icsharpcode/SharpZipLib/issues/147, when replacing items in a zip, using a file whose descriptors
1757+
/// don't have signature bytes
1758+
/// </summary>
1759+
/// <param name="useZip64">Whether Zip64 should be used in the test archive</param>
1760+
/// <param name="updateMode">Whether safe or direct updates should be used</param>
1761+
[Test]
1762+
[Category("Zip")]
1763+
public void TestSignaturelessDescriptorUpdateOnReplace([Values] UseZip64 useZip64, [Values] FileUpdateMode updateMode)
1764+
{
1765+
var fileBytes = Convert.FromBase64String(TestZipFileWithSignaturelessDescriptors);
1766+
1767+
using (var memoryStream = new MemoryStream())
1768+
{
1769+
memoryStream.Write(fileBytes, 0, fileBytes.Length);
1770+
memoryStream.Position = 0;
1771+
1772+
using (var zipFile = new ZipFile(memoryStream, leaveOpen: true))
1773+
{
1774+
zipFile.BeginUpdate(new MemoryArchiveStorage(updateMode));
1775+
zipFile.Delete("WhiteMarlin");
1776+
zipFile.Add(new StringMemoryDataSource("Kajikia albida"), "WhiteMarlin");
1777+
zipFile.CommitUpdate();
1778+
1779+
// @@NOTE@@ TestArchive fails if an entry has a descriptor with no signature.
1780+
// Assert.That(zipFile.TestArchive(true), Is.True);
1781+
Assert.That(zipFile.Count, Is.EqualTo(3));
1782+
1783+
// Test for expected descriptor states:
1784+
// 'StripedMarlin' should still have a descriptor in Direct update mode as the entry data will be kept, but won't have one
1785+
// in Safe update mode as that recreates the whole archive.
1786+
// 'WhiteMarlin' should no longer have one because the entry is new and didn't need one
1787+
// 'Sailfish' should have its descriptor removed.
1788+
var entry = zipFile.GetEntry("StripedMarlin");
1789+
1790+
if (updateMode == FileUpdateMode.Direct)
1791+
Assert.True(((GeneralBitFlags)entry.Flags).HasFlag(GeneralBitFlags.Descriptor));
1792+
else
1793+
Assert.False(((GeneralBitFlags)entry.Flags).HasFlag(GeneralBitFlags.Descriptor));
1794+
1795+
entry = zipFile.GetEntry("WhiteMarlin");
1796+
Assert.False(((GeneralBitFlags)entry.Flags).HasFlag(GeneralBitFlags.Descriptor));
1797+
1798+
entry = zipFile.GetEntry("Sailfish");
1799+
Assert.False(((GeneralBitFlags)entry.Flags).HasFlag(GeneralBitFlags.Descriptor));
1800+
}
1801+
}
1802+
}
17451803
}
17461804
}

0 commit comments

Comments
 (0)