]> granicus.if.org Git - check/commitdiff
add support for logging in TAP format
authorbrarcher <brarcher@64e312b2-a51f-0410-8e61-82d0ca0eb02a>
Tue, 17 Dec 2013 16:06:50 +0000 (16:06 +0000)
committerbrarcher <brarcher@64e312b2-a51f-0410-8e61-82d0ca0eb02a>
Tue, 17 Dec 2013 16:06:50 +0000 (16:06 +0000)
Logging in the Test Anything Protcol (TAP) format is useful
in general, but is especially useful on platforms where
fork() is unavailable. The TAP format requires that the
planned number of tests to run be specified, either at the
start or end of a test run. If the number of tests run does not
match the plan, the test run is marked as failed. As running
without fork() leaves the unit testing program open to failure
if a test aborts/segfaults/etc, validating the TAP output is
useful.

git-svn-id: svn+ssh://svn.code.sf.net/p/check/code/trunk@873 64e312b2-a51f-0410-8e61-82d0ca0eb02a

src/check.c
src/check.h.in
src/check_impl.h
src/check_log.c
src/check_log.h

index 94d9dbf2e475eb1d50870f104768075a79d24de6..878a1182aea8f3a99e9273252773ee89acacb9c4 100644 (file)
@@ -289,6 +289,7 @@ SRunner *srunner_create (Suite *s)
   sr->resultlst = check_list_create();
   sr->log_fname = NULL;
   sr->xml_fname = NULL;
+  sr->tap_fname = NULL;
   sr->loglst = NULL;
 
 #if defined(HAVE_FORK)
index f9407cddd7212c54cde1edc04f795e642ef5f17a..2c18c07fd02899a9d1cabeeab3ed67e8808e5b0b 100644 (file)
@@ -487,6 +487,20 @@ int CK_EXPORT srunner_has_xml (SRunner *sr);
 /* Return the name of the XML file, or NULL if none */
 const char * CK_EXPORT srunner_xml_fname (SRunner *sr);
 
