Skip to content
This repository was archived by the owner on Dec 23, 2022. It is now read-only.

Commit f64c534

Browse files
committed
Added more tests
Fixed coverage results showing test assembly
1 parent d05577d commit f64c534

File tree

3 files changed

+232
-66
lines changed

3 files changed

+232
-66
lines changed

RCONServerLib.Tests/Tests.cs

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
using System;
2+
using System.IO;
3+
using System.Net;
4+
using RCONServerLib.Utils;
25
using Xunit;
36

47
namespace RCONServerLib.Tests
@@ -50,5 +53,146 @@ public void RconPacketTypeTest()
5053
0xFF, 0xFF, 0x00, 0x00 // Type
5154
}));
5255
}
56+
57+
[Fact]
58+
public void IpPatternMatchTest()
59+
{
60+
Assert.True(IpExtension.Match("127.0.0.1", "127.0.0.1"));
61+
Assert.True(IpExtension.Match("192.*.*.*", "192.168.178.1"));
62+
Assert.True(IpExtension.Match("192.*.*.*", "192.255.255.255"));
63+
64+
Assert.False(IpExtension.Match("127.0.0.1", "127.0.0.2"));
65+
Assert.False(IpExtension.Match("127.0.0.1", "127.0.0.9"));
66+
Assert.False(IpExtension.Match("192.*.*.*", "178.75.68.49"));
67+
}
68+
69+
[Fact]
70+
public void RconPacketSuccessTest()
71+
{
72+
var packet = new RemoteConPacket(new byte[]
73+
{
74+
0x0A, 0x00, 0x00, 0x00, // Size
75+
0x02, 0x00, 0x00, 0x00, // Id
76+
0x03, 0x00, 0x00, 0x00, // Type
77+
0x00,
78+
0x00,
79+
});
80+
81+
Assert.Equal(2, packet.Id);
82+
Assert.Equal(10, packet.Size);
83+
Assert.Equal(RemoteConPacket.PacketType.Auth, packet.Type);
84+
}
85+
86+
[Fact]
87+
public void RconPacketGetBytesTest()
88+
{
89+
var testBytes = new byte[]
90+
{
91+
0x0A, 0x00, 0x00, 0x00, // Size
92+
0x02, 0x00, 0x00, 0x00, // Id
93+
0x03, 0x00, 0x00, 0x00, // Type
94+
0x00,
95+
0x00,
96+
};
97+
var packet = new RemoteConPacket(2, RemoteConPacket.PacketType.Auth, "");
98+
99+
var packetBytes = packet.GetBytes();
100+
for (var index = 0; index < testBytes.Length; index++)
101+
Assert.Equal(testBytes[index], packetBytes[index]);
102+
}
103+
104+
[Fact]
105+
public void ExtendedBinaryReaderTest()
106+
{
107+
var testBytes = new byte[]
108+
{
109+
0x15, 0x00, 0x00, 0x00, // Size
110+
0x02, 0x00, 0x00, 0x00, // Id
111+
0x03, 0x00, 0x00, 0x00, // Type
112+
0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64, 0x00,
113+
0x00,
114+
};
115+
using(var ms = new MemoryStream(testBytes))
116+
{
117+
using(var reader = new BinaryReaderExt(ms))
118+
{
119+
var sizeTestValue = reader.ReadInt32LittleEndian();
120+
Assert.Equal(21, sizeTestValue);
121+
var idTestValue = reader.ReadInt32LittleEndian();
122+
Assert.Equal(2, idTestValue);
123+
var typeTestValue = reader.ReadInt32LittleEndian();
124+
Assert.Equal(3, typeTestValue);
125+
var payloadTestValue = reader.ReadAscii();
126+
Assert.Equal("Hello World", payloadTestValue);
127+
}
128+
}
129+
}
130+
131+
[Fact]
132+
public void RemoteConProcessPacketTest()
133+
{
134+
var server = new RemoteConServer(IPAddress.Any, 27015);
135+
server.CommandManager.Add("test", "Test", (command, args) => { return "test"; });
136+
137+
var client = new RemoteConClient(server);
138+
139+
// Auth wrong test
140+
client.ProcessPacket(new byte[]
141+
{
142+
0x15, 0x00, 0x00, 0x00, // Size
143+
0x02, 0x00, 0x00, 0x00, // Id
144+
0x03, 0x00, 0x00, 0x00, // Type
145+
0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64, 0x00,
146+
0x00,
147+
});
148+
149+
// Auth correct test
150+
client.ProcessPacket(new byte[]
151+
{
152+
0x1D, 0x00, 0x00, 0x00, // Size
153+
0x02, 0x00, 0x00, 0x00, // Id
154+
0x03, 0x00, 0x00, 0x00, // Type
155+
0x73, 0x75, 0x70, 0x65, 0x72, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6F, 0x72, 0x64, 0x00,
156+
0x00,
157+
});
158+
client.Authenticated = true;
159+
160+
// No command found test
161+
client.ProcessPacket(new byte[]
162+
{
163+
0x15, 0x00, 0x00, 0x00, // Size
164+
0x02, 0x00, 0x00, 0x00, // Id
165+
0x02, 0x00, 0x00, 0x00, // Type
166+
0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64, 0x00,
167+
0x00,
168+
});
169+
// Command test
170+
client.ProcessPacket(new byte[]
171+
{
172+
0x0E, 0x00, 0x00, 0x00, // Size
173+
0x02, 0x00, 0x00, 0x00, // Id
174+
0x02, 0x00, 0x00, 0x00, // Type
175+
0x74, 0x65, 0x73, 0x74, 0x00,
176+
0x00,
177+
});
178+
// Empty payload test
179+
client.ProcessPacket(new byte[]
180+
{
181+
0x0A, 0x00, 0x00, 0x00, // Size
182+
0x02, 0x00, 0x00, 0x00, // Id
183+
0x02, 0x00, 0x00, 0x00, // Type
184+
0x00,
185+
0x00,
186+
});
187+
// Type other than execcommand
188+
client.ProcessPacket(new byte[]
189+
{
190+
0x0E, 0x00, 0x00, 0x00, // Size
191+
0x02, 0x00, 0x00, 0x00, // Id
192+
0x00, 0x00, 0x00, 0x00, // Type
193+
0x74, 0x65, 0x73, 0x74, 0x00,
194+
0x00,
195+
});
196+
}
53197
}
54198
}

