test_mqtt_client.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #define CATCH_CONFIG_MAIN // This tells the catch header to generate a main
  2. #include "catch.hpp"
  3. extern "C" {
  4. #include "Mockesp_event.h"
  5. #include "Mockesp_log.h"
  6. #include "Mockesp_mac.h"
  7. #include "Mockesp_transport.h"
  8. #include "Mockesp_transport_ssl.h"
  9. #include "Mockesp_transport_tcp.h"
  10. #include "Mockesp_transport_ws.h"
  11. #include "Mockevent_groups.h"
  12. #include "Mockhttp_parser.h"
  13. #include "Mockqueue.h"
  14. #include "Mocktask.h"
  15. #include "Mockesp_timer.h"
  16. /*
  17. * The following functions are not directly called but the generation of them
  18. * from cmock is broken, so we need to define them here.
  19. */
  20. esp_err_t esp_tls_get_and_clear_last_error(esp_tls_error_handle_t h, int *esp_tls_code, int *esp_tls_flags)
  21. {
  22. return ESP_OK;
  23. }
  24. }
  25. #include "mqtt_client.h"
  26. struct ClientInitializedFixture {
  27. esp_mqtt_client_handle_t client;
  28. ClientInitializedFixture()
  29. {
  30. [[maybe_unused]] auto protect = TEST_PROTECT();
  31. int mtx;
  32. int transport_list;
  33. int transport;
  34. int event_group;
  35. uint8_t mac[] = {0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55};
  36. esp_log_write_Ignore();
  37. esp_timer_get_time_IgnoreAndReturn(0);
  38. xQueueTakeMutexRecursive_IgnoreAndReturn(true);
  39. xQueueGiveMutexRecursive_IgnoreAndReturn(true);
  40. xQueueCreateMutex_ExpectAnyArgsAndReturn(
  41. reinterpret_cast<QueueHandle_t>(&mtx));
  42. xEventGroupCreate_IgnoreAndReturn(reinterpret_cast<EventGroupHandle_t>(&event_group));
  43. esp_log_timestamp_IgnoreAndReturn(0);
  44. esp_transport_list_init_IgnoreAndReturn(reinterpret_cast<esp_transport_list_handle_t>(&transport_list));
  45. esp_transport_tcp_init_IgnoreAndReturn(reinterpret_cast<esp_transport_handle_t>(&transport));
  46. esp_transport_ssl_init_IgnoreAndReturn(reinterpret_cast<esp_transport_handle_t>(&transport));
  47. esp_transport_ws_init_IgnoreAndReturn(reinterpret_cast<esp_transport_handle_t>(&transport));
  48. esp_transport_ws_set_subprotocol_IgnoreAndReturn(ESP_OK);
  49. esp_transport_list_add_IgnoreAndReturn(ESP_OK);
  50. esp_transport_set_default_port_IgnoreAndReturn(ESP_OK);
  51. http_parser_parse_url_IgnoreAndReturn(0);
  52. http_parser_url_init_ExpectAnyArgs();
  53. esp_event_loop_create_IgnoreAndReturn(ESP_OK);
  54. esp_read_mac_IgnoreAndReturn(ESP_OK);
  55. esp_read_mac_ReturnThruPtr_mac(mac);
  56. esp_transport_list_destroy_IgnoreAndReturn(ESP_OK);
  57. vEventGroupDelete_Ignore();
  58. vQueueDelete_Ignore();
  59. esp_mqtt_client_config_t config{};
  60. client = esp_mqtt_client_init(&config);
  61. }
  62. ~ClientInitializedFixture()
  63. {
  64. esp_mqtt_client_destroy(client);
  65. }
  66. };
  67. TEST_CASE_METHOD(ClientInitializedFixture, "Client set uri")
  68. {
  69. struct http_parser_url ret_uri = {
  70. .field_set = 1,
  71. .port = 0,
  72. .field_data = { { 0, 1} }
  73. };
  74. SECTION("User set a correct URI") {
  75. http_parser_parse_url_StopIgnore();
  76. http_parser_parse_url_ExpectAnyArgsAndReturn(0);
  77. http_parser_parse_url_ReturnThruPtr_u(&ret_uri);
  78. auto res = esp_mqtt_client_set_uri(client, " ");
  79. REQUIRE(res == ESP_OK);
  80. }
  81. SECTION("Incorrect URI from user") {
  82. http_parser_parse_url_StopIgnore();
  83. http_parser_parse_url_ExpectAnyArgsAndReturn(1);
  84. http_parser_parse_url_ReturnThruPtr_u(&ret_uri);
  85. auto res = esp_mqtt_client_set_uri(client, " ");
  86. REQUIRE(res == ESP_FAIL);
  87. }
  88. }
  89. TEST_CASE_METHOD(ClientInitializedFixture, "Client Start")
  90. {
  91. SECTION("Successful start") {
  92. esp_mqtt_client_config_t config{};
  93. config.broker.address.uri = "mqtt://1.1.1.1";
  94. struct http_parser_url ret_uri = {
  95. .field_set = 1 | (1<<1),
  96. .port = 0,
  97. .field_data = { { 0, 4 } /*mqtt*/, { 7, 1 } } // at least *scheme* and *host*
  98. };
  99. http_parser_parse_url_StopIgnore();
  100. http_parser_parse_url_ExpectAnyArgsAndReturn(0);
  101. http_parser_parse_url_ReturnThruPtr_u(&ret_uri);
  102. xTaskCreatePinnedToCore_ExpectAnyArgsAndReturn(pdTRUE);
  103. auto res = esp_mqtt_set_config(client, &config);
  104. REQUIRE(res == ESP_OK);
  105. res = esp_mqtt_client_start(client);
  106. REQUIRE(res == ESP_OK);
  107. }
  108. SECTION("Failed on initialization") {
  109. xTaskCreatePinnedToCore_ExpectAnyArgsAndReturn(pdFALSE);
  110. auto res = esp_mqtt_client_start(nullptr);
  111. REQUIRE(res == ESP_ERR_INVALID_ARG);
  112. }
  113. SECTION("Client already started") {}
  114. SECTION("Failed to start task") {
  115. xTaskCreatePinnedToCore_ExpectAnyArgsAndReturn(pdFALSE);
  116. auto res = esp_mqtt_client_start(client);
  117. REQUIRE(res == ESP_FAIL);
  118. }
  119. }