Example #1
0
        public void Run()
        {
            this.logger.WriteLine("Receive loop with {0} senders, {1:0.0} sec, send before receive={2}, receive buffer={3}...", this.senderCount, this.duration.TotalSeconds, this.sendBeforeReceive, this.receiveBufferSize);

            MemoryChannel channel = new MemoryChannel();
            int[] sentDataSizes = new int[] { 11, 19, 29, 41, 53, 71, 89, 101 };

            using (CancellationTokenSource cts = new CancellationTokenSource())
            {
                DataOracle oracle = new DataOracle();
                Sender[] senders = this.CreateSenders(channel, sentDataSizes, oracle);

                ValidatingReceiver receiver = new ValidatingReceiver(channel, this.logger, this.receiveBufferSize, oracle);

                Task<long>[] senderTasks = new Task<long>[senders.Length];
                Task<long> receiverTask = this.StartSendersAndReceiver(cts.Token, senders, receiver, senderTasks);
                Thread.Sleep(this.duration);

                cts.Cancel();
                Task.WaitAll(senderTasks);

                channel.Dispose();
                receiverTask.Wait();

                ValidateTransferredByteCount(senderTasks, receiverTask);
            }

            this.logger.WriteLine("Done.");
        }
        public void Dispose_is_idempotent()
        {
            MemoryChannel channel = new MemoryChannel();

            channel.Dispose();
            channel.Dispose();
        }
Example #3
0
 public Sender(MemoryChannel channel, Logger logger, int bufferSize, byte fill, Delay delay)
 {
     this.channel = channel;
     this.logger = logger;
     this.bufferSize = bufferSize;
     this.fill = fill;
     this.delay = delay;
 }
        public void Dispose_after_create_causes_subsequent_send_and_receive_to_throw_ObjectDisposed()
        {
            MemoryChannel channel = new MemoryChannel();

            channel.Dispose();

            Assert.Throws <ObjectDisposedException>(() => channel.Send(new byte[1]));
            Assert.Throws <ObjectDisposedException>(() => channel.ReceiveAsync(new byte[1]));
        }
        public void Send_then_receive_with_greater_data_size_completes_sync()
        {
            MemoryChannel channel = new MemoryChannel();

            channel.Send(new byte[] { 1, 2, 3 });

            byte[] receiveBuffer = new byte[4];
            AssertTaskCompleted(3, channel.ReceiveAsync(receiveBuffer));
            Assert.Equal(new byte[] { 1, 2, 3, 0 }, receiveBuffer);
        }
        public void Two_sends_then_receive_with_equal_data_size_completes_sync()
        {
            MemoryChannel channel = new MemoryChannel();

            channel.Send(new byte[] { 1, 2, 3 });
            channel.Send(new byte[] { 4, 5, 6 });

            byte[] receiveBuffer = new byte[6];
            AssertTaskCompleted(6, channel.ReceiveAsync(receiveBuffer));
            Assert.Equal(new byte[] { 1, 2, 3, 4, 5, 6 }, receiveBuffer);
        }
        public void Pending_receive_completes_after_send_with_greater_data_size()
        {
            MemoryChannel channel = new MemoryChannel();

            byte[]     receiveBuffer = new byte[3];
            Task <int> receiveTask   = AssertTaskPending(channel.ReceiveAsync(receiveBuffer));

            channel.Send(new byte[] { 1, 2, 3, 4 });

            AssertTaskCompleted(3, receiveTask);
            Assert.Equal(new byte[] { 1, 2, 3 }, receiveBuffer);
        }
        public void Dispose_completes_pending_receive_and_causes_subsequent_send_and_receive_to_throw_ObjectDisposed()
        {
            Task <int>    receiveTask;
            MemoryChannel channel = new MemoryChannel();

            receiveTask = AssertTaskPending(channel.ReceiveAsync(new byte[1]));

            channel.Dispose();
            AssertTaskCompleted(0, receiveTask);

            Assert.Throws <ObjectDisposedException>(() => channel.Send(new byte[1]));
            Assert.Throws <ObjectDisposedException>(() => channel.ReceiveAsync(new byte[1]));
        }
        public void Pending_receive_followed_by_another_receive_throws_InvalidOperation_without_affecting_first_receive()
        {
            MemoryChannel channel = new MemoryChannel();

            byte[]     receiveBuffer = new byte[1];
            Task <int> receiveTask   = AssertTaskPending(channel.ReceiveAsync(receiveBuffer));

            byte[] receiveBuffer2 = new byte[1];
            Assert.Throws <InvalidOperationException>(() => channel.ReceiveAsync(receiveBuffer2));

            channel.Send(new byte[] { 1 });

            AssertTaskCompleted(1, receiveTask);
            Assert.Equal(new byte[] { 1 }, receiveBuffer);
        }
