test: Add a way to skip console checking until a string matches
authorSimon Glass <sjg@chromium.org>
Thu, 19 Aug 2021 03:40:33 +0000 (21:40 -0600)
committerTom Rini <trini@konsulko.com>
Thu, 16 Sep 2021 18:39:40 +0000 (14:39 -0400)
Some tests produce a lot of output that does not need to be individually
checked by an assertion. Add a macro to handle this.

Signed-off-by: Simon Glass <sjg@chromium.org>
include/test/ut.h
test/ut.c

index 656e25f..fb2e5fc 100644 (file)
@@ -83,6 +83,21 @@ int ut_check_console_linen(struct unit_test_state *uts, const char *fmt, ...)
 int ut_check_skipline(struct unit_test_state *uts);
 
 /**
+ * ut_check_skip_to_line() - skip output until a line is found
+ *
+ * This creates a string and then checks it against the following lines of
+ * console output obtained with console_record_readline() until it is found.
+ *
+ * After the function returns, uts->expect_str holds the expected string and
+ * uts->actual_str holds the actual string read from the console.
+ *
+ * @uts: Test state
+ * @fmt: printf() format string to look for, followed by args
+ * @return 0 if OK, -ENOENT if not found, other value on error
+ */
+int ut_check_skip_to_line(struct unit_test_state *uts, const char *fmt, ...);
+
+/**
  * ut_check_console_end() - Check there is no more console output
  *
  * After the function returns, uts->actual_str holds the actual string read
@@ -286,6 +301,15 @@ int ut_check_console_dump(struct unit_test_state *uts, int total_bytes);
                return CMD_RET_FAILURE;                                 \
        }                                                               \
 
+/* Assert that a following console output line matches */
+#define ut_assert_skip_to_line(fmt, args...)                           \
+       if (ut_check_skip_to_line(uts, fmt, ##args)) {                  \
+               ut_failf(uts, __FILE__, __LINE__, __func__,             \
+                        "console", "\nExpected '%s',\n     got to '%s'", \
+                        uts->expect_str, uts->actual_str);             \
+               return CMD_RET_FAILURE;                                 \
+       }                                                               \
+
 /* Assert that there is no more console output */
 #define ut_assert_console_end()                                                \
        if (ut_check_console_end(uts)) {                                \
index 1eec2a5..28da417 100644 (file)
--- a/test/ut.c
+++ b/test/ut.c
@@ -121,6 +121,32 @@ int ut_check_skipline(struct unit_test_state *uts)
        return 0;
 }
 
+int ut_check_skip_to_line(struct unit_test_state *uts, const char *fmt, ...)
+{
+       va_list args;
+       int len;
+       int ret;
+
+       va_start(args, fmt);
+       len = vsnprintf(uts->expect_str, sizeof(uts->expect_str), fmt, args);
+       va_end(args);
+       if (len >= sizeof(uts->expect_str)) {
+               ut_fail(uts, __FILE__, __LINE__, __func__,
+                       "unit_test_state->expect_str too small");
+               return -EOVERFLOW;
+       }
+       while (1) {
+               if (!console_record_avail())
+                       return -ENOENT;
+               ret = readline_check(uts);
+               if (ret < 0)
+                       return ret;
+
+               if (!strcmp(uts->expect_str, uts->actual_str))
+                       return 0;
+       }
+}
+
 int ut_check_console_end(struct unit_test_state *uts)
 {
        int ret;