xref: /aosp_15_r20/external/vboot_reference/tests/common/tests.c (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  * Common functions used by tests.
6*8617a60dSAndroid Build Coastguard Worker  */
7*8617a60dSAndroid Build Coastguard Worker 
8*8617a60dSAndroid Build Coastguard Worker #include <stdint.h>
9*8617a60dSAndroid Build Coastguard Worker #include <stdio.h>
10*8617a60dSAndroid Build Coastguard Worker #include <string.h>
11*8617a60dSAndroid Build Coastguard Worker #include <sys/stat.h>
12*8617a60dSAndroid Build Coastguard Worker #include <unistd.h>
13*8617a60dSAndroid Build Coastguard Worker 
14*8617a60dSAndroid Build Coastguard Worker #include "2common.h"
15*8617a60dSAndroid Build Coastguard Worker #include "common/tests.h"
16*8617a60dSAndroid Build Coastguard Worker 
17*8617a60dSAndroid Build Coastguard Worker #define ENV_BUILD_RUN "BUILD_RUN"
18*8617a60dSAndroid Build Coastguard Worker 
create_test_tmp_dir(const char * name)19*8617a60dSAndroid Build Coastguard Worker const char *create_test_tmp_dir(const char *name)
20*8617a60dSAndroid Build Coastguard Worker {
21*8617a60dSAndroid Build Coastguard Worker 	const char *build_run = getenv(ENV_BUILD_RUN);
22*8617a60dSAndroid Build Coastguard Worker 	if (!build_run)
23*8617a60dSAndroid Build Coastguard Worker 		die("Failed to get env %s\n", ENV_BUILD_RUN);
24*8617a60dSAndroid Build Coastguard Worker 
25*8617a60dSAndroid Build Coastguard Worker 	char *dir = NULL;
26*8617a60dSAndroid Build Coastguard Worker 	xasprintf(&dir, "%s/tests/%s.tmp", build_run, name);
27*8617a60dSAndroid Build Coastguard Worker 
28*8617a60dSAndroid Build Coastguard Worker 	struct stat st = {0};
29*8617a60dSAndroid Build Coastguard Worker 	if (stat(dir, &st) == -1 && mkdir(dir, 0700))
30*8617a60dSAndroid Build Coastguard Worker 		die("Failed to create dir %s\n", dir);
31*8617a60dSAndroid Build Coastguard Worker 	return dir;
32*8617a60dSAndroid Build Coastguard Worker }
33*8617a60dSAndroid Build Coastguard Worker 
34*8617a60dSAndroid Build Coastguard Worker /* Global test success flag. */
35*8617a60dSAndroid Build Coastguard Worker int gTestSuccess = 1;
36*8617a60dSAndroid Build Coastguard Worker int gTestAbortArmed = 0;
37*8617a60dSAndroid Build Coastguard Worker jmp_buf gTestJmpEnv;
38*8617a60dSAndroid Build Coastguard Worker 
print_passed(const char * preamble,const char * desc,const char * comment)39*8617a60dSAndroid Build Coastguard Worker static void print_passed(const char *preamble, const char *desc,
40*8617a60dSAndroid Build Coastguard Worker 			 const char *comment)
41*8617a60dSAndroid Build Coastguard Worker {
42*8617a60dSAndroid Build Coastguard Worker 	fprintf(stderr, "%s: %s ... " COL_GREEN "PASSED\n" COL_STOP,
43*8617a60dSAndroid Build Coastguard Worker 		preamble, comment ? comment : desc);
44*8617a60dSAndroid Build Coastguard Worker }
45*8617a60dSAndroid Build Coastguard Worker 
print_failed(const char * preamble,const char * desc,const char * comment)46*8617a60dSAndroid Build Coastguard Worker static void print_failed(const char *preamble, const char *desc,
47*8617a60dSAndroid Build Coastguard Worker 			 const char *comment)
48*8617a60dSAndroid Build Coastguard Worker {
49*8617a60dSAndroid Build Coastguard Worker 	fprintf(stderr, "%s: %s ... " COL_RED "FAILED\n" COL_STOP,
50*8617a60dSAndroid Build Coastguard Worker 		preamble, comment ? comment : desc);
51*8617a60dSAndroid Build Coastguard Worker }
52*8617a60dSAndroid Build Coastguard Worker 
test_eq(int result,int expected,const char * preamble,const char * desc,const char * comment)53*8617a60dSAndroid Build Coastguard Worker int test_eq(int result, int expected,
54*8617a60dSAndroid Build Coastguard Worker 	    const char *preamble, const char *desc, const char *comment)
55*8617a60dSAndroid Build Coastguard Worker {
56*8617a60dSAndroid Build Coastguard Worker 	if (result == expected) {
57*8617a60dSAndroid Build Coastguard Worker 		print_passed(preamble, desc, comment);
58*8617a60dSAndroid Build Coastguard Worker 		return 1;
59*8617a60dSAndroid Build Coastguard Worker 	} else {
60*8617a60dSAndroid Build Coastguard Worker 		print_failed(preamble, desc, comment);
61*8617a60dSAndroid Build Coastguard Worker 		fprintf(stderr, "	Expected: %#x (%d), got: %#x (%d)\n",
62*8617a60dSAndroid Build Coastguard Worker 			expected, expected, result, result);
63*8617a60dSAndroid Build Coastguard Worker 		gTestSuccess = 0;
64*8617a60dSAndroid Build Coastguard Worker 		return 0;
65*8617a60dSAndroid Build Coastguard Worker 	}
66*8617a60dSAndroid Build Coastguard Worker }
67*8617a60dSAndroid Build Coastguard Worker 
test_neq(int result,int not_expected,const char * preamble,const char * desc,const char * comment)68*8617a60dSAndroid Build Coastguard Worker int test_neq(int result, int not_expected,
69*8617a60dSAndroid Build Coastguard Worker 	     const char *preamble, const char *desc, const char *comment)
70*8617a60dSAndroid Build Coastguard Worker {
71*8617a60dSAndroid Build Coastguard Worker 	if (result != not_expected) {
72*8617a60dSAndroid Build Coastguard Worker 		print_passed(preamble, desc, comment);
73*8617a60dSAndroid Build Coastguard Worker 		return 1;
74*8617a60dSAndroid Build Coastguard Worker 	} else {
75*8617a60dSAndroid Build Coastguard Worker 		print_failed(preamble, desc, comment);
76*8617a60dSAndroid Build Coastguard Worker 		fprintf(stderr, "	Didn't expect %#x (%d), but got it.\n",
77*8617a60dSAndroid Build Coastguard Worker 			not_expected, not_expected);
78*8617a60dSAndroid Build Coastguard Worker 		gTestSuccess = 0;
79*8617a60dSAndroid Build Coastguard Worker 		return 0;
80*8617a60dSAndroid Build Coastguard Worker 	}
81*8617a60dSAndroid Build Coastguard Worker }
82*8617a60dSAndroid Build Coastguard Worker 
test_ptr_eq(const void * result,const void * expected,const char * preamble,const char * desc,const char * comment)83*8617a60dSAndroid Build Coastguard Worker int test_ptr_eq(const void* result, const void* expected,
84*8617a60dSAndroid Build Coastguard Worker 		const char *preamble, const char *desc, const char *comment)
85*8617a60dSAndroid Build Coastguard Worker {
86*8617a60dSAndroid Build Coastguard Worker 	if (result == expected) {
87*8617a60dSAndroid Build Coastguard Worker 		print_passed(preamble, desc, comment);
88*8617a60dSAndroid Build Coastguard Worker 		return 1;
89*8617a60dSAndroid Build Coastguard Worker 	} else {
90*8617a60dSAndroid Build Coastguard Worker 		print_failed(preamble, desc, comment);
91*8617a60dSAndroid Build Coastguard Worker 		fprintf(stderr, "	Expected: %#lx, got: %#lx\n",
92*8617a60dSAndroid Build Coastguard Worker 			(long)expected, (long)result);
93*8617a60dSAndroid Build Coastguard Worker 		gTestSuccess = 0;
94*8617a60dSAndroid Build Coastguard Worker 		return 0;
95*8617a60dSAndroid Build Coastguard Worker 	}
96*8617a60dSAndroid Build Coastguard Worker }
97*8617a60dSAndroid Build Coastguard Worker 
test_ptr_neq(const void * result,const void * not_expected,const char * preamble,const char * desc,const char * comment)98*8617a60dSAndroid Build Coastguard Worker int test_ptr_neq(const void* result, const void* not_expected,
99*8617a60dSAndroid Build Coastguard Worker 		 const char *preamble, const char *desc, const char *comment)
100*8617a60dSAndroid Build Coastguard Worker {
101*8617a60dSAndroid Build Coastguard Worker 	if (result != not_expected) {
102*8617a60dSAndroid Build Coastguard Worker 		print_passed(preamble, desc, comment);
103*8617a60dSAndroid Build Coastguard Worker 		return 1;
104*8617a60dSAndroid Build Coastguard Worker 	} else {
105*8617a60dSAndroid Build Coastguard Worker 		print_failed(preamble, desc, comment);
106*8617a60dSAndroid Build Coastguard Worker 		fprintf(stderr, "	Didn't expect %#lx, but got it\n",
107*8617a60dSAndroid Build Coastguard Worker 			(long)not_expected);
108*8617a60dSAndroid Build Coastguard Worker 		gTestSuccess = 0;
109*8617a60dSAndroid Build Coastguard Worker 		return 0;
110*8617a60dSAndroid Build Coastguard Worker 	}
111*8617a60dSAndroid Build Coastguard Worker }
112*8617a60dSAndroid Build Coastguard Worker 
test_str_eq(const char * result,const char * expected,const char * preamble,const char * desc,const char * comment)113*8617a60dSAndroid Build Coastguard Worker int test_str_eq(const char* result, const char* expected,
114*8617a60dSAndroid Build Coastguard Worker 		const char *preamble, const char *desc, const char *comment)
115*8617a60dSAndroid Build Coastguard Worker {
116*8617a60dSAndroid Build Coastguard Worker 	if (!result || !expected) {
117*8617a60dSAndroid Build Coastguard Worker 		print_failed(preamble, desc, comment);
118*8617a60dSAndroid Build Coastguard Worker 		fprintf(stderr, "	String compare with NULL\n");
119*8617a60dSAndroid Build Coastguard Worker 		gTestSuccess = 0;
120*8617a60dSAndroid Build Coastguard Worker 		return 0;
121*8617a60dSAndroid Build Coastguard Worker 	} else if (!strcmp(result, expected)) {
122*8617a60dSAndroid Build Coastguard Worker 		print_passed(preamble, desc, comment);
123*8617a60dSAndroid Build Coastguard Worker 		return 1;
124*8617a60dSAndroid Build Coastguard Worker 	} else {
125*8617a60dSAndroid Build Coastguard Worker 		print_failed(preamble, desc, comment);
126*8617a60dSAndroid Build Coastguard Worker 		fprintf(stderr, "	Expected: \"%s\", got: \"%s\"\n",
127*8617a60dSAndroid Build Coastguard Worker 			expected, result);
128*8617a60dSAndroid Build Coastguard Worker 		gTestSuccess = 0;
129*8617a60dSAndroid Build Coastguard Worker 		return 0;
130*8617a60dSAndroid Build Coastguard Worker 	}
131*8617a60dSAndroid Build Coastguard Worker }
132*8617a60dSAndroid Build Coastguard Worker 
test_str_neq(const char * result,const char * not_expected,const char * preamble,const char * desc,const char * comment)133*8617a60dSAndroid Build Coastguard Worker int test_str_neq(const char* result, const char* not_expected,
134*8617a60dSAndroid Build Coastguard Worker 		 const char *preamble, const char *desc, const char *comment)
135*8617a60dSAndroid Build Coastguard Worker {
136*8617a60dSAndroid Build Coastguard Worker 	if (!result || !not_expected) {
137*8617a60dSAndroid Build Coastguard Worker 		print_failed(preamble, desc, comment);
138*8617a60dSAndroid Build Coastguard Worker 		fprintf(stderr, "	String compare with NULL\n");
139*8617a60dSAndroid Build Coastguard Worker 		gTestSuccess = 0;
140*8617a60dSAndroid Build Coastguard Worker 		return 0;
141*8617a60dSAndroid Build Coastguard Worker 	} else if (strcmp(result, not_expected)) {
142*8617a60dSAndroid Build Coastguard Worker 		print_passed(preamble, desc, comment);
143*8617a60dSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: %s, %s ... " COL_GREEN "PASSED\n" COL_STOP,
144*8617a60dSAndroid Build Coastguard Worker 			preamble, desc, comment);
145*8617a60dSAndroid Build Coastguard Worker 		return 1;
146*8617a60dSAndroid Build Coastguard Worker 	} else {
147*8617a60dSAndroid Build Coastguard Worker 		print_failed(preamble, desc, comment);
148*8617a60dSAndroid Build Coastguard Worker 		fprintf(stderr, "	Didn't expect: \"%s\", but got it\n",
149*8617a60dSAndroid Build Coastguard Worker 			not_expected);
150*8617a60dSAndroid Build Coastguard Worker 		gTestSuccess = 0;
151*8617a60dSAndroid Build Coastguard Worker 		return 0;
152*8617a60dSAndroid Build Coastguard Worker 	}
153*8617a60dSAndroid Build Coastguard Worker }
154*8617a60dSAndroid Build Coastguard Worker 
test_succ(int result,const char * preamble,const char * desc,const char * comment)155*8617a60dSAndroid Build Coastguard Worker int test_succ(int result,
156*8617a60dSAndroid Build Coastguard Worker 	      const char *preamble, const char *desc, const char *comment)
157*8617a60dSAndroid Build Coastguard Worker {
158*8617a60dSAndroid Build Coastguard Worker 	if (result == 0) {
159*8617a60dSAndroid Build Coastguard Worker 		print_passed(preamble, desc, comment);
160*8617a60dSAndroid Build Coastguard Worker 	} else {
161*8617a60dSAndroid Build Coastguard Worker 		print_failed(preamble, desc, comment);
162*8617a60dSAndroid Build Coastguard Worker 		fprintf(stderr, "	Expected SUCCESS, got: %#x (%d)\n",
163*8617a60dSAndroid Build Coastguard Worker 			result, result);
164*8617a60dSAndroid Build Coastguard Worker 		gTestSuccess = 0;
165*8617a60dSAndroid Build Coastguard Worker 	}
166*8617a60dSAndroid Build Coastguard Worker 	return !result;
167*8617a60dSAndroid Build Coastguard Worker }
168*8617a60dSAndroid Build Coastguard Worker 
test_fail(int result,const char * preamble,const char * desc,const char * comment)169*8617a60dSAndroid Build Coastguard Worker int test_fail(int result,
170*8617a60dSAndroid Build Coastguard Worker 	      const char *preamble, const char *desc, const char *comment)
171*8617a60dSAndroid Build Coastguard Worker {
172*8617a60dSAndroid Build Coastguard Worker 	if (result != 0) {
173*8617a60dSAndroid Build Coastguard Worker 		print_passed(preamble, desc, comment);
174*8617a60dSAndroid Build Coastguard Worker 	} else {
175*8617a60dSAndroid Build Coastguard Worker 		print_failed(preamble, desc, comment);
176*8617a60dSAndroid Build Coastguard Worker 		fprintf(stderr,
177*8617a60dSAndroid Build Coastguard Worker 			"	Didn't expect SUCCESS (0), but got it\n");
178*8617a60dSAndroid Build Coastguard Worker 		gTestSuccess = 0;
179*8617a60dSAndroid Build Coastguard Worker 	}
180*8617a60dSAndroid Build Coastguard Worker 	return result;
181*8617a60dSAndroid Build Coastguard Worker }
182*8617a60dSAndroid Build Coastguard Worker 
test_true(int result,const char * preamble,const char * desc,const char * comment)183*8617a60dSAndroid Build Coastguard Worker int test_true(int result,
184*8617a60dSAndroid Build Coastguard Worker 	      const char *preamble, const char *desc, const char *comment)
185*8617a60dSAndroid Build Coastguard Worker {
186*8617a60dSAndroid Build Coastguard Worker 	if (result) {
187*8617a60dSAndroid Build Coastguard Worker 		print_passed(preamble, desc, comment);
188*8617a60dSAndroid Build Coastguard Worker 	} else {
189*8617a60dSAndroid Build Coastguard Worker 		print_failed(preamble, desc, comment);
190*8617a60dSAndroid Build Coastguard Worker 		fprintf(stderr, "	Expected TRUE, got 0\n");
191*8617a60dSAndroid Build Coastguard Worker 		gTestSuccess = 0;
192*8617a60dSAndroid Build Coastguard Worker 	}
193*8617a60dSAndroid Build Coastguard Worker 	return result;
194*8617a60dSAndroid Build Coastguard Worker }
195*8617a60dSAndroid Build Coastguard Worker 
test_false(int result,const char * preamble,const char * desc,const char * comment)196*8617a60dSAndroid Build Coastguard Worker int test_false(int result,
197*8617a60dSAndroid Build Coastguard Worker 	       const char *preamble, const char *desc, const char *comment)
198*8617a60dSAndroid Build Coastguard Worker {
199*8617a60dSAndroid Build Coastguard Worker 	if (!result) {
200*8617a60dSAndroid Build Coastguard Worker 		print_passed(preamble, desc, comment);
201*8617a60dSAndroid Build Coastguard Worker 	} else {
202*8617a60dSAndroid Build Coastguard Worker 		print_failed(preamble, desc, comment);
203*8617a60dSAndroid Build Coastguard Worker 		fprintf(stderr, "	Expected FALSE, got: %#lx\n",
204*8617a60dSAndroid Build Coastguard Worker 			(long)result);
205*8617a60dSAndroid Build Coastguard Worker 		gTestSuccess = 0;
206*8617a60dSAndroid Build Coastguard Worker 	}
207*8617a60dSAndroid Build Coastguard Worker 	return !result;
208*8617a60dSAndroid Build Coastguard Worker }
209*8617a60dSAndroid Build Coastguard Worker 
test_abort(int aborted,const char * preamble,const char * desc,const char * comment)210*8617a60dSAndroid Build Coastguard Worker int test_abort(int aborted,
211*8617a60dSAndroid Build Coastguard Worker 	       const char *preamble, const char *desc, const char *comment)
212*8617a60dSAndroid Build Coastguard Worker {
213*8617a60dSAndroid Build Coastguard Worker 	if (aborted) {
214*8617a60dSAndroid Build Coastguard Worker 		print_passed(preamble, desc, comment);
215*8617a60dSAndroid Build Coastguard Worker 	} else {
216*8617a60dSAndroid Build Coastguard Worker 		print_failed(preamble, desc, comment);
217*8617a60dSAndroid Build Coastguard Worker 		fprintf(stderr, "	Expected ABORT, but did not get it\n");
218*8617a60dSAndroid Build Coastguard Worker 		gTestSuccess = 0;
219*8617a60dSAndroid Build Coastguard Worker 	}
220*8617a60dSAndroid Build Coastguard Worker 	return aborted;
221*8617a60dSAndroid Build Coastguard Worker }
222*8617a60dSAndroid Build Coastguard Worker 
vb2ex_abort(void)223*8617a60dSAndroid Build Coastguard Worker void vb2ex_abort(void)
224*8617a60dSAndroid Build Coastguard Worker {
225*8617a60dSAndroid Build Coastguard Worker 	/*
226*8617a60dSAndroid Build Coastguard Worker 	 * If expecting an abort call, jump back to TEST_ABORT macro.
227*8617a60dSAndroid Build Coastguard Worker 	 * Otherwise, force exit to ensure the test fails.
228*8617a60dSAndroid Build Coastguard Worker 	 */
229*8617a60dSAndroid Build Coastguard Worker 	if (gTestAbortArmed) {
230*8617a60dSAndroid Build Coastguard Worker 		longjmp(gTestJmpEnv, 1);
231*8617a60dSAndroid Build Coastguard Worker 	} else {
232*8617a60dSAndroid Build Coastguard Worker 		fprintf(stderr, COL_RED "Unexpected ABORT encountered, "
233*8617a60dSAndroid Build Coastguard Worker 			"exiting\n" COL_STOP);
234*8617a60dSAndroid Build Coastguard Worker 		exit(1);
235*8617a60dSAndroid Build Coastguard Worker 	}
236*8617a60dSAndroid Build Coastguard Worker }
237