NetworkTests.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. #include <core/Logger.h>
  2. #include <core/Utility.h>
  3. #include <string.h>
  4. #include "../Tests.h"
  5. #include "../src/ErrorSimulator.h"
  6. #include "core/Network.h"
  7. #define TEST_READ(Type, type, value) \
  8. { \
  9. type u; \
  10. TEST_FALSE(readInPacket##Type(&in, &u)); \
  11. TEST_TRUE(u == value); \
  12. }
  13. static void testWriteRead(void) {
  14. OutPacket out;
  15. initOutPacket(&out);
  16. writeOutPacketU8(&out, 200);
  17. writeOutPacketU16(&out, 6656);
  18. writeOutPacketU32(&out, 348923689);
  19. writeOutPacketI8(&out, 90);
  20. writeOutPacketI8(&out, -35);
  21. writeOutPacketI16(&out, 843);
  22. writeOutPacketI16(&out, -8961);
  23. writeOutPacketI32(&out, 100430199);
  24. writeOutPacketI32(&out, -534534);
  25. writeOutPacketFloat(&out, 64564.5346f);
  26. const char s[] = "This is Great";
  27. writeOutPacketString(&out, s);
  28. InPacket in;
  29. initInPacket(&in, out.data.buffer, out.data.size);
  30. TEST_READ(U8, u8, 200)
  31. TEST_READ(U16, u16, 6656)
  32. TEST_READ(U32, u32, 348923689)
  33. TEST_READ(I8, i8, 90)
  34. TEST_READ(I8, i8, -35)
  35. TEST_READ(I16, i16, 843)
  36. TEST_READ(I16, i16, -8961)
  37. TEST_READ(I32, i32, 100430199)
  38. TEST_READ(I32, i32, -534534)
  39. float f;
  40. TEST_FALSE(readInPacketFloat(&in, &f));
  41. TEST_FLOAT(64564.5346f, f, 0.00001f);
  42. char buffer[256];
  43. size_t n = readInPacketString(&in, buffer, sizeof(buffer));
  44. TEST_SIZE(14, n);
  45. TEST_STRING(s, buffer);
  46. TEST_TRUE(readInPacketU8(&in, &(u8){0}));
  47. TEST_TRUE(readInPacketU16(&in, &(u16){0}));
  48. TEST_TRUE(readInPacketU32(&in, &(u32){0}));
  49. TEST_TRUE(readInPacketI8(&in, &(i8){0}));
  50. TEST_TRUE(readInPacketI16(&in, &(i16){0}));
  51. TEST_TRUE(readInPacketI32(&in, &(i32){0}));
  52. TEST_TRUE(readInPacketFloat(&in, &(float){0}));
  53. TEST_SIZE(0, readInPacketString(&in, nullptr, 0));
  54. TEST_SIZE(0, readInPacketString(&in, buffer, sizeof(buffer)));
  55. destroyOutPacket(&out);
  56. }
  57. static void testTooShortBuffer(void) {
  58. OutPacket out;
  59. initOutPacket(&out);
  60. writeOutPacketString(&out, "This is Great");
  61. writeOutPacketString(&out, "Well hoho");
  62. InPacket in;
  63. initInPacket(&in, out.data.buffer, out.data.size);
  64. char buffer[8];
  65. size_t n = readInPacketString(&in, buffer, sizeof(buffer));
  66. TEST_SIZE(14, n);
  67. TEST_STRING("This is", buffer);
  68. char buffer2[6];
  69. size_t n2 = readInPacketString(&in, buffer2, sizeof(buffer2));
  70. TEST_SIZE(10, n2);
  71. TEST_STRING("Well ", buffer2);
  72. destroyOutPacket(&out);
  73. }
  74. typedef struct {
  75. u8 a;
  76. u8 b;
  77. } PacketTest;
  78. static void testBinaryData(void) {
  79. OutPacket out;
  80. initOutPacket(&out);
  81. PacketTest data = {56, 3};
  82. writeOutPacket(&out, &data, sizeof(data));
  83. InPacket in;
  84. initInPacket(&in, out.data.buffer, out.data.size);
  85. PacketTest inData;
  86. TEST_FALSE(readInPacket(&in, &inData, sizeof(inData)));
  87. TEST_TRUE(memcmp(&inData, &data, sizeof(inData)) == 0);
  88. destroyOutPacket(&out);
  89. }
  90. static void testShortString(void) {
  91. OutPacket out;
  92. initOutPacket(&out);
  93. writeOutPacketU16(&out, 200);
  94. writeOutPacketU16(&out, 65535);
  95. InPacket in;
  96. initInPacket(&in, out.data.buffer, out.data.size);
  97. char buffer[256];
  98. size_t n = readInPacketString(&in, buffer, sizeof(buffer));
  99. TEST_SIZE(200, n);
  100. TEST_STRING("", buffer);
  101. destroyOutPacket(&out);
  102. }
  103. static void tickClientN(int ticks) {
  104. for(int i = 0; i < ticks; i++) {
  105. tickClient();
  106. }
  107. }
  108. static void tick(int ticks) {
  109. for(int i = 0; i < ticks; i++) {
  110. tickClient();
  111. tickServer();
  112. }
  113. }
  114. static bool clientConnected = false;
  115. static bool clientDisconnected = false;
  116. static bool clientPackage = false;
  117. static int packageCounter = 0;
  118. static bool serverConnected = false;
  119. static bool serverDisconnect = false;
  120. static u8 data1 = 0;
  121. static u16 data2 = 0;
  122. static u32 data3 = 0;
  123. static i8 data4 = 0;
  124. static i16 data5 = 0;
  125. static i32 data6 = 0;
  126. static i8 data7 = 0;
  127. static i16 data8 = 0;
  128. static i32 data9 = 0;
  129. static char data10[20];
  130. static float data11 = 0.0f;
  131. static void onServerConnect(Client) {
  132. serverConnected = true;
  133. }
  134. static void onServerDisconnect(Client) {
  135. serverDisconnect = true;
  136. }
  137. static void onServerPacket(Client client, InPacket* in) {
  138. TEST_FALSE(readInPacketU8(in, &data1));
  139. TEST_FALSE(readInPacketU16(in, &data2));
  140. TEST_FALSE(readInPacketU32(in, &data3));
  141. TEST_FALSE(readInPacketI8(in, &data4));
  142. TEST_FALSE(readInPacketI16(in, &data5));
  143. TEST_FALSE(readInPacketI32(in, &data6));
  144. TEST_FALSE(readInPacketI8(in, &data7));
  145. TEST_FALSE(readInPacketI16(in, &data8));
  146. TEST_FALSE(readInPacketI32(in, &data9));
  147. TEST_SIZE(9, readInPacketString(in, data10, sizeof(data10)));
  148. TEST_FALSE(readInPacketFloat(in, &data11));
  149. OutPacket out;
  150. initOutPacket(&out);
  151. if(packageCounter == 0) {
  152. sendServerPacket(client, &out, PACKET_RELIABLE);
  153. } else if(packageCounter == 1) {
  154. sendServerPacket(client, &out, PACKET_SEQUENCED);
  155. } else if(packageCounter == 2) {
  156. sendServerPacket(client, &out, PACKET_UNSEQUENCED);
  157. }
  158. destroyOutPacket(&out);
  159. packageCounter++;
  160. }
  161. static void onClientConnect() {
  162. clientConnected = true;
  163. }
  164. static void onClientDisconnect() {
  165. clientDisconnected = true;
  166. }
  167. static void onClientPacket(InPacket*) {
  168. clientPackage = true;
  169. }
  170. static void testConnect(PacketSendMode mode) {
  171. clientConnected = false;
  172. clientDisconnected = false;
  173. clientPackage = false;
  174. serverConnected = false;
  175. serverDisconnect = false;
  176. data1 = 0;
  177. data2 = 0;
  178. data3 = 0;
  179. data4 = 0;
  180. data5 = 0;
  181. data6 = 0;
  182. data7 = 0;
  183. data8 = 0;
  184. data9 = 0;
  185. *data10 = '\0';
  186. data11 = 0.0f;
  187. resetServerHandler();
  188. setServerConnectHandler(onServerConnect);
  189. setServerDisconnectHandler(onServerDisconnect);
  190. setServerPacketHandler(onServerPacket);
  191. resetClientHandler();
  192. setClientConnectHandler(onClientConnect);
  193. setClientDisconnectHandler(onClientDisconnect);
  194. setClientPacketHandler(onClientPacket);
  195. if(!TEST_FALSE(startServer(54321, 5))) {
  196. return;
  197. } else if(!TEST_FALSE(startClient())) {
  198. return;
  199. } else if(!TEST_FALSE(connectClient("127.0.0.1", 54321, 90))) {
  200. return;
  201. }
  202. TEST_FALSE(isClientConnected());
  203. TEST_TRUE(isClientConnecting());
  204. tick(100);
  205. TEST_TRUE(clientConnected);
  206. TEST_TRUE(isClientConnected());
  207. TEST_FALSE(isClientConnecting());
  208. OutPacket out;
  209. initOutPacket(&out);
  210. writeOutPacketU8(&out, 0xF1);
  211. writeOutPacketU16(&out, 0xF123);
  212. writeOutPacketU32(&out, 0xF1234567);
  213. writeOutPacketI8(&out, -0x71);
  214. writeOutPacketI16(&out, -0x7123);
  215. writeOutPacketI32(&out, -0x71234567);
  216. writeOutPacketI8(&out, 0x71);
  217. writeOutPacketI16(&out, 0x7123);
  218. writeOutPacketI32(&out, 0x71234567);
  219. const char s[] = "Hi there";
  220. writeOutPacketString(&out, s);
  221. writeOutPacketFloat(&out, 252345.983f);
  222. sendClientPacket(&out, mode);
  223. destroyOutPacket(&out);
  224. tick(100);
  225. TEST_TRUE(clientPackage);
  226. TEST_TRUE(serverConnected);
  227. TEST_U64(0xF1, data1);
  228. TEST_U64(0xF123, data2);
  229. TEST_U64(0xF1234567, data3);
  230. TEST_I64(-0x71, data4);
  231. TEST_I64(-0x7123, data5);
  232. TEST_I64(-0x71234567, data6);
  233. TEST_I64(0x71, data7);
  234. TEST_I64(0x7123, data8);
  235. TEST_I64(0x71234567, data9);
  236. TEST_STRING(s, data10);
  237. TEST_FLOAT(252345.983f, data11, 0.01f);
  238. disconnectClient(90);
  239. TEST_FALSE(isClientConnected());
  240. TEST_FALSE(isClientConnecting());
  241. tick(100);
  242. TEST_TRUE(clientDisconnected);
  243. TEST_TRUE(serverDisconnect);
  244. stopClient();
  245. stopServer();
  246. }
  247. static bool disconnected = false;
  248. static void testStopDisconnect(void) {
  249. disconnected = true;
  250. }
  251. static void testDisconnect(void) {
  252. disconnected = false;
  253. resetClientHandler();
  254. setClientDisconnectHandler(testStopDisconnect);
  255. if(!TEST_FALSE(startClient())) {
  256. return;
  257. } else if(!TEST_FALSE(connectClient("127.0.0.1", 54321, 90))) {
  258. return;
  259. }
  260. TEST_FALSE(isClientConnected());
  261. TEST_TRUE(isClientConnecting());
  262. disconnectClient(50);
  263. tickClientN(100);
  264. TEST_FALSE(isClientConnected());
  265. TEST_FALSE(isClientConnecting());
  266. TEST_TRUE(disconnected);
  267. stopClient();
  268. }
  269. static void testStop(void) {
  270. disconnected = false;
  271. resetClientHandler();
  272. setClientDisconnectHandler(testStopDisconnect);
  273. if(!TEST_FALSE(startClient())) {
  274. return;
  275. } else if(!TEST_FALSE(connectClient("127.0.0.1", 54321, 90))) {
  276. return;
  277. }
  278. TEST_FALSE(isClientConnected());
  279. TEST_TRUE(isClientConnecting());
  280. stopClient();
  281. TEST_FALSE(isClientConnected());
  282. TEST_FALSE(isClientConnecting());
  283. TEST_TRUE(disconnected);
  284. }
  285. static void testClientStartFails(void) {
  286. TEST_FALSE(startClient());
  287. logLevel = LOG_NONE;
  288. TEST_TRUE(startClient());
  289. stopClient();
  290. #ifdef ERROR_SIMULATOR
  291. failCounter = 0;
  292. TEST_TRUE(startClient());
  293. failCounter = 1;
  294. TEST_TRUE(startClient());
  295. failCounter = -1;
  296. #endif
  297. logLevel = LOG_DEBUG;
  298. }
  299. static void testClientConnectionFails(void) {
  300. resetClientHandler();
  301. logLevel = LOG_NONE;
  302. TEST_TRUE(connectClient("", 54321, 100));
  303. TEST_FALSE(startClient());
  304. #ifdef ERROR_SIMULATOR
  305. failCounter = 0;
  306. TEST_TRUE(connectClient("", 54321, 100));
  307. failCounter = -1;
  308. #endif
  309. TEST_FALSE(connectClient("", 54321, 100));
  310. TEST_TRUE(connectClient("", 54321, 100));
  311. logLevel = LOG_DEBUG;
  312. tickClientN(100);
  313. stopClient();
  314. }
  315. static void testInvalidClientAccess(void) {
  316. disconnectClient(0);
  317. sendClientPacket(nullptr, 0);
  318. tickClient();
  319. }
  320. static void testServerStartFails(void) {
  321. logLevel = LOG_NONE;
  322. TEST_TRUE(startServer(54321, 0));
  323. #ifdef ERROR_SIMULATOR
  324. failCounter = 0;
  325. TEST_TRUE(startServer(54321, 5));
  326. failCounter = 1;
  327. TEST_TRUE(startServer(54321, 5));
  328. failCounter = -1;
  329. #endif
  330. TEST_FALSE(startServer(54321, 5));
  331. TEST_TRUE(startServer(54321, 5));
  332. logLevel = LOG_DEBUG;
  333. stopServer();
  334. }
  335. static void testServerClosesOnConnected(void) {
  336. clientDisconnected = false;
  337. TEST_FALSE(startServer(54321, 5));
  338. TEST_FALSE(startClient());
  339. setClientDisconnectHandler(onClientDisconnect);
  340. TEST_FALSE(connectClient("127.0.0.1", 54321, 50));
  341. tick(100);
  342. TEST_TRUE(isClientConnected());
  343. stopServer();
  344. setClientTimeout(500, 500, 500);
  345. for(int i = 0; i < 500 && isClientConnected(); i++) {
  346. tickClient();
  347. sleepNanos(10000000);
  348. }
  349. TEST_FALSE(isClientConnected());
  350. TEST_TRUE(clientDisconnected);
  351. stopClient();
  352. }
  353. static Client clientId = 0;
  354. static void onConnectSetClient(Client client) {
  355. clientId = client;
  356. }
  357. static void testServerDisconnectsClient(void) {
  358. clientDisconnected = false;
  359. TEST_FALSE(startServer(54321, 5));
  360. TEST_FALSE(startClient());
  361. setClientDisconnectHandler(onClientDisconnect);
  362. setServerConnectHandler(onConnectSetClient);
  363. TEST_FALSE(connectClient("127.0.0.1", 54321, 50));
  364. tick(100);
  365. TEST_TRUE(isClientConnected());
  366. disconnectServerClient(clientId);
  367. for(int i = 0; i < 500 && isClientConnected(); i++) {
  368. tickClient();
  369. tickServer();
  370. sleepNanos(10000000);
  371. }
  372. TEST_FALSE(isClientConnected());
  373. TEST_TRUE(clientDisconnected);
  374. stopClient();
  375. stopServer();
  376. }
  377. static void onConnectSetTimeout(Client client) {
  378. setServerTimeout(client, 500, 500, 500);
  379. }
  380. static void testClientClosesOnConnected(void) {
  381. serverDisconnect = false;
  382. TEST_FALSE(startServer(54321, 5));
  383. TEST_FALSE(startClient());
  384. setServerDisconnectHandler(onServerDisconnect);
  385. setServerConnectHandler(onConnectSetTimeout);
  386. TEST_FALSE(connectClient("127.0.0.1", 54321, 50));
  387. tick(100);
  388. TEST_TRUE(isClientConnected());
  389. #ifdef ERROR_SIMULATOR
  390. failCounter = 0;
  391. #endif
  392. stopClient();
  393. #ifdef ERROR_SIMULATOR
  394. failCounter = -1;
  395. #endif
  396. for(int i = 0; i < 500 && !serverDisconnect; i++) {
  397. tickServer();
  398. sleepNanos(10000000);
  399. }
  400. TEST_TRUE(serverDisconnect);
  401. stopServer();
  402. }
  403. static void testInvalidServerAccess(void) {
  404. tickServer();
  405. sendServerPacket(0, nullptr, 0);
  406. setServerTimeout(0, 500, 500, 500);
  407. disconnectServerClient(0);
  408. }
  409. static void testDummyCallbacks(void) {
  410. resetClientHandler();
  411. resetServerHandler();
  412. TEST_FALSE(startServer(54321, 5));
  413. TEST_FALSE(startClient());
  414. TEST_FALSE(connectClient("127.0.0.1", 54321, 50));
  415. tick(100);
  416. TEST_TRUE(isClientConnected());
  417. OutPacket out;
  418. initOutPacket(&out);
  419. sendServerPacketBroadcast(&out, PACKET_RELIABLE);
  420. sendClientPacket(&out, PACKET_RELIABLE);
  421. tick(100);
  422. destroyOutPacket(&out);
  423. stopClient();
  424. stopServer();
  425. }
  426. void testNetwork(void) {
  427. testWriteRead();
  428. testTooShortBuffer();
  429. testBinaryData();
  430. testShortString();
  431. testConnect(PACKET_UNSEQUENCED);
  432. testConnect(PACKET_SEQUENCED);
  433. testConnect(PACKET_RELIABLE);
  434. testDisconnect();
  435. testStop();
  436. testClientStartFails();
  437. testClientConnectionFails();
  438. testInvalidClientAccess();
  439. testServerStartFails();
  440. testServerClosesOnConnected();
  441. testServerDisconnectsClient();
  442. testClientClosesOnConnected();
  443. testInvalidServerAccess();
  444. testDummyCallbacks();
  445. }