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(); }
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); }
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); }
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)); }
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; }
public Receiver(MemoryChannel channel, Logger logger, int bufferSize) { this.channel = channel; this.logger = logger; this.bufferSize = bufferSize; }
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; }