Example #1
0
        public void ResetShouldAllowStreamReuse()
        {
            int initialOffset = 0;
            var manager       = new BufferManageMock();

            using (var stream = new BufferManagerStream(manager, initialOffset, 4, 1024))
            {
                stream.Write(_input, 0, 4);
                manager.ReturnBuffer(stream.GetArrayAndClear().Array);
                manager.AssertEverythingIsReturned();

                initialOffset = 1;
                stream.Reset(manager, initialOffset, 4);

                Assert.AreEqual(stream.Position, 0, "Position should be 0 after reset");

                byte[] otherInput = new byte[] { 3, 2, 1 };
                stream.Write(otherInput, 0, otherInput.Length);

                var array = stream.GetArrayAndClear();
                VerifyBufferContents(array, initialOffset, new ArraySegment <byte>(otherInput));
                manager.ReturnBuffer(array.Array);
                manager.AssertEverythingIsReturned();
            }
        }
Example #2
0
        public void ShouldHandleThrowingAllocationWithoutMemoryLeak()
        {
            bool            shouldTrow    = false;
            Func <int, int> getBufferSize = size =>
            {
                if (shouldTrow)
                {
                    throw new InsufficientMemoryException();
                }
                else
                {
                    return(size);
                }
            };

            var manager = new BufferManageMock(getBufferSize);

            using (var stream = new BufferManagerStream(manager, 0, 4, 1024))
            {
                stream.Write(_input, 0, 2); // Write some into first buffer

                shouldTrow = true;
                ExceptionHelper.ExpectException <InsufficientMemoryException>(() =>
                                                                              stream.Write(_input, 2, 10)
                                                                              );
            }

            manager.AssertEverythingIsReturned();
        }
Example #3
0
        public void ReuseLastBufferIfPossible()
        {
            int initialOffset = 0, initalBufferSize = 4;
            int buffer2Size = initalBufferSize * 2;
            int buffer3Size = initalBufferSize + buffer2Size;
            var manager     = new BufferManageMock();

            using (var stream = new BufferManagerStream(manager, initialOffset, initalBufferSize, 1024))
            {
                // Fill first and second buffers full
                stream.Write(_input, 0, initalBufferSize);
                stream.Write(_input, initalBufferSize, buffer2Size);
                Assert.AreEqual(buffer2Size, manager.Allocated[1].Length, "This test assumed allocation size was wrong");

                // Write next one up just a little so that everyhing should fit in the 3rd
                int streamOffsetLastBuffer = (int)stream.Position;
                stream.Write(_input, streamOffsetLastBuffer, streamOffsetLastBuffer);

                Assert.AreEqual(3, manager.Allocated.Count, "Test assumes 3 buffers");
                Assert.AreEqual((int)stream.Position, manager.Allocated[2].Length, "This test assumes allocation size is enough");

                var buffer = VerifyStreamContents(stream, initialOffset, streamOffsetLastBuffer * 2, manager);
                Assert.AreSame(manager.Allocated[2], buffer.Array);
            }
        }
Example #4
0
        public void LargeWrite(int offset)
        {
            var manager = new BufferManageMock();

            using (var stream = new BufferManagerStream(manager, offset, 4, 1024))
            {
                stream.Write(_input, 0, 40);
                VerifyStreamContents(stream, offset, 40, manager);
                Assert.IsTrue(manager.Allocated.Count > 2, "Multiple buffers should have been used");
            }
        }
Example #5
0
        public void SmallWriteFullBuffer()
        {
            int initialOffset = 0, minBufferSize = 4;
            var manager = new BufferManageMock();

            using (var stream = new BufferManagerStream(manager, initialOffset, minBufferSize, 1024))
            {
                stream.Write(_input, 0, minBufferSize);
                var buffer = VerifyStreamContents(stream, initialOffset, minBufferSize, manager);
                Assert.AreEqual(1, manager.Allocated.Count, "Should only have allocated a single buffer");
                Assert.AreSame(manager.Allocated[0], buffer.Array, "Should reuse initial array");
            }
        }
Example #6
0
        public void SmallWrite(int offset)
        {
            var manager = new BufferManageMock();

            using (var stream = new BufferManagerStream(manager, offset, 4, 1024))
            {
                stream.Write(_input, 0, 2);

                var buffer = VerifyStreamContents(stream, offset, 2, manager);
                Assert.AreEqual(1, manager.Allocated.Count, "Should only have allocated a single buffer");
                Assert.AreSame(manager.Allocated[0], buffer.Array, "Should reuse initial array");
            }
        }
Example #7
0
        public void MultipleWrites()
        {
            int initialOffset = 0;
            var manager       = new BufferManageMock();

            using (var stream = new BufferManagerStream(manager, initialOffset, 4, 1024))
            {
                stream.Write(_input, 0, 2); // Write partial buffer
                stream.Write(_input, 2, 2); // Fill next buffer, next shoul be 4

                stream.Write(_input, 4, 2);
                stream.Write(_input, 6, manager.Allocated[1].Length); // Write past buffer into next one

                VerifyStreamContents(stream, initialOffset, 6 + manager.Allocated[1].Length, manager);
                Assert.IsTrue(manager.Allocated.Count > 2, "Multiple buffers should have been used");
            }
        }
Example #8
0
        private ArraySegment <byte> VerifyStreamContents(BufferManagerStream stream, int expectedOffset, int count, BufferManageMock manager, byte[] expectedContents = null)
        {
            Assert.AreEqual(count, stream.Position, "Stream position should equal count");

            var buffer = stream.GetArrayAndClear();

            VerifyBufferContents(buffer, expectedOffset, new ArraySegment <byte>(expectedContents ?? _input, 0, count));

            // By returning buffer we also ensure that it was allocated through the buffer manager
            manager.ReturnBuffer(buffer.Array);
            manager.AssertEverythingIsReturned();
            return(buffer);
        }