Test skip option.
authorPauli <paul.dale@oracle.com>
Sun, 14 Apr 2019 23:53:53 +0000 (09:53 +1000)
committerPauli <paul.dale@oracle.com>
Thu, 9 May 2019 10:21:09 +0000 (20:21 +1000)
Provide C test cases with the option to skip tests and subtests.

Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/8695)

test/test_test.c
test/testutil.h
test/testutil/driver.c
test/testutil/tests.c
test/testutil/tu_local.h

index 3741e17122aa6ae8cd67a7cb2517714966ff27f7..ba66a158ad6d9d24299c49514ff58ba697b83ae0 100644 (file)
@@ -531,6 +531,25 @@ static int test_bn_output(int n)
     return 1;
 }
 
+static int test_skip_one(void)
+{
+    return TEST_skip("skip test");
+}
+
+static int test_skip_many(int n)
+{
+    return TEST_skip("skip tests: %d", n);
+}
+
+static int test_skip_null(void)
+{
+    /*
+     * This is not a recommended way of skipping a test, a reason or
+     * description should be included.
+     */
+    return TEST_skip(NULL);
+}
+
 int setup_tests(void)
 {
     ADD_TEST(test_int);
@@ -553,5 +572,8 @@ int setup_tests(void)
     ADD_TEST(test_single_eval);
     ADD_TEST(test_output);
     ADD_ALL_TESTS(test_bn_output, OSSL_NELEM(bn_output_tests));
+    ADD_TEST(test_skip_one);
+    ADD_TEST(test_skip_null);
+    ADD_ALL_TESTS(test_skip_many, 3);
     return 1;
 }
index 7f5db601cd98f294d60498876d2cc1c381bf4424..3a5c4866dad1edfa363168ac1f3a244d28a5143f 100644 (file)
@@ -346,6 +346,9 @@ void test_info(const char *file, int line, const char *desc, ...)
     PRINTF_FORMAT(3, 4);
 void test_info_c90(const char *desc, ...) PRINTF_FORMAT(1, 2);
 void test_note(const char *desc, ...) PRINTF_FORMAT(1, 2);
+int test_skip(const char *file, int line, const char *desc, ...)
+    PRINTF_FORMAT(3, 4);
+int test_skip_c90(const char *desc, ...) PRINTF_FORMAT(1, 2);
 void test_openssl_errors(void);
 void test_perror(const char *s);
 
@@ -463,9 +466,11 @@ void test_perror(const char *s);
 # if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L
 #  define TEST_error         test_error_c90
 #  define TEST_info          test_info_c90
+#  define TEST_skip          test_skip_c90
 # else
 #  define TEST_error(...)    test_error(__FILE__, __LINE__, __VA_ARGS__)
 #  define TEST_info(...)     test_info(__FILE__, __LINE__, __VA_ARGS__)
+#  define TEST_skip(...)     test_skip(__FILE__, __LINE__, __VA_ARGS__)
 # endif
 # define TEST_note           test_note
 # define TEST_openssl_errors test_openssl_errors
index 10d74e2ea47f882f53da9df947ebc840058b1d98..2da83ed72785e06e43ad9a9c14c0f90c5447803d 100644 (file)
@@ -280,20 +280,20 @@ void set_test_title(const char *title)
     test_title = title == NULL ? NULL : strdup(title);
 }
 
-PRINTF_FORMAT(2, 3) static void test_verdict(int pass, const char *extra, ...)
+PRINTF_FORMAT(2, 3) static void test_verdict(int verdict,
+                                             const char *description, ...)
 {
     va_list ap;
 
     test_flush_stdout();
     test_flush_stderr();
 
-    test_printf_stdout("%*s%s", level, "", pass ? "ok" : "not ok");
-    if (extra != NULL) {
-        test_printf_stdout(" ");
-        va_start(ap, extra);
-        test_vprintf_stdout(extra, ap);
-        va_end(ap);
-    }
+    test_printf_stdout("%*s%s ", level, "", verdict != 0 ? "ok" : "not ok");
+    va_start(ap, description);
+    test_vprintf_stdout(description, ap);
+    va_end(ap);
+    if (verdict == TEST_SKIP_CODE)
+        test_printf_stdout(" # skipped");
     test_printf_stdout("\n");
     test_flush_stdout();
 }
