test: Make TEST_* report test location

This patch converts TEST_* functions to macros, which print file name
and line # of the check. This will allow us to locate a failed test
quickly.

New TEST_* macros also automatically generate a test name if
testname == NULL. This will save us time to think of a name for
every single check we write in a test.

BUG=none
BRANCH=tot
TEST=make runtests

Change-Id: Ibdeb99681985c3f348836d256fa3484f2f0c315f
Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/343233
Reviewed-by: Randall Spangler <rspangler@chromium.org>
diff --git a/tests/bdb_sprw_test.c b/tests/bdb_sprw_test.c
index 995707d..4528751 100644
--- a/tests/bdb_sprw_test.c
+++ b/tests/bdb_sprw_test.c
@@ -17,8 +17,6 @@
 #include "test_common.h"
 #include "vboot_register.h"
 
-#define TEST_EQ_S(result, expect) TEST_EQ(result, expect, #result "==" #expect)
-
 static struct bdb_header *bdb, *bdb0, *bdb1;
 static uint32_t vboot_register;
 static uint32_t vboot_register_persist;
diff --git a/tests/bdb_test.c b/tests/bdb_test.c
index d9226f4..da72366 100644
--- a/tests/bdb_test.c
+++ b/tests/bdb_test.c
@@ -14,8 +14,6 @@
 #include "host.h"
 #include "test_common.h"
 
