about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--test-skeleton.c51
2 files changed, 53 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 30dc4dabdc..03fbb7e311 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2015-04-09  Roland McGrath  <roland@hack.frob.com>
+
+	* test-skeleton.c (TIMEOUT): Move #define to top level.
+	(main): Grok environment variable TEST_DIRECT.  If set, print
+	test expectation details into that file and then behave as if
+	given --direct.
+
 2015-04-09  Florian Weimer  <fweimer@redhat.com>
 
 	* malloc/tst-scratch_buffer.c (do_test): Suppress truncation
diff --git a/test-skeleton.c b/test-skeleton.c
index 6a7fc429d4..7a8ddfa55b 100644
--- a/test-skeleton.c
+++ b/test-skeleton.c
@@ -45,6 +45,11 @@
 # define TEST_DATA_LIMIT (64 << 20) /* Data limit (bytes) to run with.  */
 #endif
 
+#ifndef TIMEOUT
+  /* Default timeout is two seconds.  */
+# define TIMEOUT 2
+#endif
+
 #define OPT_DIRECT 1000
 #define OPT_TESTDIR 1001
 
@@ -293,7 +298,7 @@ main (int argc, char *argv[])
   /* Make sure we see all message, even those on stdout.  */
   setvbuf (stdout, NULL, _IONBF, 0);
 
-  /* make sure temporary files are deleted.  */
+  /* Make sure temporary files are deleted.  */
   atexit (delete_temp_files);
 
   /* Correct for the possible parameters.  */
@@ -306,6 +311,46 @@ main (int argc, char *argv[])
   PREPARE (argc, argv);
 #endif
 
+  const char *envstr_direct = getenv ("TEST_DIRECT");
+  if (envstr_direct != NULL)
+    {
+      FILE *f = fopen (envstr_direct, "w");
+      if (f == NULL)
+        {
+          printf ("cannot open TEST_DIRECT output file '%s': %m\n",
+                  envstr_direct);
+          exit (1);
+        }
+
+      fprintf (f, "timeout=%u\ntimeoutfactor=%u\n", TIMEOUT, timeoutfactor);
+#ifdef EXPECTED_STATUS
+      fprintf (f, "exit=%u\n", EXPECTED_STATUS);
+#endif
+#ifdef EXPECTED_SIGNAL
+      switch (EXPECTED_SIGNAL)
+        {
+        default: abort ();
+# define init_sig(signo, name, text) \
+        case signo: fprintf (f, "signal=%s\n", name); break;
+# include <siglist.h>
+# undef init_sig
+        }
+#endif
+
+      if (temp_name_list != NULL)
+        {
+          fprintf (f, "temp_files=(\n");
+          for (struct temp_name_list *n = temp_name_list;
+               n != NULL;
+               n = (struct temp_name_list *) n->q.q_forw)
+            fprintf (f, "  '%s'\n", n->name);
+          fprintf (f, ")\n");
+        }
+
+      fclose (f);
+      direct = 1;
+    }
+
   /* If we are not expected to fork run the function immediately.  */
   if (direct)
     return TEST_FUNCTION;
@@ -359,10 +404,6 @@ main (int argc, char *argv[])
     }
 
   /* Set timeout.  */
-#ifndef TIMEOUT
-  /* Default timeout is two seconds.  */
-# define TIMEOUT 2
-#endif
   signal (SIGALRM, signal_handler);
   alarm (TIMEOUT * timeoutfactor);