Ejemplo n.º 1
0
        public void WhenAllBuffersFilledBlockingOccurs()
        {
            // arrange
            var bufferPool = new BufferPool(2, 5, new Mock <ILog>().Object);

            var stream1 = bufferPool.AcquireForWriting();

            stream1.Write(new byte[] { 0, 1, 2, 3, 4 }, 0, 5);
            bufferPool.Release(stream1);

            var stream2 = bufferPool.AcquireForWriting();

            stream2.Write(new byte[] { 0, 1, 2, 3, 4 }, 0, 5);
            bufferPool.Release(stream2);

            // act
            var task = Task.Run(() =>
            {
                bufferPool.AcquireForWriting();
            });
            var waitResult = task.Wait(TimeSpan.FromMilliseconds(2000));

            // assert
            Assert.IsFalse(waitResult);
        }
Ejemplo n.º 2
0
        public void WhenAllBuffersReadAndReturnedPoolIsEmpty()
        {
            // arrange
            var bufferPool = new BufferPool(2, 9, new Mock <ILog>().Object);

            var fullBuffer = bufferPool.AcquireForWriting();

            fullBuffer.Write(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, 0, 9);
            bufferPool.Release(fullBuffer);

            var partialBuffer = bufferPool.AcquireForWriting();

            partialBuffer.Write(new byte[] { 0, 1, 2 }, 0, 3);
            bufferPool.Release(partialBuffer);

            // act
            var fullBufferFromPool = bufferPool.AcquireForReading(TimeSpan.MaxValue);

            fullBufferFromPool.Reset();
            bufferPool.Release(fullBufferFromPool);

            var partialBufferFromPool = bufferPool.AcquireForReading(TimeSpan.MaxValue);

            partialBufferFromPool.Reset();
            bufferPool.Release(partialBufferFromPool);

            // assert
            Assert.IsTrue(bufferPool.IsEmpty);
        }
Ejemplo n.º 3
0
        public void WhenDataReadTheTotalReadableBuffersCountIsZero()
        {
            // arrange
            var bufferPool   = new BufferPool(1, 9, new Mock <ILog>().Object);
            var memoryStream = bufferPool.AcquireForWriting();

            memoryStream.Write(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, 0, 9);
            bufferPool.Release(memoryStream);

            var readableBuffersBefore = bufferPool.ReadableBuffers;

            // act
            var writableStream = bufferPool.AcquireForReading(TimeSpan.MaxValue);

            var buffer = new byte[9];

            using (var bufferStream = new MemoryStream(buffer))
            {
                writableStream.WriteTo(bufferStream);
                writableStream.Reset();
            }
            bufferPool.Release(writableStream);

            // assert
            Assert.AreEqual(1, readableBuffersBefore);
            Assert.AreEqual(0, bufferPool.ReadableBuffers);
        }
Ejemplo n.º 4
0
        public void WhenWriteDisabledCannotAcquireForWriting()
        {
            // arrange
            var bufferPool = new BufferPool(1, 10, new Mock <ILog>().Object);

            var memoryStream = bufferPool.AcquireForWriting();

            memoryStream.WriteByte(1);
            bufferPool.Release(memoryStream);

            bufferPool.SetWriteDisabled(true);

            // act
            var writableStream = bufferPool.AcquireForWriting();

            // assert
            Assert.IsNull(writableStream);
            Assert.AreEqual(1, bufferPool.ReadableBuffers);
        }
Ejemplo n.º 5
0
        public void WhenOneBufferIsFullOtherPartialBufferReturnedForWriting()
        {
            // arrange
            var bufferPool = new BufferPool(2, 9, new Mock <ILog>().Object);

            var fullBuffer = bufferPool.AcquireForWriting();

            fullBuffer.Write(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, 0, 9);
            bufferPool.Release(fullBuffer);

            var partialBuffer = bufferPool.AcquireForWriting();

            partialBuffer.Write(new byte[] { 0, 1, 2 }, 0, 3);
            bufferPool.Release(partialBuffer);

            // act
            var buffer = bufferPool.AcquireForWriting();

            // assert
            Assert.AreSame(partialBuffer, buffer);
        }
Ejemplo n.º 6
0
        public void WhenOneBufferIsFullOtherPartialBufferIsNotReturnedForReading()
        {
            // arrange
            var bufferPool = new BufferPool(2, 9);

            var fullBuffer = bufferPool.AcquireForWriting();

            fullBuffer.Write(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, 0, 9);
            bufferPool.Release(fullBuffer);

            var partialBuffer = bufferPool.AcquireForWriting();

            partialBuffer.Write(new byte[] { 0, 1, 2 }, 0, 3);
            bufferPool.Release(partialBuffer);

            // act
            var buffer = bufferPool.AcquireForReading(TimeSpan.MaxValue);

            // assert
            Assert.AreSame(fullBuffer, buffer);
        }
Ejemplo n.º 7
0
        public void WhenDataBecomesAvailableBlockingClears()
        {
            // arrange
            var bufferPool = new BufferPool(2, 5, new Mock <ILog>().Object);

            // act
            var task = Task.Run(() =>
            {
                bufferPool.AcquireForReading(TimeSpan.MaxValue);
            });
            var waitResult = task.Wait(TimeSpan.FromMilliseconds(2000));

            // assert
            Assert.IsFalse(waitResult);

            var stream = bufferPool.AcquireForWriting();

            stream.WriteByte(1);
            bufferPool.Release(stream);

            waitResult = task.Wait(TimeSpan.FromMilliseconds(2000));
            Assert.IsTrue(waitResult);
        }
Ejemplo n.º 8
0
 protected override MemoryStream OnObtainBuffer()
 {
     return(_bufferPool.AcquireForWriting());
 }