コード例 #1
0
        public void StreamClosedWhenOwner()
        {
            var ms = new MemoryStream();

            MakeZipFile(ms, false, "StreamClosedWhenOwner", 1, 10, "test");
            ms.Seek(0, SeekOrigin.Begin);
            var zipData = ms.ToArray();

            // Stream should be closed when leaveOpen is unspecified
            {
                var inMemoryZip = new TrackedMemoryStream(zipData);
                Assert.IsFalse(inMemoryZip.IsClosed, "Input stream should NOT be closed");

                using (var zipFile = new ZipFile(inMemoryZip))
                {
                    Assert.IsTrue(zipFile.IsStreamOwner, "Should be stream owner by default");
                }

                Assert.IsTrue(inMemoryZip.IsClosed, "Input stream should be closed by default");
            }

            // Stream should be closed when leaveOpen is false
            {
                var inMemoryZip = new TrackedMemoryStream(zipData);
                Assert.IsFalse(inMemoryZip.IsClosed, "Input stream should NOT be closed");

                using (var zipFile = new ZipFile(inMemoryZip, false))
                {
                    Assert.IsTrue(zipFile.IsStreamOwner, "Should be stream owner when leaveOpen is false");
                }

                Assert.IsTrue(inMemoryZip.IsClosed, "Input stream should be closed when leaveOpen is false");
            }
        }
コード例 #2
0
        public void BaseClosedAfterFailure()
        {
            var ms = new TrackedMemoryStream(new byte[32]);

            Assert.IsFalse(ms.IsClosed, "Underlying stream should NOT be closed initially");
            bool blewUp = false;

            try
            {
                using (ZipOutputStream stream = new ZipOutputStream(ms))
                {
                    Assert.IsTrue(stream.IsStreamOwner, "Should be stream owner by default");
                    try
                    {
                        stream.PutNextEntry(new ZipEntry("Tiny"));
                        stream.Write(new byte[32], 0, 32);
                    }
                    finally
                    {
                        Assert.IsFalse(ms.IsClosed, "Stream should still not be closed.");
                        stream.Close();
                        Assert.Fail("Exception not thrown");
                    }
                }
            }
            catch
            {
                blewUp = true;
            }

            Assert.IsTrue(blewUp, "Should have failed to write to stream");
            Assert.IsTrue(ms.IsClosed, "Underlying stream should be closed");
        }
コード例 #3
0
ファイル: GZipTests.cs プロジェクト: sillsdev/WorldPad
        public void OutputStreamOwnership()
        {
            TrackedMemoryStream memStream = new TrackedMemoryStream();
            GZipOutputStream    s         = new GZipOutputStream(memStream);

            Assert.IsFalse(memStream.IsClosed, "Shouldnt be closed initially");
            Assert.IsFalse(memStream.IsDisposed, "Shouldnt be disposed initially");

            s.Close();

            Assert.IsTrue(memStream.IsClosed, "Should be closed after parent owner close");
            Assert.IsTrue(memStream.IsDisposed, "Should be disposed after parent owner close");

            memStream = new TrackedMemoryStream();
            s         = new GZipOutputStream(memStream);

            Assert.IsFalse(memStream.IsClosed, "Shouldnt be closed initially");
            Assert.IsFalse(memStream.IsDisposed, "Shouldnt be disposed initially");

            s.IsStreamOwner = false;
            s.Close();

            Assert.IsFalse(memStream.IsClosed, "Should not be closed after parent owner close");
            Assert.IsFalse(memStream.IsDisposed, "Should not be disposed after parent owner close");
        }
