public async Task PushStreamContentWithAsyncOnStreamAvailableHandler_ExceptionsInOnStreamAvailable_AreCaught()
        {
            // Arrange
            bool              faulted   = false;
            Exception         exception = new ApplicationException();
            PushStreamContent content   = new PushStreamContent(async(s, c, tc) =>
            {
                await Task.FromResult(42);
                throw exception;
            });
            MemoryStream stream = new MemoryStream();

            try
            {
                // Act
                await content.CopyToAsync(stream);
            }
            catch (ApplicationException e)
            {
                Assert.Same(exception, e);
                faulted = true;
            }

            // Assert
            Assert.True(faulted);
        }
        public Task SerializeToStreamAsync_CallsAction()
        {
            // Arrange
            MemoryStream outputStream = new MemoryStream();
            MockStreamAction streamAction = new MockStreamAction(close: true);
            PushStreamContent content = new PushStreamContent((Action<Stream, HttpContent, TransportContext>)streamAction.Action);

            // Act
            return content.CopyToAsync(outputStream).ContinueWith(
                copyTask =>
                {
                    // Assert
                    Assert.Equal(TaskStatus.RanToCompletion, copyTask.Status);
                    Assert.True(streamAction.WasInvoked);
                    Assert.Same(content, streamAction.Content);
                    Assert.IsType<PushStreamContent.CompleteTaskOnCloseStream>(streamAction.OutputStream);
#if NETFX_CORE
                    // In portable libraries, we expect the dispose to be called because we passed close: true above
                    // on netfx45, we let the HttpContent call close on the stream.
                    // CompleteTaskOnCloseStream for this reason does not dispose the innerStream when close is called
                    Assert.False(outputStream.CanRead);
#else
                    Assert.True(outputStream.CanRead);
#endif

                });
        }
