| /* Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef VBOOT_REFERENCE_TEST_COMMON_H_ |
| #define VBOOT_REFERENCE_TEST_COMMON_H_ |
| |
| #include <setjmp.h> |
| #include <stdio.h> |
| |
| /* Used to get a line number as a constant string. Need to stringify it twice */ |
| #define STRINGIFY(x) #x |
| #define TOSTRING(x) STRINGIFY(x) |
| |
| extern int gTestSuccess; |
| extern int gTestAbortArmed; |
| extern jmp_buf gTestJmpEnv; |
| |
| /* Return 1 if result is equal to expected_result, else return 0. |
| * Also update the global gTestSuccess flag if test fails. */ |
| int test_eq(int result, int expected, |
| const char *preamble, const char *desc, const char *comment); |
| |
| #define TEST_EQ(result, expected, comment) \ |
| test_eq(result, expected, \ |
| __FILE__ ":" TOSTRING(__LINE__), \ |
| #result " == " #expected, \ |
| comment) |
| |
| #define TEST_EQ_S(result, expected) TEST_EQ(result, expected, NULL); |
| |
| /* Return 0 if result is equal to not_expected_result, else return 1. |
| * Also update the global gTestSuccess flag if test fails. */ |
| int test_neq(int result, int not_expected, |
| const char *preamble, const char *desc, const char *comment); |
| |
| #define TEST_NEQ(result, not_expected, comment) \ |
| test_neq(result, not_expected, \ |
| __FILE__ ":" TOSTRING(__LINE__), \ |
| #result " != " #not_expected, \ |
| comment) |
| |
| /* Return 1 if result pointer is equal to expected_result pointer, |
| * else return 0. Does not check pointer contents, only the pointer |
| * itself. Also update the global gTestSuccess flag if test fails. */ |
| int test_ptr_eq(const void* result, const void* expected, |
| const char *preamble, const char *desc, const char *comment); |
| |
| #define TEST_PTR_EQ(result, expected, comment) \ |
| test_ptr_eq(result, expected, \ |
| __FILE__ ":" TOSTRING(__LINE__), \ |
| #result " == " #expected, \ |
| comment) |
| |
| /* Return 1 if result pointer is not equal to expected_result pointer, |
| * else return 0. Does not check pointer contents, only the pointer |
| * itself. Also update the global gTestSuccess flag if test fails. */ |
| int test_ptr_neq(const void* result, const void* not_expected, |
| const char *preamble, const char *desc, const char *comment); |
| |
| #define TEST_PTR_NEQ(result, not_expected, comment) \ |
| test_ptr_neq(result, not_expected, \ |
| __FILE__ ":" TOSTRING(__LINE__), \ |
| #result " != " #not_expected, \ |
| comment) |
| |
| /* Return 1 if result string is equal to expected_result string, |
| * else return 0. Also update the global gTestSuccess flag if test fails. */ |
| int test_str_eq(const char* result, const char* expected, |
| const char *preamble, const char *desc, const char *comment); |
| |
| #define TEST_STR_EQ(result, expected, comment) \ |
| test_str_eq(result, expected, \ |
| __FILE__ ":" TOSTRING(__LINE__), \ |
| #result " == " #expected, \ |
| comment) |
| |
| /* Return 1 if result string is not equal to not_expected string, |
| * else return 0. Also update the global gTestSuccess flag if test fails. */ |
| int test_str_neq(const char* result, const char* not_expected, |
| const char *preamble, const char *desc, const char *comment); |
| |
| #define TEST_STR_NEQ(result, not_expected, comment) \ |
| test_str_neq(result, not_expected, \ |
| __FILE__ ":" TOSTRING(__LINE__), \ |
| #result " != " #not_expected, \ |
| comment) |
| |
| /* Return 1 if the result is true, else return 0. |
| * Also update the global gTestSuccess flag if test fails. */ |
| int test_true(int result, |
| const char *preamble, const char *desc, const char *comment); |
| |
| #define TEST_TRUE(result, comment) \ |
| test_true(result, \ |
| __FILE__ ":" TOSTRING(__LINE__), \ |
| #result " == true", \ |
| comment) |
| |
| /* Return 1 if the result is false, else return 0. |
| * Also update the global gTestSuccess flag if test fails. */ |
| int test_false(int result, |
| const char *preamble, const char *desc, const char *comment); |
| |
| #define TEST_FALSE(result, comment) \ |
| test_false(result, \ |
| __FILE__ ":" TOSTRING(__LINE__), \ |
| #result " == false", \ |
| comment) |
| |
| /* Return 1 if result is 0 (VB2_SUCCESS or other), else return 0. |
| * Also update the global gTestSuccess flag if test fails. */ |
| int test_succ(int result, |
| const char *preamble, const char *desc, const char *comment); |
| |
| #define TEST_SUCC(result, comment) \ |
| test_succ(result, \ |
| __FILE__ ":" TOSTRING(__LINE__), \ |
| #result " == 0", \ |
| comment) |
| |
| /* Return 1 if vb2ex_abort() was called, else return 0. |
| * Also update the global gTestSuccess flag if test fails. */ |
| int test_abort(int aborted, |
| const char *preamble, const char *desc, const char *comment); |
| |
| #define TEST_ABORT(call, comment) do { \ |
| gTestAbortArmed = 1; \ |
| int jumped = setjmp(gTestJmpEnv); \ |
| if (!jumped) \ |
| call; \ |
| gTestAbortArmed = 0; \ |
| test_abort(jumped, \ |
| __FILE__ ":" TOSTRING(__LINE__), \ |
| #call " causes abort", \ |
| comment); \ |
| } while (0) |
| |
| /* ANSI Color coding sequences. |
| * |
| * Don't use \e as MSC does not recognize it as a valid escape sequence. |
| */ |
| #define COL_GREEN "\x1b[1;32m" |
| #define COL_YELLOW "\x1b[1;33m" |
| #define COL_RED "\x1b[0;31m" |
| #define COL_STOP "\x1b[m" |
| |
| /* Abort if asprintf fails. */ |
| #define xasprintf(...) \ |
| do { \ |
| if (asprintf(__VA_ARGS__) < 0) \ |
| abort(); \ |
| } while (0) |
| |
| #endif /* VBOOT_REFERENCE_TEST_COMMON_H_ */ |