public void BeginRead_WhenCompletedAsynchronously_CallsCallbackAndCompletesResult() { // Arrange object expectedState = new object(); ExpectedAsyncResult expectedResult = new ExpectedAsyncResult { AsyncState = expectedState, CompletedSynchronously = false, IsCompleted = true }; bool callbackCalled = false; IAsyncResult callbackResult = null; Stream product = null; AsyncCallback callback = (ar) => { callbackResult = ar; AssertEqual(expectedResult, ar); callbackCalled = true; }; Mock<CloudBlobStream> innerStreamMock = CreateMockInnerStream(); AsyncCompletionSource completion = new AsyncCompletionSource(); innerStreamMock .SetupBeginRead() .ReturnsCompletingAsynchronously(completion); innerStreamMock .SetupEndRead() .Returns(-1); CloudBlobStream innerStream = innerStreamMock.Object; product = CreateProductUnderTest(innerStream); byte[] buffer = new byte[0]; int offset = 123; int count = 456; IAsyncResult result = product.BeginRead(buffer, offset, count, callback, expectedState); // Act completion.Complete(); // Assert Assert.True(callbackCalled); // An AsyncCallback must be called with the same IAsyncResult instance as the Begin method returned. Assert.Same(result, callbackResult); AssertEqual(expectedResult, result, disposeActual: true); }
public void EndWrite_DuringCallback_DelegatesToInnerStreamEndWrite() { // Arrange Mock<CloudBlobStream> innerStreamMock = CreateMockInnerStream(); AsyncCompletionSource completion = new AsyncCompletionSource(); innerStreamMock .SetupBeginWrite() .ReturnsCompletingAsynchronously(completion); innerStreamMock .Setup(s => s.EndWrite(It.Is<IAsyncResult>((ar) => ar == completion.AsyncResult))) .Verifiable(); CloudBlobStream innerStream = innerStreamMock.Object; Stream product = CreateProductUnderTest(innerStream); byte[] buffer = new byte[0]; int offset = 123; int count = 456; bool callbackCalled = false; AsyncCallback callback = (ar) => { product.EndWrite(ar); callbackCalled = true; }; object state = null; IAsyncResult result = product.BeginWrite(buffer, offset, count, callback, state); // Act completion.Complete(); // Assert Assert.True(callbackCalled); innerStreamMock.Verify(); }
public void EndWrite_WhenInnerStreamThrows_PropogatesException() { // Arrange Exception expectedException = new Exception(); Mock<CloudBlobStream> innerStreamMock = CreateMockInnerStream(); AsyncCompletionSource completion = new AsyncCompletionSource(); innerStreamMock .SetupBeginWrite() .ReturnsCompletingAsynchronously(completion); innerStreamMock .SetupEndWrite() .Throws(expectedException); CloudBlobStream innerStream = innerStreamMock.Object; Stream product = CreateProductUnderTest(innerStream); byte[] buffer = new byte[0]; int offset = 123; int count = 456; AsyncCallback callback = null; object state = null; IAsyncResult result = product.BeginWrite(buffer, offset, count, callback, state); completion.Complete(); // Act & Assert Exception exception = Assert.Throws<Exception>(() => product.EndWrite(result)); Assert.Same(expectedException, exception); }
public void EndRead_DelegatesToInnerStreamEndRead() { // Arrange int expectedBytesRead = 789; Mock<CloudBlobStream> innerStreamMock = CreateMockInnerStream(); AsyncCompletionSource completion = new AsyncCompletionSource(); innerStreamMock .SetupBeginRead() .ReturnsCompletingAsynchronously(completion); innerStreamMock .Setup(s => s.EndRead(It.Is<IAsyncResult>(ar => ar == completion.AsyncResult))) .Returns(expectedBytesRead) .Verifiable(); CloudBlobStream innerStream = innerStreamMock.Object; Stream product = CreateProductUnderTest(innerStream); byte[] buffer = new byte[0]; int offset = 123; int count = 456; AsyncCallback callback = null; object state = null; IAsyncResult result = product.BeginRead(buffer, offset, count, callback, state); completion.Complete(); // Act int bytesRead = product.EndRead(result); // Assert Assert.Equal(expectedBytesRead, bytesRead); innerStreamMock.Verify(); }