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); }
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); }
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); }
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); }
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); }
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); }
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); }
protected override MemoryStream OnObtainBuffer() { return(_bufferPool.AcquireForWriting()); }