public void WriteAfterCompleteWriting_ThrowsInvalidOperationException() { using (var stream = new BlockingMemoryStream()) { stream.CompleteWriting(); Assert.Throws <InvalidOperationException>(() => stream.Write(new byte[1], 0, 1)); } }
public void CanWriteAfterCompleteWriting_ReturnsFalse() { using (var stream = new BlockingMemoryStream()) { stream.CompleteWriting(); Assert.IsFalse(stream.CanWrite); } }
public void WriteThenGetConsumingEnumerable_StopsBlockingWhenCompleteWriting() { var buffer = new byte[] { 1, 2, 3 }; using (var stream = new BlockingMemoryStream()) { stream.Write(buffer, 0, buffer.Length); var readToListTask = new TaskFactory().StartNew(() => stream.GetConsumingEnumerable().ToList()); Assert.IsFalse(readToListTask.Wait(millisecondsTimeout: 100)); stream.CompleteWriting(); Assert.IsTrue(readToListTask.Wait(millisecondsTimeout: 1000)); CollectionAssert.AreEqual(buffer, readToListTask.Result); } }
public void WriteThenReadToEnd_StopsBlockingWhenCompleteWriting() { var buffer = new byte[] { 1, 2, 3 }; using (var stream = new BlockingMemoryStream()) { stream.Write(buffer, 0, buffer.Length); // We can read a byte without hitting any blocking var readByteTask = new TaskFactory().StartNew(() => stream.ReadByte()); Assert.IsTrue(readByteTask.Wait(millisecondsTimeout: 1000)); Assert.AreEqual(1, readByteTask.Result); // If we try to read to the end, then we should block until we call CompleteWriting var readToEndTask = new TaskFactory().StartNew(() => StreamUtils.ReadToEnd(stream)); Assert.IsFalse(readToEndTask.Wait(millisecondsTimeout: 100)); stream.CompleteWriting(); Assert.IsTrue(readToEndTask.Wait(millisecondsTimeout: 1000)); CollectionAssert.AreEqual(buffer.Skip(1), readToEndTask.Result); } }