1*053f45beSAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0 */
2*053f45beSAndroid Build Coastguard Worker /*
3*053f45beSAndroid Build Coastguard Worker * kselftest.h: low-level kselftest framework to include from
4*053f45beSAndroid Build Coastguard Worker * selftest programs. When possible, please use
5*053f45beSAndroid Build Coastguard Worker * kselftest_harness.h instead.
6*053f45beSAndroid Build Coastguard Worker *
7*053f45beSAndroid Build Coastguard Worker * Copyright (c) 2014 Shuah Khan <[email protected]>
8*053f45beSAndroid Build Coastguard Worker * Copyright (c) 2014 Samsung Electronics Co., Ltd.
9*053f45beSAndroid Build Coastguard Worker *
10*053f45beSAndroid Build Coastguard Worker * Using this API consists of first counting how many tests your code
11*053f45beSAndroid Build Coastguard Worker * has to run, and then starting up the reporting:
12*053f45beSAndroid Build Coastguard Worker *
13*053f45beSAndroid Build Coastguard Worker * ksft_print_header();
14*053f45beSAndroid Build Coastguard Worker * ksft_set_plan(total_number_of_tests);
15*053f45beSAndroid Build Coastguard Worker *
16*053f45beSAndroid Build Coastguard Worker * For each test, report any progress, debugging, etc with:
17*053f45beSAndroid Build Coastguard Worker *
18*053f45beSAndroid Build Coastguard Worker * ksft_print_msg(fmt, ...);
19*053f45beSAndroid Build Coastguard Worker *
20*053f45beSAndroid Build Coastguard Worker * and finally report the pass/fail/skip/xfail state of the test with one of:
21*053f45beSAndroid Build Coastguard Worker *
22*053f45beSAndroid Build Coastguard Worker * ksft_test_result(condition, fmt, ...);
23*053f45beSAndroid Build Coastguard Worker * ksft_test_result_pass(fmt, ...);
24*053f45beSAndroid Build Coastguard Worker * ksft_test_result_fail(fmt, ...);
25*053f45beSAndroid Build Coastguard Worker * ksft_test_result_skip(fmt, ...);
26*053f45beSAndroid Build Coastguard Worker * ksft_test_result_xfail(fmt, ...);
27*053f45beSAndroid Build Coastguard Worker * ksft_test_result_error(fmt, ...);
28*053f45beSAndroid Build Coastguard Worker *
29*053f45beSAndroid Build Coastguard Worker * When all tests are finished, clean up and exit the program with one of:
30*053f45beSAndroid Build Coastguard Worker *
31*053f45beSAndroid Build Coastguard Worker * ksft_finished();
32*053f45beSAndroid Build Coastguard Worker * ksft_exit(condition);
33*053f45beSAndroid Build Coastguard Worker * ksft_exit_pass();
34*053f45beSAndroid Build Coastguard Worker * ksft_exit_fail();
35*053f45beSAndroid Build Coastguard Worker *
36*053f45beSAndroid Build Coastguard Worker * If the program wants to report details on why the entire program has
37*053f45beSAndroid Build Coastguard Worker * failed, it can instead exit with a message (this is usually done when
38*053f45beSAndroid Build Coastguard Worker * the program is aborting before finishing all tests):
39*053f45beSAndroid Build Coastguard Worker *
40*053f45beSAndroid Build Coastguard Worker * ksft_exit_fail_msg(fmt, ...);
41*053f45beSAndroid Build Coastguard Worker *
42*053f45beSAndroid Build Coastguard Worker */
43*053f45beSAndroid Build Coastguard Worker #ifndef __KSELFTEST_H
44*053f45beSAndroid Build Coastguard Worker #define __KSELFTEST_H
45*053f45beSAndroid Build Coastguard Worker
46*053f45beSAndroid Build Coastguard Worker #include <errno.h>
47*053f45beSAndroid Build Coastguard Worker #include <stdlib.h>
48*053f45beSAndroid Build Coastguard Worker #include <unistd.h>
49*053f45beSAndroid Build Coastguard Worker #include <stdarg.h>
50*053f45beSAndroid Build Coastguard Worker #include <stdio.h>
51*053f45beSAndroid Build Coastguard Worker
52*053f45beSAndroid Build Coastguard Worker #ifndef ARRAY_SIZE
53*053f45beSAndroid Build Coastguard Worker #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
54*053f45beSAndroid Build Coastguard Worker #endif
55*053f45beSAndroid Build Coastguard Worker
56*053f45beSAndroid Build Coastguard Worker /*
57*053f45beSAndroid Build Coastguard Worker * gcc cpuid.h provides __cpuid_count() since v4.4.
58*053f45beSAndroid Build Coastguard Worker * Clang/LLVM cpuid.h provides __cpuid_count() since v3.4.0.
59*053f45beSAndroid Build Coastguard Worker *
60*053f45beSAndroid Build Coastguard Worker * Provide local define for tests needing __cpuid_count() because
61*053f45beSAndroid Build Coastguard Worker * selftests need to work in older environments that do not yet
62*053f45beSAndroid Build Coastguard Worker * have __cpuid_count().
63*053f45beSAndroid Build Coastguard Worker */
64*053f45beSAndroid Build Coastguard Worker #ifndef __cpuid_count
65*053f45beSAndroid Build Coastguard Worker #define __cpuid_count(level, count, a, b, c, d) \
66*053f45beSAndroid Build Coastguard Worker __asm__ __volatile__ ("cpuid\n\t" \
67*053f45beSAndroid Build Coastguard Worker : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
68*053f45beSAndroid Build Coastguard Worker : "0" (level), "2" (count))
69*053f45beSAndroid Build Coastguard Worker #endif
70*053f45beSAndroid Build Coastguard Worker
71*053f45beSAndroid Build Coastguard Worker /* define kselftest exit codes */
72*053f45beSAndroid Build Coastguard Worker #define KSFT_PASS 0
73*053f45beSAndroid Build Coastguard Worker #define KSFT_FAIL 1
74*053f45beSAndroid Build Coastguard Worker #define KSFT_XFAIL 2
75*053f45beSAndroid Build Coastguard Worker #define KSFT_XPASS 3
76*053f45beSAndroid Build Coastguard Worker #define KSFT_SKIP 4
77*053f45beSAndroid Build Coastguard Worker
78*053f45beSAndroid Build Coastguard Worker /* counters */
79*053f45beSAndroid Build Coastguard Worker struct ksft_count {
80*053f45beSAndroid Build Coastguard Worker unsigned int ksft_pass;
81*053f45beSAndroid Build Coastguard Worker unsigned int ksft_fail;
82*053f45beSAndroid Build Coastguard Worker unsigned int ksft_xfail;
83*053f45beSAndroid Build Coastguard Worker unsigned int ksft_xpass;
84*053f45beSAndroid Build Coastguard Worker unsigned int ksft_xskip;
85*053f45beSAndroid Build Coastguard Worker unsigned int ksft_error;
86*053f45beSAndroid Build Coastguard Worker };
87*053f45beSAndroid Build Coastguard Worker
88*053f45beSAndroid Build Coastguard Worker static struct ksft_count ksft_cnt;
89*053f45beSAndroid Build Coastguard Worker static unsigned int ksft_plan;
90*053f45beSAndroid Build Coastguard Worker
ksft_test_num(void)91*053f45beSAndroid Build Coastguard Worker static inline unsigned int ksft_test_num(void)
92*053f45beSAndroid Build Coastguard Worker {
93*053f45beSAndroid Build Coastguard Worker return ksft_cnt.ksft_pass + ksft_cnt.ksft_fail +
94*053f45beSAndroid Build Coastguard Worker ksft_cnt.ksft_xfail + ksft_cnt.ksft_xpass +
95*053f45beSAndroid Build Coastguard Worker ksft_cnt.ksft_xskip + ksft_cnt.ksft_error;
96*053f45beSAndroid Build Coastguard Worker }
97*053f45beSAndroid Build Coastguard Worker
ksft_inc_pass_cnt(void)98*053f45beSAndroid Build Coastguard Worker static inline void ksft_inc_pass_cnt(void) { ksft_cnt.ksft_pass++; }
ksft_inc_fail_cnt(void)99*053f45beSAndroid Build Coastguard Worker static inline void ksft_inc_fail_cnt(void) { ksft_cnt.ksft_fail++; }
ksft_inc_xfail_cnt(void)100*053f45beSAndroid Build Coastguard Worker static inline void ksft_inc_xfail_cnt(void) { ksft_cnt.ksft_xfail++; }
ksft_inc_xpass_cnt(void)101*053f45beSAndroid Build Coastguard Worker static inline void ksft_inc_xpass_cnt(void) { ksft_cnt.ksft_xpass++; }
ksft_inc_xskip_cnt(void)102*053f45beSAndroid Build Coastguard Worker static inline void ksft_inc_xskip_cnt(void) { ksft_cnt.ksft_xskip++; }
ksft_inc_error_cnt(void)103*053f45beSAndroid Build Coastguard Worker static inline void ksft_inc_error_cnt(void) { ksft_cnt.ksft_error++; }
104*053f45beSAndroid Build Coastguard Worker
ksft_get_pass_cnt(void)105*053f45beSAndroid Build Coastguard Worker static inline int ksft_get_pass_cnt(void) { return ksft_cnt.ksft_pass; }
ksft_get_fail_cnt(void)106*053f45beSAndroid Build Coastguard Worker static inline int ksft_get_fail_cnt(void) { return ksft_cnt.ksft_fail; }
ksft_get_xfail_cnt(void)107*053f45beSAndroid Build Coastguard Worker static inline int ksft_get_xfail_cnt(void) { return ksft_cnt.ksft_xfail; }
ksft_get_xpass_cnt(void)108*053f45beSAndroid Build Coastguard Worker static inline int ksft_get_xpass_cnt(void) { return ksft_cnt.ksft_xpass; }
ksft_get_xskip_cnt(void)109*053f45beSAndroid Build Coastguard Worker static inline int ksft_get_xskip_cnt(void) { return ksft_cnt.ksft_xskip; }
ksft_get_error_cnt(void)110*053f45beSAndroid Build Coastguard Worker static inline int ksft_get_error_cnt(void) { return ksft_cnt.ksft_error; }
111*053f45beSAndroid Build Coastguard Worker
ksft_print_header(void)112*053f45beSAndroid Build Coastguard Worker static inline void ksft_print_header(void)
113*053f45beSAndroid Build Coastguard Worker {
114*053f45beSAndroid Build Coastguard Worker if (!(getenv("KSFT_TAP_LEVEL")))
115*053f45beSAndroid Build Coastguard Worker printf("TAP version 13\n");
116*053f45beSAndroid Build Coastguard Worker }
117*053f45beSAndroid Build Coastguard Worker
ksft_set_plan(unsigned int plan)118*053f45beSAndroid Build Coastguard Worker static inline void ksft_set_plan(unsigned int plan)
119*053f45beSAndroid Build Coastguard Worker {
120*053f45beSAndroid Build Coastguard Worker ksft_plan = plan;
121*053f45beSAndroid Build Coastguard Worker printf("1..%d\n", ksft_plan);
122*053f45beSAndroid Build Coastguard Worker }
123*053f45beSAndroid Build Coastguard Worker
ksft_print_cnts(void)124*053f45beSAndroid Build Coastguard Worker static inline void ksft_print_cnts(void)
125*053f45beSAndroid Build Coastguard Worker {
126*053f45beSAndroid Build Coastguard Worker if (ksft_plan != ksft_test_num())
127*053f45beSAndroid Build Coastguard Worker printf("# Planned tests != run tests (%u != %u)\n",
128*053f45beSAndroid Build Coastguard Worker ksft_plan, ksft_test_num());
129*053f45beSAndroid Build Coastguard Worker printf("# Totals: pass:%d fail:%d xfail:%d xpass:%d skip:%d error:%d\n",
130*053f45beSAndroid Build Coastguard Worker ksft_cnt.ksft_pass, ksft_cnt.ksft_fail,
131*053f45beSAndroid Build Coastguard Worker ksft_cnt.ksft_xfail, ksft_cnt.ksft_xpass,
132*053f45beSAndroid Build Coastguard Worker ksft_cnt.ksft_xskip, ksft_cnt.ksft_error);
133*053f45beSAndroid Build Coastguard Worker }
134*053f45beSAndroid Build Coastguard Worker
ksft_print_msg(const char * msg,...)135*053f45beSAndroid Build Coastguard Worker static inline void ksft_print_msg(const char *msg, ...)
136*053f45beSAndroid Build Coastguard Worker {
137*053f45beSAndroid Build Coastguard Worker int saved_errno = errno;
138*053f45beSAndroid Build Coastguard Worker va_list args;
139*053f45beSAndroid Build Coastguard Worker
140*053f45beSAndroid Build Coastguard Worker va_start(args, msg);
141*053f45beSAndroid Build Coastguard Worker printf("# ");
142*053f45beSAndroid Build Coastguard Worker errno = saved_errno;
143*053f45beSAndroid Build Coastguard Worker vprintf(msg, args);
144*053f45beSAndroid Build Coastguard Worker va_end(args);
145*053f45beSAndroid Build Coastguard Worker }
146*053f45beSAndroid Build Coastguard Worker
ksft_test_result_pass(const char * msg,...)147*053f45beSAndroid Build Coastguard Worker static inline void ksft_test_result_pass(const char *msg, ...)
148*053f45beSAndroid Build Coastguard Worker {
149*053f45beSAndroid Build Coastguard Worker int saved_errno = errno;
150*053f45beSAndroid Build Coastguard Worker va_list args;
151*053f45beSAndroid Build Coastguard Worker
152*053f45beSAndroid Build Coastguard Worker ksft_cnt.ksft_pass++;
153*053f45beSAndroid Build Coastguard Worker
154*053f45beSAndroid Build Coastguard Worker va_start(args, msg);
155*053f45beSAndroid Build Coastguard Worker printf("ok %d ", ksft_test_num());
156*053f45beSAndroid Build Coastguard Worker errno = saved_errno;
157*053f45beSAndroid Build Coastguard Worker vprintf(msg, args);
158*053f45beSAndroid Build Coastguard Worker va_end(args);
159*053f45beSAndroid Build Coastguard Worker }
160*053f45beSAndroid Build Coastguard Worker
ksft_test_result_fail(const char * msg,...)161*053f45beSAndroid Build Coastguard Worker static inline void ksft_test_result_fail(const char *msg, ...)
162*053f45beSAndroid Build Coastguard Worker {
163*053f45beSAndroid Build Coastguard Worker int saved_errno = errno;
164*053f45beSAndroid Build Coastguard Worker va_list args;
165*053f45beSAndroid Build Coastguard Worker
166*053f45beSAndroid Build Coastguard Worker ksft_cnt.ksft_fail++;
167*053f45beSAndroid Build Coastguard Worker
168*053f45beSAndroid Build Coastguard Worker va_start(args, msg);
169*053f45beSAndroid Build Coastguard Worker printf("not ok %d ", ksft_test_num());
170*053f45beSAndroid Build Coastguard Worker errno = saved_errno;
171*053f45beSAndroid Build Coastguard Worker vprintf(msg, args);
172*053f45beSAndroid Build Coastguard Worker va_end(args);
173*053f45beSAndroid Build Coastguard Worker }
174*053f45beSAndroid Build Coastguard Worker
175*053f45beSAndroid Build Coastguard Worker /**
176*053f45beSAndroid Build Coastguard Worker * ksft_test_result() - Report test success based on truth of condition
177*053f45beSAndroid Build Coastguard Worker *
178*053f45beSAndroid Build Coastguard Worker * @condition: if true, report test success, otherwise failure.
179*053f45beSAndroid Build Coastguard Worker */
180*053f45beSAndroid Build Coastguard Worker #define ksft_test_result(condition, fmt, ...) do { \
181*053f45beSAndroid Build Coastguard Worker if (!!(condition)) \
182*053f45beSAndroid Build Coastguard Worker ksft_test_result_pass(fmt, ##__VA_ARGS__);\
183*053f45beSAndroid Build Coastguard Worker else \
184*053f45beSAndroid Build Coastguard Worker ksft_test_result_fail(fmt, ##__VA_ARGS__);\
185*053f45beSAndroid Build Coastguard Worker } while (0)
186*053f45beSAndroid Build Coastguard Worker
ksft_test_result_xfail(const char * msg,...)187*053f45beSAndroid Build Coastguard Worker static inline void ksft_test_result_xfail(const char *msg, ...)
188*053f45beSAndroid Build Coastguard Worker {
189*053f45beSAndroid Build Coastguard Worker int saved_errno = errno;
190*053f45beSAndroid Build Coastguard Worker va_list args;
191*053f45beSAndroid Build Coastguard Worker
192*053f45beSAndroid Build Coastguard Worker ksft_cnt.ksft_xfail++;
193*053f45beSAndroid Build Coastguard Worker
194*053f45beSAndroid Build Coastguard Worker va_start(args, msg);
195*053f45beSAndroid Build Coastguard Worker printf("ok %d # XFAIL ", ksft_test_num());
196*053f45beSAndroid Build Coastguard Worker errno = saved_errno;
197*053f45beSAndroid Build Coastguard Worker vprintf(msg, args);
198*053f45beSAndroid Build Coastguard Worker va_end(args);
199*053f45beSAndroid Build Coastguard Worker }
200*053f45beSAndroid Build Coastguard Worker
ksft_test_result_skip(const char * msg,...)201*053f45beSAndroid Build Coastguard Worker static inline void ksft_test_result_skip(const char *msg, ...)
202*053f45beSAndroid Build Coastguard Worker {
203*053f45beSAndroid Build Coastguard Worker int saved_errno = errno;
204*053f45beSAndroid Build Coastguard Worker va_list args;
205*053f45beSAndroid Build Coastguard Worker
206*053f45beSAndroid Build Coastguard Worker ksft_cnt.ksft_xskip++;
207*053f45beSAndroid Build Coastguard Worker
208*053f45beSAndroid Build Coastguard Worker va_start(args, msg);
209*053f45beSAndroid Build Coastguard Worker printf("ok %d # SKIP ", ksft_test_num());
210*053f45beSAndroid Build Coastguard Worker errno = saved_errno;
211*053f45beSAndroid Build Coastguard Worker vprintf(msg, args);
212*053f45beSAndroid Build Coastguard Worker va_end(args);
213*053f45beSAndroid Build Coastguard Worker }
214*053f45beSAndroid Build Coastguard Worker
215*053f45beSAndroid Build Coastguard Worker /* TODO: how does "error" differ from "fail" or "skip"? */
ksft_test_result_error(const char * msg,...)216*053f45beSAndroid Build Coastguard Worker static inline void ksft_test_result_error(const char *msg, ...)
217*053f45beSAndroid Build Coastguard Worker {
218*053f45beSAndroid Build Coastguard Worker int saved_errno = errno;
219*053f45beSAndroid Build Coastguard Worker va_list args;
220*053f45beSAndroid Build Coastguard Worker
221*053f45beSAndroid Build Coastguard Worker ksft_cnt.ksft_error++;
222*053f45beSAndroid Build Coastguard Worker
223*053f45beSAndroid Build Coastguard Worker va_start(args, msg);
224*053f45beSAndroid Build Coastguard Worker printf("not ok %d # error ", ksft_test_num());
225*053f45beSAndroid Build Coastguard Worker errno = saved_errno;
226*053f45beSAndroid Build Coastguard Worker vprintf(msg, args);
227*053f45beSAndroid Build Coastguard Worker va_end(args);
228*053f45beSAndroid Build Coastguard Worker }
229*053f45beSAndroid Build Coastguard Worker
ksft_exit_pass(void)230*053f45beSAndroid Build Coastguard Worker static inline int ksft_exit_pass(void)
231*053f45beSAndroid Build Coastguard Worker {
232*053f45beSAndroid Build Coastguard Worker ksft_print_cnts();
233*053f45beSAndroid Build Coastguard Worker exit(KSFT_PASS);
234*053f45beSAndroid Build Coastguard Worker }
235*053f45beSAndroid Build Coastguard Worker
ksft_exit_fail(void)236*053f45beSAndroid Build Coastguard Worker static inline int ksft_exit_fail(void)
237*053f45beSAndroid Build Coastguard Worker {
238*053f45beSAndroid Build Coastguard Worker ksft_print_cnts();
239*053f45beSAndroid Build Coastguard Worker exit(KSFT_FAIL);
240*053f45beSAndroid Build Coastguard Worker }
241*053f45beSAndroid Build Coastguard Worker
242*053f45beSAndroid Build Coastguard Worker /**
243*053f45beSAndroid Build Coastguard Worker * ksft_exit() - Exit selftest based on truth of condition
244*053f45beSAndroid Build Coastguard Worker *
245*053f45beSAndroid Build Coastguard Worker * @condition: if true, exit self test with success, otherwise fail.
246*053f45beSAndroid Build Coastguard Worker */
247*053f45beSAndroid Build Coastguard Worker #define ksft_exit(condition) do { \
248*053f45beSAndroid Build Coastguard Worker if (!!(condition)) \
249*053f45beSAndroid Build Coastguard Worker ksft_exit_pass(); \
250*053f45beSAndroid Build Coastguard Worker else \
251*053f45beSAndroid Build Coastguard Worker ksft_exit_fail(); \
252*053f45beSAndroid Build Coastguard Worker } while (0)
253*053f45beSAndroid Build Coastguard Worker
254*053f45beSAndroid Build Coastguard Worker /**
255*053f45beSAndroid Build Coastguard Worker * ksft_finished() - Exit selftest with success if all tests passed
256*053f45beSAndroid Build Coastguard Worker */
257*053f45beSAndroid Build Coastguard Worker #define ksft_finished() \
258*053f45beSAndroid Build Coastguard Worker ksft_exit(ksft_plan == \
259*053f45beSAndroid Build Coastguard Worker ksft_cnt.ksft_pass + \
260*053f45beSAndroid Build Coastguard Worker ksft_cnt.ksft_xfail + \
261*053f45beSAndroid Build Coastguard Worker ksft_cnt.ksft_xskip)
262*053f45beSAndroid Build Coastguard Worker
ksft_exit_fail_msg(const char * msg,...)263*053f45beSAndroid Build Coastguard Worker static inline int ksft_exit_fail_msg(const char *msg, ...)
264*053f45beSAndroid Build Coastguard Worker {
265*053f45beSAndroid Build Coastguard Worker int saved_errno = errno;
266*053f45beSAndroid Build Coastguard Worker va_list args;
267*053f45beSAndroid Build Coastguard Worker
268*053f45beSAndroid Build Coastguard Worker va_start(args, msg);
269*053f45beSAndroid Build Coastguard Worker printf("Bail out! ");
270*053f45beSAndroid Build Coastguard Worker errno = saved_errno;
271*053f45beSAndroid Build Coastguard Worker vprintf(msg, args);
272*053f45beSAndroid Build Coastguard Worker va_end(args);
273*053f45beSAndroid Build Coastguard Worker
274*053f45beSAndroid Build Coastguard Worker ksft_print_cnts();
275*053f45beSAndroid Build Coastguard Worker exit(KSFT_FAIL);
276*053f45beSAndroid Build Coastguard Worker }
277*053f45beSAndroid Build Coastguard Worker
ksft_exit_xfail(void)278*053f45beSAndroid Build Coastguard Worker static inline int ksft_exit_xfail(void)
279*053f45beSAndroid Build Coastguard Worker {
280*053f45beSAndroid Build Coastguard Worker ksft_print_cnts();
281*053f45beSAndroid Build Coastguard Worker exit(KSFT_XFAIL);
282*053f45beSAndroid Build Coastguard Worker }
283*053f45beSAndroid Build Coastguard Worker
ksft_exit_xpass(void)284*053f45beSAndroid Build Coastguard Worker static inline int ksft_exit_xpass(void)
285*053f45beSAndroid Build Coastguard Worker {
286*053f45beSAndroid Build Coastguard Worker ksft_print_cnts();
287*053f45beSAndroid Build Coastguard Worker exit(KSFT_XPASS);
288*053f45beSAndroid Build Coastguard Worker }
289*053f45beSAndroid Build Coastguard Worker
ksft_exit_skip(const char * msg,...)290*053f45beSAndroid Build Coastguard Worker static inline int ksft_exit_skip(const char *msg, ...)
291*053f45beSAndroid Build Coastguard Worker {
292*053f45beSAndroid Build Coastguard Worker int saved_errno = errno;
293*053f45beSAndroid Build Coastguard Worker va_list args;
294*053f45beSAndroid Build Coastguard Worker
295*053f45beSAndroid Build Coastguard Worker va_start(args, msg);
296*053f45beSAndroid Build Coastguard Worker
297*053f45beSAndroid Build Coastguard Worker /*
298*053f45beSAndroid Build Coastguard Worker * FIXME: several tests misuse ksft_exit_skip so produce
299*053f45beSAndroid Build Coastguard Worker * something sensible if some tests have already been run
300*053f45beSAndroid Build Coastguard Worker * or a plan has been printed. Those tests should use
301*053f45beSAndroid Build Coastguard Worker * ksft_test_result_skip or ksft_exit_fail_msg instead.
302*053f45beSAndroid Build Coastguard Worker */
303*053f45beSAndroid Build Coastguard Worker if (ksft_plan || ksft_test_num()) {
304*053f45beSAndroid Build Coastguard Worker ksft_cnt.ksft_xskip++;
305*053f45beSAndroid Build Coastguard Worker printf("ok %d # SKIP ", 1 + ksft_test_num());
306*053f45beSAndroid Build Coastguard Worker } else {
307*053f45beSAndroid Build Coastguard Worker printf("1..0 # SKIP ");
308*053f45beSAndroid Build Coastguard Worker }
309*053f45beSAndroid Build Coastguard Worker if (msg) {
310*053f45beSAndroid Build Coastguard Worker errno = saved_errno;
311*053f45beSAndroid Build Coastguard Worker vprintf(msg, args);
312*053f45beSAndroid Build Coastguard Worker va_end(args);
313*053f45beSAndroid Build Coastguard Worker }
314*053f45beSAndroid Build Coastguard Worker if (ksft_test_num())
315*053f45beSAndroid Build Coastguard Worker ksft_print_cnts();
316*053f45beSAndroid Build Coastguard Worker exit(KSFT_SKIP);
317*053f45beSAndroid Build Coastguard Worker }
318*053f45beSAndroid Build Coastguard Worker
319*053f45beSAndroid Build Coastguard Worker #endif /* __KSELFTEST_H */
320