test_event_common.cpp 53 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582
  1. /*
  2. * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Unlicense OR CC0-1.0
  5. */
  6. /* This file contains all tests runnable on targets as well as on the host */
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include "sdkconfig.h"
  10. #include "freertos/FreeRTOS.h"
  11. #include "freertos/task.h"
  12. #include "esp_event.h"
  13. #include "unity.h"
  14. ESP_EVENT_DECLARE_BASE(s_test_base1);
  15. ESP_EVENT_DECLARE_BASE(s_test_base2);
  16. ESP_EVENT_DEFINE_BASE(s_test_base1);
  17. ESP_EVENT_DEFINE_BASE(s_test_base2);
  18. enum {
  19. TEST_EVENT_BASE1_EV1,
  20. TEST_EVENT_BASE1_EV2,
  21. TEST_EVENT_BASE1_MAX
  22. };
  23. enum {
  24. TEST_EVENT_BASE2_EV1,
  25. TEST_EVENT_BASE2_MAX
  26. };
  27. static const TickType_t ZERO_DELAY = 0;
  28. static esp_event_loop_args_t test_event_get_default_loop_args(void)
  29. {
  30. esp_event_loop_args_t loop_config = {
  31. .queue_size = CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE,
  32. .task_name = "loop",
  33. .task_priority = uxTaskPriorityGet(NULL),
  34. .task_stack_size = 2048,
  35. .task_core_id = 0 // Linux simulator is single core only
  36. };
  37. return loop_config;
  38. }
  39. struct EV_LoopFix {
  40. public:
  41. EV_LoopFix(size_t queue_size = CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE, const char *task_name = NULL) {
  42. esp_event_loop_args_t loop_args = test_event_get_default_loop_args();
  43. loop_args.task_name = task_name;
  44. loop_args.queue_size = queue_size;
  45. TEST_ESP_OK(esp_event_loop_create(&loop_args, &loop));
  46. }
  47. ~EV_LoopFix() {
  48. esp_event_loop_delete(loop);
  49. }
  50. esp_event_loop_handle_t loop;
  51. };
  52. TEST_CASE("can create and delete event loop without task", "[event][linux]")
  53. {
  54. esp_event_loop_handle_t loop;
  55. esp_event_loop_args_t loop_args = test_event_get_default_loop_args();
  56. loop_args.task_name = NULL;
  57. TEST_ESP_OK(esp_event_loop_create(&loop_args, &loop));
  58. TEST_ESP_OK(esp_event_loop_delete(loop));
  59. }
  60. TEST_CASE("can create and delete event loop with task", "[event][linux]")
  61. {
  62. esp_event_loop_handle_t loop;
  63. esp_event_loop_args_t loop_args = test_event_get_default_loop_args();
  64. TEST_ESP_OK(esp_event_loop_create(&loop_args, &loop));
  65. TEST_ESP_OK(esp_event_loop_delete(loop));
  66. }
  67. TEST_CASE("can post events up to loop's max queue size", "[event][linux]")
  68. {
  69. EV_LoopFix loop_fix(2);
  70. TEST_ASSERT_EQUAL(ESP_OK, esp_event_post_to(loop_fix.loop,
  71. s_test_base1,
  72. TEST_EVENT_BASE1_EV1,
  73. NULL,
  74. 0,
  75. pdMS_TO_TICKS(10)));
  76. TEST_ASSERT_EQUAL(ESP_OK, esp_event_post_to(loop_fix.loop,
  77. s_test_base1,
  78. TEST_EVENT_BASE1_EV1,
  79. NULL,
  80. 0,
  81. pdMS_TO_TICKS(10)));
  82. }
  83. TEST_CASE("posting to full event loop times out", "[event][linux]")
  84. {
  85. EV_LoopFix loop_fix(1);
  86. TEST_ASSERT_EQUAL(ESP_OK,
  87. esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, pdMS_TO_TICKS(0)));
  88. TEST_ASSERT_EQUAL(ESP_ERR_TIMEOUT,
  89. esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, pdMS_TO_TICKS(0)));
  90. TEST_ASSERT_EQUAL(ESP_ERR_TIMEOUT,
  91. esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, pdMS_TO_TICKS(10)));
  92. }
  93. TEST_CASE("can post to loop and run loop without registration", "[event][linux]")
  94. {
  95. EV_LoopFix loop_fix;
  96. TEST_ASSERT_EQUAL(ESP_OK,
  97. esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, pdMS_TO_TICKS(10)));
  98. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  99. }
  100. static void test_handler_inc(void* event_handler_arg, esp_event_base_t event_base, int32_t event_id, void* event_data)
  101. {
  102. int *target = (int*) event_handler_arg;
  103. (*target)++;
  104. }
  105. TEST_CASE("registering event handler instance without instance context works", "[event][linux]") {
  106. EV_LoopFix loop_fix;
  107. int count = 0;
  108. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  109. s_test_base1,
  110. TEST_EVENT_BASE1_EV1,
  111. test_handler_inc,
  112. &count,
  113. NULL));
  114. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  115. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  116. TEST_ASSERT_EQUAL(1, count);
  117. }
  118. /* Register the handler twice to the same base and id but with a different argument
  119. * (expects to return ESP_OK and log a warning)
  120. * This aims to verify: 1) Handler's argument to be updated
  121. * 2) Registration not to leak memory
  122. */
  123. TEST_CASE("registering event twice with same handler yields updated handler arg", "[event][linux]") {
  124. EV_LoopFix loop_fix;
  125. int count_first = 0;
  126. int count_second = 0;
  127. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  128. ESP_EVENT_ANY_BASE,
  129. ESP_EVENT_ANY_ID,
  130. test_handler_inc,
  131. &count_first));
  132. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  133. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  134. TEST_ASSERT_EQUAL(count_first, 1);
  135. // overriding the former registration of the same event
  136. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  137. ESP_EVENT_ANY_BASE,
  138. ESP_EVENT_ANY_ID,
  139. test_handler_inc,
  140. &count_second));
  141. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  142. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  143. TEST_ASSERT_EQUAL(1, count_first);
  144. TEST_ASSERT_EQUAL(1, count_second);
  145. }
  146. TEST_CASE("registering event handler instance twice works", "[event][linux]") {
  147. EV_LoopFix loop_fix;
  148. int count_1 = 0;
  149. int count_2 = 0;
  150. esp_event_handler_instance_t ctx_1;
  151. esp_event_handler_instance_t ctx_2;
  152. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  153. ESP_EVENT_ANY_BASE,
  154. ESP_EVENT_ANY_ID,
  155. test_handler_inc,
  156. &count_1,
  157. &ctx_1));
  158. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  159. ESP_EVENT_ANY_BASE,
  160. ESP_EVENT_ANY_ID,
  161. test_handler_inc,
  162. &count_2,
  163. &ctx_2));
  164. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, pdMS_TO_TICKS(10)));
  165. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  166. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  167. TEST_ASSERT_EQUAL(1, count_1);
  168. TEST_ASSERT_EQUAL(1, count_2);
  169. }
  170. TEST_CASE("registering with ANY_BASE but specific ID fails", "[event][linux]") {
  171. EV_LoopFix loop_fix;
  172. int count = 0;
  173. int count_instance = 0;
  174. esp_event_handler_instance_t ctx;
  175. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, esp_event_handler_register_with(loop_fix.loop,
  176. ESP_EVENT_ANY_BASE,
  177. TEST_EVENT_BASE1_EV1,
  178. test_handler_inc,
  179. &count));
  180. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, esp_event_handler_instance_register_with(loop_fix.loop,
  181. ESP_EVENT_ANY_BASE,
  182. TEST_EVENT_BASE1_EV1,
  183. test_handler_inc,
  184. &count_instance,
  185. &ctx));
  186. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  187. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  188. TEST_ASSERT_EQUAL(0, count);
  189. TEST_ASSERT_EQUAL(0, count_instance);
  190. }
  191. TEST_CASE("registration of ANY_BASE and ANY_ID always called", "[event][linux]") {
  192. EV_LoopFix loop_fix;
  193. int count = 0;
  194. int count_instance = 0;
  195. esp_event_handler_instance_t ctx;
  196. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  197. ESP_EVENT_ANY_BASE,
  198. ESP_EVENT_ANY_ID,
  199. test_handler_inc,
  200. &count));
  201. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  202. ESP_EVENT_ANY_BASE,
  203. ESP_EVENT_ANY_ID,
  204. test_handler_inc,
  205. &count_instance,
  206. &ctx));
  207. // handlers should always be triggered
  208. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  209. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV2, NULL, 0, portMAX_DELAY));
  210. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base2, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  211. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base2, TEST_EVENT_BASE1_EV2, NULL, 0, portMAX_DELAY));
  212. for (size_t i = 0; i < 4; i++) {
  213. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  214. }
  215. TEST_ASSERT_EQUAL(4, count);
  216. TEST_ASSERT_EQUAL(4, count_instance);
  217. }
  218. TEST_CASE("registration of ANY_ID not called from wrong base", "[event][linux]") {
  219. EV_LoopFix loop_fix;
  220. int count = 0;
  221. int count_instance = 0;
  222. esp_event_handler_instance_t ctx;
  223. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  224. s_test_base1,
  225. ESP_EVENT_ANY_ID,
  226. test_handler_inc,
  227. &count));
  228. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  229. s_test_base1,
  230. ESP_EVENT_ANY_ID,
  231. test_handler_inc,
  232. &count_instance,
  233. &ctx));
  234. // handlers shouldn't be triggered with different base
  235. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base2, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  236. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base2, TEST_EVENT_BASE1_EV2, NULL, 0, portMAX_DELAY));
  237. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  238. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  239. TEST_ASSERT_EQUAL(0, count);
  240. TEST_ASSERT_EQUAL(0, count_instance);
  241. }
  242. TEST_CASE("registration of ANY_ID called from correct base", "[event][linux]") {
  243. EV_LoopFix loop_fix;
  244. int count = 0;
  245. int count_instance = 0;
  246. esp_event_handler_instance_t ctx;
  247. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  248. s_test_base1,
  249. ESP_EVENT_ANY_ID,
  250. test_handler_inc,
  251. &count));
  252. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  253. s_test_base1,
  254. ESP_EVENT_ANY_ID,
  255. test_handler_inc,
  256. &count_instance,
  257. &ctx));
  258. // for all events with correct base, it should be triggered
  259. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  260. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV2, NULL, 0, portMAX_DELAY));
  261. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  262. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  263. TEST_ASSERT_EQUAL(2, count);
  264. TEST_ASSERT_EQUAL(2, count_instance);
  265. }
  266. TEST_CASE("registering specific event posting different base and different event ID", "[event][linux]") {
  267. EV_LoopFix loop_fix;
  268. int count = 0;
  269. int count_instance = 0;
  270. esp_event_handler_instance_t ctx;
  271. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  272. s_test_base1,
  273. TEST_EVENT_BASE1_EV1,
  274. test_handler_inc,
  275. &count));
  276. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  277. s_test_base1,
  278. TEST_EVENT_BASE1_EV1,
  279. test_handler_inc,
  280. &count_instance,
  281. &ctx));
  282. // handlers should not be triggered with different base and different ID
  283. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base2, TEST_EVENT_BASE1_EV2, NULL, 0, portMAX_DELAY));
  284. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  285. TEST_ASSERT_EQUAL(0, count);
  286. TEST_ASSERT_EQUAL(0, count_instance);
  287. }
  288. TEST_CASE("registering specific event posting different base", "[event][linux]") {
  289. EV_LoopFix loop_fix;
  290. int count = 0;
  291. int count_instance = 0;
  292. esp_event_handler_instance_t ctx;
  293. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  294. s_test_base1,
  295. TEST_EVENT_BASE1_EV1,
  296. test_handler_inc,
  297. &count));
  298. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  299. s_test_base1,
  300. TEST_EVENT_BASE1_EV1,
  301. test_handler_inc,
  302. &count_instance,
  303. &ctx));
  304. // handlers should not be triggered with different base
  305. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base2, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  306. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base2, TEST_EVENT_BASE1_EV2, NULL, 0, portMAX_DELAY));
  307. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  308. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  309. TEST_ASSERT_EQUAL(0, count);
  310. TEST_ASSERT_EQUAL(0, count_instance);
  311. }
  312. TEST_CASE("registering specific event posting incorrect event ID", "[event][linux]") {
  313. EV_LoopFix loop_fix;
  314. int count = 0;
  315. int count_instance = 0;
  316. esp_event_handler_instance_t ctx;
  317. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  318. s_test_base1,
  319. TEST_EVENT_BASE1_EV1,
  320. test_handler_inc,
  321. &count));
  322. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  323. s_test_base1,
  324. TEST_EVENT_BASE1_EV1,
  325. test_handler_inc,
  326. &count_instance,
  327. &ctx));
  328. // for incorrect id, it should not be triggered with different ID
  329. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV2, NULL, 0, portMAX_DELAY));
  330. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  331. TEST_ASSERT_EQUAL(0, count);
  332. TEST_ASSERT_EQUAL(0, count_instance);
  333. }
  334. TEST_CASE("registering specific event posting correct event and base", "[event][linux]") {
  335. EV_LoopFix loop_fix;
  336. int count = 0;
  337. int count_instance = 0;
  338. esp_event_handler_instance_t ctx;
  339. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  340. s_test_base1,
  341. TEST_EVENT_BASE1_EV1,
  342. test_handler_inc,
  343. &count));
  344. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  345. s_test_base1,
  346. TEST_EVENT_BASE1_EV1,
  347. test_handler_inc,
  348. &count_instance,
  349. &ctx));
  350. // for correct event and base, it should be triggered
  351. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  352. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  353. TEST_ASSERT_EQUAL(1, count);
  354. TEST_ASSERT_EQUAL(1, count_instance);
  355. }
  356. TEST_CASE("posting ANY_EVENT or ANY_ID fails", "[event][linux]") {
  357. EV_LoopFix loop_fix;
  358. int count = 0;
  359. int count_instance = 0;
  360. esp_event_handler_instance_t ctx;
  361. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  362. ESP_EVENT_ANY_BASE,
  363. ESP_EVENT_ANY_ID,
  364. test_handler_inc,
  365. &count));
  366. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  367. s_test_base1,
  368. ESP_EVENT_ANY_ID,
  369. test_handler_inc,
  370. &count));
  371. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  372. s_test_base1,
  373. TEST_EVENT_BASE1_EV1,
  374. test_handler_inc,
  375. &count));
  376. // normal and "instance" registration are decently close to each other, don't exercise all cases here
  377. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  378. ESP_EVENT_ANY_BASE,
  379. ESP_EVENT_ANY_ID,
  380. test_handler_inc,
  381. &count_instance,
  382. &ctx));
  383. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG,
  384. esp_event_post_to(loop_fix.loop, ESP_EVENT_ANY_BASE, ESP_EVENT_ANY_ID, NULL, 0, portMAX_DELAY));
  385. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG,
  386. esp_event_post_to(loop_fix.loop, s_test_base1, ESP_EVENT_ANY_ID, NULL, 0, portMAX_DELAY));
  387. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG,
  388. esp_event_post_to(loop_fix.loop, ESP_EVENT_ANY_BASE, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  389. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  390. TEST_ASSERT_EQUAL(0, count);
  391. TEST_ASSERT_EQUAL(0, count_instance);
  392. }
  393. TEST_CASE("posting to loop with multiple registrations at every level", "[event][linux]") {
  394. EV_LoopFix loop_fix;
  395. int count_loop = 0;
  396. int count_loop_inst = 0;
  397. int count_base = 0;
  398. int count_base_inst = 0;
  399. int count_id = 0; // without instance, no more than one registration for a specific event ID
  400. int count_id_inst_1 = 0;
  401. int count_id_inst_2 = 0;
  402. esp_event_handler_instance_t loop_ctx;
  403. esp_event_handler_instance_t base_ctx;
  404. esp_event_handler_instance_t id_ctx_1;
  405. esp_event_handler_instance_t id_ctx_2;
  406. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  407. ESP_EVENT_ANY_BASE,
  408. ESP_EVENT_ANY_ID,
  409. test_handler_inc,
  410. &count_loop));
  411. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  412. s_test_base1,
  413. ESP_EVENT_ANY_ID,
  414. test_handler_inc,
  415. &count_base));
  416. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  417. s_test_base1,
  418. TEST_EVENT_BASE1_EV1,
  419. test_handler_inc,
  420. &count_id));
  421. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  422. ESP_EVENT_ANY_BASE,
  423. ESP_EVENT_ANY_ID,
  424. test_handler_inc,
  425. &count_loop_inst,
  426. &loop_ctx));
  427. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  428. s_test_base1,
  429. ESP_EVENT_ANY_ID,
  430. test_handler_inc,
  431. &count_base_inst,
  432. &base_ctx));
  433. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  434. ESP_EVENT_ANY_BASE,
  435. ESP_EVENT_ANY_ID,
  436. test_handler_inc,
  437. &count_id_inst_1,
  438. &id_ctx_1));
  439. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  440. ESP_EVENT_ANY_BASE,
  441. ESP_EVENT_ANY_ID,
  442. test_handler_inc,
  443. &count_id_inst_2,
  444. &id_ctx_2));
  445. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  446. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  447. TEST_ASSERT_EQUAL(count_loop, 1);
  448. TEST_ASSERT_EQUAL(count_loop_inst, 1);
  449. TEST_ASSERT_EQUAL(count_base, 1);
  450. TEST_ASSERT_EQUAL(count_base_inst, 1);
  451. TEST_ASSERT_EQUAL(count_id, 1);
  452. TEST_ASSERT_EQUAL(count_id_inst_1, 1);
  453. TEST_ASSERT_EQUAL(count_id_inst_2, 1);
  454. }
  455. TEST_CASE("unregistering ANY_BASE and specific ID fails", "[event][linux]")
  456. {
  457. EV_LoopFix loop_fix;
  458. esp_event_handler_instance_t handler_inst = (esp_event_handler_instance_t) 1; // avoid triggering NULL check
  459. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, esp_event_handler_unregister_with(loop_fix.loop,
  460. ESP_EVENT_ANY_BASE,
  461. TEST_EVENT_BASE1_EV1,
  462. test_handler_inc));
  463. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, esp_event_handler_instance_unregister_with(loop_fix.loop,
  464. ESP_EVENT_ANY_BASE,
  465. TEST_EVENT_BASE1_EV1,
  466. handler_inst));
  467. }
  468. TEST_CASE("unregistering NULL instance fails", "[event][linux]")
  469. {
  470. EV_LoopFix loop_fix;
  471. esp_event_handler_instance_t handler_inst = NULL;
  472. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, esp_event_handler_instance_unregister_with(loop_fix.loop,
  473. ESP_EVENT_ANY_BASE,
  474. ESP_EVENT_ANY_ID,
  475. handler_inst));
  476. }
  477. TEST_CASE("unregistered handler is not executed", "[event][linux]")
  478. {
  479. EV_LoopFix loop_fix;
  480. int loop_count = 0;
  481. int base_count = 0;
  482. int id_count = 0;
  483. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  484. ESP_EVENT_ANY_BASE,
  485. ESP_EVENT_ANY_ID,
  486. test_handler_inc,
  487. &loop_count));
  488. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  489. s_test_base1,
  490. ESP_EVENT_ANY_ID,
  491. test_handler_inc,
  492. &base_count));
  493. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  494. s_test_base1,
  495. TEST_EVENT_BASE1_EV1,
  496. test_handler_inc,
  497. &id_count));
  498. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  499. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  500. TEST_ASSERT_EQUAL(loop_count, 1);
  501. TEST_ASSERT_EQUAL(base_count, 1);
  502. TEST_ASSERT_EQUAL(id_count, 1);
  503. TEST_ESP_OK(esp_event_handler_unregister_with(loop_fix.loop,
  504. ESP_EVENT_ANY_BASE,
  505. ESP_EVENT_ANY_ID,
  506. test_handler_inc));
  507. TEST_ESP_OK(esp_event_handler_unregister_with(loop_fix.loop,
  508. s_test_base1,
  509. ESP_EVENT_ANY_ID,
  510. test_handler_inc));
  511. TEST_ESP_OK(esp_event_handler_unregister_with(loop_fix.loop,
  512. s_test_base1,
  513. TEST_EVENT_BASE1_EV1,
  514. test_handler_inc));
  515. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  516. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  517. TEST_ASSERT_EQUAL(loop_count, 1);
  518. TEST_ASSERT_EQUAL(base_count, 1);
  519. TEST_ASSERT_EQUAL(id_count, 1);
  520. }
  521. TEST_CASE("unregistered handler instance is not executed", "[event][linux]")
  522. {
  523. EV_LoopFix loop_fix;
  524. int loop_count = 0;
  525. int base_count = 0;
  526. int id_count = 0;
  527. esp_event_handler_instance_t loop_handler_inst;
  528. esp_event_handler_instance_t base_handler_inst;
  529. esp_event_handler_instance_t id_handler_inst;
  530. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  531. ESP_EVENT_ANY_BASE,
  532. ESP_EVENT_ANY_ID,
  533. test_handler_inc,
  534. &loop_count,
  535. &loop_handler_inst));
  536. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  537. s_test_base1,
  538. ESP_EVENT_ANY_ID,
  539. test_handler_inc,
  540. &base_count,
  541. &base_handler_inst));
  542. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  543. s_test_base1,
  544. TEST_EVENT_BASE1_EV1,
  545. test_handler_inc,
  546. &id_count,
  547. &id_handler_inst));
  548. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  549. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  550. TEST_ASSERT_EQUAL(loop_count, 1);
  551. TEST_ASSERT_EQUAL(base_count, 1);
  552. TEST_ASSERT_EQUAL(id_count, 1);
  553. TEST_ESP_OK(esp_event_handler_instance_unregister_with(loop_fix.loop,
  554. ESP_EVENT_ANY_BASE,
  555. ESP_EVENT_ANY_ID,
  556. loop_handler_inst));
  557. TEST_ESP_OK(esp_event_handler_instance_unregister_with(loop_fix.loop,
  558. s_test_base1,
  559. ESP_EVENT_ANY_ID,
  560. base_handler_inst));
  561. TEST_ESP_OK(esp_event_handler_instance_unregister_with(loop_fix.loop,
  562. s_test_base1,
  563. TEST_EVENT_BASE1_EV1,
  564. id_handler_inst));
  565. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  566. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  567. TEST_ASSERT_EQUAL(loop_count, 1);
  568. TEST_ASSERT_EQUAL(base_count, 1);
  569. TEST_ASSERT_EQUAL(id_count, 1);
  570. }
  571. TEST_CASE("unregistering handler does not influence other handlers", "[event][linux]")
  572. {
  573. EV_LoopFix loop_fix;
  574. int unregister_count = 0;
  575. int different_id_count = 0;
  576. int different_base_count = 0;
  577. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  578. s_test_base1,
  579. TEST_EVENT_BASE1_EV1,
  580. test_handler_inc,
  581. &unregister_count));
  582. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  583. s_test_base2,
  584. TEST_EVENT_BASE1_EV1,
  585. test_handler_inc,
  586. &different_id_count));
  587. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  588. s_test_base1,
  589. TEST_EVENT_BASE1_EV2,
  590. test_handler_inc,
  591. &different_base_count));
  592. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  593. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base2, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  594. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV2, NULL, 0, portMAX_DELAY));
  595. for (size_t i = 0; i < 3; i++) {
  596. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  597. }
  598. TEST_ASSERT_EQUAL(unregister_count, 1);
  599. TEST_ASSERT_EQUAL(different_id_count, 1);
  600. TEST_ASSERT_EQUAL(different_base_count, 1);
  601. TEST_ESP_OK(esp_event_handler_unregister_with(loop_fix.loop,
  602. s_test_base1,
  603. TEST_EVENT_BASE1_EV1,
  604. test_handler_inc));
  605. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  606. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base2, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  607. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV2, NULL, 0, portMAX_DELAY));
  608. for (size_t i = 0; i < 3; i++) {
  609. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  610. }
  611. TEST_ASSERT_EQUAL(unregister_count, 1);
  612. TEST_ASSERT_EQUAL(different_id_count, 2);
  613. TEST_ASSERT_EQUAL(different_base_count, 2);
  614. }
  615. TEST_CASE("unregistering ESP_EVENT_ANY_ID does not affect other handlers with same base", "[event][linux]")
  616. {
  617. EV_LoopFix loop_fix;
  618. int any_id_count = 0;
  619. int specific_id_count = 0;
  620. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  621. s_test_base1,
  622. ESP_EVENT_ANY_ID,
  623. test_handler_inc,
  624. &any_id_count));
  625. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  626. s_test_base1,
  627. TEST_EVENT_BASE1_EV1,
  628. test_handler_inc,
  629. &specific_id_count));
  630. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  631. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  632. TEST_ASSERT_EQUAL(any_id_count, 1);
  633. TEST_ASSERT_EQUAL(specific_id_count, 1);
  634. TEST_ESP_OK(esp_event_handler_unregister_with(loop_fix.loop, s_test_base1, ESP_EVENT_ANY_ID, test_handler_inc));
  635. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  636. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  637. TEST_ASSERT_EQUAL(any_id_count, 1);
  638. TEST_ASSERT_EQUAL(specific_id_count, 2);
  639. }
  640. TEST_CASE("unregistering ESP_EVENT_ANY_BASE does not affect handlers with specific base", "[event][linux]")
  641. {
  642. EV_LoopFix loop_fix;
  643. int any_base_count = 0;
  644. int any_id_count = 0;
  645. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  646. ESP_EVENT_ANY_BASE,
  647. ESP_EVENT_ANY_ID,
  648. test_handler_inc,
  649. &any_base_count));
  650. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  651. s_test_base1,
  652. ESP_EVENT_ANY_ID,
  653. test_handler_inc,
  654. &any_id_count));
  655. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  656. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  657. TEST_ASSERT_EQUAL(any_base_count, 1);
  658. TEST_ASSERT_EQUAL(any_id_count, 1);
  659. TEST_ESP_OK(esp_event_handler_unregister_with(loop_fix.loop,
  660. ESP_EVENT_ANY_BASE,
  661. ESP_EVENT_ANY_ID,
  662. test_handler_inc));
  663. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  664. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  665. TEST_ASSERT_EQUAL(any_base_count, 1);
  666. TEST_ASSERT_EQUAL(any_id_count, 2);
  667. }
  668. typedef struct {
  669. esp_event_handler_instance_t context;
  670. esp_event_loop_handle_t loop;
  671. int count;
  672. } unregister_test_data_t;
  673. static void test_handler_unregister_itself(void* event_handler_arg,
  674. esp_event_base_t event_base,
  675. int32_t event_id,
  676. void* event_data)
  677. {
  678. unregister_test_data_t *test_data = (unregister_test_data_t*) event_handler_arg;
  679. (test_data->count)++;
  680. // Unregister this handler for this event
  681. TEST_ESP_OK(esp_event_handler_unregister_with(test_data->loop,
  682. event_base,
  683. event_id,
  684. test_handler_unregister_itself));
  685. }
  686. TEST_CASE("handler can unregister itself", "[event][linux]")
  687. {
  688. EV_LoopFix loop_fix;
  689. unregister_test_data_t test_data = {
  690. .context = NULL,
  691. .loop = loop_fix.loop,
  692. .count = 0,
  693. };
  694. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  695. s_test_base1,
  696. TEST_EVENT_BASE1_EV1,
  697. test_handler_unregister_itself, &test_data));
  698. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  699. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  700. TEST_ASSERT_EQUAL(1, test_data.count);
  701. TEST_ESP_OK(esp_event_post_to(loop_fix.loop,
  702. s_test_base1,
  703. TEST_EVENT_BASE1_EV1,
  704. &loop_fix.loop,
  705. sizeof(&loop_fix.loop),
  706. portMAX_DELAY));
  707. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, pdMS_TO_TICKS(10)));
  708. TEST_ASSERT_EQUAL(1, test_data.count);
  709. }
  710. static void test_handler_instance_unregister_itself(void* event_handler_arg,
  711. esp_event_base_t event_base,
  712. int32_t event_id,
  713. void* event_data)
  714. {
  715. unregister_test_data_t *test_data = (unregister_test_data_t*) event_handler_arg;
  716. (test_data->count)++;
  717. // Unregister this handler for this event
  718. TEST_ESP_OK(esp_event_handler_instance_unregister_with(test_data->loop, event_base, event_id, test_data->context));
  719. }
  720. TEST_CASE("handler instance can unregister itself", "[event][linux]")
  721. {
  722. EV_LoopFix loop_fix;
  723. unregister_test_data_t test_data = {
  724. .context = NULL,
  725. .loop = loop_fix.loop,
  726. .count = 0,
  727. };
  728. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  729. s_test_base1,
  730. TEST_EVENT_BASE1_EV1,
  731. test_handler_instance_unregister_itself,
  732. &test_data,
  733. &(test_data.context)));
  734. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  735. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  736. TEST_ASSERT_EQUAL(1, test_data.count);
  737. TEST_ESP_OK(esp_event_post_to(loop_fix.loop,
  738. s_test_base1,
  739. TEST_EVENT_BASE1_EV1,
  740. &loop_fix.loop,
  741. sizeof(&loop_fix.loop),
  742. portMAX_DELAY));
  743. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  744. TEST_ASSERT_EQUAL(1, test_data.count);
  745. }
  746. typedef struct {
  747. size_t counter;
  748. size_t test_data[4];
  749. } ordered_dispatch_test_data_t;
  750. static void test_event_ordered_dispatch(void* event_handler_arg,
  751. esp_event_base_t event_base,
  752. int32_t event_id,
  753. void* event_data,
  754. size_t handler_index)
  755. {
  756. ordered_dispatch_test_data_t *test_data = (ordered_dispatch_test_data_t*) event_handler_arg;
  757. test_data->test_data[handler_index] = test_data->counter;
  758. (test_data->counter)++;
  759. }
  760. static void test_event_ordered_dispatch_0(void* event_handler_arg,
  761. esp_event_base_t event_base,
  762. int32_t event_id,
  763. void* event_data)
  764. {
  765. test_event_ordered_dispatch(event_handler_arg, event_base, event_id, event_data, 0);
  766. }
  767. static void test_event_ordered_dispatch_1(void* event_handler_arg,
  768. esp_event_base_t event_base,
  769. int32_t event_id,
  770. void* event_data)
  771. {
  772. test_event_ordered_dispatch(event_handler_arg, event_base, event_id, event_data, 1);
  773. }
  774. static void test_event_ordered_dispatch_2(void* event_handler_arg,
  775. esp_event_base_t event_base,
  776. int32_t event_id,
  777. void* event_data)
  778. {
  779. test_event_ordered_dispatch(event_handler_arg, event_base, event_id, event_data, 2);
  780. }
  781. static void test_event_ordered_dispatch_3(void* event_handler_arg,
  782. esp_event_base_t event_base,
  783. int32_t event_id,
  784. void* event_data)
  785. {
  786. test_event_ordered_dispatch(event_handler_arg, event_base, event_id, event_data, 3);
  787. }
  788. TEST_CASE("events handlers for specific ID are dispatched in the order they are registered", "[event][linux]")
  789. {
  790. EV_LoopFix loop_fix;
  791. ordered_dispatch_test_data_t test_data = {
  792. .counter = 0,
  793. .test_data = {},
  794. };
  795. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  796. s_test_base1,
  797. TEST_EVENT_BASE1_EV1,
  798. test_event_ordered_dispatch_0,
  799. &test_data));
  800. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  801. s_test_base1,
  802. TEST_EVENT_BASE1_EV1,
  803. test_event_ordered_dispatch_1,
  804. &test_data));
  805. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  806. s_test_base1,
  807. TEST_EVENT_BASE1_EV1,
  808. test_event_ordered_dispatch_2,
  809. &test_data));
  810. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  811. s_test_base1,
  812. TEST_EVENT_BASE1_EV1,
  813. test_event_ordered_dispatch_3,
  814. &test_data));
  815. esp_event_dump(stdout);
  816. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  817. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  818. // Expected data executing the posts above
  819. size_t ref_arr[4];
  820. for (size_t i = 0; i < 4; i++) {
  821. ref_arr[i] = i;
  822. }
  823. TEST_ASSERT_EQUAL_INT_ARRAY(ref_arr, test_data.test_data, 4);
  824. }
  825. TEST_CASE("events handlers for specific base are dispatched in the order they are registered", "[event][linux]")
  826. {
  827. EV_LoopFix loop_fix;
  828. ordered_dispatch_test_data_t test_data = {
  829. .counter = 0,
  830. .test_data = {},
  831. };
  832. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  833. s_test_base1,
  834. ESP_EVENT_ANY_ID,
  835. test_event_ordered_dispatch_0,
  836. &test_data));
  837. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  838. s_test_base1,
  839. ESP_EVENT_ANY_ID,
  840. test_event_ordered_dispatch_1,
  841. &test_data));
  842. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  843. s_test_base1,
  844. ESP_EVENT_ANY_ID,
  845. test_event_ordered_dispatch_2,
  846. &test_data));
  847. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  848. s_test_base1,
  849. ESP_EVENT_ANY_ID,
  850. test_event_ordered_dispatch_3,
  851. &test_data));
  852. esp_event_dump(stdout);
  853. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  854. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  855. // Expected data executing the posts above
  856. size_t ref_arr[4];
  857. for (size_t i = 0; i < 4; i++) {
  858. ref_arr[i] = i;
  859. }
  860. TEST_ASSERT_EQUAL_INT_ARRAY(ref_arr, test_data.test_data, 4);
  861. }
  862. TEST_CASE("events handlers for any base are dispatched in the order they are registered", "[event][linux]")
  863. {
  864. EV_LoopFix loop_fix;
  865. ordered_dispatch_test_data_t test_data = {
  866. .counter = 0,
  867. .test_data = {},
  868. };
  869. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  870. ESP_EVENT_ANY_BASE,
  871. ESP_EVENT_ANY_ID,
  872. test_event_ordered_dispatch_0,
  873. &test_data));
  874. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  875. ESP_EVENT_ANY_BASE,
  876. ESP_EVENT_ANY_ID,
  877. test_event_ordered_dispatch_1,
  878. &test_data));
  879. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  880. ESP_EVENT_ANY_BASE,
  881. ESP_EVENT_ANY_ID,
  882. test_event_ordered_dispatch_2,
  883. &test_data));
  884. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  885. ESP_EVENT_ANY_BASE,
  886. ESP_EVENT_ANY_ID,
  887. test_event_ordered_dispatch_3,
  888. &test_data));
  889. esp_event_dump(stdout);
  890. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  891. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  892. // Expected data executing the posts above
  893. size_t ref_arr[4];
  894. for (size_t i = 0; i < 4; i++) {
  895. ref_arr[i] = i;
  896. }
  897. TEST_ASSERT_EQUAL_INT_ARRAY(ref_arr, test_data.test_data, 4);
  898. }
  899. static void test_create_loop_handler(void* handler_args, esp_event_base_t base, int32_t id, void* event_data)
  900. {
  901. esp_event_loop_args_t loop_args = test_event_get_default_loop_args();
  902. if (id == TEST_EVENT_BASE1_EV1) {
  903. TEST_ESP_OK(esp_event_loop_create(&loop_args, (esp_event_loop_handle_t*) handler_args));
  904. } else {
  905. TEST_ESP_OK(esp_event_loop_delete(*((esp_event_loop_handle_t*) handler_args)));
  906. }
  907. }
  908. TEST_CASE("can create and delete loop from handler", "[event][linux]")
  909. {
  910. EV_LoopFix loop_fix;
  911. esp_event_loop_handle_t test_loop;
  912. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  913. s_test_base1,
  914. TEST_EVENT_BASE1_EV1,
  915. test_create_loop_handler,
  916. &test_loop));
  917. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  918. s_test_base1,
  919. TEST_EVENT_BASE1_EV2,
  920. test_create_loop_handler,
  921. &test_loop));
  922. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  923. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  924. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV2, NULL, 0, portMAX_DELAY));
  925. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  926. }
  927. typedef struct {
  928. esp_event_loop_handle_t loop;
  929. int count;
  930. } posting_handler_data_t;
  931. static void test_handler_post(void* handler_arg, esp_event_base_t base, int32_t id, void* event_arg)
  932. {
  933. posting_handler_data_t* data = (posting_handler_data_t*) handler_arg;
  934. TEST_ESP_OK(esp_event_post_to(data->loop, s_test_base1, TEST_EVENT_BASE1_EV2, NULL, 0, portMAX_DELAY));
  935. data->count++;
  936. }
  937. TEST_CASE("can post to loop from handler", "[event][linux]")
  938. {
  939. EV_LoopFix loop_fix;
  940. posting_handler_data_t arg = {
  941. .loop = loop_fix.loop,
  942. .count = 0,
  943. };
  944. int secondary_handler_count = 0;
  945. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  946. s_test_base1,
  947. TEST_EVENT_BASE1_EV1,
  948. test_handler_post,
  949. &arg));
  950. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  951. s_test_base1,
  952. TEST_EVENT_BASE1_EV2,
  953. test_handler_inc,
  954. &secondary_handler_count));
  955. // Test that a handler can post to a different loop while there is still slots on the queue
  956. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  957. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  958. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  959. TEST_ASSERT_EQUAL(1, arg.count);
  960. TEST_ASSERT_EQUAL(1, secondary_handler_count);
  961. }
  962. TEST_CASE("can post to loop from handler instance", "[event][linux]")
  963. {
  964. EV_LoopFix loop_fix;
  965. esp_event_handler_instance_t ctx;
  966. posting_handler_data_t arg = {
  967. .loop = loop_fix.loop,
  968. .count = 0,
  969. };
  970. int secondary_handler_count = 0;
  971. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  972. s_test_base1,
  973. TEST_EVENT_BASE1_EV1,
  974. test_handler_post,
  975. &arg,
  976. &ctx));
  977. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  978. s_test_base1,
  979. TEST_EVENT_BASE1_EV2,
  980. test_handler_inc,
  981. &secondary_handler_count));
  982. // Test that a handler can post to a different loop while there is still slots on the queue
  983. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  984. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  985. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  986. TEST_ASSERT_EQUAL(1, arg.count);
  987. TEST_ASSERT_EQUAL(1, secondary_handler_count);
  988. }
  989. static void test_handler_post_timeout(void* handler_arg, esp_event_base_t base, int32_t id, void* event_arg)
  990. {
  991. posting_handler_data_t* data = (posting_handler_data_t*) handler_arg;
  992. TEST_ESP_OK(esp_event_post_to(data->loop, s_test_base1, TEST_EVENT_BASE1_EV2, NULL, 0, portMAX_DELAY));
  993. TEST_ASSERT_EQUAL(ESP_ERR_TIMEOUT, esp_event_post_to(data->loop,
  994. s_test_base1,
  995. TEST_EVENT_BASE1_EV2,
  996. NULL,
  997. 0,
  998. 1));
  999. data->count++;
  1000. }
  1001. TEST_CASE("posting to loop from handler times out", "[event][linux]")
  1002. {
  1003. EV_LoopFix loop_fix(1);
  1004. posting_handler_data_t arg = {
  1005. .loop = loop_fix.loop,
  1006. .count = 0,
  1007. };
  1008. int secondary_handler_count = 0;
  1009. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  1010. s_test_base1,
  1011. TEST_EVENT_BASE1_EV1,
  1012. test_handler_post_timeout,
  1013. &arg));
  1014. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  1015. s_test_base1,
  1016. TEST_EVENT_BASE1_EV2,
  1017. test_handler_inc,
  1018. &secondary_handler_count));
  1019. // Test that a handler can post to a different loop while there is still slots on the queue
  1020. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  1021. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  1022. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  1023. TEST_ASSERT_EQUAL(1, arg.count);
  1024. TEST_ASSERT_EQUAL(1, secondary_handler_count);
  1025. }
  1026. static void test_handler_take_sem(void* handler_arg, esp_event_base_t base, int32_t id, void* event_arg)
  1027. {
  1028. SemaphoreHandle_t sem = (SemaphoreHandle_t) handler_arg;
  1029. TEST_ASSERT_EQUAL(pdTRUE, xSemaphoreTake(sem, portMAX_DELAY));
  1030. }
  1031. static void test_handler_give_sem(void* handler_arg, esp_event_base_t base, int32_t id, void* event_arg)
  1032. {
  1033. SemaphoreHandle_t sem = (SemaphoreHandle_t) handler_arg;
  1034. TEST_ASSERT_EQUAL(pdTRUE, xSemaphoreGive(sem));
  1035. }
  1036. const TickType_t ONE_TICK = 1;
  1037. static void wait_taken(SemaphoreHandle_t sem, TickType_t delay_ticks_if_not_taken) {
  1038. while (xSemaphoreTake(sem, ONE_TICK) == pdTRUE) {
  1039. xSemaphoreGive(sem);
  1040. vTaskDelay(delay_ticks_if_not_taken);
  1041. }
  1042. }
  1043. TEST_CASE("can post while handler is executing - dedicated task", "[event][linux]")
  1044. {
  1045. EV_LoopFix loop_fix(1, "loop_task");
  1046. SemaphoreHandle_t ev1_sem = xSemaphoreCreateBinary();
  1047. SemaphoreHandle_t ev2_sem = xSemaphoreCreateBinary();
  1048. TEST_ASSERT(ev1_sem);
  1049. TEST_ASSERT(ev2_sem);
  1050. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  1051. s_test_base1,
  1052. TEST_EVENT_BASE1_EV1,
  1053. test_handler_take_sem,
  1054. ev1_sem));
  1055. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  1056. s_test_base1,
  1057. TEST_EVENT_BASE1_EV2,
  1058. test_handler_give_sem,
  1059. ev2_sem));
  1060. // Trigger waiting by sending first event
  1061. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  1062. // Wait until semaphore is actually taken, which means handler is running and blocked
  1063. wait_taken(ev1_sem, 2);
  1064. // Check that event can be posted while handler is running (waiting on the semaphore)
  1065. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV2, NULL, 0, portMAX_DELAY));
  1066. // Now the event queue has to be full, expect timeout
  1067. TEST_ASSERT_EQUAL(ESP_ERR_TIMEOUT, esp_event_post_to(loop_fix.loop,
  1068. s_test_base1,
  1069. TEST_EVENT_BASE1_EV2,
  1070. NULL,
  1071. 0,
  1072. 1));
  1073. // Run all events
  1074. xSemaphoreGive(ev1_sem);
  1075. // verify that test_handler_give_sem() has run, too
  1076. TEST_ASSERT_EQUAL(pdTRUE, xSemaphoreTake(ev2_sem, portMAX_DELAY));
  1077. vSemaphoreDelete(ev1_sem);
  1078. vSemaphoreDelete(ev2_sem);
  1079. }
  1080. static void test_post_from_handler_loop_task(void* args)
  1081. {
  1082. esp_event_loop_handle_t event_loop = (esp_event_loop_handle_t) args;
  1083. TEST_ESP_OK(esp_event_loop_run(event_loop, portMAX_DELAY));
  1084. }
  1085. static void never_run(void* handler_arg, esp_event_base_t base, int32_t id, void* event_arg)
  1086. {
  1087. TEST_ASSERT(false);
  1088. }
  1089. TEST_CASE("can not post while handler is executing - no dedicated task", "[event][linux]")
  1090. {
  1091. EV_LoopFix loop_fix(1);
  1092. SemaphoreHandle_t sem = xSemaphoreCreateBinary();
  1093. SemaphoreHandle_t wait_done_sem = xSemaphoreCreateBinary();
  1094. TEST_ASSERT(sem);
  1095. TaskHandle_t mtask;
  1096. xTaskCreate(test_post_from_handler_loop_task,
  1097. "task",
  1098. 2584,
  1099. (void*) loop_fix.loop,
  1100. uxTaskPriorityGet(NULL) + 1,
  1101. &mtask);
  1102. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  1103. s_test_base1,
  1104. TEST_EVENT_BASE1_EV1,
  1105. test_handler_take_sem,
  1106. sem));
  1107. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  1108. s_test_base1,
  1109. TEST_EVENT_BASE1_EV2,
  1110. never_run,
  1111. NULL));
  1112. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  1113. s_test_base2,
  1114. TEST_EVENT_BASE1_EV1,
  1115. test_handler_give_sem,
  1116. wait_done_sem));
  1117. // Trigger waiting by sending first event
  1118. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  1119. // Wait until semaphore is actually taken, which means handler is running and blocked
  1120. wait_taken(sem, 2);
  1121. // For loop without tasks, posting is more restrictive. Posting should wait until execution of handler finishes
  1122. TEST_ASSERT_EQUAL(ESP_ERR_TIMEOUT, esp_event_post_to(loop_fix.loop,
  1123. s_test_base1,
  1124. TEST_EVENT_BASE1_EV2,
  1125. NULL,
  1126. 0,
  1127. 1));
  1128. // Being running all events
  1129. xSemaphoreGive(sem);
  1130. // wait until all events have run
  1131. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base2, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  1132. xSemaphoreTake(wait_done_sem, portMAX_DELAY);
  1133. // Clean up
  1134. vTaskDelete(mtask);
  1135. vSemaphoreDelete(wait_done_sem);
  1136. vSemaphoreDelete(sem);
  1137. }
  1138. struct EventData {
  1139. EventData(size_t expected_event_data_size) : expected_size(expected_event_data_size) { }
  1140. constexpr static size_t MAX_SIZE = 16;
  1141. void *event_arg; // only test for nullptr!
  1142. size_t expected_size;
  1143. uint8_t event_data[MAX_SIZE];
  1144. };
  1145. static void save_ev_data(void* handler_arg, esp_event_base_t base, int32_t id, void* event_arg)
  1146. {
  1147. EventData *ev_data = (EventData *) handler_arg;
  1148. ev_data->event_arg = event_arg;
  1149. if (ev_data->expected_size > 0) {
  1150. memcpy(ev_data->event_data, event_arg, ev_data->expected_size);
  1151. }
  1152. }
  1153. TEST_CASE("event data null", "[event][linux]")
  1154. {
  1155. EV_LoopFix loop_fix;
  1156. EventData saved_ev_data(0);
  1157. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  1158. s_test_base1,
  1159. TEST_EVENT_BASE1_EV1,
  1160. save_ev_data,
  1161. &saved_ev_data));
  1162. TEST_ESP_OK(esp_event_post_to(loop_fix.loop, s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  1163. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  1164. TEST_ASSERT_EQUAL(NULL, saved_ev_data.event_arg);
  1165. }
  1166. TEST_CASE("event data one nonzero byte", "[event][linux]")
  1167. {
  1168. EV_LoopFix loop_fix;
  1169. uint8_t ev_data = 47;
  1170. EventData saved_ev_data(1);
  1171. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  1172. s_test_base1,
  1173. TEST_EVENT_BASE1_EV1,
  1174. save_ev_data,
  1175. &saved_ev_data));
  1176. TEST_ESP_OK(esp_event_post_to(loop_fix.loop,
  1177. s_test_base1,
  1178. TEST_EVENT_BASE1_EV1,
  1179. &ev_data,
  1180. sizeof(ev_data),
  1181. portMAX_DELAY));
  1182. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  1183. TEST_ASSERT_NOT_EQUAL(NULL, saved_ev_data.event_arg);
  1184. TEST_ASSERT_EQUAL(47, saved_ev_data.event_data[0]);
  1185. }
  1186. TEST_CASE("event data one zero byte", "[event][linux]")
  1187. {
  1188. EV_LoopFix loop_fix;
  1189. uint8_t ev_data = 0;
  1190. EventData saved_ev_data(1);
  1191. saved_ev_data.event_data[0] = 47;
  1192. esp_event_handler_instance_t ctx;
  1193. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  1194. s_test_base2,
  1195. TEST_EVENT_BASE1_EV1,
  1196. save_ev_data,
  1197. &saved_ev_data,
  1198. &ctx));
  1199. TEST_ESP_OK(esp_event_post_to(loop_fix.loop,
  1200. s_test_base2,
  1201. TEST_EVENT_BASE1_EV1,
  1202. &ev_data,
  1203. sizeof(ev_data),
  1204. portMAX_DELAY));
  1205. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  1206. TEST_ASSERT_NOT_EQUAL(NULL, saved_ev_data.event_arg);
  1207. TEST_ASSERT_EQUAL(0, saved_ev_data.event_data[0]);
  1208. }
  1209. TEST_CASE("event data many bytes", "[event][linux]")
  1210. {
  1211. EV_LoopFix loop_fix;
  1212. uint8_t ev_data[EventData::MAX_SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  1213. EventData saved_ev_data(16);
  1214. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  1215. s_test_base1,
  1216. TEST_EVENT_BASE1_EV1,
  1217. save_ev_data,
  1218. &saved_ev_data));
  1219. TEST_ESP_OK(esp_event_post_to(loop_fix.loop,
  1220. s_test_base1,
  1221. TEST_EVENT_BASE1_EV1,
  1222. &ev_data,
  1223. sizeof(ev_data),
  1224. portMAX_DELAY));
  1225. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  1226. TEST_ASSERT_NOT_EQUAL(NULL, saved_ev_data.event_arg);
  1227. TEST_ASSERT_EQUAL_HEX8_ARRAY(ev_data, saved_ev_data.event_data, EventData::MAX_SIZE);
  1228. }
  1229. TEST_CASE("event data one byte is copied on post", "[event][linux]")
  1230. {
  1231. EV_LoopFix loop_fix;
  1232. uint8_t ev_data = 47;
  1233. EventData saved_ev_data(1);
  1234. esp_event_handler_instance_t ctx;
  1235. TEST_ESP_OK(esp_event_handler_instance_register_with(loop_fix.loop,
  1236. s_test_base2,
  1237. TEST_EVENT_BASE1_EV1,
  1238. save_ev_data,
  1239. &saved_ev_data,
  1240. &ctx));
  1241. TEST_ESP_OK(esp_event_post_to(loop_fix.loop,
  1242. s_test_base2,
  1243. TEST_EVENT_BASE1_EV1,
  1244. &ev_data,
  1245. sizeof(ev_data),
  1246. portMAX_DELAY));
  1247. ev_data = 42;
  1248. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  1249. TEST_ASSERT_NOT_EQUAL(NULL, saved_ev_data.event_arg);
  1250. TEST_ASSERT_EQUAL(47, saved_ev_data.event_data[0]);
  1251. }
  1252. TEST_CASE("event data many bytes are copied on post", "[event][linux]")
  1253. {
  1254. EV_LoopFix loop_fix;
  1255. uint8_t ev_data[EventData::MAX_SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  1256. uint8_t ev_data_expected[EventData::MAX_SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  1257. EventData saved_ev_data(16);
  1258. TEST_ESP_OK(esp_event_handler_register_with(loop_fix.loop,
  1259. s_test_base1,
  1260. TEST_EVENT_BASE1_EV1,
  1261. save_ev_data,
  1262. &saved_ev_data));
  1263. TEST_ESP_OK(esp_event_post_to(loop_fix.loop,
  1264. s_test_base1,
  1265. TEST_EVENT_BASE1_EV1,
  1266. &ev_data,
  1267. sizeof(ev_data),
  1268. portMAX_DELAY));
  1269. memset(ev_data, 0, sizeof(ev_data));
  1270. TEST_ESP_OK(esp_event_loop_run(loop_fix.loop, ZERO_DELAY));
  1271. TEST_ASSERT_NOT_EQUAL(NULL, saved_ev_data.event_arg);
  1272. TEST_ASSERT_EQUAL_HEX8_ARRAY(ev_data_expected, saved_ev_data.event_data, EventData::MAX_SIZE);
  1273. }
  1274. TEST_CASE("default loop: registering fails on uninitialized default loop", "[event][default][linux]")
  1275. {
  1276. esp_event_handler_instance_t instance;
  1277. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_STATE, esp_event_handler_instance_register(s_test_base1,
  1278. TEST_EVENT_BASE1_EV1,
  1279. never_run,
  1280. NULL,
  1281. &instance));
  1282. }
  1283. TEST_CASE("default loop: can create and delete loop", "[event][default][linux]")
  1284. {
  1285. TEST_ESP_OK(esp_event_loop_create_default());
  1286. TEST_ESP_OK(esp_event_loop_delete_default());
  1287. }
  1288. TEST_CASE("default loop: registering/unregistering event works", "[event][default][linux]")
  1289. {
  1290. TEST_ESP_OK(esp_event_loop_create_default());
  1291. if (TEST_PROTECT()) {
  1292. SemaphoreHandle_t waiter = xSemaphoreCreateBinary();
  1293. esp_event_handler_instance_t instance = NULL;
  1294. TEST_ESP_OK(esp_event_handler_instance_register(s_test_base1,
  1295. TEST_EVENT_BASE1_EV1,
  1296. test_handler_give_sem,
  1297. waiter,
  1298. &instance));
  1299. TEST_ASSERT(instance);
  1300. TEST_ESP_OK(esp_event_post(s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  1301. TEST_ASSERT_EQUAL(pdTRUE, xSemaphoreTake(waiter, pdMS_TO_TICKS(50)));
  1302. TEST_ESP_OK(esp_event_handler_instance_unregister(s_test_base1,
  1303. TEST_EVENT_BASE1_EV1,
  1304. instance));
  1305. TEST_ESP_OK(esp_event_post(s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  1306. TEST_ASSERT_EQUAL(pdFALSE, xSemaphoreTake(waiter, pdMS_TO_TICKS(50)));
  1307. vSemaphoreDelete(waiter);
  1308. }
  1309. TEST_ESP_OK(esp_event_loop_delete_default());
  1310. }
  1311. TEST_CASE("default event loop: registering event handler instance without instance context works", "[event][default][linux]") {
  1312. TEST_ESP_OK(esp_event_loop_create_default());
  1313. if (TEST_PROTECT()) {
  1314. SemaphoreHandle_t waiter = xSemaphoreCreateBinary();
  1315. TEST_ESP_OK(esp_event_handler_instance_register(ESP_EVENT_ANY_BASE, ESP_EVENT_ANY_ID, test_handler_give_sem, waiter, NULL));
  1316. TEST_ESP_OK(esp_event_post(s_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  1317. TEST_ASSERT_EQUAL(pdTRUE, xSemaphoreTake(waiter, pdMS_TO_TICKS(50)));
  1318. vSemaphoreDelete(waiter);
  1319. }
  1320. TEST_ESP_OK(esp_event_loop_delete_default());
  1321. }