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