public void CanWrite_IsTrue()
 {
     using (var stream = new PayloadStream(null))
     {
         Assert.True(stream.CanWrite);
     }
 }
        public async Task CanReadTwice_AfterMultipleWrites()
        {
            const int expectedReadCount = 200;
            var       producerBuffer    = new byte[100];
            var       consumerBuffer    = new byte[expectedReadCount];
            var       readCount1        = 0;
            var       readCount2        = 0;

            var random = new Random();

            random.NextBytes(producerBuffer);

            using (var stream = new PayloadStream(null))
            {
                await stream.WriteAsync(producerBuffer, 0, producerBuffer.Length);

                await stream.WriteAsync(producerBuffer, 0, producerBuffer.Length);

                readCount1 = await stream.ReadAsync(consumerBuffer, 0, expectedReadCount);

                readCount2 = await stream.ReadAsync(consumerBuffer, readCount1, expectedReadCount);
            }

            // only get 1 buffer
            Assert.Equal(100, readCount1);
            Assert.Equal(100, readCount2);
            Assert.Equal(producerBuffer, consumerBuffer.Take(100).ToArray());
            Assert.Equal(producerBuffer, consumerBuffer.Skip(100).ToArray());
        }
        public async Task DoneProducing_Data_WillCauseZeroRead()
        {
            const int expectedReadCount = 100;
            var       producerBuffer    = new byte[100];
            var       consumerBuffer    = new byte[expectedReadCount];
            var       readCount1        = 0;
            var       readCount2        = 0;

            var random = new Random();

            random.NextBytes(producerBuffer);

            using (var stream = new PayloadStream(null))
            {
                await stream.WriteAsync(producerBuffer, 0, producerBuffer.Length);

                stream.DoneProducing();

                readCount1 = await stream.ReadAsync(consumerBuffer, 0, expectedReadCount);

                readCount2 = await stream.ReadAsync(consumerBuffer, readCount1, expectedReadCount);
            }

            Assert.Equal(100, readCount1);
            Assert.Equal(0, readCount2);
        }
        public async void DoneProducing_Data_WillCauseZeroRead_And_End()
        {
            const int expectedReadCount = 100;
            var       producerBuffer    = new byte[100];
            var       consumerBuffer    = new byte[expectedReadCount];
            var       readCount         = 0;

            var streamManager = new StreamManager(e => { });
            var id            = Guid.NewGuid();

            var assembler = streamManager.GetPayloadAssembler(id);

            assembler.ContentLength = 0;

            var random = new Random();

            random.NextBytes(producerBuffer);

            var stream = new PayloadStream(assembler);

            await stream.WriteAsync(producerBuffer, 0, producerBuffer.Length);

            stream.DoneProducing();

            readCount = stream.Read(consumerBuffer, 0, expectedReadCount);
            Assert.Equal(100, readCount);

            readCount = stream.Read(consumerBuffer, readCount, expectedReadCount);
            Assert.Equal(0, readCount);
        }
 public void CanRead_IsTrue()
 {
     using (var stream = new PayloadStream(null))
     {
         Assert.IsTrue(stream.CanRead);
     }
 }
        public async Task CanReadMore_GetLess_ThenMore_GivesFirstBuffer()
        {
            const int expectedReadCount = 200;
            var       producerBuffer    = new byte[100];
            var       consumerBuffer    = new byte[expectedReadCount];
            var       readCount1        = 0;
            var       readCount2        = 0;

            var random = new Random();

            random.NextBytes(producerBuffer);

            using (var stream = new PayloadStream(null))
            {
                // write 200
                await stream.WriteAsync(producerBuffer, 0, producerBuffer.Length);

                await stream.WriteAsync(producerBuffer, 0, producerBuffer.Length);

                // ask for less
                readCount1 = await stream.ReadAsync(consumerBuffer, 0, 50);

                // ask for more than what should be left in 1 buffer
                readCount2 = await stream.ReadAsync(consumerBuffer, 50, 150);
            }

            Assert.Equal(50, readCount1);
            Assert.Equal(50, readCount2);
        }
 public void CanSeek_IsFalse()
 {
     using (var stream = new PayloadStream(null))
     {
         Assert.False(stream.CanSeek);
     }
 }
