9
9
#include <kunit/test.h>
10
10
11
11
static 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 );
12
14
static 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
+ }
14
43
15
44
static void filter_subsuite_test (struct kunit * test )
16
45
{
17
46
struct kunit_suite * subsuite [3 ] = {NULL , NULL , NULL };
18
47
struct kunit_suite * const * filtered ;
48
+ struct kunit_test_filter filter = {
49
+ .suite_glob = "suite2" ,
50
+ .test_glob = NULL ,
51
+ };
19
52
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 );
22
55
23
56
/* Want: suite1, suite2, NULL -> suite2, NULL */
24
- filtered = kunit_filter_subsuite (subsuite , "suite2*" );
57
+ filtered = kunit_filter_subsuite (subsuite , & filter );
25
58
KUNIT_ASSERT_NOT_ERR_OR_NULL (test , filtered );
26
- kfree_at_end (test , filtered );
59
+ free_subsuite_at_end (test , filtered );
27
60
61
+ /* Validate we just have suite2 */
28
62
KUNIT_ASSERT_NOT_ERR_OR_NULL (test , filtered [0 ]);
29
63
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 );
30
78
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" );
31
87
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 );
32
93
}
33
94
34
95
static void filter_subsuite_to_empty_test (struct kunit * test )
35
96
{
36
97
struct kunit_suite * subsuite [3 ] = {NULL , NULL , NULL };
37
98
struct kunit_suite * const * filtered ;
99
+ struct kunit_test_filter filter = {
100
+ .suite_glob = "not_found" ,
101
+ .test_glob = NULL ,
102
+ };
38
103
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 );
41
106
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 */
44
109
45
110
KUNIT_EXPECT_FALSE_MSG (test , filtered ,
46
111
"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
52
117
53
118
kfree_at_end (test , suite_set -> start );
54
119
for (suites = suite_set -> start ; suites < suite_set -> end ; suites ++ )
55
- kfree_at_end (test , * suites );
120
+ free_subsuite_at_end (test , * suites );
56
121
}
57
122
58
123
static void filter_suites_test (struct kunit * test )
@@ -74,8 +139,8 @@ static void filter_suites_test(struct kunit *test)
74
139
struct suite_set filtered = {.start = NULL , .end = NULL };
75
140
76
141
/* 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 );
79
144
80
145
/* Filter out suite1 */
81
146
filtered = kunit_filter_suites (& suite_set , "suite0" );
@@ -88,7 +153,9 @@ static void filter_suites_test(struct kunit *test)
88
153
}
89
154
90
155
static struct kunit_case executor_test_cases [] = {
156
+ KUNIT_CASE (parse_filter_test ),
91
157
KUNIT_CASE (filter_subsuite_test ),
158
+ KUNIT_CASE (filter_subsuite_test_glob_test ),
92
159
KUNIT_CASE (filter_subsuite_to_empty_test ),
93
160
KUNIT_CASE (filter_suites_test ),
94
161
{}
@@ -120,14 +187,30 @@ static void kfree_at_end(struct kunit *test, const void *to_free)
120
187
(void * )to_free );
121
188
}
122
189
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
+
123
204
static 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 )
125
207
{
126
208
struct kunit_suite * suite ;
127
209
128
210
/* We normally never expect to allocate suites, hence the non-const cast. */
129
211
suite = kunit_kzalloc (test , sizeof (* suite ), GFP_KERNEL );
130
212
strncpy ((char * )suite -> name , suite_name , sizeof (suite -> name ) - 1 );
213
+ suite -> test_cases = test_cases ;
131
214
132
215
return suite ;
133
216
}
0 commit comments