コード例 #4
0
        public void StreamClosedOnError()
        {
            // test paths
            string tempFilePath = GetTempFilePath();

            Assert.IsNotNull(tempFilePath, "No permission to execute this test?");

            var tempFolderPath = Path.Combine(tempFilePath, Path.GetRandomFileName());

            Assert.That(Directory.Exists(tempFolderPath), Is.False, "Temp folder path should not exist");

            // memory that isn't a valid zip
            var ms = new TrackedMemoryStream(new byte[32]);

            Assert.IsFalse(ms.IsClosed, "Underlying stream should NOT be closed initially");

            // Try to extract
            var fastZip = new FastZip();

            fastZip.CreateEmptyDirectories = true;

            Assert.Throws <ZipException>(() => fastZip.ExtractZip(ms, tempFolderPath, FastZip.Overwrite.Always, null, "a", "b", false, true), "Should throw when extracting an invalid file");
            Assert.IsTrue(ms.IsClosed, "inputStream stream should be closed when isStreamOwner is true");

            // test folder should not have been created on error
            Assert.That(Directory.Exists(tempFolderPath), Is.False, "Temp folder path should still not exist");
        }
コード例 #5
0
        public void CreateZipShouldLeaveOutputStreamOpenIfRequested(bool leaveOpen)
        {
            const string tempFileName = "a(2).dat";

            using (var tempFolder = new Utils.TempDir())
            {
                // Create test input file
                string addFile = Path.Combine(tempFolder.Fullpath, tempFileName);
                MakeTempFile(addFile, 16);

                // Create the zip with fast zip
                var target  = new TrackedMemoryStream();
                var fastZip = new FastZip();

                fastZip.CreateZip(target, tempFolder.Fullpath, false, @"a\(2\)\.dat", null, leaveOpen: leaveOpen);

                // Check that the output stream was disposed (or not) as expected
                Assert.That(target.IsDisposed, Is.Not.EqualTo(leaveOpen), "IsDisposed should be the opposite of leaveOpen");

                // Check that the file contents are correct in both cases
                var archive = new MemoryStream(target.ToArray());
                using (ZipFile zf = new ZipFile(archive))
                {
                    Assert.AreEqual(1, zf.Count);
                    ZipEntry entry = zf[0];
                    Assert.AreEqual(tempFileName, entry.Name);
                    Assert.AreEqual(16, entry.Size);
                    Assert.IsTrue(zf.TestArchive(true));
                }
            }
        }
コード例 #6
0
        public void DoubleClose()
        {
            var memStream = new TrackedMemoryStream();
            var s         = new GZipOutputStream(memStream);

            s.Finish();
#if NET451
            s.Close();
#elif NETCOREAPP1_0
            s.Dispose();
#endif
#if NET451
            s.Close();
#elif NETCOREAPP1_0
            s.Dispose();
#endif

            memStream = new TrackedMemoryStream();
            using (GZipOutputStream no2 = new GZipOutputStream(memStream)) {
#if NET451
                s.Close();
#elif NETCOREAPP1_0
                s.Dispose();
#endif
            }
        }
コード例 #7
0
        private byte[] MakeLocalHeader(string asciiName, short versionToExtract, short flags, short method,
                                       int dostime, int crc, int compressedSize, int size)
        {
            using (TrackedMemoryStream ms = new TrackedMemoryStream())
            {
                ms.WriteByte((byte)'P');
                ms.WriteByte((byte)'K');
                ms.WriteByte(3);
                ms.WriteByte(4);

                ms.WriteLEShort(versionToExtract);
                ms.WriteLEShort(flags);
                ms.WriteLEShort(method);
                ms.WriteLEInt(dostime);
                ms.WriteLEInt(crc);
                ms.WriteLEInt(compressedSize);
                ms.WriteLEInt(size);

                byte[] rawName = Encoding.ASCII.GetBytes(asciiName);
                ms.WriteLEShort((short)rawName.Length);
                ms.WriteLEShort(0);
                ms.Write(rawName, 0, rawName.Length);
                return(ms.ToArray());
            }
        }