+/* Set a tap file to which to write during test running.
+
+  Log file setting is an initialize only operation -- it should be
+  done immediatly after SRunner creation, and the log file can't be
+  changed after being set.
+*/
+void CK_EXPORT srunner_set_tap (SRunner *sr, const char *fname);
+
+/* Does the SRunner have a tap file? */
+int CK_EXPORT srunner_has_tap (SRunner *sr);
+
+/* Return the name of the tap file, or NULL if none */
+const char * CK_EXPORT srunner_tap_fname (SRunner *sr);
+
 
 /* Control forking */
 enum fork_status {
index 5402d698c6e0187911f57a3fe8459eadf08ebdb9..45a48a0dc4e33156b40bcb1d286ccec9a4936c18 100644 (file)
@@ -109,6 +109,7 @@ struct SRunner {
   List *resultlst; /* List of unit test results */
   const char *log_fname; /* name of log file */
   const char *xml_fname; /* name of xml output file */
+  const char *tap_fname; /* name of tap output file */
   List *loglst; /* list of Log objects */
   enum fork_status fstat; /* controls if suites are forked or not
                             NOTE: Don't use this value directly,
index 6b27fb24344d2993bfdaa43cdb52a98a51040854..6ff2b97b22438a4f64b9050925e6040ca5628b6d 100644 (file)
@@ -81,6 +81,28 @@ const char *srunner_xml_fname (SRunner *sr)
   return getenv("CK_XML_LOG_FILE_NAME");
 }
 
+void srunner_set_tap (SRunner *sr, const char *fname)
+{
+  if (sr->tap_fname)
+    return;
+  sr->tap_fname = fname;
+}
+
+int srunner_has_tap (SRunner *sr)
+{
+  return srunner_tap_fname(sr) != NULL;
+}
+
+const char *srunner_tap_fname (SRunner *sr)
+{
+  /* check if tap log filename have been set explicitly */
+  if (sr->tap_fname != NULL) {
+    return sr->tap_fname;
+  }
+
+  return getenv("CK_TAP_LOG_FILE_NAME");
+}
+
 void srunner_register_lfun (SRunner *sr, FILE *lfile, int close,
                            LFun lfun, enum print_output printmode)
 {
@@ -290,6 +312,46 @@ void xml_lfun (SRunner *sr CK_ATTRIBUTE_UNUSED, FILE *file, enum print_output pr
 
 }
 
+void tap_lfun (SRunner *sr, FILE *file, enum print_output printmode CK_ATTRIBUTE_UNUSED,
+                void *obj, enum cl_event evt)
+{
+  TestResult *tr;
+  Suite *s;
+
+  static int num_tests_run = 0;
+
+  switch (evt) {
+  case CLINITLOG_SR:
+    /* As this is a new log file, reset the number of tests executed */
+    num_tests_run = 0;
+    break;
+  case CLENDLOG_SR:
+    /* Output the test plan as the last line */
+    fprintf(file, "1..%d\n", num_tests_run);
+    fflush(file);
+    break;
+  case CLSTART_SR:
+    break;
+  case CLSTART_S:
+    break;
+  case CLEND_SR:
+    break;
+  case CLEND_S:
+    break;
+  case CLSTART_T:
+    break;
+  case CLEND_T:
+    /* Print the test result to the tap file */
+    num_tests_run+=1;
+    tr = obj;
+    fprintf(file, "%s %d\n", tr->rtype == CK_PASS ? "ok" : "not ok", num_tests_run);
+    fflush(file);
+    break;
+  default:
+    eprintf("Bad event type received in tap_lfun", __FILE__, __LINE__);
+  }
+}
+
 #if ENABLE_SUBUNIT
 void subunit_lfun (SRunner *sr, FILE *file, enum print_output printmode,
                  void *obj, enum cl_event evt)
@@ -372,6 +434,18 @@ FILE *srunner_open_xmlfile (SRunner *sr)
   return f;
 }
 
+FILE *srunner_open_tapfile (SRunner *sr)
+{
+  FILE *f = NULL;
+  if (srunner_has_tap (sr)) {
+    f = fopen(srunner_tap_fname(sr), "w");
+    if (f == NULL)
+      eprintf ("Error in call to fopen while opening tap file %s:", __FILE__, __LINE__ - 2,
+              sr->tap_fname);
+  }
+  return f;
+}
+
 void srunner_init_logging (SRunner *sr, enum print_output print_mode)
 {
   FILE *f;
@@ -392,6 +466,10 @@ void srunner_init_logging (SRunner *sr, enum print_output print_mode)
   if (f) {
     srunner_register_lfun (sr, f, 2, xml_lfun, print_mode);
   }
+  f = srunner_open_tapfile (sr);
+  if (f) {
+    srunner_register_lfun (sr, f, 2, tap_lfun, print_mode);
+  }
   srunner_send_evt (sr, NULL, CLINITLOG_SR);
 }
 
index 3ed38eeb11c4f6a38c6bdabb48e89beb74686e5e..b4650fe3abafc37f15db824cc57cde49b64a5548 100644 (file)
@@ -37,6 +37,9 @@ void lfile_lfun (SRunner *sr, FILE *file, enum print_output,
 void xml_lfun (SRunner *sr, FILE *file, enum print_output,
                  void *obj, enum cl_event evt);
 
+void tap_lfun (SRunner *sr, FILE *file, enum print_output,
+                 void *obj, enum cl_event evt);
+
 void subunit_lfun (SRunner *sr, FILE *file, enum print_output,
                  void *obj, enum cl_event evt);
 
@@ -45,6 +48,7 @@ void srunner_register_lfun (SRunner *sr, FILE *lfile, int close,
 
 FILE *srunner_open_lfile (SRunner *sr);
 FILE *srunner_open_xmlfile (SRunner *sr);
+FILE *srunner_open_tapfile (SRunner *sr);
 void srunner_init_logging (SRunner *sr, enum print_output print_mode);
 void srunner_end_logging (SRunner *sr);