示例#1
0
        public void Write_DecompressMode_ItemsWrittenToStream()
        {
            // arrange
            var expectedResult = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
            var pieces         = new List <KeyValuePair <int, byte[]> >
            {
                new KeyValuePair <int, byte[]>(1, new byte[] { 1, 2, 3 }),
                new KeyValuePair <int, byte[]>(2, new byte[] { 4, 5 }),
                new KeyValuePair <int, byte[]>(3, new byte[] { 6, 7, 8, 9, 0 })
            };
            var outputStream = new FakeStream();
            var service      = PrepareDestinationWriter(outputStream, false);

            var compressionResultsPieces = new ConcurrentDictionary <int, byte[]>(pieces);
            var compressionContext       = new ParallelCompressionContext(null, compressionResultsPieces,
                                                                          new CancellationTokenSource(), new ManualResetEventSlim(true));
            var calculationsFinishedSrc = new CancellationTokenSource();

            calculationsFinishedSrc.Cancel();

            // act
            var result = service.Write("", CompressionMode.Decompress, compressionContext, calculationsFinishedSrc.Token);

            result.ProcessingThread.Join();

            // assert
            result.ExceptionSource.IsCancellationRequested.Should().BeFalse();
            outputStream.Length.Should().Be(expectedResult.Length);
            outputStream.ToArray().Should().Equal(expectedResult);

            outputStream.Close();
            outputStream.Dispose();
        }
示例#2
0
        public AsyncWriteContext Write(string destinationUri, CompressionMode compressionMode,
                                       ParallelCompressionContext compressionContext, CancellationToken calculationsFinishedToken)
        {
            var exceptionSource = new CancellationTokenSource();
            var tokens          = new[] { calculationsFinishedToken, compressionContext.ExceptionSource.Token };

            var thread = new Thread(() =>
            {
                WriteInternal(destinationUri, compressionMode, compressionContext.ResultsDictionary, tokens, exceptionSource, compressionContext.OutputOverflowEvent);
            });

            thread.Start();

            return(new AsyncWriteContext(thread, exceptionSource));
        }
示例#3
0
        public void Write_ExceptionInsideThread_ExceptionSourceCancelled()
        {
            // arrange
            var destinationStreamServiceMock = new Mock <IDestinationStreamService>();

            destinationStreamServiceMock.Setup(x => x.OpenWrite(It.IsAny <string>()))
            .Throws <Exception>();
            var service            = PrepareDestinationWriter(null, true);
            var compressionContext = new ParallelCompressionContext(null, null,
                                                                    new CancellationTokenSource(), new ManualResetEventSlim(true));
            var calculationsFinishedSrc = new CancellationTokenSource();

            calculationsFinishedSrc.Cancel();

            // act
            var result = service.Write("", CompressionMode.Decompress, compressionContext, calculationsFinishedSrc.Token);

            result.ProcessingThread.Join();

            // assert
            result.ExceptionSource.IsCancellationRequested.Should().BeTrue();
        }