From 31b7a9c3127560ea0c488b88e93077e08600652f Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 14 Feb 2020 12:21:16 +0100 Subject: Add expect option to logger command --- kernel/log.cc | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) (limited to 'kernel/log.cc') diff --git a/kernel/log.cc b/kernel/log.cc index f5d6c488e..997c39c64 100644 --- a/kernel/log.cc +++ b/kernel/log.cc @@ -42,6 +42,7 @@ std::vector log_files; std::vector log_streams; std::map> log_hdump; std::vector log_warn_regexes, log_nowarn_regexes, log_werror_regexes; +std::vector> log_expect_log, log_expect_warning, log_expect_error; std::set log_warnings, log_experimentals, log_experimentals_ignored; int log_warnings_count = 0; bool log_hdump_all = false; @@ -68,6 +69,7 @@ int string_buf_index = -1; static struct timeval initial_tv = { 0, 0 }; static bool next_print_log = false; static int log_newline_count = 0; +static bool check_expected_logs = true; static void log_id_cache_clear() { @@ -162,7 +164,7 @@ void logv(const char *format, va_list ap) { log_warn_regex_recusion_guard = true; - if (log_warn_regexes.empty()) + if (log_warn_regexes.empty() && log_expect_log.empty()) { linebuffer.clear(); } @@ -174,6 +176,11 @@ void logv(const char *format, va_list ap) for (auto &re : log_warn_regexes) if (std::regex_search(linebuffer, re)) log_warning("Found log message matching -W regex:\n%s", str.c_str()); + + for (auto &item : log_expect_log) + if (std::regex_search(linebuffer, item.first)) + item.second.current_count++; + linebuffer.clear(); } } @@ -244,6 +251,10 @@ static void logv_warning_with_prefix(const char *prefix, if (std::regex_search(message, re)) log_error("%s", message.c_str()); + for (auto &item : log_expect_warning) + if (std::regex_search(message, item.first)) + item.second.current_count++; + if (log_warnings.count(message)) { log("%s%s", prefix, message.c_str()); @@ -328,6 +339,12 @@ static void logv_error_with_prefix(const char *prefix, if (log_error_atexit) log_error_atexit(); + for (auto &item : log_expect_error) + if (std::regex_search(log_last_error, item.first)) + item.second.current_count++; + + if (check_expected_logs) + log_check_expected(); #ifdef EMSCRIPTEN log_files = backup_log_files; throw 0; @@ -636,6 +653,46 @@ void log_wire(RTLIL::Wire *wire, std::string indent) log("%s", buf.str().c_str()); } +void log_check_expected() +{ + check_expected_logs = false; + + for (auto &item : log_expect_warning) { + if (item.second.current_count != item.second.expected_count) { + log_error("Expected warning pattern '%s' not found !\n", item.second.pattern.c_str()); + } + if (item.second.current_count != item.second.expected_count) { + log_error("Expected warning pattern '%s' found %d time(s), instead of %d time(s) !\n", + item.second.pattern.c_str(), item.second.current_count, item.second.expected_count); + } + } + + for (auto &item : log_expect_log) { + if (item.second.current_count == 0) { + log_error("Expected log pattern '%s' not found !\n", item.second.pattern.c_str()); + } + if (item.second.current_count != item.second.expected_count) { + log_error("Expected log pattern '%s' found %d time(s), instead of %d time(s) !\n", + item.second.pattern.c_str(), item.second.current_count, item.second.expected_count); + } + } + + for (auto &item : log_expect_error) + if (item.second.current_count == item.second.expected_count) { + log("Expected error pattern '%s' found !!!\n", item.second.pattern.c_str()); + #ifdef EMSCRIPTEN + log_files = backup_log_files; + throw 0; + #elif defined(_MSC_VER) + _exit(0); + #else + _Exit(0); + #endif + } else { + log_error("Expected error pattern '%s' not found !\n", item.second.pattern.c_str()); + } +} + // --------------------------------------------------- // This is the magic behind the code coverage counters // --------------------------------------------------- -- cgit v1.2.3 From be977cf7eb76e10866555543aef4809264b393de Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Mon, 17 Feb 2020 12:54:36 +0100 Subject: No new error if already failing --- kernel/log.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'kernel/log.cc') diff --git a/kernel/log.cc b/kernel/log.cc index 997c39c64..89a403e63 100644 --- a/kernel/log.cc +++ b/kernel/log.cc @@ -331,7 +331,8 @@ static void logv_error_with_prefix(const char *prefix, f = stderr; log_last_error = vstringf(format, ap); - log("%s%s", prefix, log_last_error.c_str()); + if (check_expected_logs) + log("%s%s", prefix, log_last_error.c_str()); log_flush(); log_make_debug = bak_log_make_debug; -- cgit v1.2.3 From 5641b0248fe0781ee62fa3bc903f8db95e80b0c4 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Mon, 17 Feb 2020 15:36:06 +0100 Subject: Option to expect no warnings --- kernel/log.cc | 1 + 1 file changed, 1 insertion(+) (limited to 'kernel/log.cc') diff --git a/kernel/log.cc b/kernel/log.cc index 89a403e63..1575b4fed 100644 --- a/kernel/log.cc +++ b/kernel/log.cc @@ -45,6 +45,7 @@ std::vector log_warn_regexes, log_nowarn_regexes, log_werror_regexes std::vector> log_expect_log, log_expect_warning, log_expect_error; std::set log_warnings, log_experimentals, log_experimentals_ignored; int log_warnings_count = 0; +bool log_expect_no_warnings = false; bool log_hdump_all = false; FILE *log_errfile = NULL; SHA1 *log_hasher = NULL; -- cgit v1.2.3 From 70db8e92003fab959ec5d14b51ac2a9209d16b30 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Mon, 17 Feb 2020 16:46:34 +0100 Subject: Prevent double error message --- kernel/log.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'kernel/log.cc') diff --git a/kernel/log.cc b/kernel/log.cc index 1575b4fed..9e103855f 100644 --- a/kernel/log.cc +++ b/kernel/log.cc @@ -71,6 +71,7 @@ static struct timeval initial_tv = { 0, 0 }; static bool next_print_log = false; static int log_newline_count = 0; static bool check_expected_logs = true; +static bool display_error_log_msg = true; static void log_id_cache_clear() { @@ -332,7 +333,7 @@ static void logv_error_with_prefix(const char *prefix, f = stderr; log_last_error = vstringf(format, ap); - if (check_expected_logs) + if (display_error_log_msg) log("%s%s", prefix, log_last_error.c_str()); log_flush(); @@ -691,6 +692,7 @@ void log_check_expected() _Exit(0); #endif } else { + display_error_log_msg = false; log_error("Expected error pattern '%s' not found !\n", item.second.pattern.c_str()); } } -- cgit v1.2.3 From d079ab9d19b7d18134f5b6f30da9a6666f30ad97 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 22 Feb 2020 10:52:46 +0100 Subject: Handle expect no warnings together with expected --- kernel/log.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'kernel/log.cc') diff --git a/kernel/log.cc b/kernel/log.cc index 9e103855f..1785809e4 100644 --- a/kernel/log.cc +++ b/kernel/log.cc @@ -45,6 +45,7 @@ std::vector log_warn_regexes, log_nowarn_regexes, log_werror_regexes std::vector> log_expect_log, log_expect_warning, log_expect_error; std::set log_warnings, log_experimentals, log_experimentals_ignored; int log_warnings_count = 0; +int log_warnings_count_noexpect = 0; bool log_expect_no_warnings = false; bool log_hdump_all = false; FILE *log_errfile = NULL; @@ -253,9 +254,12 @@ static void logv_warning_with_prefix(const char *prefix, if (std::regex_search(message, re)) log_error("%s", message.c_str()); + bool warning_match = false; for (auto &item : log_expect_warning) - if (std::regex_search(message, item.first)) + if (std::regex_search(message, item.first)) { item.second.current_count++; + warning_match = true; + } if (log_warnings.count(message)) { @@ -276,6 +280,8 @@ static void logv_warning_with_prefix(const char *prefix, log_warnings.insert(message); } + if (!warning_match) + log_warnings_count_noexpect++; log_warnings_count++; log_make_debug = bak_log_make_debug; } @@ -661,7 +667,7 @@ void log_check_expected() check_expected_logs = false; for (auto &item : log_expect_warning) { - if (item.second.current_count != item.second.expected_count) { + if (item.second.current_count == 0) { log_error("Expected warning pattern '%s' not found !\n", item.second.pattern.c_str()); } if (item.second.current_count != item.second.expected_count) { -- cgit v1.2.3 From 1c569fe06aba3850e557eb44895a522cc4167de2 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sun, 23 Feb 2020 10:56:27 +0100 Subject: Remove duplicate warning detection --- kernel/log.cc | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'kernel/log.cc') diff --git a/kernel/log.cc b/kernel/log.cc index 1785809e4..72181ebe8 100644 --- a/kernel/log.cc +++ b/kernel/log.cc @@ -668,9 +668,11 @@ void log_check_expected() for (auto &item : log_expect_warning) { if (item.second.current_count == 0) { + log_warn_regexes.clear(); log_error("Expected warning pattern '%s' not found !\n", item.second.pattern.c_str()); } if (item.second.current_count != item.second.expected_count) { + log_warn_regexes.clear(); log_error("Expected warning pattern '%s' found %d time(s), instead of %d time(s) !\n", item.second.pattern.c_str(), item.second.current_count, item.second.expected_count); } @@ -678,9 +680,11 @@ void log_check_expected() for (auto &item : log_expect_log) { if (item.second.current_count == 0) { + log_warn_regexes.clear(); log_error("Expected log pattern '%s' not found !\n", item.second.pattern.c_str()); } if (item.second.current_count != item.second.expected_count) { + log_warn_regexes.clear(); log_error("Expected log pattern '%s' found %d time(s), instead of %d time(s) !\n", item.second.pattern.c_str(), item.second.current_count, item.second.expected_count); } @@ -688,6 +692,7 @@ void log_check_expected() for (auto &item : log_expect_error) if (item.second.current_count == item.second.expected_count) { + log_warn_regexes.clear(); log("Expected error pattern '%s' found !!!\n", item.second.pattern.c_str()); #ifdef EMSCRIPTEN log_files = backup_log_files; @@ -699,6 +704,7 @@ void log_check_expected() #endif } else { display_error_log_msg = false; + log_warn_regexes.clear(); log_error("Expected error pattern '%s' not found !\n", item.second.pattern.c_str()); } } -- cgit v1.2.3