Пример #1
0
 public void ShouldLogin()
 {
     var client = CreateClient(new MockServerSetup { OnlyLogin = true });
     var rcc = new RConClient(client, client.ServerSetup.Password);
     var connected = rcc.ConnectAsync().Result;
     Assert.IsTrue(connected, "not connected");
 }
Пример #2
0
        public void ShouldThrowOnLoginWithWrongPassword()
        {
            var client = CreateClient(new MockServerSetup { OnlyLogin = true });
            var rcc = new RConClient(client, "fnipw93457");

            bool threw = false;
            try
            {
                var connected = rcc.ConnectAsync().Result;
                Assert.IsFalse(connected, "should not return true");
            }
            catch (AggregateException aex)
            {
                if (aex.InnerExceptions.Count == 1
                    && aex.InnerExceptions[0] is InvalidCredentialException)
                {
                    threw = true;
                }
                else
                {
                    throw;
                }
            }
            catch (InvalidCredentialException)
            {
                threw = true;
            }

            if (!threw)
            {
                Assert.Fail("Should have thrown an Invalid Credential Exception");
            }
        }
Пример #3
0
        public void KickAll()
        {
            var rcc = new RConClient(this.host, this.port, this.password);
            rcc.ConnectAsync().Wait();

            for (int i = 0; i < 100; i++)
            {
                var cmd = string.Format("kick {0} SERVER IS RESTARTING", i);
                rcc.SendCommandAsync(cmd);
            }
        }
Пример #4
0
 /// <summary>
 ///   Initializes a new instance of <see cref="DatagramDispatcher" />
 ///   and establishes the <see cref="UdpClient" /> to be used.
 /// </summary>
 /// <param name="client"> The <see cref="RConClient" /> to be used to connect to the RCon server. </param>
 internal DatagramDispatcher(RConClient client)
 {
     this.Metrics = client.Metrics;
     this.DiscardConsoleMessages = client.DiscardConsoleMessages;
     this.KeepAlivePeriod = TimeSpan.FromSeconds(25);
     // throw new ArgumentException("Test shall not pass.");
     this.ConMsgsTracker = new SequenceTracker();
     this.CmdsTracker = new SequenceTracker();
     this.rconClient = client;
     this.UdpClient = client.UdpClient;
     this.ResponseDispatcher = new ResponseDispatcher();
     this.datagramSender = new DatagramSender(this);
     this.Log = LogManager.GetLogger(this.GetType());
     this.Start();
 }
Пример #5
0
        public async Task ShouldAcceptOutOfOrderCommandResponsesCorrectly()
        {
            var conf = new MockServerSetup
            {
                DisorderedMultiPacketResponses = true
            };
            var client = CreateClient(conf);
            var rcc = new RConClient(client, client.ServerSetup.Password);
            var connected = rcc.ConnectAsync().Result;
            Assert.IsTrue(connected, "not connected");

            var handler = rcc.SendCommand("getplayersmulti");
            Assert.IsNotNull(handler);

            CommandMultiPartResponseDatagram multiPartResponseDatagram = null;
            if (await handler.WaitForResponse())
            {
                multiPartResponseDatagram = handler.ResponseDatagram as CommandMultiPartResponseDatagram;
            }
            rcc.Close();

            Assert.IsNotNull(multiPartResponseDatagram);
            Assert.IsTrue(multiPartResponseDatagram.Body.StartsWith("Players on server:"));
            for (int i = 1; i <= 10; i++)
            {
                Assert.IsTrue(multiPartResponseDatagram.Body.Contains(
                    string.Format("(part {0:000}/010)", i)));
            }

            Debug.WriteLine("Response assembled: {0}", (object)multiPartResponseDatagram.Body);
            Debug.WriteLine("Client shutdown reason: {0}", rcc.ShutdownReason);

        }
Пример #6
0
 private static void RunUntilShutdown(RConClient rcc)
 {
     var connected = rcc.ConnectAsync().Result;
     Assert.IsTrue(connected, "not connected");
     rcc.WaitUntilShutdown();
     rcc.Close();
 }