RCONServerLib/RemoteConClient.cs

Lines changed: 87 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,23 @@ internal class RemoteConClient
1313
private readonly NetworkStream _ns;
1414
private readonly RemoteConServer _remoteConServer;
1515
private readonly TcpClient _tcp;
16-
private bool _authenticated;
16+
internal bool Authenticated;
1717
private int _authTries;
1818

1919
private byte[] _buffer;
2020

21-
private bool _connected;
21+
internal bool Connected;
22+
23+
private bool _isUnitTest;
2224

2325
public RemoteConClient(TcpClient tcp, RemoteConServer remoteConServer)
2426
{
2527
_tcp = tcp;
2628
_remoteConServer = remoteConServer;
2729

2830
_ns = tcp.GetStream();
29-
_connected = true;
30-
_authenticated = false;
31+
Connected = true;
32+
Authenticated = false;
3133

3234
try
3335
{
@@ -46,12 +48,21 @@ public RemoteConClient(TcpClient tcp, RemoteConServer remoteConServer)
4648
}
4749
}
4850

51+
internal RemoteConClient(RemoteConServer remoteConServer)
52+
{
53+
_remoteConServer = remoteConServer;
54+
_isUnitTest = true;
55+
}
56+
4957
/// <summary>
5058
/// Closes the connection with the client
5159
/// </summary>
5260
private void CloseConnection()
5361
{
54-
_connected = false;
62+
if (_isUnitTest)
63+
return;
64+
65+
Connected = false;
5566

5667
if (!_tcp.Connected)
5768
return;
@@ -67,7 +78,10 @@ private void CloseConnection()
6778
/// <exception cref="Exception">Not connected</exception>
6879
private void SendPacket(RemoteConPacket packet)
6980
{
70-
if (!_connected)
81+
if (_isUnitTest)
82+
return;
83+
84+
if (!Connected)
7185
throw new Exception("Not connected.");
7286

7387
var ackBytes = packet.GetBytes();
@@ -83,7 +97,7 @@ private void OnPacket(IAsyncResult result)
8397
try
8498
{
8599
var bytesRead = _ns.EndRead(result);
86-
if (!_connected)
100+
if (!Connected)
87101
{
88102
CloseConnection();
89103
return;
@@ -111,86 +125,94 @@ private void OnPacket(IAsyncResult result)
111125
/*var buffer = new byte[bytesRead];
112126
Array.Copy(_buffer, 0, buffer, 0, bytesRead);*/
113127

114-
var packet = new RemoteConPacket(_buffer);
128+
ProcessPacket(_buffer);
115129

116-
// Do not allow any other packets than auth to be sent when client is not authenticated
117-
if (!_authenticated)
130+
if (!_tcp.Connected)
131+
return;
132+
133+
if (!Connected)
118134
{
119-
if (packet.Type != RemoteConPacket.PacketType.Auth)
120-
CloseConnection();
135+
CloseConnection();
136+
return;
137+
}
121138

122-
_authTries++;
139+
_buffer = new byte[MaxAllowedPacketSize];
140+
_ns.BeginRead(_buffer, 0, MaxAllowedPacketSize, OnPacket, null);
141+
}
142+
catch (Exception ex)
143+
{
144+
Console.WriteLine(ex);
145+
}
146+
}
123147

124-
if (packet.Payload == _remoteConServer.Password)
125-
{
126-
_authenticated = true;
148+
internal void ProcessPacket(byte[] rawPacket)
149+
{
150+
var packet = new RemoteConPacket(rawPacket);
127151

128-
if (!_remoteConServer.SendAuthImmediately)
129-
SendPacket(new RemoteConPacket(packet.Id, RemoteConPacket.PacketType.ResponseValue, ""));
152+
// Do not allow any other packets than auth to be sent when client is not authenticated
153+
if (!Authenticated)
154+
{
155+
if (packet.Type != RemoteConPacket.PacketType.Auth)
156+
CloseConnection();
130157

131-
SendPacket(new RemoteConPacket(packet.Id, RemoteConPacket.PacketType.ExecCommand, ""));
132-
}
133-
else
134-
{
135-
if (_authTries >= _remoteConServer.MaxPasswordTries)
136-
{
137-
CloseConnection();
138-
return;
139-
}
158+
_authTries++;
159+
160+
if (packet.Payload == _remoteConServer.Password)
161+
{
162+
Authenticated = true;
140163

141-
if (!_remoteConServer.SendAuthImmediately)
142-
SendPacket(new RemoteConPacket(packet.Id, RemoteConPacket.PacketType.ResponseValue, ""));
164+
if (!_remoteConServer.SendAuthImmediately)
165+
SendPacket(new RemoteConPacket(packet.Id, RemoteConPacket.PacketType.ResponseValue, ""));
143166

144-
SendPacket(new RemoteConPacket(-1, RemoteConPacket.PacketType.ExecCommand, ""));
145-
}
167+
SendPacket(new RemoteConPacket(packet.Id, RemoteConPacket.PacketType.ExecCommand, ""));
146168
}
147169
else
148170
{
149-
// Invalid packet type.
150-
if (packet.Type != RemoteConPacket.PacketType.ExecCommand)
171+
if (_authTries >= _remoteConServer.MaxPasswordTries)
151172
{
152-
if (_remoteConServer.InvalidPacketKick)
153-
CloseConnection();
173+
CloseConnection();
154174
return;
155175
}
156176

157-
if (packet.Payload == "")
158-
{
159-
if (_remoteConServer.EmptyPayloadKick)
160-
CloseConnection();
161-
return;
162-
}
177+
if (!_remoteConServer.SendAuthImmediately)
178+
SendPacket(new RemoteConPacket(packet.Id, RemoteConPacket.PacketType.ResponseValue, ""));
163179

164-
var args = ArgumentParser.ParseLine(packet.Payload);
165-
var cmd = args[0];
166-
args.RemoveAt(0);
167-
var command = _remoteConServer.CommandManager.GetCommand(cmd);
168-
if (command == null)
169-
{
170-
SendPacket(new RemoteConPacket(packet.Id, RemoteConPacket.PacketType.ResponseValue,
171-
"Invalid command \"" + packet.Payload + "\""));
172-
}
173-
else
174-
{
175-
var commandResult = command.Func(cmd, args);
176-
// TODO: Split packets?
177-
SendPacket(new RemoteConPacket(packet.Id, RemoteConPacket.PacketType.ResponseValue,
178-
commandResult));
179-
}
180+
SendPacket(new RemoteConPacket(-1, RemoteConPacket.PacketType.ExecCommand, ""));
181+
}
182+
}
183+
else
184+
{
185+
// Invalid packet type.
186+
if (packet.Type != RemoteConPacket.PacketType.ExecCommand)
187+
{
188+
if (_remoteConServer.InvalidPacketKick)
189+
CloseConnection();
190+
return;
180191
}
181192

182-
if (!_connected)
193+
if (packet.Payload == "")
183194
{
184-
CloseConnection();
195+
if (_remoteConServer.EmptyPayloadKick)
196+
CloseConnection();
185197
return;
186198
}
187199

188-
_buffer = new byte[MaxAllowedPacketSize];
189-
_ns.BeginRead(_buffer, 0, MaxAllowedPacketSize, OnPacket, null);
190-
}
191-
catch (Exception ex)
192-
{
193-
Console.WriteLine(ex);
200+
var args = ArgumentParser.ParseLine(packet.Payload);
201+
var cmd = args[0];
202+
args.RemoveAt(0);
203+
var command = _remoteConServer.CommandManager.GetCommand(cmd);
204+
if (command == null)
205+
{
206+
SendPacket(new RemoteConPacket(packet.Id, RemoteConPacket.PacketType.ResponseValue,
207+
"Invalid command \"" + packet.Payload + "\""));
208+
}
209+
else
210+
{
211+
var commandResult = command.Func(cmd, args);
212+
// TODO: Split packets?
213+
SendPacket(new RemoteConPacket(packet.Id, RemoteConPacket.PacketType.ResponseValue,
214+
commandResult));
215+
}
194216
}
195217
}
196218
}

appveyor.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ before_build:
3838
build_script:
3939
- msbuild /verbosity:quiet "RCON.sln"
4040
test_script:
41-
- .\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -target:"%xunit20%\xunit.console.x86.exe" -targetargs:"RCONServerLib.Tests\bin\Release\RCONServerLib.Tests.dll -noshadow" -output:"coverage.xml" -filter:"+RCONServerLib* -RCONServerLib.Tests*"
41+
- .\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -target:"%xunit20%\xunit.console.x86.exe" -targetargs:"RCONServerLib.Tests\bin\Release\RCONServerLib.Tests.dll -noshadow" -output:"coverage.xml" -filter:"+[*]* -[*.tests]* -[*.Tests]*"
4242
after_test:
4343
- ps: |
4444
$env:PATH = 'C:\msys64\usr\bin;' + $env:PATH

0 commit comments

Comments
 (0)