Example #10
0
        public void Two_sends_then_three_receives_with_equal_data_size_completes_sync()
        {
            MemoryChannel channel = new MemoryChannel();

            channel.Send(new byte[] { 1, 2, 3 });
            channel.Send(new byte[] { 4, 5, 6 });

            byte[] receiveBuffer = new byte[2];
            AssertTaskCompleted(2, channel.ReceiveAsync(receiveBuffer));
            Assert.Equal(new byte[] { 1, 2 }, receiveBuffer);

            byte[] receiveBuffer2 = new byte[2];
            AssertTaskCompleted(2, channel.ReceiveAsync(receiveBuffer2));
            Assert.Equal(new byte[] { 3, 4 }, receiveBuffer2);

            byte[] receiveBuffer3 = new byte[2];
            AssertTaskCompleted(2, channel.ReceiveAsync(receiveBuffer3));
            Assert.Equal(new byte[] { 5, 6 }, receiveBuffer3);
        }
Example #11
0
        public void Pending_receive_completes_after_send_with_greater_data_size_followed_by_one_receive_to_read_excess_leaving_final_receive_pending()
        {
            MemoryChannel channel = new MemoryChannel();

            byte[]     receiveBuffer = new byte[3];
            Task <int> receiveTask   = AssertTaskPending(channel.ReceiveAsync(receiveBuffer));

            channel.Send(new byte[] { 1, 2, 3, 4, 5, 6 });

            AssertTaskCompleted(3, receiveTask);
            Assert.Equal(new byte[] { 1, 2, 3 }, receiveBuffer);

            byte[] receiveBuffer2 = new byte[3];
            AssertTaskCompleted(3, channel.ReceiveAsync(receiveBuffer2));
            Assert.Equal(new byte[] { 4, 5, 6 }, receiveBuffer2);

            byte[] receiveBuffer3 = new byte[1];
            AssertTaskPending(channel.ReceiveAsync(receiveBuffer3));
        }
Example #12
0
        public void Pending_receive_completes_after_send_with_equal_data_size_followed_by_another_send_and_receive()
        {
            MemoryChannel channel = new MemoryChannel();

            byte[]     receiveBuffer = new byte[3];
            Task <int> receiveTask   = AssertTaskPending(channel.ReceiveAsync(receiveBuffer));

            channel.Send(new byte[] { 1, 2, 3 });

            AssertTaskCompleted(3, receiveTask);
            Assert.Equal(new byte[] { 1, 2, 3 }, receiveBuffer);

            byte[]     receiveBuffer2 = new byte[3];
            Task <int> receiveTask2   = AssertTaskPending(channel.ReceiveAsync(receiveBuffer2));

            channel.Send(new byte[] { 4, 5, 6 });

            AssertTaskCompleted(3, receiveTask2);
            Assert.Equal(new byte[] { 4, 5, 6 }, receiveBuffer2);
        }
 public ValidatingReceiver(MemoryChannel channel, Logger logger, int bufferSize, DataOracle oracle)
 {
     this.receiver = new Receiver(channel, logger, bufferSize);
     this.oracle = oracle;
     this.receiver.DataReceived += this.OnDataReceived;
 }
Example #14
0
 public Receiver(MemoryChannel channel, Logger logger, int bufferSize)
 {
     this.channel = channel;
     this.logger = logger;
     this.bufferSize = bufferSize;
 }
Example #15
0
        private Sender[] CreateSenders(MemoryChannel channel, int[] sentDataSizes, DataOracle oracle)
        {
            Sender[] senders = new Sender[this.senderCount];
            for (int i = 0; i < senders.Length; ++i)
            {
                int bufferSize = sentDataSizes[i % sentDataSizes.Length];
                byte fill = (byte)(i + 1);
                senders[i] = new Sender(channel, this.logger, bufferSize, fill, new Delay(2, 1));
                oracle.AddPattern(fill, bufferSize);
            }

            return senders;
        }