예제 #8
0
        public Payload(PayloadDirection direction, PayloadStream streamKind, DateTime transmissionDate, uint bodyTypeHash, byte[] body)
        {
            _payloadPackets = new ExtendedObservableCollection <PacketBase>();

            Direction        = direction;
            StreamKind       = streamKind;
            TransmissionDate = transmissionDate;
            BodyTypeHash     = bodyTypeHash;
            Body             = body;
        }
 public void Seek_Throws()
 {
     using (var stream = new PayloadStream(null))
     {
         Assert.Throws <NotSupportedException>(() =>
         {
             stream.Seek(100, SeekOrigin.Begin);
         });
     }
 }
 public void SetLength_Throws()
 {
     using (var stream = new PayloadStream(null))
     {
         Assert.Throws <NotSupportedException>(() =>
         {
             stream.SetLength(100);
         });
     }
 }
 public void PositionSetter_Throws()
 {
     using (var stream = new PayloadStream(null))
     {
         Assert.Throws <NotSupportedException>(() =>
         {
             stream.Position = 10;
         });
     }
 }
예제 #12
0
        protected override void ExecuteOperation()
        {
            PayloadItem item = PayloadItems[Index];

            bool skip = ItemSkipRegister != null && ItemSkipRegister.Contains(item.Identifier);

            if (skip == false)
            {
                CipherStream itemEncryptor;
                MacStream    itemAuthenticator;
                CreateEtMDecorator(item, out itemEncryptor, out itemAuthenticator);

                if (Writing)
                {
                    EmitHeader(itemAuthenticator);
                }
                else
                {
                    ConsumeHeader(itemAuthenticator);
                }

                if (Writing)
                {
                    int iterIn;
                    do
                    {
                        iterIn = item.StreamBinding.Read(Buffer, 0, BufferSize);
                        itemEncryptor.Write(Buffer, 0, iterIn);
                    } while (iterIn > 0);
                }
                else
                {
                    itemEncryptor.ReadExactly(item.StreamBinding, item.InternalLength, true);
                }

                FinishItem(item, itemEncryptor, itemAuthenticator);
            }
            else
            {
                // Skipping
                long skipLength = GetHeaderLength() + item.InternalLength + GetTrailerLength();
                PayloadStream.Seek(skipLength, SeekOrigin.Current);
                // Mark the item as completed in the register
                ItemCompletionRegister[Index] = true;
                ItemsCompleted++;
                Debug.Print(DebugUtility.CreateReportString("SimplePayloadMux", "ExecuteOperation",
                                                            "[*** SKIPPED ITEM", String.Format("{0} ({1}) ***]", Index, item.Identifier)));
            }
        }
        public async Task DoneProducing_Empty_WillCauseZeroRead()
        {
            const int expectedReadCount = 200;
            var       consumerBuffer    = new byte[expectedReadCount];
            var       readCount         = 0;

            using (var stream = new PayloadStream(null))
            {
                stream.DoneProducing();

                readCount = await stream.ReadAsync(consumerBuffer, 0, expectedReadCount);
            }

            Assert.Equal(0, readCount);
        }
        public async Task RequestDisassembler_WithVariableStream_Sends()
        {
            var sender    = new PayloadSender();
            var transport = new MockTransportSender();

            sender.Connect(transport);
            var ops = new SendOperations(sender);

            var request = StreamingRequest.CreatePost("/a/b");
            var stream  = new PayloadStream(new PayloadStreamAssembler(null, Guid.NewGuid(), "blah", 100));

            stream.Write(new byte[100], 0, 100);
            request.AddStream(new StreamContent(stream));

            await ops.SendRequestAsync(Guid.NewGuid(), request);

            Assert.AreEqual(5, transport.Buffers.Count);
        }
        public async Task CanReadMore_GetLess()
        {
            const int expectedReadCount = 200;
            var       producerBuffer    = new byte[100];
            var       consumerBuffer    = new byte[expectedReadCount];
            var       readCount         = 0;

            var random = new Random();

            random.NextBytes(producerBuffer);

            using (var stream = new PayloadStream(null))
            {
                await stream.WriteAsync(producerBuffer, 0, producerBuffer.Length);

                readCount = await stream.ReadAsync(consumerBuffer, 0, expectedReadCount);
            }

            Assert.Equal(100, readCount);
            Assert.Equal(producerBuffer.Take(readCount).ToArray(), consumerBuffer.Take(readCount).ToArray());
        }
        public async Task CanReadExact()
        {
            var producerBuffer    = new byte[100];
            var consumerBuffer    = new byte[producerBuffer.Length];
            var expectedReadCount = producerBuffer.Length;
            var readCount         = 0;

            var random = new Random();

            random.NextBytes(producerBuffer);

            using (var stream = new PayloadStream(null))
            {
                await stream.WriteAsync(producerBuffer, 0, producerBuffer.Length);

                readCount = await stream.ReadAsync(consumerBuffer, 0, expectedReadCount);
            }

            Assert.Equal(expectedReadCount, readCount);
            Assert.Equal(producerBuffer.Take(expectedReadCount).ToArray(), consumerBuffer.Take(expectedReadCount).ToArray());
        }
        public async Task CanReadLess()
        {
            var producerBuffer    = new byte[100];
            var consumerBuffer    = new byte[producerBuffer.Length];
            int expectedReadCount = 50;
            int readCount         = 0;

            var random = new Random();

            random.NextBytes(producerBuffer);

            using (var stream = new PayloadStream(null))
            {
                await stream.WriteAsync(producerBuffer, 0, producerBuffer.Length);

                readCount = await stream.ReadAsync(consumerBuffer, 0, expectedReadCount);
            }

            Assert.AreEqual(expectedReadCount, readCount);
            CollectionAssert.AreEquivalent(producerBuffer.Take(expectedReadCount).ToArray(), consumerBuffer.Take(expectedReadCount).ToArray());
        }
        public async Task HttpContentStreamDisassembler_StreamContent_SendsAsVariableLength()
        {
            var sender    = new PayloadSender();
            var transport = new MockTransportSender();

            sender.Connect(transport);

            var stream = new PayloadStream(new PayloadStreamAssembler(null, Guid.NewGuid(), "blah", 100));

            var content = new ResponseMessageStream(Guid.NewGuid())
            {
                Content = new StreamContent(stream),
            };

            stream.Write(new byte[100], 0, 100);

            var disassembler = new ResponseMessageStreamDisassembler(sender, content);

            await disassembler.DisassembleAsync();

            Assert.AreEqual(3, transport.Buffers.Count);
        }
        public async Task CanRead_AfterMultipleWrites()
        {
            int expectedReadCount = 200;
            var producerBuffer    = new byte[100];
            var consumerBuffer    = new byte[expectedReadCount];
            int readCount         = 0;

            var random = new Random();

            random.NextBytes(producerBuffer);

            using (var stream = new PayloadStream(null))
            {
                await stream.WriteAsync(producerBuffer, 0, producerBuffer.Length);

                await stream.WriteAsync(producerBuffer, 0, producerBuffer.Length);

                readCount = await stream.ReadAsync(consumerBuffer, 0, expectedReadCount);
            }

            // only get 1 buffer
            Assert.AreEqual(100, readCount);
            CollectionAssert.AreEquivalent(producerBuffer.Take(readCount).ToArray(), consumerBuffer.Take(readCount).ToArray());
        }
        private async Task ProducerConsumerMultithreadedTest(
            int producerTotalCount,
            int producerChunkCount,
            int consumerTotalCount,
            int consumerChunkCount)
        {
            var producerBuffer = new byte[producerTotalCount];
            var consumerBuffer = new byte[consumerTotalCount];

            var random = new Random();

            random.NextBytes(producerBuffer);

            var producerPosition = 0;
            var consumerPosition = 0;

            using (var ct = new CancellationTokenSource())
            {
                using (var s = new PayloadStream(null))
                {
                    Func <Task> reader = async() =>
                    {
                        while (consumerPosition < consumerBuffer.Length)
                        {
                            var readCount = Math.Min(consumerChunkCount, consumerBuffer.Length - consumerPosition);

                            var bytesRead = await s.ReadAsync(consumerBuffer, consumerPosition, readCount, ct.Token);

                            if (bytesRead == 0)
                            {
                                break;
                            }

                            consumerPosition += bytesRead;
                        }
                    };

                    Func <Task> writer = async() =>
                    {
                        while (producerPosition < producerBuffer.Length)
                        {
                            var writeCount = Math.Min(producerChunkCount, producerBuffer.Length - producerPosition);

                            await s.WriteAsync(producerBuffer, producerPosition, writeCount, ct.Token);

                            producerPosition += writeCount;

                            await Task.Yield();
                        }
                    };

                    var readTask  = reader();
                    var writeTask = writer();
                    await Task.WhenAll(readTask, writeTask);
                }
            }

            Assert.Equal(producerTotalCount, producerPosition);
            var consumableCount = Math.Min(producerTotalCount, consumerTotalCount);

            Assert.Equal(consumableCount, consumerPosition);
            Assert.Equal(producerBuffer.Take(consumableCount).ToArray(), consumerBuffer.Take(consumableCount).ToArray());
        }
