test: Allow running tests multiple times
[platform/kernel/u-boot.git] / include / test / ut.h
index adef0b7..f7d1d18 100644 (file)
@@ -52,7 +52,7 @@ void ut_failf(struct unit_test_state *uts, const char *fname, int line,
  *
  * @uts: Test state
  * @fmt: printf() format string for the error, followed by args
- * @return 0 if OK, other value on error
+ * Return: 0 if OK, other value on error
  */
 int ut_check_console_line(struct unit_test_state *uts, const char *fmt, ...)
                        __attribute__ ((format (__printf__, 2, 3)));
@@ -69,7 +69,7 @@ int ut_check_console_line(struct unit_test_state *uts, const char *fmt, ...)
  *
  * @uts: Test state
  * @fmt: printf() format string for the error, followed by args
- * @return 0 if OK, other value on error
+ * Return: 0 if OK, other value on error
  */
 int ut_check_console_linen(struct unit_test_state *uts, const char *fmt, ...)
                        __attribute__ ((format (__printf__, 2, 3)));
@@ -78,18 +78,33 @@ int ut_check_console_linen(struct unit_test_state *uts, const char *fmt, ...)
  * ut_check_skipline() - Check that the next console line exists and skip it
  *
  * @uts: Test state
- * @return 0 if OK, other value on error
+ * Return: 0 if OK, other value on error
  */
 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
  * from the console
  *
  * @uts: Test state
- * @return 0 if OK (console has no output), other value on error
+ * Return: 0 if OK (console has no output), other value on error
  */
 int ut_check_console_end(struct unit_test_state *uts);
 
@@ -99,7 +114,7 @@ int ut_check_console_end(struct unit_test_state *uts);
  * This only supports a byte dump.
  *
  * @total_bytes: Size of the expected dump in bytes`
- * @return 0 if OK (looks like a dump and the length matches), other value on
+ * Return: 0 if OK (looks like a dump and the length matches), other value on
  *     error
  */
 int ut_check_console_dump(struct unit_test_state *uts, int total_bytes);
@@ -177,23 +192,6 @@ int ut_check_console_dump(struct unit_test_state *uts, int total_bytes);
        }                                                               \
 }
 
-/*
- * Assert that two string expressions are equal, up to length of the
- * first
- */
-#define ut_asserteq_strn(expr1, expr2) {                               \
-       const char *_val1 = (expr1), *_val2 = (expr2);                  \
-       int _len = strlen(_val1);                                       \
-                                                                       \
-       if (memcmp(_val1, _val2, _len)) {                               \
-               ut_failf(uts, __FILE__, __LINE__, __func__,             \
-                        #expr1 " = " #expr2,                           \
-                        "Expected \"%.*s\", got \"%.*s\"",             \
-                        _len, _val1, _len, _val2);                     \
-               return CMD_RET_FAILURE;                                 \
-       }                                                               \
-}
-
 /* Assert that two memory areas are equal */
 #define ut_asserteq_mem(expr1, expr2, len) {                           \
        const u8 *_val1 = (u8 *)(expr1), *_val2 = (u8 *)(expr2);        \
@@ -303,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)) {                                \
@@ -325,7 +332,7 @@ int ut_check_console_dump(struct unit_test_state *uts, int total_bytes);
 /**
  * ut_check_free() - Return the number of bytes free in the malloc() pool
  *
- * @return bytes free
+ * Return: bytes free
  */
 ulong ut_check_free(void);
 
@@ -333,7 +340,7 @@ ulong ut_check_free(void);
  * ut_check_delta() - Return the number of bytes allocated/freed
  *
  * @last: Last value from ut_check_free
- * @return free memory delta from @last; positive means more memory has been
+ * Return: free memory delta from @last; positive means more memory has been
  *     allocated, negative means less has been allocated (i.e. some is freed)
  */
 long ut_check_delta(ulong last);
@@ -368,43 +375,18 @@ void ut_unsilence_console(struct unit_test_state *uts);
 void ut_set_skip_delays(struct unit_test_state *uts, bool skip_delays);
 
 /**
- * ut_run_test() - Run a single test
- *
- * This runs the test, handling any preparation and clean-up needed. It prints
- * the name of each test before running it.
+ * test_get_state() - Get the active test state
  *
- * @uts: Test state to update. The caller should ensure that this is zeroed for
- *     the first call to this function. On exit, @uts->fail_count is
- *     incremented by the number of failures (0, one hopes)
- * @test: Test to run
- * @name: Name of test, possibly skipping a prefix that should not be displayed
- * @return 0 if all tests passed, -EAGAIN if the test should be skipped, -1 if
- *     any failed
+ * Return: the currently active test state, or NULL if none
  */
-int ut_run_test(struct unit_test_state *uts, struct unit_test *test,
-               const char *name);
+struct unit_test_state *test_get_state(void);
 
 /**
- * ut_run_tests() - Run a set of tests
- *
- * This runs the tests, handling any preparation and clean-up needed. It prints
- * the name of each test before running it.
+ * test_set_state() - Set the active test state
  *
- * @uts: Test state to update. The caller should ensure that this is zeroed for
- *     the first call to this function. On exit, @uts->fail_count is
- *     incremented by the number of failures (0, one hopes)
- * @prefix: String prefix for the tests. Any tests that have this prefix will be
- *     printed without the prefix, so that it is easier to see the unique part
- *     of the test name. If NULL, no prefix processing is done
- * @tests: List of tests to run
- * @count: Number of tests to run
- * @select_name: Name of a single test to run (from the list provided). If NULL
- *     then all tests are run
- * @return 0 if all tests passed, -ENOENT if test @select_name was not found,
- *     -EBADF if any failed
+ * @uts: Test state to use as currently active test state, or NULL if none
  */
-int ut_run_tests(struct unit_test_state *uts, const char *prefix,
-                struct unit_test *tests, int count, const char *select_name);
+void test_set_state(struct unit_test_state *uts);
 
 /**
  * ut_run_tests() - Run a set of tests
@@ -421,9 +403,10 @@ int ut_run_tests(struct unit_test_state *uts, const char *prefix,
  * @count: Number of tests to run
  * @select_name: Name of a single test to run (from the list provided). If NULL
  *     then all tests are run
- * @return 0 if all tests passed, -1 if any failed
+ * @runs_per_test: Number of times to run each test (typically 1)
+ * Return: 0 if all tests passed, -1 if any failed
  */
 int ut_run_list(const char *name, const char *prefix, struct unit_test *tests,
-               int count, const char *select_name);
+               int count, const char *select_name, int runs_per_test);
 
 #endif