-#define TEST_EQ_S(result, expect) TEST_EQ(result, expect, #result "==" #expect)
-
 void check_header_tests(void)
 {
 	struct bdb_header sgood = {
diff --git a/tests/test_common.c b/tests/test_common.c
index 233c9f5..dd3f0ea 100644
--- a/tests/test_common.c
+++ b/tests/test_common.c
@@ -18,128 +18,157 @@
 /* Global test success flag. */
 int gTestSuccess = 1;
 
-int TEST_EQ(int result, int expected_result, const char* testname) {
-  if (result == expected_result) {
-    fprintf(stderr, "%s Test " COL_GREEN "PASSED\n" COL_STOP, testname);
+int test_eq(int result, int expected,
+	    const char *preamble, const char *desc, const char *comment)
+{
+  if (result == expected) {
+    fprintf(stderr, "%s: %s, %s ... " COL_GREEN "PASSED\n" COL_STOP,
+	    preamble, desc, comment);
     return 1;
   } else {
-    fprintf(stderr, "%s Test " COL_RED "FAILED\n" COL_STOP, testname);
+    fprintf(stderr, "%s: %s, %s ... " COL_RED "FAILED\n" COL_STOP,
+	    preamble, desc, comment);
     fprintf(stderr, "  Expected: 0x%x (%d), got: 0x%x (%d)\n",
-	    expected_result, expected_result, result, result);
+	    expected, expected, result, result);
     gTestSuccess = 0;
     return 0;
   }
 }
 
-int TEST_NEQ(int result, int not_expected_result, const char* testname) {
-  if (result != not_expected_result) {
-    fprintf(stderr, "%s Test " COL_GREEN "PASSED\n" COL_STOP, testname);
+int test_neq(int result, int not_expected,
+	     const char *preamble, const char *desc, const char *comment)
+{
+  if (result != not_expected) {
+    fprintf(stderr, "%s: %s, %s ... " COL_GREEN "PASSED\n" COL_STOP,
+	    preamble, desc, comment);
     return 1;
   } else {
-    fprintf(stderr, "%s Test " COL_RED "FAILED\n" COL_STOP, testname);
+    fprintf(stderr, "%s: %s, %s ... " COL_RED "FAILED\n" COL_STOP,
+	    preamble, desc, comment);
     fprintf(stderr, "  Didn't expect 0x%x (%d), but got it.\n",
-	    not_expected_result, not_expected_result);
+	    not_expected, not_expected);
     gTestSuccess = 0;
     return 0;
   }
 }
 
-int TEST_PTR_EQ(const void* result, const void* expected_result,
-                const char* testname) {
-  if (result == expected_result) {
-    fprintf(stderr, "%s Test " COL_GREEN "PASSED\n" COL_STOP, testname);
+int test_ptr_eq(const void* result, const void* expected,
+		const char *preamble, const char *desc, const char *comment)
+{
+  if (result == expected) {
+    fprintf(stderr, "%s: %s, %s ... " COL_GREEN "PASSED\n" COL_STOP,
+	    preamble, desc, comment);
     return 1;
   } else {
-    fprintf(stderr, "%s Test " COL_RED "FAILED\n" COL_STOP, testname);
-    fprintf(stderr, "  Expected: 0x%lx, got: 0x%lx\n", (long)expected_result,
+    fprintf(stderr, "%s: %s, %s ... " COL_RED "FAILED\n" COL_STOP,
+	    preamble, desc, comment);
+    fprintf(stderr, "  Expected: 0x%lx, got: 0x%lx\n", (long)expected,
             (long)result);
     gTestSuccess = 0;
     return 0;
   }
 }
 
-int TEST_PTR_NEQ(const void* result, const void* not_expected_result,
-                const char* testname) {
-  if (result != not_expected_result) {
-    fprintf(stderr, "%s Test " COL_GREEN "PASSED\n" COL_STOP, testname);
+int test_ptr_neq(const void* result, const void* not_expected,
+		 const char *preamble, const char *desc, const char *comment)
+{
+  if (result != not_expected) {
+    fprintf(stderr, "%s: %s, %s ... " COL_GREEN "PASSED\n" COL_STOP,
+	    preamble, desc, comment);
     return 1;
   } else {
-    fprintf(stderr, "%s Test " COL_RED "FAILED\n" COL_STOP, testname);
+    fprintf(stderr, "%s: %s, %s ... " COL_RED "FAILED\n" COL_STOP,
+	    preamble, desc, comment);
     fprintf(stderr, "  Didn't expect 0x%lx, but got it\n",
-            (long)not_expected_result);
+            (long)not_expected);
     gTestSuccess = 0;
     return 0;
   }
 }
 
-int TEST_STR_EQ(const char* result, const char* expected_result,
-                const char* testname) {
-
-  if (!result || !expected_result) {
-    fprintf(stderr, "%s Test " COL_RED "FAILED\n" COL_STOP, testname);
+int test_str_eq(const char* result, const char* expected,
+		const char *preamble, const char *desc, const char *comment)
+{
+  if (!result || !expected) {
+    fprintf(stderr, "%s: %s, %s ... " COL_RED "FAILED\n" COL_STOP,
+	    preamble, desc, comment);
     fprintf(stderr, "  String compare with NULL\n");
     gTestSuccess = 0;
     return 0;
-  } else if (!strcmp(result, expected_result)) {
-    fprintf(stderr, "%s Test " COL_GREEN "PASSED\n" COL_STOP, testname);
+  } else if (!strcmp(result, expected)) {
+    fprintf(stderr, "%s: %s, %s ... " COL_GREEN "PASSED\n" COL_STOP,
+	    preamble, desc, comment);
     return 1;
   } else {
-    fprintf(stderr, "%s Test " COL_RED "FAILED\n" COL_STOP, testname);
-    fprintf(stderr, "  Expected: \"%s\", got: \"%s\"\n", expected_result,
+    fprintf(stderr, "%s " COL_RED "FAILED\n" COL_STOP, comment);
+    fprintf(stderr, "  Expected: \"%s\", got: \"%s\"\n", expected,
             result);
     gTestSuccess = 0;
     return 0;
   }
-
 }
 
-int TEST_STR_NEQ(const char* result, const char* not_expected,
-		 const char* testname) {
-
+int test_str_neq(const char* result, const char* not_expected,
+		 const char *preamble, const char *desc, const char *comment)
+{
   if (!result || !not_expected) {
-    fprintf(stderr, "%s Test " COL_RED "FAILED\n" COL_STOP, testname);
+    fprintf(stderr, "%s: %s, %s ... " COL_RED "FAILED\n" COL_STOP,
+	    preamble, desc, comment);
     fprintf(stderr, "  String compare with NULL\n");
     gTestSuccess = 0;
     return 0;
   } else if (strcmp(result, not_expected)) {
-    fprintf(stderr, "%s Test " COL_GREEN "PASSED\n" COL_STOP, testname);
+    fprintf(stderr, "%s: %s, %s ... " COL_GREEN "PASSED\n" COL_STOP,
+	    preamble, desc, comment);
     return 1;
   } else {
-    fprintf(stderr, "%s Test " COL_RED "FAILED\n" COL_STOP, testname);
+    fprintf(stderr, "%s: %s, %s ... " COL_RED "FAILED\n" COL_STOP,
+	    preamble, desc, comment);
     fprintf(stderr, "  Didn't expect: \"%s\", but got it\n", not_expected);
     gTestSuccess = 0;
     return 0;
   }
-
 }
 
-int TEST_SUCC(int result, const char* testname) {
+int test_succ(int result,
+	      const char *preamble, const char *desc, const char *comment)
+{
   if (result == 0) {
-    fprintf(stderr, "%s Test " COL_GREEN "PASSED\n" COL_STOP, testname);
+    fprintf(stderr, "%s: %s, %s ... " COL_GREEN "PASSED\n" COL_STOP,
+	    preamble, desc, comment);
   } else {
-    fprintf(stderr, "%s Test " COL_RED "FAILED\n" COL_STOP, testname);
+    fprintf(stderr, "%s: %s, %s ... " COL_RED "FAILED\n" COL_STOP,
+	    preamble, desc, comment);
     fprintf(stderr, "  Expected SUCCESS, got: 0x%lx\n", (long)result);
     gTestSuccess = 0;
   }
   return !result;
 }
 
-int TEST_TRUE(int result, const char* testname) {
+int test_true(int result,
+	      const char *preamble, const char *desc, const char *comment)
+{
   if (result) {
-    fprintf(stderr, "%s Test " COL_GREEN "PASSED\n" COL_STOP, testname);
+    fprintf(stderr, "%s: %s, %s ... " COL_GREEN "PASSED\n" COL_STOP,
+	    preamble, desc, comment);
   } else {
-    fprintf(stderr, "%s Test " COL_RED "FAILED\n" COL_STOP, testname);
+    fprintf(stderr, "%s: %s, %s ... " COL_RED "FAILED\n" COL_STOP,
+	    preamble, desc, comment);
     fprintf(stderr, "  Expected TRUE, got 0\n");
     gTestSuccess = 0;
   }
   return result;
 }
 
-int TEST_FALSE(int result, const char* testname) {
+int test_false(int result,
+	       const char *preamble, const char *desc, const char *comment)
+{
   if (!result) {
-    fprintf(stderr, "%s Test " COL_GREEN "PASSED\n" COL_STOP, testname);
+    fprintf(stderr, "%s: %s, %s ... " COL_GREEN "PASSED\n" COL_STOP,
+	    preamble, desc, comment);
   } else {
-    fprintf(stderr, "%s Test " COL_RED "FAILED\n" COL_STOP, testname);
+    fprintf(stderr, "%s: %s, %s ... " COL_RED "FAILED\n" COL_STOP,
+	    preamble, desc, comment);
     fprintf(stderr, "  Expected FALSE, got: 0x%lx\n", (long)result);
     gTestSuccess = 0;
   }
diff --git a/tests/test_common.h b/tests/test_common.h
index ef21c3b..0e2c8d6 100644
--- a/tests/test_common.h
+++ b/tests/test_common.h
@@ -7,49 +7,116 @@
 #ifndef VBOOT_REFERENCE_TEST_COMMON_H_
 #define VBOOT_REFERENCE_TEST_COMMON_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;
 
 /* 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_result, const char* testname);
+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_result, const char* testname);
+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_result,
-                const char* testname);
+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* expected_result,
-                 const char* testname);
+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_result,
-                const char* testname);
+int test_str_eq(const char* result, const char* expected,
+		const char *preamble, const char *desc, const char *comment);
 
-/* Return 1 if result string is not equal to not_expected_result string,
+#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_result,
-		 const char* testname);
+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* testname);
+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* testname);
+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 (VB_ERROR_SUCCESS / VB2_SUCCESS), else return 0.
  * Also update the global gTestSuccess flag if test fails. */
-int TEST_SUCC(int result, const char* testname);
+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)
 
 /* ANSI Color coding sequences.
  *