pci-rcar-gen3: Rename CONFIG_SEND_ENABLE
[platform/kernel/u-boot.git] / test / test-main.c
index a98a77d..5931e94 100644 (file)
@@ -5,6 +5,7 @@
  */
 
 #include <common.h>
+#include <blk.h>
 #include <console.h>
 #include <cyclic.h>
 #include <dm.h>
@@ -287,7 +288,6 @@ static int dm_test_restore(struct device_node *of_root)
 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));
@@ -347,16 +347,31 @@ static int test_post_run(struct unit_test_state *uts, struct unit_test *test)
        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
@@ -386,11 +401,13 @@ static int ut_run_test(struct unit_test_state *uts, struct unit_test *test,
 
        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)
@@ -414,17 +431,16 @@ static int ut_run_test(struct unit_test_state *uts, struct unit_test *test,
  *     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;
@@ -482,20 +498,72 @@ static int ut_run_test_live_flat(struct unit_test_state *uts,
  */
 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);
@@ -514,7 +582,7 @@ static int ut_run_tests(struct unit_test_state *uts, const char *prefix,
 
 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;
@@ -548,7 +616,9 @@ int ut_run_list(const char *category, const char *prefix,
                }
                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)
@@ -558,6 +628,8 @@ int ut_run_list(const char *category, const char *prefix,
                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