Пример #7
0
        public void ShouldThrowWhenServerDown()
        {
            var conf = new MockServerSetup { LoginServerDown = true, OnlyLogin = true };
            var client = CreateClient(conf);
            var rcc = new RConClient(client, client.ServerSetup.Password);

            bool threw = false;
            try
            {
                var connected = rcc.ConnectAsync().Result;
                Assert.IsFalse(connected, "should not return true");
            }
            catch (AggregateException aex)
            {
                if (aex.InnerExceptions.Count == 1 && aex.InnerExceptions[0] is TimeoutException)
                {
                    threw = true;
                }
                else
                {
                    throw;
                }
            }
            catch (TimeoutException)
            {
                threw = true;
            }

            if (!threw)
            {
                Assert.Fail("Should have thrown a Timeout Exception");
            }
        }
Пример #8
0
        public void ShouldDetectDisconnectUnderHeavyLoad()
        {
            var conf = new MockServerSetup
            {
                LoadTestConsoleMessages = -1,
                DontAnswerKeepAlive = true,
                MaxRunSeconds = 40
            };

            var client = CreateClient(conf);
            var rcc = new RConClient(client, client.ServerSetup.Password);
            RunUntilShutdown(rcc);
            var serverMetrics = client.Server.GetMetrics();
            Debug.WriteLine("Console Messages generated by server: {0}", serverMetrics.TotalConsoleMessagesGenerated);
            Debug.WriteLine("Inbound Packets received by client: {0}", rcc.Metrics.InboundDatagramCount);
            Debug.WriteLine("Console Packets Acknowledgments received by server: {0}", serverMetrics.AckPacketsReceived);
            Debug.WriteLine("Keep Alive packets sent by client: {0}", rcc.Metrics.KeepAliveDatagramsSent);
            Debug.WriteLine("Keep Alive packets received by server: {0}", serverMetrics.KeepAlivePacketsReceived);
            Debug.WriteLine("Keep Alive packets acknowledged by server: {0}", rcc.Metrics.KeepAliveDatagramsAcknowledgedByServer);
            Debug.WriteLine("Client shutdown reason: {0}", rcc.ShutdownReason);
            Assert.IsTrue(rcc.Metrics.KeepAliveDatagramsSent > 0);
            Assert.IsTrue(serverMetrics.KeepAlivePacketsReceived > 0);
            Assert.IsTrue(rcc.Metrics.KeepAliveDatagramsAcknowledgedByServer == 0);
            Assert.IsTrue(rcc.ShutdownReason == ShutdownReason.NoResponseFromServer,
                "Shutdown reason should be NoResponseFromServer, it's {0}", rcc.ShutdownReason);
        }
Пример #9
0
        public async Task ShouldRetrySendingCommand()
        {
            var rcc = new RConClient("ip", 3333, "pass");
            var connected = await rcc.ConnectAsync();
            Assert.IsTrue(connected, "not connected");
            var handler1 = rcc.SendCommand(0, "missions");
            var handler2 = rcc.SendCommand(0, "missions");
            var handler3 = rcc.SendCommand(0, "#shutdown");
            Task.WaitAll(handler1.WaitForResponse(), handler2.WaitForResponse(), handler3.WaitForResponse());
            rcc.Close();

            Assert.IsTrue(handler1.Completed);
            Assert.IsTrue(handler2.Completed);
            Assert.IsTrue(handler3.Completed);
            var response1 = (CommandResponseDatagram)handler1.ResponseDatagram;
            var response2 = (CommandResponseDatagram)handler2.ResponseDatagram;
            var response3 = (CommandResponseDatagram)handler3.ResponseDatagram;
            Assert.AreEqual(response1.OriginalSequenceNumber, 0);
            Assert.AreEqual(response2.OriginalSequenceNumber, 0);
            Assert.AreEqual(response3.OriginalSequenceNumber, 0);
            string body1 = response1.Body;
            string body2 = response2.Body;
            string body3 = response3.Body;
            Assert.IsTrue(body1.Length > 0);
            Assert.IsTrue(body2.Length > 0);
            Assert.IsTrue(body3.Length > 0);
            
            // WOW. We can't retry sending commands with the same seq num, it executes 
            // the three of them including #shutdown. 
            // Maybe contact BattlEye with a bug report.
        }
