176 lines · c
1// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)2 3#include "test_progs.h"4#include "testing_helpers.h"5 6static void init_test_filter_set(struct test_filter_set *set)7{8 set->cnt = 0;9 set->tests = NULL;10}11 12static void free_test_filter_set(struct test_filter_set *set)13{14 int i, j;15 16 for (i = 0; i < set->cnt; i++) {17 for (j = 0; j < set->tests[i].subtest_cnt; j++)18 free((void *)set->tests[i].subtests[j]);19 free(set->tests[i].subtests);20 free(set->tests[i].name);21 }22 23 free(set->tests);24 init_test_filter_set(set);25}26 27static void test_parse_test_list(void)28{29 struct test_filter_set set;30 31 init_test_filter_set(&set);32 33 ASSERT_OK(parse_test_list("arg_parsing", &set, true), "parsing");34 if (!ASSERT_EQ(set.cnt, 1, "test filters count"))35 goto error;36 if (!ASSERT_OK_PTR(set.tests, "test filters initialized"))37 goto error;38 ASSERT_EQ(set.tests[0].subtest_cnt, 0, "subtest filters count");39 ASSERT_OK(strcmp("arg_parsing", set.tests[0].name), "subtest name");40 free_test_filter_set(&set);41 42 ASSERT_OK(parse_test_list("arg_parsing,bpf_cookie", &set, true),43 "parsing");44 if (!ASSERT_EQ(set.cnt, 2, "count of test filters"))45 goto error;46 if (!ASSERT_OK_PTR(set.tests, "test filters initialized"))47 goto error;48 ASSERT_EQ(set.tests[0].subtest_cnt, 0, "subtest filters count");49 ASSERT_EQ(set.tests[1].subtest_cnt, 0, "subtest filters count");50 ASSERT_OK(strcmp("arg_parsing", set.tests[0].name), "test name");51 ASSERT_OK(strcmp("bpf_cookie", set.tests[1].name), "test name");52 free_test_filter_set(&set);53 54 ASSERT_OK(parse_test_list("arg_parsing/arg_parsing,bpf_cookie",55 &set,56 true),57 "parsing");58 if (!ASSERT_EQ(set.cnt, 2, "count of test filters"))59 goto error;60 if (!ASSERT_OK_PTR(set.tests, "test filters initialized"))61 goto error;62 if (!ASSERT_EQ(set.tests[0].subtest_cnt, 1, "subtest filters count"))63 goto error;64 ASSERT_EQ(set.tests[1].subtest_cnt, 0, "subtest filters count");65 ASSERT_OK(strcmp("arg_parsing", set.tests[0].name), "test name");66 ASSERT_OK(strcmp("arg_parsing", set.tests[0].subtests[0]),67 "subtest name");68 ASSERT_OK(strcmp("bpf_cookie", set.tests[1].name), "test name");69 free_test_filter_set(&set);70 71 ASSERT_OK(parse_test_list("arg_parsing/arg_parsing", &set, true),72 "parsing");73 ASSERT_OK(parse_test_list("bpf_cookie", &set, true), "parsing");74 ASSERT_OK(parse_test_list("send_signal", &set, true), "parsing");75 if (!ASSERT_EQ(set.cnt, 3, "count of test filters"))76 goto error;77 if (!ASSERT_OK_PTR(set.tests, "test filters initialized"))78 goto error;79 if (!ASSERT_EQ(set.tests[0].subtest_cnt, 1, "subtest filters count"))80 goto error;81 ASSERT_EQ(set.tests[1].subtest_cnt, 0, "subtest filters count");82 ASSERT_EQ(set.tests[2].subtest_cnt, 0, "subtest filters count");83 ASSERT_OK(strcmp("arg_parsing", set.tests[0].name), "test name");84 ASSERT_OK(strcmp("arg_parsing", set.tests[0].subtests[0]),85 "subtest name");86 ASSERT_OK(strcmp("bpf_cookie", set.tests[1].name), "test name");87 ASSERT_OK(strcmp("send_signal", set.tests[2].name), "test name");88 free_test_filter_set(&set);89 90 ASSERT_OK(parse_test_list("bpf_cookie/trace", &set, false), "parsing");91 if (!ASSERT_EQ(set.cnt, 1, "count of test filters"))92 goto error;93 if (!ASSERT_OK_PTR(set.tests, "test filters initialized"))94 goto error;95 if (!ASSERT_EQ(set.tests[0].subtest_cnt, 1, "subtest filters count"))96 goto error;97 ASSERT_OK(strcmp("*bpf_cookie*", set.tests[0].name), "test name");98 ASSERT_OK(strcmp("*trace*", set.tests[0].subtests[0]), "subtest name");99 free_test_filter_set(&set);100 101 ASSERT_OK(parse_test_list("t/subtest1,t/subtest2", &set, true),102 "parsing");103 if (!ASSERT_EQ(set.cnt, 1, "count of test filters"))104 goto error;105 if (!ASSERT_OK_PTR(set.tests, "test filters initialized"))106 goto error;107 if (!ASSERT_EQ(set.tests[0].subtest_cnt, 2, "subtest filters count"))108 goto error;109 ASSERT_OK(strcmp("t", set.tests[0].name), "test name");110 ASSERT_OK(strcmp("subtest1", set.tests[0].subtests[0]), "subtest name");111 ASSERT_OK(strcmp("subtest2", set.tests[0].subtests[1]), "subtest name");112error:113 free_test_filter_set(&set);114}115 116static void test_parse_test_list_file(void)117{118 struct test_filter_set set;119 char tmpfile[80];120 FILE *fp;121 int fd;122 123 snprintf(tmpfile, sizeof(tmpfile), "/tmp/bpf_arg_parsing_test.XXXXXX");124 fd = mkstemp(tmpfile);125 if (!ASSERT_GE(fd, 0, "create tmp"))126 return;127 128 fp = fdopen(fd, "w");129 if (!ASSERT_NEQ(fp, NULL, "fdopen tmp")) {130 close(fd);131 goto out_remove;132 }133 134 fprintf(fp, "# comment\n");135 fprintf(fp, " test_with_spaces \n");136 fprintf(fp, "testA/subtest # comment\n");137 fprintf(fp, "testB#comment with no space\n");138 fprintf(fp, "testB # duplicate\n");139 fprintf(fp, "testA/subtest # subtest duplicate\n");140 fprintf(fp, "testA/subtest2\n");141 fprintf(fp, "testC_no_eof_newline");142 fflush(fp);143 144 if (!ASSERT_OK(ferror(fp), "prepare tmp"))145 goto out_fclose;146 147 init_test_filter_set(&set);148 149 ASSERT_OK(parse_test_list_file(tmpfile, &set, true), "parse file");150 151 ASSERT_EQ(set.cnt, 4, "test count");152 ASSERT_OK(strcmp("test_with_spaces", set.tests[0].name), "test 0 name");153 ASSERT_EQ(set.tests[0].subtest_cnt, 0, "test 0 subtest count");154 ASSERT_OK(strcmp("testA", set.tests[1].name), "test 1 name");155 ASSERT_EQ(set.tests[1].subtest_cnt, 2, "test 1 subtest count");156 ASSERT_OK(strcmp("subtest", set.tests[1].subtests[0]), "test 1 subtest 0");157 ASSERT_OK(strcmp("subtest2", set.tests[1].subtests[1]), "test 1 subtest 1");158 ASSERT_OK(strcmp("testB", set.tests[2].name), "test 2 name");159 ASSERT_OK(strcmp("testC_no_eof_newline", set.tests[3].name), "test 3 name");160 161 free_test_filter_set(&set);162 163out_fclose:164 fclose(fp);165out_remove:166 remove(tmpfile);167}168 169void test_arg_parsing(void)170{171 if (test__start_subtest("test_parse_test_list"))172 test_parse_test_list();173 if (test__start_subtest("test_parse_test_list_file"))174 test_parse_test_list_file();175}176