selftests/bpf: Extract parse_num_list into generic testing_helpers.c
authorAndrii Nakryiko <andriin@fb.com>
Tue, 12 May 2020 19:24:42 +0000 (12:24 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 13 May 2020 19:19:38 +0000 (12:19 -0700)
Add testing_helpers.c, which will contain generic helpers for test runners and
tests needing some common generic functionality, like parsing a set of
numbers.

Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Yonghong Song <yhs@fb.com>
Link: https://lore.kernel.org/bpf/20200512192445.2351848-2-andriin@fb.com
tools/testing/selftests/bpf/Makefile
tools/testing/selftests/bpf/test_progs.c
tools/testing/selftests/bpf/test_progs.h
tools/testing/selftests/bpf/testing_helpers.c [new file with mode: 0644]
tools/testing/selftests/bpf/testing_helpers.h [new file with mode: 0644]

index 1f878dcd2bf65ce6ed511af59fef1a1a3b546d9a..975b97b85bca4f66a37fc68603b88fe20ea24cee 100644 (file)
@@ -355,7 +355,8 @@ endef
 TRUNNER_TESTS_DIR := prog_tests
 TRUNNER_BPF_PROGS_DIR := progs
 TRUNNER_EXTRA_SOURCES := test_progs.c cgroup_helpers.c trace_helpers.c \
-                        network_helpers.c flow_dissector_load.h
+                        network_helpers.c testing_helpers.c            \
+                        flow_dissector_load.h
 TRUNNER_EXTRA_FILES := $(OUTPUT)/urandom_read                          \
                       $(wildcard progs/btf_dump_test_case_*.c)
 TRUNNER_BPF_BUILD_RULE := CLANG_BPF_BUILD_RULE
index 0f411fdc4f6de181afba7166b1b953a35cc7e117..54fa5fa688ce92d2096e028ac534ab4b099ddec8 100644 (file)
@@ -438,67 +438,6 @@ err:
        return -ENOMEM;
 }
 
-int parse_num_list(const char *s, struct test_selector *sel)
-{
-       int i, set_len = 0, new_len, num, start = 0, end = -1;
-       bool *set = NULL, *tmp, parsing_end = false;
-       char *next;
-
-       while (s[0]) {
-               errno = 0;
-               num = strtol(s, &next, 10);
-               if (errno)
-                       return -errno;
-
-               if (parsing_end)
-                       end = num;
-               else
-                       start = num;
-
-               if (!parsing_end && *next == '-') {
-                       s = next + 1;
-                       parsing_end = true;
-                       continue;
-               } else if (*next == ',') {
-                       parsing_end = false;
-                       s = next + 1;
-                       end = num;
-               } else if (*next == '\0') {
-                       parsing_end = false;
-                       s = next;
-                       end = num;
-               } else {
-                       return -EINVAL;
-               }
-
-               if (start > end)
-                       return -EINVAL;
-
-               if (end + 1 > set_len) {
-                       new_len = end + 1;
-                       tmp = realloc(set, new_len);
-                       if (!tmp) {
-                               free(set);
-                               return -ENOMEM;
-                       }
-                       for (i = set_len; i < start; i++)
-                               tmp[i] = false;
-                       set = tmp;
-                       set_len = new_len;
-               }
-               for (i = start; i <= end; i++)
-                       set[i] = true;
-       }
-
-       if (!set)
-               return -EINVAL;
-
-       sel->num_set = set;
-       sel->num_set_len = set_len;
-
-       return 0;
-}
-
 extern int extra_prog_load_log_flags;
 
 static error_t parse_arg(int key, char *arg, struct argp_state *state)
@@ -512,13 +451,15 @@ static error_t parse_arg(int key, char *arg, struct argp_state *state)
                if (subtest_str) {
                        *subtest_str = '\0';
                        if (parse_num_list(subtest_str + 1,
-                                          &env->subtest_selector)) {
+                                          &env->subtest_selector.num_set,
+                                          &env->subtest_selector.num_set_len)) {
                                fprintf(stderr,
                                        "Failed to parse subtest numbers.\n");
                                return -EINVAL;
                        }
                }
-               if (parse_num_list(arg, &env->test_selector)) {
+               if (parse_num_list(arg, &env->test_selector.num_set,
+                                  &env->test_selector.num_set_len)) {
                        fprintf(stderr, "Failed to parse test numbers.\n");
                        return -EINVAL;
                }
index 83287c76332b0031f78a83751c0674840202026a..f4503c926acad1e42b2253d2b1355ffb6bd027a0 100644 (file)
@@ -37,6 +37,7 @@ typedef __u16 __sum16;
 #include "bpf_util.h"
 #include <bpf/bpf_endian.h>
 #include "trace_helpers.h"
+#include "testing_helpers.h"
 #include "flow_dissector_load.h"
 
 enum verbosity {
diff --git a/tools/testing/selftests/bpf/testing_helpers.c b/tools/testing/selftests/bpf/testing_helpers.c
new file mode 100644 (file)
index 0000000..0af6337
--- /dev/null
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
+/* Copyright (C) 2020 Facebook, Inc. */
+#include <stdlib.h>
+#include <errno.h>
+#include "testing_helpers.h"
+
+int parse_num_list(const char *s, bool **num_set, int *num_set_len)
+{
+       int i, set_len = 0, new_len, num, start = 0, end = -1;
+       bool *set = NULL, *tmp, parsing_end = false;
+       char *next;
+
+       while (s[0]) {
+               errno = 0;
+               num = strtol(s, &next, 10);
+               if (errno)
+                       return -errno;
+
+               if (parsing_end)
+                       end = num;
+               else
+                       start = num;
+
+               if (!parsing_end && *next == '-') {
+                       s = next + 1;
+                       parsing_end = true;
+                       continue;
+               } else if (*next == ',') {
+                       parsing_end = false;
+                       s = next + 1;
+                       end = num;
+               } else if (*next == '\0') {
+                       parsing_end = false;
+                       s = next;
+                       end = num;
+               } else {
+                       return -EINVAL;
+               }
+
+               if (start > end)
+                       return -EINVAL;
+
+               if (end + 1 > set_len) {
+                       new_len = end + 1;
+                       tmp = realloc(set, new_len);
+                       if (!tmp) {
+                               free(set);
+                               return -ENOMEM;
+                       }
+                       for (i = set_len; i < start; i++)
+                               tmp[i] = false;
+                       set = tmp;
+                       set_len = new_len;
+               }
+               for (i = start; i <= end; i++)
+                       set[i] = true;
+       }
+
+       if (!set)
+               return -EINVAL;
+
+       *num_set = set;
+       *num_set_len = set_len;
+
+       return 0;
+}
diff --git a/tools/testing/selftests/bpf/testing_helpers.h b/tools/testing/selftests/bpf/testing_helpers.h
new file mode 100644 (file)
index 0000000..923b517
--- /dev/null
@@ -0,0 +1,5 @@
+/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
+/* Copyright (C) 2020 Facebook, Inc. */
+#include <stdbool.h>
+
+int parse_num_list(const char *s, bool **set, int *set_len);