This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Upgrade to Test::Harness 2.27_02.
[perl5.git] / lib / Test / Harness.pm
CommitLineData
d667a7e6 1# -*- Mode: cperl; cperl-indent-level: 4 -*-
a72fde19 2# $Id: Harness.pm,v 1.43 2003/03/24 20:09:50 andy Exp $
b82fa0b7 3
a0d0e21e
LW
4package Test::Harness;
5
b82fa0b7 6require 5.004;
13287dd5
MS
7use Test::Harness::Straps;
8use Test::Harness::Assert;
a0d0e21e
LW
9use Exporter;
10use Benchmark;
4633a7c4 11use Config;
760ac839
LW
12use strict;
13
b82fa0b7 14use vars qw($VERSION $Verbose $Switches $Have_Devel_Corestack $Curtest
d5d4ec93 15 $Columns $verbose $switches $ML $Strap
b82fa0b7
MS
16 @ISA @EXPORT @EXPORT_OK
17 );
4633a7c4 18
9c5c68c8
MS
19# Backwards compatibility for exportable variable names.
20*verbose = \$Verbose;
21*switches = \$Switches;
22
23$Have_Devel_Corestack = 0;
24
a72fde19 25$VERSION = '2.27_02';
9b0ceca9 26
f19ae7a7
JD
27$ENV{HARNESS_ACTIVE} = 1;
28
13287dd5
MS
29END {
30 # For VMS.
31 delete $ENV{HARNESS_ACTIVE};
32}
33
9b0ceca9 34# Some experimental versions of OS/2 build have broken $?
9c5c68c8
MS
35my $Ignore_Exitcode = $ENV{HARNESS_IGNORE_EXITCODE};
36
37my $Files_In_Dir = $ENV{HARNESS_FILELEAK_IN_DIR};
9b0ceca9 38
d5d4ec93 39$Strap = Test::Harness::Straps->new;
17a79f5b 40
9c5c68c8
MS
41@ISA = ('Exporter');
42@EXPORT = qw(&runtests);
43@EXPORT_OK = qw($verbose $switches);
4633a7c4 44
356733da 45$Verbose = $ENV{HARNESS_VERBOSE} || 0;
9c5c68c8
MS
46$Switches = "-w";
47$Columns = $ENV{HARNESS_COLUMNS} || $ENV{COLUMNS} || 80;
b82fa0b7
MS
48$Columns--; # Some shells have trouble with a full line of text.
49
50
51=head1 NAME
52
53Test::Harness - run perl standard test scripts with statistics
54
55=head1 SYNOPSIS
56
57 use Test::Harness;
58
59 runtests(@test_files);
60
61=head1 DESCRIPTION
a0d0e21e 62
b82fa0b7
MS
63B<STOP!> If all you want to do is write a test script, consider using
64Test::Simple. Otherwise, read on.
65
66(By using the Test module, you can write test scripts without
67knowing the exact output this module expects. However, if you need to
68know the specifics, read on!)
69
70Perl test scripts print to standard output C<"ok N"> for each single
71test, where C<N> is an increasing sequence of integers. The first line
72output by a standard test script is C<"1..M"> with C<M> being the
73number of tests that should be run within the test
74script. Test::Harness::runtests(@tests) runs all the testscripts
75named as arguments and checks standard output for the expected
76C<"ok N"> strings.
77
78After all tests have been performed, runtests() prints some
79performance statistics that are computed by the Benchmark module.
80
81=head2 The test script output
82
83The following explains how Test::Harness interprets the output of your
84test program.
85
86=over 4
87
88=item B<'1..M'>
89
356733da
MS
90This header tells how many tests there will be. For example, C<1..10>
91means you plan on running 10 tests. This is a safeguard in case your
92test dies quietly in the middle of its run.
93
94It should be the first non-comment line output by your test program.
b82fa0b7 95
356733da
MS
96In certain instances, you may not know how many tests you will
97ultimately be running. In this case, it is permitted for the 1..M
98header to appear as the B<last> line output by your test (again, it
99can be followed by further comments).
b82fa0b7
MS
100
101Under B<no> circumstances should 1..M appear in the middle of your
102output or more than once.
103
104
105=item B<'ok', 'not ok'. Ok?>
106
107Any output from the testscript to standard error is ignored and
108bypassed, thus will be seen by the user. Lines written to standard
109output containing C</^(not\s+)?ok\b/> are interpreted as feedback for
110runtests(). All other lines are discarded.
111
112C</^not ok/> indicates a failed test. C</^ok/> is a successful test.
113
114
115=item B<test numbers>
116
117Perl normally expects the 'ok' or 'not ok' to be followed by a test
118number. It is tolerated if the test numbers after 'ok' are
119omitted. In this case Test::Harness maintains temporarily its own
120counter until the script supplies test numbers again. So the following
121test script
122
123 print <<END;
124 1..6
125 not ok
126 ok
127 not ok
128 ok
129 ok
130 END
131
132will generate
133
134 FAILED tests 1, 3, 6
135 Failed 3/6 tests, 50.00% okay
136
13287dd5 137=item B<test names>
b82fa0b7 138
13287dd5
MS
139Anything after the test number but before the # is considered to be
140the name of the test.
b82fa0b7 141
13287dd5 142 ok 42 this is the name of the test
b82fa0b7 143
13287dd5 144Currently, Test::Harness does nothing with this information.
b82fa0b7
MS
145
146=item B<Skipping tests>
147
148If the standard output line contains the substring C< # Skip> (with
149variations in spacing and case) after C<ok> or C<ok NUMBER>, it is
150counted as a skipped test. If the whole testscript succeeds, the
151count of skipped tests is included in the generated output.
152C<Test::Harness> reports the text after C< # Skip\S*\s+> as a reason
356733da 153for skipping.
b82fa0b7
MS
154
155 ok 23 # skip Insufficient flogiston pressure.
156
157Similarly, one can include a similar explanation in a C<1..0> line
158emitted if the test script is skipped completely:
159
160 1..0 # Skipped: no leverage found
161
162=item B<Todo tests>
163
164If the standard output line contains the substring C< # TODO> after
165C<not ok> or C<not ok NUMBER>, it is counted as a todo test. The text
166afterwards is the thing that has to be done before this test will
167succeed.
168
169 not ok 13 # TODO harness the power of the atom
170
13287dd5
MS
171=begin _deprecated
172
173Alternatively, you can specify a list of what tests are todo as part
174of the test header.
175
176 1..23 todo 5 12 23
177
178This only works if the header appears at the beginning of the test.
179
180This style is B<deprecated>.
181
182=end _deprecated
183
b82fa0b7
MS
184These tests represent a feature to be implemented or a bug to be fixed
185and act as something of an executable "thing to do" list. They are
186B<not> expected to succeed. Should a todo test begin succeeding,
187Test::Harness will report it as a bonus. This indicates that whatever
188you were supposed to do has been done and you should promote this to a
189normal test.
190
191=item B<Bail out!>
192
193As an emergency measure, a test script can decide that further tests
194are useless (e.g. missing dependencies) and testing should stop
195immediately. In that case the test script prints the magic words
196
197 Bail out!
198
199to standard output. Any message after these words will be displayed by
200C<Test::Harness> as the reason why testing is stopped.
201
202=item B<Comments>
203
204Additional comments may be put into the testing output on their own
205lines. Comment lines should begin with a '#', Test::Harness will
206ignore them.
207
208 ok 1
209 # Life is good, the sun is shining, RAM is cheap.
210 not ok 2
211 # got 'Bush' expected 'Gore'
212
213=item B<Anything else>
214
215Any other output Test::Harness sees it will silently ignore B<BUT WE
216PLAN TO CHANGE THIS!> If you wish to place additional output in your
217test script, please use a comment.
218
219=back
220
221
13287dd5
MS
222=head2 Taint mode
223
224Test::Harness will honor the C<-T> in the #! line on your test files. So
225if you begin a test with:
226
227 #!perl -T
228
229the test will be run with taint mode on.
230
231
232=head2 Configuration variables.
233
234These variables can be used to configure the behavior of
235Test::Harness. They are exported on request.
236
237=over 4
238
239=item B<$Test::Harness::verbose>
240
241The global variable $Test::Harness::verbose is exportable and can be
242used to let runtests() display the standard output of the script
243without altering the behavior otherwise.
244
245=item B<$Test::Harness::switches>
246
247The global variable $Test::Harness::switches is exportable and can be
248used to set perl command line options used for running the test
249script(s). The default value is C<-w>.
250
251=back
252
253
b82fa0b7
MS
254=head2 Failure
255
256It will happen, your tests will fail. After you mop up your ego, you
257can begin examining the summary report:
258
2fe373ce
MS
259 t/base..............ok
260 t/nonumbers.........ok
261 t/ok................ok
262 t/test-harness......ok
263 t/waterloo..........dubious
b82fa0b7
MS
264 Test returned status 3 (wstat 768, 0x300)
265 DIED. FAILED tests 1, 3, 5, 7, 9, 11, 13, 15, 17, 19
266 Failed 10/20 tests, 50.00% okay
267 Failed Test Stat Wstat Total Fail Failed List of Failed
268 -----------------------------------------------------------------------
269 t/waterloo.t 3 768 20 10 50.00% 1 3 5 7 9 11 13 15 17 19
270 Failed 1/5 test scripts, 80.00% okay. 10/44 subtests failed, 77.27% okay.
271
272Everything passed but t/waterloo.t. It failed 10 of 20 tests and
273exited with non-zero status indicating something dubious happened.
274
275The columns in the summary report mean:
276
277=over 4
278
279=item B<Failed Test>
280
281The test file which failed.
282
283=item B<Stat>
284
285If the test exited with non-zero, this is its exit status.
286
287=item B<Wstat>
288
289The wait status of the test I<umm, I need a better explanation here>.
290
291=item B<Total>
292
293Total number of tests expected to run.
294
295=item B<Fail>
296
297Number which failed, either from "not ok" or because they never ran.
298
299=item B<Failed>
300
301Percentage of the total tests which failed.
302
303=item B<List of Failed>
304
305A list of the tests which failed. Successive failures may be
306abbreviated (ie. 15-20 to indicate that tests 15, 16, 17, 18, 19 and
30720 failed).
308
309=back
310
311
312=head2 Functions
313
314Test::Harness currently only has one function, here it is.
315
316=over 4
317
318=item B<runtests>
319
320 my $allok = runtests(@test_files);
321
322This runs all the given @test_files and divines whether they passed
323or failed based on their output to STDOUT (details above). It prints
324out each individual test which failed along with a summary report and
325a how long it all took.
326
d5d4ec93
MS
327It returns true if everything was ok. Otherwise it will die() with
328one of the messages in the DIAGNOSTICS section.
b82fa0b7
MS
329
330=for _private
331This is just _run_all_tests() plus _show_results()
332
333=cut
17a79f5b 334
a0d0e21e
LW
335sub runtests {
336 my(@tests) = @_;
9c5c68c8 337
b82fa0b7
MS
338 local ($\, $,);
339
340 my($tot, $failedtests) = _run_all_tests(@tests);
9c5c68c8
MS
341 _show_results($tot, $failedtests);
342
2fe373ce 343 my $ok = _all_ok($tot);
b82fa0b7 344
13287dd5
MS
345 assert(($ok xor keys %$failedtests),
346 q{ok status jives with $failedtests});
b82fa0b7
MS
347
348 return $ok;
349}
350
351=begin _private
352
2fe373ce
MS
353=item B<_all_ok>
354
355 my $ok = _all_ok(\%tot);
356
357Tells you if this test run is overall successful or not.
358
359=cut
360
361sub _all_ok {
362 my($tot) = shift;
363
364 return $tot->{bad} == 0 && ($tot->{max} || $tot->{skipped}) ? 1 : 0;
365}
366
b82fa0b7
MS
367=item B<_globdir>
368
369 my @files = _globdir $dir;
370
371Returns all the files in a directory. This is shorthand for backwards
372compatibility on systems where glob() doesn't work right.
373
374=cut
375
376sub _globdir {
377 opendir DIRH, shift;
378 my @f = readdir DIRH;
379 closedir DIRH;
380
381 return @f;
9c5c68c8
MS
382}
383
b82fa0b7
MS
384=item B<_run_all_tests>
385
386 my($total, $failed) = _run_all_tests(@test_files);
387
388Runs all the given @test_files (as runtests()) but does it quietly (no
389report). $total is a hash ref summary of all the tests run. Its keys
390and values are this:
391
392 bonus Number of individual todo tests unexpectedly passed
393 max Number of individual tests ran
394 ok Number of individual tests passed
395 sub_skipped Number of individual tests skipped
2fe373ce 396 todo Number of individual todo tests
b82fa0b7
MS
397
398 files Number of test files ran
399 good Number of test files passed
400 bad Number of test files failed
401 tests Number of test files originally given
402 skipped Number of test files skipped
403
404If $total->{bad} == 0 and $total->{max} > 0, you've got a successful
405test.
406
407$failed is a hash ref of all the test scripts which failed. Each key
408is the name of a test script, each value is another hash representing
409how that script failed. Its keys are these:
9c5c68c8 410
b82fa0b7
MS
411 name Name of the test which failed
412 estat Script's exit value
413 wstat Script's wait status
414 max Number of individual tests
415 failed Number which failed
416 percent Percentage of tests which failed
417 canon List of tests which failed (as string).
418
419Needless to say, $failed should be empty if everything passed.
420
421B<NOTE> Currently this function is still noisy. I'm working on it.
422
423=cut
424
308957f5 425#'#
b82fa0b7 426sub _run_all_tests {
9c5c68c8 427 my(@tests) = @_;
a0d0e21e 428 local($|) = 1;
9c5c68c8
MS
429 my(%failedtests);
430
431 # Test-wide totals.
432 my(%tot) = (
433 bonus => 0,
434 max => 0,
435 ok => 0,
436 files => 0,
437 bad => 0,
438 good => 0,
439 tests => scalar @tests,
440 sub_skipped => 0,
2fe373ce 441 todo => 0,
9c5c68c8 442 skipped => 0,
2fe373ce 443 bench => 0,
9c5c68c8 444 );
774d564b 445
b82fa0b7 446 my @dir_files = _globdir $Files_In_Dir if defined $Files_In_Dir;
a0d0e21e 447 my $t_start = new Benchmark;
9c5c68c8 448
13287dd5 449 my $width = _leader_width(@tests);
b82fa0b7 450 foreach my $tfile (@tests) {
13287dd5 451
7a315204 452 my($leader, $ml) = _mk_leader($tfile, $width);
308957f5 453 local $ML = $ml;
b82fa0b7 454 print $leader;
9c5c68c8 455
356733da
MS
456 $tot{files}++;
457
308957f5 458 $Strap->{_seen_header} = 0;
0be28027
JH
459 my %results = $Strap->analyze_file($tfile) or
460 do { warn "$Strap->{error}\n"; next };
308957f5 461
9c5c68c8 462 # state of the current test.
308957f5
JH
463 my @failed = grep { !$results{details}[$_-1]{ok} }
464 1..@{$results{details}};
9c5c68c8 465 my %test = (
308957f5
JH
466 ok => $results{ok},
467 'next' => $Strap->{'next'},
468 max => $results{max},
469 failed => \@failed,
470 bonus => $results{bonus},
471 skipped => $results{skip},
a72fde19 472 skip_reason => $results{skip_reason},
c0bb2de7 473 skip_all => $Strap->{skip_all},
9c5c68c8
MS
474 ml => $ml,
475 );
476
308957f5
JH
477 $tot{bonus} += $results{bonus};
478 $tot{max} += $results{max};
479 $tot{ok} += $results{ok};
480 $tot{todo} += $results{todo};
481 $tot{sub_skipped} += $results{skip};
9c5c68c8 482
308957f5 483 my($estatus, $wstatus) = @results{qw(exit wait)};
b82fa0b7 484
a72fde19 485 if ($results{passing}) {
2fe373ce
MS
486 if ($test{max} and $test{skipped} + $test{bonus}) {
487 my @msg;
488 push(@msg, "$test{skipped}/$test{max} skipped: $test{skip_reason}")
489 if $test{skipped};
490 push(@msg, "$test{bonus}/$test{max} unexpectedly succeeded")
491 if $test{bonus};
f0008e52 492 print "$test{ml}ok\n ".join(', ', @msg)."\n";
2fe373ce
MS
493 } elsif ($test{max}) {
494 print "$test{ml}ok\n";
d5d4ec93 495 } elsif (defined $test{skip_all} and length $test{skip_all}) {
c0bb2de7 496 print "skipped\n all skipped: $test{skip_all}\n";
2fe373ce
MS
497 $tot{skipped}++;
498 } else {
0be28027 499 print "skipped\n all skipped: no reason given\n";
2fe373ce
MS
500 $tot{skipped}++;
501 }
502 $tot{good}++;
503 }
b82fa0b7 504 else {
a72fde19
JH
505 # List unrun tests as failures.
506 if ($test{'next'} <= $test{max}) {
507 push @{$test{failed}}, $test{'next'}..$test{max};
508 }
509 # List overruns as failures.
510 else {
511 my $details = $results{details};
512 foreach my $overrun ($test{max}+1..@$details)
513 {
514 next unless ref $details->[$overrun-1];
515 push @{$test{failed}}, $overrun
b82fa0b7 516 }
a72fde19
JH
517 }
518
519 if ($wstatus) {
520 $failedtests{$tfile} = _dubious_return(\%test, \%tot,
521 $estatus, $wstatus);
522 $failedtests{$tfile}{name} = $tfile;
523 }
524 elsif($results{seen}) {
b82fa0b7
MS
525 if (@{$test{failed}}) {
526 my ($txt, $canon) = canonfailed($test{max},$test{skipped},
527 @{$test{failed}});
528 print "$test{ml}$txt";
529 $failedtests{$tfile} = { canon => $canon,
530 max => $test{max},
531 failed => scalar @{$test{failed}},
532 name => $tfile,
533 percent => 100*(scalar @{$test{failed}})/$test{max},
534 estat => '',
535 wstat => '',
536 };
537 } else {
538 print "Don't know which tests failed: got $test{ok} ok, ".
539 "expected $test{max}\n";
540 $failedtests{$tfile} = { canon => '??',
541 max => $test{max},
542 failed => '??',
543 name => $tfile,
544 percent => undef,
545 estat => '',
546 wstat => '',
547 };
548 }
549 $tot{bad}++;
a72fde19 550 } else {
b82fa0b7
MS
551 print "FAILED before any test output arrived\n";
552 $tot{bad}++;
553 $failedtests{$tfile} = { canon => '??',
554 max => '??',
555 failed => '??',
556 name => $tfile,
557 percent => undef,
558 estat => '',
559 wstat => '',
560 };
561 }
562 }
563
2fe373ce
MS
564 if (defined $Files_In_Dir) {
565 my @new_dir_files = _globdir $Files_In_Dir;
566 if (@new_dir_files != @dir_files) {
567 my %f;
568 @f{@new_dir_files} = (1) x @new_dir_files;
569 delete @f{@dir_files};
570 my @f = sort keys %f;
571 print "LEAKED FILES: @f\n";
572 @dir_files = @new_dir_files;
573 }
574 }
a0d0e21e 575 }
9c5c68c8 576 $tot{bench} = timediff(new Benchmark, $t_start);
d667a7e6 577
13287dd5 578 $Strap->_restore_PERL5LIB;
9c5c68c8
MS
579
580 return(\%tot, \%failedtests);
581}
582
b82fa0b7
MS
583=item B<_mk_leader>
584
7a315204 585 my($leader, $ml) = _mk_leader($test_file, $width);
b82fa0b7
MS
586
587Generates the 't/foo........' $leader for the given $test_file as well
588as a similar version which will overwrite the current line (by use of
589\r and such). $ml may be empty if Test::Harness doesn't think you're
2fe373ce
MS
590on TTY.
591
592The $width is the width of the "yada/blah.." string.
b82fa0b7
MS
593
594=cut
595
596sub _mk_leader {
2fe373ce
MS
597 my($te, $width) = @_;
598 chomp($te);
b695f709 599 $te =~ s/\.\w+$/./;
b82fa0b7 600
356733da 601 if ($^O eq 'VMS') { $te =~ s/^.*\.t\./\[.t./s; }
b82fa0b7 602 my $blank = (' ' x 77);
7a315204 603 my $leader = "$te" . '.' x ($width - length($te));
b82fa0b7
MS
604 my $ml = "";
605
606 $ml = "\r$blank\r$leader"
607 if -t STDOUT and not $ENV{HARNESS_NOTTY} and not $Verbose;
608
609 return($leader, $ml);
610}
611
13287dd5
MS
612=item B<_leader_width>
613
614 my($width) = _leader_width(@test_files);
615
616Calculates how wide the leader should be based on the length of the
617longest test name.
618
619=cut
620
621sub _leader_width {
622 my $maxlen = 0;
623 my $maxsuflen = 0;
624 foreach (@_) {
625 my $suf = /\.(\w+)$/ ? $1 : '';
626 my $len = length;
627 my $suflen = length $suf;
628 $maxlen = $len if $len > $maxlen;
629 $maxsuflen = $suflen if $suflen > $maxsuflen;
630 }
356733da
MS
631 # + 3 : we want three dots between the test name and the "ok"
632 return $maxlen + 3 - $maxsuflen;
13287dd5
MS
633}
634
9c5c68c8
MS
635
636sub _show_results {
637 my($tot, $failedtests) = @_;
638
639 my $pct;
640 my $bonusmsg = _bonusmsg($tot);
641
2fe373ce
MS
642 if (_all_ok($tot)) {
643 print "All tests successful$bonusmsg.\n";
644 } elsif (!$tot->{tests}){
645 die "FAILED--no tests were run for some reason.\n";
646 } elsif (!$tot->{max}) {
647 my $blurb = $tot->{tests}==1 ? "script" : "scripts";
648 die "FAILED--$tot->{tests} test $blurb could be run, ".
9c5c68c8 649 "alas--no output ever seen\n";
c07a80fd 650 } else {
2fe373ce
MS
651 $pct = sprintf("%.2f", $tot->{good} / $tot->{tests} * 100);
652 my $percent_ok = 100*$tot->{ok}/$tot->{max};
653 my $subpct = sprintf " %d/%d subtests failed, %.2f%% okay.",
654 $tot->{max} - $tot->{ok}, $tot->{max},
655 $percent_ok;
0a931e4a 656
9c5c68c8 657 my($fmt_top, $fmt) = _create_fmts($failedtests);
0a931e4a 658
2fe373ce
MS
659 # Now write to formats
660 for my $script (sort keys %$failedtests) {
661 $Curtest = $failedtests->{$script};
662 write;
663 }
664 if ($tot->{bad}) {
665 $bonusmsg =~ s/^,\s*//;
666 print "$bonusmsg.\n" if $bonusmsg;
667 die "Failed $tot->{bad}/$tot->{tests} test scripts, $pct% okay.".
9c5c68c8 668 "$subpct\n";
2fe373ce 669 }
c07a80fd 670 }
f0a9308e 671
9c5c68c8
MS
672 printf("Files=%d, Tests=%d, %s\n",
673 $tot->{files}, $tot->{max}, timestr($tot->{bench}, 'nop'));
674}
675
676
308957f5
JH
677my %Handlers = ();
678$Strap->{callback} = sub {
679 my($self, $line, $type, $totals) = @_;
680 print $line if $Verbose;
9c5c68c8 681
308957f5
JH
682 my $meth = $Handlers{$type};
683 $meth->($self, $line, $type, $totals) if $meth;
684};
9c5c68c8 685
9c5c68c8 686
308957f5
JH
687$Handlers{header} = sub {
688 my($self, $line, $type, $totals) = @_;
9c5c68c8 689
308957f5 690 warn "Test header seen more than once!\n" if $self->{_seen_header};
9c5c68c8 691
308957f5 692 $self->{_seen_header}++;
9c5c68c8 693
308957f5
JH
694 warn "1..M can only appear at the beginning or end of tests\n"
695 if $totals->{seen} &&
696 $totals->{max} < $totals->{seen};
697};
13287dd5 698
308957f5
JH
699$Handlers{test} = sub {
700 my($self, $line, $type, $totals) = @_;
9c5c68c8 701
308957f5
JH
702 my $curr = $totals->{seen};
703 my $next = $self->{'next'};
704 my $max = $totals->{max};
705 my $detail = $totals->{details}[-1];
b82fa0b7 706
308957f5
JH
707 if( $detail->{ok} ) {
708 _print_ml("ok $curr/$max");
356733da 709
308957f5 710 if( $detail->{type} eq 'skip' ) {
a72fde19
JH
711 $totals->{skip_reason} = $detail->{reason}
712 unless defined $totals->{skip_reason};
713 $totals->{skip_reason} = 'various reasons'
714 if $totals->{skip_reason} ne $detail->{reason};
308957f5 715 }
b82fa0b7
MS
716 }
717 else {
308957f5 718 _print_ml("NOK $curr");
b82fa0b7 719 }
b82fa0b7 720
308957f5
JH
721 if( $curr > $next ) {
722 print "Test output counter mismatch [test $curr]\n";
723 }
724 elsif( $curr < $next ) {
725 print "Confused test output: test $curr answered after ".
726 "test ", $next - 1, "\n";
727 }
b82fa0b7 728
308957f5 729};
2fe373ce 730
308957f5
JH
731$Handlers{bailout} = sub {
732 my($self, $line, $type, $totals) = @_;
9c5c68c8 733
308957f5
JH
734 die "FAILED--Further testing stopped" .
735 ($self->{bailout_reason} ? ": $self->{bailout_reason}\n" : ".\n");
736};
356733da 737
9c5c68c8 738
308957f5
JH
739sub _print_ml {
740 print join '', $ML, @_ if $ML;
9c5c68c8
MS
741}
742
743
744sub _bonusmsg {
745 my($tot) = @_;
746
747 my $bonusmsg = '';
748 $bonusmsg = (" ($tot->{bonus} subtest".($tot->{bonus} > 1 ? 's' : '').
2fe373ce
MS
749 " UNEXPECTEDLY SUCCEEDED)")
750 if $tot->{bonus};
9c5c68c8
MS
751
752 if ($tot->{skipped}) {
2fe373ce 753 $bonusmsg .= ", $tot->{skipped} test"
9c5c68c8 754 . ($tot->{skipped} != 1 ? 's' : '');
2fe373ce
MS
755 if ($tot->{sub_skipped}) {
756 $bonusmsg .= " and $tot->{sub_skipped} subtest"
757 . ($tot->{sub_skipped} != 1 ? 's' : '');
758 }
759 $bonusmsg .= ' skipped';
9c5c68c8
MS
760 }
761 elsif ($tot->{sub_skipped}) {
2fe373ce
MS
762 $bonusmsg .= ", $tot->{sub_skipped} subtest"
763 . ($tot->{sub_skipped} != 1 ? 's' : '')
764 . " skipped";
9c5c68c8
MS
765 }
766
767 return $bonusmsg;
768}
769
9c5c68c8
MS
770# Test program go boom.
771sub _dubious_return {
772 my($test, $tot, $estatus, $wstatus) = @_;
773 my ($failed, $canon, $percent) = ('??', '??');
774
775 printf "$test->{ml}dubious\n\tTest returned status $estatus ".
776 "(wstat %d, 0x%x)\n",
777 $wstatus,$wstatus;
778 print "\t\t(VMS status is $estatus)\n" if $^O eq 'VMS';
779
780 if (corestatus($wstatus)) { # until we have a wait module
781 if ($Have_Devel_Corestack) {
782 Devel::CoreStack::stack($^X);
783 } else {
784 print "\ttest program seems to have generated a core\n";
785 }
786 }
787
788 $tot->{bad}++;
789
790 if ($test->{max}) {
b82fa0b7 791 if ($test->{'next'} == $test->{max} + 1 and not @{$test->{failed}}) {
9c5c68c8
MS
792 print "\tafter all the subtests completed successfully\n";
793 $percent = 0;
2fe373ce 794 $failed = 0; # But we do not set $canon!
9c5c68c8
MS
795 }
796 else {
b82fa0b7 797 push @{$test->{failed}}, $test->{'next'}..$test->{max};
9c5c68c8
MS
798 $failed = @{$test->{failed}};
799 (my $txt, $canon) = canonfailed($test->{max},$test->{skipped},@{$test->{failed}});
800 $percent = 100*(scalar @{$test->{failed}})/$test->{max};
801 print "DIED. ",$txt;
802 }
803 }
804
805 return { canon => $canon, max => $test->{max} || '??',
806 failed => $failed,
66fd8cb9 807 percent => $percent,
9c5c68c8
MS
808 estat => $estatus, wstat => $wstatus,
809 };
810}
811
812
9c5c68c8
MS
813sub _create_fmts {
814 my($failedtests) = @_;
815
b82fa0b7
MS
816 my $failed_str = "Failed Test";
817 my $middle_str = " Stat Wstat Total Fail Failed ";
9c5c68c8
MS
818 my $list_str = "List of Failed";
819
820 # Figure out our longest name string for formatting purposes.
821 my $max_namelen = length($failed_str);
822 foreach my $script (keys %$failedtests) {
823 my $namelen = length $failedtests->{$script}->{name};
824 $max_namelen = $namelen if $namelen > $max_namelen;
825 }
826
827 my $list_len = $Columns - length($middle_str) - $max_namelen;
828 if ($list_len < length($list_str)) {
829 $list_len = length($list_str);
830 $max_namelen = $Columns - length($middle_str) - $list_len;
831 if ($max_namelen < length($failed_str)) {
832 $max_namelen = length($failed_str);
833 $Columns = $max_namelen + length($middle_str) + $list_len;
834 }
835 }
836
837 my $fmt_top = "format STDOUT_TOP =\n"
b82fa0b7 838 . sprintf("%-${max_namelen}s", $failed_str)
9c5c68c8 839 . $middle_str
2fe373ce
MS
840 . $list_str . "\n"
841 . "-" x $Columns
842 . "\n.\n";
9c5c68c8
MS
843
844 my $fmt = "format STDOUT =\n"
2fe373ce 845 . "@" . "<" x ($max_namelen - 1)
b82fa0b7 846 . " @>> @>>>> @>>>> @>>> ^##.##% "
2fe373ce
MS
847 . "^" . "<" x ($list_len - 1) . "\n"
848 . '{ $Curtest->{name}, $Curtest->{estat},'
849 . ' $Curtest->{wstat}, $Curtest->{max},'
850 . ' $Curtest->{failed}, $Curtest->{percent},'
851 . ' $Curtest->{canon}'
852 . "\n}\n"
853 . "~~" . " " x ($Columns - $list_len - 2) . "^"
854 . "<" x ($list_len - 1) . "\n"
855 . '$Curtest->{canon}'
856 . "\n.\n";
9c5c68c8
MS
857
858 eval $fmt_top;
859 die $@ if $@;
860 eval $fmt;
861 die $@ if $@;
862
863 return($fmt_top, $fmt);
864}
865
b82fa0b7
MS
866{
867 my $tried_devel_corestack;
9c5c68c8 868
b82fa0b7
MS
869 sub corestatus {
870 my($st) = @_;
c0ee6f5c 871
a72fde19
JH
872 my $did_core;
873 eval { # we may not have a WCOREDUMP
356733da 874 local $^W = 0; # *.ph files are often *very* noisy
a72fde19
JH
875 require 'wait.ph';
876 $did_core = WCOREDUMP($st);
356733da 877 };
a72fde19
JH
878 if( $@ ) {
879 $did_core = $st & 0200;
880 }
c0ee6f5c 881
b82fa0b7
MS
882 eval { require Devel::CoreStack; $Have_Devel_Corestack++ }
883 unless $tried_devel_corestack++;
c0ee6f5c 884
356733da 885 return $did_core;
b82fa0b7 886 }
c0ee6f5c 887}
888
c07a80fd 889sub canonfailed ($@) {
89d3b7e2 890 my($max,$skipped,@failed) = @_;
6c31b336
A
891 my %seen;
892 @failed = sort {$a <=> $b} grep !$seen{$_}++, @failed;
c07a80fd 893 my $failed = @failed;
894 my @result = ();
895 my @canon = ();
896 my $min;
897 my $last = $min = shift @failed;
760ac839 898 my $canon;
c07a80fd 899 if (@failed) {
2fe373ce
MS
900 for (@failed, $failed[-1]) { # don't forget the last one
901 if ($_ > $last+1 || $_ == $last) {
902 if ($min == $last) {
903 push @canon, $last;
904 } else {
905 push @canon, "$min-$last";
906 }
907 $min = $_;
908 }
909 $last = $_;
910 }
911 local $" = ", ";
912 push @result, "FAILED tests @canon\n";
913 $canon = join ' ', @canon;
a0d0e21e 914 } else {
2fe373ce
MS
915 push @result, "FAILED test $last\n";
916 $canon = $last;
a0d0e21e 917 }
c07a80fd 918
919 push @result, "\tFailed $failed/$max tests, ";
89d3b7e2
IZ
920 push @result, sprintf("%.2f",100*(1-$failed/$max)), "% okay";
921 my $ender = 's' x ($skipped > 1);
922 my $good = $max - $failed - $skipped;
923 my $goodper = sprintf("%.2f",100*($good/$max));
f0008e52 924 push @result, " (less $skipped skipped test$ender: $good okay, ".
9c5c68c8
MS
925 "$goodper%)"
926 if $skipped;
89d3b7e2 927 push @result, "\n";
760ac839
LW
928 my $txt = join "", @result;
929 ($txt, $canon);
a0d0e21e
LW
930}
931
b82fa0b7 932=end _private
9c5c68c8 933
b82fa0b7 934=back
d667a7e6 935
b82fa0b7 936=cut
9c5c68c8 937
9c5c68c8 938
b82fa0b7
MS
9391;
940__END__
9c5c68c8
MS
941
942
cb1a09d0
AD
943=head1 EXPORT
944
c0ee6f5c 945C<&runtests> is exported by Test::Harness per default.
cb1a09d0 946
9c5c68c8
MS
947C<$verbose> and C<$switches> are exported upon request.
948
949
cb1a09d0
AD
950=head1 DIAGNOSTICS
951
952=over 4
953
954=item C<All tests successful.\nFiles=%d, Tests=%d, %s>
955
956If all tests are successful some statistics about the performance are
957printed.
958
6c31b336
A
959=item C<FAILED tests %s\n\tFailed %d/%d tests, %.2f%% okay.>
960
961For any single script that has failing subtests statistics like the
962above are printed.
963
964=item C<Test returned status %d (wstat %d)>
965
9c5c68c8
MS
966Scripts that return a non-zero exit status, both C<$? E<gt>E<gt> 8>
967and C<$?> are printed in a message similar to the above.
6c31b336
A
968
969=item C<Failed 1 test, %.2f%% okay. %s>
cb1a09d0 970
6c31b336 971=item C<Failed %d/%d tests, %.2f%% okay. %s>
cb1a09d0
AD
972
973If not all tests were successful, the script dies with one of the
974above messages.
975
308957f5 976=item C<FAILED--Further testing stopped: %s>
d667a7e6
A
977
978If a single subtest decides that further testing will not make sense,
979the script dies with this message.
980
cb1a09d0
AD
981=back
982
9b0ceca9
IZ
983=head1 ENVIRONMENT
984
37ce32a7
MS
985=over 4
986
356733da 987=item C<HARNESS_ACTIVE>
37ce32a7 988
356733da
MS
989Harness sets this before executing the individual tests. This allows
990the tests to determine if they are being executed through the harness
991or by any other means.
37ce32a7 992
356733da 993=item C<HARNESS_COLUMNS>
9b0ceca9 994
356733da
MS
995This value will be used for the width of the terminal. If it is not
996set then it will default to C<COLUMNS>. If this is not set, it will
997default to 80. Note that users of Bourne-sh based shells will need to
998C<export COLUMNS> for this module to use that variable.
0d0c0d42 999
b82fa0b7 1000=item C<HARNESS_COMPILE_TEST>
9636a016 1001
37ce32a7
MS
1002When true it will make harness attempt to compile the test using
1003C<perlcc> before running it.
1004
b82fa0b7
MS
1005B<NOTE> This currently only works when sitting in the perl source
1006directory!
1007
1008=item C<HARNESS_FILELEAK_IN_DIR>
37ce32a7
MS
1009
1010When set to the name of a directory, harness will check after each
1011test whether new files appeared in that directory, and report them as
17a79f5b
IZ
1012
1013 LEAKED FILES: scr.tmp 0 my.db
1014
1015If relative, directory name is with respect to the current directory at
1016the moment runtests() was called. Putting absolute path into
13287dd5 1017C<HARNESS_FILELEAK_IN_DIR> may give more predictable results.
17a79f5b 1018
356733da
MS
1019=item C<HARNESS_IGNORE_EXITCODE>
1020
1021Makes harness ignore the exit status of child processes when defined.
1022
1023=item C<HARNESS_NOTTY>
1024
1025When set to a true value, forces it to behave as though STDOUT were
1026not a console. You may need to set this if you don't want harness to
1027output more frequent progress messages using carriage returns. Some
1028consoles may not handle carriage returns properly (which results in a
1029somewhat messy output).
1030
b82fa0b7 1031=item C<HARNESS_PERL_SWITCHES>
37ce32a7
MS
1032
1033Its value will be prepended to the switches used to invoke perl on
b82fa0b7 1034each test. For example, setting C<HARNESS_PERL_SWITCHES> to C<-W> will
37ce32a7
MS
1035run all tests with all warnings enabled.
1036
356733da 1037=item C<HARNESS_VERBOSE>
37ce32a7 1038
356733da
MS
1039If true, Test::Harness will output the verbose results of running
1040its tests. Setting $Test::Harness::verbose will override this.
37ce32a7
MS
1041
1042=back
0a931e4a 1043
b82fa0b7
MS
1044=head1 EXAMPLE
1045
1046Here's how Test::Harness tests itself
1047
1048 $ cd ~/src/devel/Test-Harness
1049 $ perl -Mblib -e 'use Test::Harness qw(&runtests $verbose);
1050 $verbose=0; runtests @ARGV;' t/*.t
1051 Using /home/schwern/src/devel/Test-Harness/blib
1052 t/base..............ok
1053 t/nonumbers.........ok
1054 t/ok................ok
1055 t/test-harness......ok
1056 All tests successful.
1057 Files=4, Tests=24, 2 wallclock secs ( 0.61 cusr + 0.41 csys = 1.02 CPU)
f19ae7a7 1058
cb1a09d0
AD
1059=head1 SEE ALSO
1060
b82fa0b7
MS
1061L<Test> and L<Test::Simple> for writing test scripts, L<Benchmark> for
1062the underlying timing routines, L<Devel::CoreStack> to generate core
1063dumps from failed tests and L<Devel::Cover> for test coverage
1064analysis.
c07a80fd 1065
1066=head1 AUTHORS
1067
1068Either Tim Bunce or Andreas Koenig, we don't know. What we know for
1069sure is, that it was inspired by Larry Wall's TEST script that came
b876d4a6 1070with perl distributions for ages. Numerous anonymous contributors
b82fa0b7
MS
1071exist. Andreas Koenig held the torch for many years.
1072
1073Current maintainer is Michael G Schwern E<lt>schwern@pobox.comE<gt>
1074
a72fde19
JH
1075=head1 LICENSE
1076
1077This program is free software; you can redistribute it and/or
1078modify it under the same terms as Perl itself.
1079
1080See F<http://www.perl.com/perl/misc/Artistic.html>
1081
1082
b82fa0b7
MS
1083=head1 TODO
1084
1085Provide a way of running tests quietly (ie. no printing) for automated
1086validation of tests. This will probably take the form of a version
1087of runtests() which rather than printing its output returns raw data
356733da 1088on the state of the tests. (Partially done in Test::Harness::Straps)
b82fa0b7
MS
1089
1090Fix HARNESS_COMPILE_TEST without breaking its core usage.
1091
1092Figure a way to report test names in the failure summary.
37ce32a7 1093
b82fa0b7 1094Rework the test summary so long test names are not truncated as badly.
308957f5 1095(Partially done with new skip test styles)
b82fa0b7 1096
b82fa0b7
MS
1097Deal with VMS's "not \nok 4\n" mistake.
1098
1099Add option for coverage analysis.
1100
1101=for _private
1102Keeping whittling away at _run_all_tests()
1103
1104=for _private
1105Clean up how the summary is printed. Get rid of those damned formats.
cb1a09d0
AD
1106
1107=head1 BUGS
1108
356733da 1109HARNESS_COMPILE_TEST currently assumes it's run from the Perl source
b82fa0b7
MS
1110directory.
1111
cb1a09d0 1112=cut