@@ -349,20 +349,14 @@ int run_tests(const char *test_prog_name)
             }
             test_flush_stdout();
         } else if (all_tests[i].num == -1) {
-            int ret = 0;
-
             set_test_title(all_tests[i].test_case_name);
-            ret = all_tests[i].test_fn();
-            verdict = 1;
-            if (!ret) {
-                verdict = 0;
-                ++num_failed;
-            }
+            verdict = all_tests[i].test_fn();
             test_verdict(verdict, "%d - %s", ii + 1, test_title);
-            finalize(ret);
+            finalize(verdict != 0);
         } else {
             int num_failed_inner = 0;
 
+            verdict = TEST_SKIP_CODE;
             level += 4;
             if (all_tests[i].subtest && single_iter == -1) {
                 test_printf_stdout("%*s# Subtest: %s\n", level, "",
@@ -381,39 +375,34 @@ int run_tests(const char *test_prog_name)
                 while (jstep == 0 || gcd(all_tests[i].num, jstep) != 1);
 
             for (jj = 0; jj < all_tests[i].num; jj++) {
-                int ret;
+                int v;
 
                 j = (j + jstep) % all_tests[i].num;
                 if (single_iter != -1 && ((jj + 1) != single_iter))
                     continue;
                 set_test_title(NULL);
-                ret = all_tests[i].param_test_fn(j);
+                v = all_tests[i].param_test_fn(j);
 
-                if (!ret)
+                if (v == 0) {
                     ++num_failed_inner;
+                    verdict = 0;
+                } else if (v != TEST_SKIP_CODE && verdict != 0) {
+                    verdict = 1;
+                }
 
-                finalize(ret);
+                finalize(v != 0);
 
                 if (all_tests[i].subtest) {
-                    verdict = 1;
-                    if (!ret) {
-                        verdict = 0;
-                        ++num_failed_inner;
-                    }
                     if (test_title != NULL)
-                        test_verdict(verdict, "%d - %s", jj + 1, test_title);
+                        test_verdict(v, "%d - %s", jj + 1, test_title);
                     else
-                        test_verdict(verdict, "%d - iteration %d",
-                                     jj + 1, j + 1);
+                        test_verdict(v, "%d - iteration %d", jj + 1, j + 1);
                 }
             }
 
             level -= 4;
-            verdict = 1;
-            if (num_failed_inner) {
-                verdict = 0;
+            if (verdict == 0)
                 ++num_failed;
-            }
             test_verdict(verdict, "%d - %s", ii + 1,
                          all_tests[i].test_case_name);
         }
index 05b06888809ecc444c21dccdb2c9f78f0873e905..56177cd9992ee018f7424965bd71a6404bfe88b3 100644 (file)
@@ -157,6 +157,29 @@ void test_note(const char *fmt, ...)
     test_flush_stderr();
 }
 
+
+int test_skip(const char *file, int line, const char *desc, ...)
+{
+    va_list ap;
+
+    va_start(ap, desc);
+    test_fail_message_va("SKIP", file, line, NULL, NULL, NULL, NULL, desc, ap);
+    va_end(ap);
+    return TEST_SKIP_CODE;
+}
+
+int test_skip_c90(const char *desc, ...)
+{
+    va_list ap;
+
+    va_start(ap, desc);
+    test_fail_message_va("SKIP", NULL, -1, NULL, NULL, NULL, NULL, desc, ap);
+    va_end(ap);
+    test_printf_stderr("\n");
+    return TEST_SKIP_CODE;
+}
+
+
 void test_openssl_errors(void)
 {
     ERR_print_errors_cb(openssl_error_cb, NULL);
index 049d7b1bc21ab66bce302eed6fcf615eae9aec4b..ede4546948ff3f1ca6a0e073d8210096befdb83e 100644 (file)
@@ -12,6 +12,8 @@
 #include <openssl/bio.h>
 #include "../testutil.h"
 
+#define TEST_SKIP_CODE  123
+
 int subtest_level(void);
 int openssl_error_cb(const char *str, size_t len, void *u);
 const BIO_METHOD *BIO_f_tap(void);