NetworkTests.cpp 13 KB

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