xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/kselftest_harness.h (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0-only */
2*053f45beSAndroid Build Coastguard Worker /*
3*053f45beSAndroid Build Coastguard Worker  * Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
4*053f45beSAndroid Build Coastguard Worker  *
5*053f45beSAndroid Build Coastguard Worker  * kselftest_harness.h: simple C unit test helper.
6*053f45beSAndroid Build Coastguard Worker  *
7*053f45beSAndroid Build Coastguard Worker  * See documentation in Documentation/dev-tools/kselftest.rst
8*053f45beSAndroid Build Coastguard Worker  *
9*053f45beSAndroid Build Coastguard Worker  * API inspired by code.google.com/p/googletest
10*053f45beSAndroid Build Coastguard Worker  */
11*053f45beSAndroid Build Coastguard Worker 
12*053f45beSAndroid Build Coastguard Worker /**
13*053f45beSAndroid Build Coastguard Worker  * DOC: example
14*053f45beSAndroid Build Coastguard Worker  *
15*053f45beSAndroid Build Coastguard Worker  * .. code-block:: c
16*053f45beSAndroid Build Coastguard Worker  *
17*053f45beSAndroid Build Coastguard Worker  *    #include "../kselftest_harness.h"
18*053f45beSAndroid Build Coastguard Worker  *
19*053f45beSAndroid Build Coastguard Worker  *    TEST(standalone_test) {
20*053f45beSAndroid Build Coastguard Worker  *      do_some_stuff;
21*053f45beSAndroid Build Coastguard Worker  *      EXPECT_GT(10, stuff) {
22*053f45beSAndroid Build Coastguard Worker  *         stuff_state_t state;
23*053f45beSAndroid Build Coastguard Worker  *         enumerate_stuff_state(&state);
24*053f45beSAndroid Build Coastguard Worker  *         TH_LOG("expectation failed with state: %s", state.msg);
25*053f45beSAndroid Build Coastguard Worker  *      }
26*053f45beSAndroid Build Coastguard Worker  *      more_stuff;
27*053f45beSAndroid Build Coastguard Worker  *      ASSERT_NE(some_stuff, NULL) TH_LOG("how did it happen?!");
28*053f45beSAndroid Build Coastguard Worker  *      last_stuff;
29*053f45beSAndroid Build Coastguard Worker  *      EXPECT_EQ(0, last_stuff);
30*053f45beSAndroid Build Coastguard Worker  *    }
31*053f45beSAndroid Build Coastguard Worker  *
32*053f45beSAndroid Build Coastguard Worker  *    FIXTURE(my_fixture) {
33*053f45beSAndroid Build Coastguard Worker  *      mytype_t *data;
34*053f45beSAndroid Build Coastguard Worker  *      int awesomeness_level;
35*053f45beSAndroid Build Coastguard Worker  *    };
36*053f45beSAndroid Build Coastguard Worker  *    FIXTURE_SETUP(my_fixture) {
37*053f45beSAndroid Build Coastguard Worker  *      self->data = mytype_new();
38*053f45beSAndroid Build Coastguard Worker  *      ASSERT_NE(NULL, self->data);
39*053f45beSAndroid Build Coastguard Worker  *    }
40*053f45beSAndroid Build Coastguard Worker  *    FIXTURE_TEARDOWN(my_fixture) {
41*053f45beSAndroid Build Coastguard Worker  *      mytype_free(self->data);
42*053f45beSAndroid Build Coastguard Worker  *    }
43*053f45beSAndroid Build Coastguard Worker  *    TEST_F(my_fixture, data_is_good) {
44*053f45beSAndroid Build Coastguard Worker  *      EXPECT_EQ(1, is_my_data_good(self->data));
45*053f45beSAndroid Build Coastguard Worker  *    }
46*053f45beSAndroid Build Coastguard Worker  *
47*053f45beSAndroid Build Coastguard Worker  *    TEST_HARNESS_MAIN
48*053f45beSAndroid Build Coastguard Worker  */
49*053f45beSAndroid Build Coastguard Worker 
50*053f45beSAndroid Build Coastguard Worker #ifndef __KSELFTEST_HARNESS_H
51*053f45beSAndroid Build Coastguard Worker #define __KSELFTEST_HARNESS_H
52*053f45beSAndroid Build Coastguard Worker 
53*053f45beSAndroid Build Coastguard Worker #ifndef _GNU_SOURCE
54*053f45beSAndroid Build Coastguard Worker #define _GNU_SOURCE
55*053f45beSAndroid Build Coastguard Worker #endif
56*053f45beSAndroid Build Coastguard Worker #include <asm/types.h>
57*053f45beSAndroid Build Coastguard Worker #include <errno.h>
58*053f45beSAndroid Build Coastguard Worker #include <stdbool.h>
59*053f45beSAndroid Build Coastguard Worker #include <stdint.h>
60*053f45beSAndroid Build Coastguard Worker #include <stdio.h>
61*053f45beSAndroid Build Coastguard Worker #include <stdlib.h>
62*053f45beSAndroid Build Coastguard Worker #include <string.h>
63*053f45beSAndroid Build Coastguard Worker #include <sys/mman.h>
64*053f45beSAndroid Build Coastguard Worker #include <sys/types.h>
65*053f45beSAndroid Build Coastguard Worker #include <sys/wait.h>
66*053f45beSAndroid Build Coastguard Worker #include <unistd.h>
67*053f45beSAndroid Build Coastguard Worker #include <setjmp.h>
68*053f45beSAndroid Build Coastguard Worker 
69*053f45beSAndroid Build Coastguard Worker #include "kselftest.h"
70*053f45beSAndroid Build Coastguard Worker 
71*053f45beSAndroid Build Coastguard Worker #define TEST_TIMEOUT_DEFAULT 30
72*053f45beSAndroid Build Coastguard Worker 
73*053f45beSAndroid Build Coastguard Worker /* Utilities exposed to the test definitions */
74*053f45beSAndroid Build Coastguard Worker #ifndef TH_LOG_STREAM
75*053f45beSAndroid Build Coastguard Worker #  define TH_LOG_STREAM stderr
76*053f45beSAndroid Build Coastguard Worker #endif
77*053f45beSAndroid Build Coastguard Worker 
78*053f45beSAndroid Build Coastguard Worker #ifndef TH_LOG_ENABLED
79*053f45beSAndroid Build Coastguard Worker #  define TH_LOG_ENABLED 1
80*053f45beSAndroid Build Coastguard Worker #endif
81*053f45beSAndroid Build Coastguard Worker 
82*053f45beSAndroid Build Coastguard Worker /**
83*053f45beSAndroid Build Coastguard Worker  * TH_LOG()
84*053f45beSAndroid Build Coastguard Worker  *
85*053f45beSAndroid Build Coastguard Worker  * @fmt: format string
86*053f45beSAndroid Build Coastguard Worker  * @...: optional arguments
87*053f45beSAndroid Build Coastguard Worker  *
88*053f45beSAndroid Build Coastguard Worker  * .. code-block:: c
89*053f45beSAndroid Build Coastguard Worker  *
90*053f45beSAndroid Build Coastguard Worker  *     TH_LOG(format, ...)
91*053f45beSAndroid Build Coastguard Worker  *
92*053f45beSAndroid Build Coastguard Worker  * Optional debug logging function available for use in tests.
93*053f45beSAndroid Build Coastguard Worker  * Logging may be enabled or disabled by defining TH_LOG_ENABLED.
94*053f45beSAndroid Build Coastguard Worker  * E.g., #define TH_LOG_ENABLED 1
95*053f45beSAndroid Build Coastguard Worker  *
96*053f45beSAndroid Build Coastguard Worker  * If no definition is provided, logging is enabled by default.
97*053f45beSAndroid Build Coastguard Worker  *
98*053f45beSAndroid Build Coastguard Worker  * If there is no way to print an error message for the process running the
99*053f45beSAndroid Build Coastguard Worker  * test (e.g. not allowed to write to stderr), it is still possible to get the
100*053f45beSAndroid Build Coastguard Worker  * ASSERT_* number for which the test failed.  This behavior can be enabled by
101*053f45beSAndroid Build Coastguard Worker  * writing `_metadata->no_print = true;` before the check sequence that is
102*053f45beSAndroid Build Coastguard Worker  * unable to print.  When an error occur, instead of printing an error message
103*053f45beSAndroid Build Coastguard Worker  * and calling `abort(3)`, the test process call `_exit(2)` with the assert
104*053f45beSAndroid Build Coastguard Worker  * number as argument, which is then printed by the parent process.
105*053f45beSAndroid Build Coastguard Worker  */
106*053f45beSAndroid Build Coastguard Worker #define TH_LOG(fmt, ...) do { \
107*053f45beSAndroid Build Coastguard Worker 	if (TH_LOG_ENABLED) \
108*053f45beSAndroid Build Coastguard Worker 		__TH_LOG(fmt, ##__VA_ARGS__); \
109*053f45beSAndroid Build Coastguard Worker } while (0)
110*053f45beSAndroid Build Coastguard Worker 
111*053f45beSAndroid Build Coastguard Worker /* Unconditional logger for internal use. */
112*053f45beSAndroid Build Coastguard Worker #define __TH_LOG(fmt, ...) \
113*053f45beSAndroid Build Coastguard Worker 		fprintf(TH_LOG_STREAM, "# %s:%d:%s:" fmt "\n", \
114*053f45beSAndroid Build Coastguard Worker 			__FILE__, __LINE__, _metadata->name, ##__VA_ARGS__)
115*053f45beSAndroid Build Coastguard Worker 
116*053f45beSAndroid Build Coastguard Worker /**
117*053f45beSAndroid Build Coastguard Worker  * SKIP()
118*053f45beSAndroid Build Coastguard Worker  *
119*053f45beSAndroid Build Coastguard Worker  * @statement: statement to run after reporting SKIP
120*053f45beSAndroid Build Coastguard Worker  * @fmt: format string
121*053f45beSAndroid Build Coastguard Worker  * @...: optional arguments
122*053f45beSAndroid Build Coastguard Worker  *
123*053f45beSAndroid Build Coastguard Worker  * .. code-block:: c
124*053f45beSAndroid Build Coastguard Worker  *
125*053f45beSAndroid Build Coastguard Worker  *     SKIP(statement, fmt, ...);
126*053f45beSAndroid Build Coastguard Worker  *
127*053f45beSAndroid Build Coastguard Worker  * This forces a "pass" after reporting why something is being skipped
128*053f45beSAndroid Build Coastguard Worker  * and runs "statement", which is usually "return" or "goto skip".
129*053f45beSAndroid Build Coastguard Worker  */
130*053f45beSAndroid Build Coastguard Worker #define SKIP(statement, fmt, ...) do { \
131*053f45beSAndroid Build Coastguard Worker 	snprintf(_metadata->results->reason, \
132*053f45beSAndroid Build Coastguard Worker 		 sizeof(_metadata->results->reason), fmt, ##__VA_ARGS__); \
133*053f45beSAndroid Build Coastguard Worker 	if (TH_LOG_ENABLED) { \
134*053f45beSAndroid Build Coastguard Worker 		fprintf(TH_LOG_STREAM, "#      SKIP      %s\n", \
135*053f45beSAndroid Build Coastguard Worker 			_metadata->results->reason); \
136*053f45beSAndroid Build Coastguard Worker 	} \
137*053f45beSAndroid Build Coastguard Worker 	_metadata->passed = 1; \
138*053f45beSAndroid Build Coastguard Worker 	_metadata->skip = 1; \
139*053f45beSAndroid Build Coastguard Worker 	_metadata->trigger = 0; \
140*053f45beSAndroid Build Coastguard Worker 	statement; \
141*053f45beSAndroid Build Coastguard Worker } while (0)
142*053f45beSAndroid Build Coastguard Worker 
143*053f45beSAndroid Build Coastguard Worker /**
144*053f45beSAndroid Build Coastguard Worker  * TEST() - Defines the test function and creates the registration
145*053f45beSAndroid Build Coastguard Worker  * stub
146*053f45beSAndroid Build Coastguard Worker  *
147*053f45beSAndroid Build Coastguard Worker  * @test_name: test name
148*053f45beSAndroid Build Coastguard Worker  *
149*053f45beSAndroid Build Coastguard Worker  * .. code-block:: c
150*053f45beSAndroid Build Coastguard Worker  *
151*053f45beSAndroid Build Coastguard Worker  *     TEST(name) { implementation }
152*053f45beSAndroid Build Coastguard Worker  *
153*053f45beSAndroid Build Coastguard Worker  * Defines a test by name.
154*053f45beSAndroid Build Coastguard Worker  * Names must be unique and tests must not be run in parallel.  The
155*053f45beSAndroid Build Coastguard Worker  * implementation containing block is a function and scoping should be treated
156*053f45beSAndroid Build Coastguard Worker  * as such.  Returning early may be performed with a bare "return;" statement.
157*053f45beSAndroid Build Coastguard Worker  *
158*053f45beSAndroid Build Coastguard Worker  * EXPECT_* and ASSERT_* are valid in a TEST() { } context.
159*053f45beSAndroid Build Coastguard Worker  */
160*053f45beSAndroid Build Coastguard Worker #define TEST(test_name) __TEST_IMPL(test_name, -1)
161*053f45beSAndroid Build Coastguard Worker 
162*053f45beSAndroid Build Coastguard Worker /**
163*053f45beSAndroid Build Coastguard Worker  * TEST_SIGNAL()
164*053f45beSAndroid Build Coastguard Worker  *
165*053f45beSAndroid Build Coastguard Worker  * @test_name: test name
166*053f45beSAndroid Build Coastguard Worker  * @signal: signal number
167*053f45beSAndroid Build Coastguard Worker  *
168*053f45beSAndroid Build Coastguard Worker  * .. code-block:: c
169*053f45beSAndroid Build Coastguard Worker  *
170*053f45beSAndroid Build Coastguard Worker  *     TEST_SIGNAL(name, signal) { implementation }
171*053f45beSAndroid Build Coastguard Worker  *
172*053f45beSAndroid Build Coastguard Worker  * Defines a test by name and the expected term signal.
173*053f45beSAndroid Build Coastguard Worker  * Names must be unique and tests must not be run in parallel.  The
174*053f45beSAndroid Build Coastguard Worker  * implementation containing block is a function and scoping should be treated
175*053f45beSAndroid Build Coastguard Worker  * as such.  Returning early may be performed with a bare "return;" statement.
176*053f45beSAndroid Build Coastguard Worker  *
177*053f45beSAndroid Build Coastguard Worker  * EXPECT_* and ASSERT_* are valid in a TEST() { } context.
178*053f45beSAndroid Build Coastguard Worker  */
179*053f45beSAndroid Build Coastguard Worker #define TEST_SIGNAL(test_name, signal) __TEST_IMPL(test_name, signal)
180*053f45beSAndroid Build Coastguard Worker 
181*053f45beSAndroid Build Coastguard Worker #define __TEST_IMPL(test_name, _signal) \
182*053f45beSAndroid Build Coastguard Worker 	static void test_name(struct __test_metadata *_metadata); \
183*053f45beSAndroid Build Coastguard Worker 	static inline void wrapper_##test_name( \
184*053f45beSAndroid Build Coastguard Worker 		struct __test_metadata *_metadata, \
185*053f45beSAndroid Build Coastguard Worker 		struct __fixture_variant_metadata *variant) \
186*053f45beSAndroid Build Coastguard Worker 	{ \
187*053f45beSAndroid Build Coastguard Worker 		_metadata->setup_completed = true; \
188*053f45beSAndroid Build Coastguard Worker 		if (setjmp(_metadata->env) == 0) \
189*053f45beSAndroid Build Coastguard Worker 			test_name(_metadata); \
190*053f45beSAndroid Build Coastguard Worker 		__test_check_assert(_metadata); \
191*053f45beSAndroid Build Coastguard Worker 	} \
192*053f45beSAndroid Build Coastguard Worker 	static struct __test_metadata _##test_name##_object = \
193*053f45beSAndroid Build Coastguard Worker 		{ .name = #test_name, \
194*053f45beSAndroid Build Coastguard Worker 		  .fn = &wrapper_##test_name, \
195*053f45beSAndroid Build Coastguard Worker 		  .fixture = &_fixture_global, \
196*053f45beSAndroid Build Coastguard Worker 		  .termsig = _signal, \
197*053f45beSAndroid Build Coastguard Worker 		  .timeout = TEST_TIMEOUT_DEFAULT, }; \
198*053f45beSAndroid Build Coastguard Worker 	static void __attribute__((constructor)) _register_##test_name(void) \
199*053f45beSAndroid Build Coastguard Worker 	{ \
200*053f45beSAndroid Build Coastguard Worker 		__register_test(&_##test_name##_object); \
201*053f45beSAndroid Build Coastguard Worker 	} \
202*053f45beSAndroid Build Coastguard Worker 	static void test_name( \
203*053f45beSAndroid Build Coastguard Worker 		struct __test_metadata __attribute__((unused)) *_metadata)
204*053f45beSAndroid Build Coastguard Worker 
205*053f45beSAndroid Build Coastguard Worker /**
206*053f45beSAndroid Build Coastguard Worker  * FIXTURE_DATA() - Wraps the struct name so we have one less
207*053f45beSAndroid Build Coastguard Worker  * argument to pass around
208*053f45beSAndroid Build Coastguard Worker  *
209*053f45beSAndroid Build Coastguard Worker  * @datatype_name: datatype name
210*053f45beSAndroid Build Coastguard Worker  *
211*053f45beSAndroid Build Coastguard Worker  * .. code-block:: c
212*053f45beSAndroid Build Coastguard Worker  *
213*053f45beSAndroid Build Coastguard Worker  *     FIXTURE_DATA(datatype_name)
214*053f45beSAndroid Build Coastguard Worker  *
215*053f45beSAndroid Build Coastguard Worker  * Almost always, you want just FIXTURE() instead (see below).
216*053f45beSAndroid Build Coastguard Worker  * This call may be used when the type of the fixture data
217*053f45beSAndroid Build Coastguard Worker  * is needed.  In general, this should not be needed unless
218*053f45beSAndroid Build Coastguard Worker  * the *self* is being passed to a helper directly.
219*053f45beSAndroid Build Coastguard Worker  */
220*053f45beSAndroid Build Coastguard Worker #define FIXTURE_DATA(datatype_name) struct _test_data_##datatype_name
221*053f45beSAndroid Build Coastguard Worker 
222*053f45beSAndroid Build Coastguard Worker /**
223*053f45beSAndroid Build Coastguard Worker  * FIXTURE() - Called once per fixture to setup the data and
224*053f45beSAndroid Build Coastguard Worker  * register
225*053f45beSAndroid Build Coastguard Worker  *
226*053f45beSAndroid Build Coastguard Worker  * @fixture_name: fixture name
227*053f45beSAndroid Build Coastguard Worker  *
228*053f45beSAndroid Build Coastguard Worker  * .. code-block:: c
229*053f45beSAndroid Build Coastguard Worker  *
230*053f45beSAndroid Build Coastguard Worker  *     FIXTURE(fixture_name) {
231*053f45beSAndroid Build Coastguard Worker  *       type property1;
232*053f45beSAndroid Build Coastguard Worker  *       ...
233*053f45beSAndroid Build Coastguard Worker  *     };
234*053f45beSAndroid Build Coastguard Worker  *
235*053f45beSAndroid Build Coastguard Worker  * Defines the data provided to TEST_F()-defined tests as *self*.  It should be
236*053f45beSAndroid Build Coastguard Worker  * populated and cleaned up using FIXTURE_SETUP() and FIXTURE_TEARDOWN().
237*053f45beSAndroid Build Coastguard Worker  */
238*053f45beSAndroid Build Coastguard Worker #define FIXTURE(fixture_name) \
239*053f45beSAndroid Build Coastguard Worker 	FIXTURE_VARIANT(fixture_name); \
240*053f45beSAndroid Build Coastguard Worker 	static struct __fixture_metadata _##fixture_name##_fixture_object = \
241*053f45beSAndroid Build Coastguard Worker 		{ .name =  #fixture_name, }; \
242*053f45beSAndroid Build Coastguard Worker 	static void __attribute__((constructor)) \
243*053f45beSAndroid Build Coastguard Worker 	_register_##fixture_name##_data(void) \
244*053f45beSAndroid Build Coastguard Worker 	{ \
245*053f45beSAndroid Build Coastguard Worker 		__register_fixture(&_##fixture_name##_fixture_object); \
246*053f45beSAndroid Build Coastguard Worker 	} \
247*053f45beSAndroid Build Coastguard Worker 	FIXTURE_DATA(fixture_name)
248*053f45beSAndroid Build Coastguard Worker 
249*053f45beSAndroid Build Coastguard Worker /**
250*053f45beSAndroid Build Coastguard Worker  * FIXTURE_SETUP() - Prepares the setup function for the fixture.
251*053f45beSAndroid Build Coastguard Worker  * *_metadata* is included so that EXPECT_* and ASSERT_* work correctly.
252*053f45beSAndroid Build Coastguard Worker  *
253*053f45beSAndroid Build Coastguard Worker  * @fixture_name: fixture name
254*053f45beSAndroid Build Coastguard Worker  *
255*053f45beSAndroid Build Coastguard Worker  * .. code-block:: c
256*053f45beSAndroid Build Coastguard Worker  *
257*053f45beSAndroid Build Coastguard Worker  *     FIXTURE_SETUP(fixture_name) { implementation }
258*053f45beSAndroid Build Coastguard Worker  *
259*053f45beSAndroid Build Coastguard Worker  * Populates the required "setup" function for a fixture.  An instance of the
260*053f45beSAndroid Build Coastguard Worker  * datatype defined with FIXTURE_DATA() will be exposed as *self* for the
261*053f45beSAndroid Build Coastguard Worker  * implementation.
262*053f45beSAndroid Build Coastguard Worker  *
263*053f45beSAndroid Build Coastguard Worker  * ASSERT_* are valid for use in this context and will prempt the execution
264*053f45beSAndroid Build Coastguard Worker  * of any dependent fixture tests.
265*053f45beSAndroid Build Coastguard Worker  *
266*053f45beSAndroid Build Coastguard Worker  * A bare "return;" statement may be used to return early.
267*053f45beSAndroid Build Coastguard Worker  */
268*053f45beSAndroid Build Coastguard Worker #define FIXTURE_SETUP(fixture_name) \
269*053f45beSAndroid Build Coastguard Worker 	void fixture_name##_setup( \
270*053f45beSAndroid Build Coastguard Worker 		struct __test_metadata __attribute__((unused)) *_metadata, \
271*053f45beSAndroid Build Coastguard Worker 		FIXTURE_DATA(fixture_name) __attribute__((unused)) *self, \
272*053f45beSAndroid Build Coastguard Worker 		const FIXTURE_VARIANT(fixture_name) \
273*053f45beSAndroid Build Coastguard Worker 			__attribute__((unused)) *variant)
274*053f45beSAndroid Build Coastguard Worker 
275*053f45beSAndroid Build Coastguard Worker /**
276*053f45beSAndroid Build Coastguard Worker  * FIXTURE_TEARDOWN()
277*053f45beSAndroid Build Coastguard Worker  * *_metadata* is included so that EXPECT_* and ASSERT_* work correctly.
278*053f45beSAndroid Build Coastguard Worker  *
279*053f45beSAndroid Build Coastguard Worker  * @fixture_name: fixture name
280*053f45beSAndroid Build Coastguard Worker  *
281*053f45beSAndroid Build Coastguard Worker  * .. code-block:: c
282*053f45beSAndroid Build Coastguard Worker  *
283*053f45beSAndroid Build Coastguard Worker  *     FIXTURE_TEARDOWN(fixture_name) { implementation }
284*053f45beSAndroid Build Coastguard Worker  *
285*053f45beSAndroid Build Coastguard Worker  * Populates the required "teardown" function for a fixture.  An instance of the
286*053f45beSAndroid Build Coastguard Worker  * datatype defined with FIXTURE_DATA() will be exposed as *self* for the
287*053f45beSAndroid Build Coastguard Worker  * implementation to clean up.
288*053f45beSAndroid Build Coastguard Worker  *
289*053f45beSAndroid Build Coastguard Worker  * A bare "return;" statement may be used to return early.
290*053f45beSAndroid Build Coastguard Worker  */
291*053f45beSAndroid Build Coastguard Worker #define FIXTURE_TEARDOWN(fixture_name) \
292*053f45beSAndroid Build Coastguard Worker 	void fixture_name##_teardown( \
293*053f45beSAndroid Build Coastguard Worker 		struct __test_metadata __attribute__((unused)) *_metadata, \
294*053f45beSAndroid Build Coastguard Worker 		FIXTURE_DATA(fixture_name) __attribute__((unused)) *self, \
295*053f45beSAndroid Build Coastguard Worker 		const FIXTURE_VARIANT(fixture_name) \
296*053f45beSAndroid Build Coastguard Worker 			__attribute__((unused)) *variant)
297*053f45beSAndroid Build Coastguard Worker 
298*053f45beSAndroid Build Coastguard Worker /**
299*053f45beSAndroid Build Coastguard Worker  * FIXTURE_VARIANT() - Optionally called once per fixture
300*053f45beSAndroid Build Coastguard Worker  * to declare fixture variant
301*053f45beSAndroid Build Coastguard Worker  *
302*053f45beSAndroid Build Coastguard Worker  * @fixture_name: fixture name
303*053f45beSAndroid Build Coastguard Worker  *
304*053f45beSAndroid Build Coastguard Worker  * .. code-block:: c
305*053f45beSAndroid Build Coastguard Worker  *
306*053f45beSAndroid Build Coastguard Worker  *     FIXTURE_VARIANT(fixture_name) {
307*053f45beSAndroid Build Coastguard Worker  *       type property1;
308*053f45beSAndroid Build Coastguard Worker  *       ...
309*053f45beSAndroid Build Coastguard Worker  *     };
310*053f45beSAndroid Build Coastguard Worker  *
311*053f45beSAndroid Build Coastguard Worker  * Defines type of constant parameters provided to FIXTURE_SETUP(), TEST_F() and
312*053f45beSAndroid Build Coastguard Worker  * FIXTURE_TEARDOWN as *variant*. Variants allow the same tests to be run with
313*053f45beSAndroid Build Coastguard Worker  * different arguments.
314*053f45beSAndroid Build Coastguard Worker  */
315*053f45beSAndroid Build Coastguard Worker #define FIXTURE_VARIANT(fixture_name) struct _fixture_variant_##fixture_name
316*053f45beSAndroid Build Coastguard Worker 
317*053f45beSAndroid Build Coastguard Worker /**
318*053f45beSAndroid Build Coastguard Worker  * FIXTURE_VARIANT_ADD() - Called once per fixture
319*053f45beSAndroid Build Coastguard Worker  * variant to setup and register the data
320*053f45beSAndroid Build Coastguard Worker  *
321*053f45beSAndroid Build Coastguard Worker  * @fixture_name: fixture name
322*053f45beSAndroid Build Coastguard Worker  * @variant_name: name of the parameter set
323*053f45beSAndroid Build Coastguard Worker  *
324*053f45beSAndroid Build Coastguard Worker  * .. code-block:: c
325*053f45beSAndroid Build Coastguard Worker  *
326*053f45beSAndroid Build Coastguard Worker  *     FIXTURE_VARIANT_ADD(fixture_name, variant_name) {
327*053f45beSAndroid Build Coastguard Worker  *       .property1 = val1,
328*053f45beSAndroid Build Coastguard Worker  *       ...
329*053f45beSAndroid Build Coastguard Worker  *     };
330*053f45beSAndroid Build Coastguard Worker  *
331*053f45beSAndroid Build Coastguard Worker  * Defines a variant of the test fixture, provided to FIXTURE_SETUP() and
332*053f45beSAndroid Build Coastguard Worker  * TEST_F() as *variant*. Tests of each fixture will be run once for each
333*053f45beSAndroid Build Coastguard Worker  * variant.
334*053f45beSAndroid Build Coastguard Worker  */
335*053f45beSAndroid Build Coastguard Worker #define FIXTURE_VARIANT_ADD(fixture_name, variant_name) \
336*053f45beSAndroid Build Coastguard Worker 	extern FIXTURE_VARIANT(fixture_name) \
337*053f45beSAndroid Build Coastguard Worker 		_##fixture_name##_##variant_name##_variant; \
338*053f45beSAndroid Build Coastguard Worker 	static struct __fixture_variant_metadata \
339*053f45beSAndroid Build Coastguard Worker 		_##fixture_name##_##variant_name##_object = \
340*053f45beSAndroid Build Coastguard Worker 		{ .name = #variant_name, \
341*053f45beSAndroid Build Coastguard Worker 		  .data = &_##fixture_name##_##variant_name##_variant}; \
342*053f45beSAndroid Build Coastguard Worker 	static void __attribute__((constructor)) \
343*053f45beSAndroid Build Coastguard Worker 		_register_##fixture_name##_##variant_name(void) \
344*053f45beSAndroid Build Coastguard Worker 	{ \
345*053f45beSAndroid Build Coastguard Worker 		__register_fixture_variant(&_##fixture_name##_fixture_object, \
346*053f45beSAndroid Build Coastguard Worker 			&_##fixture_name##_##variant_name##_object);	\
347*053f45beSAndroid Build Coastguard Worker 	} \
348*053f45beSAndroid Build Coastguard Worker 	FIXTURE_VARIANT(fixture_name) \
349*053f45beSAndroid Build Coastguard Worker 		_##fixture_name##_##variant_name##_variant =
350*053f45beSAndroid Build Coastguard Worker 
351*053f45beSAndroid Build Coastguard Worker /**
352*053f45beSAndroid Build Coastguard Worker  * TEST_F() - Emits test registration and helpers for
353*053f45beSAndroid Build Coastguard Worker  * fixture-based test cases
354*053f45beSAndroid Build Coastguard Worker  *
355*053f45beSAndroid Build Coastguard Worker  * @fixture_name: fixture name
356*053f45beSAndroid Build Coastguard Worker  * @test_name: test name
357*053f45beSAndroid Build Coastguard Worker  *
358*053f45beSAndroid Build Coastguard Worker  * .. code-block:: c
359*053f45beSAndroid Build Coastguard Worker  *
360*053f45beSAndroid Build Coastguard Worker  *     TEST_F(fixture, name) { implementation }
361*053f45beSAndroid Build Coastguard Worker  *
362*053f45beSAndroid Build Coastguard Worker  * Defines a test that depends on a fixture (e.g., is part of a test case).
363*053f45beSAndroid Build Coastguard Worker  * Very similar to TEST() except that *self* is the setup instance of fixture's
364*053f45beSAndroid Build Coastguard Worker  * datatype exposed for use by the implementation.
365*053f45beSAndroid Build Coastguard Worker  */
366*053f45beSAndroid Build Coastguard Worker #define TEST_F(fixture_name, test_name) \
367*053f45beSAndroid Build Coastguard Worker 	__TEST_F_IMPL(fixture_name, test_name, -1, TEST_TIMEOUT_DEFAULT)
368*053f45beSAndroid Build Coastguard Worker 
369*053f45beSAndroid Build Coastguard Worker #define TEST_F_SIGNAL(fixture_name, test_name, signal) \
370*053f45beSAndroid Build Coastguard Worker 	__TEST_F_IMPL(fixture_name, test_name, signal, TEST_TIMEOUT_DEFAULT)
371*053f45beSAndroid Build Coastguard Worker 
372*053f45beSAndroid Build Coastguard Worker #define TEST_F_TIMEOUT(fixture_name, test_name, timeout) \
373*053f45beSAndroid Build Coastguard Worker 	__TEST_F_IMPL(fixture_name, test_name, -1, timeout)
374*053f45beSAndroid Build Coastguard Worker 
375*053f45beSAndroid Build Coastguard Worker #define __TEST_F_IMPL(fixture_name, test_name, signal, tmout) \
376*053f45beSAndroid Build Coastguard Worker 	static void fixture_name##_##test_name( \
377*053f45beSAndroid Build Coastguard Worker 		struct __test_metadata *_metadata, \
378*053f45beSAndroid Build Coastguard Worker 		FIXTURE_DATA(fixture_name) *self, \
379*053f45beSAndroid Build Coastguard Worker 		const FIXTURE_VARIANT(fixture_name) *variant); \
380*053f45beSAndroid Build Coastguard Worker 	static inline void wrapper_##fixture_name##_##test_name( \
381*053f45beSAndroid Build Coastguard Worker 		struct __test_metadata *_metadata, \
382*053f45beSAndroid Build Coastguard Worker 		struct __fixture_variant_metadata *variant) \
383*053f45beSAndroid Build Coastguard Worker 	{ \
384*053f45beSAndroid Build Coastguard Worker 		/* fixture data is alloced, setup, and torn down per call. */ \
385*053f45beSAndroid Build Coastguard Worker 		FIXTURE_DATA(fixture_name) self; \
386*053f45beSAndroid Build Coastguard Worker 		memset(&self, 0, sizeof(FIXTURE_DATA(fixture_name))); \
387*053f45beSAndroid Build Coastguard Worker 		if (setjmp(_metadata->env) == 0) { \
388*053f45beSAndroid Build Coastguard Worker 			fixture_name##_setup(_metadata, &self, variant->data); \
389*053f45beSAndroid Build Coastguard Worker 			/* Let setup failure terminate early. */ \
390*053f45beSAndroid Build Coastguard Worker 			if (!_metadata->passed) \
391*053f45beSAndroid Build Coastguard Worker 				return; \
392*053f45beSAndroid Build Coastguard Worker 			_metadata->setup_completed = true; \
393*053f45beSAndroid Build Coastguard Worker 			fixture_name##_##test_name(_metadata, &self, variant->data); \
394*053f45beSAndroid Build Coastguard Worker 		} \
395*053f45beSAndroid Build Coastguard Worker 		if (_metadata->setup_completed) \
396*053f45beSAndroid Build Coastguard Worker 			fixture_name##_teardown(_metadata, &self, variant->data); \
397*053f45beSAndroid Build Coastguard Worker 		__test_check_assert(_metadata); \
398*053f45beSAndroid Build Coastguard Worker 	} \
399*053f45beSAndroid Build Coastguard Worker 	static struct __test_metadata \
400*053f45beSAndroid Build Coastguard Worker 		      _##fixture_name##_##test_name##_object = { \
401*053f45beSAndroid Build Coastguard Worker 		.name = #test_name, \
402*053f45beSAndroid Build Coastguard Worker 		.fn = &wrapper_##fixture_name##_##test_name, \
403*053f45beSAndroid Build Coastguard Worker 		.fixture = &_##fixture_name##_fixture_object, \
404*053f45beSAndroid Build Coastguard Worker 		.termsig = signal, \
405*053f45beSAndroid Build Coastguard Worker 		.timeout = tmout, \
406*053f45beSAndroid Build Coastguard Worker 	 }; \
407*053f45beSAndroid Build Coastguard Worker 	static void __attribute__((constructor)) \
408*053f45beSAndroid Build Coastguard Worker 			_register_##fixture_name##_##test_name(void) \
409*053f45beSAndroid Build Coastguard Worker 	{ \
410*053f45beSAndroid Build Coastguard Worker 		__register_test(&_##fixture_name##_##test_name##_object); \
411*053f45beSAndroid Build Coastguard Worker 	} \
412*053f45beSAndroid Build Coastguard Worker 	static void fixture_name##_##test_name( \
413*053f45beSAndroid Build Coastguard Worker 		struct __test_metadata __attribute__((unused)) *_metadata, \
414*053f45beSAndroid Build Coastguard Worker 		FIXTURE_DATA(fixture_name) __attribute__((unused)) *self, \
415*053f45beSAndroid Build Coastguard Worker 		const FIXTURE_VARIANT(fixture_name) \
416*053f45beSAndroid Build Coastguard Worker 			__attribute__((unused)) *variant)
417*053f45beSAndroid Build Coastguard Worker 
418*053f45beSAndroid Build Coastguard Worker /**
419*053f45beSAndroid Build Coastguard Worker  * TEST_HARNESS_MAIN - Simple wrapper to run the test harness
420*053f45beSAndroid Build Coastguard Worker  *
421*053f45beSAndroid Build Coastguard Worker  * .. code-block:: c
422*053f45beSAndroid Build Coastguard Worker  *
423*053f45beSAndroid Build Coastguard Worker  *     TEST_HARNESS_MAIN
424*053f45beSAndroid Build Coastguard Worker  *
425*053f45beSAndroid Build Coastguard Worker  * Use once to append a main() to the test file.
426*053f45beSAndroid Build Coastguard Worker  */
427*053f45beSAndroid Build Coastguard Worker #define TEST_HARNESS_MAIN \
428*053f45beSAndroid Build Coastguard Worker 	static void __attribute__((constructor)) \
429*053f45beSAndroid Build Coastguard Worker 	__constructor_order_last(void) \
430*053f45beSAndroid Build Coastguard Worker 	{ \
431*053f45beSAndroid Build Coastguard Worker 		if (!__constructor_order) \
432*053f45beSAndroid Build Coastguard Worker 			__constructor_order = _CONSTRUCTOR_ORDER_BACKWARD; \
433*053f45beSAndroid Build Coastguard Worker 	} \
434*053f45beSAndroid Build Coastguard Worker 	int main(int argc, char **argv) { \
435*053f45beSAndroid Build Coastguard Worker 		return test_harness_run(argc, argv); \
436*053f45beSAndroid Build Coastguard Worker 	}
437*053f45beSAndroid Build Coastguard Worker 
438*053f45beSAndroid Build Coastguard Worker /**
439*053f45beSAndroid Build Coastguard Worker  * DOC: operators
440*053f45beSAndroid Build Coastguard Worker  *
441*053f45beSAndroid Build Coastguard Worker  * Operators for use in TEST() and TEST_F().
442*053f45beSAndroid Build Coastguard Worker  * ASSERT_* calls will stop test execution immediately.
443*053f45beSAndroid Build Coastguard Worker  * EXPECT_* calls will emit a failure warning, note it, and continue.
444*053f45beSAndroid Build Coastguard Worker  */
445*053f45beSAndroid Build Coastguard Worker 
446*053f45beSAndroid Build Coastguard Worker /**
447*053f45beSAndroid Build Coastguard Worker  * ASSERT_EQ()
448*053f45beSAndroid Build Coastguard Worker  *
449*053f45beSAndroid Build Coastguard Worker  * @expected: expected value
450*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
451*053f45beSAndroid Build Coastguard Worker  *
452*053f45beSAndroid Build Coastguard Worker  * ASSERT_EQ(expected, measured): expected == measured
453*053f45beSAndroid Build Coastguard Worker  */
454*053f45beSAndroid Build Coastguard Worker #define ASSERT_EQ(expected, seen) \
455*053f45beSAndroid Build Coastguard Worker 	__EXPECT(expected, #expected, seen, #seen, ==, 1)
456*053f45beSAndroid Build Coastguard Worker 
457*053f45beSAndroid Build Coastguard Worker /**
458*053f45beSAndroid Build Coastguard Worker  * ASSERT_NE()
459*053f45beSAndroid Build Coastguard Worker  *
460*053f45beSAndroid Build Coastguard Worker  * @expected: expected value
461*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
462*053f45beSAndroid Build Coastguard Worker  *
463*053f45beSAndroid Build Coastguard Worker  * ASSERT_NE(expected, measured): expected != measured
464*053f45beSAndroid Build Coastguard Worker  */
465*053f45beSAndroid Build Coastguard Worker #define ASSERT_NE(expected, seen) \
466*053f45beSAndroid Build Coastguard Worker 	__EXPECT(expected, #expected, seen, #seen, !=, 1)
467*053f45beSAndroid Build Coastguard Worker 
468*053f45beSAndroid Build Coastguard Worker /**
469*053f45beSAndroid Build Coastguard Worker  * ASSERT_LT()
470*053f45beSAndroid Build Coastguard Worker  *
471*053f45beSAndroid Build Coastguard Worker  * @expected: expected value
472*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
473*053f45beSAndroid Build Coastguard Worker  *
474*053f45beSAndroid Build Coastguard Worker  * ASSERT_LT(expected, measured): expected < measured
475*053f45beSAndroid Build Coastguard Worker  */
476*053f45beSAndroid Build Coastguard Worker #define ASSERT_LT(expected, seen) \
477*053f45beSAndroid Build Coastguard Worker 	__EXPECT(expected, #expected, seen, #seen, <, 1)
478*053f45beSAndroid Build Coastguard Worker 
479*053f45beSAndroid Build Coastguard Worker /**
480*053f45beSAndroid Build Coastguard Worker  * ASSERT_LE()
481*053f45beSAndroid Build Coastguard Worker  *
482*053f45beSAndroid Build Coastguard Worker  * @expected: expected value
483*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
484*053f45beSAndroid Build Coastguard Worker  *
485*053f45beSAndroid Build Coastguard Worker  * ASSERT_LE(expected, measured): expected <= measured
486*053f45beSAndroid Build Coastguard Worker  */
487*053f45beSAndroid Build Coastguard Worker #define ASSERT_LE(expected, seen) \
488*053f45beSAndroid Build Coastguard Worker 	__EXPECT(expected, #expected, seen, #seen, <=, 1)
489*053f45beSAndroid Build Coastguard Worker 
490*053f45beSAndroid Build Coastguard Worker /**
491*053f45beSAndroid Build Coastguard Worker  * ASSERT_GT()
492*053f45beSAndroid Build Coastguard Worker  *
493*053f45beSAndroid Build Coastguard Worker  * @expected: expected value
494*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
495*053f45beSAndroid Build Coastguard Worker  *
496*053f45beSAndroid Build Coastguard Worker  * ASSERT_GT(expected, measured): expected > measured
497*053f45beSAndroid Build Coastguard Worker  */
498*053f45beSAndroid Build Coastguard Worker #define ASSERT_GT(expected, seen) \
499*053f45beSAndroid Build Coastguard Worker 	__EXPECT(expected, #expected, seen, #seen, >, 1)
500*053f45beSAndroid Build Coastguard Worker 
501*053f45beSAndroid Build Coastguard Worker /**
502*053f45beSAndroid Build Coastguard Worker  * ASSERT_GE()
503*053f45beSAndroid Build Coastguard Worker  *
504*053f45beSAndroid Build Coastguard Worker  * @expected: expected value
505*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
506*053f45beSAndroid Build Coastguard Worker  *
507*053f45beSAndroid Build Coastguard Worker  * ASSERT_GE(expected, measured): expected >= measured
508*053f45beSAndroid Build Coastguard Worker  */
509*053f45beSAndroid Build Coastguard Worker #define ASSERT_GE(expected, seen) \
510*053f45beSAndroid Build Coastguard Worker 	__EXPECT(expected, #expected, seen, #seen, >=, 1)
511*053f45beSAndroid Build Coastguard Worker 
512*053f45beSAndroid Build Coastguard Worker /**
513*053f45beSAndroid Build Coastguard Worker  * ASSERT_NULL()
514*053f45beSAndroid Build Coastguard Worker  *
515*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
516*053f45beSAndroid Build Coastguard Worker  *
517*053f45beSAndroid Build Coastguard Worker  * ASSERT_NULL(measured): NULL == measured
518*053f45beSAndroid Build Coastguard Worker  */
519*053f45beSAndroid Build Coastguard Worker #define ASSERT_NULL(seen) \
520*053f45beSAndroid Build Coastguard Worker 	__EXPECT(NULL, "NULL", seen, #seen, ==, 1)
521*053f45beSAndroid Build Coastguard Worker 
522*053f45beSAndroid Build Coastguard Worker /**
523*053f45beSAndroid Build Coastguard Worker  * ASSERT_TRUE()
524*053f45beSAndroid Build Coastguard Worker  *
525*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
526*053f45beSAndroid Build Coastguard Worker  *
527*053f45beSAndroid Build Coastguard Worker  * ASSERT_TRUE(measured): measured != 0
528*053f45beSAndroid Build Coastguard Worker  */
529*053f45beSAndroid Build Coastguard Worker #define ASSERT_TRUE(seen) \
530*053f45beSAndroid Build Coastguard Worker 	__EXPECT(0, "0", seen, #seen, !=, 1)
531*053f45beSAndroid Build Coastguard Worker 
532*053f45beSAndroid Build Coastguard Worker /**
533*053f45beSAndroid Build Coastguard Worker  * ASSERT_FALSE()
534*053f45beSAndroid Build Coastguard Worker  *
535*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
536*053f45beSAndroid Build Coastguard Worker  *
537*053f45beSAndroid Build Coastguard Worker  * ASSERT_FALSE(measured): measured == 0
538*053f45beSAndroid Build Coastguard Worker  */
539*053f45beSAndroid Build Coastguard Worker #define ASSERT_FALSE(seen) \
540*053f45beSAndroid Build Coastguard Worker 	__EXPECT(0, "0", seen, #seen, ==, 1)
541*053f45beSAndroid Build Coastguard Worker 
542*053f45beSAndroid Build Coastguard Worker /**
543*053f45beSAndroid Build Coastguard Worker  * ASSERT_STREQ()
544*053f45beSAndroid Build Coastguard Worker  *
545*053f45beSAndroid Build Coastguard Worker  * @expected: expected value
546*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
547*053f45beSAndroid Build Coastguard Worker  *
548*053f45beSAndroid Build Coastguard Worker  * ASSERT_STREQ(expected, measured): !strcmp(expected, measured)
549*053f45beSAndroid Build Coastguard Worker  */
550*053f45beSAndroid Build Coastguard Worker #define ASSERT_STREQ(expected, seen) \
551*053f45beSAndroid Build Coastguard Worker 	__EXPECT_STR(expected, seen, ==, 1)
552*053f45beSAndroid Build Coastguard Worker 
553*053f45beSAndroid Build Coastguard Worker /**
554*053f45beSAndroid Build Coastguard Worker  * ASSERT_STRNE()
555*053f45beSAndroid Build Coastguard Worker  *
556*053f45beSAndroid Build Coastguard Worker  * @expected: expected value
557*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
558*053f45beSAndroid Build Coastguard Worker  *
559*053f45beSAndroid Build Coastguard Worker  * ASSERT_STRNE(expected, measured): strcmp(expected, measured)
560*053f45beSAndroid Build Coastguard Worker  */
561*053f45beSAndroid Build Coastguard Worker #define ASSERT_STRNE(expected, seen) \
562*053f45beSAndroid Build Coastguard Worker 	__EXPECT_STR(expected, seen, !=, 1)
563*053f45beSAndroid Build Coastguard Worker 
564*053f45beSAndroid Build Coastguard Worker /**
565*053f45beSAndroid Build Coastguard Worker  * EXPECT_EQ()
566*053f45beSAndroid Build Coastguard Worker  *
567*053f45beSAndroid Build Coastguard Worker  * @expected: expected value
568*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
569*053f45beSAndroid Build Coastguard Worker  *
570*053f45beSAndroid Build Coastguard Worker  * EXPECT_EQ(expected, measured): expected == measured
571*053f45beSAndroid Build Coastguard Worker  */
572*053f45beSAndroid Build Coastguard Worker #define EXPECT_EQ(expected, seen) \
573*053f45beSAndroid Build Coastguard Worker 	__EXPECT(expected, #expected, seen, #seen, ==, 0)
574*053f45beSAndroid Build Coastguard Worker 
575*053f45beSAndroid Build Coastguard Worker /**
576*053f45beSAndroid Build Coastguard Worker  * EXPECT_NE()
577*053f45beSAndroid Build Coastguard Worker  *
578*053f45beSAndroid Build Coastguard Worker  * @expected: expected value
579*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
580*053f45beSAndroid Build Coastguard Worker  *
581*053f45beSAndroid Build Coastguard Worker  * EXPECT_NE(expected, measured): expected != measured
582*053f45beSAndroid Build Coastguard Worker  */
583*053f45beSAndroid Build Coastguard Worker #define EXPECT_NE(expected, seen) \
584*053f45beSAndroid Build Coastguard Worker 	__EXPECT(expected, #expected, seen, #seen, !=, 0)
585*053f45beSAndroid Build Coastguard Worker 
586*053f45beSAndroid Build Coastguard Worker /**
587*053f45beSAndroid Build Coastguard Worker  * EXPECT_LT()
588*053f45beSAndroid Build Coastguard Worker  *
589*053f45beSAndroid Build Coastguard Worker  * @expected: expected value
590*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
591*053f45beSAndroid Build Coastguard Worker  *
592*053f45beSAndroid Build Coastguard Worker  * EXPECT_LT(expected, measured): expected < measured
593*053f45beSAndroid Build Coastguard Worker  */
594*053f45beSAndroid Build Coastguard Worker #define EXPECT_LT(expected, seen) \
595*053f45beSAndroid Build Coastguard Worker 	__EXPECT(expected, #expected, seen, #seen, <, 0)
596*053f45beSAndroid Build Coastguard Worker 
597*053f45beSAndroid Build Coastguard Worker /**
598*053f45beSAndroid Build Coastguard Worker  * EXPECT_LE()
599*053f45beSAndroid Build Coastguard Worker  *
600*053f45beSAndroid Build Coastguard Worker  * @expected: expected value
601*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
602*053f45beSAndroid Build Coastguard Worker  *
603*053f45beSAndroid Build Coastguard Worker  * EXPECT_LE(expected, measured): expected <= measured
604*053f45beSAndroid Build Coastguard Worker  */
605*053f45beSAndroid Build Coastguard Worker #define EXPECT_LE(expected, seen) \
606*053f45beSAndroid Build Coastguard Worker 	__EXPECT(expected, #expected, seen, #seen, <=, 0)
607*053f45beSAndroid Build Coastguard Worker 
608*053f45beSAndroid Build Coastguard Worker /**
609*053f45beSAndroid Build Coastguard Worker  * EXPECT_GT()
610*053f45beSAndroid Build Coastguard Worker  *
611*053f45beSAndroid Build Coastguard Worker  * @expected: expected value
612*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
613*053f45beSAndroid Build Coastguard Worker  *
614*053f45beSAndroid Build Coastguard Worker  * EXPECT_GT(expected, measured): expected > measured
615*053f45beSAndroid Build Coastguard Worker  */
616*053f45beSAndroid Build Coastguard Worker #define EXPECT_GT(expected, seen) \
617*053f45beSAndroid Build Coastguard Worker 	__EXPECT(expected, #expected, seen, #seen, >, 0)
618*053f45beSAndroid Build Coastguard Worker 
619*053f45beSAndroid Build Coastguard Worker /**
620*053f45beSAndroid Build Coastguard Worker  * EXPECT_GE()
621*053f45beSAndroid Build Coastguard Worker  *
622*053f45beSAndroid Build Coastguard Worker  * @expected: expected value
623*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
624*053f45beSAndroid Build Coastguard Worker  *
625*053f45beSAndroid Build Coastguard Worker  * EXPECT_GE(expected, measured): expected >= measured
626*053f45beSAndroid Build Coastguard Worker  */
627*053f45beSAndroid Build Coastguard Worker #define EXPECT_GE(expected, seen) \
628*053f45beSAndroid Build Coastguard Worker 	__EXPECT(expected, #expected, seen, #seen, >=, 0)
629*053f45beSAndroid Build Coastguard Worker 
630*053f45beSAndroid Build Coastguard Worker /**
631*053f45beSAndroid Build Coastguard Worker  * EXPECT_NULL()
632*053f45beSAndroid Build Coastguard Worker  *
633*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
634*053f45beSAndroid Build Coastguard Worker  *
635*053f45beSAndroid Build Coastguard Worker  * EXPECT_NULL(measured): NULL == measured
636*053f45beSAndroid Build Coastguard Worker  */
637*053f45beSAndroid Build Coastguard Worker #define EXPECT_NULL(seen) \
638*053f45beSAndroid Build Coastguard Worker 	__EXPECT(NULL, "NULL", seen, #seen, ==, 0)
639*053f45beSAndroid Build Coastguard Worker 
640*053f45beSAndroid Build Coastguard Worker /**
641*053f45beSAndroid Build Coastguard Worker  * EXPECT_TRUE()
642*053f45beSAndroid Build Coastguard Worker  *
643*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
644*053f45beSAndroid Build Coastguard Worker  *
645*053f45beSAndroid Build Coastguard Worker  * EXPECT_TRUE(measured): 0 != measured
646*053f45beSAndroid Build Coastguard Worker  */
647*053f45beSAndroid Build Coastguard Worker #define EXPECT_TRUE(seen) \
648*053f45beSAndroid Build Coastguard Worker 	__EXPECT(0, "0", seen, #seen, !=, 0)
649*053f45beSAndroid Build Coastguard Worker 
650*053f45beSAndroid Build Coastguard Worker /**
651*053f45beSAndroid Build Coastguard Worker  * EXPECT_FALSE()
652*053f45beSAndroid Build Coastguard Worker  *
653*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
654*053f45beSAndroid Build Coastguard Worker  *
655*053f45beSAndroid Build Coastguard Worker  * EXPECT_FALSE(measured): 0 == measured
656*053f45beSAndroid Build Coastguard Worker  */
657*053f45beSAndroid Build Coastguard Worker #define EXPECT_FALSE(seen) \
658*053f45beSAndroid Build Coastguard Worker 	__EXPECT(0, "0", seen, #seen, ==, 0)
659*053f45beSAndroid Build Coastguard Worker 
660*053f45beSAndroid Build Coastguard Worker /**
661*053f45beSAndroid Build Coastguard Worker  * EXPECT_STREQ()
662*053f45beSAndroid Build Coastguard Worker  *
663*053f45beSAndroid Build Coastguard Worker  * @expected: expected value
664*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
665*053f45beSAndroid Build Coastguard Worker  *
666*053f45beSAndroid Build Coastguard Worker  * EXPECT_STREQ(expected, measured): !strcmp(expected, measured)
667*053f45beSAndroid Build Coastguard Worker  */
668*053f45beSAndroid Build Coastguard Worker #define EXPECT_STREQ(expected, seen) \
669*053f45beSAndroid Build Coastguard Worker 	__EXPECT_STR(expected, seen, ==, 0)
670*053f45beSAndroid Build Coastguard Worker 
671*053f45beSAndroid Build Coastguard Worker /**
672*053f45beSAndroid Build Coastguard Worker  * EXPECT_STRNE()
673*053f45beSAndroid Build Coastguard Worker  *
674*053f45beSAndroid Build Coastguard Worker  * @expected: expected value
675*053f45beSAndroid Build Coastguard Worker  * @seen: measured value
676*053f45beSAndroid Build Coastguard Worker  *
677*053f45beSAndroid Build Coastguard Worker  * EXPECT_STRNE(expected, measured): strcmp(expected, measured)
678*053f45beSAndroid Build Coastguard Worker  */
679*053f45beSAndroid Build Coastguard Worker #define EXPECT_STRNE(expected, seen) \
680*053f45beSAndroid Build Coastguard Worker 	__EXPECT_STR(expected, seen, !=, 0)
681*053f45beSAndroid Build Coastguard Worker 
682*053f45beSAndroid Build Coastguard Worker #ifndef ARRAY_SIZE
683*053f45beSAndroid Build Coastguard Worker #define ARRAY_SIZE(a)	(sizeof(a) / sizeof(a[0]))
684*053f45beSAndroid Build Coastguard Worker #endif
685*053f45beSAndroid Build Coastguard Worker 
686*053f45beSAndroid Build Coastguard Worker /* Support an optional handler after and ASSERT_* or EXPECT_*.  The approach is
687*053f45beSAndroid Build Coastguard Worker  * not thread-safe, but it should be fine in most sane test scenarios.
688*053f45beSAndroid Build Coastguard Worker  *
689*053f45beSAndroid Build Coastguard Worker  * Using __bail(), which optionally abort()s, is the easiest way to early
690*053f45beSAndroid Build Coastguard Worker  * return while still providing an optional block to the API consumer.
691*053f45beSAndroid Build Coastguard Worker  */
692*053f45beSAndroid Build Coastguard Worker #define OPTIONAL_HANDLER(_assert) \
693*053f45beSAndroid Build Coastguard Worker 	for (; _metadata->trigger; _metadata->trigger = \
694*053f45beSAndroid Build Coastguard Worker 			__bail(_assert, _metadata))
695*053f45beSAndroid Build Coastguard Worker 
696*053f45beSAndroid Build Coastguard Worker #define __INC_STEP(_metadata) \
697*053f45beSAndroid Build Coastguard Worker 	/* Keep "step" below 255 (which is used for "SKIP" reporting). */	\
698*053f45beSAndroid Build Coastguard Worker 	if (_metadata->passed && _metadata->step < 253) \
699*053f45beSAndroid Build Coastguard Worker 		_metadata->step++;
700*053f45beSAndroid Build Coastguard Worker 
701*053f45beSAndroid Build Coastguard Worker #define is_signed_type(var)       (!!(((__typeof__(var))(-1)) < (__typeof__(var))1))
702*053f45beSAndroid Build Coastguard Worker 
703*053f45beSAndroid Build Coastguard Worker #define __EXPECT(_expected, _expected_str, _seen, _seen_str, _t, _assert) do { \
704*053f45beSAndroid Build Coastguard Worker 	/* Avoid multiple evaluation of the cases */ \
705*053f45beSAndroid Build Coastguard Worker 	__typeof__(_expected) __exp = (_expected); \
706*053f45beSAndroid Build Coastguard Worker 	__typeof__(_seen) __seen = (_seen); \
707*053f45beSAndroid Build Coastguard Worker 	if (_assert) __INC_STEP(_metadata); \
708*053f45beSAndroid Build Coastguard Worker 	if (!(__exp _t __seen)) { \
709*053f45beSAndroid Build Coastguard Worker 		/* Report with actual signedness to avoid weird output. */ \
710*053f45beSAndroid Build Coastguard Worker 		switch (is_signed_type(__exp) * 2 + is_signed_type(__seen)) { \
711*053f45beSAndroid Build Coastguard Worker 		case 0: { \
712*053f45beSAndroid Build Coastguard Worker 			unsigned long long __exp_print = (uintptr_t)__exp; \
713*053f45beSAndroid Build Coastguard Worker 			unsigned long long __seen_print = (uintptr_t)__seen; \
714*053f45beSAndroid Build Coastguard Worker 			__TH_LOG("Expected %s (%llu) %s %s (%llu)", \
715*053f45beSAndroid Build Coastguard Worker 				 _expected_str, __exp_print, #_t, \
716*053f45beSAndroid Build Coastguard Worker 				 _seen_str, __seen_print); \
717*053f45beSAndroid Build Coastguard Worker 			break; \
718*053f45beSAndroid Build Coastguard Worker 			} \
719*053f45beSAndroid Build Coastguard Worker 		case 1: { \
720*053f45beSAndroid Build Coastguard Worker 			unsigned long long __exp_print = (uintptr_t)__exp; \
721*053f45beSAndroid Build Coastguard Worker 			long long __seen_print = (intptr_t)__seen; \
722*053f45beSAndroid Build Coastguard Worker 			__TH_LOG("Expected %s (%llu) %s %s (%lld)", \
723*053f45beSAndroid Build Coastguard Worker 				 _expected_str, __exp_print, #_t, \
724*053f45beSAndroid Build Coastguard Worker 				 _seen_str, __seen_print); \
725*053f45beSAndroid Build Coastguard Worker 			break; \
726*053f45beSAndroid Build Coastguard Worker 			} \
727*053f45beSAndroid Build Coastguard Worker 		case 2: { \
728*053f45beSAndroid Build Coastguard Worker 			long long __exp_print = (intptr_t)__exp; \
729*053f45beSAndroid Build Coastguard Worker 			unsigned long long __seen_print = (uintptr_t)__seen; \
730*053f45beSAndroid Build Coastguard Worker 			__TH_LOG("Expected %s (%lld) %s %s (%llu)", \
731*053f45beSAndroid Build Coastguard Worker 				 _expected_str, __exp_print, #_t, \
732*053f45beSAndroid Build Coastguard Worker 				 _seen_str, __seen_print); \
733*053f45beSAndroid Build Coastguard Worker 			break; \
734*053f45beSAndroid Build Coastguard Worker 			} \
735*053f45beSAndroid Build Coastguard Worker 		case 3: { \
736*053f45beSAndroid Build Coastguard Worker 			long long __exp_print = (intptr_t)__exp; \
737*053f45beSAndroid Build Coastguard Worker 			long long __seen_print = (intptr_t)__seen; \
738*053f45beSAndroid Build Coastguard Worker 			__TH_LOG("Expected %s (%lld) %s %s (%lld)", \
739*053f45beSAndroid Build Coastguard Worker 				 _expected_str, __exp_print, #_t, \
740*053f45beSAndroid Build Coastguard Worker 				 _seen_str, __seen_print); \
741*053f45beSAndroid Build Coastguard Worker 			break; \
742*053f45beSAndroid Build Coastguard Worker 			} \
743*053f45beSAndroid Build Coastguard Worker 		} \
744*053f45beSAndroid Build Coastguard Worker 		_metadata->passed = 0; \
745*053f45beSAndroid Build Coastguard Worker 		/* Ensure the optional handler is triggered */ \
746*053f45beSAndroid Build Coastguard Worker 		_metadata->trigger = 1; \
747*053f45beSAndroid Build Coastguard Worker 	} \
748*053f45beSAndroid Build Coastguard Worker } while (0); OPTIONAL_HANDLER(_assert)
749*053f45beSAndroid Build Coastguard Worker 
750*053f45beSAndroid Build Coastguard Worker #define __EXPECT_STR(_expected, _seen, _t, _assert) do { \
751*053f45beSAndroid Build Coastguard Worker 	const char *__exp = (_expected); \
752*053f45beSAndroid Build Coastguard Worker 	const char *__seen = (_seen); \
753*053f45beSAndroid Build Coastguard Worker 	if (_assert) __INC_STEP(_metadata); \
754*053f45beSAndroid Build Coastguard Worker 	if (!(strcmp(__exp, __seen) _t 0))  { \
755*053f45beSAndroid Build Coastguard Worker 		__TH_LOG("Expected '%s' %s '%s'.", __exp, #_t, __seen); \
756*053f45beSAndroid Build Coastguard Worker 		_metadata->passed = 0; \
757*053f45beSAndroid Build Coastguard Worker 		_metadata->trigger = 1; \
758*053f45beSAndroid Build Coastguard Worker 	} \
759*053f45beSAndroid Build Coastguard Worker } while (0); OPTIONAL_HANDLER(_assert)
760*053f45beSAndroid Build Coastguard Worker 
761*053f45beSAndroid Build Coastguard Worker /* List helpers */
762*053f45beSAndroid Build Coastguard Worker #define __LIST_APPEND(head, item) \
763*053f45beSAndroid Build Coastguard Worker { \
764*053f45beSAndroid Build Coastguard Worker 	/* Circular linked list where only prev is circular. */ \
765*053f45beSAndroid Build Coastguard Worker 	if (head == NULL) { \
766*053f45beSAndroid Build Coastguard Worker 		head = item; \
767*053f45beSAndroid Build Coastguard Worker 		item->next = NULL; \
768*053f45beSAndroid Build Coastguard Worker 		item->prev = item; \
769*053f45beSAndroid Build Coastguard Worker 		return;	\
770*053f45beSAndroid Build Coastguard Worker 	} \
771*053f45beSAndroid Build Coastguard Worker 	if (__constructor_order == _CONSTRUCTOR_ORDER_FORWARD) { \
772*053f45beSAndroid Build Coastguard Worker 		item->next = NULL; \
773*053f45beSAndroid Build Coastguard Worker 		item->prev = head->prev; \
774*053f45beSAndroid Build Coastguard Worker 		item->prev->next = item; \
775*053f45beSAndroid Build Coastguard Worker 		head->prev = item; \
776*053f45beSAndroid Build Coastguard Worker 	} else { \
777*053f45beSAndroid Build Coastguard Worker 		item->next = head; \
778*053f45beSAndroid Build Coastguard Worker 		item->next->prev = item; \
779*053f45beSAndroid Build Coastguard Worker 		item->prev = item; \
780*053f45beSAndroid Build Coastguard Worker 		head = item; \
781*053f45beSAndroid Build Coastguard Worker 	} \
782*053f45beSAndroid Build Coastguard Worker }
783*053f45beSAndroid Build Coastguard Worker 
784*053f45beSAndroid Build Coastguard Worker struct __test_results {
785*053f45beSAndroid Build Coastguard Worker 	char reason[1024];	/* Reason for test result */
786*053f45beSAndroid Build Coastguard Worker };
787*053f45beSAndroid Build Coastguard Worker 
788*053f45beSAndroid Build Coastguard Worker struct __test_metadata;
789*053f45beSAndroid Build Coastguard Worker struct __fixture_variant_metadata;
790*053f45beSAndroid Build Coastguard Worker 
791*053f45beSAndroid Build Coastguard Worker /* Contains all the information about a fixture. */
792*053f45beSAndroid Build Coastguard Worker struct __fixture_metadata {
793*053f45beSAndroid Build Coastguard Worker 	const char *name;
794*053f45beSAndroid Build Coastguard Worker 	struct __test_metadata *tests;
795*053f45beSAndroid Build Coastguard Worker 	struct __fixture_variant_metadata *variant;
796*053f45beSAndroid Build Coastguard Worker 	struct __fixture_metadata *prev, *next;
797*053f45beSAndroid Build Coastguard Worker } _fixture_global __attribute__((unused)) = {
798*053f45beSAndroid Build Coastguard Worker 	.name = "global",
799*053f45beSAndroid Build Coastguard Worker 	.prev = &_fixture_global,
800*053f45beSAndroid Build Coastguard Worker };
801*053f45beSAndroid Build Coastguard Worker 
802*053f45beSAndroid Build Coastguard Worker static struct __fixture_metadata *__fixture_list = &_fixture_global;
803*053f45beSAndroid Build Coastguard Worker static int __constructor_order;
804*053f45beSAndroid Build Coastguard Worker 
805*053f45beSAndroid Build Coastguard Worker #define _CONSTRUCTOR_ORDER_FORWARD   1
806*053f45beSAndroid Build Coastguard Worker #define _CONSTRUCTOR_ORDER_BACKWARD -1
807*053f45beSAndroid Build Coastguard Worker 
__register_fixture(struct __fixture_metadata * f)808*053f45beSAndroid Build Coastguard Worker static inline void __register_fixture(struct __fixture_metadata *f)
809*053f45beSAndroid Build Coastguard Worker {
810*053f45beSAndroid Build Coastguard Worker 	__LIST_APPEND(__fixture_list, f);
811*053f45beSAndroid Build Coastguard Worker }
812*053f45beSAndroid Build Coastguard Worker 
813*053f45beSAndroid Build Coastguard Worker struct __fixture_variant_metadata {
814*053f45beSAndroid Build Coastguard Worker 	const char *name;
815*053f45beSAndroid Build Coastguard Worker 	const void *data;
816*053f45beSAndroid Build Coastguard Worker 	struct __fixture_variant_metadata *prev, *next;
817*053f45beSAndroid Build Coastguard Worker };
818*053f45beSAndroid Build Coastguard Worker 
819*053f45beSAndroid Build Coastguard Worker static inline void
__register_fixture_variant(struct __fixture_metadata * f,struct __fixture_variant_metadata * variant)820*053f45beSAndroid Build Coastguard Worker __register_fixture_variant(struct __fixture_metadata *f,
821*053f45beSAndroid Build Coastguard Worker 			   struct __fixture_variant_metadata *variant)
822*053f45beSAndroid Build Coastguard Worker {
823*053f45beSAndroid Build Coastguard Worker 	__LIST_APPEND(f->variant, variant);
824*053f45beSAndroid Build Coastguard Worker }
825*053f45beSAndroid Build Coastguard Worker 
826*053f45beSAndroid Build Coastguard Worker /* Contains all the information for test execution and status checking. */
827*053f45beSAndroid Build Coastguard Worker struct __test_metadata {
828*053f45beSAndroid Build Coastguard Worker 	const char *name;
829*053f45beSAndroid Build Coastguard Worker 	void (*fn)(struct __test_metadata *,
830*053f45beSAndroid Build Coastguard Worker 		   struct __fixture_variant_metadata *);
831*053f45beSAndroid Build Coastguard Worker 	pid_t pid;	/* pid of test when being run */
832*053f45beSAndroid Build Coastguard Worker 	struct __fixture_metadata *fixture;
833*053f45beSAndroid Build Coastguard Worker 	int termsig;
834*053f45beSAndroid Build Coastguard Worker 	int passed;
835*053f45beSAndroid Build Coastguard Worker 	int skip;	/* did SKIP get used? */
836*053f45beSAndroid Build Coastguard Worker 	int trigger; /* extra handler after the evaluation */
837*053f45beSAndroid Build Coastguard Worker 	int timeout;	/* seconds to wait for test timeout */
838*053f45beSAndroid Build Coastguard Worker 	bool timed_out;	/* did this test timeout instead of exiting? */
839*053f45beSAndroid Build Coastguard Worker 	__u8 step;
840*053f45beSAndroid Build Coastguard Worker 	bool no_print; /* manual trigger when TH_LOG_STREAM is not available */
841*053f45beSAndroid Build Coastguard Worker 	bool aborted;	/* stopped test due to failed ASSERT */
842*053f45beSAndroid Build Coastguard Worker 	bool setup_completed; /* did setup finish? */
843*053f45beSAndroid Build Coastguard Worker 	jmp_buf env;	/* for exiting out of test early */
844*053f45beSAndroid Build Coastguard Worker 	struct __test_results *results;
845*053f45beSAndroid Build Coastguard Worker 	struct __test_metadata *prev, *next;
846*053f45beSAndroid Build Coastguard Worker };
847*053f45beSAndroid Build Coastguard Worker 
848*053f45beSAndroid Build Coastguard Worker /*
849*053f45beSAndroid Build Coastguard Worker  * Since constructors are called in reverse order, reverse the test
850*053f45beSAndroid Build Coastguard Worker  * list so tests are run in source declaration order.
851*053f45beSAndroid Build Coastguard Worker  * https://gcc.gnu.org/onlinedocs/gccint/Initialization.html
852*053f45beSAndroid Build Coastguard Worker  * However, it seems not all toolchains do this correctly, so use
853*053f45beSAndroid Build Coastguard Worker  * __constructor_order to detect which direction is called first
854*053f45beSAndroid Build Coastguard Worker  * and adjust list building logic to get things running in the right
855*053f45beSAndroid Build Coastguard Worker  * direction.
856*053f45beSAndroid Build Coastguard Worker  */
__register_test(struct __test_metadata * t)857*053f45beSAndroid Build Coastguard Worker static inline void __register_test(struct __test_metadata *t)
858*053f45beSAndroid Build Coastguard Worker {
859*053f45beSAndroid Build Coastguard Worker 	__LIST_APPEND(t->fixture->tests, t);
860*053f45beSAndroid Build Coastguard Worker }
861*053f45beSAndroid Build Coastguard Worker 
__bail(int for_realz,struct __test_metadata * t)862*053f45beSAndroid Build Coastguard Worker static inline int __bail(int for_realz, struct __test_metadata *t)
863*053f45beSAndroid Build Coastguard Worker {
864*053f45beSAndroid Build Coastguard Worker 	/* if this is ASSERT, return immediately. */
865*053f45beSAndroid Build Coastguard Worker 	if (for_realz) {
866*053f45beSAndroid Build Coastguard Worker 		t->aborted = true;
867*053f45beSAndroid Build Coastguard Worker 		longjmp(t->env, 1);
868*053f45beSAndroid Build Coastguard Worker 	}
869*053f45beSAndroid Build Coastguard Worker 	/* otherwise, end the for loop and continue. */
870*053f45beSAndroid Build Coastguard Worker 	return 0;
871*053f45beSAndroid Build Coastguard Worker }
872*053f45beSAndroid Build Coastguard Worker 
__test_check_assert(struct __test_metadata * t)873*053f45beSAndroid Build Coastguard Worker static inline void __test_check_assert(struct __test_metadata *t)
874*053f45beSAndroid Build Coastguard Worker {
875*053f45beSAndroid Build Coastguard Worker 	if (t->aborted) {
876*053f45beSAndroid Build Coastguard Worker 		if (t->no_print)
877*053f45beSAndroid Build Coastguard Worker 			_exit(t->step);
878*053f45beSAndroid Build Coastguard Worker 		abort();
879*053f45beSAndroid Build Coastguard Worker 	}
880*053f45beSAndroid Build Coastguard Worker }
881*053f45beSAndroid Build Coastguard Worker 
882*053f45beSAndroid Build Coastguard Worker struct __test_metadata *__active_test;
__timeout_handler(int sig,siginfo_t * info,void * ucontext)883*053f45beSAndroid Build Coastguard Worker static void __timeout_handler(int sig, siginfo_t *info, void *ucontext)
884*053f45beSAndroid Build Coastguard Worker {
885*053f45beSAndroid Build Coastguard Worker 	struct __test_metadata *t = __active_test;
886*053f45beSAndroid Build Coastguard Worker 
887*053f45beSAndroid Build Coastguard Worker 	/* Sanity check handler execution environment. */
888*053f45beSAndroid Build Coastguard Worker 	if (!t) {
889*053f45beSAndroid Build Coastguard Worker 		fprintf(TH_LOG_STREAM,
890*053f45beSAndroid Build Coastguard Worker 			"# no active test in SIGALRM handler!?\n");
891*053f45beSAndroid Build Coastguard Worker 		abort();
892*053f45beSAndroid Build Coastguard Worker 	}
893*053f45beSAndroid Build Coastguard Worker 	if (sig != SIGALRM || sig != info->si_signo) {
894*053f45beSAndroid Build Coastguard Worker 		fprintf(TH_LOG_STREAM,
895*053f45beSAndroid Build Coastguard Worker 			"# %s: SIGALRM handler caught signal %d!?\n",
896*053f45beSAndroid Build Coastguard Worker 			t->name, sig != SIGALRM ? sig : info->si_signo);
897*053f45beSAndroid Build Coastguard Worker 		abort();
898*053f45beSAndroid Build Coastguard Worker 	}
899*053f45beSAndroid Build Coastguard Worker 
900*053f45beSAndroid Build Coastguard Worker 	t->timed_out = true;
901*053f45beSAndroid Build Coastguard Worker 	// signal process group
902*053f45beSAndroid Build Coastguard Worker 	kill(-(t->pid), SIGKILL);
903*053f45beSAndroid Build Coastguard Worker }
904*053f45beSAndroid Build Coastguard Worker 
__wait_for_test(struct __test_metadata * t)905*053f45beSAndroid Build Coastguard Worker void __wait_for_test(struct __test_metadata *t)
906*053f45beSAndroid Build Coastguard Worker {
907*053f45beSAndroid Build Coastguard Worker 	struct sigaction action = {
908*053f45beSAndroid Build Coastguard Worker 		.sa_sigaction = __timeout_handler,
909*053f45beSAndroid Build Coastguard Worker 		.sa_flags = SA_SIGINFO,
910*053f45beSAndroid Build Coastguard Worker 	};
911*053f45beSAndroid Build Coastguard Worker 	struct sigaction saved_action;
912*053f45beSAndroid Build Coastguard Worker 	int status;
913*053f45beSAndroid Build Coastguard Worker 
914*053f45beSAndroid Build Coastguard Worker 	if (sigaction(SIGALRM, &action, &saved_action)) {
915*053f45beSAndroid Build Coastguard Worker 		t->passed = 0;
916*053f45beSAndroid Build Coastguard Worker 		fprintf(TH_LOG_STREAM,
917*053f45beSAndroid Build Coastguard Worker 			"# %s: unable to install SIGALRM handler\n",
918*053f45beSAndroid Build Coastguard Worker 			t->name);
919*053f45beSAndroid Build Coastguard Worker 		return;
920*053f45beSAndroid Build Coastguard Worker 	}
921*053f45beSAndroid Build Coastguard Worker 	__active_test = t;
922*053f45beSAndroid Build Coastguard Worker 	t->timed_out = false;
923*053f45beSAndroid Build Coastguard Worker 	alarm(t->timeout);
924*053f45beSAndroid Build Coastguard Worker 	waitpid(t->pid, &status, 0);
925*053f45beSAndroid Build Coastguard Worker 	alarm(0);
926*053f45beSAndroid Build Coastguard Worker 	if (sigaction(SIGALRM, &saved_action, NULL)) {
927*053f45beSAndroid Build Coastguard Worker 		t->passed = 0;
928*053f45beSAndroid Build Coastguard Worker 		fprintf(TH_LOG_STREAM,
929*053f45beSAndroid Build Coastguard Worker 			"# %s: unable to uninstall SIGALRM handler\n",
930*053f45beSAndroid Build Coastguard Worker 			t->name);
931*053f45beSAndroid Build Coastguard Worker 		return;
932*053f45beSAndroid Build Coastguard Worker 	}
933*053f45beSAndroid Build Coastguard Worker 	__active_test = NULL;
934*053f45beSAndroid Build Coastguard Worker 
935*053f45beSAndroid Build Coastguard Worker 	if (t->timed_out) {
936*053f45beSAndroid Build Coastguard Worker 		t->passed = 0;
937*053f45beSAndroid Build Coastguard Worker 		fprintf(TH_LOG_STREAM,
938*053f45beSAndroid Build Coastguard Worker 			"# %s: Test terminated by timeout\n", t->name);
939*053f45beSAndroid Build Coastguard Worker 	} else if (WIFEXITED(status)) {
940*053f45beSAndroid Build Coastguard Worker 		if (t->termsig != -1) {
941*053f45beSAndroid Build Coastguard Worker 			t->passed = 0;
942*053f45beSAndroid Build Coastguard Worker 			fprintf(TH_LOG_STREAM,
943*053f45beSAndroid Build Coastguard Worker 				"# %s: Test exited normally instead of by signal (code: %d)\n",
944*053f45beSAndroid Build Coastguard Worker 				t->name,
945*053f45beSAndroid Build Coastguard Worker 				WEXITSTATUS(status));
946*053f45beSAndroid Build Coastguard Worker 		} else {
947*053f45beSAndroid Build Coastguard Worker 			switch (WEXITSTATUS(status)) {
948*053f45beSAndroid Build Coastguard Worker 			/* Success */
949*053f45beSAndroid Build Coastguard Worker 			case 0:
950*053f45beSAndroid Build Coastguard Worker 				t->passed = 1;
951*053f45beSAndroid Build Coastguard Worker 				break;
952*053f45beSAndroid Build Coastguard Worker 			/* SKIP */
953*053f45beSAndroid Build Coastguard Worker 			case 255:
954*053f45beSAndroid Build Coastguard Worker 				t->passed = 1;
955*053f45beSAndroid Build Coastguard Worker 				t->skip = 1;
956*053f45beSAndroid Build Coastguard Worker 				break;
957*053f45beSAndroid Build Coastguard Worker 			/* Other failure, assume step report. */
958*053f45beSAndroid Build Coastguard Worker 			default:
959*053f45beSAndroid Build Coastguard Worker 				t->passed = 0;
960*053f45beSAndroid Build Coastguard Worker 				fprintf(TH_LOG_STREAM,
961*053f45beSAndroid Build Coastguard Worker 					"# %s: Test failed at step #%d\n",
962*053f45beSAndroid Build Coastguard Worker 					t->name,
963*053f45beSAndroid Build Coastguard Worker 					WEXITSTATUS(status));
964*053f45beSAndroid Build Coastguard Worker 			}
965*053f45beSAndroid Build Coastguard Worker 		}
966*053f45beSAndroid Build Coastguard Worker 	} else if (WIFSIGNALED(status)) {
967*053f45beSAndroid Build Coastguard Worker 		t->passed = 0;
968*053f45beSAndroid Build Coastguard Worker 		if (WTERMSIG(status) == SIGABRT) {
969*053f45beSAndroid Build Coastguard Worker 			fprintf(TH_LOG_STREAM,
970*053f45beSAndroid Build Coastguard Worker 				"# %s: Test terminated by assertion\n",
971*053f45beSAndroid Build Coastguard Worker 				t->name);
972*053f45beSAndroid Build Coastguard Worker 		} else if (WTERMSIG(status) == t->termsig) {
973*053f45beSAndroid Build Coastguard Worker 			t->passed = 1;
974*053f45beSAndroid Build Coastguard Worker 		} else {
975*053f45beSAndroid Build Coastguard Worker 			fprintf(TH_LOG_STREAM,
976*053f45beSAndroid Build Coastguard Worker 				"# %s: Test terminated unexpectedly by signal %d\n",
977*053f45beSAndroid Build Coastguard Worker 				t->name,
978*053f45beSAndroid Build Coastguard Worker 				WTERMSIG(status));
979*053f45beSAndroid Build Coastguard Worker 		}
980*053f45beSAndroid Build Coastguard Worker 	} else {
981*053f45beSAndroid Build Coastguard Worker 		fprintf(TH_LOG_STREAM,
982*053f45beSAndroid Build Coastguard Worker 			"# %s: Test ended in some other way [%u]\n",
983*053f45beSAndroid Build Coastguard Worker 			t->name,
984*053f45beSAndroid Build Coastguard Worker 			status);
985*053f45beSAndroid Build Coastguard Worker 	}
986*053f45beSAndroid Build Coastguard Worker }
987*053f45beSAndroid Build Coastguard Worker 
__run_test(struct __fixture_metadata * f,struct __fixture_variant_metadata * variant,struct __test_metadata * t)988*053f45beSAndroid Build Coastguard Worker void __run_test(struct __fixture_metadata *f,
989*053f45beSAndroid Build Coastguard Worker 		struct __fixture_variant_metadata *variant,
990*053f45beSAndroid Build Coastguard Worker 		struct __test_metadata *t)
991*053f45beSAndroid Build Coastguard Worker {
992*053f45beSAndroid Build Coastguard Worker 	/* reset test struct */
993*053f45beSAndroid Build Coastguard Worker 	t->passed = 1;
994*053f45beSAndroid Build Coastguard Worker 	t->skip = 0;
995*053f45beSAndroid Build Coastguard Worker 	t->trigger = 0;
996*053f45beSAndroid Build Coastguard Worker 	t->step = 1;
997*053f45beSAndroid Build Coastguard Worker 	t->no_print = 0;
998*053f45beSAndroid Build Coastguard Worker 	memset(t->results->reason, 0, sizeof(t->results->reason));
999*053f45beSAndroid Build Coastguard Worker 
1000*053f45beSAndroid Build Coastguard Worker 	ksft_print_msg(" RUN           %s%s%s.%s ...\n",
1001*053f45beSAndroid Build Coastguard Worker 	       f->name, variant->name[0] ? "." : "", variant->name, t->name);
1002*053f45beSAndroid Build Coastguard Worker 
1003*053f45beSAndroid Build Coastguard Worker 	/* Make sure output buffers are flushed before fork */
1004*053f45beSAndroid Build Coastguard Worker 	fflush(stdout);
1005*053f45beSAndroid Build Coastguard Worker 	fflush(stderr);
1006*053f45beSAndroid Build Coastguard Worker 
1007*053f45beSAndroid Build Coastguard Worker 	t->pid = fork();
1008*053f45beSAndroid Build Coastguard Worker 	if (t->pid < 0) {
1009*053f45beSAndroid Build Coastguard Worker 		ksft_print_msg("ERROR SPAWNING TEST CHILD\n");
1010*053f45beSAndroid Build Coastguard Worker 		t->passed = 0;
1011*053f45beSAndroid Build Coastguard Worker 	} else if (t->pid == 0) {
1012*053f45beSAndroid Build Coastguard Worker 		setpgrp();
1013*053f45beSAndroid Build Coastguard Worker 		t->fn(t, variant);
1014*053f45beSAndroid Build Coastguard Worker 		if (t->skip)
1015*053f45beSAndroid Build Coastguard Worker 			_exit(255);
1016*053f45beSAndroid Build Coastguard Worker 		/* Pass is exit 0 */
1017*053f45beSAndroid Build Coastguard Worker 		if (t->passed)
1018*053f45beSAndroid Build Coastguard Worker 			_exit(0);
1019*053f45beSAndroid Build Coastguard Worker 		/* Something else happened, report the step. */
1020*053f45beSAndroid Build Coastguard Worker 		_exit(t->step);
1021*053f45beSAndroid Build Coastguard Worker 	} else {
1022*053f45beSAndroid Build Coastguard Worker 		__wait_for_test(t);
1023*053f45beSAndroid Build Coastguard Worker 	}
1024*053f45beSAndroid Build Coastguard Worker 	ksft_print_msg("         %4s  %s%s%s.%s\n", t->passed ? "OK" : "FAIL",
1025*053f45beSAndroid Build Coastguard Worker 	       f->name, variant->name[0] ? "." : "", variant->name, t->name);
1026*053f45beSAndroid Build Coastguard Worker 
1027*053f45beSAndroid Build Coastguard Worker 	if (t->skip)
1028*053f45beSAndroid Build Coastguard Worker 		ksft_test_result_skip("%s\n", t->results->reason[0] ?
1029*053f45beSAndroid Build Coastguard Worker 					t->results->reason : "unknown");
1030*053f45beSAndroid Build Coastguard Worker 	else
1031*053f45beSAndroid Build Coastguard Worker 		ksft_test_result(t->passed, "%s%s%s.%s\n",
1032*053f45beSAndroid Build Coastguard Worker 			f->name, variant->name[0] ? "." : "", variant->name, t->name);
1033*053f45beSAndroid Build Coastguard Worker }
1034*053f45beSAndroid Build Coastguard Worker 
test_harness_run(int argc,char ** argv)1035*053f45beSAndroid Build Coastguard Worker static int test_harness_run(int __attribute__((unused)) argc,
1036*053f45beSAndroid Build Coastguard Worker 			    char __attribute__((unused)) **argv)
1037*053f45beSAndroid Build Coastguard Worker {
1038*053f45beSAndroid Build Coastguard Worker 	struct __fixture_variant_metadata no_variant = { .name = "", };
1039*053f45beSAndroid Build Coastguard Worker 	struct __fixture_variant_metadata *v;
1040*053f45beSAndroid Build Coastguard Worker 	struct __fixture_metadata *f;
1041*053f45beSAndroid Build Coastguard Worker 	struct __test_results *results;
1042*053f45beSAndroid Build Coastguard Worker 	struct __test_metadata *t;
1043*053f45beSAndroid Build Coastguard Worker 	int ret = 0;
1044*053f45beSAndroid Build Coastguard Worker 	unsigned int case_count = 0, test_count = 0;
1045*053f45beSAndroid Build Coastguard Worker 	unsigned int count = 0;
1046*053f45beSAndroid Build Coastguard Worker 	unsigned int pass_count = 0;
1047*053f45beSAndroid Build Coastguard Worker 
1048*053f45beSAndroid Build Coastguard Worker 	for (f = __fixture_list; f; f = f->next) {
1049*053f45beSAndroid Build Coastguard Worker 		for (v = f->variant ?: &no_variant; v; v = v->next) {
1050*053f45beSAndroid Build Coastguard Worker 			case_count++;
1051*053f45beSAndroid Build Coastguard Worker 			for (t = f->tests; t; t = t->next)
1052*053f45beSAndroid Build Coastguard Worker 				test_count++;
1053*053f45beSAndroid Build Coastguard Worker 		}
1054*053f45beSAndroid Build Coastguard Worker 	}
1055*053f45beSAndroid Build Coastguard Worker 
1056*053f45beSAndroid Build Coastguard Worker 	results = mmap(NULL, sizeof(*results), PROT_READ | PROT_WRITE,
1057*053f45beSAndroid Build Coastguard Worker 		       MAP_SHARED | MAP_ANONYMOUS, -1, 0);
1058*053f45beSAndroid Build Coastguard Worker 
1059*053f45beSAndroid Build Coastguard Worker 	ksft_print_header();
1060*053f45beSAndroid Build Coastguard Worker 	ksft_set_plan(test_count);
1061*053f45beSAndroid Build Coastguard Worker 	ksft_print_msg("Starting %u tests from %u test cases.\n",
1062*053f45beSAndroid Build Coastguard Worker 	       test_count, case_count);
1063*053f45beSAndroid Build Coastguard Worker 	for (f = __fixture_list; f; f = f->next) {
1064*053f45beSAndroid Build Coastguard Worker 		for (v = f->variant ?: &no_variant; v; v = v->next) {
1065*053f45beSAndroid Build Coastguard Worker 			for (t = f->tests; t; t = t->next) {
1066*053f45beSAndroid Build Coastguard Worker 				count++;
1067*053f45beSAndroid Build Coastguard Worker 				t->results = results;
1068*053f45beSAndroid Build Coastguard Worker 				__run_test(f, v, t);
1069*053f45beSAndroid Build Coastguard Worker 				t->results = NULL;
1070*053f45beSAndroid Build Coastguard Worker 				if (t->passed)
1071*053f45beSAndroid Build Coastguard Worker 					pass_count++;
1072*053f45beSAndroid Build Coastguard Worker 				else
1073*053f45beSAndroid Build Coastguard Worker 					ret = 1;
1074*053f45beSAndroid Build Coastguard Worker 			}
1075*053f45beSAndroid Build Coastguard Worker 		}
1076*053f45beSAndroid Build Coastguard Worker 	}
1077*053f45beSAndroid Build Coastguard Worker 	munmap(results, sizeof(*results));
1078*053f45beSAndroid Build Coastguard Worker 
1079*053f45beSAndroid Build Coastguard Worker 	ksft_print_msg("%s: %u / %u tests passed.\n", ret ? "FAILED" : "PASSED",
1080*053f45beSAndroid Build Coastguard Worker 			pass_count, count);
1081*053f45beSAndroid Build Coastguard Worker 	ksft_exit(ret == 0);
1082*053f45beSAndroid Build Coastguard Worker 
1083*053f45beSAndroid Build Coastguard Worker 	/* unreachable */
1084*053f45beSAndroid Build Coastguard Worker 	return KSFT_FAIL;
1085*053f45beSAndroid Build Coastguard Worker }
1086*053f45beSAndroid Build Coastguard Worker 
__constructor_order_first(void)1087*053f45beSAndroid Build Coastguard Worker static void __attribute__((constructor)) __constructor_order_first(void)
1088*053f45beSAndroid Build Coastguard Worker {
1089*053f45beSAndroid Build Coastguard Worker 	if (!__constructor_order)
1090*053f45beSAndroid Build Coastguard Worker 		__constructor_order = _CONSTRUCTOR_ORDER_FORWARD;
1091*053f45beSAndroid Build Coastguard Worker }
1092*053f45beSAndroid Build Coastguard Worker 
1093*053f45beSAndroid Build Coastguard Worker #endif  /* __KSELFTEST_HARNESS_H */
1094