public void VirtualNetworkStream_SingleThreadIntegrityTest_Ok() { var rnd = new Random(); var network = new VirtualNetwork(); using (var client = new VirtualNetworkStream(network, isServer: false)) using (var server = new VirtualNetworkStream(network, isServer: true)) { for (int i = 0; i < 100000; i++) { int bufferSize; byte[] writeFrame; bufferSize = rnd.Next(1, 2048); writeFrame = new byte[bufferSize]; rnd.NextBytes(writeFrame); uint writeChecksum = Fletcher32.Checksum(writeFrame, 0, writeFrame.Length); client.Write(writeFrame, 0, writeFrame.Length); var readFrame = new byte[writeFrame.Length]; server.Read(readFrame, 0, readFrame.Length); uint readChecksum = Fletcher32.Checksum(readFrame, 0, readFrame.Length); Assert.Equal(writeChecksum, readChecksum); } } }
public static uint Checksum(byte[] bytes, int offset, int count) { var fletcher32 = new Fletcher32(); fletcher32.Add(bytes, offset, count); return(fletcher32.Sum); }
public void VirtualNetwork_MultiThreadIntegrityTest_Ok() { var rnd = new Random(); var network = new VirtualNetwork(); var checksums = new ConcurrentDictionary <int, uint>(); Parallel.For(0, 100000, async(int i) => { int bufferSize = rnd.Next(5, 2048); byte[] writeFrame = new byte[bufferSize]; rnd.NextBytes(writeFrame); // First 4 bytes represent the sequence number. byte [] sequenceNo = BitConverter.GetBytes(i); sequenceNo.CopyTo(writeFrame, 0); uint writeChecksum = Fletcher32.Checksum(writeFrame, 0, writeFrame.Length); checksums.AddOrUpdate(i, writeChecksum, (seq, checkSum) => { Debug.Fail("Attempt to update checksum."); return(0); }); network.WriteFrame(i % 2 == 0, writeFrame); int delayMilliseconds = rnd.Next(0, 1000); await Task.Delay(delayMilliseconds); byte[] readFrame = network.ReadFrame(i % 2 == 1); uint readChecksum = Fletcher32.Checksum(readFrame, 0, readFrame.Length); int idx = BitConverter.ToInt32(readFrame, 0); Assert.Equal(checksums[idx], readChecksum); }); }
public void VirtualNetworkStream_MultiThreadIntegrityTest_Ok() { int maxFrameSize = 2048; Assert.True(maxFrameSize > sizeof(int) + 1); var rnd = new Random(); var rndLock = new object(); var network = new VirtualNetwork(); var checksumAndLengths = new ConcurrentDictionary <int, Tuple <uint, int> >(); object readLock = new object(); using (var client = new VirtualNetworkStream(network, isServer: false)) using (var server = new VirtualNetworkStream(network, isServer: true)) { Parallel.For(0, 100, (int i) => { int bufferSize; int delayMilliseconds; byte[] writeFrame; lock (rndLock) { bufferSize = rnd.Next(sizeof(int) + 1, maxFrameSize); delayMilliseconds = rnd.Next(0, 10); writeFrame = new byte[bufferSize]; rnd.NextBytes(writeFrame); } // First 4 bytes represent the sequence number. byte[] sequenceNo = BitConverter.GetBytes(i); sequenceNo.CopyTo(writeFrame, 0); uint writeChecksum = Fletcher32.Checksum(writeFrame, 0, writeFrame.Length); var writeFrameInfo = new Tuple <uint, int>(writeChecksum, writeFrame.Length); checksumAndLengths.AddOrUpdate(i, writeFrameInfo, (seq, checkSum) => { Debug.Fail("Attempt to update checksum."); return(new Tuple <uint, int>(0, 0)); }); client.WriteAsync(writeFrame, 0, writeFrame.Length).GetAwaiter().GetResult(); Task.Delay(delayMilliseconds).GetAwaiter().GetResult(); // First read the index to know how much data to read from this frame. var readFrame = new byte[maxFrameSize]; int readLen = server.ReadAsync(readFrame, 0, maxFrameSize).GetAwaiter().GetResult(); int idx = BitConverter.ToInt32(readFrame, 0); Tuple <uint, int> expectedFrameInfo = checksumAndLengths[idx]; Assert.Equal(expectedFrameInfo.Item2, readLen); uint readChecksum = Fletcher32.Checksum(readFrame, 0, readLen); Assert.Equal(expectedFrameInfo.Item1, readChecksum); }); } }
public void SendReceiveTest(AnyBarImage color) { const int ackTimeout = 1000; const int testTimeout = 30000; var datagram = Encoding.UTF8.GetBytes(color.ToString().ToLowerInvariant()); var datagramSize = datagram.Length; var address = IPAddress.Loopback; var server = new Socket(address.AddressFamily, SocketType.Dgram, ProtocolType.Udp); var port = server.BindToAnonymousPort(address); var client = new AnyBarClient(address, port); var receiverAck = new ManualResetEventSlim(); var senderAck = new ManualResetEventSlim(); var serverThread = new Thread(() => { using (server) { var endpoint = (IPEndPoint)server.LocalEndPoint; var remote = endpoint.Create(endpoint.Serialize()); var recvBuffer = new byte[datagramSize]; int received = server.ReceiveFrom(recvBuffer, SocketFlags.None, ref remote); Assert.Equal(datagramSize, received); var receivedChecksums = Fletcher32.Checksum(recvBuffer, 0, received); receiverAck.Set(); Assert.True(senderAck.Wait(ackTimeout)); senderAck.Reset(); } }); serverThread.Start(); using (client) { client.Change(color); Assert.True(receiverAck.Wait(ackTimeout)); receiverAck.Reset(); senderAck.Set(); } Assert.True(serverThread.Join(testTimeout)); }
public void VirtualNetwork_SingleThreadIntegrityTest_Ok() { var rnd = new Random(); var network = new VirtualNetwork(); for (int i = 0; i < 100000; i++) { int bufferSize = rnd.Next(1, 2048); byte [] writeFrame = new byte[bufferSize]; rnd.NextBytes(writeFrame); uint writeChecksum = Fletcher32.Checksum(writeFrame, 0, writeFrame.Length); network.WriteFrame(i % 2 == 0, writeFrame); byte [] readFrame = network.ReadFrame(i % 2 == 1); uint readChecksum = Fletcher32.Checksum(readFrame, 0, readFrame.Length); Assert.Equal(writeChecksum, readChecksum); } }
public static uint Checksum(byte[] bytes, int offset, int count) { var fletcher32 = new Fletcher32(); fletcher32.Add(bytes, offset, count); return fletcher32.Sum; }