From f2189b417b543bea5add24f5a324b328fa8dbfac Mon Sep 17 00:00:00 2001 From: Skipper Date: Sun, 2 Feb 2025 21:32:14 +0000 Subject: Writing tests, and checking against existing packet decoders --- lib/PacketManager/PacketManager.py | 2 +- lib/PacketManager/packets/FSNETCMD_ADDOBJECT.py | 16 ++++---- lib/PacketManager/packets/FSNETCMD_JOINREQUEST.py | 2 +- lib/PacketManager/packets/FSNETCMD_LOADFIELD.py | 4 +- lib/PacketManager/packets/FSNETCMD_LOGON.py | 16 +++++++- lib/__init__.py | 0 tests/__init__.py | 0 tests/packet01_logon_test.py | 46 +++++++++++++++++++++++ tests/packet04_loadfield_test.py | 38 +++++++++++++++++++ tests/packet05_addobject_test.py | 39 +++++++++++++++++++ tests/packet08_joinrequest_test.py | 31 +++++++++++++++ tests/packet09_joinapproval_test.py | 26 +++++++++++++ 12 files changed, 208 insertions(+), 12 deletions(-) create mode 100644 lib/__init__.py create mode 100644 tests/__init__.py create mode 100644 tests/packet01_logon_test.py create mode 100644 tests/packet04_loadfield_test.py create mode 100644 tests/packet05_addobject_test.py create mode 100644 tests/packet08_joinrequest_test.py create mode 100644 tests/packet09_joinapproval_test.py diff --git a/lib/PacketManager/PacketManager.py b/lib/PacketManager/PacketManager.py index ea0d91b..847d55c 100644 --- a/lib/PacketManager/PacketManager.py +++ b/lib/PacketManager/PacketManager.py @@ -2,7 +2,7 @@ from struct import unpack, pack from PacketManager.packets import MESSAGE_TYPES, FSWEAPON_DICT, GUIDEDWEAPONS -class PackageManager: +class PacketManager: def __init__(self): pass diff --git a/lib/PacketManager/packets/FSNETCMD_ADDOBJECT.py b/lib/PacketManager/packets/FSNETCMD_ADDOBJECT.py index f2e831e..ef7f785 100644 --- a/lib/PacketManager/packets/FSNETCMD_ADDOBJECT.py +++ b/lib/PacketManager/packets/FSNETCMD_ADDOBJECT.py @@ -26,15 +26,15 @@ class FSNETCMD_ADDOBJECT: #5 self.decode() def decode(self): - self.object_type, self.net_type = unpack("hh", self.buffer[4:8]) + self.object_type, self.net_type = unpack("HH", self.buffer[4:8]) #If object_type = 0, then it's an aircraft, and client will send # FSNETREADBACK_ADDAIRPLANE #If object_types = 1, then it's a ground object, and client will send # FSNETREADBACK_ADDGROUND self.object_id = unpack("I", self.buffer[8:12])[0] self.iff, _ = unpack("hh", self.buffer[12:16]) - self.pos = unpack("fff", self.buffer[16:28]) - self.atti = unpack("fff", self.buffer[28:40]) + self.pos = list(unpack("fff", self.buffer[16:28])) + self.atti = list(unpack("fff", self.buffer[28:40])) self.identifier = unpack("32s", self.buffer[40:72])[0].decode().strip('\x00') self.substrname = unpack("32s", self.buffer[72:104])[0].decode().strip('\x00') self.ysfid = unpack("I", self.buffer[104:108])[0] @@ -52,10 +52,12 @@ class FSNETCMD_ADDOBJECT: #5 flags, flags0, outside_radius, aircraft_class=None, aircraft_category=None, pilot=None, with_size:bool=False): - buffer = pack("IHHIHHfff32s32sIIIf", 5, object_type, net_type, object_id, - iff, 0, pos[0], pos[1], pos[2], atti[0], atti[1], atti[2], - identifier.encode(), substrname.encode(), ysfid, flags, - flags0, outside_radius) + buffer = pack('IHH', 5, object_type, net_type) + buffer += pack('IHHffffff', object_id, iff, 0, pos[0], pos[1], pos[2], atti[0], atti[1], atti[2]) + buffer += pack('32s32sI', identifier.encode(), substrname.encode(), ysfid) + buffer += pack('II', flags, flags0) + buffer += pack('f', outside_radius) + if aircraft_class and aircraft_category: buffer += pack("hhh", aircraft_class, aircraft_category, 0) if pilot: diff --git a/lib/PacketManager/packets/FSNETCMD_JOINREQUEST.py b/lib/PacketManager/packets/FSNETCMD_JOINREQUEST.py index 0df7287..7796599 100644 --- a/lib/PacketManager/packets/FSNETCMD_JOINREQUEST.py +++ b/lib/PacketManager/packets/FSNETCMD_JOINREQUEST.py @@ -23,7 +23,7 @@ class FSNETCMD_JOINREQUEST: #8 @staticmethod def encode(iff, aircraft, start_pos, fuel, smoke, with_size:bool=False): buffer = pack("IHH32s32sHHH", 8, iff, 0, aircraft.encode(), - start_pos.encode(), 0, fuel, smoke) + start_pos.encode(), 1, fuel, smoke) if with_size: return pack("I",len(buffer))+buffer return buffer \ No newline at end of file diff --git a/lib/PacketManager/packets/FSNETCMD_LOADFIELD.py b/lib/PacketManager/packets/FSNETCMD_LOADFIELD.py index 2994591..2184f7d 100644 --- a/lib/PacketManager/packets/FSNETCMD_LOADFIELD.py +++ b/lib/PacketManager/packets/FSNETCMD_LOADFIELD.py @@ -21,7 +21,9 @@ class FSNETCMD_LOADFIELD: #4 @staticmethod def encode(field, flags, pos, atti, with_size:bool=False): - buffer = pack("I32sIffffff", 4, field.encode(), flags, pos[0], pos[1], + if isinstance(field, str): + field = field.encode() + buffer = pack("I32sIffffff", 4, field, flags, pos[0], pos[1], pos[2], atti[0], atti[1], atti[2]) if with_size: return pack("I",len(buffer))+buffer diff --git a/lib/PacketManager/packets/FSNETCMD_LOGON.py b/lib/PacketManager/packets/FSNETCMD_LOGON.py index 84d6c86..4787e63 100644 --- a/lib/PacketManager/packets/FSNETCMD_LOGON.py +++ b/lib/PacketManager/packets/FSNETCMD_LOGON.py @@ -23,6 +23,11 @@ class FSNETCMD_LOGON: #1 self.alias = self.buffer[24:].decode().strip('\x00') else: self.alias = self.username + if isinstance(self.username,bytes): + self.username = self.username.decode().strip('\x00') + if isinstance(self.alias,bytes): + self.alias = self.alias.decode().strip('\x00') + @staticmethod #Method to create a logon packet, if required. def encode(username, version, with_size:bool=False): @@ -32,9 +37,16 @@ class FSNETCMD_LOGON: #1 else: shortform = username alias = None - buffer = pack("I16sI", 1, shortform.encode(), version) + if isinstance(shortform,str): + shortform = shortform.encode() + buffer = pack("I16sI", 1, shortform, version) if alias: - buffer += alias.encode() + if isinstance(alias,str): + alias = alias.encode() + if len(alias)<200: + alias = alias.ljust(200,b'\x00') + alias += b'\x00\x00\x00\x00' + buffer += alias if with_size: return pack("I",len(buffer))+buffer diff --git a/lib/__init__.py b/lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/packet01_logon_test.py b/tests/packet01_logon_test.py new file mode 100644 index 0000000..9650585 --- /dev/null +++ b/tests/packet01_logon_test.py @@ -0,0 +1,46 @@ +import unittest +import sys +import os + +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from lib.PacketManager.packets.FSNETCMD_LOGON import FSNETCMD_LOGON + +class TestFSNETCMD_LOGON(unittest.TestCase): + + def test_decode(self): + buffer = b'\x01\x00\x00\x00User1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99x3\x01' + packet = FSNETCMD_LOGON(buffer) + self.assertEqual(packet.username, 'User1') + self.assertEqual(packet.version, 20150425) + self.assertEqual(packet.alias, 'User1') + + def test_decode_with_alias(self): + buffer = b'\x01\x00\x00\x00ExtraLongUserna\x00\x99x3\x01ExtraLongUsernameThatIsTooLongForYS\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + packet = FSNETCMD_LOGON(buffer) + self.assertEqual(packet.username, 'ExtraLongUserna') + self.assertEqual(packet.version, 20150425) + self.assertEqual(packet.alias, 'ExtraLongUsernameThatIsTooLongForYS') + + def test_encode(self): + username = "User1" + version = 20150425 + buffer = FSNETCMD_LOGON.encode(username, version) + expected_buffer = b'\x01\x00\x00\x00User1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99x3\x01' + self.assertEqual(buffer, expected_buffer) + + def test_encode_with_alias(self): + username = "ExtraLongUsernameThatIsTooLongForYS" + version = 20150425 + buffer = FSNETCMD_LOGON.encode(username, version) + expected_buffer = b'\x01\x00\x00\x00ExtraLongUserna\x00\x99x3\x01ExtraLongUsernameThatIsTooLongForYS\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + self.assertEqual(buffer, expected_buffer) + + def test_encode_with_size(self): + username = "User1" + version = 20150425 + buffer = FSNETCMD_LOGON.encode(username, version, with_size=True) + expected_buffer = b'\x18\x00\x00\x00\x01\x00\x00\x00User1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99x3\x01' + self.assertEqual(buffer, expected_buffer) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/tests/packet04_loadfield_test.py b/tests/packet04_loadfield_test.py new file mode 100644 index 0000000..a9004be --- /dev/null +++ b/tests/packet04_loadfield_test.py @@ -0,0 +1,38 @@ +import unittest +import sys +import os + +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from lib.PacketManager.packets.FSNETCMD_LOADFIELD import FSNETCMD_LOADFIELD +from struct import pack + +class TestFSNETCMD_LOADFIELD(unittest.TestCase): + + def test_decode(self): + buffer = b'\x04\x00\x00\x00ISLAND_GOURD\x00\xc39\x00\xe0\x1ff\x00\r\x00\x00\x00\r\x00\x00\x00\x10\xc49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + packet = FSNETCMD_LOADFIELD(buffer) + self.assertEqual(packet.fieldShortName, 'ISLAND_GOURD') + self.assertEqual(packet.flags, 0) + self.assertEqual(packet.pos, [0, 0, 0]) + self.assertEqual(packet.atti, [0, 0,0]) + + def test_encode(self): + field = b'ISLAND_GOURD\x00\xc39\x00\xe0\x1ff\x00\r\x00\x00\x00\r\x00\x00\x00\x10\xc49\x00' + flags = 0 + pos = [0, 0, 0] + atti = [0, 0, 0] + buffer = FSNETCMD_LOADFIELD.encode(field, flags, pos, atti) + expected_buffer = b'\x04\x00\x00\x00ISLAND_GOURD\x00\xc39\x00\xe0\x1ff\x00\r\x00\x00\x00\r\x00\x00\x00\x10\xc49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + self.assertEqual(buffer, expected_buffer) + + def test_encode_with_size(self): + field = b'ISLAND_GOURD\x00\xc39\x00\xe0\x1ff\x00\r\x00\x00\x00\r\x00\x00\x00\x10\xc49\x00' + flags = 0 + pos = [0, 0, 0] + atti = [0, 0, 0] + buffer = FSNETCMD_LOADFIELD.encode(field, flags, pos, atti, with_size=True) + expected_buffer = b'@\x00\x00\x00\x04\x00\x00\x00ISLAND_GOURD\x00\xc39\x00\xe0\x1ff\x00\r\x00\x00\x00\r\x00\x00\x00\x10\xc49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + self.assertEqual(buffer, expected_buffer) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/tests/packet05_addobject_test.py b/tests/packet05_addobject_test.py new file mode 100644 index 0000000..6378858 --- /dev/null +++ b/tests/packet05_addobject_test.py @@ -0,0 +1,39 @@ +import unittest +import sys +import os + +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from lib.PacketManager.packets.FSNETCMD_ADDOBJECT import FSNETCMD_ADDOBJECT + +class TestFSNETCMD_ADDOBJECT(unittest.TestCase): + + def test_decode(self): + buffer = b'\x05\x00\x00\x00\x01\x00\x01\x00\x02\x00\x01\x00\x00\x00\x00\x00R\x0c^E\x00\x00\x00\x00H\x85%E\x1d\x96\xcb\xbf\x00\x00\x00\x00\x00\x00\x00\x80HANGER\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\xd7\xa3dB' + + packet = FSNETCMD_ADDOBJECT(buffer) + self.assertEqual(packet.object_type, 1) + self.assertEqual(packet.net_type, 1) + self.assertEqual(packet.object_id, 65538) + self.assertEqual(packet.iff, 0) + self.assertEqual(packet.pos, [3552.77001953125, 0.0, 2648.330078125]) + self.assertEqual(packet.atti, [-1.590518593788147, 0.0, -0.0]) + self.assertEqual(packet.identifier, 'HANGER') + self.assertEqual(packet.substrname, '') + self.assertEqual(packet.ysfid, 0) + self.assertEqual(packet.flags, 0) + self.assertEqual(packet.flags0, 32768) + self.assertEqual(packet.outsideRadius, 57.15999984741211) + + def test_encode(self): + buffer = FSNETCMD_ADDOBJECT.encode( + object_type=1, net_type=1, object_id=65538, iff=0, pos=[3552.77001953125, 0.0, 2648.330078125], + atti=[-1.590518593788147, 0.0, -0.0], identifier='HANGER', substrname='', ysfid=0, + flags=0, flags0=32768, outside_radius=57.15999984741211 + ) + expected_buffer = b'\x05\x00\x00\x00\x01\x00\x01\x00\x02\x00\x01\x00\x00\x00\x00\x00R\x0c^E\x00\x00\x00\x00H\x85%E\x1d\x96\xcb\xbf\x00\x00\x00\x00\x00\x00\x00\x80HANGER\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\xd7\xa3dB' + self.assertEqual(buffer, expected_buffer) + + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/tests/packet08_joinrequest_test.py b/tests/packet08_joinrequest_test.py new file mode 100644 index 0000000..e712989 --- /dev/null +++ b/tests/packet08_joinrequest_test.py @@ -0,0 +1,31 @@ +import unittest +import sys +import os + +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from lib.PacketManager.packets.FSNETCMD_JOINREQUEST import FSNETCMD_JOINREQUEST + +class TestFSNETCMD_JOINREQUEST(unittest.TestCase): + + def test_decode(self): + buffer = b'\x08\x00\x00\x00\x02\x00\x00\x00EUROFIGHTER_TYPHOON\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00RW36_01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00K\x00\x00\x00' + packet = FSNETCMD_JOINREQUEST(buffer) + self.assertEqual(packet.iff,2) + self.assertEqual(packet.aircraft, 'EUROFIGHTER_TYPHOON') + self.assertEqual(packet.start_pos, 'RW36_01') + self.assertEqual(packet.fuel, 75) + self.assertEqual(packet.smoke,0) + + def test_encode(self): + iff = 2 + aircraft = 'EUROFIGHTER_TYPHOON' + start_pos = 'NORTH10000_01' + fuel = 75 + smoke = 0 + buffer = FSNETCMD_JOINREQUEST.encode(iff, aircraft, start_pos, fuel, smoke) + expected_buffer = b'\x08\x00\x00\x00\x02\x00\x00\x00EUROFIGHTER_TYPHOON\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00NORTH10000_01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00K\x00\x00\x00' + self.assertEqual(buffer, expected_buffer) + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/tests/packet09_joinapproval_test.py b/tests/packet09_joinapproval_test.py new file mode 100644 index 0000000..6334f78 --- /dev/null +++ b/tests/packet09_joinapproval_test.py @@ -0,0 +1,26 @@ +import unittest +import sys +import os + +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from lib.PacketManager.packets.FSNETCMD_JOINAPPROVAL import FSNETCMD_JOINAPPROVAL + +class TestFSNETCMD_JOINAPPROVAL(unittest.TestCase): + + def test_decode(self): + buffer = b'\t\x00\x00\x00' + packet = FSNETCMD_JOINAPPROVAL(buffer) + self.assertEqual(packet.buffer, buffer) + + def test_encode(self): + buffer = FSNETCMD_JOINAPPROVAL.encode() + expected_buffer = b'\t\x00\x00\x00' + self.assertEqual(buffer, expected_buffer) + + def test_encode_with_size(self): + buffer = FSNETCMD_JOINAPPROVAL.encode(with_size=True) + expected_buffer = b'\x04\x00\x00\x00\t\x00\x00\x00' + self.assertEqual(buffer, expected_buffer) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file -- cgit v1.2.3