python: pass xfail outcomes to TestResult.addExpectedFailure, when it is defined.
[third_party/subunit] / c / check-subunit-0.9.5.patch
1 === added file 'tests/test_vars.in'
2 --- tests/test_vars.in  1970-01-01 00:00:00 +0000
3 +++ tests/test_vars.in  2007-04-21 06:59:27 +0000
4 @@ -0,0 +1,2 @@
5 +# defined to 1 if subunit is enabled
6 +export ENABLE_SUBUNIT=@ENABLE_SUBUNIT@
7
8 === modified file 'AUTHORS'
9 --- AUTHORS     2006-12-12 19:11:09 +0000
10 +++ AUTHORS     2007-04-21 03:18:23 +0000
11 @@ -14,6 +14,7 @@
12                   Robert Lemmen (gcov description in manual)
13                  Loic Martin (AM_PATH_CHECK patch)
14                  Ross Burton (pkg-config patch)
15 +                Robert Collins (subunit support)
16  
17  Anybody who has contributed code to Check or Check's build system is
18  considered an author.  Send patches to this file to 
19
20 === modified file 'NEWS'
21 --- NEWS        2006-11-21 23:56:21 +0000
22 +++ NEWS        2007-04-21 03:18:23 +0000
23 @@ -1,3 +1,9 @@
24 +In development:
25 +
26 +* Added CK_SUBUNIT support for outputting test information in the subunit wire
27 +  protocol. See the check manual for more information. (Contributed by Robert
28 +  Collins).
29 +
30  Tue, Nov 21, 2006: Released Check 0.9.5
31  
32  * Fixed code coverage support to work with gcc4 and buggy libtool.
33
34 === modified file 'configure.ac'
35 --- configure.ac        2006-12-12 19:11:09 +0000
36 +++ configure.ac        2007-04-21 06:59:27 +0000
37 @@ -65,6 +65,26 @@
38  
39  AM_CONDITIONAL(NO_TIMEOUT_TESTS, test x"$enable_timeout_tests" = "xfalse")
40  
41 +AC_ARG_ENABLE(subunit,
42 +AC_HELP_STRING([--enable-subunit],
43 +              [enable support for the subunit test protocol @<:@default=autodetect@:>@]),
44 +[case "${enableval}" in
45 +  yes)
46 +    enable_subunit=true
47 +    echo "Enabled subunit support"
48 +    ;;
49 +  no)
50 +    enable_subunit=false
51 +    echoo "Disabled subunit support"
52 +    ;;
53 +  autodetect)
54 +    echo "Subunit support will enable automatically."
55 +    ;;
56 +  *)   AC_MSG_ERROR(bad value ${enableval} for --enable-subunit) ;;
57 +esac], 
58 +[echo "Subunit support will enable automatically."
59 + enable_subunit=autodetect])
60 +
61  # Checks for programs.
62  AC_PROG_AWK
63  AC_PROG_CC
64 @@ -85,6 +105,42 @@
65  AC_HEADER_SYS_WAIT
66  AC_CHECK_HEADERS([fcntl.h stddef.h stdint.h stdlib.h string.h sys/time.h unistd.h])
67  
68 +if test xfalse != x"$enable_subunit"; then
69 +AC_CHECK_LIB(subunit, subunit_test_start, ,
70 +[case "$enable_subunit" in
71 + autodetect)
72 +   enable_subunit=false
73 +   ;;
74 + true)
75 +   AC_MSG_ERROR([libunit is required for subunit protocol support. The homepage for subunit is https://launchpad.net/subunit/])
76 +   ;;
77 + esac
78 +])
79 +fi
80 +if test xfalse != x"$enable_subunit"; then
81 +AC_CHECK_HEADER([subunit/child.h], ,
82 +[case "$enable_subunit" in
83 + autodetect)
84 +   enable_subunit=false
85 +   ;;
86 + true)
87 +   AC_MSG_ERROR([The header subunit/child.h could not be succesfully included and is required for subunit protocol support. The homepage for subunit is https://launchpad.net/subunit/])
88 +   ;;
89 + esac
90 +])
91 +fi
92 +if test xfalse = x"$enable_subunit"; then
93 +ENABLE_SUBUNIT="0"
94 +else
95 +ENABLE_SUBUNIT="1"
96 +fi
97 +AC_SUBST(ENABLE_SUBUNIT)
98 +AC_DEFINE_UNQUOTED(ENABLE_SUBUNIT, $ENABLE_SUBUNIT, [Subunit protocol result output])
99 +
100 +AM_CONDITIONAL(SUBUNIT, test x"$enable_subunit" != "xfalse")
101 +
102 +
103 +
104  # Checks for typedefs, structures, and compiler characteristics.
105  AC_C_CONST
106  AC_TYPE_PID_T
107 @@ -112,6 +168,7 @@
108                  doc/Makefile
109                   src/check.h
110                   src/Makefile
111 -                 tests/Makefile])
112 +                 tests/Makefile
113 +                tests/test_vars])
114  
115  AC_OUTPUT
116
117 === modified file 'doc/check.texi'
118 --- doc/check.texi      2007-01-16 21:57:52 +0000
119 +++ doc/check.texi      2007-04-21 03:18:23 +0000
120 @@ -39,6 +39,7 @@
121  @author Chris Pickett
122  @author Fredrik Hugosson
123  @author Robert Lemmen
124 +@author Robert Collins
125  
126  @c The following two commands start the copyright page.
127  @page
128 @@ -98,6 +99,7 @@
129  * Test Timeouts::               
130  * Determining Test Coverage::   
131  * Test Logging::                
132 +* Subunit Support::
133  
134  Test Fixtures
135  
136 @@ -672,6 +674,11 @@
137  which can have the values "silent", "minimal", "normal", "verbose". If
138  the variable is not found or the value is not recognized, the print
139  mode is set to @code{CK_NORMAL}.
140 +
141 +@vindex CK_SUBUNIT
142 +@item CK_SUBUNIT
143 +Prints running progress through the @uref{https://launchpad.net/subunit/,
144 +subunit} test runner protocol. See 'subunit support' under the Advanced Features section for more information.
145  @end table
146  
147  With the @code{CK_NORMAL} flag specified in our @code{main()}, let's
148 @@ -766,6 +773,7 @@
149  * Test Timeouts::               
150  * Determining Test Coverage::   
151  * Test Logging::                
152 +* Subunit Support::
153  @end menu
154  
155  @node Running Multiple Cases, No Fork Mode, Advanced Features, Advanced Features
156 @@ -1147,7 +1155,7 @@
157  you.  For more information or help with other compilers, please refer
158  to the relevant manuals.
159  
160 -@node Test Logging,  , Determining Test Coverage, Advanced Features
161 +@node Test Logging, Subunit Support, Determining Test Coverage, Advanced Features
162  @section Test Logging
163  
164  @findex srunner_set_log()
165 @@ -1250,6 +1258,50 @@
166  @end verbatim
167  @end example
168  
169 +@node Subunit Support, , Test Logging, Advanced Features
170 +@section Subunit Support
171 +
172 +Check supports running test suites with subunit output. This can be useful to
173 +combine test results from multiple languages, or to perform programmatic
174 +analysis on the results of multiple check test suites or otherise handle test
175 +results in a programmatic manner. Using subunit with check is very straight
176 +forward. There are two steps:
177 +1) In your check test suite driver pass 'CK_SUBUNIT' as the output mode
178 +for your srunner.
179 +@example
180 +@verbatim
181 +SRunner *sr;
182 +sr = srunner_create (make_s1_suite ());
183 +srunner_add_suite (sr, make_s2_suite ());
184 +srunner_run_all (sr, CK_SUBUNIT);
185 +@end verbatim
186 +@end example
187 +2) Setup your main language test runner to run your check based test
188 +executable. For instance using python:
189 +@example
190 +@verbatim
191 +
192 +import subunit
193 +
194 +class ShellTests(subunit.ExecTestCase):
195 +    """Run some tests from the C codebase."""
196 +
197 +    def test_group_one(self):
198 +        """./foo/check_driver"""
199 +
200 +    def test_group_two(self):
201 +        """./foo/other_driver"""
202 +@end verbatim
203 +@end example
204 +
205 +In this example, running the test suite ShellTests in python (using any test
206 +runner - unittest.py, tribunal, trial, nose or others) will run
207 +./foo/check_driver and ./foo/other_driver and report on their result.
208 +
209 +Subunit is hosted on launchpad - the @uref{https://launchpad.net/subunit/,
210 +subunit} project there contains bug tracker, future plans, and source code
211 +control details.
212 +
213  @node Conclusion and References, AM_PATH_CHECK, Advanced Features, Top
214  @chapter Conclusion and References
215  The tutorial and description of advanced features has provided an
216
217 === modified file 'src/check.h.in'
218 --- src/check.h.in      2006-12-08 17:47:49 +0000
219 +++ src/check.h.in      2007-04-21 06:59:27 +0000
220 @@ -257,6 +257,9 @@
221    CK_NORMAL, /* All failed tests */
222    CK_VERBOSE, /* All tests */
223    CK_ENV, /* Look at environment var */
224 +#if @ENABLE_SUBUNIT@
225 +  CK_SUBUNIT, /* Run as a subunit child process */
226 +#endif
227    CK_LAST
228  };
229  
230
231 === modified file 'src/check_impl.h'
232 --- src/check_impl.h    2006-10-13 00:24:56 +0000
233 +++ src/check_impl.h    2007-04-21 01:55:36 +0000
234 @@ -89,6 +89,7 @@
235    CLSTART_S,
236    CLEND_SR,
237    CLEND_S,
238 +  CLSTART_T, /* A test case is about to run */
239    CLEND_T
240  };
241  
242
243 === modified file 'src/check_log.c'
244 --- src/check_log.c     2006-10-13 04:10:50 +0000
245 +++ src/check_log.c     2007-04-21 06:59:27 +0000
246 @@ -25,12 +25,16 @@
247  #include <sys/time.h>
248  #include <time.h>
249  #include <check.h>
250 +#if HAVE_SUBUNIT_CHILD_H
251 +#include <subunit/child.h>
252 +#endif
253  
254  #include "check_error.h"
255  #include "check_list.h"
256  #include "check_impl.h"
257  #include "check_log.h"
258  #include "check_print.h"
259 +#include "check_str.h"
260  
261  
262  static void srunner_send_evt (SRunner *sr, void *obj, enum cl_event evt);
263 @@ -107,6 +111,13 @@
264    srunner_send_evt (sr, s, CLEND_S);
265  }
266  
267 +void log_test_start (SRunner *sr, TCase * tc, TF * tfun)
268 +{
269 +  char buffer[100];
270 +  snprintf(buffer, 99, "%s:%s", tc->name, tfun->name);
271 +  srunner_send_evt (sr, buffer, CLSTART_T);
272 +}
273 +
274  void log_test_end (SRunner *sr, TestResult *tr)
275  {
276    srunner_send_evt (sr, tr, CLEND_T);
277 @@ -128,7 +139,6 @@
278  void stdout_lfun (SRunner *sr, FILE *file, enum print_output printmode,
279                   void *obj, enum cl_event evt)
280  {
281 -  TestResult *tr;
282    Suite *s;
283    
284    if (printmode == CK_ENV) {
285 @@ -163,8 +173,9 @@
286    case CLEND_S:
287      s = obj;
288      break;
289 +  case CLSTART_T:
290 +    break;
291    case CLEND_T:
292 -    tr = obj;
293      break;
294    default:
295      eprintf("Bad event type received in stdout_lfun", __FILE__, __LINE__);
296 @@ -197,12 +208,14 @@
297    case CLEND_S:
298      s = obj;
299      break;
300 +  case CLSTART_T:
301 +    break;
302    case CLEND_T:
303      tr = obj;
304      tr_fprint(file, tr, CK_VERBOSE);
305      break;
306    default:
307 -    eprintf("Bad event type received in stdout_lfun", __FILE__, __LINE__);
308 +    eprintf("Bad event type received in lfile_lfun", __FILE__, __LINE__);
309    }
310  
311    
312 @@ -250,6 +263,8 @@
313      fprintf(file, "  </suite>\n");
314      s = obj;
315      break;
316 +  case CLSTART_T:
317 +    break;
318    case CLEND_T:
319      tr = obj;
320      tr_xmlprint(file, tr, CK_VERBOSE);
321 @@ -260,6 +275,66 @@
322  
323  }
324  
325 +#if ENABLE_SUBUNIT
326 +void subunit_lfun (SRunner *sr, FILE *file, enum print_output printmode,
327 +                 void *obj, enum cl_event evt)
328 +{
329 +  TestResult *tr;
330 +  Suite *s;
331 +  char const * name;
332 +  
333 +  /* assert(printmode == CK_SUBUNIT); */
334 +
335 +  switch (evt) {
336 +  case CLINITLOG_SR:
337 +    break;
338 +  case CLENDLOG_SR:
339 +    break;
340 +  case CLSTART_SR:
341 +    break;
342 +  case CLSTART_S:
343 +    s = obj;
344 +    break;
345 +  case CLEND_SR:
346 +    if (printmode > CK_SILENT) {
347 +      fprintf (file, "\n");
348 +      srunner_fprint (file, sr, printmode);
349 +    }
350 +    break;
351 +  case CLEND_S:
352 +    s = obj;
353 +    break;
354 +  case CLSTART_T:
355 +    name = obj;
356 +    subunit_test_start(name);
357 +    break;
358 +  case CLEND_T:
359 +    tr = obj;
360 +    {
361 +      char *name = ck_strdup_printf ("%s:%s", tr->tcname, tr->tname);
362 +      char *msg = tr_short_str (tr);
363 +      switch (tr->rtype) {
364 +       case CK_PASS:
365 +         subunit_test_pass(name);
366 +         break;
367 +       case CK_FAILURE:
368 +         subunit_test_fail(name, msg);
369 +         break;
370 +       case CK_ERROR:
371 +         subunit_test_error(name, msg);
372 +         break;
373 +       default:
374 +         eprintf("Bad result type in subunit_lfun", __FILE__, __LINE__);
375 +        free(name);
376 +        free(msg);
377 +      }
378 +    }
379 +    break;
380 +  default:
381 +    eprintf("Bad event type received in subunit_lfun", __FILE__, __LINE__);
382 +  }
383 +}
384 +#endif
385  
386  FILE *srunner_open_lfile (SRunner *sr)
387  {
388 @@ -289,7 +364,14 @@
389  {
390    FILE *f;
391    sr->loglst = check_list_create();
392 -  srunner_register_lfun (sr, stdout, 0, stdout_lfun, print_mode);
393 +#if ENABLE_SUBUNIT
394 +  if (print_mode != CK_SUBUNIT)
395 +#endif
396 +      srunner_register_lfun (sr, stdout, 0, stdout_lfun, print_mode);
397 +#if ENABLE_SUBUNIT
398 +  else
399 +      srunner_register_lfun (sr, stdout, 0, subunit_lfun, print_mode);
400 +#endif
401    f = srunner_open_lfile (sr);
402    if (f) {
403      srunner_register_lfun (sr, f, 1, lfile_lfun, print_mode);
404
405 === modified file 'src/check_log.h'
406 --- src/check_log.h     2006-10-13 00:24:56 +0000
407 +++ src/check_log.h     2007-04-21 01:55:36 +0000
408 @@ -26,6 +26,7 @@
409  void log_suite_start (SRunner *sr, Suite *s);
410  void log_suite_end (SRunner *sr, Suite *s);
411  void log_test_end (SRunner *sr, TestResult *tr);
412 +void log_test_start (SRunner *sr, TCase *tc, TF *tfun);
413  
414  void stdout_lfun (SRunner *sr, FILE *file, enum print_output,
415                   void *obj, enum cl_event evt);
416 @@ -36,6 +37,9 @@
417  void xml_lfun (SRunner *sr, FILE *file, enum print_output,
418                   void *obj, enum cl_event evt);
419  
420 +void subunit_lfun (SRunner *sr, FILE *file, enum print_output,
421 +                 void *obj, enum cl_event evt);
422 +
423  void srunner_register_lfun (SRunner *sr, FILE *lfile, int close,
424                             LFun lfun, enum print_output);
425  
426
427 === modified file 'src/check_print.c'
428 --- src/check_print.c   2006-10-13 00:24:56 +0000
429 +++ src/check_print.c   2007-04-21 06:59:27 +0000
430 @@ -54,6 +54,11 @@
431  static void srunner_fprint_summary (FILE *file, SRunner *sr,
432                                     enum print_output print_mode)
433  {
434 +#if ENABLE_SUBUNIT
435 +  if (print_mode == CK_SUBUNIT)
436 +      return;
437 +#endif
438 +
439    if (print_mode >= CK_MINIMAL) {
440      char *str;
441  
442 @@ -68,6 +73,11 @@
443                                     enum print_output print_mode)
444  {
445    List *resultlst;
446 +
447 +#if ENABLE_SUBUNIT
448 +  if (print_mode == CK_SUBUNIT)
449 +      return;
450 +#endif
451    
452    resultlst = sr->resultlst;
453    
454
455 === modified file 'src/check_run.c'
456 --- src/check_run.c     2006-11-18 01:02:13 +0000
457 +++ src/check_run.c     2007-04-21 01:55:36 +0000
458 @@ -188,6 +188,7 @@
459  
460      for (i = tfun->loop_start; i < tfun->loop_end; i++)
461      {
462 +      log_test_start (sr, tc, tfun);
463        switch (srunner_fork_status(sr)) {
464         case CK_FORK:
465          tr = tcase_run_tfun_fork (sr, tc, tfun, i);
466
467 === modified file 'src/check_str.c'
468 --- src/check_str.c     2006-10-13 00:24:56 +0000
469 +++ src/check_str.c     2007-04-21 01:55:36 +0000
470 @@ -47,6 +47,20 @@
471    return rstr;
472  }
473  
474 +char *tr_short_str (TestResult *tr) 
475 +{
476 +  const char *exact_msg;
477 +  char *rstr;
478 +  
479 +  exact_msg = (tr->rtype == CK_ERROR) ? "(after this point) ": "";
480 +  
481 +  rstr = ck_strdup_printf ("%s:%d: %s%s",
482 +                           tr->file, tr->line,
483 +                           exact_msg, tr->msg);
484 +
485 +  return rstr;
486 +}
487 +
488  char *sr_stat_str (SRunner *sr)
489  {
490    char *str;
491
492 === modified file 'src/check_str.h'
493 --- src/check_str.h     2006-10-13 00:24:56 +0000
494 +++ src/check_str.h     2007-04-21 01:55:36 +0000
495 @@ -25,6 +25,12 @@
496     value has been malloc'd, and must be freed by the caller */
497  char *tr_str (TestResult *tr);
498  
499 +/* Return a string representation of the given TestResult message
500 +   without the test id or result type. This is suitable for separate
501 +   formatting of the test and the message. Return value has been 
502 +   malloc'd, and must be freed by the caller */
503 +char *tr_short_str (TestResult *tr);
504 +
505  /* Return a string representation of the given SRunner's run
506     statistics (% passed, num run, passed, errors, failures). Return
507     value has been malloc'd, and must be freed by the caller
508
509 === modified file 'tests/Makefile.am'
510 --- tests/Makefile.am   2006-11-17 08:56:43 +0000
511 +++ tests/Makefile.am   2007-04-21 06:59:27 +0000
512 @@ -15,7 +15,7 @@
513         ex_xml_output   \
514         ex_log_output
515  
516 -EXTRA_DIST = test_output.sh test_log_output.sh test_xml_output.sh
517 +EXTRA_DIST = test_output.sh test_log_output.sh test_vars.in test_xml_output.sh
518  
519  if NO_TIMEOUT_TESTS
520  check_check_CFLAGS = -DTIMEOUT_TESTS_ENABLED=0
521
522 === modified file 'tests/check_check_log.c'
523 --- tests/check_check_log.c     2006-10-13 00:24:56 +0000
524 +++ tests/check_check_log.c     2007-04-21 06:59:27 +0000
525 @@ -2,6 +2,9 @@
526  #include <stdlib.h>
527  #include <string.h>
528  #include <check.h>
529 +#include <check_list.h>
530 +#include <check_impl.h>
531 +#include <check_log.h>
532  #include "check_check.h"
533  
534  
535 @@ -78,15 +81,40 @@
536  }
537  END_TEST
538  
539 +#if ENABLE_SUBUNIT
540 +START_TEST(test_init_logging_subunit)
541 +{
542 +  /* init_logging with CK_SUBUNIT sets stdout 
543 +   * to a subunit function, not any log.
544 +   */
545 +  Log * first_log = NULL;
546 +  Suite *s = suite_create("Suite");
547 +  SRunner *sr = srunner_create(s);
548 +  srunner_init_logging(sr, CK_SUBUNIT);
549 +  list_front (sr->loglst);
550 +  fail_if (list_at_end(sr->loglst), "No entries in log list");
551 +  first_log = list_val(sr->loglst);
552 +  fail_if (first_log == NULL, "log is NULL");
553 +  list_advance(sr->loglst);
554 +  fail_unless(list_at_end(sr->loglst), "More than one entry in log list");
555 +  fail_unless(first_log->lfun == subunit_lfun,
556 +              "Log function is not the subunit lfun.");
557 +  srunner_end_logging(sr);
558 +  srunner_free(sr);
559 +}
560 +END_TEST
561 +#endif
562 +
563  Suite *make_log_suite(void)
564  {
565  
566    Suite *s;
567 -  TCase *tc_core, *tc_core_xml;
568 +  TCase *tc_core, *tc_core_xml, *tc_core_subunit;
569  
570    s = suite_create("Log");
571    tc_core = tcase_create("Core");
572    tc_core_xml = tcase_create("Core XML");
573 +  tc_core_subunit = tcase_create("Core SubUnit");
574  
575    suite_add_tcase(s, tc_core);
576    tcase_add_test(tc_core, test_set_log);
577 @@ -98,6 +126,11 @@
578    tcase_add_test(tc_core_xml, test_no_set_xml);
579    tcase_add_test(tc_core_xml, test_double_set_xml);
580  
581 +#if ENABLE_SUBUNIT
582 +  suite_add_tcase(s, tc_core_subunit);
583 +  tcase_add_test(tc_core_subunit, test_init_logging_subunit);
584 +#endif
585 +  
586    return s;
587  }
588  
589
590 === modified file 'tests/ex_output.c'
591 --- tests/ex_output.c   2006-10-13 00:24:56 +0000
592 +++ tests/ex_output.c   2007-04-21 06:59:27 +0000
593 @@ -2,6 +2,7 @@
594  #include <stdio.h>
595  #include <string.h>
596  #include <check.h>
597 +#include "config.h"
598  
599  START_TEST(test_pass)
600  {
601 @@ -47,11 +48,20 @@
602    srunner_free(sr);
603  }
604  
605 +static void print_usage(void)
606 +{
607 +    printf ("Usage: ex_output (CK_SILENT | CK_MINIMAL | CK_NORMAL | CK_VERBOSE");
608 +#if ENABLE_SUBUNIT
609 +    printf (" | CK_SUBUNIT");
610 +#endif
611 +    printf (")\n");
612 +}
613 +
614  int main (int argc, char **argv)
615  {
616    
617    if (argc != 2) {
618 -    printf ("Usage: ex_output (CK_SILENT | CK_MINIMAL | CK_NORMAL | CK_VERBOSE)\n");
619 +    print_usage();
620      return EXIT_FAILURE;
621    }
622  
623 @@ -63,8 +73,12 @@
624      run_tests(CK_NORMAL);
625    else if (strcmp (argv[1], "CK_VERBOSE") == 0)
626      run_tests(CK_VERBOSE);
627 +#if ENABLE_SUBUNIT
628 +  else if (strcmp (argv[1], "CK_SUBUNIT") == 0)
629 +    run_tests(CK_SUBUNIT);
630 +#endif
631    else {
632 -    printf ("Usage: ex_output (CK_SILENT | CK_MINIMAL | CK_NORMAL | CK_VERBOSE)\n");
633 +    print_usage();
634      return EXIT_FAILURE;
635    }    
636      
637
638 === modified file 'tests/test_output.sh'
639 --- tests/test_output.sh        2006-10-13 00:24:56 +0000
640 +++ tests/test_output.sh        2007-04-21 06:59:27 +0000
641 @@ -1,5 +1,7 @@
642  #!/bin/sh
643  
644 +. "${srcdir}/"test_vars
645 +
646  if [ "${srcdir}" = "." ]; then
647      lsrc=""
648  else
649 @@ -18,12 +20,24 @@
650  ${lsrc}ex_output.c:8:P:Core:test_pass:0: Passed
651  ${lsrc}ex_output.c:14:F:Core:test_fail:0: Failure
652  ${lsrc}ex_output.c:18:E:Core:test_exit:0: (after this point) Early exit with return value 1"
653 +t4="xtest: Core:test_pass
654 +success: Core:test_pass
655 +test: Core:test_fail
656 +failure: Core:test_fail [
657 +${lsrc}ex_output.c:14: Failure
658 +]
659 +test: Core:test_exit
660 +error: Core:test_exit [
661 +${lsrc}ex_output.c:18: (after this point) Early exit with return value 1
662 +]"
663  
664  op0=`./ex_output CK_SILENT`
665  op1=`./ex_output CK_MINIMAL`
666  op2=`./ex_output CK_NORMAL`
667  op3=`./ex_output CK_VERBOSE`
668 -
669 +if test 1 -eq $ENABLE_SUBUNIT; then
670 +op4=`./ex_output CK_SUBUNIT`
671 +fi
672  
673  test_output ( ) {
674      if [ "${1}" != "${2}" ]; then
675 @@ -41,4 +55,7 @@
676  test_output "$t1" x"$op1" "CK_MINIMAL";
677  test_output "$t2" x"$op2" "CK_NORMAL";
678  test_output "$t3" x"$op3" "CK_VERBOSE";
679 +if test 1 -eq $ENABLE_SUBUNIT; then
680 +test_output "$t4" x"$op4" "CK_SUBUNIT";
681 +fi
682  exit 0
683