test_default_loop.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. /*
  2. * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Unlicense OR CC0-1.0
  5. */
  6. #include <stdbool.h>
  7. #include <string.h>
  8. #include "esp_event.h"
  9. #include "sdkconfig.h"
  10. #include "freertos/FreeRTOS.h"
  11. #include "freertos/task.h"
  12. #include "esp_log.h"
  13. #include "esp_event.h"
  14. #include "esp_event_private.h"
  15. #include "esp_event_internal.h"
  16. #include "esp_heap_caps.h"
  17. #include "sdkconfig.h"
  18. #include "unity.h"
  19. typedef struct {
  20. void* data;
  21. SemaphoreHandle_t mutex;
  22. } simple_arg_t;
  23. static const char* TAG = "test_event";
  24. ESP_EVENT_DECLARE_BASE(s_default_test_base1);
  25. ESP_EVENT_DECLARE_BASE(s_default_test_base2);
  26. ESP_EVENT_DEFINE_BASE(s_default_test_base1);
  27. ESP_EVENT_DEFINE_BASE(s_default_test_base2);
  28. enum {
  29. TEST_EVENT_BASE1_EV1,
  30. TEST_EVENT_BASE1_EV2,
  31. TEST_EVENT_BASE1_MAX
  32. };
  33. enum {
  34. TEST_EVENT_BASE2_EV1,
  35. TEST_EVENT_BASE2_EV2,
  36. TEST_EVENT_BASE2_MAX
  37. };
  38. // The initial logging "initializing test" is to ensure mutex allocation is not counted against memory not being freed
  39. // during teardown.
  40. #define TEST_SETUP() \
  41. ESP_LOGI(TAG, "initializing test");
  42. static void test_event_simple_handler(void* event_handler_arg, esp_event_base_t event_base, int32_t event_id, void* event_data)
  43. {
  44. if (!event_handler_arg) {
  45. return;
  46. }
  47. simple_arg_t* arg = (simple_arg_t*) event_handler_arg;
  48. xSemaphoreTake(arg->mutex, portMAX_DELAY);
  49. int* count = (int*) arg->data;
  50. if (event_data == NULL) {
  51. (*count)++;
  52. } else {
  53. (*count) += *((int*) event_data);
  54. }
  55. xSemaphoreGive(arg->mutex);
  56. }
  57. TEST_CASE("default loop: can create and delete loop", "[event]")
  58. {
  59. TEST_SETUP();
  60. TEST_ESP_OK(esp_event_loop_create_default());
  61. TEST_ESP_OK(esp_event_loop_delete_default());
  62. }
  63. TEST_CASE("default loop: registering fails on uninitialized default loop", "[event]")
  64. {
  65. TEST_SETUP();
  66. esp_event_handler_instance_t instance;
  67. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_STATE, esp_event_handler_instance_register(s_default_test_base1,
  68. TEST_EVENT_BASE1_EV1,
  69. test_event_simple_handler,
  70. NULL,
  71. &instance));
  72. }
  73. TEST_CASE("default loop: registering/unregistering event works", "[event]")
  74. {
  75. TEST_SETUP();
  76. int count = 0;
  77. simple_arg_t arg = {
  78. .data = &count,
  79. .mutex = xSemaphoreCreateMutex()
  80. };
  81. TEST_ESP_OK(esp_event_loop_create_default());
  82. esp_event_handler_instance_t instance;
  83. TEST_ESP_OK(esp_event_handler_instance_register(s_default_test_base1,
  84. TEST_EVENT_BASE1_EV1,
  85. test_event_simple_handler,
  86. &arg,
  87. &instance));
  88. TEST_ASSERT(instance);
  89. TEST_ESP_OK(esp_event_post(s_default_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  90. vTaskDelay(10);
  91. TEST_ASSERT_EQUAL(1, count);
  92. TEST_ESP_OK(esp_event_handler_instance_unregister(s_default_test_base1,
  93. TEST_EVENT_BASE1_EV1,
  94. &instance));
  95. vTaskDelay(10);
  96. TEST_ASSERT_EQUAL(1, count);
  97. TEST_ESP_OK(esp_event_loop_delete_default());
  98. vSemaphoreDelete(arg.mutex);
  99. }
  100. TEST_CASE("default event loop: registering event handler instance without instance context works", "[event]") {
  101. TEST_SETUP();
  102. int count_1 = 0;
  103. simple_arg_t arg_1 = {
  104. .data = &count_1,
  105. .mutex = xSemaphoreCreateMutex()
  106. };
  107. TEST_ESP_OK(esp_event_loop_create_default());
  108. TEST_ESP_OK(esp_event_handler_instance_register(ESP_EVENT_ANY_BASE, ESP_EVENT_ANY_ID, test_event_simple_handler, &arg_1, NULL));
  109. TEST_ESP_OK(esp_event_post(s_default_test_base1, TEST_EVENT_BASE1_EV1, NULL, 0, portMAX_DELAY));
  110. vTaskDelay(10);
  111. TEST_ASSERT_EQUAL(1, count_1);
  112. TEST_ESP_OK(esp_event_loop_delete_default());
  113. vSemaphoreDelete(arg_1.mutex);
  114. }