module-test.cpp 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391
  1. #include <semaphore.h>
  2. #include <atomic>
  3. #include <thread>
  4. #include "test_common.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. #if 0 // offen fail because of network
  287. TEST_RUN_SINGLE_FILE_PASS(socket,
  288. socket_DNS,
  289. "test/python/socket/socket_DNS.py")
  290. #endif
  291. #endif
  292. #if !PIKA_NANO_ENABLE
  293. TEST(re, match) {
  294. /* init */
  295. g_PikaMemInfo.heapUsedMax = 0;
  296. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  297. extern unsigned char pikaModules_py_a[];
  298. obj_linkLibrary(pikaMain, pikaModules_py_a);
  299. /* run */
  300. __platform_printf("BEGIN\r\n");
  301. pikaVM_runSingleFile(pikaMain, "test/python/re/match.py");
  302. /* collect */
  303. /* assert */
  304. EXPECT_STREQ(log_buff[3], "BEGIN\r\n");
  305. EXPECT_STREQ(log_buff[2],
  306. "matchObj.group(0) : Cats are smarter than dogs\r\n");
  307. EXPECT_STREQ(log_buff[1], "matchObj.group(1) : Cats\r\n");
  308. EXPECT_STREQ(log_buff[0], "matchObj.group(2) : smarter\r\n");
  309. /* deinit */
  310. obj_deinit(pikaMain);
  311. EXPECT_EQ(pikaMemNow(), 0);
  312. }
  313. #endif
  314. #if !PIKA_NANO_ENABLE
  315. TEST(re, search) {
  316. /* init */
  317. g_PikaMemInfo.heapUsedMax = 0;
  318. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  319. extern unsigned char pikaModules_py_a[];
  320. obj_linkLibrary(pikaMain, pikaModules_py_a);
  321. /* run */
  322. __platform_printf("BEGIN\r\n");
  323. pikaVM_runSingleFile(pikaMain, "test/python/re/search.py");
  324. /* collect */
  325. /* assert */
  326. EXPECT_STREQ(log_buff[2], "BEGIN\r\n");
  327. EXPECT_STREQ(log_buff[1], "(0, 3)\r\n");
  328. EXPECT_STREQ(log_buff[0], "(11, 14)\r\n");
  329. /* deinit */
  330. obj_deinit(pikaMain);
  331. EXPECT_EQ(pikaMemNow(), 0);
  332. }
  333. #endif
  334. #if !PIKA_NANO_ENABLE
  335. TEST(re, sub) {
  336. /* init */
  337. g_PikaMemInfo.heapUsedMax = 0;
  338. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  339. extern unsigned char pikaModules_py_a[];
  340. obj_linkLibrary(pikaMain, pikaModules_py_a);
  341. /* run */
  342. __platform_printf("BEGIN\r\n");
  343. pikaVM_runSingleFile(pikaMain, "test/python/re/sub.py");
  344. /* collect */
  345. /* assert */
  346. EXPECT_STREQ(log_buff[2], "BEGIN\r\n");
  347. EXPECT_STREQ(log_buff[1], "the phone number is: 2004-959-559 \r\n");
  348. EXPECT_STREQ(log_buff[0], "the phone number is: 2004959559\r\n");
  349. /* deinit */
  350. obj_deinit(pikaMain);
  351. EXPECT_EQ(pikaMemNow(), 0);
  352. }
  353. #endif
  354. #if !PIKA_NANO_ENABLE
  355. TEST(re, findall) {
  356. /* init */
  357. g_PikaMemInfo.heapUsedMax = 0;
  358. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  359. extern unsigned char pikaModules_py_a[];
  360. obj_linkLibrary(pikaMain, pikaModules_py_a);
  361. /* run */
  362. __platform_printf("BEGIN\r\n");
  363. pikaVM_runSingleFile(pikaMain, "test/python/re/findall.py");
  364. /* collect */
  365. /* assert */
  366. EXPECT_STREQ(log_buff[2], "BEGIN\r\n");
  367. EXPECT_STREQ(
  368. log_buff[1],
  369. "[('2020', '1', '1'), ('2022', '12', '22'), ('2018', '3', '31')]\r\n");
  370. EXPECT_STREQ(
  371. log_buff[0],
  372. "date: 2020, 2022, 2018. Wrong format: 2031-13-31, 2032-12-33 ...\r\n");
  373. /* deinit */
  374. obj_deinit(pikaMain);
  375. EXPECT_EQ(pikaMemNow(), 0);
  376. }
  377. #endif
  378. #if !PIKA_NANO_ENABLE
  379. TEST(modbus, rtu_master) {
  380. /* init */
  381. g_PikaMemInfo.heapUsedMax = 0;
  382. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  383. extern unsigned char pikaModules_py_a[];
  384. obj_linkLibrary(pikaMain, pikaModules_py_a);
  385. /* run */
  386. __platform_printf("BEGIN\r\n");
  387. pikaVM_runSingleFile(pikaMain, "test/python/modbus/rtu_master.py");
  388. /* collect */
  389. /* assert */
  390. EXPECT_STREQ(log_buff[6], "BEGIN\r\n");
  391. EXPECT_STREQ(log_buff[5],
  392. "b'\\x01\\x03\\x00\\x00\\x00\\x0a\\xc5\\xcd'\r\n");
  393. EXPECT_STREQ(log_buff[4], "[0, 0, 1234, 0, 0, 123, 0, 0, 0, 0]\r\n");
  394. EXPECT_STREQ(log_buff[3],
  395. "b'\\x01\\x04\\x00\\x00\\x00\\x02\\x71\\xcb'\r\n");
  396. EXPECT_STREQ(log_buff[2], "[0, 2278]\r\n");
  397. EXPECT_STREQ(log_buff[1],
  398. "b'\\x01\\x06\\x00\\x00\\x12\\x34\\x84\\xbd'\r\n");
  399. EXPECT_STREQ(log_buff[0],
  400. "b'\\x01\\x0f\\x00\\x00\\x00\\x08\\x01\\x57\\xbf\\x6b'\r\n");
  401. /* deinit */
  402. obj_deinit(pikaMain);
  403. EXPECT_EQ(pikaMemNow(), 0);
  404. }
  405. TEST(proxy, test1) {
  406. /* init */
  407. g_PikaMemInfo.heapUsedMax = 0;
  408. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  409. extern unsigned char pikaModules_py_a[];
  410. obj_linkLibrary(pikaMain, pikaModules_py_a);
  411. /* run */
  412. __platform_printf("BEGIN\r\n");
  413. pikaVM_runSingleFile(pikaMain, "test/python/proxy/proxy1.py");
  414. /* collect */
  415. /* assert */
  416. EXPECT_STREQ(log_buff[1], "BEGIN\r\n");
  417. EXPECT_STREQ(log_buff[0], "set value = 20\r\n");
  418. /* deinit */
  419. obj_deinit(pikaMain);
  420. EXPECT_EQ(pikaMemNow(), 0);
  421. }
  422. TEST(issue, global) {
  423. /* init */
  424. g_PikaMemInfo.heapUsedMax = 0;
  425. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  426. extern unsigned char pikaModules_py_a[];
  427. obj_linkLibrary(pikaMain, pikaModules_py_a);
  428. /* run */
  429. __platform_printf("BEGIN\r\n");
  430. pikaVM_runSingleFile(pikaMain, "test/python/issue/issue_global.py");
  431. /* collect */
  432. /* assert */
  433. EXPECT_EQ(obj_getInt(pikaMain, "testpara.timer2_flag"), 1);
  434. /* deinit */
  435. obj_deinit(pikaMain);
  436. EXPECT_EQ(pikaMemNow(), 0);
  437. }
  438. TEST(module, mod1_mod2_mod1) {
  439. /* init */
  440. g_PikaMemInfo.heapUsedMax = 0;
  441. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  442. extern unsigned char pikaModules_py_a[];
  443. obj_linkLibrary(pikaMain, pikaModules_py_a);
  444. /* run */
  445. __platform_printf("BEGIN\r\n");
  446. obj_run(pikaMain,
  447. "import test_module1\n"
  448. "test_module1.test_module2.test_module1.mytest()");
  449. /* collect */
  450. /* assert */
  451. EXPECT_STREQ(log_buff[0], "test_module_1_hello\r\n");
  452. /* deinit */
  453. obj_deinit(pikaMain);
  454. EXPECT_EQ(pikaMemNow(), 0);
  455. }
  456. TEST(module, improt_as_cmodule) {
  457. /* init */
  458. g_PikaMemInfo.heapUsedMax = 0;
  459. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  460. extern unsigned char pikaModules_py_a[];
  461. obj_linkLibrary(pikaMain, pikaModules_py_a);
  462. /* run */
  463. __platform_printf("BEGIN\r\n");
  464. obj_run(pikaMain, "from PikaStdData import String as string\n");
  465. /* collect */
  466. /* assert */
  467. /* deinit */
  468. obj_deinit(pikaMain);
  469. EXPECT_EQ(pikaMemNow(), 0);
  470. }
  471. extern "C" {
  472. volatile FILE* f_getchar_fp = NULL;
  473. char f_getchar(void) {
  474. char c = 0;
  475. size_t n = fread(&c, 1, 1, (FILE*)f_getchar_fp);
  476. if (n > 0) {
  477. return c;
  478. }
  479. // pika_platform_printf("f_getchar error\r\n");
  480. // pika_assert(0);
  481. return EOF;
  482. }
  483. void pikaScriptShell_withGetchar(PikaObj* self, sh_getchar getchar_fn);
  484. }
  485. TEST(module, REPL_runbytecode) {
  486. /* init */
  487. g_PikaMemInfo.heapUsedMax = 0;
  488. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  489. extern unsigned char pikaModules_py_a[];
  490. obj_linkLibrary(pikaMain, pikaModules_py_a);
  491. /* run */
  492. __platform_printf("BEGIN\r\n");
  493. f_getchar_fp = fopen("package/pikascript/cjson_test.py.o", "rb");
  494. pikaScriptShell_withGetchar(pikaMain, f_getchar);
  495. fclose((FILE*)f_getchar_fp);
  496. obj_run(pikaMain, "test_start()");
  497. /* collect */
  498. /* assert */
  499. EXPECT_STREQ(log_buff[0], "shopping\r\n");
  500. /* deinit */
  501. obj_deinit(pikaMain);
  502. EXPECT_EQ(pikaMemNow(), 0);
  503. }
  504. TEST(module, REPL_pya) {
  505. /* init */
  506. g_PikaMemInfo.heapUsedMax = 0;
  507. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  508. extern unsigned char pikaModules_py_a[];
  509. obj_linkLibrary(pikaMain, pikaModules_py_a);
  510. /* run */
  511. __platform_printf("BEGIN\r\n");
  512. f_getchar_fp =
  513. fopen("package/pikascript/pikascript-api/pikaModules.py.a", "rb");
  514. pikaScriptShell_withGetchar(pikaMain, f_getchar);
  515. fclose((FILE*)f_getchar_fp);
  516. // obj_run(pikaMain, "test_start()");
  517. /* collect */
  518. /* assert */
  519. // EXPECT_STREQ(log_buff[0], "shopping\r\n");
  520. /* deinit */
  521. obj_deinit(pikaMain);
  522. EXPECT_EQ(pikaMemNow(), 0);
  523. }
  524. TEST(module, REPL_script) {
  525. /* init */
  526. g_PikaMemInfo.heapUsedMax = 0;
  527. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  528. extern unsigned char pikaModules_py_a[];
  529. obj_linkLibrary(pikaMain, pikaModules_py_a);
  530. /* run */
  531. __platform_printf("BEGIN\r\n");
  532. f_getchar_fp = fopen("test/python/UnitTest.py", "rb");
  533. pikaScriptShell_withGetchar(pikaMain, f_getchar);
  534. fclose((FILE*)f_getchar_fp);
  535. /* collect */
  536. /* assert */
  537. EXPECT_STREQ(log_buff[3], "mem used max:\r\n");
  538. /* deinit */
  539. obj_deinit(pikaMain);
  540. EXPECT_EQ(pikaMemNow(), 0);
  541. }
  542. TEST(module, REPL_script_2) {
  543. /* init */
  544. g_PikaMemInfo.heapUsedMax = 0;
  545. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  546. extern unsigned char pikaModules_py_a[];
  547. obj_linkLibrary(pikaMain, pikaModules_py_a);
  548. /* run */
  549. __platform_printf("BEGIN\r\n");
  550. f_getchar_fp = fopen("test/python/UnitTest2.py", "rb");
  551. pikaScriptShell_withGetchar(pikaMain, f_getchar);
  552. fclose((FILE*)f_getchar_fp);
  553. /* collect */
  554. /* assert */
  555. EXPECT_STREQ(log_buff[1], "mem used max:\r\n");
  556. /* deinit */
  557. obj_deinit(pikaMain);
  558. EXPECT_EQ(pikaMemNow(), 0);
  559. }
  560. TEST(module, REPL_big_script) {
  561. /* init */
  562. g_PikaMemInfo.heapUsedMax = 0;
  563. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  564. extern unsigned char pikaModules_py_a[];
  565. obj_linkLibrary(pikaMain, pikaModules_py_a);
  566. /* run */
  567. __platform_printf("BEGIN\r\n");
  568. f_getchar_fp = fopen("package/pikascript/cjson_test.py", "rb");
  569. pikaScriptShell_withGetchar(pikaMain, f_getchar);
  570. fclose((FILE*)f_getchar_fp);
  571. /* collect */
  572. /* assert */
  573. EXPECT_STREQ(log_buff[3],
  574. "\r\nError: line buff overflow, please use bigger "
  575. "'PIKA_LINE_BUFF_SIZE'\r\n");
  576. /* deinit */
  577. obj_deinit(pikaMain);
  578. EXPECT_EQ(pikaMemNow(), 0);
  579. }
  580. TEST(module, REPL_stdtask) {
  581. /* init */
  582. g_PikaMemInfo.heapUsedMax = 0;
  583. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  584. extern unsigned char pikaModules_py_a[];
  585. obj_linkLibrary(pikaMain, pikaModules_py_a);
  586. /* run */
  587. __platform_printf("BEGIN\r\n");
  588. f_getchar_fp = fopen("test/python/std/stdtask.py", "rb");
  589. pikaScriptShell_withGetchar(pikaMain, f_getchar);
  590. fclose((FILE*)f_getchar_fp);
  591. /* collect */
  592. /* assert */
  593. /* deinit */
  594. obj_deinit(pikaMain);
  595. EXPECT_EQ(pikaMemNow(), 0);
  596. }
  597. TEST_RUN_SINGLE_FILE(modbus,
  598. rtu_master_err,
  599. "test/python/modbus/rtu_master_err.py")
  600. TEST_RUN_SINGLE_FILE_PASS(proxy, proxy3, "test/python/proxy/proxy3.py")
  601. #if PIKA_FLOAT_TYPE_DOUBLE
  602. TEST_RUN_SINGLE_FILE_PASS(struct, pack, "test/python/struct/pack.py")
  603. TEST_RUN_SINGLE_FILE_PASS(struct, unpack, "test/python/struct/unpack.py")
  604. #endif
  605. extern "C" {
  606. #define PIKA_USING_FLASHDB 1
  607. #if PIKA_USING_FLASHDB
  608. // #include <pthread.h>
  609. #include <sys/stat.h>
  610. #include <sys/types.h>
  611. #include "flashdb.h"
  612. #define FDB_LOG_TAG "[main]"
  613. // static pthread_mutex_t kv_locker, ts_locker;
  614. static uint32_t boot_count = 0;
  615. static time_t boot_time[10] = {0, 1, 2, 3};
  616. /* default KV nodes */
  617. static struct fdb_default_kv_node default_kv_table[] = {
  618. {"username", (void*)"armink", 0}, /* string KV */
  619. {"password", (void*)"123456", 0}, /* string KV */
  620. {"boot_count", &boot_count, sizeof(boot_count)}, /* int type KV */
  621. {"boot_time", &boot_time, sizeof(boot_time)}, /* int array type KV */
  622. };
  623. /* KVDB object */
  624. static struct fdb_kvdb kvdb = {0};
  625. /* TSDB object */
  626. struct fdb_tsdb tsdb = {0};
  627. /* counts for simulated timestamp */
  628. static int counts = 0;
  629. extern void kvdb_basic_sample(fdb_kvdb_t kvdb);
  630. extern void kvdb_type_string_sample(fdb_kvdb_t kvdb);
  631. extern void kvdb_type_blob_sample(fdb_kvdb_t kvdb);
  632. extern void tsdb_sample(fdb_tsdb_t tsdb);
  633. /*
  634. static void lock(fdb_db_t db)
  635. {
  636. pthread_mutex_lock((pthread_mutex_t *)db->user_data);
  637. }
  638. static void unlock(fdb_db_t db)
  639. {
  640. pthread_mutex_unlock((pthread_mutex_t *)db->user_data);
  641. }
  642. */
  643. static fdb_time_t get_time(void) {
  644. return time(NULL);
  645. }
  646. #endif
  647. int test_flashdb(void) {
  648. #if PIKA_USING_FLASHDB
  649. __platform_printf(" FDB_LOG_TAG :%s \r\n", FDB_LOG_TAG);
  650. fdb_err_t result;
  651. bool file_mode = true;
  652. uint32_t sec_size = 4096, db_size = sec_size * 4;
  653. #undef FDB_USING_KVDB
  654. #define FDB_USING_KVDB 1
  655. #ifdef FDB_USING_KVDB
  656. { /* KVDB Sample */
  657. struct fdb_default_kv default_kv;
  658. default_kv.kvs = default_kv_table;
  659. default_kv.num = sizeof(default_kv_table) / sizeof(default_kv_table[0]);
  660. /* set the lock and unlock function if you want */
  661. // pthread_mutex_init(&kv_locker, NULL);
  662. // fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_LOCK, (void *)lock);
  663. // fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_UNLOCK, (void
  664. // *)unlock);
  665. /* set the sector and database max size */
  666. fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_SEC_SIZE, &sec_size);
  667. fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_MAX_SIZE, &db_size);
  668. /* enable file mode */
  669. fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_FILE_MODE, &file_mode);
  670. /* create database directory */
  671. mkdir("test/out/fdb_kvdb1", 0777);
  672. /* Key-Value database initialization
  673. *
  674. * &kvdb: database object
  675. * "env": database name
  676. * "test/out/fdb_kvdb1": The flash partition name base on FAL. Please
  677. * make sure it's in FAL partition table. Please change to YOUR
  678. * partition name. &default_kv: The default KV nodes. It will auto add
  679. * to KVDB when first initialize successfully. &kv_locker: The locker
  680. * object.
  681. */
  682. // result = fdb_kvdb_init(&kvdb, "env", "test/out/fdb_kvdb1",
  683. // &default_kv, &kv_locker);
  684. result = fdb_kvdb_init(&kvdb, "env", "test/out/fdb_kvdb1", &default_kv,
  685. NULL);
  686. if (result != FDB_NO_ERR) {
  687. return -1;
  688. }
  689. /* run basic KV samples */
  690. kvdb_basic_sample(&kvdb);
  691. /* run string KV samples */
  692. kvdb_type_string_sample(&kvdb);
  693. /* run blob KV samples */
  694. kvdb_type_blob_sample(&kvdb);
  695. fdb_kvdb_deinit(&kvdb);
  696. }
  697. #endif /* FDB_USING_KVDB */
  698. // #define FDB_USING_TSDB 1
  699. #ifdef FDB_USING_TSDB
  700. { /* TSDB Sample */
  701. /* set the lock and unlock function if you want */
  702. // pthread_mutex_init(&ts_locker, NULL);
  703. // fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_LOCK, (void *)lock);
  704. // fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_UNLOCK, (void *)unlock);
  705. /* set the sector and database max size */
  706. fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_SEC_SIZE, &sec_size);
  707. fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_MAX_SIZE, &db_size);
  708. /* enable file mode */
  709. fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_FILE_MODE, &file_mode);
  710. /* create database directory */
  711. mkdir("test/out/fdb_tsdb1", 0777);
  712. /* Time series database initialization
  713. *
  714. * &tsdb: database object
  715. * "log": database name
  716. * "test/out/fdb_tsdb1": The flash partition name base on FAL. Please
  717. * make sure it's in FAL partition table. Please change to YOUR
  718. * partition name. get_time: The get current timestamp function. 128:
  719. * maximum length of each log ts_locker: The locker object.
  720. */
  721. // result = fdb_tsdb_init(&tsdb, "log", "test/out/fdb_tsdb1", get_time,
  722. // 128, &ts_locker);
  723. result = fdb_tsdb_init(&tsdb, "log", "test/out/fdb_tsdb1", get_time,
  724. 128, NULL);
  725. /* read last saved time for simulated timestamp */
  726. fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_GET_LAST_TIME, &counts);
  727. if (result != FDB_NO_ERR) {
  728. return -1;
  729. }
  730. /* run TSDB sample */
  731. tsdb_sample(&tsdb);
  732. /* close TSDB */
  733. fdb_tsdb_deinit(&tsdb);
  734. }
  735. #endif /* FDB_USING_TSDB */
  736. #else
  737. __platform_printf(" FDB NOT INUSE \r\n");
  738. #endif
  739. return 0;
  740. }
  741. }
  742. TEST(flashdb, base) {
  743. EXPECT_EQ(test_flashdb(), 0);
  744. }
  745. TEST_RUN_SINGLE_FILE_EXCEPT_OUTPUT(flashdb,
  746. kvdb1,
  747. "test/python/flashdb/flashdb_kvdb1.py",
  748. "PASS\r\n")
  749. TEST_RUN_SINGLE_FILE_EXCEPT_OUTPUT(flashdb,
  750. kvdb2,
  751. "test/python/flashdb/flashdb_kvdb2.py",
  752. "PASS\r\n")
  753. #if PIKA_FLOAT_TYPE_DOUBLE
  754. TEST_RUN_SINGLE_FILE_EXCEPT_OUTPUT(flashdb,
  755. tsdb1,
  756. "test/python/flashdb/flashdb_tsdb1.py",
  757. "PASS\r\n")
  758. #endif
  759. #endif
  760. TEST(fuzzypid, base) {
  761. #define DOF 6
  762. // Default fuzzy rule base of delta kp/ki/kd
  763. int rule_base[][qf_default] = {// delta kp rule base
  764. {PB, PB, PM, PM, PS, ZO, ZO},
  765. {PB, PB, PM, PS, PS, ZO, NS},
  766. {PM, PM, PM, PS, ZO, NS, NS},
  767. {PM, PM, PS, ZO, NS, NM, NM},
  768. {PS, PS, ZO, NS, NS, NM, NM},
  769. {PS, ZO, NS, NM, NM, NM, NB},
  770. {ZO, ZO, NM, NM, NM, NB, NB},
  771. // delta ki rule base
  772. {NB, NB, NM, NM, NS, ZO, ZO},
  773. {NB, NB, NM, NS, NS, ZO, ZO},
  774. {NB, NM, NS, NS, ZO, PS, PS},
  775. {NM, NM, NS, ZO, PS, PM, PM},
  776. {NM, NS, ZO, PS, PS, PM, PB},
  777. {ZO, ZO, PS, PS, PM, PB, PB},
  778. {ZO, ZO, PS, PM, PM, PB, PB},
  779. // delta kd rule base
  780. {PS, NS, NB, NB, NB, NM, PS},
  781. {PS, NS, NB, NM, NM, NS, ZO},
  782. {ZO, NS, NM, NM, NS, NS, ZO},
  783. {ZO, NS, NS, NS, NS, NS, ZO},
  784. {ZO, ZO, ZO, ZO, ZO, ZO, ZO},
  785. {PB, PS, PS, PS, PS, PS, PB},
  786. {PB, PM, PM, PM, PS, PS, PB}};
  787. // Default parameters of membership function
  788. int mf_params[4 * qf_default] = {-3, -3, -2, 0, -3, -2, -1, 0, -2, -1,
  789. 0, 0, -1, 0, 1, 0, 0, 1, 2, 0,
  790. 1, 2, 3, 0, 2, 3, 3, 0};
  791. // Default parameters of pid controller
  792. float fuzzy_pid_params[DOF][pid_params_count] = {
  793. {0.65f, 0, 0, 0, 0, 0, 1}, {-0.34f, 0, 0, 0, 0, 0, 1},
  794. {-1.1f, 0, 0, 0, 0, 0, 1}, {-2.4f, 0, 0, 0, 0, 0, 1},
  795. {1.2f, 0, 0, 0, 0, 0, 1}, {1.2f, 0.05f, 0.1f, 0, 0, 0, 1}};
  796. // Obtain the PID controller vector according to the parameters
  797. struct PID** pid_vector = fuzzy_pid_vector_init(
  798. fuzzy_pid_params, 2.0f, 4, 1, 0, mf_params, rule_base, DOF);
  799. printf("output:\n");
  800. int control_id = 5;
  801. float real = 0;
  802. float idea = max_error * 0.9f;
  803. printf("idea value: %f\n", idea);
  804. bool direct[DOF] = {true, false, false, false, true, true};
  805. for (int j = 0; j < 10; ++j) {
  806. int out = fuzzy_pid_motor_pwd_output(real, idea, direct[control_id],
  807. pid_vector[control_id]);
  808. real += (float)(out - middle_pwm_output) / (float)middle_pwm_output *
  809. (float)max_error * 0.1f;
  810. printf("%d,%f\n", out, real);
  811. }
  812. delete_pid_vector(pid_vector, DOF);
  813. }
  814. TEST_RUN_SINGLE_FILE(fuzzypid, fuzzypid1, "test/python/fuzzypid/fuzzypid1.py");
  815. TEST_RUN_SINGLE_FILE(lvgl, base, "test/python/pika_lvgl/base.py");
  816. TEST_RUN_SINGLE_FILE(lvgl, lv_arc1, "test/python/pika_lvgl/lv_arc1.py");
  817. TEST_RUN_SINGLE_FILE(lvgl, lv_arc2, "test/python/pika_lvgl/lv_arc2.py");
  818. TEST_RUN_SINGLE_FILE(lvgl, lv_bar1, "test/python/pika_lvgl/lv_bar1.py");
  819. TEST_RUN_SINGLE_FILE(lvgl, lv_btn1, "test/python/pika_lvgl/lv_btn1.py");
  820. TEST_RUN_SINGLE_FILE(lvgl,
  821. lv_callback1,
  822. "test/python/pika_lvgl/lv_callback1.py");
  823. TEST_RUN_SINGLE_FILE(lvgl,
  824. lv_checkbox,
  825. "test/python/pika_lvgl/lv_checkbox1.py");
  826. TEST_RUN_SINGLE_FILE(lvgl, lv_drag, "test/python/pika_lvgl/lv_drag.py");
  827. TEST_RUN_SINGLE_FILE(lvgl, lv_label1, "test/python/pika_lvgl/lv_label1.py");
  828. TEST_RUN_SINGLE_FILE(lvgl, lv_list1, "test/python/pika_lvgl/lv_list1.py");
  829. TEST_RUN_SINGLE_FILE(lvgl, lv_obj1, "test/python/pika_lvgl/lv_obj1.py");
  830. TEST_RUN_SINGLE_FILE(lvgl, lv_obj2, "test/python/pika_lvgl/lv_obj2.py");
  831. TEST_RUN_SINGLE_FILE(lvgl, lv_obj3, "test/python/pika_lvgl/lv_obj3.py");
  832. // TEST_RUN_SINGLE_FILE(lvgl, lv_png, "test/python/pika_lvgl/lv_png.py");
  833. TEST_RUN_SINGLE_FILE(lvgl, lv_roller1, "test/python/pika_lvgl/lv_roller1.py");
  834. TEST_RUN_SINGLE_FILE(lvgl, lv_slider1, "test/python/pika_lvgl/lv_slider1.py");
  835. TEST_RUN_SINGLE_FILE(lvgl, lv_style1, "test/python/pika_lvgl/lv_style1.py");
  836. TEST_RUN_SINGLE_FILE(lvgl, lv_switch1, "test/python/pika_lvgl/lv_switch1.py");
  837. TEST_RUN_SINGLE_FILE(lvgl, lv_table1, "test/python/pika_lvgl/lv_table1.py");
  838. TEST_RUN_SINGLE_FILE(lvgl, lv_tabview1, "test/python/pika_lvgl/lv_tabview1.py");
  839. TEST_RUN_SINGLE_FILE(lvgl, lv_tabview2, "test/python/pika_lvgl/lv_tabview2.py");
  840. TEST_RUN_SINGLE_FILE(lvgl,
  841. lv_textarea1,
  842. "test/python/pika_lvgl/lv_textarea1.py");
  843. TEST_RUN_SINGLE_FILE(lvgl, lv_tim, "test/python/pika_lvgl/lv_tim.py");
  844. TEST_RUN_SINGLE_FILE(lvgl, lv_uidemo, "test/python/pika_lvgl/lv_uidemo.py");
  845. TEST(jrpc, client) {
  846. ASSERT_EQ(jrpc_test_client(), 0);
  847. }
  848. TEST(jrpc, server) {
  849. ASSERT_EQ(jrpc_test_server(), 0);
  850. }
  851. // Mock functions for testing
  852. static char* mock_receive_message = NULL;
  853. static char* mock_sent_message = NULL;
  854. void mock_send(const char* message) {
  855. if (mock_sent_message) {
  856. free(mock_sent_message);
  857. }
  858. mock_sent_message = strdup(message);
  859. }
  860. char* mock_receive(void) {
  861. if (mock_receive_message) {
  862. char* temp = strdup(mock_receive_message);
  863. free(mock_receive_message);
  864. mock_receive_message = NULL;
  865. return temp;
  866. }
  867. return NULL;
  868. }
  869. void mock_yield(void) {
  870. sched_yield();
  871. }
  872. static unsigned long mock_tick_ms(void) {
  873. return pika_platform_get_tick();
  874. }
  875. rpc_mapping gtest_rpc_map[] = {
  876. {"add",
  877. [](cJSON* params[], int param_count) -> cJSON* {
  878. int a = params[0]->valueint;
  879. int b = params[1]->valueint;
  880. return cJSON_CreateNumber(a + b);
  881. },
  882. 2},
  883. {"get_val",
  884. [](cJSON* params[], int param_count) -> cJSON* {
  885. return cJSON_CreateNumber(2478);
  886. },
  887. 0},
  888. {"concat",
  889. [](cJSON* params[], int param_count) -> cJSON* {
  890. const char* str1 = params[0]->valuestring;
  891. const char* str2 = params[1]->valuestring;
  892. size_t len = strlen(str1) + strlen(str2) + 1;
  893. char* result_str = (char*)malloc(len);
  894. if (!result_str)
  895. return NULL;
  896. strcpy(result_str, str1);
  897. strcat(result_str, str2);
  898. cJSON* result = cJSON_CreateString(result_str);
  899. free(result_str);
  900. return result;
  901. },
  902. 2},
  903. {"multiply",
  904. [](cJSON* params[], int param_count) -> cJSON* {
  905. double a = params[0]->valuedouble;
  906. double b = params[1]->valuedouble;
  907. return cJSON_CreateNumber(a * b);
  908. },
  909. 2},
  910. RPC_MAP_END};
  911. rpc_mapping_nonblocking gtest_nonblocking_rpc_map[] = {RPC_MAP_END};
  912. TEST(jrpc, InvalidJSONFormat) {
  913. JRPC jrpc = {gtest_rpc_map,
  914. gtest_nonblocking_rpc_map,
  915. mock_send,
  916. mock_receive,
  917. 1,
  918. mock_yield,
  919. mock_tick_ms,
  920. 0,
  921. {NULL},
  922. 0};
  923. const char* request =
  924. "{\"jsonrpc\": \"1.0\", \"method\": \"add\", \"params\": [3, 4], "
  925. "\"id\": 1, \"type\": "; // Invalid JSON
  926. mock_sent_message = NULL;
  927. JRPC_server_handle_string(&jrpc, (char*)request);
  928. ASSERT_EQ(mock_sent_message, nullptr);
  929. if (NULL != mock_sent_message) {
  930. free(mock_sent_message);
  931. mock_sent_message = NULL;
  932. }
  933. }
  934. TEST(jrpc, MethodNotFound) {
  935. JRPC jrpc = {gtest_rpc_map,
  936. gtest_nonblocking_rpc_map,
  937. mock_send,
  938. mock_receive,
  939. 1,
  940. mock_yield,
  941. mock_tick_ms,
  942. 0,
  943. {NULL},
  944. 0};
  945. const char* request =
  946. "{\"jsonrpc\": \"1.0\", \"method\": \"subtract\", \"params\": [3, 4], "
  947. "\"id\": 1, \"type\": 0}";
  948. const char* expected_response =
  949. "{\"jsonrpc\": \"1.0\", \"status\": \"method not found\", \"id\": 1, "
  950. "\"type\": 1}";
  951. JRPC_server_handle_string(&jrpc, (char*)request);
  952. ASSERT_EQ(jrpc_compare_json_strings(mock_sent_message, expected_response),
  953. 0);
  954. if (NULL != mock_sent_message) {
  955. free(mock_sent_message);
  956. mock_sent_message = NULL;
  957. }
  958. }
  959. TEST(jrpc, ParameterCountMismatch) {
  960. JRPC jrpc = {gtest_rpc_map,
  961. gtest_nonblocking_rpc_map,
  962. mock_send,
  963. mock_receive,
  964. 1,
  965. mock_yield,
  966. mock_tick_ms,
  967. 0,
  968. {NULL},
  969. 0};
  970. const char* request =
  971. "{\"jsonrpc\": \"1.0\", \"method\": \"add\", \"params\": [3], "
  972. "\"id\": 1, \"type\": 0}";
  973. const char* expected_response =
  974. "{\"jsonrpc\": \"1.0\", \"status\": \"invalid params\", \"id\": 1, "
  975. "\"type\": 1}";
  976. JRPC_server_handle_string(&jrpc, (char*)request);
  977. ASSERT_EQ(jrpc_compare_json_strings(mock_sent_message, expected_response),
  978. 0);
  979. if (NULL != mock_sent_message) {
  980. free(mock_sent_message);
  981. mock_sent_message = NULL;
  982. }
  983. }
  984. #if 0
  985. TEST(jrpc, InvalidParameterType) {
  986. JRPC jrpc = {gtest_rpc_map,
  987. gtest_nonblocking_rpc_map,
  988. mock_send,
  989. mock_receive,
  990. 1, mock_yield,
  991. mock_tick_ms,
  992. 0,
  993. {NULL},
  994. 0};
  995. const char* request =
  996. "{\"jsonrpc\": \"1.0\", \"method\": \"add\", \"params\": [3, \"a\"], "
  997. "\"id\": 1, \"type\": 0}";
  998. const char* expected_response =
  999. "{\"jsonrpc\": \"1.0\", \"status\": \"invalid params\", \"id\": 1, "
  1000. "\"type\": 1}";
  1001. JRPC_server_handle_string(&jrpc, (char*)request);
  1002. ASSERT_EQ(jrpc_compare_json_strings(mock_sent_message, expected_response),
  1003. 0);
  1004. if (NULL != mock_sent_message) {
  1005. free(mock_sent_message);
  1006. mock_sent_message = NULL;
  1007. }
  1008. }
  1009. #endif
  1010. // Buffer for communication between client and server
  1011. static char* server_receive_buffer = NULL;
  1012. static char* client_receive_buffer = NULL;
  1013. // Server send function
  1014. static void jrpc_server_send(const char* message) {
  1015. if (client_receive_buffer) {
  1016. free(client_receive_buffer);
  1017. }
  1018. client_receive_buffer = strdup(message);
  1019. }
  1020. // Server receive function
  1021. static char* jrpc_server_receive(void) {
  1022. if (server_receive_buffer) {
  1023. char* temp = strdup(server_receive_buffer);
  1024. free(server_receive_buffer);
  1025. server_receive_buffer = NULL;
  1026. return temp;
  1027. }
  1028. return NULL;
  1029. }
  1030. // Client send function
  1031. static void jrpc_client_send(const char* message) {
  1032. if (server_receive_buffer) {
  1033. free(server_receive_buffer);
  1034. }
  1035. server_receive_buffer = strdup(message);
  1036. }
  1037. // Client receive function
  1038. static char* jrpc_client_receive(void) {
  1039. if (client_receive_buffer) {
  1040. char* temp = strdup(client_receive_buffer);
  1041. free(client_receive_buffer);
  1042. client_receive_buffer = NULL;
  1043. return temp;
  1044. }
  1045. return NULL;
  1046. }
  1047. // Global atomic variable to signal the server to stop
  1048. std::atomic<bool> server_running(true);
  1049. // Function to periodically call JRPC_server_handle
  1050. static void server_handle(JRPC* server) {
  1051. while (server_running) {
  1052. JRPC_server_handle(server);
  1053. std::this_thread::sleep_for(std::chrono::milliseconds(
  1054. 10)); // Adjust the sleep duration as needed
  1055. }
  1056. }
  1057. // Test case
  1058. TEST(jrpc, BlockingRequestBetweenTwoJRPC) {
  1059. // Server JRPC
  1060. JRPC server = {gtest_rpc_map,
  1061. gtest_nonblocking_rpc_map,
  1062. jrpc_server_send,
  1063. jrpc_server_receive,
  1064. 1,
  1065. mock_yield,
  1066. mock_tick_ms,
  1067. 0,
  1068. {NULL},
  1069. 0};
  1070. // Client JRPC
  1071. JRPC client = {gtest_rpc_map,
  1072. gtest_nonblocking_rpc_map,
  1073. jrpc_client_send,
  1074. jrpc_client_receive,
  1075. 1,
  1076. mock_yield,
  1077. mock_tick_ms,
  1078. 0,
  1079. {NULL},
  1080. 0};
  1081. // Create a thread to run server_handle
  1082. server_running = 1;
  1083. std::thread server_thread(server_handle, &server);
  1084. // Client sends request to Server
  1085. const char* request_method = "add";
  1086. cJSON* params[] = {cJSON_CreateNumber(10), cJSON_CreateNumber(20)};
  1087. cJSON* response =
  1088. JRPC_send_request_blocking(&client, request_method, params, 2);
  1089. // Verify that client received correct response
  1090. ASSERT_EQ(cJSON_GetObjectItem(response, "result")->valueint, 30);
  1091. // Clean up cJSON objects
  1092. if (response != NULL) {
  1093. cJSON_Delete(response);
  1094. }
  1095. for (int i = 0; i < 2; i++) {
  1096. cJSON_Delete(params[i]);
  1097. }
  1098. // Signal the server to stop and wait for the server thread to finish
  1099. server_running = false;
  1100. server_thread.join();
  1101. // Clean up mock_sent_message
  1102. if (NULL != mock_sent_message) {
  1103. free(mock_sent_message);
  1104. mock_sent_message = NULL;
  1105. }
  1106. if (NULL != server_receive_buffer) {
  1107. free(server_receive_buffer);
  1108. server_receive_buffer = NULL;
  1109. }
  1110. }
  1111. // 结果回调函数示例
  1112. void result_callback(cJSON* result) {
  1113. if (result) {
  1114. char* result_str = cJSON_Print(result);
  1115. printf("Result: %s\n", result_str);
  1116. free(result_str);
  1117. cJSON_Delete(result);
  1118. } else {
  1119. printf("No result\n");
  1120. }
  1121. }
  1122. char* mock_receive_cmd(void) {
  1123. static int count = 0;
  1124. count++;
  1125. switch (count) {
  1126. case 1:
  1127. return "{\"jsonrpc\": \"1.0\", \"status\": \"received\", \"id\": "
  1128. "1, "
  1129. "\"type\": 1}";
  1130. case 2:
  1131. return "{\"jsonrpc\": \"1.0\", \"result\": 8, \"id\": 1, \"type\": "
  1132. "2}";
  1133. default:
  1134. return NULL;
  1135. }
  1136. }
  1137. // 测试用例:测试 jrpc_cmd 函数
  1138. TEST(jrpc, cmd) {
  1139. JRPC jrpc = {gtest_rpc_map,
  1140. gtest_nonblocking_rpc_map,
  1141. mock_send,
  1142. mock_receive_cmd,
  1143. 0,
  1144. mock_yield,
  1145. mock_tick_ms,
  1146. 0,
  1147. {NULL},
  1148. 0};
  1149. // 清空 mock_sent_message
  1150. if (mock_sent_message) {
  1151. free(mock_sent_message);
  1152. mock_sent_message = NULL;
  1153. }
  1154. // 模拟命令行输入 "add 5 3"
  1155. char* result = JRPC_cmd(&jrpc, "add 5 3");
  1156. // 预期的请求字符串
  1157. EXPECT_STREQ(result, "8");
  1158. free(result);
  1159. // 清理
  1160. if (mock_sent_message) {
  1161. free(mock_sent_message);
  1162. mock_sent_message = NULL;
  1163. }
  1164. }
  1165. char* execute_cmd(const char* cmd) {
  1166. // Server JRPC
  1167. JRPC server = {gtest_rpc_map,
  1168. gtest_nonblocking_rpc_map,
  1169. jrpc_server_send,
  1170. jrpc_server_receive,
  1171. 1,
  1172. mock_yield,
  1173. mock_tick_ms,
  1174. 0,
  1175. {NULL},
  1176. 0};
  1177. // Client JRPC
  1178. JRPC client = {gtest_rpc_map,
  1179. gtest_nonblocking_rpc_map,
  1180. jrpc_client_send,
  1181. jrpc_client_receive,
  1182. 1,
  1183. mock_yield,
  1184. mock_tick_ms,
  1185. 0,
  1186. {NULL},
  1187. 0};
  1188. // Create a thread to run server_handle
  1189. server_running = 1;
  1190. std::thread server_thread(server_handle, &server);
  1191. // Client sends request to Server
  1192. char* response = JRPC_cmd(&client, cmd);
  1193. // Signal the server to stop and wait for the server thread to finish
  1194. server_running = false;
  1195. server_thread.join();
  1196. // Clean up mock_sent_message
  1197. if (NULL != mock_sent_message) {
  1198. free(mock_sent_message);
  1199. mock_sent_message = NULL;
  1200. }
  1201. if (NULL != server_receive_buffer) {
  1202. free(server_receive_buffer);
  1203. server_receive_buffer = NULL;
  1204. }
  1205. JRPC_deinit(&server);
  1206. return response;
  1207. }
  1208. TEST(jrpc, exec_add) {
  1209. char* response = execute_cmd("add 10 20");
  1210. EXPECT_STREQ(response, "30");
  1211. free(response);
  1212. }
  1213. TEST(jrpc, exec_get_val) {
  1214. char* response = execute_cmd("get_val");
  1215. EXPECT_STREQ(response, "2478");
  1216. free(response);
  1217. }
  1218. TEST(jrpc, exec_par_num_err) {
  1219. char* response = execute_cmd("get_val 123");
  1220. EXPECT_STREQ(response, NULL);
  1221. }
  1222. TEST(jrpc, exec_concat) {
  1223. char* response = execute_cmd("concat hello world");
  1224. EXPECT_STREQ(response, "\"helloworld\"");
  1225. free(response);
  1226. }
  1227. TEST(jrpc, exec_multiply) {
  1228. char* response = execute_cmd("multiply 3.5 2.0");
  1229. EXPECT_STREQ(response, "7");
  1230. free(response);
  1231. }
  1232. TEST(jrpc, exec_multiply_integer) {
  1233. char* response = execute_cmd("multiply 3 2");
  1234. EXPECT_STREQ(response, "6");
  1235. free(response);
  1236. }
  1237. TEST(jrpc, exec_concat_num_err) {
  1238. char* response = execute_cmd("concat hello");
  1239. EXPECT_EQ(response, nullptr);
  1240. }
  1241. TEST(jrpc, exec_concat_str) {
  1242. char* response = execute_cmd("concat \"hello\" \"world\"");
  1243. EXPECT_STREQ(response, "\"helloworld\"");
  1244. free(response);
  1245. }
  1246. TEST(jrpc, exec_concat_str_space) {
  1247. char* response = execute_cmd("concat \"he llo\" \"world\"");
  1248. EXPECT_STREQ(response, "\"he lloworld\"");
  1249. free(response);
  1250. }
  1251. #if !PIKA_NANO_ENABLE
  1252. TEST(threading, lock_rlock) {
  1253. g_PikaMemInfo.heapUsedMax = 0;
  1254. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  1255. extern unsigned char pikaModules_py_a[];
  1256. obj_linkLibrary(pikaMain, pikaModules_py_a); /* run */
  1257. __platform_printf("BEGIN\r\n");
  1258. pikaVM_runSingleFile(pikaMain, "test/python/threading/lock_rlock.py");
  1259. /* assert */ /* deinit */
  1260. pika_vm_exit_await();
  1261. obj_deinit(pikaMain);
  1262. EXPECT_EQ(pikaMemNow(), 0);
  1263. }
  1264. #endif
  1265. TEST_END