99#include <kunit/test.h>
1010
1111static void kfree_at_end (struct kunit * test , const void * to_free );
12+ static void free_subsuite_at_end (struct kunit * test ,
13+ struct kunit_suite * const * to_free );
1214static struct kunit_suite * alloc_fake_suite (struct kunit * test ,
13- const char * suite_name );
15+ const char * suite_name ,
16+ struct kunit_case * test_cases );
17+
18+ static void dummy_test (struct kunit * test ) {}
19+
20+ static struct kunit_case dummy_test_cases [] = {
21+ /* .run_case is not important, just needs to be non-NULL */
22+ { .name = "test1" , .run_case = dummy_test },
23+ { .name = "test2" , .run_case = dummy_test },
24+ {},
25+ };
26+
27+ static void parse_filter_test (struct kunit * test )
28+ {
29+ struct kunit_test_filter filter = {NULL , NULL };
30+
31+ kunit_parse_filter_glob (& filter , "suite" );
32+ KUNIT_EXPECT_STREQ (test , filter .suite_glob , "suite" );
33+ KUNIT_EXPECT_FALSE (test , filter .test_glob );
34+ kfree (filter .suite_glob );
35+ kfree (filter .test_glob );
36+
37+ kunit_parse_filter_glob (& filter , "suite.test" );
38+ KUNIT_EXPECT_STREQ (test , filter .suite_glob , "suite" );
39+ KUNIT_EXPECT_STREQ (test , filter .test_glob , "test" );
40+ kfree (filter .suite_glob );
41+ kfree (filter .test_glob );
42+ }
1443
1544static void filter_subsuite_test (struct kunit * test )
1645{
1746 struct kunit_suite * subsuite [3 ] = {NULL , NULL , NULL };
1847 struct kunit_suite * const * filtered ;
48+ struct kunit_test_filter filter = {
49+ .suite_glob = "suite2" ,
50+ .test_glob = NULL ,
51+ };
1952
20- subsuite [0 ] = alloc_fake_suite (test , "suite1" );
21- subsuite [1 ] = alloc_fake_suite (test , "suite2" );
53+ subsuite [0 ] = alloc_fake_suite (test , "suite1" , dummy_test_cases );
54+ subsuite [1 ] = alloc_fake_suite (test , "suite2" , dummy_test_cases );
2255
2356 /* Want: suite1, suite2, NULL -> suite2, NULL */
24- filtered = kunit_filter_subsuite (subsuite , "suite2*" );
57+ filtered = kunit_filter_subsuite (subsuite , & filter );
2558 KUNIT_ASSERT_NOT_ERR_OR_NULL (test , filtered );
26- kfree_at_end (test , filtered );
59+ free_subsuite_at_end (test , filtered );
2760
61+ /* Validate we just have suite2 */
2862 KUNIT_ASSERT_NOT_ERR_OR_NULL (test , filtered [0 ]);
2963 KUNIT_EXPECT_STREQ (test , (const char * )filtered [0 ]-> name , "suite2" );
64+ KUNIT_EXPECT_FALSE (test , filtered [1 ]);
65+ }
66+
67+ static void filter_subsuite_test_glob_test (struct kunit * test )
68+ {
69+ struct kunit_suite * subsuite [3 ] = {NULL , NULL , NULL };
70+ struct kunit_suite * const * filtered ;
71+ struct kunit_test_filter filter = {
72+ .suite_glob = "suite2" ,
73+ .test_glob = "test2" ,
74+ };
75+
76+ subsuite [0 ] = alloc_fake_suite (test , "suite1" , dummy_test_cases );
77+ subsuite [1 ] = alloc_fake_suite (test , "suite2" , dummy_test_cases );
3078
79+ /* Want: suite1, suite2, NULL -> suite2 (just test1), NULL */
80+ filtered = kunit_filter_subsuite (subsuite , & filter );
81+ KUNIT_ASSERT_NOT_ERR_OR_NULL (test , filtered );
82+ free_subsuite_at_end (test , filtered );
83+
84+ /* Validate we just have suite2 */
85+ KUNIT_ASSERT_NOT_ERR_OR_NULL (test , filtered [0 ]);
86+ KUNIT_EXPECT_STREQ (test , (const char * )filtered [0 ]-> name , "suite2" );
3187 KUNIT_EXPECT_FALSE (test , filtered [1 ]);
88+
89+ /* Now validate we just have test2 */
90+ KUNIT_ASSERT_NOT_ERR_OR_NULL (test , filtered [0 ]-> test_cases );
91+ KUNIT_EXPECT_STREQ (test , (const char * )filtered [0 ]-> test_cases [0 ].name , "test2" );
92+ KUNIT_EXPECT_FALSE (test , filtered [0 ]-> test_cases [1 ].name );
3293}
3394
3495static void filter_subsuite_to_empty_test (struct kunit * test )
3596{
3697 struct kunit_suite * subsuite [3 ] = {NULL , NULL , NULL };
3798 struct kunit_suite * const * filtered ;
99+ struct kunit_test_filter filter = {
100+ .suite_glob = "not_found" ,
101+ .test_glob = NULL ,
102+ };
38103
39- subsuite [0 ] = alloc_fake_suite (test , "suite1" );
40- subsuite [1 ] = alloc_fake_suite (test , "suite2" );
104+ subsuite [0 ] = alloc_fake_suite (test , "suite1" , dummy_test_cases );
105+ subsuite [1 ] = alloc_fake_suite (test , "suite2" , dummy_test_cases );
41106
42- filtered = kunit_filter_subsuite (subsuite , "not_found" );
43- kfree_at_end (test , filtered ); /* just in case */
107+ filtered = kunit_filter_subsuite (subsuite , & filter );
108+ free_subsuite_at_end (test , filtered ); /* just in case */
44109
45110 KUNIT_EXPECT_FALSE_MSG (test , filtered ,
46111 "should be NULL to indicate no match" );
@@ -52,7 +117,7 @@ static void kfree_subsuites_at_end(struct kunit *test, struct suite_set *suite_s
52117
53118 kfree_at_end (test , suite_set -> start );
54119 for (suites = suite_set -> start ; suites < suite_set -> end ; suites ++ )
55- kfree_at_end (test , * suites );
120+ free_subsuite_at_end (test , * suites );
56121}
57122
58123static void filter_suites_test (struct kunit * test )
@@ -74,8 +139,8 @@ static void filter_suites_test(struct kunit *test)
74139 struct suite_set filtered = {.start = NULL , .end = NULL };
75140
76141 /* Emulate two files, each having one suite */
77- subsuites [0 ][0 ] = alloc_fake_suite (test , "suite0" );
78- subsuites [1 ][0 ] = alloc_fake_suite (test , "suite1" );
142+ subsuites [0 ][0 ] = alloc_fake_suite (test , "suite0" , dummy_test_cases );
143+ subsuites [1 ][0 ] = alloc_fake_suite (test , "suite1" , dummy_test_cases );
79144
80145 /* Filter out suite1 */
81146 filtered = kunit_filter_suites (& suite_set , "suite0" );
@@ -88,7 +153,9 @@ static void filter_suites_test(struct kunit *test)
88153}
89154
90155static struct kunit_case executor_test_cases [] = {
156+ KUNIT_CASE (parse_filter_test ),
91157 KUNIT_CASE (filter_subsuite_test ),
158+ KUNIT_CASE (filter_subsuite_test_glob_test ),
92159 KUNIT_CASE (filter_subsuite_to_empty_test ),
93160 KUNIT_CASE (filter_suites_test ),
94161 {}
@@ -120,14 +187,30 @@ static void kfree_at_end(struct kunit *test, const void *to_free)
120187 (void * )to_free );
121188}
122189
190+ static void free_subsuite_res_free (struct kunit_resource * res )
191+ {
192+ kunit_free_subsuite (res -> data );
193+ }
194+
195+ static void free_subsuite_at_end (struct kunit * test ,
196+ struct kunit_suite * const * to_free )
197+ {
198+ if (IS_ERR_OR_NULL (to_free ))
199+ return ;
200+ kunit_alloc_resource (test , NULL , free_subsuite_res_free ,
201+ GFP_KERNEL , (void * )to_free );
202+ }
203+
123204static struct kunit_suite * alloc_fake_suite (struct kunit * test ,
124- const char * suite_name )
205+ const char * suite_name ,
206+ struct kunit_case * test_cases )
125207{
126208 struct kunit_suite * suite ;
127209
128210 /* We normally never expect to allocate suites, hence the non-const cast. */
129211 suite = kunit_kzalloc (test , sizeof (* suite ), GFP_KERNEL );
130212 strncpy ((char * )suite -> name , suite_name , sizeof (suite -> name ) - 1 );
213+ suite -> test_cases = test_cases ;
131214
132215 return suite ;
133216}
0 commit comments