NetworkTests.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. #include <string.h>
  2. #include "../Tests.h"
  3. #include "core/Network.h"
  4. #define TEST_READ(Type, type, value) \
  5. { \
  6. type u; \
  7. CORE_TEST_FALSE(coreInPacketRead##Type(&in, &u)); \
  8. CORE_TEST_TRUE(u == value); \
  9. }
  10. static void testWriteRead(void) {
  11. CoreOutPacket out;
  12. coreInitOutPacket(&out);
  13. coreOutPacketWriteU8(&out, 200);
  14. coreOutPacketWriteU16(&out, 6656);
  15. coreOutPacketWriteU32(&out, 348923689);
  16. coreOutPacketWriteI8(&out, 90);
  17. coreOutPacketWriteI8(&out, -35);
  18. coreOutPacketWriteI16(&out, 843);
  19. coreOutPacketWriteI16(&out, -8961);
  20. coreOutPacketWriteI32(&out, 100430199);
  21. coreOutPacketWriteI32(&out, -534534);
  22. coreOutPacketWriteFloat(&out, 64564.5346f);
  23. const char s[] = "This is Great";
  24. coreOutPacketWriteString(&out, s);
  25. CoreInPacket in;
  26. coreInitInPacket(&in, out.data.buffer, out.data.size);
  27. TEST_READ(U8, u8, 200)
  28. TEST_READ(U16, u16, 6656)
  29. TEST_READ(U32, u32, 348923689)
  30. TEST_READ(I8, i8, 90)
  31. TEST_READ(I8, i8, -35)
  32. TEST_READ(I16, i16, 843)
  33. TEST_READ(I16, i16, -8961)
  34. TEST_READ(I32, i32, 100430199)
  35. TEST_READ(I32, i32, -534534)
  36. float f;
  37. CORE_TEST_FALSE(coreInPacketReadFloat(&in, &f));
  38. CORE_TEST_FLOAT(64564.5346f, f, 0.00001f);
  39. char buffer[256];
  40. size_t n = coreInPacketReadString(&in, buffer, sizeof(buffer));
  41. CORE_TEST_SIZE(14, n);
  42. CORE_TEST_STRING(s, buffer);
  43. CORE_TEST_TRUE(coreInPacketReadU8(&in, &(u8){0}));
  44. CORE_TEST_TRUE(coreInPacketReadU16(&in, &(u16){0}));
  45. CORE_TEST_TRUE(coreInPacketReadU32(&in, &(u32){0}));
  46. CORE_TEST_TRUE(coreInPacketReadI8(&in, &(i8){0}));
  47. CORE_TEST_TRUE(coreInPacketReadI16(&in, &(i16){0}));
  48. CORE_TEST_TRUE(coreInPacketReadI32(&in, &(i32){0}));
  49. CORE_TEST_TRUE(coreInPacketReadFloat(&in, &(float){0}));
  50. CORE_TEST_SIZE(0, coreInPacketReadString(&in, nullptr, 0));
  51. CORE_TEST_SIZE(0, coreInPacketReadString(&in, buffer, sizeof(buffer)));
  52. coreDestroyOutPacket(&out);
  53. }
  54. static void testTooShortBuffer(void) {
  55. CoreOutPacket out;
  56. coreInitOutPacket(&out);
  57. coreOutPacketWriteString(&out, "This is Great");
  58. coreOutPacketWriteString(&out, "Well hoho");
  59. CoreInPacket in;
  60. coreInitInPacket(&in, out.data.buffer, out.data.size);
  61. char buffer[8];
  62. size_t n = coreInPacketReadString(&in, buffer, sizeof(buffer));
  63. CORE_TEST_SIZE(14, n);
  64. CORE_TEST_STRING("This is", buffer);
  65. char buffer2[6];
  66. size_t n2 = coreInPacketReadString(&in, buffer2, sizeof(buffer2));
  67. CORE_TEST_SIZE(10, n2);
  68. CORE_TEST_STRING("Well ", buffer2);
  69. coreDestroyOutPacket(&out);
  70. }
  71. typedef struct {
  72. u8 a;
  73. u8 b;
  74. } PacketTest;
  75. static void testBinaryData(void) {
  76. CoreOutPacket out;
  77. coreInitOutPacket(&out);
  78. PacketTest data = {56, 3};
  79. coreOutPacketWrite(&out, &data, sizeof(data));
  80. CoreInPacket in;
  81. coreInitInPacket(&in, out.data.buffer, out.data.size);
  82. PacketTest inData;
  83. CORE_TEST_FALSE(coreInPacketRead(&in, &inData, sizeof(inData)));
  84. CORE_TEST_TRUE(memcmp(&inData, &data, sizeof(inData)) == 0);
  85. coreDestroyOutPacket(&out);
  86. }
  87. static void testShortString(void) {
  88. CoreOutPacket out;
  89. coreInitOutPacket(&out);
  90. coreOutPacketWriteU16(&out, 200);
  91. coreOutPacketWriteU16(&out, 65535);
  92. CoreInPacket in;
  93. coreInitInPacket(&in, out.data.buffer, out.data.size);
  94. char buffer[256];
  95. size_t n = coreInPacketReadString(&in, buffer, sizeof(buffer));
  96. CORE_TEST_SIZE(200, n);
  97. CORE_TEST_STRING("", buffer);
  98. coreDestroyOutPacket(&out);
  99. }
  100. static void tickClient(int ticks) {
  101. for(int i = 0; i < ticks; i++) {
  102. coreClientTick();
  103. }
  104. }
  105. static void tick(int ticks) {
  106. for(int i = 0; i < ticks; i++) {
  107. coreClientTick();
  108. coreServerTick();
  109. }
  110. }
  111. static bool clientConnected = false;
  112. static bool clientDisconnected = false;
  113. static bool clientPackage = false;
  114. static int packageCounter = 0;
  115. static bool serverConnected = false;
  116. static bool serverDisconnect = false;
  117. static u8 data1 = 0;
  118. static u16 data2 = 0;
  119. static u32 data3 = 0;
  120. static i8 data4 = 0;
  121. static i16 data5 = 0;
  122. static i32 data6 = 0;
  123. static i8 data7 = 0;
  124. static i16 data8 = 0;
  125. static i32 data9 = 0;
  126. static char data10[20];
  127. static float data11 = 0.0f;
  128. static void onServerConnect(CoreClient) {
  129. serverConnected = true;
  130. }
  131. static void onServerDisconnect(CoreClient) {
  132. serverDisconnect = true;
  133. }
  134. static void onServerPacket(CoreClient client, CoreInPacket* in) {
  135. CORE_TEST_FALSE(coreInPacketReadU8(in, &data1));
  136. CORE_TEST_FALSE(coreInPacketReadU16(in, &data2));
  137. CORE_TEST_FALSE(coreInPacketReadU32(in, &data3));
  138. CORE_TEST_FALSE(coreInPacketReadI8(in, &data4));
  139. CORE_TEST_FALSE(coreInPacketReadI16(in, &data5));
  140. CORE_TEST_FALSE(coreInPacketReadI32(in, &data6));
  141. CORE_TEST_FALSE(coreInPacketReadI8(in, &data7));
  142. CORE_TEST_FALSE(coreInPacketReadI16(in, &data8));
  143. CORE_TEST_FALSE(coreInPacketReadI32(in, &data9));
  144. CORE_TEST_SIZE(9, coreInPacketReadString(in, data10, sizeof(data10)));
  145. CORE_TEST_FALSE(coreInPacketReadFloat(in, &data11));
  146. CoreOutPacket out;
  147. coreInitOutPacket(&out);
  148. if(packageCounter == 0) {
  149. coreServerSend(client, &out, CORE_RELIABLE);
  150. } else if(packageCounter == 1) {
  151. coreServerSend(client, &out, CORE_SEQUENCED);
  152. } else if(packageCounter == 2) {
  153. coreServerSend(client, &out, CORE_UNSEQUENCED);
  154. }
  155. coreDestroyOutPacket(&out);
  156. packageCounter++;
  157. }
  158. static void onClientConnect() {
  159. clientConnected = true;
  160. }
  161. static void onClientDisconnect() {
  162. clientDisconnected = true;
  163. }
  164. static void onClientPacket(CoreInPacket*) {
  165. clientPackage = true;
  166. }
  167. static void testConnect(CorePacketSendMode 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. coreServerResetHandler();
  185. coreServerSetConnectHandler(onServerConnect);
  186. coreServerSetDisconnectHandler(onServerDisconnect);
  187. coreServerSetPacketHandler(onServerPacket);
  188. coreClientResetHandler();
  189. coreClientSetConnectHandler(onClientConnect);
  190. coreClientSetDisconnectHandler(onClientDisconnect);
  191. coreClientSetPacketHandler(onClientPacket);
  192. if(!CORE_TEST_FALSE(coreServerStart(54321, 5))) {
  193. return;
  194. } else if(!CORE_TEST_FALSE(coreClientStart())) {
  195. return;
  196. } else if(!CORE_TEST_FALSE(coreClientConnect("127.0.0.1", 54321, 90))) {
  197. return;
  198. }
  199. CORE_TEST_FALSE(coreClientIsConnected());
  200. CORE_TEST_TRUE(coreClientIsConnecting());
  201. tick(100);
  202. CORE_TEST_TRUE(clientConnected);
  203. CORE_TEST_TRUE(coreClientIsConnected());
  204. CORE_TEST_FALSE(coreClientIsConnecting());
  205. CoreOutPacket out;
  206. coreInitOutPacket(&out);
  207. coreOutPacketWriteU8(&out, 0xF1);
  208. coreOutPacketWriteU16(&out, 0xF123);
  209. coreOutPacketWriteU32(&out, 0xF1234567);
  210. coreOutPacketWriteI8(&out, -0x71);
  211. coreOutPacketWriteI16(&out, -0x7123);
  212. coreOutPacketWriteI32(&out, -0x71234567);
  213. coreOutPacketWriteI8(&out, 0x71);
  214. coreOutPacketWriteI16(&out, 0x7123);
  215. coreOutPacketWriteI32(&out, 0x71234567);
  216. const char s[] = "Hi there";
  217. coreOutPacketWriteString(&out, s);
  218. coreOutPacketWriteFloat(&out, 252345.983f);
  219. coreClientSend(&out, mode);
  220. coreDestroyOutPacket(&out);
  221. tick(100);
  222. CORE_TEST_TRUE(clientPackage);
  223. CORE_TEST_TRUE(serverConnected);
  224. CORE_TEST_U64(0xF1, data1);
  225. CORE_TEST_U64(0xF123, data2);
  226. CORE_TEST_U64(0xF1234567, data3);
  227. CORE_TEST_I64(-0x71, data4);
  228. CORE_TEST_I64(-0x7123, data5);
  229. CORE_TEST_I64(-0x71234567, data6);
  230. CORE_TEST_I64(0x71, data7);
  231. CORE_TEST_I64(0x7123, data8);
  232. CORE_TEST_I64(0x71234567, data9);
  233. CORE_TEST_STRING(s, data10);
  234. CORE_TEST_FLOAT(252345.983f, data11, 0.01f);
  235. coreClientDisconnect(90);
  236. CORE_TEST_FALSE(coreClientIsConnected());
  237. CORE_TEST_FALSE(coreClientIsConnecting());
  238. tick(100);
  239. CORE_TEST_TRUE(clientDisconnected);
  240. CORE_TEST_TRUE(serverDisconnect);
  241. coreClientStop();
  242. coreServerStop();
  243. }
  244. static bool disconnected = false;
  245. static void testStopDisconnect(void) {
  246. disconnected = true;
  247. }
  248. static void testDisconnect(void) {
  249. disconnected = false;
  250. coreClientResetHandler();
  251. coreClientSetDisconnectHandler(testStopDisconnect);
  252. if(!CORE_TEST_FALSE(coreClientStart())) {
  253. return;
  254. } else if(!CORE_TEST_FALSE(coreClientConnect("127.0.0.1", 54321, 90))) {
  255. return;
  256. }
  257. CORE_TEST_FALSE(coreClientIsConnected());
  258. CORE_TEST_TRUE(coreClientIsConnecting());
  259. coreClientDisconnect(50);
  260. tickClient(100);
  261. CORE_TEST_FALSE(coreClientIsConnected());
  262. CORE_TEST_FALSE(coreClientIsConnecting());
  263. CORE_TEST_TRUE(disconnected);
  264. coreClientStop();
  265. }
  266. static void testStop(void) {
  267. disconnected = false;
  268. coreClientResetHandler();
  269. coreClientSetDisconnectHandler(testStopDisconnect);
  270. if(!CORE_TEST_FALSE(coreClientStart())) {
  271. return;
  272. } else if(!CORE_TEST_FALSE(coreClientConnect("127.0.0.1", 54321, 90))) {
  273. return;
  274. }
  275. CORE_TEST_FALSE(coreClientIsConnected());
  276. CORE_TEST_TRUE(coreClientIsConnecting());
  277. coreClientStop();
  278. CORE_TEST_FALSE(coreClientIsConnected());
  279. CORE_TEST_FALSE(coreClientIsConnecting());
  280. CORE_TEST_TRUE(disconnected);
  281. }
  282. void coreTestNetwork(void) {
  283. testWriteRead();
  284. testTooShortBuffer();
  285. testBinaryData();
  286. testShortString();
  287. testConnect(CORE_UNSEQUENCED);
  288. testConnect(CORE_SEQUENCED);
  289. testConnect(CORE_RELIABLE);
  290. testDisconnect();
  291. testStop();
  292. }