Skip the tests if the rseq syscall is unavailable
authorMichael Jeanson <mjeanson@efficios.com>
Mon, 13 Jul 2020 15:27:27 +0000 (11:27 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 13 Jul 2020 18:46:30 +0000 (14:46 -0400)
Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
tests/basic_percpu_ops_test.c
tests/basic_test.c
tests/param_test.c
tests/run_param_test.tap

index 7000ff505893bf987d6ac47ddfbfc7d69cf15a7b..e514ce6a6cae36280242013a6a8cbba5d18e0afb 100644 (file)
@@ -15,7 +15,7 @@
 
 #include "tap.h"
 
-#define NR_TESTS 2
+#define NR_TESTS 4
 
 #define ARRAY_SIZE(arr)        (sizeof(arr) / sizeof((arr)[0]))
 
@@ -303,23 +303,30 @@ int main(void)
 {
        plan_tests(NR_TESTS);
 
+       if (!rseq_available()) {
+               skip(NR_TESTS, "The rseq syscall is unavailable");
+               goto end;
+       }
+
        if (rseq_register_current_thread()) {
-               fprintf(stderr, "Error: rseq_register_current_thread(...) failed(%d): %s\n",
+               fail("rseq_register_current_thread(...) failed(%d): %s\n",
                        errno, strerror(errno));
-               goto error;
+               goto end;
+       } else {
+               pass("Registered current thread with rseq");
        }
 
        test_percpu_spinlock();
        test_percpu_list();
 
        if (rseq_unregister_current_thread()) {
-               fprintf(stderr, "Error: rseq_unregister_current_thread(...) failed(%d): %s\n",
+               fail("rseq_unregister_current_thread(...) failed(%d): %s\n",
                        errno, strerror(errno));
-               goto error;
+               goto end;
+       } else {
+               pass("Unregistered current thread with rseq");
        }
 
-       exit(EXIT_SUCCESS);
-
-error:
-       exit(EXIT_FAILURE);
+end:
+       exit(exit_status());
 }
index 09ab20fe8d39b6948927c3dd283f36c03ebc929a..2813cff5e3d02b7f2ce442fac8660a346fe58a60 100644 (file)
@@ -22,8 +22,6 @@ void test_cpu_pointer(void)
        cpu_set_t affinity, test_affinity;
        int ret, i;
 
-       diag("testing current cpu");
-
        ret = sched_getaffinity(0, sizeof(affinity), &affinity);
        ok(ret == 0, "Get current thread affinity mask");
 
@@ -51,25 +49,33 @@ void test_cpu_pointer(void)
 
 int main(void)
 {
-
-       plan_no_plan();
+       /*
+        * Skip all tests if the rseq syscall is unavailable
+        */
+       if (rseq_available()) {
+               plan_no_plan();
+       } else {
+               plan_skip_all("The rseq syscall is unavailable");
+       }
 
        if (rseq_register_current_thread()) {
-               fprintf(stderr, "Error: rseq_register_current_thread(...) failed(%d): %s\n",
+               fail("rseq_register_current_thread(...) failed(%d): %s\n",
                        errno, strerror(errno));
-               goto init_thread_error;
+               goto end;
+       } else {
+               pass("Registered current thread with rseq");
        }
 
        test_cpu_pointer();
 
        if (rseq_unregister_current_thread()) {
-               fprintf(stderr, "Error: rseq_unregister_current_thread(...) failed(%d): %s\n",
+               fail("rseq_unregister_current_thread(...) failed(%d): %s\n",
                        errno, strerror(errno));
-               goto init_thread_error;
+               goto end;
+       } else {
+               pass("Unregistered current thread with rseq");
        }
 
-       exit(EXIT_SUCCESS);
-
-init_thread_error:
-       exit(EXIT_FAILURE);;
+end:
+       exit(exit_status());
 }
index f4fc8464fc560f8d4c6f4967032febde90dcaba1..e48e5dd11967d8bcf2d09acb2de72aa18f1263e4 100644 (file)
@@ -1158,6 +1158,7 @@ static void show_usage(char **argv)
        printf("        [-D M] Disable rseq for each M threads\n");
        printf("        [-T test] Choose test: (s)pinlock, (l)ist, (b)uffer, (m)emcpy, (i)ncrement\n");
        printf("        [-M] Push into buffer and memcpy buffer with memory barriers.\n");
+       printf("        [-c] Check if the rseq syscall is available.\n");
        printf("        [-v] Verbose output.\n");
        printf("        [-h] Show this help.\n");
        printf("\n");
@@ -1284,6 +1285,14 @@ int main(int argc, char **argv)
                case 'M':
                        opt_mb = 1;
                        break;
+               case 'c':
+                       if (rseq_available()) {
+                               printf_verbose("The rseq syscall is available.\n");
+                               goto end;
+                       } else {
+                               printf_verbose("The rseq syscall is unavailable.\n");
+                               goto no_rseq;
+                       }
                default:
                        show_usage(argv);
                        goto error;
@@ -1331,4 +1340,7 @@ end:
 
 error:
        return -1;
+
+no_rseq:
+       return 2;
 }
index 7ba027d28d0aad3a641ef1dad832a6bfb5613dbe..7501a6c0c13ff638ea9eaf8bdd342ad67fff4c21 100755 (executable)
@@ -71,7 +71,12 @@ function do_tests_inject()
 }
 
 
-plan_tests $(( 2 * 7 * 37 ))
+"$RSEQ_TESTS_BUILDDIR"/param_test -c
+if [[ $? == 2 ]]; then
+       plan_skip_all "The rseq syscall is unavailable"
+else
+       plan_tests $(( 2 * 7 * 37 ))
+fi
 
 diag "Default parameters"
 do_tests
This page took 0.028919 seconds and 4 git commands to generate.