예제 #21
0
        protected override void ExecuteOperation()
        {
            Debug.Assert(ItemCompletionRegister[Index] == false);

            PayloadItem item           = PayloadItems[Index];
            Guid        itemIdentifier = item.Identifier;

            bool skip = ItemSkipRegister != null && ItemSkipRegister.Contains(itemIdentifier);

            MuxItemResourceContainer itemContainer;
            bool activeResource = _activeItemResources.ContainsKey(itemIdentifier);

            if (activeResource)
            {
                itemContainer = _activeItemResources[itemIdentifier];
            }
            else
            {
                if (skip == false)
                {
                    itemContainer = CreateEtMSchemeResources(item);
                    if (Writing)
                    {
                        EmitHeader(itemContainer.Authenticator);
                    }
                    else
                    {
                        ConsumeHeader(itemContainer.Authenticator);
                    }
                }
                else
                {
                    itemContainer = new MuxItemResourceContainer(null, null, null);
                }
                _activeItemResources.Add(itemIdentifier, itemContainer);
            }

            int opLength = NextOperationLength();

            if (skip == false)
            {
                CipherStream itemEncryptor     = itemContainer.Encryptor;
                MacStream    itemAuthenticator = itemContainer.Authenticator;

                if (Writing)
                {
                    // Writing/multiplexing
                    if (itemEncryptor.BytesIn + opLength < item.ExternalLength)
                    {
                        // Normal operation
                        itemEncryptor.WriteExactly(item.StreamBinding, opLength);
                    }
                    else
                    {
                        // Final operation, or just prior to
                        if (itemContainer.Buffer.IsValueCreated == false)
                        {
                            // Redirect final ciphertext to buffer to account for possible expansion
                            itemAuthenticator.ReassignBinding(itemContainer.Buffer.Value, false, finish: false);
                        }
                        var remaining = (int)(item.ExternalLength - itemEncryptor.BytesIn);
                        if (remaining > 0)
                        {
                            while (remaining > 0)
                            {
                                int toRead = Math.Min(remaining, BufferSize);
                                int iterIn = item.StreamBinding.Read(Buffer, 0, toRead);
                                if (iterIn < toRead)
                                {
                                    throw new EndOfStreamException();
                                }
                                itemEncryptor.Write(Buffer, 0, iterIn); // Writing into recently-lazy-inited buffer
                                remaining -= iterIn;
                            }
                            itemEncryptor.Close();
                        }
                        var toWrite = (int)Math.Min(opLength, itemContainer.Buffer.Value.Length);
                        Debug.Print(DebugUtility.CreateReportString("FabricPayloadMux", "ExecuteOperation",
                                                                    "Multiplexing item: final stripe length", toWrite));

                        itemContainer.Buffer.Value.ReadTo(PayloadStream, toWrite);
                    }
                }
                else
                {
                    // Reading/demultiplexing
                    long readRemaining = item.InternalLength - itemEncryptor.BytesIn;
                    bool finalOp       = false;
                    if (readRemaining <= opLength)
                    {
                        // Final operation
                        opLength = (int)readRemaining;
                        finalOp  = true;
                        Debug.Print(DebugUtility.CreateReportString("FabricPayloadMux", "ExecuteOperation",
                                                                    "Demultiplexing item: final stripe length", opLength));
                    }
                    itemEncryptor.ReadExactly(item.StreamBinding, opLength, finalOp);
                }

                if ((Writing && itemEncryptor.BytesIn >= item.ExternalLength && itemContainer.Buffer.Value.Length == 0) ||
                    (Writing == false && itemEncryptor.BytesIn >= item.InternalLength))
                {
                    // Now that we're finished we need to do some extra things, then clean up
                    FinishItem(item, itemEncryptor, itemAuthenticator);
                }
            }
            else
            {
                // Skipping
                Debug.Assert(Writing == false, "Should not be skipping when writing!");

                if (itemContainer.SkippedLength == 0)
                {
                    // Start of item
                    PayloadStream.Seek(opLength, SeekOrigin.Current);
                    itemContainer.SkippedLength += opLength;
                }
                else if (itemContainer.SkippedLength + opLength >= item.InternalLength)
                {
                    int remainingToSkip = (int)(item.InternalLength - itemContainer.SkippedLength);
                    itemContainer.SkippedLength += remainingToSkip;
                    PayloadStream.Seek(remainingToSkip + GetTrailerLength(), SeekOrigin.Current);
                    // "Finish" item
                    _activeItemResources.Remove(item.Identifier);
                    // Mark the item as completed in the register
                    ItemCompletionRegister[Index] = true;
                    ItemsCompleted++;
                    Debug.Print(DebugUtility.CreateReportString("FabricPayloadMux", "ExecuteOperation", "[*** SKIPPED ITEM",
                                                                Index + " ***]"));
                }
                else
                {
                    PayloadStream.Seek(opLength, SeekOrigin.Current);
                    itemContainer.SkippedLength += opLength;
                }
            }
        }