module-test.cpp 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185
  1. #include "test_common.h"
  2. #include <thread>
  3. #include <atomic>
  4. #include <semaphore.h>
  5. TEST_START
  6. #if PIKA_SYNTAX_IMPORT_EX_ENABLE
  7. TEST(module, cmodule_import) {
  8. /* init */
  9. g_PikaMemInfo.heapUsedMax = 0;
  10. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  11. __platform_printf("BEGIN\r\n");
  12. /* run */
  13. obj_run(pikaMain,
  14. "from TemplateDevice import qqee\n"
  15. "mytime = qqee()\n");
  16. /* collect */
  17. /* assert */
  18. /* deinit */
  19. EXPECT_STREQ("NameError: name 'TemplateDevice.qqee' is not defined\n",
  20. log_buff[2]);
  21. obj_deinit(pikaMain);
  22. EXPECT_EQ(pikaMemNow(), 0);
  23. }
  24. #endif
  25. TEST(module, while_loop) {
  26. /* init */
  27. g_PikaMemInfo.heapUsedMax = 0;
  28. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  29. extern unsigned char pikaModules_py_a[];
  30. obj_linkLibrary(pikaMain, pikaModules_py_a);
  31. __platform_printf("BEGIN\r\n");
  32. /* run */
  33. obj_run(pikaMain,
  34. "import test_module1\n"
  35. "test_module1.while_loop()\n"
  36. "test_module1");
  37. /* collect */
  38. /* assert */
  39. EXPECT_STREQ("4\r\n", log_buff[1]);
  40. /* deinit */
  41. obj_deinit(pikaMain);
  42. EXPECT_EQ(pikaMemNow(), 0);
  43. }
  44. TEST(module, for_loop) {
  45. /* init */
  46. g_PikaMemInfo.heapUsedMax = 0;
  47. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  48. extern unsigned char pikaModules_py_a[];
  49. obj_linkLibrary(pikaMain, pikaModules_py_a);
  50. __platform_printf("BEGIN\r\n");
  51. /* run */
  52. obj_run(pikaMain,
  53. "import test_module1\n"
  54. "test_module1.for_loop()\n");
  55. /* collect */
  56. /* assert */
  57. EXPECT_STREQ("9\r\n", log_buff[0]);
  58. /* deinit */
  59. obj_deinit(pikaMain);
  60. EXPECT_EQ(pikaMemNow(), 0);
  61. }
  62. TEST(module, script) {
  63. /* init */
  64. g_PikaMemInfo.heapUsedMax = 0;
  65. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  66. extern unsigned char pikaModules_py_a[];
  67. obj_linkLibrary(pikaMain, pikaModules_py_a);
  68. __platform_printf("BEGIN\r\n");
  69. /* run */
  70. obj_run(pikaMain, "import test_module4\n");
  71. /* collect */
  72. /* assert */
  73. EXPECT_STREQ("imported test moulde4\r\n", log_buff[0]);
  74. /* deinit */
  75. obj_deinit(pikaMain);
  76. EXPECT_EQ(pikaMemNow(), 0);
  77. }
  78. TEST(module, __init__) {
  79. /* init */
  80. g_PikaMemInfo.heapUsedMax = 0;
  81. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  82. extern unsigned char pikaModules_py_a[];
  83. obj_linkLibrary(pikaMain, pikaModules_py_a);
  84. __platform_printf("BEGIN\r\n");
  85. /* run */
  86. obj_run(pikaMain, "import GTestTask\n");
  87. /* collect */
  88. /* assert */
  89. EXPECT_EQ(obj_getInt(pikaMain, "GTestTask.testval"), 8848);
  90. EXPECT_STREQ(log_buff[0], "BEGIN\r\n");
  91. /* deinit */
  92. obj_deinit(pikaMain);
  93. EXPECT_EQ(pikaMemNow(), 0);
  94. }
  95. #if PIKA_SYNTAX_IMPORT_EX_ENABLE
  96. TEST(module, __init__2) {
  97. /* init */
  98. g_PikaMemInfo.heapUsedMax = 0;
  99. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  100. extern unsigned char pikaModules_py_a[];
  101. obj_linkLibrary(pikaMain, pikaModules_py_a);
  102. __platform_printf("BEGIN\r\n");
  103. /* run */
  104. obj_run(pikaMain, "import GTestTask as task\n");
  105. /* collect */
  106. /* assert */
  107. EXPECT_EQ(obj_getInt(pikaMain, "task.testval"), 8848);
  108. EXPECT_STREQ(log_buff[0], "BEGIN\r\n");
  109. /* deinit */
  110. obj_deinit(pikaMain);
  111. EXPECT_EQ(pikaMemNow(), 0);
  112. }
  113. #endif
  114. #if PIKA_SYNTAX_IMPORT_EX_ENABLE
  115. TEST(module, import_as_issue1) {
  116. /* init */
  117. g_PikaMemInfo.heapUsedMax = 0;
  118. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  119. extern unsigned char pikaModules_py_a[];
  120. obj_linkLibrary(pikaMain, pikaModules_py_a);
  121. __platform_printf("BEGIN\r\n");
  122. /* run */
  123. obj_run(pikaMain,
  124. "import import_test as my_import\n"
  125. "print(my_import.func())\n"
  126. "print(import_test.func())\n");
  127. /* collect */
  128. /* assert */
  129. EXPECT_STREQ(log_buff[0], "hello\r\n");
  130. EXPECT_STREQ(log_buff[1], "hello\r\n");
  131. EXPECT_STREQ(log_buff[2], "BEGIN\r\n");
  132. /* deinit */
  133. obj_deinit(pikaMain);
  134. EXPECT_EQ(pikaMemNow(), 0);
  135. }
  136. #endif
  137. #if PIKA_SYNTAX_LEVEL == PIKA_SYNTAX_LEVEL_MAXIMAL
  138. TEST(module, unittest_test1) {
  139. /* init */
  140. g_PikaMemInfo.heapUsedMax = 0;
  141. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  142. extern unsigned char pikaModules_py_a[];
  143. obj_linkLibrary(pikaMain, pikaModules_py_a);
  144. /* run */
  145. __platform_printf("BEGIN\r\n");
  146. pikaVM_runSingleFile(pikaMain, "test/python/unittest/test1.py");
  147. /* collect */
  148. int testsRun = obj_getInt(pikaMain, "res.testsRun");
  149. int errorsNum = obj_getInt(pikaMain, "res.errorsNum");
  150. /* assert */
  151. EXPECT_EQ(testsRun, 3);
  152. EXPECT_EQ(errorsNum, 0);
  153. /* deinit */
  154. obj_deinit(pikaMain);
  155. EXPECT_EQ(pikaMemNow(), 0);
  156. }
  157. #endif
  158. #if PIKA_SYNTAX_LEVEL == PIKA_SYNTAX_LEVEL_MAXIMAL
  159. TEST(module, unittest_test2) {
  160. /* init */
  161. g_PikaMemInfo.heapUsedMax = 0;
  162. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  163. extern unsigned char pikaModules_py_a[];
  164. obj_linkLibrary(pikaMain, pikaModules_py_a);
  165. /* run */
  166. __platform_printf("BEGIN\r\n");
  167. pikaVM_runSingleFile(pikaMain, "test/python/unittest/test2.py");
  168. /* collect */
  169. int testsRun = obj_getInt(pikaMain, "res.testsRun");
  170. int errorsNum = obj_getInt(pikaMain, "res.errorsNum");
  171. /* assert */
  172. EXPECT_EQ(testsRun, 4);
  173. EXPECT_EQ(errorsNum, 1);
  174. /* deinit */
  175. obj_deinit(pikaMain);
  176. EXPECT_EQ(pikaMemNow(), 0);
  177. }
  178. TEST(module, unittest_test3) {
  179. /* init */
  180. g_PikaMemInfo.heapUsedMax = 0;
  181. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  182. extern unsigned char pikaModules_py_a[];
  183. obj_linkLibrary(pikaMain, pikaModules_py_a);
  184. /* run */
  185. __platform_printf("BEGIN\r\n");
  186. pikaVM_runSingleFile(pikaMain, "test/python/unittest/test3.py");
  187. /* collect */
  188. int testsRun = obj_getInt(pikaMain, "res.testsRun");
  189. int errorsNum = obj_getInt(pikaMain, "res.errorsNum");
  190. /* assert */
  191. EXPECT_EQ(testsRun, 1);
  192. EXPECT_EQ(errorsNum, 0);
  193. /* deinit */
  194. obj_deinit(pikaMain);
  195. EXPECT_EQ(pikaMemNow(), 0);
  196. }
  197. #endif
  198. TEST(socket, gethostname) {
  199. /* init */
  200. g_PikaMemInfo.heapUsedMax = 0;
  201. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  202. extern unsigned char pikaModules_py_a[];
  203. obj_linkLibrary(pikaMain, pikaModules_py_a);
  204. /* run */
  205. __platform_printf("BEGIN\r\n");
  206. pikaVM_runSingleFile(pikaMain, "test/python/socket/gethostname.py");
  207. /* collect */
  208. /* assert */
  209. EXPECT_EQ(ARG_TYPE_STRING, args_getType(pikaMain->list, "hostname"));
  210. /* deinit */
  211. obj_deinit(pikaMain);
  212. EXPECT_EQ(pikaMemNow(), 0);
  213. }
  214. #if !PIKA_NANO_ENABLE
  215. TEST(socket, server_client) {
  216. /* init */
  217. g_PikaMemInfo.heapUsedMax = 0;
  218. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  219. extern unsigned char pikaModules_py_a[];
  220. obj_linkLibrary(pikaMain, pikaModules_py_a);
  221. /* run */
  222. __platform_printf("BEGIN\r\n");
  223. pikaVM_runSingleFile(pikaMain, "test/python/socket/server_client.py");
  224. /* collect */
  225. /* assert */
  226. EXPECT_STREQ(log_buff[2], "recv from client: 127.0.0.1\r\n");
  227. EXPECT_STREQ(log_buff[1], "server recv: send test from client\r\n");
  228. EXPECT_STREQ(log_buff[0], "client recv: send test from server\r\n");
  229. /* deinit */
  230. obj_deinit(pikaMain);
  231. EXPECT_EQ(pikaMemNow(), 0);
  232. }
  233. TEST(socket, thread) {
  234. /* init */
  235. g_PikaMemInfo.heapUsedMax = 0;
  236. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  237. extern unsigned char pikaModules_py_a[];
  238. obj_linkLibrary(pikaMain, pikaModules_py_a);
  239. /* run */
  240. __platform_printf("BEGIN\r\n");
  241. pikaVM_runSingleFile(pikaMain, "test/python/socket/socket_thread.py");
  242. /* collect */
  243. /* assert */
  244. EXPECT_STREQ(log_buff[4], "socket server accepted at 127.0.0.1\r\n");
  245. EXPECT_STREQ(log_buff[3], "socket server recv: hello\r\n");
  246. EXPECT_STREQ(log_buff[2], "client recv: hello\r\n");
  247. EXPECT_STREQ(log_buff[1], "socket server closing accept\r\n");
  248. EXPECT_STREQ(log_buff[0], "socket server closing\r\n");
  249. /* deinit */
  250. obj_deinit(pikaMain);
  251. EXPECT_EQ(pikaMemNow(), 0);
  252. }
  253. #if PIKA_FLOAT_TYPE_DOUBLE
  254. TEST(socket, json_issue) {
  255. /* init */
  256. g_PikaMemInfo.heapUsedMax = 0;
  257. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  258. extern unsigned char pikaModules_py_a[];
  259. obj_linkLibrary(pikaMain, pikaModules_py_a);
  260. /* run */
  261. __platform_printf("BEGIN\r\n");
  262. pikaVM_runSingleFile(pikaMain, "test/python/socket/socket_json.py");
  263. /* collect */
  264. /* assert */
  265. EXPECT_STREQ(log_buff[2],
  266. "client recv: "
  267. "{\n\t\"result\":\t{\n\t\t\"a_a\":\t{\n\t\t\t\"value\":\t0.29,"
  268. "\n\t\t\t\"desc\":\t\"A "
  269. "\347\233\270\347\224\265\346\265\201\"\n\t\t}\n\t},"
  270. "\n\t\"code\":\t0\n}\r\n");
  271. EXPECT_STREQ(log_buff[4],
  272. "client recv: "
  273. "{\n\t\"result\":\t{\n\t\t\"a_a\":\t{\n\t\t\t\"value\":\t0.29,"
  274. "\n\t\t\t\"desc\":\t\"A "
  275. "\347\233\270\347\224\265\346\265\201\"\n\t\t}\n\t},"
  276. "\n\t\"code\":\t0\n}\r\n");
  277. /* deinit */
  278. obj_deinit(pikaMain);
  279. EXPECT_EQ(pikaMemNow(), 0);
  280. }
  281. #endif
  282. TEST_RUN_SINGLE_FILE_ASSERT(socket,
  283. socket_GET,
  284. "test/python/socket/socket_GET.py",
  285. obj_getBool(pikaMain, "res") == pika_true)
  286. TEST_RUN_SINGLE_FILE_PASS(socket,
  287. socket_DNS,
  288. "test/python/socket/socket_DNS.py")
  289. #endif
  290. #if !PIKA_NANO_ENABLE
  291. TEST(re, match) {
  292. /* init */
  293. g_PikaMemInfo.heapUsedMax = 0;
  294. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  295. extern unsigned char pikaModules_py_a[];
  296. obj_linkLibrary(pikaMain, pikaModules_py_a);
  297. /* run */
  298. __platform_printf("BEGIN\r\n");
  299. pikaVM_runSingleFile(pikaMain, "test/python/re/match.py");
  300. /* collect */
  301. /* assert */
  302. EXPECT_STREQ(log_buff[3], "BEGIN\r\n");
  303. EXPECT_STREQ(log_buff[2],
  304. "matchObj.group(0) : Cats are smarter than dogs\r\n");
  305. EXPECT_STREQ(log_buff[1], "matchObj.group(1) : Cats\r\n");
  306. EXPECT_STREQ(log_buff[0], "matchObj.group(2) : smarter\r\n");
  307. /* deinit */
  308. obj_deinit(pikaMain);
  309. EXPECT_EQ(pikaMemNow(), 0);
  310. }
  311. #endif
  312. #if !PIKA_NANO_ENABLE
  313. TEST(re, search) {
  314. /* init */
  315. g_PikaMemInfo.heapUsedMax = 0;
  316. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  317. extern unsigned char pikaModules_py_a[];
  318. obj_linkLibrary(pikaMain, pikaModules_py_a);
  319. /* run */
  320. __platform_printf("BEGIN\r\n");
  321. pikaVM_runSingleFile(pikaMain, "test/python/re/search.py");
  322. /* collect */
  323. /* assert */
  324. EXPECT_STREQ(log_buff[2], "BEGIN\r\n");
  325. EXPECT_STREQ(log_buff[1], "(0, 3)\r\n");
  326. EXPECT_STREQ(log_buff[0], "(11, 14)\r\n");
  327. /* deinit */
  328. obj_deinit(pikaMain);
  329. EXPECT_EQ(pikaMemNow(), 0);
  330. }
  331. #endif
  332. #if !PIKA_NANO_ENABLE
  333. TEST(re, sub) {
  334. /* init */
  335. g_PikaMemInfo.heapUsedMax = 0;
  336. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  337. extern unsigned char pikaModules_py_a[];
  338. obj_linkLibrary(pikaMain, pikaModules_py_a);
  339. /* run */
  340. __platform_printf("BEGIN\r\n");
  341. pikaVM_runSingleFile(pikaMain, "test/python/re/sub.py");
  342. /* collect */
  343. /* assert */
  344. EXPECT_STREQ(log_buff[2], "BEGIN\r\n");
  345. EXPECT_STREQ(log_buff[1], "the phone number is: 2004-959-559 \r\n");
  346. EXPECT_STREQ(log_buff[0], "the phone number is: 2004959559\r\n");
  347. /* deinit */
  348. obj_deinit(pikaMain);
  349. EXPECT_EQ(pikaMemNow(), 0);
  350. }
  351. #endif
  352. #if !PIKA_NANO_ENABLE
  353. TEST(re, findall) {
  354. /* init */
  355. g_PikaMemInfo.heapUsedMax = 0;
  356. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  357. extern unsigned char pikaModules_py_a[];
  358. obj_linkLibrary(pikaMain, pikaModules_py_a);
  359. /* run */
  360. __platform_printf("BEGIN\r\n");
  361. pikaVM_runSingleFile(pikaMain, "test/python/re/findall.py");
  362. /* collect */
  363. /* assert */
  364. EXPECT_STREQ(log_buff[2], "BEGIN\r\n");
  365. EXPECT_STREQ(
  366. log_buff[1],
  367. "[('2020', '1', '1'), ('2022', '12', '22'), ('2018', '3', '31')]\r\n");
  368. EXPECT_STREQ(
  369. log_buff[0],
  370. "date: 2020, 2022, 2018. Wrong format: 2031-13-31, 2032-12-33 ...\r\n");
  371. /* deinit */
  372. obj_deinit(pikaMain);
  373. EXPECT_EQ(pikaMemNow(), 0);
  374. }
  375. #endif
  376. #if !PIKA_NANO_ENABLE
  377. TEST(modbus, rtu_master) {
  378. /* init */
  379. g_PikaMemInfo.heapUsedMax = 0;
  380. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  381. extern unsigned char pikaModules_py_a[];
  382. obj_linkLibrary(pikaMain, pikaModules_py_a);
  383. /* run */
  384. __platform_printf("BEGIN\r\n");
  385. pikaVM_runSingleFile(pikaMain, "test/python/modbus/rtu_master.py");
  386. /* collect */
  387. /* assert */
  388. EXPECT_STREQ(log_buff[6], "BEGIN\r\n");
  389. EXPECT_STREQ(log_buff[5],
  390. "b'\\x01\\x03\\x00\\x00\\x00\\x0a\\xc5\\xcd'\r\n");
  391. EXPECT_STREQ(log_buff[4], "[0, 0, 1234, 0, 0, 123, 0, 0, 0, 0]\r\n");
  392. EXPECT_STREQ(log_buff[3],
  393. "b'\\x01\\x04\\x00\\x00\\x00\\x02\\x71\\xcb'\r\n");
  394. EXPECT_STREQ(log_buff[2], "[0, 2278]\r\n");
  395. EXPECT_STREQ(log_buff[1],
  396. "b'\\x01\\x06\\x00\\x00\\x12\\x34\\x84\\xbd'\r\n");
  397. EXPECT_STREQ(log_buff[0],
  398. "b'\\x01\\x0f\\x00\\x00\\x00\\x08\\x01\\x57\\xbf\\x6b'\r\n");
  399. /* deinit */
  400. obj_deinit(pikaMain);
  401. EXPECT_EQ(pikaMemNow(), 0);
  402. }
  403. TEST(proxy, test1) {
  404. /* init */
  405. g_PikaMemInfo.heapUsedMax = 0;
  406. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  407. extern unsigned char pikaModules_py_a[];
  408. obj_linkLibrary(pikaMain, pikaModules_py_a);
  409. /* run */
  410. __platform_printf("BEGIN\r\n");
  411. pikaVM_runSingleFile(pikaMain, "test/python/proxy/proxy1.py");
  412. /* collect */
  413. /* assert */
  414. EXPECT_STREQ(log_buff[1], "BEGIN\r\n");
  415. EXPECT_STREQ(log_buff[0], "set value = 20\r\n");
  416. /* deinit */
  417. obj_deinit(pikaMain);
  418. EXPECT_EQ(pikaMemNow(), 0);
  419. }
  420. TEST(issue, global) {
  421. /* init */
  422. g_PikaMemInfo.heapUsedMax = 0;
  423. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  424. extern unsigned char pikaModules_py_a[];
  425. obj_linkLibrary(pikaMain, pikaModules_py_a);
  426. /* run */
  427. __platform_printf("BEGIN\r\n");
  428. pikaVM_runSingleFile(pikaMain, "test/python/issue/issue_global.py");
  429. /* collect */
  430. /* assert */
  431. EXPECT_EQ(obj_getInt(pikaMain, "testpara.timer2_flag"), 1);
  432. /* deinit */
  433. obj_deinit(pikaMain);
  434. EXPECT_EQ(pikaMemNow(), 0);
  435. }
  436. TEST(module, mod1_mod2_mod1) {
  437. /* init */
  438. g_PikaMemInfo.heapUsedMax = 0;
  439. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  440. extern unsigned char pikaModules_py_a[];
  441. obj_linkLibrary(pikaMain, pikaModules_py_a);
  442. /* run */
  443. __platform_printf("BEGIN\r\n");
  444. obj_run(pikaMain,
  445. "import test_module1\n"
  446. "test_module1.test_module2.test_module1.mytest()");
  447. /* collect */
  448. /* assert */
  449. EXPECT_STREQ(log_buff[0], "test_module_1_hello\r\n");
  450. /* deinit */
  451. obj_deinit(pikaMain);
  452. EXPECT_EQ(pikaMemNow(), 0);
  453. }
  454. TEST(module, improt_as_cmodule) {
  455. /* init */
  456. g_PikaMemInfo.heapUsedMax = 0;
  457. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  458. extern unsigned char pikaModules_py_a[];
  459. obj_linkLibrary(pikaMain, pikaModules_py_a);
  460. /* run */
  461. __platform_printf("BEGIN\r\n");
  462. obj_run(pikaMain, "from PikaStdData import String as string\n");
  463. /* collect */
  464. /* assert */
  465. /* deinit */
  466. obj_deinit(pikaMain);
  467. EXPECT_EQ(pikaMemNow(), 0);
  468. }
  469. extern "C" {
  470. volatile FILE* f_getchar_fp = NULL;
  471. char f_getchar(void) {
  472. char c = 0;
  473. size_t n = fread(&c, 1, 1, (FILE*)f_getchar_fp);
  474. if (n > 0) {
  475. return c;
  476. }
  477. pika_platform_printf("f_getchar error\r\n");
  478. pika_assert(0);
  479. return -1;
  480. }
  481. void pikaScriptShell_withGetchar(PikaObj* self, sh_getchar getchar_fn);
  482. }
  483. TEST(module, REPL_runbytecode) {
  484. /* init */
  485. g_PikaMemInfo.heapUsedMax = 0;
  486. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  487. extern unsigned char pikaModules_py_a[];
  488. obj_linkLibrary(pikaMain, pikaModules_py_a);
  489. /* run */
  490. __platform_printf("BEGIN\r\n");
  491. f_getchar_fp = fopen("package/pikascript/cjson_test.py.o", "rb");
  492. pikaScriptShell_withGetchar(pikaMain, f_getchar);
  493. fclose((FILE*)f_getchar_fp);
  494. obj_run(pikaMain, "test_start()");
  495. /* collect */
  496. /* assert */
  497. EXPECT_STREQ(log_buff[0], "shopping\r\n");
  498. /* deinit */
  499. obj_deinit(pikaMain);
  500. EXPECT_EQ(pikaMemNow(), 0);
  501. }
  502. TEST(module, REPL_pya) {
  503. /* init */
  504. g_PikaMemInfo.heapUsedMax = 0;
  505. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  506. extern unsigned char pikaModules_py_a[];
  507. obj_linkLibrary(pikaMain, pikaModules_py_a);
  508. /* run */
  509. __platform_printf("BEGIN\r\n");
  510. f_getchar_fp =
  511. fopen("package/pikascript/pikascript-api/pikaModules.py.a", "rb");
  512. pikaScriptShell_withGetchar(pikaMain, f_getchar);
  513. fclose((FILE*)f_getchar_fp);
  514. // obj_run(pikaMain, "test_start()");
  515. /* collect */
  516. /* assert */
  517. // EXPECT_STREQ(log_buff[0], "shopping\r\n");
  518. /* deinit */
  519. obj_deinit(pikaMain);
  520. EXPECT_EQ(pikaMemNow(), 0);
  521. }
  522. TEST(module, REPL_script) {
  523. /* init */
  524. g_PikaMemInfo.heapUsedMax = 0;
  525. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  526. extern unsigned char pikaModules_py_a[];
  527. obj_linkLibrary(pikaMain, pikaModules_py_a);
  528. /* run */
  529. __platform_printf("BEGIN\r\n");
  530. f_getchar_fp = fopen("test/python/UnitTest.py", "rb");
  531. pikaScriptShell_withGetchar(pikaMain, f_getchar);
  532. fclose((FILE*)f_getchar_fp);
  533. /* collect */
  534. /* assert */
  535. EXPECT_STREQ(log_buff[3], "mem used max:\r\n");
  536. /* deinit */
  537. obj_deinit(pikaMain);
  538. EXPECT_EQ(pikaMemNow(), 0);
  539. }
  540. TEST(module, REPL_script_2) {
  541. /* init */
  542. g_PikaMemInfo.heapUsedMax = 0;
  543. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  544. extern unsigned char pikaModules_py_a[];
  545. obj_linkLibrary(pikaMain, pikaModules_py_a);
  546. /* run */
  547. __platform_printf("BEGIN\r\n");
  548. f_getchar_fp = fopen("test/python/UnitTest2.py", "rb");
  549. pikaScriptShell_withGetchar(pikaMain, f_getchar);
  550. fclose((FILE*)f_getchar_fp);
  551. /* collect */
  552. /* assert */
  553. EXPECT_STREQ(log_buff[1], "mem used max:\r\n");
  554. /* deinit */
  555. obj_deinit(pikaMain);
  556. EXPECT_EQ(pikaMemNow(), 0);
  557. }
  558. TEST(module, REPL_big_script) {
  559. /* init */
  560. g_PikaMemInfo.heapUsedMax = 0;
  561. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  562. extern unsigned char pikaModules_py_a[];
  563. obj_linkLibrary(pikaMain, pikaModules_py_a);
  564. /* run */
  565. __platform_printf("BEGIN\r\n");
  566. f_getchar_fp = fopen("package/pikascript/cjson_test.py", "rb");
  567. pikaScriptShell_withGetchar(pikaMain, f_getchar);
  568. fclose((FILE*)f_getchar_fp);
  569. /* collect */
  570. /* assert */
  571. EXPECT_STREQ(log_buff[0],
  572. "\r\nError: line buff overflow, please use bigger "
  573. "'PIKA_LINE_BUFF_SIZE'\r\n");
  574. /* deinit */
  575. obj_deinit(pikaMain);
  576. EXPECT_EQ(pikaMemNow(), 0);
  577. }
  578. TEST(module, REPL_stdtask) {
  579. /* init */
  580. g_PikaMemInfo.heapUsedMax = 0;
  581. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  582. extern unsigned char pikaModules_py_a[];
  583. obj_linkLibrary(pikaMain, pikaModules_py_a);
  584. /* run */
  585. __platform_printf("BEGIN\r\n");
  586. f_getchar_fp = fopen("test/python/std/stdtask.py", "rb");
  587. pikaScriptShell_withGetchar(pikaMain, f_getchar);
  588. fclose((FILE*)f_getchar_fp);
  589. /* collect */
  590. /* assert */
  591. /* deinit */
  592. obj_deinit(pikaMain);
  593. EXPECT_EQ(pikaMemNow(), 0);
  594. }
  595. TEST_RUN_SINGLE_FILE(modbus,
  596. rtu_master_err,
  597. "test/python/modbus/rtu_master_err.py")
  598. TEST_RUN_SINGLE_FILE_PASS(proxy, proxy3, "test/python/proxy/proxy3.py")
  599. #if PIKA_FLOAT_TYPE_DOUBLE
  600. TEST_RUN_SINGLE_FILE_PASS(struct, pack, "test/python/struct/pack.py")
  601. TEST_RUN_SINGLE_FILE_PASS(struct, unpack, "test/python/struct/unpack.py")
  602. #endif
  603. extern "C" {
  604. #define PIKA_USING_FLASHDB 1
  605. #if PIKA_USING_FLASHDB
  606. // #include <pthread.h>
  607. #include <sys/stat.h>
  608. #include <sys/types.h>
  609. #include "flashdb.h"
  610. #define FDB_LOG_TAG "[main]"
  611. // static pthread_mutex_t kv_locker, ts_locker;
  612. static uint32_t boot_count = 0;
  613. static time_t boot_time[10] = {0, 1, 2, 3};
  614. /* default KV nodes */
  615. static struct fdb_default_kv_node default_kv_table[] = {
  616. {"username", (void*)"armink", 0}, /* string KV */
  617. {"password", (void*)"123456", 0}, /* string KV */
  618. {"boot_count", &boot_count, sizeof(boot_count)}, /* int type KV */
  619. {"boot_time", &boot_time, sizeof(boot_time)}, /* int array type KV */
  620. };
  621. /* KVDB object */
  622. static struct fdb_kvdb kvdb = {0};
  623. /* TSDB object */
  624. struct fdb_tsdb tsdb = {0};
  625. /* counts for simulated timestamp */
  626. static int counts = 0;
  627. extern void kvdb_basic_sample(fdb_kvdb_t kvdb);
  628. extern void kvdb_type_string_sample(fdb_kvdb_t kvdb);
  629. extern void kvdb_type_blob_sample(fdb_kvdb_t kvdb);
  630. extern void tsdb_sample(fdb_tsdb_t tsdb);
  631. /*
  632. static void lock(fdb_db_t db)
  633. {
  634. pthread_mutex_lock((pthread_mutex_t *)db->user_data);
  635. }
  636. static void unlock(fdb_db_t db)
  637. {
  638. pthread_mutex_unlock((pthread_mutex_t *)db->user_data);
  639. }
  640. */
  641. static fdb_time_t get_time(void) {
  642. return time(NULL);
  643. }
  644. #endif
  645. int test_flashdb(void) {
  646. #if PIKA_USING_FLASHDB
  647. __platform_printf(" FDB_LOG_TAG :%s \r\n", FDB_LOG_TAG);
  648. fdb_err_t result;
  649. bool file_mode = true;
  650. uint32_t sec_size = 4096, db_size = sec_size * 4;
  651. #undef FDB_USING_KVDB
  652. #define FDB_USING_KVDB 1
  653. #ifdef FDB_USING_KVDB
  654. { /* KVDB Sample */
  655. struct fdb_default_kv default_kv;
  656. default_kv.kvs = default_kv_table;
  657. default_kv.num = sizeof(default_kv_table) / sizeof(default_kv_table[0]);
  658. /* set the lock and unlock function if you want */
  659. // pthread_mutex_init(&kv_locker, NULL);
  660. // fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_LOCK, (void *)lock);
  661. // fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_UNLOCK, (void
  662. // *)unlock);
  663. /* set the sector and database max size */
  664. fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_SEC_SIZE, &sec_size);
  665. fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_MAX_SIZE, &db_size);
  666. /* enable file mode */
  667. fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_FILE_MODE, &file_mode);
  668. /* create database directory */
  669. mkdir("test/out/fdb_kvdb1", 0777);
  670. /* Key-Value database initialization
  671. *
  672. * &kvdb: database object
  673. * "env": database name
  674. * "test/out/fdb_kvdb1": The flash partition name base on FAL. Please
  675. * make sure it's in FAL partition table. Please change to YOUR
  676. * partition name. &default_kv: The default KV nodes. It will auto add
  677. * to KVDB when first initialize successfully. &kv_locker: The locker
  678. * object.
  679. */
  680. // result = fdb_kvdb_init(&kvdb, "env", "test/out/fdb_kvdb1",
  681. // &default_kv, &kv_locker);
  682. result = fdb_kvdb_init(&kvdb, "env", "test/out/fdb_kvdb1", &default_kv,
  683. NULL);
  684. if (result != FDB_NO_ERR) {
  685. return -1;
  686. }
  687. /* run basic KV samples */
  688. kvdb_basic_sample(&kvdb);
  689. /* run string KV samples */
  690. kvdb_type_string_sample(&kvdb);
  691. /* run blob KV samples */
  692. kvdb_type_blob_sample(&kvdb);
  693. fdb_kvdb_deinit(&kvdb);
  694. }
  695. #endif /* FDB_USING_KVDB */
  696. // #define FDB_USING_TSDB 1
  697. #ifdef FDB_USING_TSDB
  698. { /* TSDB Sample */
  699. /* set the lock and unlock function if you want */
  700. // pthread_mutex_init(&ts_locker, NULL);
  701. // fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_LOCK, (void *)lock);
  702. // fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_UNLOCK, (void *)unlock);
  703. /* set the sector and database max size */
  704. fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_SEC_SIZE, &sec_size);
  705. fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_MAX_SIZE, &db_size);
  706. /* enable file mode */
  707. fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_FILE_MODE, &file_mode);
  708. /* create database directory */
  709. mkdir("test/out/fdb_tsdb1", 0777);
  710. /* Time series database initialization
  711. *
  712. * &tsdb: database object
  713. * "log": database name
  714. * "test/out/fdb_tsdb1": The flash partition name base on FAL. Please
  715. * make sure it's in FAL partition table. Please change to YOUR
  716. * partition name. get_time: The get current timestamp function. 128:
  717. * maximum length of each log ts_locker: The locker object.
  718. */
  719. // result = fdb_tsdb_init(&tsdb, "log", "test/out/fdb_tsdb1", get_time,
  720. // 128, &ts_locker);
  721. result = fdb_tsdb_init(&tsdb, "log", "test/out/fdb_tsdb1", get_time,
  722. 128, NULL);
  723. /* read last saved time for simulated timestamp */
  724. fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_GET_LAST_TIME, &counts);
  725. if (result != FDB_NO_ERR) {
  726. return -1;
  727. }
  728. /* run TSDB sample */
  729. tsdb_sample(&tsdb);
  730. /* close TSDB */
  731. fdb_tsdb_deinit(&tsdb);
  732. }
  733. #endif /* FDB_USING_TSDB */
  734. #else
  735. __platform_printf(" FDB NOT INUSE \r\n");
  736. #endif
  737. return 0;
  738. }
  739. }
  740. TEST(flashdb, base) {
  741. EXPECT_EQ(test_flashdb(), 0);
  742. }
  743. TEST_RUN_SINGLE_FILE_EXCEPT_OUTPUT(flashdb,
  744. kvdb1,
  745. "test/python/flashdb/flashdb_kvdb1.py",
  746. "PASS\r\n")
  747. TEST_RUN_SINGLE_FILE_EXCEPT_OUTPUT(flashdb,
  748. kvdb2,
  749. "test/python/flashdb/flashdb_kvdb2.py",
  750. "PASS\r\n")
  751. #if PIKA_FLOAT_TYPE_DOUBLE
  752. TEST_RUN_SINGLE_FILE_EXCEPT_OUTPUT(flashdb,
  753. tsdb1,
  754. "test/python/flashdb/flashdb_tsdb1.py",
  755. "PASS\r\n")
  756. #endif
  757. #endif
  758. TEST(fuzzypid, base) {
  759. #define DOF 6
  760. // Default fuzzy rule base of delta kp/ki/kd
  761. int rule_base[][qf_default] = {// delta kp rule base
  762. {PB, PB, PM, PM, PS, ZO, ZO},
  763. {PB, PB, PM, PS, PS, ZO, NS},
  764. {PM, PM, PM, PS, ZO, NS, NS},
  765. {PM, PM, PS, ZO, NS, NM, NM},
  766. {PS, PS, ZO, NS, NS, NM, NM},
  767. {PS, ZO, NS, NM, NM, NM, NB},
  768. {ZO, ZO, NM, NM, NM, NB, NB},
  769. // delta ki rule base
  770. {NB, NB, NM, NM, NS, ZO, ZO},
  771. {NB, NB, NM, NS, NS, ZO, ZO},
  772. {NB, NM, NS, NS, ZO, PS, PS},
  773. {NM, NM, NS, ZO, PS, PM, PM},
  774. {NM, NS, ZO, PS, PS, PM, PB},
  775. {ZO, ZO, PS, PS, PM, PB, PB},
  776. {ZO, ZO, PS, PM, PM, PB, PB},
  777. // delta kd rule base
  778. {PS, NS, NB, NB, NB, NM, PS},
  779. {PS, NS, NB, NM, NM, NS, ZO},
  780. {ZO, NS, NM, NM, NS, NS, ZO},
  781. {ZO, NS, NS, NS, NS, NS, ZO},
  782. {ZO, ZO, ZO, ZO, ZO, ZO, ZO},
  783. {PB, PS, PS, PS, PS, PS, PB},
  784. {PB, PM, PM, PM, PS, PS, PB}};
  785. // Default parameters of membership function
  786. int mf_params[4 * qf_default] = {-3, -3, -2, 0, -3, -2, -1, 0, -2, -1,
  787. 0, 0, -1, 0, 1, 0, 0, 1, 2, 0,
  788. 1, 2, 3, 0, 2, 3, 3, 0};
  789. // Default parameters of pid controller
  790. float fuzzy_pid_params[DOF][pid_params_count] = {
  791. {0.65f, 0, 0, 0, 0, 0, 1}, {-0.34f, 0, 0, 0, 0, 0, 1},
  792. {-1.1f, 0, 0, 0, 0, 0, 1}, {-2.4f, 0, 0, 0, 0, 0, 1},
  793. {1.2f, 0, 0, 0, 0, 0, 1}, {1.2f, 0.05f, 0.1f, 0, 0, 0, 1}};
  794. // Obtain the PID controller vector according to the parameters
  795. struct PID** pid_vector = fuzzy_pid_vector_init(
  796. fuzzy_pid_params, 2.0f, 4, 1, 0, mf_params, rule_base, DOF);
  797. printf("output:\n");
  798. int control_id = 5;
  799. float real = 0;
  800. float idea = max_error * 0.9f;
  801. printf("idea value: %f\n", idea);
  802. bool direct[DOF] = {true, false, false, false, true, true};
  803. for (int j = 0; j < 10; ++j) {
  804. int out = fuzzy_pid_motor_pwd_output(real, idea, direct[control_id],
  805. pid_vector[control_id]);
  806. real += (float)(out - middle_pwm_output) / (float)middle_pwm_output *
  807. (float)max_error * 0.1f;
  808. printf("%d,%f\n", out, real);
  809. }
  810. delete_pid_vector(pid_vector, DOF);
  811. }
  812. TEST_RUN_SINGLE_FILE(fuzzypid, fuzzypid1, "test/python/fuzzypid/fuzzypid1.py");
  813. TEST_RUN_SINGLE_FILE(lvgl, base, "test/python/pika_lvgl/base.py");
  814. TEST_RUN_SINGLE_FILE(lvgl, lv_arc1, "test/python/pika_lvgl/lv_arc1.py");
  815. TEST_RUN_SINGLE_FILE(lvgl, lv_arc2, "test/python/pika_lvgl/lv_arc2.py");
  816. TEST_RUN_SINGLE_FILE(lvgl, lv_bar1, "test/python/pika_lvgl/lv_bar1.py");
  817. TEST_RUN_SINGLE_FILE(lvgl, lv_btn1, "test/python/pika_lvgl/lv_btn1.py");
  818. TEST_RUN_SINGLE_FILE(lvgl,
  819. lv_callback1,
  820. "test/python/pika_lvgl/lv_callback1.py");
  821. TEST_RUN_SINGLE_FILE(lvgl,
  822. lv_checkbox,
  823. "test/python/pika_lvgl/lv_checkbox1.py");
  824. TEST_RUN_SINGLE_FILE(lvgl, lv_drag, "test/python/pika_lvgl/lv_drag.py");
  825. TEST_RUN_SINGLE_FILE(lvgl, lv_label1, "test/python/pika_lvgl/lv_label1.py");
  826. TEST_RUN_SINGLE_FILE(lvgl, lv_list1, "test/python/pika_lvgl/lv_list1.py");
  827. TEST_RUN_SINGLE_FILE(lvgl, lv_obj1, "test/python/pika_lvgl/lv_obj1.py");
  828. TEST_RUN_SINGLE_FILE(lvgl, lv_obj2, "test/python/pika_lvgl/lv_obj2.py");
  829. TEST_RUN_SINGLE_FILE(lvgl, lv_obj3, "test/python/pika_lvgl/lv_obj3.py");
  830. // TEST_RUN_SINGLE_FILE(lvgl, lv_png, "test/python/pika_lvgl/lv_png.py");
  831. TEST_RUN_SINGLE_FILE(lvgl, lv_roller1, "test/python/pika_lvgl/lv_roller1.py");
  832. TEST_RUN_SINGLE_FILE(lvgl, lv_slider1, "test/python/pika_lvgl/lv_slider1.py");
  833. TEST_RUN_SINGLE_FILE(lvgl, lv_style1, "test/python/pika_lvgl/lv_style1.py");
  834. TEST_RUN_SINGLE_FILE(lvgl, lv_switch1, "test/python/pika_lvgl/lv_switch1.py");
  835. TEST_RUN_SINGLE_FILE(lvgl, lv_table1, "test/python/pika_lvgl/lv_table1.py");
  836. TEST_RUN_SINGLE_FILE(lvgl, lv_tabview1, "test/python/pika_lvgl/lv_tabview1.py");
  837. TEST_RUN_SINGLE_FILE(lvgl, lv_tabview2, "test/python/pika_lvgl/lv_tabview2.py");
  838. TEST_RUN_SINGLE_FILE(lvgl,
  839. lv_textarea1,
  840. "test/python/pika_lvgl/lv_textarea1.py");
  841. TEST_RUN_SINGLE_FILE(lvgl, lv_tim, "test/python/pika_lvgl/lv_tim.py");
  842. TEST_RUN_SINGLE_FILE(lvgl, lv_uidemo, "test/python/pika_lvgl/lv_uidemo.py");
  843. TEST(jrpc, client) {
  844. ASSERT_EQ(jrpc_test_client(), 0);
  845. }
  846. TEST(jrpc, server) {
  847. ASSERT_EQ(jrpc_test_server(), 0);
  848. }
  849. // Mock functions for testing
  850. static char* mock_receive_message = NULL;
  851. static char* mock_sent_message = NULL;
  852. void mock_send(const char* message) {
  853. if (mock_sent_message) {
  854. free(mock_sent_message);
  855. }
  856. mock_sent_message = strdup(message);
  857. }
  858. char* mock_receive(void) {
  859. if (mock_receive_message) {
  860. char* temp = strdup(mock_receive_message);
  861. free(mock_receive_message);
  862. mock_receive_message = NULL;
  863. return temp;
  864. }
  865. return NULL;
  866. }
  867. void mock_yield(void) {
  868. sched_yield();
  869. }
  870. static unsigned long mock_tick_ms(void) {
  871. return pika_platform_get_tick();
  872. }
  873. rpc_mapping gtest_rpc_map[] = {{"add",
  874. [](cJSON* params[], int param_count) -> cJSON* {
  875. int a = params[0]->valueint;
  876. int b = params[1]->valueint;
  877. return cJSON_CreateNumber(a + b);
  878. },
  879. 2},
  880. RPC_MAP_END};
  881. rpc_mapping_nonblocking gtest_nonblocking_rpc_map[] = {RPC_MAP_END};
  882. TEST(jrpc, InvalidJSONFormat) {
  883. JRPC jrpc = {gtest_rpc_map,
  884. gtest_nonblocking_rpc_map,
  885. mock_send,
  886. mock_receive,
  887. 1,
  888. mock_yield,
  889. mock_tick_ms,
  890. 0,
  891. {NULL},
  892. 0};
  893. const char* request =
  894. "{\"jsonrpc\": \"1.0\", \"method\": \"add\", \"params\": [3, 4], "
  895. "\"id\": 1, \"type\": "; // Invalid JSON
  896. mock_sent_message = NULL;
  897. JRPC_server_handle(&jrpc, request);
  898. ASSERT_EQ(mock_sent_message, nullptr);
  899. if (NULL != mock_sent_message) {
  900. free(mock_sent_message);
  901. mock_sent_message = NULL;
  902. }
  903. }
  904. TEST(jrpc, MethodNotFound) {
  905. JRPC jrpc = {gtest_rpc_map,
  906. gtest_nonblocking_rpc_map,
  907. mock_send,
  908. mock_receive,
  909. 1,
  910. mock_yield,
  911. mock_tick_ms,
  912. 0,
  913. {NULL},
  914. 0};
  915. const char* request =
  916. "{\"jsonrpc\": \"1.0\", \"method\": \"subtract\", \"params\": [3, 4], "
  917. "\"id\": 1, \"type\": 0}";
  918. const char* expected_response =
  919. "{\"jsonrpc\": \"1.0\", \"status\": \"method not found\", \"id\": 1, "
  920. "\"type\": 1}";
  921. JRPC_server_handle(&jrpc, request);
  922. ASSERT_EQ(jrpc_compare_json_strings(mock_sent_message, expected_response),
  923. 0);
  924. if (NULL != mock_sent_message) {
  925. free(mock_sent_message);
  926. mock_sent_message = NULL;
  927. }
  928. }
  929. TEST(jrpc, ParameterCountMismatch) {
  930. JRPC jrpc = {gtest_rpc_map,
  931. gtest_nonblocking_rpc_map,
  932. mock_send,
  933. mock_receive,
  934. 1,
  935. mock_yield,
  936. mock_tick_ms,
  937. 0,
  938. {NULL},
  939. 0};
  940. const char* request =
  941. "{\"jsonrpc\": \"1.0\", \"method\": \"add\", \"params\": [3], "
  942. "\"id\": 1, \"type\": 0}";
  943. const char* expected_response =
  944. "{\"jsonrpc\": \"1.0\", \"status\": \"invalid params\", \"id\": 1, "
  945. "\"type\": 1}";
  946. JRPC_server_handle(&jrpc, request);
  947. ASSERT_EQ(jrpc_compare_json_strings(mock_sent_message, expected_response),
  948. 0);
  949. if (NULL != mock_sent_message) {
  950. free(mock_sent_message);
  951. mock_sent_message = NULL;
  952. }
  953. }
  954. #if 0
  955. TEST(jrpc, InvalidParameterType) {
  956. JRPC jrpc = {gtest_rpc_map,
  957. gtest_nonblocking_rpc_map,
  958. mock_send,
  959. mock_receive,
  960. 1, mock_yield,
  961. mock_tick_ms,
  962. 0,
  963. {NULL},
  964. 0};
  965. const char* request =
  966. "{\"jsonrpc\": \"1.0\", \"method\": \"add\", \"params\": [3, \"a\"], "
  967. "\"id\": 1, \"type\": 0}";
  968. const char* expected_response =
  969. "{\"jsonrpc\": \"1.0\", \"status\": \"invalid params\", \"id\": 1, "
  970. "\"type\": 1}";
  971. JRPC_server_handle(&jrpc, request);
  972. ASSERT_EQ(jrpc_compare_json_strings(mock_sent_message, expected_response),
  973. 0);
  974. if (NULL != mock_sent_message) {
  975. free(mock_sent_message);
  976. mock_sent_message = NULL;
  977. }
  978. }
  979. #endif
  980. // Buffer for communication between client and server
  981. static char* server_receive_buffer = NULL;
  982. static char* client_receive_buffer = NULL;
  983. // Server send function
  984. static void jrpc_server_send(const char* message) {
  985. if (client_receive_buffer) {
  986. free(client_receive_buffer);
  987. }
  988. client_receive_buffer = strdup(message);
  989. }
  990. // Server receive function
  991. static char* jrpc_server_receive(void) {
  992. if (server_receive_buffer) {
  993. char* temp = strdup(server_receive_buffer);
  994. free(server_receive_buffer);
  995. server_receive_buffer = NULL;
  996. return temp;
  997. }
  998. return NULL;
  999. }
  1000. // Client send function
  1001. static void jrpc_client_send(const char* message) {
  1002. if (server_receive_buffer) {
  1003. free(server_receive_buffer);
  1004. }
  1005. server_receive_buffer = strdup(message);
  1006. }
  1007. // Client receive function
  1008. static char* jrpc_client_receive(void) {
  1009. if (client_receive_buffer) {
  1010. char* temp = strdup(client_receive_buffer);
  1011. free(client_receive_buffer);
  1012. client_receive_buffer = NULL;
  1013. return temp;
  1014. }
  1015. return NULL;
  1016. }
  1017. // Global atomic variable to signal the server to stop
  1018. std::atomic<bool> server_running(true);
  1019. // Function to periodically call JRPC_server_handle
  1020. static void server_handle(JRPC* server) {
  1021. while (server_running) {
  1022. char* message = jrpc_server_receive();
  1023. if (NULL != message) {
  1024. JRPC_server_handle(server, message);
  1025. free(message);
  1026. }
  1027. std::this_thread::sleep_for(std::chrono::milliseconds(
  1028. 10)); // Adjust the sleep duration as needed
  1029. }
  1030. }
  1031. // Test case
  1032. TEST(jrpc, BlockingRequestBetweenTwoJRPC) {
  1033. // Server JRPC
  1034. JRPC server = {gtest_rpc_map,
  1035. gtest_nonblocking_rpc_map,
  1036. jrpc_server_send,
  1037. jrpc_server_receive,
  1038. 1,
  1039. mock_yield,
  1040. mock_tick_ms,
  1041. 0,
  1042. {NULL},
  1043. 0};
  1044. // Client JRPC
  1045. JRPC client = {gtest_rpc_map,
  1046. gtest_nonblocking_rpc_map,
  1047. jrpc_client_send,
  1048. jrpc_client_receive,
  1049. 1,
  1050. mock_yield,
  1051. mock_tick_ms,
  1052. 0,
  1053. {NULL},
  1054. 0};
  1055. // Create a thread to run server_handle
  1056. std::thread server_thread(server_handle, &server);
  1057. // Client sends request to Server
  1058. const char* request_method = "add";
  1059. cJSON* params[] = {cJSON_CreateNumber(10), cJSON_CreateNumber(20)};
  1060. cJSON* response =
  1061. JRPC_send_request_blocking(&client, request_method, params, 2);
  1062. // Verify that client received correct response
  1063. ASSERT_EQ(cJSON_GetObjectItem(response, "result")->valueint, 30);
  1064. // Clean up cJSON objects
  1065. if (response != NULL) {
  1066. cJSON_Delete(response);
  1067. }
  1068. for (int i = 0; i < 2; i++) {
  1069. cJSON_Delete(params[i]);
  1070. }
  1071. // Signal the server to stop and wait for the server thread to finish
  1072. server_running = false;
  1073. server_thread.join();
  1074. // Clean up mock_sent_message
  1075. if (NULL != mock_sent_message) {
  1076. free(mock_sent_message);
  1077. mock_sent_message = NULL;
  1078. }
  1079. if (NULL != server_receive_buffer) {
  1080. free(server_receive_buffer);
  1081. server_receive_buffer = NULL;
  1082. }
  1083. }
  1084. TEST_END