コード例 #8
0
        public void InflatorStreamOwnership()
        {
            var memStream = new TrackedMemoryStream();
            var s         = new InflaterInputStream(memStream);

            Assert.IsFalse(memStream.IsClosed, "Shouldnt be closed initially");
            Assert.IsFalse(memStream.IsDisposed, "Shouldnt be disposed initially");

#if NET451
            s.Close();
#elif NETCOREAPP1_0
            s.Dispose();
#endif

            Assert.IsTrue(memStream.IsClosed, "Should be closed after parent owner close");
            Assert.IsTrue(memStream.IsDisposed, "Should be disposed after parent owner close");

            memStream = new TrackedMemoryStream();
            s         = new InflaterInputStream(memStream);

            Assert.IsFalse(memStream.IsClosed, "Shouldnt be closed initially");
            Assert.IsFalse(memStream.IsDisposed, "Shouldnt be disposed initially");

            s.IsStreamOwner = false;
#if NET451
            s.Close();
#elif NETCOREAPP1_0
            s.Dispose();
#endif

            Assert.IsFalse(memStream.IsClosed, "Should not be closed after parent owner close");
            Assert.IsFalse(memStream.IsDisposed, "Should not be disposed after parent owner close");
        }
コード例 #9
0
        public void CreateZipShouldLeaveOutputStreamOpenIfRequested(bool leaveOpen)
        {
            const string tempFileName = "a(2).dat";

            using var tempFolder = Utils.GetTempDir();
            // Create test input file
            tempFolder.CreateDummyFile(tempFileName, size: 16);

            // Create the zip with fast zip
            var target  = new TrackedMemoryStream();
            var fastZip = new FastZip();

            fastZip.CreateZip(target, tempFolder, recurse: false, @"a\(2\)\.dat", directoryFilter: null, leaveOpen);

            // Check that the output stream was disposed (or not) as expected
            Assert.That(target.IsDisposed, Is.Not.EqualTo(leaveOpen), "IsDisposed should be the opposite of leaveOpen");

            // Check that the file contents are correct in both cases
            var archive = new MemoryStream(target.ToArray());

            using var zf = new ZipFile(archive);
            Assert.AreEqual(expected: 1, zf.Count);
            var entry = zf[0];

            Assert.AreEqual(tempFileName, entry.Name);
            Assert.AreEqual(expected: 16, entry.Size);
            Assert.IsTrue(zf.TestArchive(testData: true));
        }
コード例 #10
0
 /// <summary>
 ///   Builds a pooled memory stream.
 /// </summary>
 /// <param name="capacity">The capacity of the backing stream.</param>
 public PooledMemoryStream(int capacity)
 {
     _trackedMemoryStream = new TrackedMemoryStream(capacity)
     {
         Parent = this
     };
 }
コード例 #11
0
ファイル: TarTests.cs プロジェクト: zzxxhhzxh/SharpZipLib
        public void InputStreamOwnership()
        {
            var memStream = new TrackedMemoryStream();
            var s         = new TarInputStream(memStream, null);

            Assert.IsFalse(memStream.IsClosed, "Shouldnt be closed initially");
            Assert.IsFalse(memStream.IsDisposed, "Shouldnt be disposed initially");

            s.Close();

            Assert.IsTrue(memStream.IsClosed, "Should be closed after parent owner close");
            Assert.IsTrue(memStream.IsDisposed, "Should be disposed after parent owner close");

            memStream = new TrackedMemoryStream();
            s         = new TarInputStream(memStream, null);

            Assert.IsFalse(memStream.IsClosed, "Shouldnt be closed initially");
            Assert.IsFalse(memStream.IsDisposed, "Shouldnt be disposed initially");

            s.IsStreamOwner = false;
            s.Close();

            Assert.IsFalse(memStream.IsClosed, "Should not be closed after parent owner close");
            Assert.IsFalse(memStream.IsDisposed, "Should not be disposed after parent owner close");
        }