Example #3
0
        public Task SerializeToStreamAsync_CallsAction()
        {
            // Arrange
            MemoryStream      outputStream = new MemoryStream();
            MockStreamAction  streamAction = new MockStreamAction(close: true);
            PushStreamContent content      = new PushStreamContent((Action <Stream, HttpContent, TransportContext>)streamAction.Action);

            // Act
            return(content.CopyToAsync(outputStream).ContinueWith(
                       copyTask =>
            {
                // Assert
                Assert.Equal(TaskStatus.RanToCompletion, copyTask.Status);
                Assert.True(streamAction.WasInvoked);
                Assert.Same(content, streamAction.Content);
                Assert.IsType <PushStreamContent.CompleteTaskOnCloseStream>(streamAction.OutputStream);
#if NETFX_CORE
                // In portable libraries, we expect the dispose to be called because we passed close: true above
                // on netfx45, we let the HttpContent call close on the stream.
                // CompleteTaskOnCloseStream for this reason does not dispose the innerStream when close is called
                Assert.False(outputStream.CanRead);
#else
                Assert.True(outputStream.CanRead);
#endif
            }));
        }
        public async Task SerializeToStreamAsync_CompletesTaskOnActionException()
        {
            // Arrange
            MemoryStream      outputStream = new MemoryStream();
            MockStreamAction  streamAction = new MockStreamAction(throwException: true);
            PushStreamContent content      = new PushStreamContent((Action <Stream, HttpContent, TransportContext>)streamAction.Action);

            // Act & Assert
            await Assert.ThrowsAsync <ApplicationException>(() => content.CopyToAsync(outputStream));

            Assert.True(streamAction.WasInvoked);
            Assert.IsType <PushStreamContent.CompleteTaskOnCloseStream>(streamAction.OutputStream);
            Assert.True(outputStream.CanRead);
        }
        public async Task SerializeToStreamAsync_CallsAction()
        {
            // Arrange
            MemoryStream      outputStream = new MemoryStream();
            MockStreamAction  streamAction = new MockStreamAction(close: true);
            PushStreamContent content      = new PushStreamContent((Action <Stream, HttpContent, TransportContext>)streamAction.Action);

            // Act
            await content.CopyToAsync(outputStream);

            // Assert
            Assert.True(streamAction.WasInvoked);
            Assert.Same(content, streamAction.Content);
            Assert.IsType <PushStreamContent.CompleteTaskOnCloseStream>(streamAction.OutputStream);

            // We don't close the underlying stream
            Assert.True(outputStream.CanRead);
        }
        public Task SerializeToStreamAsync_CompletesTaskOnActionException()
        {
            // Arrange
            MemoryStream      outputStream = new MemoryStream();
            MockStreamAction  streamAction = new MockStreamAction(throwException: true);
            PushStreamContent content      = new PushStreamContent(streamAction.Action);

            // Act
            return(content.CopyToAsync(outputStream).ContinueWith(
                       copyTask =>
            {
                // Assert
                Assert.Equal(TaskStatus.Faulted, copyTask.Status);
                Assert.IsType <ApplicationException>(copyTask.Exception.GetBaseException());
                Assert.True(streamAction.WasInvoked);
                Assert.IsType <PushStreamContent.CompleteTaskOnCloseStream>(streamAction.OutputStream);
                Assert.True(outputStream.CanRead);
            }));
        }
        public Task SerializeToStreamAsync_CallsAction()
        {
            // Arrange
            MemoryStream      outputStream = new MemoryStream();
            MockStreamAction  streamAction = new MockStreamAction(close: true);
            PushStreamContent content      = new PushStreamContent(streamAction.Action);

            // Act
            return(content.CopyToAsync(outputStream).ContinueWith(
                       copyTask =>
            {
                // Assert
                Assert.Equal(TaskStatus.RanToCompletion, copyTask.Status);
                Assert.True(streamAction.WasInvoked);
                Assert.Same(content, streamAction.Content);
                Assert.IsType <PushStreamContent.CompleteTaskOnCloseStream>(streamAction.OutputStream);
                Assert.True(outputStream.CanRead);
            }));
        }
        public Task SerializeToStreamAsync_CompletesTaskOnActionException()
        {
            // Arrange
            MemoryStream outputStream = new MemoryStream();
            MockStreamAction streamAction = new MockStreamAction(throwException: true);
            PushStreamContent content = new PushStreamContent(streamAction.Action);

            // Act
            return content.CopyToAsync(outputStream).ContinueWith(
                copyTask =>
                {
                    // Assert
                    Assert.Equal(TaskStatus.Faulted, copyTask.Status);
                    Assert.IsType<ApplicationException>(copyTask.Exception.GetBaseException());
                    Assert.True(streamAction.WasInvoked);
                    Assert.IsType<PushStreamContent.CompleteTaskOnCloseStream>(streamAction.OutputStream);
                    Assert.True(outputStream.CanRead);
                });
        }
        public Task SerializeToStreamAsync_CallsAction()
        {
            // Arrange
            MemoryStream outputStream = new MemoryStream();
            MockStreamAction streamAction = new MockStreamAction(close: true);
            PushStreamContent content = new PushStreamContent(streamAction.Action);

            // Act
            return content.CopyToAsync(outputStream).ContinueWith(
                copyTask =>
                {
                    // Assert
                    Assert.Equal(TaskStatus.RanToCompletion, copyTask.Status);
                    Assert.True(streamAction.WasInvoked);
                    Assert.Same(content, streamAction.Content);
                    Assert.IsType<PushStreamContent.CompleteTaskOnCloseStream>(streamAction.OutputStream);
                    Assert.True(outputStream.CanRead);
                });
        }
        public async Task PushStreamContentWithAsyncOnStreamAvailableHandler_ExceptionsInOnStreamAvailable_AreCaught()
        {
            // Arrange
            bool faulted = false;
            Exception exception = new ApplicationException();
            PushStreamContent content = new PushStreamContent(async (s, c, tc) =>
            {
                await Task.FromResult(42);
                throw exception;
            });
            MemoryStream stream = new MemoryStream();

            try
            {
                // Act
                await content.CopyToAsync(stream);
            }
            catch (ApplicationException e)
            {
                Assert.Same(exception, e);
                faulted = true;
            }

            // Assert
            Assert.True(faulted);
        }