1 #include "PacketTest.hpp"
3 #include "model/CompositeModel.hpp"
4 #include "world/Entity.hpp"
6 CPPUNIT_TEST_SUITE_REGISTRATION(blank::test::PacketTest);
13 void PacketTest::setUp() {
14 udp_pack.data = new Uint8[sizeof(Packet)];
15 udp_pack.maxlen = sizeof(Packet);
18 void PacketTest::tearDown() {
19 delete[] udp_pack.data;
24 static constexpr uint32_t TEST_TAG = 0xFB1AB1AF;
28 void PacketTest::testControl() {
29 Packet::TControl ctrl;
32 CPPUNIT_ASSERT_MESSAGE(
33 "TControl should ack the packet in the ack field",
36 CPPUNIT_ASSERT_MESSAGE(
37 "TControl should ack the packet in the future",
40 CPPUNIT_ASSERT_MESSAGE(
41 "TControl should not ack a packet in the distant past",
44 CPPUNIT_ASSERT_MESSAGE(
45 "TControl should not ack the previous packet if the bitfield is 0",
48 CPPUNIT_ASSERT_EQUAL_MESSAGE(
49 "TControl's acks should begin at the packet in the ack field",
50 uint16_t(10), ctrl.AckBegin()
52 CPPUNIT_ASSERT_EQUAL_MESSAGE(
53 "TControl's acks should end 33 packets before the one in the ack field",
54 uint16_t(-23), ctrl.AckEnd()
57 CPPUNIT_ASSERT_MESSAGE(
58 "TControl should ack the previous packet if the bitfield is 1",
62 CPPUNIT_ASSERT_MESSAGE(
63 "TControl should not ack the previous packet if the bitfield is 2",
66 CPPUNIT_ASSERT_MESSAGE(
67 "TControl should ack the packet before the previous one if the bitfield is 2",
72 void PacketTest::testPing() {
73 auto pack = Packet::Make<Packet::Ping>(udp_pack);
74 AssertPacket("Ping", 0, 0, pack);
77 void PacketTest::testLogin() {
78 auto pack = Packet::Make<Packet::Login>(udp_pack);
79 AssertPacket("Login", 1, 0, 32, pack);
81 string write_name = "test";
83 pack.WritePlayerName(write_name);
84 pack.ReadPlayerName(read_name);
85 CPPUNIT_ASSERT_EQUAL_MESSAGE(
86 "player name not correctly transported in Login packet",
90 write_name = "0123456789012345678901234567890123456789";
91 pack.WritePlayerName(write_name);
92 pack.ReadPlayerName(read_name);
93 CPPUNIT_ASSERT_EQUAL_MESSAGE(
94 "player name not correctly truncated in Login packet",
95 write_name.substr(0, 32), read_name
99 void PacketTest::testJoin() {
100 auto pack = Packet::Make<Packet::Join>(udp_pack);
101 AssertPacket("Join", 2, 68, 100, pack);
104 write_entity.ID(534574);
105 write_entity.GetState().chunk_pos = { 7, 2, -3 };
106 write_entity.GetState().block_pos = { 1.5f, 0.9f, 12.0f };
107 write_entity.GetState().velocity = { 0.025f, 0.001f, 0.0f };
108 write_entity.GetState().orient = { 1.0f, 0.0f, 0.0f, 0.0f };
109 write_entity.GetState().ang_vel = { 0.01f, 0.00302f, 0.0985f };
110 uint32_t read_id = 0;
111 EntityState read_state;
112 pack.WritePlayer(write_entity);
114 pack.ReadPlayerID(read_id);
115 CPPUNIT_ASSERT_EQUAL_MESSAGE(
116 "player entity ID not correctly transported in Join packet",
117 write_entity.ID(), read_id
119 pack.ReadPlayerState(read_state);
121 "player entity state not correctly transported in Join packet",
122 write_entity.GetState(), read_state
125 string write_name = "test";
127 pack.WriteWorldName(write_name);
128 pack.ReadWorldName(read_name);
129 CPPUNIT_ASSERT_EQUAL_MESSAGE(
130 "world name not correctly transported in Join packet",
131 write_name, read_name
134 write_name = "0123456789012345678901234567890123456789";
135 pack.WriteWorldName(write_name);
136 pack.ReadWorldName(read_name);
137 CPPUNIT_ASSERT_EQUAL_MESSAGE(
138 "world name not correctly truncated in Join packet",
139 write_name.substr(0, 32), read_name
143 void PacketTest::testPart() {
144 auto pack = Packet::Make<Packet::Part>(udp_pack);
145 AssertPacket("Part", 3, 0, pack);
148 void PacketTest::testPlayerUpdate() {
149 auto pack = Packet::Make<Packet::PlayerUpdate>(udp_pack);
150 AssertPacket("PlayerUpdate", 4, 76, pack);
152 EntityState write_state;
153 write_state.chunk_pos = { 7, 2, -3 };
154 write_state.block_pos = { 1.5f, 0.9f, 12.0f };
155 write_state.velocity = { 0.025f, 0.001f, 0.0f };
156 write_state.orient = { 1.0f, 0.0f, 0.0f, 0.0f };
157 write_state.ang_vel = { 0.01f, 0.00302f, 0.0985f };
158 glm::vec3 write_movement(0.5f, -1.0f, 1.0f);
159 float write_pitch = 1.25f;
160 float write_yaw = -2.5f;
161 uint8_t write_actions = 0x05;
162 uint8_t write_slot = 3;
163 pack.WritePredictedState(write_state);
164 pack.WriteMovement(write_movement);
165 pack.WritePitch(write_pitch);
166 pack.WriteYaw(write_yaw);
167 pack.WriteActions(write_actions);
168 pack.WriteSlot(write_slot);
170 EntityState read_state;
171 glm::vec3 read_movement;
174 uint8_t read_actions;
176 pack.ReadPredictedState(read_state);
177 pack.ReadMovement(read_movement);
178 pack.ReadPitch(read_pitch);
179 pack.ReadYaw(read_yaw);
180 pack.ReadActions(read_actions);
181 pack.ReadSlot(read_slot);
183 "player predicted entity state not correctly transported in PlayerUpdate packet",
184 write_state, read_state
187 "player movement input not correctly transported in PlayerUpdate packet",
188 write_movement, read_movement, 0.0001f
190 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
191 "player pitch input not correctly transported in PlayerUpdate packet",
192 write_pitch, read_pitch, 0.0001f
194 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
195 "player yaw input not correctly transported in PlayerUpdate packet",
196 write_yaw, read_yaw, 0.0001f
198 CPPUNIT_ASSERT_EQUAL_MESSAGE(
199 "player actions not correctly transported in PlayerUpdate packet",
200 int(write_actions), int(read_actions)
202 CPPUNIT_ASSERT_EQUAL_MESSAGE(
203 "player inventory slot not correctly transported in PlayerUpdate packet",
204 int(write_slot), int(read_slot)
208 void PacketTest::testSpawnEntity() {
209 auto pack = Packet::Make<Packet::SpawnEntity>(udp_pack);
210 AssertPacket("SpawnEntity", 5, 100, 132, pack);
213 write_entity.ID(534574);
214 CompositeModel model;
216 model.Instantiate(write_entity.GetModel());
217 write_entity.GetState().chunk_pos = { 7, 2, -3 };
218 write_entity.GetState().block_pos = { 1.5f, 0.9f, 12.0f };
219 write_entity.GetState().velocity = { 0.025f, 0.001f, 0.0f };
220 write_entity.GetState().orient = { 1.0f, 0.0f, 0.0f, 0.0f };
221 write_entity.GetState().ang_vel = { 0.01f, 0.00302f, 0.0985f };
222 write_entity.Bounds({{ -1, -1, -1 }, { 1, 1, 1 }});
223 write_entity.WorldCollidable(true);
224 write_entity.Name("blah");
225 pack.WriteEntity(write_entity);
228 uint32_t skeleton_id;
230 pack.ReadEntityID(entity_id);
231 pack.ReadSkeletonID(skeleton_id);
232 pack.ReadEntity(read_entity);
234 CPPUNIT_ASSERT_EQUAL_MESSAGE(
235 "entity ID not correctly transported in SpawnEntity packet",
236 write_entity.ID(), entity_id
238 CPPUNIT_ASSERT_EQUAL_MESSAGE(
239 "skeleton ID not correctly transported in SpawnEntity packet",
240 write_entity.GetModel().GetModel().ID(), skeleton_id
243 "entity state not correctly transported in PlayerUpdate packet",
244 write_entity.GetState(), read_entity.GetState()
247 "entity bounds not correctly transported in PlayerUpdate packet",
248 write_entity.Bounds(), read_entity.Bounds()
250 CPPUNIT_ASSERT_MESSAGE(
251 "entity flags not correctly transported in SpawnEntity packet",
252 read_entity.WorldCollidable()
254 CPPUNIT_ASSERT_EQUAL_MESSAGE(
255 "entity name not correctly transported in SpawnEntity packet",
256 write_entity.Name(), read_entity.Name()
260 void PacketTest::testDespawnEntity() {
261 auto pack = Packet::Make<Packet::DespawnEntity>(udp_pack);
262 AssertPacket("DespawnEntity", 6, 4, pack);
264 uint32_t write_id = 5437;
266 pack.WriteEntityID(write_id);
267 pack.ReadEntityID(read_id);
269 CPPUNIT_ASSERT_EQUAL_MESSAGE(
270 "entity ID not correctly transported in DespawnEntity packet",
275 void PacketTest::testEntityUpdate() {
276 auto pack = Packet::Make<Packet::EntityUpdate>(udp_pack);
277 AssertPacket("EntityUpdate", 7, 4, 480, pack);
279 pack.length = Packet::EntityUpdate::GetSize(3);
280 CPPUNIT_ASSERT_EQUAL_MESSAGE(
281 "length not correctly set in DespawnEntity packet",
282 size_t(4 + 3 * 68), pack.length
285 uint32_t write_count = 3;
287 pack.WriteEntityCount(write_count);
288 pack.ReadEntityCount(read_count);
289 CPPUNIT_ASSERT_EQUAL_MESSAGE(
290 "entity count not correctly transported in EntityUpdate packet",
291 write_count, read_count
295 write_entity.ID(8567234);
296 write_entity.GetState().chunk_pos = { 7, 2, -3 };
297 write_entity.GetState().block_pos = { 1.5f, 0.9f, 12.0f };
298 write_entity.GetState().velocity = { 0.025f, 0.001f, 0.0f };
299 write_entity.GetState().orient = { 1.0f, 0.0f, 0.0f, 0.0f };
300 write_entity.GetState().ang_vel = { 0.01f, 0.00302f, 0.0985f };
301 pack.WriteEntity(write_entity, 1);
302 pack.WriteEntity(write_entity, 0);
303 pack.WriteEntity(write_entity, 2);
306 EntityState read_state;
307 pack.ReadEntityID(read_id, 1);
308 pack.ReadEntityState(read_state, 1);
309 CPPUNIT_ASSERT_EQUAL_MESSAGE(
310 "entity ID not correctly transported in EntityUpdate packet",
311 write_entity.ID(), read_id
314 "entity state not correctly transported in EntityUpdate packet",
315 write_entity.GetState(), read_state
319 void PacketTest::testPlayerCorrection() {
320 auto pack = Packet::Make<Packet::PlayerCorrection>(udp_pack);
321 AssertPacket("PlayerCorrection", 8, 66, pack);
323 uint16_t write_seq = 50050;
325 pack.WritePacketSeq(write_seq);
326 pack.ReadPacketSeq(read_seq);
327 CPPUNIT_ASSERT_EQUAL_MESSAGE(
328 "packet sequence not correctly transported in PlayerCorrection packet",
333 write_entity.GetState().chunk_pos = { 7, 2, -3 };
334 write_entity.GetState().block_pos = { 1.5f, 0.9f, 12.0f };
335 write_entity.GetState().velocity = { 0.025f, 0.001f, 0.0f };
336 write_entity.GetState().orient = { 1.0f, 0.0f, 0.0f, 0.0f };
337 write_entity.GetState().ang_vel = { 0.01f, 0.00302f, 0.0985f };
338 pack.WritePlayer(write_entity);
340 EntityState read_state;
341 pack.ReadPlayerState(read_state);
343 "entity state not correctly transported in PlayerCorrection packet",
344 write_entity.GetState(), read_state
348 void PacketTest::testChunkBegin() {
349 auto pack = Packet::Make<Packet::ChunkBegin>(udp_pack);
350 AssertPacket("ChunkBegin", 9, 24, pack);
352 uint32_t write_id = 532;
353 uint32_t write_flags = 9864328;
354 glm::ivec3 write_pos = { -6, 15, 38 };
355 uint32_t write_size = 4097;
357 pack.WriteTransmissionId(write_id);
358 pack.WriteFlags(write_flags);
359 pack.WriteChunkCoords(write_pos);
360 pack.WriteDataSize(write_size);
367 pack.ReadTransmissionId(read_id);
368 pack.ReadFlags(read_flags);
369 pack.ReadChunkCoords(read_pos);
370 pack.ReadDataSize(read_size);
372 CPPUNIT_ASSERT_EQUAL_MESSAGE(
373 "transmission ID not correctly transported in ChunkBegin packet",
376 CPPUNIT_ASSERT_EQUAL_MESSAGE(
377 "flags not correctly transported in ChunkBegin packet",
378 write_flags, read_flags
381 "chunk coordinates not correctly transported in ChunkBegin packet",
384 CPPUNIT_ASSERT_EQUAL_MESSAGE(
385 "data size not correctly transported in ChunkBegin packet",
386 write_size, read_size
390 void PacketTest::testChunkData() {
391 auto pack = Packet::Make<Packet::ChunkData>(udp_pack);
392 AssertPacket("ChunkData", 10, 12, 484, pack);
394 constexpr size_t block_size = 97;
396 uint32_t write_id = 6743124;
397 uint32_t write_offset = 8583;
398 uint32_t write_size = block_size;
399 uint8_t write_data[block_size];
400 memset(write_data, 'X', block_size);
402 pack.WriteTransmissionId(write_id);
403 pack.WriteDataOffset(write_offset);
404 pack.WriteDataSize(write_size);
405 pack.WriteData(write_data, write_size);
408 uint32_t read_offset;
410 uint8_t read_data[block_size];
412 pack.ReadTransmissionId(read_id);
413 pack.ReadDataOffset(read_offset);
414 pack.ReadDataSize(read_size);
415 pack.ReadData(read_data, read_size);
417 CPPUNIT_ASSERT_EQUAL_MESSAGE(
418 "transmission ID not correctly transported in ChunkData packet",
421 CPPUNIT_ASSERT_EQUAL_MESSAGE(
422 "data offset not correctly transported in ChunkData packet",
423 write_offset, read_offset
425 CPPUNIT_ASSERT_EQUAL_MESSAGE(
426 "data size not correctly transported in ChunkData packet",
427 write_size, read_size
429 CPPUNIT_ASSERT_EQUAL_MESSAGE(
430 "raw data not correctly transported in ChunkData packet",
431 string(write_data, write_data + write_size), string(read_data, read_data + read_size)
436 void PacketTest::AssertPacket(
438 uint8_t expected_type,
439 size_t expected_length,
440 const Packet::Payload &actual
442 CPPUNIT_ASSERT_EQUAL_MESSAGE(
443 name + " packet not correctly tagged",
444 TEST_TAG, actual.GetHeader().tag
446 CPPUNIT_ASSERT_EQUAL_MESSAGE(
447 "wrong type code for " + name + " packet",
448 int(expected_type), int(actual.GetHeader().type)
450 CPPUNIT_ASSERT_EQUAL_MESSAGE(
451 "bad payload length for " + name + " packet",
452 expected_length, actual.length
456 void PacketTest::AssertPacket(
458 uint8_t expected_type,
461 const Packet::Payload &actual
463 CPPUNIT_ASSERT_EQUAL_MESSAGE(
464 name + " packet not correctly tagged",
465 TEST_TAG, actual.GetHeader().tag
467 CPPUNIT_ASSERT_EQUAL_MESSAGE(
468 "wrong type code for " + name + " packet",
469 expected_type, actual.GetHeader().type
471 CPPUNIT_ASSERT_MESSAGE(
472 "bad payload length for " + name + " packet",
473 actual.length >= min_length && actual.length <= max_length
477 void PacketTest::AssertEqual(
478 const string &message,
479 const EntityState &expected,
480 const EntityState &actual
483 message + ": bad chunk position",
484 expected.chunk_pos, actual.chunk_pos
487 message + ": bad block position",
488 expected.block_pos, actual.block_pos
491 message + ": bad velocity",
492 expected.velocity, actual.velocity
495 message + ": bad orientation",
496 expected.orient, actual.orient
499 message + ": bad angular velocity",
500 expected.ang_vel, actual.ang_vel
504 void PacketTest::AssertEqual(
505 const string &message,
506 const AABB &expected,
510 message + ": bad lower bound",
511 expected.min, actual.min
514 message + ": bad upper bound",
515 expected.max, actual.max
519 void PacketTest::AssertEqual(
520 const string &message,
521 const glm::ivec3 &expected,
522 const glm::ivec3 &actual
524 CPPUNIT_ASSERT_EQUAL_MESSAGE(
525 message + " (X component)",
528 CPPUNIT_ASSERT_EQUAL_MESSAGE(
529 message + " (Y component)",
532 CPPUNIT_ASSERT_EQUAL_MESSAGE(
533 message + " (Z component)",
538 void PacketTest::AssertEqual(
539 const string &message,
540 const glm::vec3 &expected,
541 const glm::vec3 &actual,
544 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
545 message + " (X component)",
546 expected.x, actual.x, epsilon
548 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
549 message + " (Y component)",
550 expected.y, actual.y, epsilon
552 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
553 message + " (Z component)",
554 expected.z, actual.z, epsilon
558 void PacketTest::AssertEqual(
559 const string &message,
560 const glm::quat &expected,
561 const glm::quat &actual
563 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
564 message + " (W component)",
565 expected.w, actual.w, numeric_limits<float>::epsilon()
567 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
568 message + " (X component)",
569 expected.x, actual.x, numeric_limits<float>::epsilon()
571 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
572 message + " (Y component)",
573 expected.y, actual.y, numeric_limits<float>::epsilon()
575 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
576 message + " (Z component)",
577 expected.z, actual.z, numeric_limits<float>::epsilon()