コード例 #12
0
        public void StreamNotClosedWhenNotOwner()
        {
            var ms = new TrackedMemoryStream();

            MakeZipFile(ms, false, "StreamNotClosedWhenNotOwner", 1, 10, "test");
            ms.Seek(0, SeekOrigin.Begin);

            Assert.IsFalse(ms.IsClosed, "Input stream should NOT be closed");

            // Stream should not be closed when leaveOpen is true
            {
                using (var zipFile = new ZipFile(ms, true))
                {
                    Assert.IsFalse(zipFile.IsStreamOwner, "Should NOT be stream owner when leaveOpen is true");
                }

                Assert.IsFalse(ms.IsClosed, "Input stream should NOT be closed when leaveOpen is true");
            }

            ms.Seek(0, SeekOrigin.Begin);

            // Stream should not be closed when IsStreamOwner is set to false after opening
            {
                using (var zipFile = new ZipFile(ms, false))
                {
                    Assert.IsTrue(zipFile.IsStreamOwner, "Should be stream owner when leaveOpen is false");
                    zipFile.IsStreamOwner = false;
                    Assert.IsFalse(zipFile.IsStreamOwner, "Should be able to set IsStreamOwner to false");
                }

                Assert.IsFalse(ms.IsClosed, "Input stream should NOT be closed when IsStreamOwner is false");
            }
        }
コード例 #13
0
        /// <summary>
        ///   Builds a pooled memory stream.
        /// </summary>
        /// <param name="capacity">The capacity of the backing stream.</param>
        public PooledMemoryStream(int capacity)
        {
            _trackedMemoryStream = new TrackedMemoryStream(capacity)
            {
                Parent = this
            };

            OnValidateObject += (ctx) =>
            {
                if (ctx.Direction == PooledObjectDirection.Outbound)
                {
                    // We validate only inbound objects, because when they are in the pool they
                    // cannot change their state.
                    return(true);
                }

                if (!_trackedMemoryStream.CanRead || !_trackedMemoryStream.CanWrite || !_trackedMemoryStream.CanSeek)
                {
                    if (Log.IsWarnEnabled())
                    {
                        Log.Warn("[ObjectPool] Memory stream has already been disposed");
                    }
                    return(false);
                }

                var memoryStreamPool = PooledObjectInfo.Handle as IMemoryStreamPool;
                if (_trackedMemoryStream.Capacity < memoryStreamPool.MinimumMemoryStreamCapacity)
                {
                    if (Log.IsWarnEnabled())
                    {
                        Log.Warn($"[ObjectPool] Memory stream capacity is {_trackedMemoryStream.Capacity}, while minimum required capacity is {memoryStreamPool.MinimumMemoryStreamCapacity}");
                    }
                    return(false);
                }
                if (_trackedMemoryStream.Capacity > memoryStreamPool.MaximumMemoryStreamCapacity)
                {
                    if (Log.IsWarnEnabled())
                    {
                        Log.Warn($"[ObjectPool] Memory stream capacity is {_trackedMemoryStream.Capacity}, while maximum allowed capacity is {memoryStreamPool.MaximumMemoryStreamCapacity}");
                    }
                    return(false);
                }

                return(true); // Object is valid.
            };

            OnResetState += () =>
            {
                _trackedMemoryStream.Position = 0L;
                _trackedMemoryStream.SetLength(0L);
            };

            OnReleaseResources += () =>
            {
                _trackedMemoryStream.Parent = null;
                _trackedMemoryStream.Dispose();
            };
        }
コード例 #14
0
        public void WriteAfterClose()
        {
            var memStream = new TrackedMemoryStream();
            var s         = new GZipOutputStream(memStream);

            s.Close();

            Assert.Throws <InvalidOperationException>(() => s.WriteByte(value: 7), "Write should fail");
        }
コード例 #15
0
        public void DoubleFooter()
        {
            var memStream = new TrackedMemoryStream();
            var s         = new GZipOutputStream(memStream);

            s.Finish();
            Int64 length = memStream.Length;

            s.Close();
            Assert.AreEqual(length, memStream.ToArray().Length);
        }
