public void SendMessage_Callback()
        {
            var clock        = new Clock();
            var logger       = new ConsoleLogger(clock);
            var firstClient  = new QueuedUdpSocket(logger);
            var secondClient = new QueuedUdpSocket(logger);

            firstClient.Start();
            secondClient.Start();

            var data           = new byte[] { 1, };
            var remoteEndPoint = new IPEndPoint(IPAddress.Loopback, secondClient.LocalEndPoint.Port);

            firstClient.Send(data, remoteEndPoint);

            Datagram datagram;

            while (!secondClient.TryDequeueNext(out datagram))
            {
            }
            Assert.AreEqual(1, datagram.Data[0]);
            data = new byte[] { 2, };
            secondClient.Send(data, datagram.IpEndPoint);

            while (!firstClient.TryDequeueNext(out datagram))
            {
            }
            Assert.AreEqual(2, datagram.Data[0]);

            firstClient.Close();
            secondClient.Close();
        }
        public void Connect(IAccount addAccount, IAccount connectAccount)
        {
            var clock          = new Clock();
            var playerFactory  = new PlayerFactory();
            var playerDatabase = new PlayerDiskDatabase <IPlayer, IPlayerFactory <IPlayer> >(testDatabasePath, false);
            var logger         = new ConsoleLogger(clock);

            var room   = new RoomUdpSocket <IPlayer, IPlayerFactory <IPlayer> >(0, "Test Room #0", clock, playerFactory, playerDatabase, logger);
            var client = new QueuedUdpSocket(logger);

            room.Start();
            client.Start();

            room.AddPlayer(addAccount, out Token connectToken);

            var remoteEndPoint = new IPEndPoint(IPAddress.Loopback, room.LocalEndPoint.Port);

            client.Send(new ConnectUdpRequest(connectAccount.ID, connectToken, remoteEndPoint));

            Datagram datagram;

            while (!client.TryDequeueNext(out datagram))
            {
            }
            Assert.AreEqual((byte)RoomDatagramType.Connect, datagram.Type);

            var response = new ConnectUdpResponse(datagram);

            Assert.AreEqual((byte)ConnectUdpResponse.ResultType.Success, response.result);

            room.Close();
            client.Close();
        }
        public void SendMessage_ToClosed()
        {
            var clock        = new Clock();
            var logger       = new ConsoleLogger(clock);
            var firstClient  = new QueuedUdpSocket(logger);
            var secondClient = new QueuedUdpSocket(logger);

            firstClient.Start();
            secondClient.Start();

            var data           = new byte[] { 1, };
            var remoteEndPoint = new IPEndPoint(IPAddress.Loopback, secondClient.LocalEndPoint.Port);

            secondClient.Close();

            firstClient.Send(data, remoteEndPoint);
            firstClient.Close();
        }