Пример #10
0
        public void ShouldParseTonsOfPackets()
        {
            var conf = new MockServerSetup
            {
                LoadTestConsoleMessages = 50010,
#if TRACE
                MaxRunSeconds = 120,
#endif
                LoadTestOnly = true
            };
            var client = CreateClient(conf);
            var rcc = new RConClient(client, client.ServerSetup.Password);
            int parsedCount = 0;
            rcc.MessageReceived += (sender, args) => { parsedCount++; };

            RunUntilShutdown(rcc);
            Assert.IsTrue(parsedCount >= 50000, "parsedCount < 50000: it's {0}", parsedCount);
        }
Пример #11
0
        public void ShouldSendKeepAliveUnderHeavyLoad()
        {
            var conf = new MockServerSetup
            {
                LoadTestConsoleMessages = -1,
                KeepAliveOnly = true,
                MaxRunSeconds = 20
            };

            var client = CreateClient(conf);
            var rcc = new RConClient(client, client.ServerSetup.Password);
            RunUntilShutdown(rcc);
            var serverMetrics = client.Server.GetMetrics();
            Debug.WriteLine("Console Messages generated by server: {0}", serverMetrics.TotalConsoleMessagesGenerated);
            Debug.WriteLine("Inbound Packets received by client: {0}", rcc.Metrics.InboundDatagramCount);
            Debug.WriteLine("Console Packets Acknowledgments received by server: {0}", serverMetrics.AckPacketsReceived);
            Debug.WriteLine("Keep Alive packets received by server: {0}", serverMetrics.KeepAlivePacketsReceived);
            Debug.WriteLine("Keep Alive acknowlegments received by client: {0}", rcc.Metrics.KeepAliveDatagramsAcknowledgedByServer);
            Debug.WriteLine("Client shutdown reason: {0}", rcc.ShutdownReason);
            Assert.IsTrue(serverMetrics.KeepAlivePacketsReceived > 0,
                "Server didn't receive any keep alive packets");
            Assert.IsTrue(rcc.Metrics.KeepAliveDatagramsAcknowledgedByServer > 0,
                "Client didn't register server's keep alive acknowledgment");
        }
Пример #12
0
 private void SendCommand(string cmd)
 {
     var rcc = new RConClient(this.host, this.port, this.password);
     rcc.ConnectAsync().Wait();
     rcc.SendCommandAsync(cmd);
 }
Пример #13
0
        public void ShouldAcceptTonsOfPackets()
        {
            var conf = new MockServerSetup
            {
                LoadTestConsoleMessages = 50000,
#if TRACE
                MaxRunSeconds = 120,
#endif
                LoadTestOnly = true
            };
            var client = CreateClient(conf);
            var rcc = new RConClient(client, client.ServerSetup.Password) { DiscardConsoleMessages = true };
            RunUntilShutdown(rcc);
            Assert.IsTrue(rcc.Metrics.InboundDatagramCount > 50000);
        }
Пример #14
0
        public async Task ShouldParseMultipartCommandResponsesCorrectly()
        {
            var conf = new MockServerSetup();
            var client = CreateClient(conf);
            var rcc = new RConClient(client, client.ServerSetup.Password);
            var connected = rcc.ConnectAsync().Result;
            Assert.IsTrue(connected, "not connected");

            var handler = rcc.SendCommand("getplayersmulti");
            Assert.IsNotNull(handler);

            CommandMultiPartResponseDatagram multiPartResponseDatagram = null;
            if (await handler.WaitForResponse())
            {
                multiPartResponseDatagram = handler.ResponseDatagram as CommandMultiPartResponseDatagram;
            }

            Assert.IsNotNull(multiPartResponseDatagram);
            Assert.IsNotNull(multiPartResponseDatagram.Body);
            Assert.IsTrue(multiPartResponseDatagram.Body.StartsWith("Players on server:"));
            for (int i = 1; i <= 10; i++)
            {
                Assert.IsTrue(multiPartResponseDatagram.Body.Contains(
                    string.Format("(part {0:000}/010)", i)));
            }
            rcc.Close();
        }
