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