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 BeginRead_WhenNotYetCompleted_ReturnsUncompletedResult() { // Arrange Mock<CloudBlobStream> innerStreamMock = CreateMockInnerStream(); innerStreamMock .SetupBeginRead() .ReturnsUncompleted(); CloudBlobStream innerStream = innerStreamMock.Object; Stream product = CreateProductUnderTest(innerStream); byte[] buffer = new byte[0]; int offset = 123; int count = 456; AsyncCallback callback = null; object expectedState = new object(); // Act IAsyncResult result = product.BeginRead(buffer, offset, count, callback, expectedState); // Assert ExpectedAsyncResult expectedResult = new ExpectedAsyncResult { AsyncState = expectedState, CompletedSynchronously = false, IsCompleted = false }; AssertEqual(expectedResult, result, disposeActual: false); // Cleanup result.AsyncWaitHandle.Dispose(); }
private static void AssertEqual(ExpectedAsyncResult expected, IAsyncResult actual, bool disposeActual = false) { Assert.NotNull(actual); Assert.Same(expected.AsyncState, actual.AsyncState); Assert.Equal(expected.CompletedSynchronously, actual.CompletedSynchronously); Assert.Equal(expected.IsCompleted, actual.IsCompleted); try { Assert.Equal(expected.IsCompleted, actual.AsyncWaitHandle.WaitOne(0)); } finally { if (disposeActual) { actual.Dispose(); } } }
public void BeginFlush_WhenCompletedSynchronously_CallsCallbackAndReturnsCompletedResult() { // Arrange object expectedState = new object(); ExpectedAsyncResult expectedResult = new ExpectedAsyncResult { AsyncState = expectedState, CompletedSynchronously = true, IsCompleted = true }; bool callbackCalled = false; IAsyncResult callbackResult = null; CloudBlobStream product = null; AsyncCallback callback = (ar) => { callbackResult = ar; AssertEqual(expectedResult, ar); callbackCalled = true; }; Mock<CloudBlobStream> innerStreamMock = CreateMockInnerStream(); innerStreamMock .SetupBeginFlush() .ReturnsCompletedSynchronously(); innerStreamMock.SetupEndFlush(); CloudBlobStream innerStream = innerStreamMock.Object; product = CreateProductUnderTest(innerStream); // Act IAsyncResult result = product.BeginFlush(callback, expectedState); // 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 BeginWrite_WhenCompletedSynchronously_CallsCallbackAndReturnsCompletedResult() { // Arrange object expectedState = new object(); ExpectedAsyncResult expectedResult = new ExpectedAsyncResult { AsyncState = expectedState, CompletedSynchronously = true, 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(); innerStreamMock .Setup(s => s.BeginWrite(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<AsyncCallback>(), It.IsAny<object>())) .Returns<byte[], int, int, AsyncCallback, object>((i1, i2, i3, c, s) => { IAsyncResult r = new CompletedAsyncResult(s); if (c != null) c.Invoke(r); return r; }); innerStreamMock.SetupEndWrite(); CloudBlobStream innerStream = innerStreamMock.Object; product = CreateProductUnderTest(innerStream); byte[] buffer = new byte[0]; int offset = 123; int count = 456; // Act IAsyncResult result = product.BeginWrite(buffer, offset, count, callback, expectedState); // 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); }