selftests/bpf: Convert test_btf_dump into test_progs test
authorAndrii Nakryiko <andriin@fb.com>
Tue, 8 Oct 2019 23:10:07 +0000 (16:10 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 9 Oct 2019 22:38:36 +0000 (15:38 -0700)
Convert test_btf_dump into a part of test_progs, instead of
a stand-alone test binary.

Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20191008231009.2991130-3-andriin@fb.com
tools/testing/selftests/bpf/Makefile
tools/testing/selftests/bpf/prog_tests/btf_dump.c [new file with mode: 0644]
tools/testing/selftests/bpf/test_btf_dump.c [deleted file]

index 90944b7a8274c544f293912dc1b1714d91deb6bb..40552fb441e58fb94ad35c221cc15e3d5988cd7b 100644 (file)
@@ -29,7 +29,7 @@ TEST_GEN_PROGS = test_verifier test_tag test_maps test_lru_map test_lpm_map test
        test_sock test_btf test_sockmap get_cgroup_id_user test_socket_cookie \
        test_cgroup_storage test_select_reuseport test_section_names \
        test_netcnt test_tcpnotify_user test_sock_fields test_sysctl test_hashmap \
-       test_btf_dump test_cgroup_attach xdping
+       test_cgroup_attach xdping
 
 BPF_OBJ_FILES = $(patsubst %.c,%.o, $(notdir $(wildcard progs/*.c)))
 TEST_GEN_FILES = $(BPF_OBJ_FILES)
diff --git a/tools/testing/selftests/bpf/prog_tests/btf_dump.c b/tools/testing/selftests/bpf/prog_tests/btf_dump.c
new file mode 100644 (file)
index 0000000..7390d30
--- /dev/null
@@ -0,0 +1,130 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <test_progs.h>
+#include <bpf/btf.h>
+
+static int duration = 0;
+
+void btf_dump_printf(void *ctx, const char *fmt, va_list args)
+{
+       vfprintf(ctx, fmt, args);
+}
+
+static struct btf_dump_test_case {
+       const char *name;
+       const char *file;
+       struct btf_dump_opts opts;
+} btf_dump_test_cases[] = {
+       {"btf_dump: syntax", "btf_dump_test_case_syntax", {}},
+       {"btf_dump: ordering", "btf_dump_test_case_ordering", {}},
+       {"btf_dump: padding", "btf_dump_test_case_padding", {}},
+       {"btf_dump: packing", "btf_dump_test_case_packing", {}},
+       {"btf_dump: bitfields", "btf_dump_test_case_bitfields", {}},
+       {"btf_dump: multidim", "btf_dump_test_case_multidim", {}},
+       {"btf_dump: namespacing", "btf_dump_test_case_namespacing", {}},
+};
+
+static int btf_dump_all_types(const struct btf *btf,
+                             const struct btf_dump_opts *opts)
+{
+       size_t type_cnt = btf__get_nr_types(btf);
+       struct btf_dump *d;
+       int err = 0, id;
+
+       d = btf_dump__new(btf, NULL, opts, btf_dump_printf);
+       if (IS_ERR(d))
+               return PTR_ERR(d);
+
+       for (id = 1; id <= type_cnt; id++) {
+               err = btf_dump__dump_type(d, id);
+               if (err)
+                       goto done;
+       }
+
+done:
+       btf_dump__free(d);
+       return err;
+}
+
+static int test_btf_dump_case(int n, struct btf_dump_test_case *t)
+{
+       char test_file[256], out_file[256], diff_cmd[1024];
+       struct btf *btf = NULL;
+       int err = 0, fd = -1;
+       FILE *f = NULL;
+
+       snprintf(test_file, sizeof(test_file), "%s.o", t->file);
+
+       btf = btf__parse_elf(test_file, NULL);
+       if (CHECK(IS_ERR(btf), "btf_parse_elf",
+           "failed to load test BTF: %ld\n", PTR_ERR(btf))) {
+               err = -PTR_ERR(btf);
+               btf = NULL;
+               goto done;
+       }
+
+       snprintf(out_file, sizeof(out_file), "/tmp/%s.output.XXXXXX", t->file);
+       fd = mkstemp(out_file);
+       if (CHECK(fd < 0, "create_tmp", "failed to create file: %d\n", fd)) {
+               err = fd;
+               goto done;
+       }
+       f = fdopen(fd, "w");
+       if (CHECK(f == NULL, "open_tmp",  "failed to open file: %s(%d)\n",
+                 strerror(errno), errno)) {
+               close(fd);
+               goto done;
+       }
+
+       t->opts.ctx = f;
+       err = btf_dump_all_types(btf, &t->opts);
+       fclose(f);
+       close(fd);
+       if (CHECK(err, "btf_dump", "failure during C dumping: %d\n", err)) {
+               goto done;
+       }
+
+       snprintf(test_file, sizeof(test_file), "progs/%s.c", t->file);
+       if (access(test_file, R_OK) == -1)
+               /*
+                * When the test is run with O=, kselftest copies TEST_FILES
+                * without preserving the directory structure.
+                */
+               snprintf(test_file, sizeof(test_file), "%s.c", t->file);
+       /*
+        * Diff test output and expected test output, contained between
+        * START-EXPECTED-OUTPUT and END-EXPECTED-OUTPUT lines in test case.
+        * For expected output lines, everything before '*' is stripped out.
+        * Also lines containing comment start and comment end markers are
+        * ignored. 
+        */
+       snprintf(diff_cmd, sizeof(diff_cmd),
+                "awk '/START-EXPECTED-OUTPUT/{out=1;next} "
+                "/END-EXPECTED-OUTPUT/{out=0} "
+                "/\\/\\*|\\*\\//{next} " /* ignore comment start/end lines */
+                "out {sub(/^[ \\t]*\\*/, \"\"); print}' '%s' | diff -u - '%s'",
+                test_file, out_file);
+       err = system(diff_cmd);
+       if (CHECK(err, "diff",
+                 "differing test output, output=%s, err=%d, diff cmd:\n%s\n",
+                 out_file, err, diff_cmd))
+               goto done;
+
+       remove(out_file);
+
+done:
+       btf__free(btf);
+       return err;
+}
+
+void test_btf_dump() {
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(btf_dump_test_cases); i++) {
+               struct btf_dump_test_case *t = &btf_dump_test_cases[i];
+
+               if (!test__start_subtest(t->name))
+                       continue;
+
+                test_btf_dump_case(i, &btf_dump_test_cases[i]);
+       }
+}
diff --git a/tools/testing/selftests/bpf/test_btf_dump.c b/tools/testing/selftests/bpf/test_btf_dump.c
deleted file mode 100644 (file)
index 6e75dd3..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <linux/err.h>
-#include <btf.h>
-
-#define CHECK(condition, format...) ({                                 \
-       int __ret = !!(condition);                                      \
-       if (__ret) {                                                    \
-               fprintf(stderr, "%s:%d:FAIL ", __func__, __LINE__);     \
-               fprintf(stderr, format);                                \
-       }                                                               \
-       __ret;                                                          \
-})
-
-void btf_dump_printf(void *ctx, const char *fmt, va_list args)
-{
-       vfprintf(ctx, fmt, args);
-}
-
-struct btf_dump_test_case {
-       const char *name;
-       struct btf_dump_opts opts;
-} btf_dump_test_cases[] = {
-       {.name = "btf_dump_test_case_syntax", .opts = {}},
-       {.name = "btf_dump_test_case_ordering", .opts = {}},
-       {.name = "btf_dump_test_case_padding", .opts = {}},
-       {.name = "btf_dump_test_case_packing", .opts = {}},
-       {.name = "btf_dump_test_case_bitfields", .opts = {}},
-       {.name = "btf_dump_test_case_multidim", .opts = {}},
-       {.name = "btf_dump_test_case_namespacing", .opts = {}},
-};
-
-static int btf_dump_all_types(const struct btf *btf,
-                             const struct btf_dump_opts *opts)
-{
-       size_t type_cnt = btf__get_nr_types(btf);
-       struct btf_dump *d;
-       int err = 0, id;
-
-       d = btf_dump__new(btf, NULL, opts, btf_dump_printf);
-       if (IS_ERR(d))
-               return PTR_ERR(d);
-
-       for (id = 1; id <= type_cnt; id++) {
-               err = btf_dump__dump_type(d, id);
-               if (err)
-                       goto done;
-       }
-
-done:
-       btf_dump__free(d);
-       return err;
-}
-
-int test_btf_dump_case(int n, struct btf_dump_test_case *test_case)
-{
-       char test_file[256], out_file[256], diff_cmd[1024];
-       struct btf *btf = NULL;
-       int err = 0, fd = -1;
-       FILE *f = NULL;
-
-       fprintf(stderr, "Test case #%d (%s): ", n, test_case->name);
-
-       snprintf(test_file, sizeof(test_file), "%s.o", test_case->name);
-
-       btf = btf__parse_elf(test_file, NULL);
-       if (CHECK(IS_ERR(btf),
-           "failed to load test BTF: %ld\n", PTR_ERR(btf))) {
-               err = -PTR_ERR(btf);
-               btf = NULL;
-               goto done;
-       }
-
-       snprintf(out_file, sizeof(out_file),
-                "/tmp/%s.output.XXXXXX", test_case->name);
-       fd = mkstemp(out_file);
-       if (CHECK(fd < 0, "failed to create temp output file: %d\n", fd)) {
-               err = fd;
-               goto done;
-       }
-       f = fdopen(fd, "w");
-       if (CHECK(f == NULL, "failed to open temp output file: %s(%d)\n",
-                 strerror(errno), errno)) {
-               close(fd);
-               goto done;
-       }
-
-       test_case->opts.ctx = f;
-       err = btf_dump_all_types(btf, &test_case->opts);
-       fclose(f);
-       close(fd);
-       if (CHECK(err, "failure during C dumping: %d\n", err)) {
-               goto done;
-       }
-
-       snprintf(test_file, sizeof(test_file), "progs/%s.c", test_case->name);
-       if (access(test_file, R_OK) == -1)
-               /*
-                * When the test is run with O=, kselftest copies TEST_FILES
-                * without preserving the directory structure.
-                */
-               snprintf(test_file, sizeof(test_file), "%s.c",
-                       test_case->name);
-       /*
-        * Diff test output and expected test output, contained between
-        * START-EXPECTED-OUTPUT and END-EXPECTED-OUTPUT lines in test case.
-        * For expected output lines, everything before '*' is stripped out.
-        * Also lines containing comment start and comment end markers are
-        * ignored. 
-        */
-       snprintf(diff_cmd, sizeof(diff_cmd),
-                "awk '/START-EXPECTED-OUTPUT/{out=1;next} "
-                "/END-EXPECTED-OUTPUT/{out=0} "
-                "/\\/\\*|\\*\\//{next} " /* ignore comment start/end lines */
-                "out {sub(/^[ \\t]*\\*/, \"\"); print}' '%s' | diff -u - '%s'",
-                test_file, out_file);
-       err = system(diff_cmd);
-       if (CHECK(err,
-                 "differing test output, output=%s, err=%d, diff cmd:\n%s\n",
-                 out_file, err, diff_cmd))
-               goto done;
-
-       remove(out_file);
-       fprintf(stderr, "OK\n");
-
-done:
-       btf__free(btf);
-       return err;
-}
-
-int main() {
-       int test_case_cnt, i, err, failed = 0;
-
-       test_case_cnt = sizeof(btf_dump_test_cases) /
-                       sizeof(btf_dump_test_cases[0]);
-
-       for (i = 0; i < test_case_cnt; i++) {
-               err = test_btf_dump_case(i, &btf_dump_test_cases[i]);
-               if (err)
-                       failed++;
-       }
-
-       fprintf(stderr, "%d tests succeeded, %d tests failed.\n",
-               test_case_cnt - failed, failed);
-
-       return failed;
-}