NetworkTests.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. #include <core/Clock.hpp>
  2. #include <core/Logger.hpp>
  3. #include <core/Utility.hpp>
  4. #include <cstring>
  5. #include "../Tests.hpp"
  6. #include "../src/ErrorSimulator.hpp"
  7. #include "core/Network.hpp"
  8. using Core::Client;
  9. using Core::InPacket;
  10. using Core::OutPacket;
  11. using Core::Server;
  12. #define TEST_READ(Type, type, value) \
  13. { \
  14. type u; \
  15. TEST_FALSE(in.read##Type(u)); \
  16. TEST_TRUE(u == value); \
  17. }
  18. #define TEST_READ_FAIL(Type, type) \
  19. { \
  20. type u; \
  21. TEST_TRUE(in.read##Type(u)); \
  22. }
  23. static void testWriteRead() {
  24. OutPacket out;
  25. out.writeU8(200);
  26. out.writeU16(6656);
  27. out.writeU32(348'923'689);
  28. out.writeI8(90);
  29. out.writeI8(-35);
  30. out.writeI16(843);
  31. out.writeI16(-8961);
  32. out.writeI32(100'430'199);
  33. out.writeI32(-534'534);
  34. out.writeFloat(64564.5346f);
  35. const char s[] = "This is Great";
  36. out.writeString(s);
  37. InPacket in(out.data.getData(), out.data.getLength());
  38. TEST_READ(U8, u8, 200)
  39. TEST_READ(U16, u16, 6656)
  40. TEST_READ(U32, u32, 348'923'689)
  41. TEST_READ(I8, i8, 90)
  42. TEST_READ(I8, i8, -35)
  43. TEST_READ(I16, i16, 843)
  44. TEST_READ(I16, i16, -8961)
  45. TEST_READ(I32, i32, 100'430'199)
  46. TEST_READ(I32, i32, -534'534)
  47. float f;
  48. TEST_FALSE(in.readFloat(f));
  49. TEST_FLOAT(64564.5346f, f, 0.00001f);
  50. char buffer[256];
  51. size_t n = in.readString(buffer, sizeof(buffer));
  52. TEST(14, n);
  53. TEST_STRING(s, buffer);
  54. TEST_READ_FAIL(U8, u8)
  55. TEST_READ_FAIL(U16, u16)
  56. TEST_READ_FAIL(U32, u32)
  57. TEST_READ_FAIL(I8, i8)
  58. TEST_READ_FAIL(I16, i16)
  59. TEST_READ_FAIL(I32, i32)
  60. TEST_READ_FAIL(Float, float)
  61. TEST(0, in.readString(nullptr, 0));
  62. TEST(0, in.readString(buffer, sizeof(buffer)));
  63. }
  64. static void testTooShortBuffer() {
  65. OutPacket out;
  66. out.writeString("This is Great");
  67. out.writeString("Well hoho");
  68. InPacket in(out.data.getData(), out.data.getLength());
  69. char buffer[8];
  70. size_t n = in.readString(buffer, sizeof(buffer));
  71. TEST(14, n);
  72. TEST_STRING("This is", buffer);
  73. char buffer2[6];
  74. size_t n2 = in.readString(buffer2, sizeof(buffer2));
  75. TEST(10, n2);
  76. TEST_STRING("Well ", buffer2);
  77. }
  78. struct PacketTest {
  79. u8 a;
  80. u8 b;
  81. };
  82. static void testBinaryData() {
  83. OutPacket out;
  84. PacketTest data = {56, 3};
  85. out.write(&data, sizeof(data));
  86. InPacket in(out.data.getData(), out.data.getLength());
  87. PacketTest inData;
  88. TEST_FALSE(in.read(&inData, sizeof(inData)));
  89. TEST_TRUE(memcmp(&inData, &data, sizeof(inData)) == 0);
  90. }
  91. static void testShortString() {
  92. OutPacket out;
  93. out.writeU16(200);
  94. out.writeU16(65'535);
  95. InPacket in(out.data.getData(), out.data.getLength());
  96. char buffer[256];
  97. size_t n = in.readString(buffer, sizeof(buffer));
  98. TEST(200, n);
  99. TEST_STRING("", buffer);
  100. }
  101. using BoolFunction = bool (*)(void*);
  102. static void tick(Server& s, Client& c, BoolFunction f, void* fd) {
  103. for(int i = 0; i < 100'000 && f(fd); i++) {
  104. c.tick();
  105. s.tick();
  106. }
  107. }
  108. static void tickUntilConnected(Server& s, Client& c) {
  109. tick(
  110. s, c, [](void* v) { return !static_cast<Client*>(v)->isConnected(); },
  111. &c);
  112. }
  113. static bool clientConnected = false;
  114. static bool clientDisconnected = false;
  115. static bool clientPackage = false;
  116. static int packageCounter = 0;
  117. static bool serverConnected = false;
  118. static bool serverDisconnect = false;
  119. static u8 data1 = 0;
  120. static u16 data2 = 0;
  121. static u32 data3 = 0;
  122. static i8 data4 = 0;
  123. static i16 data5 = 0;
  124. static i32 data6 = 0;
  125. static i8 data7 = 0;
  126. static i16 data8 = 0;
  127. static i32 data9 = 0;
  128. static char data10[20];
  129. static float data11 = 0.0f;
  130. static void onServerConnect(Server&, Core::ClientHandle) {
  131. serverConnected = true;
  132. }
  133. static void onServerDisconnect(Server&, Core::ClientHandle) {
  134. serverDisconnect = true;
  135. }
  136. static void onServerPacket(Server& s, Core::ClientHandle client, InPacket& in) {
  137. TEST_FALSE(in.readU8(data1));
  138. TEST_FALSE(in.readU16(data2));
  139. TEST_FALSE(in.readU32(data3));
  140. TEST_FALSE(in.readI8(data4));
  141. TEST_FALSE(in.readI16(data5));
  142. TEST_FALSE(in.readI32(data6));
  143. TEST_FALSE(in.readI8(data7));
  144. TEST_FALSE(in.readI16(data8));
  145. TEST_FALSE(in.readI32(data9));
  146. TEST(9, in.readString(data10, sizeof(data10)));
  147. TEST_FALSE(in.readFloat(data11));
  148. OutPacket out;
  149. if(packageCounter == 0) {
  150. s.sendPacket(client, out, Core::PacketSendMode::RELIABLE);
  151. } else if(packageCounter == 1) {
  152. s.sendPacket(client, out, Core::PacketSendMode::SEQUENCED);
  153. } else if(packageCounter == 2) {
  154. s.sendPacket(client, out, Core::PacketSendMode::UNSEQUENCED);
  155. }
  156. packageCounter++;
  157. }
  158. static void onClientConnect() {
  159. clientConnected = true;
  160. }
  161. static void onClientDisconnect() {
  162. clientDisconnected = true;
  163. }
  164. static void onClientPacket(InPacket&) {
  165. clientPackage = true;
  166. }
  167. static void testConnect(Core::PacketSendMode mode) {
  168. clientConnected = false;
  169. clientDisconnected = false;
  170. clientPackage = false;
  171. serverConnected = false;
  172. serverDisconnect = false;
  173. data1 = 0;
  174. data2 = 0;
  175. data3 = 0;
  176. data4 = 0;
  177. data5 = 0;
  178. data6 = 0;
  179. data7 = 0;
  180. data8 = 0;
  181. data9 = 0;
  182. *data10 = '\0';
  183. data11 = 0.0f;
  184. Server s;
  185. s.resetHandler();
  186. s.setConnectHandler(onServerConnect);
  187. s.setDisconnectHandler(onServerDisconnect);
  188. s.setPacketHandler(onServerPacket);
  189. Client c;
  190. c.resetHandler();
  191. c.setConnectHandler(onClientConnect);
  192. c.setDisconnectHandler(onClientDisconnect);
  193. c.setPacketHandler(onClientPacket);
  194. if(!TEST_FALSE(s.start(54'321, 5))) {
  195. return;
  196. } else if(!TEST_FALSE(c.start())) {
  197. return;
  198. } else if(!TEST_FALSE(c.connect("127.0.0.1", 54'321, 90))) {
  199. return;
  200. }
  201. TEST_FALSE(c.isConnected());
  202. TEST_TRUE(c.isConnecting());
  203. tickUntilConnected(s, c);
  204. TEST_TRUE(clientConnected);
  205. TEST_TRUE(c.isConnected());
  206. TEST_FALSE(c.isConnecting());
  207. OutPacket out;
  208. out.writeU8(0xF1);
  209. out.writeU16(0xF123);
  210. out.writeU32(0xF123'4567);
  211. out.writeI8(-0x71);
  212. out.writeI16(-0x7123);
  213. out.writeI32(-0x7123'4567);
  214. out.writeI8(0x71);
  215. out.writeI16(0x7123);
  216. out.writeI32(0x7123'4567);
  217. const char st[] = "Hi there";
  218. out.writeString(st);
  219. out.writeFloat(252345.983f);
  220. c.sendPacket(out, mode);
  221. tick(s, c, [](void*) { return !clientPackage || !serverConnected; }, &c);
  222. TEST_TRUE(clientPackage);
  223. TEST_TRUE(serverConnected);
  224. TEST(0xF1, data1);
  225. TEST(0xF123, data2);
  226. TEST(0xF123'4567, data3);
  227. TEST(-0x71, data4);
  228. TEST(-0x7123, data5);
  229. TEST(-0x7123'4567, data6);
  230. TEST(0x71, data7);
  231. TEST(0x7123, data8);
  232. TEST(0x7123'4567, data9);
  233. TEST_STRING(st, data10);
  234. TEST_FLOAT(252345.983f, data11, 0.01f);
  235. c.disconnect(90);
  236. TEST_FALSE(c.isConnected());
  237. TEST_FALSE(c.isConnecting());
  238. tick(
  239. s, c, [](void*) { return !clientDisconnected || !serverDisconnect; },
  240. &c);
  241. TEST_TRUE(clientDisconnected);
  242. TEST_TRUE(serverDisconnect);
  243. c.stop();
  244. s.stop();
  245. }
  246. static bool disconnected = false;
  247. static void testStopDisconnect() {
  248. disconnected = true;
  249. }
  250. static void testDisconnect() {
  251. disconnected = false;
  252. Client c;
  253. c.resetHandler();
  254. c.setDisconnectHandler(testStopDisconnect);
  255. if(!TEST_FALSE(c.start())) {
  256. return;
  257. } else if(!TEST_FALSE(c.connect("127.0.0.1", 54'321, 90))) {
  258. return;
  259. }
  260. TEST_FALSE(c.isConnected());
  261. TEST_TRUE(c.isConnecting());
  262. c.disconnect(50);
  263. Server s;
  264. tick(s, c, [](void*) { return !disconnected; }, &c);
  265. TEST_FALSE(c.isConnected());
  266. TEST_FALSE(c.isConnecting());
  267. TEST_TRUE(disconnected);
  268. c.stop();
  269. }
  270. static void testStop() {
  271. disconnected = false;
  272. Client c;
  273. c.resetHandler();
  274. c.setDisconnectHandler(testStopDisconnect);
  275. if(!TEST_FALSE(c.start())) {
  276. return;
  277. } else if(!TEST_FALSE(c.connect("127.0.0.1", 54'321, 90))) {
  278. return;
  279. }
  280. TEST_FALSE(c.isConnected());
  281. TEST_TRUE(c.isConnecting());
  282. c.stop();
  283. TEST_FALSE(c.isConnected());
  284. TEST_FALSE(c.isConnecting());
  285. TEST_TRUE(disconnected);
  286. }
  287. static void testClientStartFails() {
  288. Client c;
  289. TEST_FALSE(c.start());
  290. useReport = false;
  291. TEST_TRUE(c.start());
  292. c.stop();
  293. #ifdef ERROR_SIMULATOR
  294. failCounter = 0;
  295. TEST_TRUE(c.start());
  296. failCounter = 1;
  297. TEST_TRUE(c.start());
  298. failCounter = -1;
  299. #endif
  300. useReport = true;
  301. }
  302. static void testClientConnectionFails() {
  303. Client c;
  304. c.resetHandler();
  305. useReport = false;
  306. TEST_TRUE(c.connect("", 54'321, 100));
  307. TEST_FALSE(c.start());
  308. #ifdef ERROR_SIMULATOR
  309. failCounter = 0;
  310. TEST_TRUE(c.connect("", 54'321, 100));
  311. failCounter = -1;
  312. #endif
  313. TEST_FALSE(c.connect("", 54'321, 100));
  314. TEST_TRUE(c.connect("", 54'321, 100));
  315. useReport = true;
  316. for(int i = 0; i < 100; i++) {
  317. c.tick();
  318. }
  319. c.stop();
  320. }
  321. static void testInvalidClientAccess() {
  322. Client c;
  323. c.disconnect(0);
  324. OutPacket out;
  325. c.sendPacket(out, Core::PacketSendMode::RELIABLE);
  326. c.tick();
  327. }
  328. static void testServerStartFails() {
  329. useReport = false;
  330. Server s;
  331. TEST_TRUE(s.start(54'321, 0));
  332. #ifdef ERROR_SIMULATOR
  333. failCounter = 0;
  334. TEST_TRUE(s.start(54'321, 5));
  335. failCounter = 1;
  336. TEST_TRUE(s.start(54'321, 5));
  337. failCounter = -1;
  338. #endif
  339. TEST_FALSE(s.start(54'321, 5));
  340. TEST_TRUE(s.start(54'321, 5));
  341. useReport = true;
  342. s.stop();
  343. }
  344. static void testServerClosesOnConnected() {
  345. Server s;
  346. Client c;
  347. clientDisconnected = false;
  348. TEST_FALSE(s.start(54'321, 5));
  349. TEST_FALSE(c.start());
  350. c.setDisconnectHandler(onClientDisconnect);
  351. TEST_FALSE(c.connect("127.0.0.1", 54'321, 50));
  352. tickUntilConnected(s, c);
  353. TEST_TRUE(c.isConnected());
  354. s.stop();
  355. c.setTimeout(500, 500, 500);
  356. for(int i = 0; i < 500 && c.isConnected(); i++) {
  357. c.tick();
  358. Core::Clock::sleepMillis(10);
  359. }
  360. TEST_FALSE(c.isConnected());
  361. TEST_TRUE(clientDisconnected);
  362. c.stop();
  363. }
  364. static Core::ClientHandle clientId = 0;
  365. static void onConnectSetClient(Server&, Core::ClientHandle client) {
  366. clientId = client;
  367. }
  368. static void testServerDisconnectsClient() {
  369. clientDisconnected = false;
  370. Server s;
  371. Client c;
  372. TEST_FALSE(s.start(54'321, 5));
  373. TEST_FALSE(c.start());
  374. c.setDisconnectHandler(onClientDisconnect);
  375. s.setConnectHandler(onConnectSetClient);
  376. TEST_FALSE(c.connect("127.0.0.1", 54'321, 50));
  377. tickUntilConnected(s, c);
  378. TEST_TRUE(c.isConnected());
  379. s.disconnectClient(clientId);
  380. for(int i = 0; i < 500 && c.isConnected(); i++) {
  381. c.tick();
  382. s.tick();
  383. Core::Clock::sleepMillis(10);
  384. }
  385. TEST_FALSE(c.isConnected());
  386. TEST_TRUE(clientDisconnected);
  387. c.stop();
  388. s.stop();
  389. }
  390. static void onConnectSetTimeout(Server& s, Core::ClientHandle client) {
  391. s.setTimeout(client, 500, 500, 500);
  392. }
  393. static void testClientClosesOnConnected() {
  394. serverDisconnect = false;
  395. Server s;
  396. Client c;
  397. TEST_FALSE(s.start(54'321, 5));
  398. TEST_FALSE(c.start());
  399. s.setDisconnectHandler(onServerDisconnect);
  400. s.setConnectHandler(onConnectSetTimeout);
  401. TEST_FALSE(c.connect("127.0.0.1", 54'321, 50));
  402. tickUntilConnected(s, c);
  403. TEST_TRUE(c.isConnected());
  404. #ifdef ERROR_SIMULATOR
  405. failCounter = 0;
  406. #endif
  407. c.stop();
  408. #ifdef ERROR_SIMULATOR
  409. failCounter = -1;
  410. #endif
  411. for(int i = 0; i < 500 && !serverDisconnect; i++) {
  412. s.tick();
  413. Core::Clock::sleepMillis(10);
  414. }
  415. TEST_TRUE(serverDisconnect);
  416. s.stop();
  417. }
  418. static void testInvalidServerAccess() {
  419. Server s;
  420. s.tick();
  421. OutPacket out;
  422. s.sendPacket(0, out, Core::PacketSendMode::RELIABLE);
  423. s.setTimeout(0, 500, 500, 500);
  424. s.disconnectClient(0);
  425. }
  426. static void testDummyCallbacks() {
  427. Server s;
  428. Client c;
  429. c.resetHandler();
  430. s.resetHandler();
  431. TEST_FALSE(s.start(54'321, 5));
  432. TEST_FALSE(c.start());
  433. TEST_FALSE(c.connect("127.0.0.1", 54'321, 50));
  434. tickUntilConnected(s, c);
  435. TEST_TRUE(c.isConnected());
  436. OutPacket out;
  437. s.sendPacketBroadcast(out, Core::PacketSendMode::RELIABLE);
  438. c.sendPacket(out, Core::PacketSendMode::RELIABLE);
  439. for(int i = 0; i < 100; i++) {
  440. c.tick();
  441. s.tick();
  442. }
  443. c.stop();
  444. s.stop();
  445. }
  446. void testNetwork() {
  447. testWriteRead();
  448. testTooShortBuffer();
  449. testBinaryData();
  450. testShortString();
  451. testConnect(Core::PacketSendMode::UNSEQUENCED);
  452. testConnect(Core::PacketSendMode::SEQUENCED);
  453. testConnect(Core::PacketSendMode::RELIABLE);
  454. testDisconnect();
  455. testStop();
  456. testClientStartFails();
  457. testClientConnectionFails();
  458. testInvalidClientAccess();
  459. testServerStartFails();
  460. testServerClosesOnConnected();
  461. testServerDisconnectsClient();
  462. testClientClosesOnConnected();
  463. testInvalidServerAccess();
  464. testDummyCallbacks();
  465. }