*/
#include <common.h>
+#include <blk.h>
#include <console.h>
#include <cyclic.h>
#include <dm.h>
static int test_pre_run(struct unit_test_state *uts, struct unit_test *test)
{
ut_assertok(event_init());
- ut_assertok(cyclic_init());
if (test->flags & UT_TESTF_DM)
ut_assertok(dm_test_pre_run(uts));
ut_unsilence_console(uts);
if (test->flags & UT_TESTF_DM)
ut_assertok(dm_test_post_run(uts));
- ut_assertok(cyclic_uninit());
+ ut_assertok(cyclic_unregister_all());
ut_assertok(event_uninit());
free(uts->of_other);
uts->of_other = NULL;
+ blkcache_free();
+
return 0;
}
/**
+ * skip_test() - Handle skipping a test
+ *
+ * @uts: Test state to update
+ * @return -EAGAIN (always)
+ */
+static int skip_test(struct unit_test_state *uts)
+{
+ uts->skip_count++;
+
+ return -EAGAIN;
+}
+
+/**
* ut_run_test() - Run a single test
*
* This runs the test, handling any preparation and clean-up needed. It prints
ret = test_pre_run(uts, test);
if (ret == -EAGAIN)
- return -EAGAIN;
+ return skip_test(uts);
if (ret)
return ret;
- test->func(uts);
+ ret = test->func(uts);
+ if (ret == -EAGAIN)
+ skip_test(uts);
ret = test_post_run(uts, test);
if (ret)
* 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
*/
static int ut_run_test_live_flat(struct unit_test_state *uts,
- struct unit_test *test, const char *name)
+ struct unit_test *test)
{
int runs;
if ((test->flags & UT_TESTF_OTHER_FDT) && !IS_ENABLED(CONFIG_SANDBOX))
- return -EAGAIN;
+ return skip_test(uts);
/* Run with the live tree if possible */
runs = 0;
*/
static int ut_run_tests(struct unit_test_state *uts, const char *prefix,
struct unit_test *tests, int count,
- const char *select_name)
+ const char *select_name, const char *test_insert)
{
- struct unit_test *test;
+ struct unit_test *test, *one;
int found = 0;
+ int pos = 0;
+ int upto;
- for (test = tests; test < tests + count; test++) {
+ one = NULL;
+ if (test_insert) {
+ char *p;
+
+ pos = dectoul(test_insert, NULL);
+ p = strchr(test_insert, ':');
+ if (p)
+ p++;
+
+ for (test = tests; test < tests + count; test++) {
+ if (!strcmp(p, test->name))
+ one = test;
+ }
+ }
+
+ for (upto = 0, test = tests; test < tests + count; test++, upto++) {
const char *test_name = test->name;
int ret, i, old_fail_count;
if (!test_matches(prefix, test_name, select_name))
continue;
+
+ if (test->flags & UT_TESTF_MANUAL) {
+ int len;
+
+ /*
+ * manual tests must have a name ending "_norun" as this
+ * is how pytest knows to skip them. See
+ * generate_ut_subtest() for this check.
+ */
+ len = strlen(test_name);
+ if (len < 6 || strcmp(test_name + len - 6, "_norun")) {
+ printf("Test %s is manual so must have a name ending in _norun\n",
+ test_name);
+ uts->fail_count++;
+ return -EBADF;
+ }
+ if (!uts->force_run) {
+ if (select_name) {
+ printf("Test %s skipped as it is manual (use -f to run it)\n",
+ test_name);
+ }
+ continue;
+ }
+ }
old_fail_count = uts->fail_count;
+
+ if (one && upto == pos) {
+ ret = ut_run_test_live_flat(uts, one);
+ if (uts->fail_count != old_fail_count) {
+ printf("Test %s failed %d times (position %d)\n",
+ one->name,
+ uts->fail_count - old_fail_count, pos);
+ }
+ return -EBADF;
+ }
+
for (i = 0; i < uts->runs_per_test; i++)
- ret = ut_run_test_live_flat(uts, test, select_name);
+ ret = ut_run_test_live_flat(uts, test);
if (uts->fail_count != old_fail_count) {
printf("Test %s failed %d times\n", select_name,
uts->fail_count - old_fail_count);
int ut_run_list(const char *category, const char *prefix,
struct unit_test *tests, int count, const char *select_name,
- int runs_per_test)
+ int runs_per_test, bool force_run, const char *test_insert)
{
struct unit_test_state uts = { .fail_count = 0 };
bool has_dm_tests = false;
}
memcpy(uts.fdt_copy, gd->fdt_blob, uts.fdt_size);
}
- ret = ut_run_tests(&uts, prefix, tests, count, select_name);
+ uts.force_run = force_run;
+ ret = ut_run_tests(&uts, prefix, tests, count, select_name,
+ test_insert);
/* Best efforts only...ignore errors */
if (has_dm_tests)
os_free(uts.other_fdt);
}
+ if (uts.skip_count)
+ printf("Skipped: %d, ", uts.skip_count);
if (ret == -ENOENT)
printf("Test '%s' not found\n", select_name);
else