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 <andr...@fb.com>
---
 tools/testing/selftests/bpf/Makefile          |  3 +-
 tools/testing/selftests/bpf/test_progs.c      | 67 ++-----------------
 tools/testing/selftests/bpf/test_progs.h      |  1 +
 tools/testing/selftests/bpf/testing_helpers.c | 66 ++++++++++++++++++
 tools/testing/selftests/bpf/testing_helpers.h |  5 ++
 5 files changed, 78 insertions(+), 64 deletions(-)
 create mode 100644 tools/testing/selftests/bpf/testing_helpers.c
 create mode 100644 tools/testing/selftests/bpf/testing_helpers.h

diff --git a/tools/testing/selftests/bpf/Makefile 
b/tools/testing/selftests/bpf/Makefile
index 8f25966b500b..52556712aad4 100644
--- a/tools/testing/selftests/bpf/Makefile
+++ b/tools/testing/selftests/bpf/Makefile
@@ -354,7 +354,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
diff --git a/tools/testing/selftests/bpf/test_progs.c 
b/tools/testing/selftests/bpf/test_progs.c
index 0f411fdc4f6d..54fa5fa688ce 100644
--- a/tools/testing/selftests/bpf/test_progs.c
+++ b/tools/testing/selftests/bpf/test_progs.c
@@ -438,67 +438,6 @@ static int parse_str_list(const char *s, struct str_set 
*set)
        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;
                }
diff --git a/tools/testing/selftests/bpf/test_progs.h 
b/tools/testing/selftests/bpf/test_progs.h
index 83287c76332b..f4503c926aca 100644
--- a/tools/testing/selftests/bpf/test_progs.h
+++ b/tools/testing/selftests/bpf/test_progs.h
@@ -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
index 000000000000..0af6337a8962
--- /dev/null
+++ b/tools/testing/selftests/bpf/testing_helpers.c
@@ -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
index 000000000000..923b51762759
--- /dev/null
+++ b/tools/testing/selftests/bpf/testing_helpers.h
@@ -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);
-- 
2.24.1

Reply via email to