コード例 #1
0
        public void TestMalformedApplicationData()
        {
            IPEndPoint ep = new IPEndPoint(IPAddress.Loopback, 27510);

            IPEndPoint connectionEndPoint = ep;

            DtlsConnectionListener.ConnectionId connectionId = new ThreadLimitedUdpConnectionListener.ConnectionId();

            Semaphore signal = new Semaphore(0, int.MaxValue);

            using (MalformedDTLSListener listener = new MalformedDTLSListener(2, new IPEndPoint(IPAddress.Any, ep.Port), new TestLogger()))
                using (DtlsUnityConnection connection = new DtlsUnityConnection(new TestLogger(), ep))
                {
                    listener.SetCertificate(GetCertificateForServer());
                    connection.SetValidServerCertificates(GetCertificateForClient());

                    listener.NewConnection += (evt) =>
                    {
                        connectionEndPoint = evt.Connection.EndPoint;
                        connectionId       = ((ThreadLimitedUdpServerConnection)evt.Connection).ConnectionId;

                        signal.Release();
                        evt.Connection.Disconnected += (o, et) => {
                        };
                    };
                    connection.Disconnected += (o, evt) => {
                        signal.Release();
                    };

                    listener.Start();
                    connection.Connect();

                    // wait for the client to connect
                    signal.WaitOne(10);

                    ByteSpan data = new byte[5] {
                        0x01, 0x02, 0x03, 0x04, 0x05
                    };

                    Record record = new Record();
                    record.ContentType    = ContentType.ApplicationData;
                    record.Epoch          = 1;
                    record.SequenceNumber = 10;
                    record.Length         = (ushort)data.Length;

                    ByteSpan encoded = new byte[Record.Size + data.Length];
                    record.Encode(encoded);
                    data.CopyTo(encoded.Slice(Record.Size));

                    listener.InjectPacket(encoded, connectionEndPoint, connectionId);

                    // wait for the client to disconnect
                    listener.Dispose();
                    signal.WaitOne(100);
                }
        }
コード例 #2
0
        public void TestClientConnects()
        {
            IPEndPoint ep = new IPEndPoint(IPAddress.Loopback, 27510);

            bool serverConnected    = false;
            bool serverDisconnected = false;
            bool clientDisconnected = false;

            Semaphore signal = new Semaphore(0, int.MaxValue);

            using (DtlsConnectionListener listener = new DtlsConnectionListener(2, new IPEndPoint(IPAddress.Any, ep.Port), new TestLogger()))
                using (DtlsUnityConnection connection = new DtlsUnityConnection(new TestLogger(), ep))
                {
                    listener.SetCertificate(GetCertificateForServer());
                    connection.SetValidServerCertificates(GetCertificateForClient());

                    listener.NewConnection += (evt) =>
                    {
                        serverConnected = true;
                        signal.Release();
                        evt.Connection.Disconnected += (o, et) => {
                            serverDisconnected = true;
                        };
                    };
                    connection.Disconnected += (o, evt) => {
                        clientDisconnected = true;
                        signal.Release();
                    };

                    listener.Start();
                    connection.Connect();

                    // wait for the client to connect
                    signal.WaitOne(10);

                    listener.Dispose();

                    // wait for the client to disconnect
                    signal.WaitOne(100);

                    Assert.IsTrue(serverConnected);
                    Assert.IsTrue(clientDisconnected);
                    Assert.IsFalse(serverDisconnected);
                }
        }
コード例 #3
0
        public void PingDisconnectClientTest()
        {
#if DEBUG
            IPEndPoint ep = new IPEndPoint(IPAddress.Loopback, 27510);
            using (DtlsConnectionListener listener = (DtlsConnectionListener)CreateListener(2, new IPEndPoint(IPAddress.Any, ep.Port), new TestLogger()))
            {
                // Adjust the ping rate to end the test faster
                listener.NewConnection += (evt) =>
                {
                    var conn = (ThreadLimitedUdpServerConnection)evt.Connection;
                    conn.KeepAliveInterval           = 100;
                    conn.MissingPingsUntilDisconnect = 3;
                };

                listener.Start();

                for (int i = 0; i < 5; ++i)
                {
                    using (DtlsUnityConnection connection = (DtlsUnityConnection)CreateConnection(ep, new TestLogger()))
                    {
                        connection.KeepAliveInterval           = 100;
                        connection.MissingPingsUntilDisconnect = 3;
                        connection.Connect();

                        Thread.Sleep(10);

                        // After connecting, quietly stop responding to all messages to fake connection loss.
                        connection.TestDropRate = 1;

                        Thread.Sleep(500);    //Enough time for ~3 keep alive packets

                        Assert.AreEqual(ConnectionState.NotConnected, connection.State);
                    }
                }

                listener.DisconnectOldConnections(TimeSpan.FromMilliseconds(500), null);

                Assert.AreEqual(0, listener.PeerCount, "All clients disconnected, peer count should be zero.");
            }
#else
            Assert.Inconclusive("Only works in DEBUG");
#endif
        }
コード例 #4
0
        public void TestResentHandshakeConnects()
        {
            IPEndPoint captureEndPoint  = new IPEndPoint(IPAddress.Loopback, 27511);
            IPEndPoint listenerEndPoint = new IPEndPoint(IPAddress.Loopback, 27510);

            bool serverConnected    = false;
            bool serverDisconnected = false;
            bool clientDisconnected = false;

            Semaphore signal = new Semaphore(0, int.MaxValue);

            using (SocketCapture capture = new SocketCapture(captureEndPoint, listenerEndPoint))
                using (DtlsConnectionListener listener = new DtlsConnectionListener(2, new IPEndPoint(IPAddress.Any, listenerEndPoint.Port), new TestLogger()))
                    using (DtlsUnityConnection connection = new DtlsUnityConnection(new TestLogger(), captureEndPoint))
                    {
                        Semaphore listenerToConnectionThrottle = new Semaphore(0, int.MaxValue);
                        capture.SendToLocalSemaphore = listenerToConnectionThrottle;
                        Thread throttleThread = new Thread(() => {
                            // HelloVerifyRequest
                            listenerToConnectionThrottle.Release(1);
                            // ServerHello, Server Certificate
                            listenerToConnectionThrottle.Release(1);

                            // Trigger a resend of ServerHello, ServerCertificate
                            Thread.Sleep(1000);
                            listenerToConnectionThrottle.Release(1);


                            // ServerKeyExchange, ServerHelloDone
                            listenerToConnectionThrottle.Release(1);

                            // Trigger a resend of ServerKeyExchange, ServerHelloDone
                            Thread.Sleep(1000);
                            listenerToConnectionThrottle.Release(1);

                            capture.SendToLocalSemaphore = null;
                        });
                        throttleThread.Start();

                        listener.SetCertificate(GetCertificateForServer());
                        connection.SetValidServerCertificates(GetCertificateForClient());

                        listener.NewConnection += (evt) =>
                        {
                            serverConnected = true;
                            signal.Release();
                            evt.Connection.Disconnected += (o, et) => {
                                serverDisconnected = true;
                            };
                        };
                        connection.Disconnected += (o, evt) => {
                            clientDisconnected = true;
                            signal.Release();
                        };

                        listener.Start();
                        connection.Connect();

                        // wait for the client to connect
                        signal.WaitOne(10);

                        listener.Dispose();

                        // wait for the client to disconnect
                        signal.WaitOne(100);

                        Assert.IsTrue(serverConnected);
                        Assert.IsTrue(clientDisconnected);
                        Assert.IsFalse(serverDisconnected);
                    }
        }