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); } }
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); } }
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 }
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); } }