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"); }
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"); } }
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); } }
/// <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(); }
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); }
private static void RunUntilShutdown(RConClient rcc) { var connected = rcc.ConnectAsync().Result; Assert.IsTrue(connected, "not connected"); rcc.WaitUntilShutdown(); rcc.Close(); }
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"); } }
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); }
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. }
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); }
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"); }
private void SendCommand(string cmd) { var rcc = new RConClient(this.host, this.port, this.password); rcc.ConnectAsync().Wait(); rcc.SendCommandAsync(cmd); }
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); }
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(); }
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(); }
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); }
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); }
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); }