NetworkTests.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. #include <core/Utility.h>
  2. #include <string.h>
  3. #include "../Tests.h"
  4. #include "../src/ErrorSimulator.h"
  5. #include "core/Network.h"
  6. #define TEST_READ(Type, type, value) \
  7. { \
  8. type u; \
  9. CORE_TEST_FALSE(coreInPacketRead##Type(&in, &u)); \
  10. CORE_TEST_TRUE(u == value); \
  11. }
  12. static void testWriteRead(void) {
  13. CoreOutPacket out;
  14. coreInitOutPacket(&out);
  15. coreOutPacketWriteU8(&out, 200);
  16. coreOutPacketWriteU16(&out, 6656);
  17. coreOutPacketWriteU32(&out, 348923689);
  18. coreOutPacketWriteI8(&out, 90);
  19. coreOutPacketWriteI8(&out, -35);
  20. coreOutPacketWriteI16(&out, 843);
  21. coreOutPacketWriteI16(&out, -8961);
  22. coreOutPacketWriteI32(&out, 100430199);
  23. coreOutPacketWriteI32(&out, -534534);
  24. coreOutPacketWriteFloat(&out, 64564.5346f);
  25. const char s[] = "This is Great";
  26. coreOutPacketWriteString(&out, s);
  27. CoreInPacket in;
  28. coreInitInPacket(&in, out.data.buffer, out.data.size);
  29. TEST_READ(U8, u8, 200)
  30. TEST_READ(U16, u16, 6656)
  31. TEST_READ(U32, u32, 348923689)
  32. TEST_READ(I8, i8, 90)
  33. TEST_READ(I8, i8, -35)
  34. TEST_READ(I16, i16, 843)
  35. TEST_READ(I16, i16, -8961)
  36. TEST_READ(I32, i32, 100430199)
  37. TEST_READ(I32, i32, -534534)
  38. float f;
  39. CORE_TEST_FALSE(coreInPacketReadFloat(&in, &f));
  40. CORE_TEST_FLOAT(64564.5346f, f, 0.00001f);
  41. char buffer[256];
  42. size_t n = coreInPacketReadString(&in, buffer, sizeof(buffer));
  43. CORE_TEST_SIZE(14, n);
  44. CORE_TEST_STRING(s, buffer);
  45. CORE_TEST_TRUE(coreInPacketReadU8(&in, &(u8){0}));
  46. CORE_TEST_TRUE(coreInPacketReadU16(&in, &(u16){0}));
  47. CORE_TEST_TRUE(coreInPacketReadU32(&in, &(u32){0}));
  48. CORE_TEST_TRUE(coreInPacketReadI8(&in, &(i8){0}));
  49. CORE_TEST_TRUE(coreInPacketReadI16(&in, &(i16){0}));
  50. CORE_TEST_TRUE(coreInPacketReadI32(&in, &(i32){0}));
  51. CORE_TEST_TRUE(coreInPacketReadFloat(&in, &(float){0}));
  52. CORE_TEST_SIZE(0, coreInPacketReadString(&in, nullptr, 0));
  53. CORE_TEST_SIZE(0, coreInPacketReadString(&in, buffer, sizeof(buffer)));
  54. coreDestroyOutPacket(&out);
  55. }
  56. static void testTooShortBuffer(void) {
  57. CoreOutPacket out;
  58. coreInitOutPacket(&out);
  59. coreOutPacketWriteString(&out, "This is Great");
  60. coreOutPacketWriteString(&out, "Well hoho");
  61. CoreInPacket in;
  62. coreInitInPacket(&in, out.data.buffer, out.data.size);
  63. char buffer[8];
  64. size_t n = coreInPacketReadString(&in, buffer, sizeof(buffer));
  65. CORE_TEST_SIZE(14, n);
  66. CORE_TEST_STRING("This is", buffer);
  67. char buffer2[6];
  68. size_t n2 = coreInPacketReadString(&in, buffer2, sizeof(buffer2));
  69. CORE_TEST_SIZE(10, n2);
  70. CORE_TEST_STRING("Well ", buffer2);
  71. coreDestroyOutPacket(&out);
  72. }
  73. typedef struct {
  74. u8 a;
  75. u8 b;
  76. } PacketTest;
  77. static void testBinaryData(void) {
  78. CoreOutPacket out;
  79. coreInitOutPacket(&out);
  80. PacketTest data = {56, 3};
  81. coreOutPacketWrite(&out, &data, sizeof(data));
  82. CoreInPacket in;
  83. coreInitInPacket(&in, out.data.buffer, out.data.size);
  84. PacketTest inData;
  85. CORE_TEST_FALSE(coreInPacketRead(&in, &inData, sizeof(inData)));
  86. CORE_TEST_TRUE(memcmp(&inData, &data, sizeof(inData)) == 0);
  87. coreDestroyOutPacket(&out);
  88. }
  89. static void testShortString(void) {
  90. CoreOutPacket out;
  91. coreInitOutPacket(&out);
  92. coreOutPacketWriteU16(&out, 200);
  93. coreOutPacketWriteU16(&out, 65535);
  94. CoreInPacket in;
  95. coreInitInPacket(&in, out.data.buffer, out.data.size);
  96. char buffer[256];
  97. size_t n = coreInPacketReadString(&in, buffer, sizeof(buffer));
  98. CORE_TEST_SIZE(200, n);
  99. CORE_TEST_STRING("", buffer);
  100. coreDestroyOutPacket(&out);
  101. }
  102. static void tickClient(int ticks) {
  103. for(int i = 0; i < ticks; i++) {
  104. coreClientTick();
  105. }
  106. }
  107. static void tick(int ticks) {
  108. for(int i = 0; i < ticks; i++) {
  109. coreClientTick();
  110. coreServerTick();
  111. }
  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(CoreClient) {
  131. serverConnected = true;
  132. }
  133. static void onServerDisconnect(CoreClient) {
  134. serverDisconnect = true;
  135. }
  136. static void onServerPacket(CoreClient client, CoreInPacket* in) {
  137. CORE_TEST_FALSE(coreInPacketReadU8(in, &data1));
  138. CORE_TEST_FALSE(coreInPacketReadU16(in, &data2));
  139. CORE_TEST_FALSE(coreInPacketReadU32(in, &data3));
  140. CORE_TEST_FALSE(coreInPacketReadI8(in, &data4));
  141. CORE_TEST_FALSE(coreInPacketReadI16(in, &data5));
  142. CORE_TEST_FALSE(coreInPacketReadI32(in, &data6));
  143. CORE_TEST_FALSE(coreInPacketReadI8(in, &data7));
  144. CORE_TEST_FALSE(coreInPacketReadI16(in, &data8));
  145. CORE_TEST_FALSE(coreInPacketReadI32(in, &data9));
  146. CORE_TEST_SIZE(9, coreInPacketReadString(in, data10, sizeof(data10)));
  147. CORE_TEST_FALSE(coreInPacketReadFloat(in, &data11));
  148. CoreOutPacket out;
  149. coreInitOutPacket(&out);
  150. if(packageCounter == 0) {
  151. coreServerSend(client, &out, CORE_RELIABLE);
  152. } else if(packageCounter == 1) {
  153. coreServerSend(client, &out, CORE_SEQUENCED);
  154. } else if(packageCounter == 2) {
  155. coreServerSend(client, &out, CORE_UNSEQUENCED);
  156. }
  157. coreDestroyOutPacket(&out);
  158. packageCounter++;
  159. }
  160. static void onClientConnect() {
  161. clientConnected = true;
  162. }
  163. static void onClientDisconnect() {
  164. clientDisconnected = true;
  165. }
  166. static void onClientPacket(CoreInPacket*) {
  167. clientPackage = true;
  168. }
  169. static void testConnect(CorePacketSendMode 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. coreServerResetHandler();
  187. coreServerSetConnectHandler(onServerConnect);
  188. coreServerSetDisconnectHandler(onServerDisconnect);
  189. coreServerSetPacketHandler(onServerPacket);
  190. coreClientResetHandler();
  191. coreClientSetConnectHandler(onClientConnect);
  192. coreClientSetDisconnectHandler(onClientDisconnect);
  193. coreClientSetPacketHandler(onClientPacket);
  194. if(!CORE_TEST_FALSE(coreServerStart(54321, 5))) {
  195. return;
  196. } else if(!CORE_TEST_FALSE(coreClientStart())) {
  197. return;
  198. } else if(!CORE_TEST_FALSE(coreClientConnect("127.0.0.1", 54321, 90))) {
  199. return;
  200. }
  201. CORE_TEST_FALSE(coreClientIsConnected());
  202. CORE_TEST_TRUE(coreClientIsConnecting());
  203. tick(100);
  204. CORE_TEST_TRUE(clientConnected);
  205. CORE_TEST_TRUE(coreClientIsConnected());
  206. CORE_TEST_FALSE(coreClientIsConnecting());
  207. CoreOutPacket out;
  208. coreInitOutPacket(&out);
  209. coreOutPacketWriteU8(&out, 0xF1);
  210. coreOutPacketWriteU16(&out, 0xF123);
  211. coreOutPacketWriteU32(&out, 0xF1234567);
  212. coreOutPacketWriteI8(&out, -0x71);
  213. coreOutPacketWriteI16(&out, -0x7123);
  214. coreOutPacketWriteI32(&out, -0x71234567);
  215. coreOutPacketWriteI8(&out, 0x71);
  216. coreOutPacketWriteI16(&out, 0x7123);
  217. coreOutPacketWriteI32(&out, 0x71234567);
  218. const char s[] = "Hi there";
  219. coreOutPacketWriteString(&out, s);
  220. coreOutPacketWriteFloat(&out, 252345.983f);
  221. coreClientSend(&out, mode);
  222. coreDestroyOutPacket(&out);
  223. tick(100);
  224. CORE_TEST_TRUE(clientPackage);
  225. CORE_TEST_TRUE(serverConnected);
  226. CORE_TEST_U64(0xF1, data1);
  227. CORE_TEST_U64(0xF123, data2);
  228. CORE_TEST_U64(0xF1234567, data3);
  229. CORE_TEST_I64(-0x71, data4);
  230. CORE_TEST_I64(-0x7123, data5);
  231. CORE_TEST_I64(-0x71234567, data6);
  232. CORE_TEST_I64(0x71, data7);
  233. CORE_TEST_I64(0x7123, data8);
  234. CORE_TEST_I64(0x71234567, data9);
  235. CORE_TEST_STRING(s, data10);
  236. CORE_TEST_FLOAT(252345.983f, data11, 0.01f);
  237. coreClientDisconnect(90);
  238. CORE_TEST_FALSE(coreClientIsConnected());
  239. CORE_TEST_FALSE(coreClientIsConnecting());
  240. tick(100);
  241. CORE_TEST_TRUE(clientDisconnected);
  242. CORE_TEST_TRUE(serverDisconnect);
  243. coreClientStop();
  244. coreServerStop();
  245. }
  246. static bool disconnected = false;
  247. static void testStopDisconnect(void) {
  248. disconnected = true;
  249. }
  250. static void testDisconnect(void) {
  251. disconnected = false;
  252. coreClientResetHandler();
  253. coreClientSetDisconnectHandler(testStopDisconnect);
  254. if(!CORE_TEST_FALSE(coreClientStart())) {
  255. return;
  256. } else if(!CORE_TEST_FALSE(coreClientConnect("127.0.0.1", 54321, 90))) {
  257. return;
  258. }
  259. CORE_TEST_FALSE(coreClientIsConnected());
  260. CORE_TEST_TRUE(coreClientIsConnecting());
  261. coreClientDisconnect(50);
  262. tickClient(100);
  263. CORE_TEST_FALSE(coreClientIsConnected());
  264. CORE_TEST_FALSE(coreClientIsConnecting());
  265. CORE_TEST_TRUE(disconnected);
  266. coreClientStop();
  267. }
  268. static void testStop(void) {
  269. disconnected = false;
  270. coreClientResetHandler();
  271. coreClientSetDisconnectHandler(testStopDisconnect);
  272. if(!CORE_TEST_FALSE(coreClientStart())) {
  273. return;
  274. } else if(!CORE_TEST_FALSE(coreClientConnect("127.0.0.1", 54321, 90))) {
  275. return;
  276. }
  277. CORE_TEST_FALSE(coreClientIsConnected());
  278. CORE_TEST_TRUE(coreClientIsConnecting());
  279. coreClientStop();
  280. CORE_TEST_FALSE(coreClientIsConnected());
  281. CORE_TEST_FALSE(coreClientIsConnecting());
  282. CORE_TEST_TRUE(disconnected);
  283. }
  284. static void testClientStartFails(void) {
  285. CORE_TEST_FALSE(coreClientStart());
  286. CORE_TEST_TRUE(coreClientStart());
  287. coreClientStop();
  288. #ifdef ERROR_SIMULATOR
  289. coreFailCounter = 0;
  290. CORE_TEST_TRUE(coreClientStart());
  291. coreFailCounter = 1;
  292. CORE_TEST_TRUE(coreClientStart());
  293. coreFailCounter = -1;
  294. #endif
  295. }
  296. static void testClientConnectionFails(void) {
  297. coreClientResetHandler();
  298. CORE_TEST_TRUE(coreClientConnect("", 54321, 100));
  299. CORE_TEST_FALSE(coreClientStart());
  300. #ifdef ERROR_SIMULATOR
  301. coreFailCounter = 0;
  302. CORE_TEST_TRUE(coreClientConnect("", 54321, 100));
  303. coreFailCounter = -1;
  304. #endif
  305. CORE_TEST_FALSE(coreClientConnect("", 54321, 100));
  306. CORE_TEST_TRUE(coreClientConnect("", 54321, 100));
  307. tickClient(100);
  308. coreClientStop();
  309. }
  310. static void testInvalidClientAccess(void) {
  311. coreClientDisconnect(0);
  312. coreClientSend(nullptr, 0);
  313. coreClientTick();
  314. }
  315. static void testServerStartFails(void) {
  316. CORE_TEST_TRUE(coreServerStart(54321, 0));
  317. #ifdef ERROR_SIMULATOR
  318. coreFailCounter = 0;
  319. CORE_TEST_TRUE(coreServerStart(54321, 5));
  320. coreFailCounter = 1;
  321. CORE_TEST_TRUE(coreServerStart(54321, 5));
  322. coreFailCounter = -1;
  323. #endif
  324. CORE_TEST_FALSE(coreServerStart(54321, 5));
  325. CORE_TEST_TRUE(coreServerStart(54321, 5));
  326. coreServerStop();
  327. }
  328. static void testServerClosesOnConnected(void) {
  329. clientDisconnected = false;
  330. CORE_TEST_FALSE(coreServerStart(54321, 5));
  331. CORE_TEST_FALSE(coreClientStart());
  332. coreClientSetDisconnectHandler(onClientDisconnect);
  333. CORE_TEST_FALSE(coreClientConnect("127.0.0.1", 54321, 50));
  334. tick(100);
  335. CORE_TEST_TRUE(coreClientIsConnected());
  336. coreServerStop();
  337. coreClientTimeout(500, 500, 500);
  338. for(int i = 0; i < 500 && coreClientIsConnected(); i++) {
  339. coreClientTick();
  340. coreSleep(10000000);
  341. }
  342. CORE_TEST_FALSE(coreClientIsConnected());
  343. CORE_TEST_TRUE(clientDisconnected);
  344. coreClientStop();
  345. }
  346. static CoreClient clientId = 0;
  347. static void onConnectSetClient(CoreClient client) {
  348. clientId = client;
  349. }
  350. static void testServerDisconnectsClient(void) {
  351. clientDisconnected = false;
  352. CORE_TEST_FALSE(coreServerStart(54321, 5));
  353. CORE_TEST_FALSE(coreClientStart());
  354. coreClientSetDisconnectHandler(onClientDisconnect);
  355. coreServerSetConnectHandler(onConnectSetClient);
  356. CORE_TEST_FALSE(coreClientConnect("127.0.0.1", 54321, 50));
  357. tick(100);
  358. CORE_TEST_TRUE(coreClientIsConnected());
  359. coreServerDisconnect(clientId);
  360. for(int i = 0; i < 500 && coreClientIsConnected(); i++) {
  361. coreClientTick();
  362. coreServerTick();
  363. coreSleep(10000000);
  364. }
  365. CORE_TEST_FALSE(coreClientIsConnected());
  366. CORE_TEST_TRUE(clientDisconnected);
  367. coreClientStop();
  368. coreServerStop();
  369. }
  370. static void onConnectSetTimeout(CoreClient client) {
  371. coreServerTimeout(client, 500, 500, 500);
  372. }
  373. static void testClientClosesOnConnected(void) {
  374. serverDisconnect = false;
  375. CORE_TEST_FALSE(coreServerStart(54321, 5));
  376. CORE_TEST_FALSE(coreClientStart());
  377. coreServerSetDisconnectHandler(onServerDisconnect);
  378. coreServerSetConnectHandler(onConnectSetTimeout);
  379. CORE_TEST_FALSE(coreClientConnect("127.0.0.1", 54321, 50));
  380. tick(100);
  381. CORE_TEST_TRUE(coreClientIsConnected());
  382. #ifdef ERROR_SIMULATOR
  383. coreFailCounter = 0;
  384. #endif
  385. coreClientStop();
  386. #ifdef ERROR_SIMULATOR
  387. coreFailCounter = -1;
  388. #endif
  389. for(int i = 0; i < 500 && !serverDisconnect; i++) {
  390. coreServerTick();
  391. coreSleep(10000000);
  392. }
  393. CORE_TEST_TRUE(serverDisconnect);
  394. coreServerStop();
  395. }
  396. static void testInvalidServerAccess(void) {
  397. coreServerTick();
  398. coreServerSend(0, nullptr, 0);
  399. coreServerTimeout(0, 500, 500, 500);
  400. coreServerDisconnect(0);
  401. }
  402. static void testDummyCallbacks(void) {
  403. coreClientResetHandler();
  404. coreServerResetHandler();
  405. CORE_TEST_FALSE(coreServerStart(54321, 5));
  406. CORE_TEST_FALSE(coreClientStart());
  407. CORE_TEST_FALSE(coreClientConnect("127.0.0.1", 54321, 50));
  408. tick(100);
  409. CORE_TEST_TRUE(coreClientIsConnected());
  410. CoreOutPacket out;
  411. coreInitOutPacket(&out);
  412. coreServerSendAll(&out, CORE_RELIABLE);
  413. coreClientSend(&out, CORE_RELIABLE);
  414. tick(100);
  415. coreDestroyOutPacket(&out);
  416. coreClientStop();
  417. coreServerStop();
  418. }
  419. void coreTestNetwork(void) {
  420. testWriteRead();
  421. testTooShortBuffer();
  422. testBinaryData();
  423. testShortString();
  424. testConnect(CORE_UNSEQUENCED);
  425. testConnect(CORE_SEQUENCED);
  426. testConnect(CORE_RELIABLE);
  427. testDisconnect();
  428. testStop();
  429. testClientStartFails();
  430. testClientConnectionFails();
  431. testInvalidClientAccess();
  432. testServerStartFails();
  433. testServerClosesOnConnected();
  434. testServerDisconnectsClient();
  435. testClientClosesOnConnected();
  436. testInvalidServerAccess();
  437. testDummyCallbacks();
  438. }