Пример #1
0
        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);
                    }
                }
        }
Пример #2
0
        public static uint Checksum(byte[] bytes, int offset, int count)
        {
            var fletcher32 = new Fletcher32();

            fletcher32.Add(bytes, offset, count);
            return(fletcher32.Sum);
        }
Пример #3
0
        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);
            });
        }
Пример #4
0
        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);
                    });
                }
        }
Пример #5
0
        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));
        }
Пример #6
0
        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);
            }
        }
Пример #7
0
 public static uint Checksum(byte[] bytes, int offset, int count)
 {
     var fletcher32 = new Fletcher32();
     fletcher32.Add(bytes, offset, count);
     return fletcher32.Sum;
 }