NetworkTests.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  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, sizeof(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. const char s[] = "This is Great";
  58. coreOutPacketWriteString(&out, s, sizeof(s));
  59. const char s2[] = "Well hoho";
  60. coreOutPacketWriteString(&out, s2, sizeof(s2));
  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 bool checkError(Test& test, const Error e, const char* msg) {
  103. if(e.has()) {
  104. test.checkFalse(true, msg);
  105. return true;
  106. }
  107. return false;
  108. }
  109. static void tickClient(int ticks) {
  110. for(int i = 0; i < ticks; i++) {
  111. Client::tick();
  112. }
  113. }
  114. static void tick(int ticks) {
  115. for(int i = 0; i < ticks; i++) {
  116. Client::tick();
  117. Server::tick();
  118. }
  119. }
  120. static void testConnect(Test& test, PacketSendMode mode) {
  121. static bool clientConnected = false;
  122. static bool clientDisconnected = false;
  123. static bool clientPackage = false;
  124. clientConnected = false;
  125. clientDisconnected = false;
  126. clientPackage = false;
  127. static int packageCounter = 0;
  128. static bool serverConnected = false;
  129. static bool serverDisconnect = false;
  130. static uint8 data1 = 0;
  131. static uint16 data2 = 0;
  132. static uint32 data3 = 0;
  133. static int8 data4 = 0;
  134. static int16 data5 = 0;
  135. static int32 data6 = 0;
  136. static int8 data7 = 0;
  137. static int16 data8 = 0;
  138. static int32 data9 = 0;
  139. static StringBuffer<20> data10;
  140. static float data11 = 0.0f;
  141. static IntVector3 data12;
  142. static Vector3 data13;
  143. serverConnected = false;
  144. serverDisconnect = false;
  145. data1 = 0;
  146. data2 = 0;
  147. data3 = 0;
  148. data4 = 0;
  149. data5 = 0;
  150. data6 = 0;
  151. data7 = 0;
  152. data8 = 0;
  153. data9 = 0;
  154. data10.clear();
  155. data11 = 0.0f;
  156. data12 = IntVector3();
  157. data13 = Vector3();
  158. Server::resetHandler();
  159. Server::setConnectHandler([](Server::Client) { serverConnected = true; });
  160. Server::setDisconnectHandler(
  161. [](Server::Client) { serverDisconnect = true; });
  162. Server::setPacketHandler([](Server::Client client, InPacket& in) {
  163. in.read(data1);
  164. in.read(data2);
  165. in.read(data3);
  166. in.read(data4);
  167. in.read(data5);
  168. in.read(data6);
  169. in.read(data7);
  170. in.read(data8);
  171. in.read(data9);
  172. in.read(data10);
  173. in.read(data11);
  174. in.read(data12);
  175. in.read(data13);
  176. if(packageCounter == 0) {
  177. OutPacket out(0);
  178. Server::send(client, out, PacketSendMode::RELIABLE);
  179. } else if(packageCounter == 1) {
  180. OutPacket out(0);
  181. Server::send(client, out, PacketSendMode::SEQUENCED);
  182. } else if(packageCounter == 2) {
  183. OutPacket out(0);
  184. Server::send(client, out, PacketSendMode::UNSEQUENCED);
  185. }
  186. packageCounter++;
  187. });
  188. Client::resetHandler();
  189. Client::setConnectHandler([]() { clientConnected = true; });
  190. Client::setDisconnectHandler([]() { clientDisconnected = true; });
  191. Client::setPacketHandler([](InPacket&) { clientPackage = true; });
  192. if(checkError(test, Server::start(54321, 5), "server can initialize")) {
  193. return;
  194. } else if(checkError(test, Client::start(), "client can initialize")) {
  195. return;
  196. } else if(checkError(test, Client::connect("127.0.0.1", 54321, 90),
  197. "start connection failed")) {
  198. return;
  199. }
  200. test.checkFalse(Client::isConnected(), "client not connected yet");
  201. test.checkTrue(Client::isConnecting(), "client is connecting");
  202. tick(100);
  203. test.checkTrue(clientConnected, "client called connect callback");
  204. test.checkTrue(Client::isConnected(), "client is connected");
  205. test.checkFalse(Client::isConnecting(), "client is no more connecting");
  206. OutPacket out(50);
  207. out.writeU8(0xF1).writeU16(0xF123).writeU32(0xF1234567);
  208. out.writeS8(-0x71).writeS16(-0x7123).writeS32(-0x71234567);
  209. out.writeS8(0x71).writeS16(0x7123).writeS32(0x71234567);
  210. StringBuffer<20> s("Hi there");
  211. out.writeString(s);
  212. out.writeFloat(252345.983f);
  213. out.writeVector(IntVector3(1, 2, 3));
  214. out.writeVector(Vector3(1.5f, 2.5f, 3.5f));
  215. Client::send(out, mode);
  216. tick(100);
  217. test.checkTrue(clientPackage, "client has received data");
  218. test.checkTrue(serverConnected, "server has connection");
  219. test.checkUnsigned8(0xF1, data1, "correct value is sent 1");
  220. test.checkUnsigned16(0xF123, data2, "correct value is sent 2");
  221. test.checkEqual(0xF1234567u, data3, "correct value is sent 3");
  222. test.checkSigned8(-0x71, data4, "correct value is sent 4");
  223. test.checkSigned16(-0x7123, data5, "correct value is sent 5");
  224. test.checkEqual(-0x71234567, data6, "correct value is sent 6");
  225. test.checkSigned8(0x71, data7, "correct value is sent 7");
  226. test.checkSigned16(0x7123, data8, "correct value is sent 8");
  227. test.checkEqual(0x71234567, data9, "correct value is sent 9");
  228. test.checkEqual(s, data10, "correct value is sent 10");
  229. test.checkFloat(252345.983f, data11, 0.01f, "correct value is sent 11");
  230. test.checkEqual(1, data12[0], "correct value is sent 12|1");
  231. test.checkEqual(2, data12[1], "correct value is sent 12|2");
  232. test.checkEqual(3, data12[2], "correct value is sent 12|3");
  233. test.checkFloat(1.5f, data13[0], 0.01f, "correct value is sent 13|1");
  234. test.checkFloat(2.5f, data13[1], 0.01f, "correct value is sent 13|2");
  235. test.checkFloat(3.5f, data13[2], 0.01f, "correct value is sent 13|3");
  236. Client::disconnect(90);
  237. test.checkFalse(Client::isConnected(), "client was disconnected");
  238. test.checkFalse(Client::isConnecting(), "client is not connecting");
  239. tick(100);
  240. test.checkTrue(clientDisconnected, "client has disconnected");
  241. test.checkTrue(serverDisconnect, "client has disconnected on server");
  242. Client::stop();
  243. Server::stop();
  244. }
  245. static void testDisconnect(Test& test) {
  246. static bool disconnected = false;
  247. disconnected = false;
  248. Client::resetHandler();
  249. Client::setDisconnectHandler([]() { disconnected = true; });
  250. if(checkError(test, Client::start(), "client can initialize")) {
  251. return;
  252. } else if(checkError(test, Client::connect("127.0.0.1", 54321, 90),
  253. "start connection failed")) {
  254. return;
  255. }
  256. test.checkFalse(Client::isConnected(), "client not connected yet");
  257. test.checkTrue(Client::isConnecting(), "client is connecting");
  258. Client::disconnect(50);
  259. tickClient(100);
  260. test.checkFalse(Client::isConnected(), "client was disconnected");
  261. test.checkFalse(Client::isConnecting(), "client is not connecting");
  262. test.checkTrue(disconnected, "client has disconnected");
  263. Client::stop();
  264. }
  265. static void testStop(Test& test) {
  266. static bool disconnected = false;
  267. disconnected = false;
  268. Client::resetHandler();
  269. Client::setDisconnectHandler([]() { disconnected = true; });
  270. if(checkError(test, Client::start(), "client can initialize")) {
  271. return;
  272. } else if(checkError(test, Client::connect("127.0.0.1", 54321, 90),
  273. "start connection failed")) {
  274. return;
  275. }
  276. test.checkFalse(Client::isConnected(), "client not connected yet");
  277. test.checkTrue(Client::isConnecting(), "client is connecting");
  278. Client::stop();
  279. test.checkFalse(Client::isConnected(), "client was disconnected");
  280. test.checkFalse(Client::isConnecting(), "client is not connecting");
  281. test.checkTrue(disconnected, "client has disconnected");
  282. }*/
  283. void coreTestNetwork() {
  284. testWriteRead();
  285. testTooShortBuffer();
  286. testBinaryData();
  287. testShortString();
  288. // testConnect(test, PacketSendMode::UNSEQUENCED);
  289. // testConnect(test, PacketSendMode::RELIABLE);
  290. // testConnect(test, PacketSendMode::SEQUENCED);
  291. // testDisconnect(test);
  292. // testStop(test);
  293. }