xref: /aosp_15_r20/external/vboot_reference/tests/common/tests.h (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2011 The ChromiumOS Authors
2*8617a60dSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
3*8617a60dSAndroid Build Coastguard Worker  * found in the LICENSE file.
4*8617a60dSAndroid Build Coastguard Worker  */
5*8617a60dSAndroid Build Coastguard Worker 
6*8617a60dSAndroid Build Coastguard Worker #ifndef VBOOT_REFERENCE_COMMON_TESTS_H_
7*8617a60dSAndroid Build Coastguard Worker #define VBOOT_REFERENCE_COMMON_TESTS_H_
8*8617a60dSAndroid Build Coastguard Worker 
9*8617a60dSAndroid Build Coastguard Worker #include <setjmp.h>
10*8617a60dSAndroid Build Coastguard Worker #include <stdio.h>
11*8617a60dSAndroid Build Coastguard Worker 
12*8617a60dSAndroid Build Coastguard Worker /* Used to get a line number as a constant string. Need to stringify it twice */
13*8617a60dSAndroid Build Coastguard Worker #define STRINGIFY(x)	#x
14*8617a60dSAndroid Build Coastguard Worker #define TOSTRING(x)	STRINGIFY(x)
15*8617a60dSAndroid Build Coastguard Worker 
16*8617a60dSAndroid Build Coastguard Worker /* Create a temp dir under ${BUILD_RUN}. */
17*8617a60dSAndroid Build Coastguard Worker const char *create_test_tmp_dir(const char *name);
18*8617a60dSAndroid Build Coastguard Worker 
19*8617a60dSAndroid Build Coastguard Worker extern int gTestSuccess;
20*8617a60dSAndroid Build Coastguard Worker extern int gTestAbortArmed;
21*8617a60dSAndroid Build Coastguard Worker extern jmp_buf gTestJmpEnv;
22*8617a60dSAndroid Build Coastguard Worker 
23*8617a60dSAndroid Build Coastguard Worker /* Return 1 if result is equal to expected_result, else return 0.
24*8617a60dSAndroid Build Coastguard Worker  * Also update the global gTestSuccess flag if test fails. */
25*8617a60dSAndroid Build Coastguard Worker int test_eq(int result, int expected,
26*8617a60dSAndroid Build Coastguard Worker 	    const char *preamble, const char *desc, const char *comment);
27*8617a60dSAndroid Build Coastguard Worker 
28*8617a60dSAndroid Build Coastguard Worker #define TEST_EQ(result, expected, comment) \
29*8617a60dSAndroid Build Coastguard Worker 	test_eq(result, expected, \
30*8617a60dSAndroid Build Coastguard Worker 		__FILE__ ":" TOSTRING(__LINE__), \
31*8617a60dSAndroid Build Coastguard Worker 		#result " == " #expected, \
32*8617a60dSAndroid Build Coastguard Worker 		comment)
33*8617a60dSAndroid Build Coastguard Worker 
34*8617a60dSAndroid Build Coastguard Worker #define TEST_EQ_S(result, expected) TEST_EQ(result, expected, NULL);
35*8617a60dSAndroid Build Coastguard Worker 
36*8617a60dSAndroid Build Coastguard Worker /* Return 0 if result is equal to not_expected_result, else return 1.
37*8617a60dSAndroid Build Coastguard Worker  * Also update the global gTestSuccess flag if test fails. */
38*8617a60dSAndroid Build Coastguard Worker int test_neq(int result, int not_expected,
39*8617a60dSAndroid Build Coastguard Worker 	     const char *preamble, const char *desc, const char *comment);
40*8617a60dSAndroid Build Coastguard Worker 
41*8617a60dSAndroid Build Coastguard Worker #define TEST_NEQ(result, not_expected, comment) \
42*8617a60dSAndroid Build Coastguard Worker 	test_neq(result, not_expected, \
43*8617a60dSAndroid Build Coastguard Worker 		 __FILE__ ":" TOSTRING(__LINE__), \
44*8617a60dSAndroid Build Coastguard Worker 		 #result " != " #not_expected, \
45*8617a60dSAndroid Build Coastguard Worker 		 comment)
46*8617a60dSAndroid Build Coastguard Worker 
47*8617a60dSAndroid Build Coastguard Worker /* Return 1 if result pointer is equal to expected_result pointer,
48*8617a60dSAndroid Build Coastguard Worker  * else return 0.  Does not check pointer contents, only the pointer
49*8617a60dSAndroid Build Coastguard Worker  * itself.  Also update the global gTestSuccess flag if test fails. */
50*8617a60dSAndroid Build Coastguard Worker int test_ptr_eq(const void* result, const void* expected,
51*8617a60dSAndroid Build Coastguard Worker 		const char *preamble, const char *desc, const char *comment);
52*8617a60dSAndroid Build Coastguard Worker 
53*8617a60dSAndroid Build Coastguard Worker #define TEST_PTR_EQ(result, expected, comment) \
54*8617a60dSAndroid Build Coastguard Worker 	test_ptr_eq(result, expected, \
55*8617a60dSAndroid Build Coastguard Worker 		    __FILE__ ":" TOSTRING(__LINE__), \
56*8617a60dSAndroid Build Coastguard Worker 		    #result " == " #expected, \
57*8617a60dSAndroid Build Coastguard Worker 		    comment)
58*8617a60dSAndroid Build Coastguard Worker 
59*8617a60dSAndroid Build Coastguard Worker /* Return 1 if result pointer is not equal to expected_result pointer,
60*8617a60dSAndroid Build Coastguard Worker  * else return 0.  Does not check pointer contents, only the pointer
61*8617a60dSAndroid Build Coastguard Worker  * itself.  Also update the global gTestSuccess flag if test fails. */
62*8617a60dSAndroid Build Coastguard Worker int test_ptr_neq(const void* result, const void* not_expected,
63*8617a60dSAndroid Build Coastguard Worker 		 const char *preamble, const char *desc, const char *comment);
64*8617a60dSAndroid Build Coastguard Worker 
65*8617a60dSAndroid Build Coastguard Worker #define TEST_PTR_NEQ(result, not_expected, comment) \
66*8617a60dSAndroid Build Coastguard Worker 	test_ptr_neq(result, not_expected, \
67*8617a60dSAndroid Build Coastguard Worker 		     __FILE__ ":" TOSTRING(__LINE__), \
68*8617a60dSAndroid Build Coastguard Worker 		     #result " != " #not_expected, \
69*8617a60dSAndroid Build Coastguard Worker 		     comment)
70*8617a60dSAndroid Build Coastguard Worker 
71*8617a60dSAndroid Build Coastguard Worker /* Return 1 if result string is equal to expected_result string,
72*8617a60dSAndroid Build Coastguard Worker  * else return 0.  Also update the global gTestSuccess flag if test fails. */
73*8617a60dSAndroid Build Coastguard Worker int test_str_eq(const char* result, const char* expected,
74*8617a60dSAndroid Build Coastguard Worker 		const char *preamble, const char *desc, const char *comment);
75*8617a60dSAndroid Build Coastguard Worker 
76*8617a60dSAndroid Build Coastguard Worker #define TEST_STR_EQ(result, expected, comment) \
77*8617a60dSAndroid Build Coastguard Worker 	test_str_eq(result, expected, \
78*8617a60dSAndroid Build Coastguard Worker 		    __FILE__ ":" TOSTRING(__LINE__), \
79*8617a60dSAndroid Build Coastguard Worker 		    #result " == " #expected, \
80*8617a60dSAndroid Build Coastguard Worker 		    comment)
81*8617a60dSAndroid Build Coastguard Worker 
82*8617a60dSAndroid Build Coastguard Worker /* Return 1 if result string is not equal to not_expected string,
83*8617a60dSAndroid Build Coastguard Worker  * else return 0.  Also update the global gTestSuccess flag if test fails. */
84*8617a60dSAndroid Build Coastguard Worker int test_str_neq(const char* result, const char* not_expected,
85*8617a60dSAndroid Build Coastguard Worker 		 const char *preamble, const char *desc, const char *comment);
86*8617a60dSAndroid Build Coastguard Worker 
87*8617a60dSAndroid Build Coastguard Worker #define TEST_STR_NEQ(result, not_expected, comment) \
88*8617a60dSAndroid Build Coastguard Worker 	test_str_neq(result, not_expected, \
89*8617a60dSAndroid Build Coastguard Worker 		     __FILE__ ":" TOSTRING(__LINE__), \
90*8617a60dSAndroid Build Coastguard Worker 		     #result " != " #not_expected, \
91*8617a60dSAndroid Build Coastguard Worker 		     comment)
92*8617a60dSAndroid Build Coastguard Worker 
93*8617a60dSAndroid Build Coastguard Worker /* Return 1 if the result is true, else return 0.
94*8617a60dSAndroid Build Coastguard Worker  * Also update the global gTestSuccess flag if test fails. */
95*8617a60dSAndroid Build Coastguard Worker int test_true(int result,
96*8617a60dSAndroid Build Coastguard Worker 	      const char *preamble, const char *desc, const char *comment);
97*8617a60dSAndroid Build Coastguard Worker 
98*8617a60dSAndroid Build Coastguard Worker #define TEST_TRUE(result, comment) \
99*8617a60dSAndroid Build Coastguard Worker 	test_true(result, \
100*8617a60dSAndroid Build Coastguard Worker 		  __FILE__ ":" TOSTRING(__LINE__), \
101*8617a60dSAndroid Build Coastguard Worker 		  #result " == true", \
102*8617a60dSAndroid Build Coastguard Worker 		  comment)
103*8617a60dSAndroid Build Coastguard Worker 
104*8617a60dSAndroid Build Coastguard Worker /* Return 1 if the result is false, else return 0.
105*8617a60dSAndroid Build Coastguard Worker  * Also update the global gTestSuccess flag if test fails. */
106*8617a60dSAndroid Build Coastguard Worker int test_false(int result,
107*8617a60dSAndroid Build Coastguard Worker 	       const char *preamble, const char *desc, const char *comment);
108*8617a60dSAndroid Build Coastguard Worker 
109*8617a60dSAndroid Build Coastguard Worker #define TEST_FALSE(result, comment) \
110*8617a60dSAndroid Build Coastguard Worker 	test_false(result, \
111*8617a60dSAndroid Build Coastguard Worker 		   __FILE__ ":" TOSTRING(__LINE__), \
112*8617a60dSAndroid Build Coastguard Worker 		   #result " == false", \
113*8617a60dSAndroid Build Coastguard Worker 		   comment)
114*8617a60dSAndroid Build Coastguard Worker 
115*8617a60dSAndroid Build Coastguard Worker /* Return 1 if result is 0 (VB2_SUCCESS or other), else return 0.
116*8617a60dSAndroid Build Coastguard Worker  * Also update the global gTestSuccess flag if test fails. */
117*8617a60dSAndroid Build Coastguard Worker int test_succ(int result,
118*8617a60dSAndroid Build Coastguard Worker 	      const char *preamble, const char *desc, const char *comment);
119*8617a60dSAndroid Build Coastguard Worker 
120*8617a60dSAndroid Build Coastguard Worker #define TEST_SUCC(result, comment) \
121*8617a60dSAndroid Build Coastguard Worker 	test_succ(result, \
122*8617a60dSAndroid Build Coastguard Worker 		  __FILE__ ":" TOSTRING(__LINE__), \
123*8617a60dSAndroid Build Coastguard Worker 		  #result " == 0", \
124*8617a60dSAndroid Build Coastguard Worker 		  comment)
125*8617a60dSAndroid Build Coastguard Worker 
126*8617a60dSAndroid Build Coastguard Worker /* Return 1 if result is not 0 (VB2_SUCCESS or other), else return 1.
127*8617a60dSAndroid Build Coastguard Worker  * Also update the global gTestSuccess flag if test fails. */
128*8617a60dSAndroid Build Coastguard Worker int test_fail(int result,
129*8617a60dSAndroid Build Coastguard Worker 	      const char *preamble, const char *desc, const char *comment);
130*8617a60dSAndroid Build Coastguard Worker 
131*8617a60dSAndroid Build Coastguard Worker #define TEST_FAIL(result, comment) \
132*8617a60dSAndroid Build Coastguard Worker 	test_fail(result, \
133*8617a60dSAndroid Build Coastguard Worker 		  __FILE__ ":" TOSTRING(__LINE__), \
134*8617a60dSAndroid Build Coastguard Worker 		  #result " != 0", \
135*8617a60dSAndroid Build Coastguard Worker 		  comment)
136*8617a60dSAndroid Build Coastguard Worker 
137*8617a60dSAndroid Build Coastguard Worker /* Return 1 if vb2ex_abort() was called, else return 0.
138*8617a60dSAndroid Build Coastguard Worker  * Also update the global gTestSuccess flag if test fails. */
139*8617a60dSAndroid Build Coastguard Worker int test_abort(int aborted,
140*8617a60dSAndroid Build Coastguard Worker 	       const char *preamble, const char *desc, const char *comment);
141*8617a60dSAndroid Build Coastguard Worker 
142*8617a60dSAndroid Build Coastguard Worker #define TEST_ABORT(call, comment) do { \
143*8617a60dSAndroid Build Coastguard Worker 	gTestAbortArmed = 1; \
144*8617a60dSAndroid Build Coastguard Worker 	int jumped = setjmp(gTestJmpEnv); \
145*8617a60dSAndroid Build Coastguard Worker 	if (!jumped) \
146*8617a60dSAndroid Build Coastguard Worker 		call; \
147*8617a60dSAndroid Build Coastguard Worker 	gTestAbortArmed = 0; \
148*8617a60dSAndroid Build Coastguard Worker 	test_abort(jumped, \
149*8617a60dSAndroid Build Coastguard Worker 		   __FILE__ ":" TOSTRING(__LINE__), \
150*8617a60dSAndroid Build Coastguard Worker 		   #call " causes abort", \
151*8617a60dSAndroid Build Coastguard Worker 		   comment); \
152*8617a60dSAndroid Build Coastguard Worker } while (0)
153*8617a60dSAndroid Build Coastguard Worker 
154*8617a60dSAndroid Build Coastguard Worker /* ANSI Color coding sequences.
155*8617a60dSAndroid Build Coastguard Worker  *
156*8617a60dSAndroid Build Coastguard Worker  * Don't use \e as MSC does not recognize it as a valid escape sequence.
157*8617a60dSAndroid Build Coastguard Worker  */
158*8617a60dSAndroid Build Coastguard Worker #define COL_GREEN "\x1b[1;32m"
159*8617a60dSAndroid Build Coastguard Worker #define COL_YELLOW "\x1b[1;33m"
160*8617a60dSAndroid Build Coastguard Worker #define COL_RED "\x1b[0;31m"
161*8617a60dSAndroid Build Coastguard Worker #define COL_STOP "\x1b[m"
162*8617a60dSAndroid Build Coastguard Worker 
163*8617a60dSAndroid Build Coastguard Worker #define die(...) \
164*8617a60dSAndroid Build Coastguard Worker 	do { \
165*8617a60dSAndroid Build Coastguard Worker 		fprintf(stderr, __VA_ARGS__); \
166*8617a60dSAndroid Build Coastguard Worker 		abort(); \
167*8617a60dSAndroid Build Coastguard Worker 	} while (0)
168*8617a60dSAndroid Build Coastguard Worker 
169*8617a60dSAndroid Build Coastguard Worker /* Abort if asprintf fails. */
170*8617a60dSAndroid Build Coastguard Worker #define xasprintf(...) \
171*8617a60dSAndroid Build Coastguard Worker 	do { \
172*8617a60dSAndroid Build Coastguard Worker 		if (asprintf(__VA_ARGS__) < 0) \
173*8617a60dSAndroid Build Coastguard Worker 			abort(); \
174*8617a60dSAndroid Build Coastguard Worker 	} while (0)
175*8617a60dSAndroid Build Coastguard Worker 
176*8617a60dSAndroid Build Coastguard Worker #endif  /* VBOOT_REFERENCE_COMMON_TESTS_H_ */
177