Suppress certain stderr-printing during tests

Tests that exercise error paths may result in output to
stderr. This may make it look like the test failed when it did
not. Introduce should_suppress_stderr_for_tests() to suppress
this output so the test output looks clean.
This commit is contained in:
ridiculousfish 2016-12-03 13:27:50 -08:00
parent 254762f30f
commit 754b78a748
5 changed files with 16 additions and 5 deletions

View file

@ -820,7 +820,7 @@ int builtin_test(parser_t &parser, io_streams_t &streams, wchar_t **argv) {
wcstring_list_t eval_errors;
bool result = expr->evaluate(eval_errors);
if (!eval_errors.empty()) {
if (!eval_errors.empty() && ! should_suppress_stderr_for_tests()) {
printf("test returned eval errors:\n");
for (size_t i = 0; i < eval_errors.size(); i++) {
printf("\t%ls\n", eval_errors.at(i).c_str());

View file

@ -533,11 +533,15 @@ ssize_t read_loop(int fd, void *buff, size_t count) {
return result;
}
bool should_suppress_stderr_for_tests() {
// Hack to not print error messages in the tests.
return program_name && !wcscmp(program_name, TESTS_PROGRAM_NAME);
}
static bool should_debug(int level) {
if (level > debug_level) return false;
// Hack to not print error messages in the tests.
if (program_name && !wcscmp(program_name, L"(ignore)")) return false;
if (should_suppress_stderr_for_tests()) return false;
return true;
}

View file

@ -373,6 +373,10 @@ string_fuzzy_match_t string_fuzzy_match_string(const wcstring &string,
/// Test if a list contains a string using a linear search.
bool list_contains_string(const wcstring_list_t &list, const wcstring &str);
// Check if we are running in the test mode, where we should suppress error output
#define TESTS_PROGRAM_NAME L"(ignore)"
bool should_suppress_stderr_for_tests();
void assert_is_main_thread(const char *who);
#define ASSERT_IS_MAIN_THREAD_TRAMPOLINE(x) assert_is_main_thread(x)
#define ASSERT_IS_MAIN_THREAD() ASSERT_IS_MAIN_THREAD_TRAMPOLINE(__FUNCTION__)

View file

@ -4072,7 +4072,9 @@ int main(int argc, char **argv) {
srand((unsigned int)time(NULL));
configure_thread_assertions_for_testing();
program_name = L"(ignore)";
// Set the program name to this sentinel value
// This will prevent some misleading stderr output during the tests
program_name = TESTS_PROGRAM_NAME;
s_arguments = argv + 1;
struct utsname uname_info;

View file

@ -708,6 +708,7 @@ parse_execution_result_t parse_execution_context_t::report_errors(
parser->get_backtrace(src, error_list, &backtrace_and_desc);
// Print it.
if (! should_suppress_stderr_for_tests())
fprintf(stderr, "%ls", backtrace_and_desc.c_str());
}
return parse_execution_errored;