コード例 #16
0
ファイル: StreamHandling.cs プロジェクト: zgc0911/SharpZipLib
        public void BaseNotClosedWhenNotOwner()
        {
            var ms = new TrackedMemoryStream();

            Assert.IsFalse(ms.IsClosed, "Underlying stream should NOT be closed");

            using (ZipOutputStream stream = new ZipOutputStream(ms)) {
                Assert.IsTrue(stream.IsStreamOwner, "Should be stream owner by default");
                stream.IsStreamOwner = false;
            }
            Assert.IsFalse(ms.IsClosed, "Underlying stream should still NOT be closed");
        }
コード例 #17
0
        public void WriteAfterClose()
        {
            var memStream = new TrackedMemoryStream();
            var s         = new GZipOutputStream(memStream);

            s.Close();

            try {
                s.WriteByte(7);
                Assert.Fail("Write should fail");
            } catch {
            }
        }
コード例 #18
0
        public void DoubleClose()
        {
            var memStream = new TrackedMemoryStream();
            var s         = new GZipOutputStream(memStream);

            s.Finish();
            s.Close();
            s.Close();

            memStream = new TrackedMemoryStream();
            using (GZipOutputStream no2 = new GZipOutputStream(memStream)) {
                s.Close();
            }
        }
コード例 #19
0
        public void DoubleFooter()
        {
            var memStream = new TrackedMemoryStream();
            var s         = new GZipOutputStream(memStream);

            s.Finish();
            Int64 length = memStream.Length;

#if NET451
            s.Close();
#elif NETCOREAPP1_0
            s.Dispose();
#endif
            Assert.AreEqual(length, memStream.ToArray().Length);
        }
コード例 #20
0
ファイル: GZipTests.cs プロジェクト: sillsdev/WorldPad
        public void WriteAfterFinish()
        {
            TrackedMemoryStream memStream = new TrackedMemoryStream();
            GZipOutputStream    s         = new GZipOutputStream(memStream);

            s.Finish();

            try
            {
                s.WriteByte(7);
                Assert.Fail("Write should fail");
            }
            catch
            {
            }
        }
コード例 #21
0
        private static TrackedMemoryStream CreateFastZipTestArchiveWithAnEntry(FastZip fastZip, Action <FileInfo> alterFile = null)
        {
            var target = new TrackedMemoryStream();

            using (var tempFolder = new Utils.TempDir())
            {
                // Create test input file
                var addFile = Path.Combine(tempFolder.Fullpath, SingleEntryFileName);
                MakeTempFile(addFile, 16);
                var fi = new FileInfo(addFile);
                alterFile?.Invoke(fi);

                fastZip.CreateZip(target, tempFolder.Fullpath, false, SingleEntryFileName, null, leaveOpen: true);
            }

            return(target);
        }
コード例 #22
0
        public void WriteAfterClose()
        {
            var memStream = new TrackedMemoryStream();
            var s         = new GZipOutputStream(memStream);

#if NET451
            s.Close();
#elif NETCOREAPP1_0
            s.Dispose();
#endif

            try
            {
                s.WriteByte(7);
                Assert.Fail("Write should fail");
            } catch {
            }
        }
コード例 #23
0
        public void StreamNotClosedOnError()
        {
            var ms = new TrackedMemoryStream(new byte[32]);

            Assert.IsFalse(ms.IsClosed, "Underlying stream should NOT be closed initially");
            bool blewUp = false;

            try
            {
                using (var zipFile = new ZipFile(ms, true))
                {
                    Assert.Fail("Exception not thrown");
                }
            }
            catch
            {
                blewUp = true;
            }

            Assert.IsTrue(blewUp, "Should have failed to load the file");
            Assert.IsFalse(ms.IsClosed, "Underlying stream should NOT be closed");
        }