mirror of
https://github.com/espressif/esp-mqtt.git
synced 2026-09-16 14:10:08 +00:00
To allow our tests to use internal esp-mqtt state without exposing it directly we add this utility to capture it.
73 lines
2.3 KiB
Markdown
73 lines
2.3 KiB
Markdown
| Supported Targets | Linux |
|
|
| ----------------- | ----- |
|
|
|
|
# Description
|
|
|
|
This directory contains test code for the mqtt client that runs on host.
|
|
|
|
Tests are written using [Catch2](https://github.com/catchorg/Catch2) test framework
|
|
|
|
# Build
|
|
|
|
Tests build regularly like an idf project.
|
|
|
|
```
|
|
idf.py build
|
|
```
|
|
|
|
# Run
|
|
|
|
The build produces an executable in the build folder.
|
|
|
|
Just run:
|
|
|
|
```
|
|
./build/host_mqtt_client_test.elf
|
|
```
|
|
|
|
The test executable have some options provided by the test framework.
|
|
|
|
# Log capture
|
|
|
|
Some behaviors inside `esp-mqtt` only surface through log output (e.g. debug
|
|
breadcrumbs on internal decisions). The `test::esp_log::Capture` utility in
|
|
`main/test_log_intercept.{hpp,cpp}` lets tests assert on those without the
|
|
component having to expose internal state through its public API.
|
|
|
|
`Capture` is an RAII guard: construction installs a `vprintf` hook on the
|
|
esp-log system, destruction restores the previous one. While alive, it parses
|
|
each log line into `Entry { level, tag, message }` records and still forwards
|
|
the text to the original `vprintf` so test output stays visible. Only one
|
|
`Capture` may be alive at a time; constructing a second one throws
|
|
`std::logic_error`.
|
|
|
|
Asserting on captured output uses either `Capture`'s own predicates or the
|
|
Catch2 matchers in `main/test_log_matchers.{hpp,cpp}`:
|
|
|
|
```cpp
|
|
#include "test_log_intercept.hpp"
|
|
#include "test_log_matchers.hpp"
|
|
|
|
TEST_CASE("client logs its core-selection decision") {
|
|
esp_log_level_set("mqtt_client", ESP_LOG_DEBUG);
|
|
test::esp_log::Capture log;
|
|
|
|
// ... exercise the code under test ...
|
|
|
|
// Plain boolean check (no matcher machinery):
|
|
REQUIRE(log.contains("mqtt_client", "Core selection"));
|
|
|
|
// Catch2 matcher (nicer failure output on REQUIRE_THAT):
|
|
using namespace test::esp_log::matchers;
|
|
REQUIRE_THAT(log, HasMessageIn("mqtt_client", "Core selection"));
|
|
}
|
|
```
|
|
|
|
The log parser assumes the stock esp-log text format with colors disabled;
|
|
`test/host/sdkconfig.defaults` sets `CONFIG_LOG_COLORS=n` and
|
|
`CONFIG_LOG_DEFAULT_LEVEL_DEBUG=y` so DEBUG-level messages are visible (call
|
|
sites still need `esp_log_level_set(tag, ESP_LOG_DEBUG)` for their tag). A
|
|
guard test in `main/test_log_parser.cpp` round-trips real `ESP_LOGx` output
|
|
through `Capture`, so if the IDF log format ever changes the failure surfaces
|
|
there rather than in every downstream test.
|