1 // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) 2 3 #include "test_progs.h" 4 #include "testing_helpers.h" 5 6 static void init_test_filter_set(struct test_filter_set *set) 7 { 8 set->cnt = 0; 9 set->tests = NULL; 10 } 11 12 static 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 27 static 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"); 112 error: 113 free_test_filter_set(&set); 114 } 115 116 static 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 163 out_fclose: 164 fclose(fp); 165 out_remove: 166 remove(tmpfile); 167 } 168 169 void 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