zephyr/tests/ztest/fail/src/main.cpp
Yuval Peress 7187d8b7fc ztest: add framework tests for failed states
Add specialized tests that execute another test indirectly and ensure
that the results report errors correctly. See the README.rst file
provided with this commit for details.

Signed-off-by: Yuval Peress <peress@google.com>
2022-08-29 10:27:00 +02:00

57 lines
1.6 KiB
C++

/* Copyright (c) 2022 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
#include <array>
#include <iostream>
#include <regex>
#include <string>
#include <zephyr/ztest.h>
ZTEST_SUITE(fail, nullptr, nullptr, nullptr, nullptr, nullptr);
ZTEST(fail, test_framework)
{
auto found_error_string = false;
char buffer[sizeof(CONFIG_TEST_ERROR_STRING)] = {0};
std::string result;
/* Start running the target binary. This binary is expected to fail. */
auto pipe = popen(FAIL_TARGET_BINARY, "r");
zassert_not_null(pipe, "Failed to execute '" FAIL_TARGET_BINARY "'");
/* Wait for the binary to finish running and grab the output */
while (!feof(pipe)) {
if (fgets(buffer, ARRAY_SIZE(buffer), pipe) != nullptr) {
if (found_error_string) {
/* Already found the error string, no need to do any more string
* manipulation.
*/
continue;
}
/* Append the buffer to the result string */
result += buffer;
/* Check if result contains the right error string */
found_error_string |=
(result.find(CONFIG_TEST_ERROR_STRING) != std::string::npos);
/* If the result string is longer than the expected string,
* we can prune it
*/
auto prune_length = static_cast<int>(result.length()) -
static_cast<int>(sizeof(CONFIG_TEST_ERROR_STRING));
if (prune_length > 0) {
result.erase(0, prune_length);
}
}
}
auto rc = WEXITSTATUS(pclose(pipe));
zassert_equal(1, rc, "Test binary expected to fail with return code 1, but got %d", rc);
zassert_true(found_error_string, "Test binary did not produce the expected error string \""
CONFIG_TEST_ERROR_STRING "\"");
}