Пример #15
0
        public async Task ShouldReturnCommandResponsesCorrectly()
        {
            var conf = new MockServerSetup();
            var client = CreateClient(conf);
            var rcc = new RConClient(client, client.ServerSetup.Password);
            var connected = rcc.ConnectAsync().Result;
            Assert.IsTrue(connected, "not connected");

            var handler = rcc.SendCommand("getplayers");
            Assert.IsNotNull(handler);

            CommandSinglePartResponseDatagram singlePartResponse = null;
            if (await handler.WaitForResponse())
            {
                singlePartResponse = handler.ResponseDatagram as CommandSinglePartResponseDatagram;
            }

            Assert.IsNotNull(singlePartResponse);
            Assert.IsTrue(singlePartResponse.Body.StartsWith("Players on server:"));
            rcc.Close();
        }
Пример #16
0
 public void ShouldDiscardRepeatedConsoleMessages()
 {
     var conf = new MockServerSetup
     {
         LoadTestConsoleMessages = 100,
         LoadTestOnly = true,
         RepeatedConsoleMessages = true
     };
     var client = CreateClient(conf);
     var rcc = new RConClient(client, client.ServerSetup.Password);
     RunUntilShutdown(rcc);
     Assert.IsTrue(rcc.Metrics.DispatchedConsoleMessages > 10);
     Assert.IsTrue(rcc.Metrics.DispatchedConsoleMessages < 52);
     Debug.WriteLine("Inbound Packets received by client: {0}", rcc.Metrics.InboundDatagramCount);
     Debug.WriteLine("Console messages dispatched by client: {0}", rcc.Metrics.DispatchedConsoleMessages);
 }
Пример #17
0
        public void ShouldNotifyAboutCorruptedPackets()
        {
            var conf = new MockServerSetup
            {
                LoadTestConsoleMessages = 100,
                LoadTestOnly = true,
                CorruptConsoleMessages = true
            };
            var client = CreateClient(conf);
            var rcc = new RConClient(client, client.ServerSetup.Password);

            int notificationsCount = 0;
            rcc.ConnectionProblem += (sender, args) =>
                                     { 
                                         if (args.ConnectionProblemType == ConnectionProblemType.Corrupted) notificationsCount++;
                                     };

            RunUntilShutdown(rcc);

            var serverMetrics = client.Server.GetMetrics();
            Debug.WriteLine("Console Messages generated by server: {0}", serverMetrics.TotalConsoleMessagesGenerated);
            Debug.WriteLine("Inbound Packets received by client: {0}", rcc.Metrics.InboundDatagramCount);
            Debug.WriteLine("Console Packets Acknowledgments received by server: {0}", serverMetrics.AckPacketsReceived);
            Debug.WriteLine("Keep Alive packets received by server: {0}", serverMetrics.KeepAlivePacketsReceived);
            Assert.IsTrue(notificationsCount == serverMetrics.TotalConsoleMessagesGenerated);
        }
Пример #18
0
        public void ShouldDiscardCorruptedPackets()
        {
            var conf = new MockServerSetup
            {
                LoadTestConsoleMessages = 100,
                LoadTestOnly = true,
                CorruptConsoleMessages = true
            };

            var client = CreateClient(conf);
            var rcc = new RConClient(client, client.ServerSetup.Password);
            RunUntilShutdown(rcc);
            Assert.IsTrue(rcc.Metrics.InboundDatagramCount > 100);
            Assert.IsTrue(rcc.Metrics.DispatchedConsoleMessages == 0);
        }