diff mbox series

[11/11] test: Add a way to skip console checking until a string matches

Message ID 20210818214022.11.I44fcf34ce986e97cb281a70e4fc04caed4c26045@changeid
State Accepted
Commit 2e09008c3c938dac28440d948a27b1c4190f36d2
Delegated to: Tom Rini
Headers show
Series sandbox: Minor fixes and improvements | expand

Commit Message

Simon Glass Aug. 19, 2021, 3:40 a.m. UTC
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 | 24 ++++++++++++++++++++++++
 test/ut.c         | 26 ++++++++++++++++++++++++++
 2 files changed, 50 insertions(+)

Comments

Tom Rini Sept. 23, 2021, 2:09 a.m. UTC | #1
On Wed, Aug 18, 2021 at 09:40:33PM -0600, Simon Glass wrote:

> 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>

Applied to u-boot/next, thanks!
diff mbox series

Patch

diff --git a/include/test/ut.h b/include/test/ut.h
index 656e25fe574..fb2e5fcff2c 100644
--- a/include/test/ut.h
+++ b/include/test/ut.h
@@ -82,6 +82,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
  *
@@ -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)) {				\
diff --git a/test/ut.c b/test/ut.c
index 1eec2a57dff..28da417686e 100644
--- 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;