build: Update config.{guess,sub} to {2016-05-15,2016-06-20}.
[gnupg.git] / g10 / test.c
index 6910f95..e9e2074 100644 (file)
  */
 
 #include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
 #include "gpg.h"
 
 /* A unit test consists of one or more tests.  Tests can be broken
@@ -38,6 +42,10 @@ static int tests;
 /* The total number of tests that failed.  */
 static int tests_failed;
 
+/* Flag to request verbose diagnostics.  This is set if the envvar
+   "verbose" exists and is not the empty string.  */
+static int verbose;
+
 #define TEST_GROUP(description)             \
   do {                              \
     test_group = (description);             \
@@ -55,20 +63,24 @@ static int tests_failed;
     int expected_result;                       \
                                                \
     tests ++;                                  \
-                                               \
-    printf ("%d. Checking %s...",              \
-           tests, (description) ?: "");        \
-    fflush (stdout);                           \
-                                               \
+    if (verbose)                                \
+      {                                         \
+         printf ("%d. Checking %s...",         \
+               tests, (description) ?: "");    \
+         fflush (stdout);                      \
+      }                                         \
     test_result = (test);                      \
     expected_result = (expected);              \
                                                \
     if (test_result == expected_result)                \
       {                                                \
-        printf (" ok.\n");                     \
+        if (verbose) printf (" ok.\n");         \
       }                                                \
     else                                       \
       {                                                \
+        if (!verbose)                           \
+          printf ("%d. Checking %s...",         \
+                  tests, (description) ?: "");  \
        printf (" failed.\n");                  \
        printf ("  %s == %s failed.\n",         \
                STRINGIFY(test),                \
@@ -92,7 +104,7 @@ static int tests_failed;
     int tests_failed_pre = tests_failed;               \
     CHECK(description, test, expected);                        \
     if (tests_failed_pre != tests_failed)              \
-      exit (1);                                                \
+      exit_tests (1);                                  \
   } while (0)
 
 /* Call this if something went wrong.  */
@@ -102,19 +114,23 @@ static int tests_failed;
     if (message)                               \
       printf (" %s\n", (message));             \
                                                \
-    exit(1);                                   \
+    exit_tests (1);                            \
   } while (0)
 
 /* You need to fill this function in.  */
 static void do_test (int argc, char *argv[]);
 
+
+/* Print stats and call the real exit.  If FORCE is set use
+   EXIT_FAILURE even if no test has failed.  */
 static void
-print_results (void)
+exit_tests (int force)
 {
   if (tests_failed == 0)
     {
-      printf ("All %d tests passed.\n", tests);
-      exit (0);
+      if (verbose)
+        printf ("All %d tests passed.\n", tests);
+      exit (!!force);
     }
   else
     {
@@ -124,18 +140,52 @@ print_results (void)
        printf (" (%d of %d groups)",
                test_groups_failed, test_groups);
       printf ("\n");
-
       exit (1);
     }
 }
 
+
+/* Prepend FNAME with the srcdir environment variable's value and
+   return a malloced filename.  Caller must release the returned
+   string using test_free.  */
+char *
+prepend_srcdir (const char *fname)
+{
+  static const char *srcdir;
+  char *result;
+
+  if (!srcdir && !(srcdir = getenv ("srcdir")))
+    srcdir = ".";
+
+  result = malloc (strlen (srcdir) + 1 + strlen (fname) + 1);
+  strcpy (result, srcdir);
+  strcat (result, "/");
+  strcat (result, fname);
+  return result;
+}
+
+
+void
+test_free (void *a)
+{
+  if (a)
+    free (a);
+}
+
+
 int
 main (int argc, char *argv[])
 {
+  const char *s;
+
   (void) test_group;
 
+  s = getenv ("verbose");
+  if (s && *s)
+    verbose = 1;
+
   do_test (argc, argv);
-  atexit (print_results);
+  exit_tests (0);
 
-  return tests_failed == 0;
+  return !!tests_failed;
 }