xref: /openbsd/gnu/usr.bin/perl/t/test.pl (revision 91f110e0)
1#
2# t/test.pl - most of Test::More functionality without the fuss, plus
3# has mappings native_to_latin1 and latin1_to_native so that fewer tests
4# on non ASCII-ish platforms need to be skipped
5
6
7# NOTE:
8#
9# Increment ($x++) has a certain amount of cleverness for things like
10#
11#   $x = 'zz';
12#   $x++; # $x eq 'aaa';
13#
14# stands more chance of breaking than just a simple
15#
16#   $x = $x + 1
17#
18# In this file, we use the latter "Baby Perl" approach, and increment
19# will be worked over by t/op/inc.t
20
21$Level = 1;
22my $test = 1;
23my $planned;
24my $noplan;
25my $Perl;       # Safer version of $^X set by which_perl()
26
27# This defines ASCII/UTF-8 vs EBCDIC/UTF-EBCDIC
28$::IS_ASCII  = ord 'A' ==  65;
29$::IS_EBCDIC = ord 'A' == 193;
30
31$TODO = 0;
32$NO_ENDING = 0;
33$Tests_Are_Passing = 1;
34
35# Use this instead of print to avoid interference while testing globals.
36sub _print {
37    local($\, $", $,) = (undef, ' ', '');
38    print STDOUT @_;
39}
40
41sub _print_stderr {
42    local($\, $", $,) = (undef, ' ', '');
43    print STDERR @_;
44}
45
46sub plan {
47    my $n;
48    if (@_ == 1) {
49	$n = shift;
50	if ($n eq 'no_plan') {
51	  undef $n;
52	  $noplan = 1;
53	}
54    } else {
55	my %plan = @_;
56	$n = $plan{tests};
57    }
58    _print "1..$n\n" unless $noplan;
59    $planned = $n;
60}
61
62
63# Set the plan at the end.  See Test::More::done_testing.
64sub done_testing {
65    my $n = $test - 1;
66    $n = shift if @_;
67
68    _print "1..$n\n";
69    $planned = $n;
70}
71
72
73END {
74    my $ran = $test - 1;
75    if (!$NO_ENDING) {
76	if (defined $planned && $planned != $ran) {
77	    _print_stderr
78		"# Looks like you planned $planned tests but ran $ran.\n";
79	} elsif ($noplan) {
80	    _print "1..$ran\n";
81	}
82    }
83}
84
85sub _diag {
86    return unless @_;
87    my @mess = _comment(@_);
88    $TODO ? _print(@mess) : _print_stderr(@mess);
89}
90
91# Use this instead of "print STDERR" when outputting failure diagnostic
92# messages
93sub diag {
94    _diag(@_);
95}
96
97# Use this instead of "print" when outputting informational messages
98sub note {
99    return unless @_;
100    _print( _comment(@_) );
101}
102
103sub is_miniperl {
104    return !defined &DynaLoader::boot_DynaLoader;
105}
106
107sub _comment {
108    return map { /^#/ ? "$_\n" : "# $_\n" }
109           map { split /\n/ } @_;
110}
111
112sub _have_dynamic_extension {
113    my $extension = shift;
114    unless (eval {require Config; 1}) {
115	warn "test.pl had problems loading Config: $@";
116	return 1;
117    }
118    $extension =~ s!::!/!g;
119    return 1 if ($Config::Config{extensions} =~ /\b$extension\b/);
120}
121
122sub skip_all {
123    if (@_) {
124        _print "1..0 # Skip @_\n";
125    } else {
126	_print "1..0\n";
127    }
128    exit(0);
129}
130
131sub skip_all_if_miniperl {
132    skip_all(@_) if is_miniperl();
133}
134
135sub skip_all_without_dynamic_extension {
136    my ($extension) = @_;
137    skip_all("no dynamic loading on miniperl, no $extension") if is_miniperl();
138    return if &_have_dynamic_extension;
139    skip_all("$extension was not built");
140}
141
142sub skip_all_without_perlio {
143    skip_all('no PerlIO') unless PerlIO::Layer->find('perlio');
144}
145
146sub skip_all_without_config {
147    unless (eval {require Config; 1}) {
148	warn "test.pl had problems loading Config: $@";
149	return;
150    }
151    foreach (@_) {
152	next if $Config::Config{$_};
153	my $key = $_; # Need to copy, before trying to modify.
154	$key =~ s/^use//;
155	$key =~ s/^d_//;
156	skip_all("no $key");
157    }
158}
159
160sub find_git_or_skip {
161    my ($source_dir, $reason);
162    if (-d '.git') {
163	$source_dir = '.';
164    } elsif (-l 'MANIFEST' && -l 'AUTHORS') {
165	my $where = readlink 'MANIFEST';
166	die "Can't readling MANIFEST: $!" unless defined $where;
167	die "Confusing symlink target for MANIFEST, '$where'"
168	    unless $where =~ s!/MANIFEST\z!!;
169	if (-d "$where/.git") {
170	    # Looks like we are in a symlink tree
171	    if (exists $ENV{GIT_DIR}) {
172		diag("Found source tree at $where, but \$ENV{GIT_DIR} is $ENV{GIT_DIR}. Not changing it");
173	    } else {
174		note("Found source tree at $where, setting \$ENV{GIT_DIR}");
175		$ENV{GIT_DIR} = "$where/.git";
176	    }
177	    $source_dir = $where;
178	}
179    }
180    if ($source_dir) {
181	my $version_string = `git --version`;
182	if (defined $version_string
183	      && $version_string =~ /\Agit version (\d+\.\d+\.\d+)(.*)/) {
184	    return $source_dir if eval "v$1 ge v1.5.0";
185	    # If you have earlier than 1.5.0 and it works, change this test
186	    $reason = "in git checkout, but git version '$1$2' too old";
187	} else {
188	    $reason = "in git checkout, but cannot run git";
189	}
190    } else {
191	$reason = 'not being run from a git checkout';
192    }
193    skip_all($reason) if $_[0] && $_[0] eq 'all';
194    skip($reason, @_);
195}
196
197sub BAIL_OUT {
198    my ($reason) = @_;
199    _print("Bail out!  $reason\n");
200    exit 255;
201}
202
203sub _ok {
204    my ($pass, $where, $name, @mess) = @_;
205    # Do not try to microoptimize by factoring out the "not ".
206    # VMS will avenge.
207    my $out;
208    if ($name) {
209        # escape out '#' or it will interfere with '# skip' and such
210        $name =~ s/#/\\#/g;
211	$out = $pass ? "ok $test - $name" : "not ok $test - $name";
212    } else {
213	$out = $pass ? "ok $test" : "not ok $test";
214    }
215
216    if ($TODO) {
217	$out = $out . " # TODO $TODO";
218    } else {
219	$Tests_Are_Passing = 0 unless $pass;
220    }
221
222    _print "$out\n";
223
224    if ($pass) {
225	note @mess; # Ensure that the message is properly escaped.
226    }
227    else {
228	my $msg = "# Failed test $test - ";
229	$msg.= "$name " if $name;
230	$msg .= "$where\n";
231	_diag $msg;
232	_diag @mess;
233    }
234
235    $test = $test + 1; # don't use ++
236
237    return $pass;
238}
239
240sub _where {
241    my @caller = caller($Level);
242    return "at $caller[1] line $caller[2]";
243}
244
245# DON'T use this for matches. Use like() instead.
246sub ok ($@) {
247    my ($pass, $name, @mess) = @_;
248    _ok($pass, _where(), $name, @mess);
249}
250
251sub _q {
252    my $x = shift;
253    return 'undef' unless defined $x;
254    my $q = $x;
255    $q =~ s/\\/\\\\/g;
256    $q =~ s/'/\\'/g;
257    return "'$q'";
258}
259
260sub _qq {
261    my $x = shift;
262    return defined $x ? '"' . display ($x) . '"' : 'undef';
263};
264
265# keys are the codes \n etc map to, values are 2 char strings such as \n
266my %backslash_escape;
267foreach my $x (split //, 'nrtfa\\\'"') {
268    $backslash_escape{ord eval "\"\\$x\""} = "\\$x";
269}
270# A way to display scalars containing control characters and Unicode.
271# Trying to avoid setting $_, or relying on local $_ to work.
272sub display {
273    my @result;
274    foreach my $x (@_) {
275        if (defined $x and not ref $x) {
276            my $y = '';
277            foreach my $c (unpack("U*", $x)) {
278                if ($c > 255) {
279                    $y = $y . sprintf "\\x{%x}", $c;
280                } elsif ($backslash_escape{$c}) {
281                    $y = $y . $backslash_escape{$c};
282                } else {
283                    my $z = chr $c; # Maybe we can get away with a literal...
284                    if ($z =~ /[[:^print:]]/) {
285
286                        # Use octal for characters traditionally expressed as
287                        # such: the low controls
288                        if ($c <= 037) {
289                            $z = sprintf "\\%03o", $c;
290                        } else {
291                            $z = sprintf "\\x{%x}", $c;
292                        }
293                    }
294                    $y = $y . $z;
295                }
296            }
297            $x = $y;
298        }
299        return $x unless wantarray;
300        push @result, $x;
301    }
302    return @result;
303}
304
305sub is ($$@) {
306    my ($got, $expected, $name, @mess) = @_;
307
308    my $pass;
309    if( !defined $got || !defined $expected ) {
310        # undef only matches undef
311        $pass = !defined $got && !defined $expected;
312    }
313    else {
314        $pass = $got eq $expected;
315    }
316
317    unless ($pass) {
318	unshift(@mess, "#      got "._qq($got)."\n",
319		       "# expected "._qq($expected)."\n");
320    }
321    _ok($pass, _where(), $name, @mess);
322}
323
324sub isnt ($$@) {
325    my ($got, $isnt, $name, @mess) = @_;
326
327    my $pass;
328    if( !defined $got || !defined $isnt ) {
329        # undef only matches undef
330        $pass = defined $got || defined $isnt;
331    }
332    else {
333        $pass = $got ne $isnt;
334    }
335
336    unless( $pass ) {
337        unshift(@mess, "# it should not be "._qq($got)."\n",
338                       "# but it is.\n");
339    }
340    _ok($pass, _where(), $name, @mess);
341}
342
343sub cmp_ok ($$$@) {
344    my($got, $type, $expected, $name, @mess) = @_;
345
346    my $pass;
347    {
348        local $^W = 0;
349        local($@,$!);   # don't interfere with $@
350                        # eval() sometimes resets $!
351        $pass = eval "\$got $type \$expected";
352    }
353    unless ($pass) {
354        # It seems Irix long doubles can have 2147483648 and 2147483648
355        # that stringify to the same thing but are actually numerically
356        # different. Display the numbers if $type isn't a string operator,
357        # and the numbers are stringwise the same.
358        # (all string operators have alphabetic names, so tr/a-z// is true)
359        # This will also show numbers for some unneeded cases, but will
360        # definitely be helpful for things such as == and <= that fail
361        if ($got eq $expected and $type !~ tr/a-z//) {
362            unshift @mess, "# $got - $expected = " . ($got - $expected) . "\n";
363        }
364        unshift(@mess, "#      got "._qq($got)."\n",
365                       "# expected $type "._qq($expected)."\n");
366    }
367    _ok($pass, _where(), $name, @mess);
368}
369
370# Check that $got is within $range of $expected
371# if $range is 0, then check it's exact
372# else if $expected is 0, then $range is an absolute value
373# otherwise $range is a fractional error.
374# Here $range must be numeric, >= 0
375# Non numeric ranges might be a useful future extension. (eg %)
376sub within ($$$@) {
377    my ($got, $expected, $range, $name, @mess) = @_;
378    my $pass;
379    if (!defined $got or !defined $expected or !defined $range) {
380        # This is a fail, but doesn't need extra diagnostics
381    } elsif ($got !~ tr/0-9// or $expected !~ tr/0-9// or $range !~ tr/0-9//) {
382        # This is a fail
383        unshift @mess, "# got, expected and range must be numeric\n";
384    } elsif ($range < 0) {
385        # This is also a fail
386        unshift @mess, "# range must not be negative\n";
387    } elsif ($range == 0) {
388        # Within 0 is ==
389        $pass = $got == $expected;
390    } elsif ($expected == 0) {
391        # If expected is 0, treat range as absolute
392        $pass = ($got <= $range) && ($got >= - $range);
393    } else {
394        my $diff = $got - $expected;
395        $pass = abs ($diff / $expected) < $range;
396    }
397    unless ($pass) {
398        if ($got eq $expected) {
399            unshift @mess, "# $got - $expected = " . ($got - $expected) . "\n";
400        }
401	unshift@mess, "#      got "._qq($got)."\n",
402		      "# expected "._qq($expected)." (within "._qq($range).")\n";
403    }
404    _ok($pass, _where(), $name, @mess);
405}
406
407# Note: this isn't quite as fancy as Test::More::like().
408
409sub like   ($$@) { like_yn (0,@_) }; # 0 for -
410sub unlike ($$@) { like_yn (1,@_) }; # 1 for un-
411
412sub like_yn ($$$@) {
413    my ($flip, undef, $expected, $name, @mess) = @_;
414    my $pass;
415    $pass = $_[1] =~ /$expected/ if !$flip;
416    $pass = $_[1] !~ /$expected/ if $flip;
417    unless ($pass) {
418	unshift(@mess, "#      got '$_[1]'\n",
419		$flip
420		? "# expected !~ /$expected/\n" : "# expected /$expected/\n");
421    }
422    local $Level = $Level + 1;
423    _ok($pass, _where(), $name, @mess);
424}
425
426sub pass {
427    _ok(1, '', @_);
428}
429
430sub fail {
431    _ok(0, _where(), @_);
432}
433
434sub curr_test {
435    $test = shift if @_;
436    return $test;
437}
438
439sub next_test {
440  my $retval = $test;
441  $test = $test + 1; # don't use ++
442  $retval;
443}
444
445# Note: can't pass multipart messages since we try to
446# be compatible with Test::More::skip().
447sub skip {
448    my $why = shift;
449    my $n    = @_ ? shift : 1;
450    for (1..$n) {
451        _print "ok $test # skip $why\n";
452        $test = $test + 1;
453    }
454    local $^W = 0;
455    last SKIP;
456}
457
458sub skip_if_miniperl {
459    skip(@_) if is_miniperl();
460}
461
462sub skip_without_dynamic_extension {
463    my ($extension) = @_;
464    skip("no dynamic loading on miniperl, no $extension") if is_miniperl();
465    return if &_have_dynamic_extension;
466    skip("$extension was not built");
467}
468
469sub todo_skip {
470    my $why = shift;
471    my $n   = @_ ? shift : 1;
472
473    for (1..$n) {
474        _print "not ok $test # TODO & SKIP $why\n";
475        $test = $test + 1;
476    }
477    local $^W = 0;
478    last TODO;
479}
480
481sub eq_array {
482    my ($ra, $rb) = @_;
483    return 0 unless $#$ra == $#$rb;
484    for my $i (0..$#$ra) {
485	next     if !defined $ra->[$i] && !defined $rb->[$i];
486	return 0 if !defined $ra->[$i];
487	return 0 if !defined $rb->[$i];
488	return 0 unless $ra->[$i] eq $rb->[$i];
489    }
490    return 1;
491}
492
493sub eq_hash {
494  my ($orig, $suspect) = @_;
495  my $fail;
496  while (my ($key, $value) = each %$suspect) {
497    # Force a hash recompute if this perl's internals can cache the hash key.
498    $key = "" . $key;
499    if (exists $orig->{$key}) {
500      if (
501        defined $orig->{$key} != defined $value
502        || (defined $value && $orig->{$key} ne $value)
503      ) {
504        _print "# key ", _qq($key), " was ", _qq($orig->{$key}),
505                     " now ", _qq($value), "\n";
506        $fail = 1;
507      }
508    } else {
509      _print "# key ", _qq($key), " is ", _qq($value),
510                   ", not in original.\n";
511      $fail = 1;
512    }
513  }
514  foreach (keys %$orig) {
515    # Force a hash recompute if this perl's internals can cache the hash key.
516    $_ = "" . $_;
517    next if (exists $suspect->{$_});
518    _print "# key ", _qq($_), " was ", _qq($orig->{$_}), " now missing.\n";
519    $fail = 1;
520  }
521  !$fail;
522}
523
524# We only provide a subset of the Test::More functionality.
525sub require_ok ($) {
526    my ($require) = @_;
527    if ($require =~ tr/[A-Za-z0-9:.]//c) {
528	fail("Invalid character in \"$require\", passed to require_ok");
529    } else {
530	eval <<REQUIRE_OK;
531require $require;
532REQUIRE_OK
533	is($@, '', _where(), "require $require");
534    }
535}
536
537sub use_ok ($) {
538    my ($use) = @_;
539    if ($use =~ tr/[A-Za-z0-9:.]//c) {
540	fail("Invalid character in \"$use\", passed to use");
541    } else {
542	eval <<USE_OK;
543use $use;
544USE_OK
545	is($@, '', _where(), "use $use");
546    }
547}
548
549# runperl - Runs a separate perl interpreter.
550# Arguments :
551#   switches => [ command-line switches ]
552#   nolib    => 1 # don't use -I../lib (included by default)
553#   non_portable => Don't warn if a one liner contains quotes
554#   prog     => one-liner (avoid quotes)
555#   progs    => [ multi-liner (avoid quotes) ]
556#   progfile => perl script
557#   stdin    => string to feed the stdin
558#   stderr   => redirect stderr to stdout
559#   args     => [ command-line arguments to the perl program ]
560#   verbose  => print the command line
561
562my $is_mswin    = $^O eq 'MSWin32';
563my $is_netware  = $^O eq 'NetWare';
564my $is_vms      = $^O eq 'VMS';
565my $is_cygwin   = $^O eq 'cygwin';
566
567sub _quote_args {
568    my ($runperl, $args) = @_;
569
570    foreach (@$args) {
571	# In VMS protect with doublequotes because otherwise
572	# DCL will lowercase -- unless already doublequoted.
573       $_ = q(").$_.q(") if $is_vms && !/^\"/ && length($_) > 0;
574       $runperl = $runperl . ' ' . $_;
575    }
576    return $runperl;
577}
578
579sub _create_runperl { # Create the string to qx in runperl().
580    my %args = @_;
581    my $runperl = which_perl();
582    if ($runperl =~ m/\s/) {
583        $runperl = qq{"$runperl"};
584    }
585    #- this allows, for example, to set PERL_RUNPERL_DEBUG=/usr/bin/valgrind
586    if ($ENV{PERL_RUNPERL_DEBUG}) {
587	$runperl = "$ENV{PERL_RUNPERL_DEBUG} $runperl";
588    }
589    unless ($args{nolib}) {
590	$runperl = $runperl . ' "-I../lib"'; # doublequotes because of VMS
591    }
592    if ($args{switches}) {
593	local $Level = 2;
594	die "test.pl:runperl(): 'switches' must be an ARRAYREF " . _where()
595	    unless ref $args{switches} eq "ARRAY";
596	$runperl = _quote_args($runperl, $args{switches});
597    }
598    if (defined $args{prog}) {
599	die "test.pl:runperl(): both 'prog' and 'progs' cannot be used " . _where()
600	    if defined $args{progs};
601        $args{progs} = [$args{prog}]
602    }
603    if (defined $args{progs}) {
604	die "test.pl:runperl(): 'progs' must be an ARRAYREF " . _where()
605	    unless ref $args{progs} eq "ARRAY";
606        foreach my $prog (@{$args{progs}}) {
607	    if ($prog =~ tr/'"// && !$args{non_portable}) {
608		warn "quotes in prog >>$prog<< are not portable";
609	    }
610            if ($is_mswin || $is_netware || $is_vms) {
611                $runperl = $runperl . qq ( -e "$prog" );
612            }
613            else {
614                $runperl = $runperl . qq ( -e '$prog' );
615            }
616        }
617    } elsif (defined $args{progfile}) {
618	$runperl = $runperl . qq( "$args{progfile}");
619    } else {
620	# You probably didn't want to be sucking in from the upstream stdin
621	die "test.pl:runperl(): none of prog, progs, progfile, args, "
622	    . " switches or stdin specified"
623	    unless defined $args{args} or defined $args{switches}
624		or defined $args{stdin};
625    }
626    if (defined $args{stdin}) {
627	# so we don't try to put literal newlines and crs onto the
628	# command line.
629	$args{stdin} =~ s/\n/\\n/g;
630	$args{stdin} =~ s/\r/\\r/g;
631
632	if ($is_mswin || $is_netware || $is_vms) {
633	    $runperl = qq{$Perl -e "print qq(} .
634		$args{stdin} . q{)" | } . $runperl;
635	}
636	else {
637	    $runperl = qq{$Perl -e 'print qq(} .
638		$args{stdin} . q{)' | } . $runperl;
639	}
640    }
641    if (defined $args{args}) {
642	$runperl = _quote_args($runperl, $args{args});
643    }
644    $runperl = $runperl . ' 2>&1' if $args{stderr};
645    if ($args{verbose}) {
646	my $runperldisplay = $runperl;
647	$runperldisplay =~ s/\n/\n\#/g;
648	_print_stderr "# $runperldisplay\n";
649    }
650    return $runperl;
651}
652
653sub runperl {
654    die "test.pl:runperl() does not take a hashref"
655	if ref $_[0] and ref $_[0] eq 'HASH';
656    my $runperl = &_create_runperl;
657    my $result;
658
659    my $tainted = ${^TAINT};
660    my %args = @_;
661    exists $args{switches} && grep m/^-T$/, @{$args{switches}} and $tainted = $tainted + 1;
662
663    if ($tainted) {
664	# We will assume that if you're running under -T, you really mean to
665	# run a fresh perl, so we'll brute force launder everything for you
666	my $sep;
667
668	if (! eval {require Config; 1}) {
669	    warn "test.pl had problems loading Config: $@";
670	    $sep = ':';
671	} else {
672	    $sep = $Config::Config{path_sep};
673	}
674
675	my @keys = grep {exists $ENV{$_}} qw(CDPATH IFS ENV BASH_ENV);
676	local @ENV{@keys} = ();
677	# Untaint, plus take out . and empty string:
678	local $ENV{'DCL$PATH'} = $1 if $is_vms && exists($ENV{'DCL$PATH'}) && ($ENV{'DCL$PATH'} =~ /(.*)/s);
679	$ENV{PATH} =~ /(.*)/s;
680	local $ENV{PATH} =
681	    join $sep, grep { $_ ne "" and $_ ne "." and -d $_ and
682		($is_mswin or $is_vms or !(stat && (stat _)[2]&0022)) }
683		    split quotemeta ($sep), $1;
684	if ($is_cygwin) {   # Must have /bin under Cygwin
685	    if (length $ENV{PATH}) {
686		$ENV{PATH} = $ENV{PATH} . $sep;
687	    }
688	    $ENV{PATH} = $ENV{PATH} . '/bin';
689	}
690	$runperl =~ /(.*)/s;
691	$runperl = $1;
692
693	$result = `$runperl`;
694    } else {
695	$result = `$runperl`;
696    }
697    $result =~ s/\n\n/\n/ if $is_vms; # XXX pipes sometimes double these
698    return $result;
699}
700
701# Nice alias
702*run_perl = *run_perl = \&runperl; # shut up "used only once" warning
703
704sub DIE {
705    _print_stderr "# @_\n";
706    exit 1;
707}
708
709# A somewhat safer version of the sometimes wrong $^X.
710sub which_perl {
711    unless (defined $Perl) {
712	$Perl = $^X;
713
714	# VMS should have 'perl' aliased properly
715	return $Perl if $is_vms;
716
717	my $exe;
718	if (! eval {require Config; 1}) {
719	    warn "test.pl had problems loading Config: $@";
720	    $exe = '';
721	} else {
722	    $exe = $Config::Config{_exe};
723	}
724       $exe = '' unless defined $exe;
725
726	# This doesn't absolutize the path: beware of future chdirs().
727	# We could do File::Spec->abs2rel() but that does getcwd()s,
728	# which is a bit heavyweight to do here.
729
730	if ($Perl =~ /^perl\Q$exe\E$/i) {
731	    my $perl = "perl$exe";
732	    if (! eval {require File::Spec; 1}) {
733		warn "test.pl had problems loading File::Spec: $@";
734		$Perl = "./$perl";
735	    } else {
736		$Perl = File::Spec->catfile(File::Spec->curdir(), $perl);
737	    }
738	}
739
740	# Build up the name of the executable file from the name of
741	# the command.
742
743	if ($Perl !~ /\Q$exe\E$/i) {
744	    $Perl = $Perl . $exe;
745	}
746
747	warn "which_perl: cannot find $Perl from $^X" unless -f $Perl;
748
749	# For subcommands to use.
750	$ENV{PERLEXE} = $Perl;
751    }
752    return $Perl;
753}
754
755sub unlink_all {
756    my $count = 0;
757    foreach my $file (@_) {
758        1 while unlink $file;
759	if( -f $file ){
760	    _print_stderr "# Couldn't unlink '$file': $!\n";
761	}else{
762	    ++$count;
763	}
764    }
765    $count;
766}
767
768# _num_to_alpha - Returns a string of letters representing a positive integer.
769# Arguments :
770#   number to convert
771#   maximum number of letters
772
773# returns undef if the number is negative
774# returns undef if the number of letters is greater than the maximum wanted
775
776# _num_to_alpha( 0) eq 'A';
777# _num_to_alpha( 1) eq 'B';
778# _num_to_alpha(25) eq 'Z';
779# _num_to_alpha(26) eq 'AA';
780# _num_to_alpha(27) eq 'AB';
781
782my @letters = qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z);
783
784# Avoid ++ -- ranges split negative numbers
785sub _num_to_alpha{
786    my($num,$max_char) = @_;
787    return unless $num >= 0;
788    my $alpha = '';
789    my $char_count = 0;
790    $max_char = 0 if $max_char < 0;
791
792    while( 1 ){
793        $alpha = $letters[ $num % 26 ] . $alpha;
794        $num = int( $num / 26 );
795        last if $num == 0;
796        $num = $num - 1;
797
798        # char limit
799        next unless $max_char;
800        $char_count = $char_count + 1;
801        return if $char_count == $max_char;
802    }
803    return $alpha;
804}
805
806my %tmpfiles;
807END { unlink_all keys %tmpfiles }
808
809# A regexp that matches the tempfile names
810$::tempfile_regexp = 'tmp\d+[A-Z][A-Z]?';
811
812# Avoid ++, avoid ranges, avoid split //
813my $tempfile_count = 0;
814sub tempfile {
815    while(1){
816	my $try = "tmp$$";
817        my $alpha = _num_to_alpha($tempfile_count,2);
818        last unless defined $alpha;
819        $try = $try . $alpha;
820        $tempfile_count = $tempfile_count + 1;
821
822	# Need to note all the file names we allocated, as a second request may
823	# come before the first is created.
824	if (!$tmpfiles{$try} && !-e $try) {
825	    # We have a winner
826	    $tmpfiles{$try} = 1;
827	    return $try;
828	}
829    }
830    die "Can't find temporary file name starting 'tmp$$'";
831}
832
833# This is the temporary file for _fresh_perl
834my $tmpfile = tempfile();
835
836sub _fresh_perl {
837    my($prog, $action, $expect, $runperl_args, $name) = @_;
838
839    # Given the choice of the mis-parsable {}
840    # (we want an anon hash, but a borked lexer might think that it's a block)
841    # or relying on taking a reference to a lexical
842    # (\ might be mis-parsed, and the reference counting on the pad may go
843    #  awry)
844    # it feels like the least-worse thing is to assume that auto-vivification
845    # works. At least, this is only going to be a run-time failure, so won't
846    # affect tests using this file but not this function.
847    $runperl_args->{progfile} ||= $tmpfile;
848    $runperl_args->{stderr}     = 1 unless exists $runperl_args->{stderr};
849
850    open TEST, ">$tmpfile" or die "Cannot open $tmpfile: $!";
851
852    # VMS adjustments
853    if( $is_vms ) {
854        $prog =~ s#/dev/null#NL:#;
855
856        # VMS file locking
857        $prog =~ s{if \(-e _ and -f _ and -r _\)}
858                  {if (-e _ and -f _)}
859    }
860
861    print TEST $prog;
862    close TEST or die "Cannot close $tmpfile: $!";
863
864    my $results = runperl(%$runperl_args);
865    my $status = $?;
866
867    # Clean up the results into something a bit more predictable.
868    $results  =~ s/\n+$//;
869    $results =~ s/at\s+$::tempfile_regexp\s+line/at - line/g;
870    $results =~ s/of\s+$::tempfile_regexp\s+aborted/of - aborted/g;
871
872    # bison says 'parse error' instead of 'syntax error',
873    # various yaccs may or may not capitalize 'syntax'.
874    $results =~ s/^(syntax|parse) error/syntax error/mig;
875
876    if ($is_vms) {
877        # some tests will trigger VMS messages that won't be expected
878        $results =~ s/\n?%[A-Z]+-[SIWEF]-[A-Z]+,.*//;
879
880        # pipes double these sometimes
881        $results =~ s/\n\n/\n/g;
882    }
883
884    # Use the first line of the program as a name if none was given
885    unless( $name ) {
886        ($first_line, $name) = $prog =~ /^((.{1,50}).*)/;
887        $name = $name . '...' if length $first_line > length $name;
888    }
889
890    # Historically this was implemented using a closure, but then that means
891    # that the tests for closures avoid using this code. Given that there
892    # are exactly two callers, doing exactly two things, the simpler approach
893    # feels like a better trade off.
894    my $pass;
895    if ($action eq 'eq') {
896	$pass = is($results, $expect, $name);
897    } elsif ($action eq '=~') {
898	$pass = like($results, $expect, $name);
899    } else {
900	die "_fresh_perl can't process action '$action'";
901    }
902
903    unless ($pass) {
904        _diag "# PROG: \n$prog\n";
905        _diag "# STATUS: $status\n";
906    }
907
908    return $pass;
909}
910
911#
912# fresh_perl_is
913#
914# Combination of run_perl() and is().
915#
916
917sub fresh_perl_is {
918    my($prog, $expected, $runperl_args, $name) = @_;
919
920    # _fresh_perl() is going to clip the trailing newlines off the result.
921    # This will make it so the test author doesn't have to know that.
922    $expected =~ s/\n+$//;
923
924    local $Level = 2;
925    _fresh_perl($prog, 'eq', $expected, $runperl_args, $name);
926}
927
928#
929# fresh_perl_like
930#
931# Combination of run_perl() and like().
932#
933
934sub fresh_perl_like {
935    my($prog, $expected, $runperl_args, $name) = @_;
936    local $Level = 2;
937    _fresh_perl($prog, '=~', $expected, $runperl_args, $name);
938}
939
940# Many tests use the same format in __DATA__ or external files to specify a
941# sequence of (fresh) tests to run, extra files they may temporarily need, and
942# what the expected output is. So have excatly one copy of the code to run that
943#
944# Each program is source code to run followed by an "EXPECT" line, followed
945# by the expected output.
946#
947# The code to run may begin with a command line switch such as -w or -0777
948# (alphanumerics only), and may contain (note the '# ' on each):
949#   # TODO reason for todo
950#   # SKIP reason for skip
951#   # SKIP ?code to test if this should be skipped
952#   # NAME name of the test (as with ok($ok, $name))
953#
954# The expected output may contain:
955#   OPTION list of options
956#   OPTIONS list of options
957#
958# The possible options for OPTION may be:
959#   regex - the expected output is a regular expression
960#   random - all lines match but in any order
961#   fatal - the code will fail fatally (croak, die)
962#
963# If the actual output contains a line "SKIPPED" the test will be
964# skipped.
965#
966# If the actual output contains a line "PREFIX", any output starting with that
967# line will be ignored when comparing with the expected output
968#
969# If the global variable $FATAL is true then OPTION fatal is the
970# default.
971
972sub run_multiple_progs {
973    my $up = shift;
974    my @prgs;
975    if ($up) {
976	# The tests in lib run in a temporary subdirectory of t, and always
977	# pass in a list of "programs" to run
978	@prgs = @_;
979    } else {
980	# The tests below t run in t and pass in a file handle.
981	my $fh = shift;
982	local $/;
983	@prgs = split "\n########\n", <$fh>;
984    }
985
986    my $tmpfile = tempfile();
987
988  PROGRAM:
989    for (@prgs){
990	unless (/\n/) {
991	    print "# From $_\n";
992	    next;
993	}
994	my $switch = "";
995	my @temps ;
996	my @temp_path;
997	if (s/^(\s*-\w+)//) {
998	    $switch = $1;
999	}
1000	my ($prog, $expected) = split(/\nEXPECT(?:\n|$)/, $_, 2);
1001
1002	my %reason;
1003	foreach my $what (qw(skip todo)) {
1004	    $prog =~ s/^#\s*\U$what\E\s*(.*)\n//m and $reason{$what} = $1;
1005	    # If the SKIP reason starts ? then it's taken as a code snippet to
1006	    # evaluate. This provides the flexibility to have conditional SKIPs
1007	    if ($reason{$what} && $reason{$what} =~ s/^\?//) {
1008		my $temp = eval $reason{$what};
1009		if ($@) {
1010		    die "# In \U$what\E code reason:\n# $reason{$what}\n$@";
1011		}
1012		$reason{$what} = $temp;
1013	    }
1014	}
1015
1016	my $name = '';
1017	if ($prog =~ s/^#\s*NAME\s+(.+)\n//m) {
1018	    $name = $1;
1019	}
1020
1021	if ($reason{skip}) {
1022	SKIP:
1023	  {
1024	    skip($name ? "$name - $reason{skip}" : $reason{skip}, 1);
1025	  }
1026	  next PROGRAM;
1027	}
1028
1029	if ($prog =~ /--FILE--/) {
1030	    my @files = split(/\n?--FILE--\s*([^\s\n]*)\s*\n/, $prog) ;
1031	    shift @files ;
1032	    die "Internal error: test $_ didn't split into pairs, got " .
1033		scalar(@files) . "[" . join("%%%%", @files) ."]\n"
1034		    if @files % 2;
1035	    while (@files > 2) {
1036		my $filename = shift @files;
1037		my $code = shift @files;
1038		push @temps, $filename;
1039		if ($filename =~ m#(.*)/# && $filename !~ m#^\.\./#) {
1040		    require File::Path;
1041		    File::Path::mkpath($1);
1042		    push(@temp_path, $1);
1043		}
1044		open my $fh, '>', $filename or die "Cannot open $filename: $!\n";
1045		print $fh $code;
1046		close $fh or die "Cannot close $filename: $!\n";
1047	    }
1048	    shift @files;
1049	    $prog = shift @files;
1050	}
1051
1052	open my $fh, '>', $tmpfile or die "Cannot open >$tmpfile: $!";
1053	print $fh q{
1054        BEGIN {
1055            open STDERR, '>&', STDOUT
1056              or die "Can't dup STDOUT->STDERR: $!;";
1057        }
1058	};
1059	print $fh "\n#line 1\n";  # So the line numbers don't get messed up.
1060	print $fh $prog,"\n";
1061	close $fh or die "Cannot close $tmpfile: $!";
1062	my $results = runperl( stderr => 1, progfile => $tmpfile, $up
1063			       ? (switches => ["-I$up/lib", $switch], nolib => 1)
1064			       : (switches => [$switch])
1065			        );
1066	my $status = $?;
1067	$results =~ s/\n+$//;
1068	# allow expected output to be written as if $prog is on STDIN
1069	$results =~ s/$::tempfile_regexp/-/g;
1070	if ($^O eq 'VMS') {
1071	    # some tests will trigger VMS messages that won't be expected
1072	    $results =~ s/\n?%[A-Z]+-[SIWEF]-[A-Z]+,.*//;
1073
1074	    # pipes double these sometimes
1075	    $results =~ s/\n\n/\n/g;
1076	}
1077	# bison says 'parse error' instead of 'syntax error',
1078	# various yaccs may or may not capitalize 'syntax'.
1079	$results =~ s/^(syntax|parse) error/syntax error/mig;
1080	# allow all tests to run when there are leaks
1081	$results =~ s/Scalars leaked: \d+\n//g;
1082
1083	$expected =~ s/\n+$//;
1084	my $prefix = ($results =~ s#^PREFIX(\n|$)##) ;
1085	# any special options? (OPTIONS foo bar zap)
1086	my $option_regex = 0;
1087	my $option_random = 0;
1088	my $fatal = $FATAL;
1089	if ($expected =~ s/^OPTIONS? (.+)\n//) {
1090	    foreach my $option (split(' ', $1)) {
1091		if ($option eq 'regex') { # allow regular expressions
1092		    $option_regex = 1;
1093		}
1094		elsif ($option eq 'random') { # all lines match, but in any order
1095		    $option_random = 1;
1096		}
1097		elsif ($option eq 'fatal') { # perl should fail
1098		    $fatal = 1;
1099		}
1100		else {
1101		    die "$0: Unknown OPTION '$option'\n";
1102		}
1103	    }
1104	}
1105	die "$0: can't have OPTION regex and random\n"
1106	    if $option_regex + $option_random > 1;
1107	my $ok = 0;
1108	if ($results =~ s/^SKIPPED\n//) {
1109	    print "$results\n" ;
1110	    $ok = 1;
1111	}
1112	else {
1113	    if ($option_random) {
1114	        my @got = sort split "\n", $results;
1115	        my @expected = sort split "\n", $expected;
1116
1117	        $ok = "@got" eq "@expected";
1118	    }
1119	    elsif ($option_regex) {
1120	        $ok = $results =~ /^$expected/;
1121	    }
1122	    elsif ($prefix) {
1123	        $ok = $results =~ /^\Q$expected/;
1124	    }
1125	    else {
1126	        $ok = $results eq $expected;
1127	    }
1128
1129	    if ($ok && $fatal && !($status >> 8)) {
1130		$ok = 0;
1131	    }
1132	}
1133
1134	local $::TODO = $reason{todo};
1135
1136	unless ($ok) {
1137	    my $err_line = "PROG: $switch\n$prog\n" .
1138			   "EXPECTED:\n$expected\n";
1139	    $err_line   .= "EXIT STATUS: != 0\n" if $fatal;
1140	    $err_line   .= "GOT:\n$results\n";
1141	    $err_line   .= "EXIT STATUS: " . ($status >> 8) . "\n" if $fatal;
1142	    if ($::TODO) {
1143		$err_line =~ s/^/# /mg;
1144		print $err_line;  # Harness can't filter it out from STDERR.
1145	    }
1146	    else {
1147		print STDERR $err_line;
1148	    }
1149	}
1150
1151	ok($ok, $name);
1152
1153	foreach (@temps) {
1154	    unlink $_ if $_;
1155	}
1156	foreach (@temp_path) {
1157	    File::Path::rmtree $_ if -d $_;
1158	}
1159    }
1160}
1161
1162sub can_ok ($@) {
1163    my($proto, @methods) = @_;
1164    my $class = ref $proto || $proto;
1165
1166    unless( @methods ) {
1167        return _ok( 0, _where(), "$class->can(...)" );
1168    }
1169
1170    my @nok = ();
1171    foreach my $method (@methods) {
1172        local($!, $@);  # don't interfere with caller's $@
1173                        # eval sometimes resets $!
1174        eval { $proto->can($method) } || push @nok, $method;
1175    }
1176
1177    my $name;
1178    $name = @methods == 1 ? "$class->can('$methods[0]')"
1179                          : "$class->can(...)";
1180
1181    _ok( !@nok, _where(), $name );
1182}
1183
1184
1185# Call $class->new( @$args ); and run the result through object_ok.
1186# See Test::More::new_ok
1187sub new_ok {
1188    my($class, $args, $obj_name) = @_;
1189    $args ||= [];
1190    $object_name = "The object" unless defined $obj_name;
1191
1192    local $Level = $Level + 1;
1193
1194    my $obj;
1195    my $ok = eval { $obj = $class->new(@$args); 1 };
1196    my $error = $@;
1197
1198    if($ok) {
1199        object_ok($obj, $class, $object_name);
1200    }
1201    else {
1202        ok( 0, "new() died" );
1203        diag("Error was:  $@");
1204    }
1205
1206    return $obj;
1207
1208}
1209
1210
1211sub isa_ok ($$;$) {
1212    my($object, $class, $obj_name) = @_;
1213
1214    my $diag;
1215    $obj_name = 'The object' unless defined $obj_name;
1216    my $name = "$obj_name isa $class";
1217    if( !defined $object ) {
1218        $diag = "$obj_name isn't defined";
1219    }
1220    else {
1221        my $whatami = ref $object ? 'object' : 'class';
1222
1223        # We can't use UNIVERSAL::isa because we want to honor isa() overrides
1224        local($@, $!);  # eval sometimes resets $!
1225        my $rslt = eval { $object->isa($class) };
1226        my $error = $@;  # in case something else blows away $@
1227
1228        if( $error ) {
1229            if( $error =~ /^Can't call method "isa" on unblessed reference/ ) {
1230                # It's an unblessed reference
1231                $obj_name = 'The reference' unless defined $obj_name;
1232                if( !UNIVERSAL::isa($object, $class) ) {
1233                    my $ref = ref $object;
1234                    $diag = "$obj_name isn't a '$class' it's a '$ref'";
1235                }
1236            }
1237            elsif( $error =~ /Can't call method "isa" without a package/ ) {
1238                # It's something that can't even be a class
1239                $obj_name = 'The thing' unless defined $obj_name;
1240                $diag = "$obj_name isn't a class or reference";
1241            }
1242            else {
1243                die <<WHOA;
1244WHOA! I tried to call ->isa on your object and got some weird error.
1245This should never happen.  Please contact the author immediately.
1246Here's the error.
1247$@
1248WHOA
1249            }
1250        }
1251        elsif( !$rslt ) {
1252            $obj_name = "The $whatami" unless defined $obj_name;
1253            my $ref = ref $object;
1254            $diag = "$obj_name isn't a '$class' it's a '$ref'";
1255        }
1256    }
1257
1258    _ok( !$diag, _where(), $name );
1259}
1260
1261
1262sub class_ok {
1263    my($class, $isa, $class_name) = @_;
1264
1265    # Written so as to count as one test
1266    local $Level = $Level + 1;
1267    if( ref $class ) {
1268        ok( 0, "$class is a refrence, not a class name" );
1269    }
1270    else {
1271        isa_ok($class, $isa, $class_name);
1272    }
1273}
1274
1275
1276sub object_ok {
1277    my($obj, $isa, $obj_name) = @_;
1278
1279    local $Level = $Level + 1;
1280    if( !ref $obj ) {
1281        ok( 0, "$obj is not a reference" );
1282    }
1283    else {
1284        isa_ok($obj, $isa, $obj_name);
1285    }
1286}
1287
1288
1289# Purposefully avoiding a closure.
1290sub __capture {
1291    push @::__capture, join "", @_;
1292}
1293
1294sub capture_warnings {
1295    my $code = shift;
1296
1297    local @::__capture;
1298    local $SIG {__WARN__} = \&__capture;
1299    &$code;
1300    return @::__capture;
1301}
1302
1303# This will generate a variable number of tests.
1304# Use done_testing() instead of a fixed plan.
1305sub warnings_like {
1306    my ($code, $expect, $name) = @_;
1307    local $Level = $Level + 1;
1308
1309    my @w = capture_warnings($code);
1310
1311    cmp_ok(scalar @w, '==', scalar @$expect, $name);
1312    foreach my $e (@$expect) {
1313	if (ref $e) {
1314	    like(shift @w, $e, $name);
1315	} else {
1316	    is(shift @w, $e, $name);
1317	}
1318    }
1319    if (@w) {
1320	diag("Saw these additional warnings:");
1321	diag($_) foreach @w;
1322    }
1323}
1324
1325sub _fail_excess_warnings {
1326    my($expect, $got, $name) = @_;
1327    local $Level = $Level + 1;
1328    # This will fail, and produce diagnostics
1329    is($expect, scalar @$got, $name);
1330    diag("Saw these warnings:");
1331    diag($_) foreach @$got;
1332}
1333
1334sub warning_is {
1335    my ($code, $expect, $name) = @_;
1336    die sprintf "Expect must be a string or undef, not a %s reference", ref $expect
1337	if ref $expect;
1338    local $Level = $Level + 1;
1339    my @w = capture_warnings($code);
1340    if (@w > 1) {
1341	_fail_excess_warnings(0 + defined $expect, \@w, $name);
1342    } else {
1343	is($w[0], $expect, $name);
1344    }
1345}
1346
1347sub warning_like {
1348    my ($code, $expect, $name) = @_;
1349    die sprintf "Expect must be a regexp object"
1350	unless ref $expect eq 'Regexp';
1351    local $Level = $Level + 1;
1352    my @w = capture_warnings($code);
1353    if (@w > 1) {
1354	_fail_excess_warnings(0 + defined $expect, \@w, $name);
1355    } else {
1356	like($w[0], $expect, $name);
1357    }
1358}
1359
1360# Set a watchdog to timeout the entire test file
1361# NOTE:  If the test file uses 'threads', then call the watchdog() function
1362#        _AFTER_ the 'threads' module is loaded.
1363sub watchdog ($;$)
1364{
1365    my $timeout = shift;
1366    my $method  = shift || "";
1367    my $timeout_msg = 'Test process timed out - terminating';
1368
1369    # Valgrind slows perl way down so give it more time before dying.
1370    $timeout *= 10 if $ENV{PERL_VALGRIND};
1371
1372    my $pid_to_kill = $$;   # PID for this process
1373
1374    if ($method eq "alarm") {
1375        goto WATCHDOG_VIA_ALARM;
1376    }
1377
1378    # shut up use only once warning
1379    my $threads_on = $threads::threads && $threads::threads;
1380
1381    # Don't use a watchdog process if 'threads' is loaded -
1382    #   use a watchdog thread instead
1383    if (!$threads_on || $method eq "process") {
1384
1385        # On Windows and VMS, try launching a watchdog process
1386        #   using system(1, ...) (see perlport.pod)
1387        if ($is_mswin || $is_vms) {
1388            # On Windows, try to get the 'real' PID
1389            if ($is_mswin) {
1390                eval { require Win32; };
1391                if (defined(&Win32::GetCurrentProcessId)) {
1392                    $pid_to_kill = Win32::GetCurrentProcessId();
1393                }
1394            }
1395
1396            # If we still have a fake PID, we can't use this method at all
1397            return if ($pid_to_kill <= 0);
1398
1399            # Launch watchdog process
1400            my $watchdog;
1401            eval {
1402                local $SIG{'__WARN__'} = sub {
1403                    _diag("Watchdog warning: $_[0]");
1404                };
1405                my $sig = $is_vms ? 'TERM' : 'KILL';
1406                my $cmd = _create_runperl( prog =>  "sleep($timeout);" .
1407                                                    "warn qq/# $timeout_msg" . '\n/;' .
1408                                                    "kill($sig, $pid_to_kill);");
1409                $watchdog = system(1, $cmd);
1410            };
1411            if ($@ || ($watchdog <= 0)) {
1412                _diag('Failed to start watchdog');
1413                _diag($@) if $@;
1414                undef($watchdog);
1415                return;
1416            }
1417
1418            # Add END block to parent to terminate and
1419            #   clean up watchdog process
1420            eval "END { local \$! = 0; local \$? = 0;
1421                        wait() if kill('KILL', $watchdog); };";
1422            return;
1423        }
1424
1425        # Try using fork() to generate a watchdog process
1426        my $watchdog;
1427        eval { $watchdog = fork() };
1428        if (defined($watchdog)) {
1429            if ($watchdog) {   # Parent process
1430                # Add END block to parent to terminate and
1431                #   clean up watchdog process
1432                eval "END { local \$! = 0; local \$? = 0;
1433                            wait() if kill('KILL', $watchdog); };";
1434                return;
1435            }
1436
1437            ### Watchdog process code
1438
1439            # Load POSIX if available
1440            eval { require POSIX; };
1441
1442            # Execute the timeout
1443            sleep($timeout - 2) if ($timeout > 2);   # Workaround for perlbug #49073
1444            sleep(2);
1445
1446            # Kill test process if still running
1447            if (kill(0, $pid_to_kill)) {
1448                _diag($timeout_msg);
1449                kill('KILL', $pid_to_kill);
1450		if ($is_cygwin) {
1451		    # sometimes the above isn't enough on cygwin
1452		    sleep 1; # wait a little, it might have worked after all
1453		    system("/bin/kill -f $pid_to_kill");
1454		}
1455            }
1456
1457            # Don't execute END block (added at beginning of this file)
1458            $NO_ENDING = 1;
1459
1460            # Terminate ourself (i.e., the watchdog)
1461            POSIX::_exit(1) if (defined(&POSIX::_exit));
1462            exit(1);
1463        }
1464
1465        # fork() failed - fall through and try using a thread
1466    }
1467
1468    # Use a watchdog thread because either 'threads' is loaded,
1469    #   or fork() failed
1470    if (eval {require threads; 1}) {
1471        'threads'->create(sub {
1472                # Load POSIX if available
1473                eval { require POSIX; };
1474
1475                # Execute the timeout
1476                my $time_left = $timeout;
1477                do {
1478                    $time_left = $time_left - sleep($time_left);
1479                } while ($time_left > 0);
1480
1481                # Kill the parent (and ourself)
1482                select(STDERR); $| = 1;
1483                _diag($timeout_msg);
1484                POSIX::_exit(1) if (defined(&POSIX::_exit));
1485                my $sig = $is_vms ? 'TERM' : 'KILL';
1486                kill($sig, $pid_to_kill);
1487            })->detach();
1488        return;
1489    }
1490
1491    # If everything above fails, then just use an alarm timeout
1492WATCHDOG_VIA_ALARM:
1493    if (eval { alarm($timeout); 1; }) {
1494        # Load POSIX if available
1495        eval { require POSIX; };
1496
1497        # Alarm handler will do the actual 'killing'
1498        $SIG{'ALRM'} = sub {
1499            select(STDERR); $| = 1;
1500            _diag($timeout_msg);
1501            POSIX::_exit(1) if (defined(&POSIX::_exit));
1502            my $sig = $is_vms ? 'TERM' : 'KILL';
1503            kill($sig, $pid_to_kill);
1504        };
1505    }
1506}
1507
1508my $cp_0037 =   # EBCDIC code page 0037
1509    '\x00\x01\x02\x03\x37\x2D\x2E\x2F\x16\x05\x25\x0B\x0C\x0D\x0E\x0F' .
1510    '\x10\x11\x12\x13\x3C\x3D\x32\x26\x18\x19\x3F\x27\x1C\x1D\x1E\x1F' .
1511    '\x40\x5A\x7F\x7B\x5B\x6C\x50\x7D\x4D\x5D\x5C\x4E\x6B\x60\x4B\x61' .
1512    '\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\x7A\x5E\x4C\x7E\x6E\x6F' .
1513    '\x7C\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xD1\xD2\xD3\xD4\xD5\xD6' .
1514    '\xD7\xD8\xD9\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xBA\xE0\xBB\xB0\x6D' .
1515    '\x79\x81\x82\x83\x84\x85\x86\x87\x88\x89\x91\x92\x93\x94\x95\x96' .
1516    '\x97\x98\x99\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xC0\x4F\xD0\xA1\x07' .
1517    '\x20\x21\x22\x23\x24\x15\x06\x17\x28\x29\x2A\x2B\x2C\x09\x0A\x1B' .
1518    '\x30\x31\x1A\x33\x34\x35\x36\x08\x38\x39\x3A\x3B\x04\x14\x3E\xFF' .
1519    '\x41\xAA\x4A\xB1\x9F\xB2\x6A\xB5\xBD\xB4\x9A\x8A\x5F\xCA\xAF\xBC' .
1520    '\x90\x8F\xEA\xFA\xBE\xA0\xB6\xB3\x9D\xDA\x9B\x8B\xB7\xB8\xB9\xAB' .
1521    '\x64\x65\x62\x66\x63\x67\x9E\x68\x74\x71\x72\x73\x78\x75\x76\x77' .
1522    '\xAC\x69\xED\xEE\xEB\xEF\xEC\xBF\x80\xFD\xFE\xFB\xFC\xAD\xAE\x59' .
1523    '\x44\x45\x42\x46\x43\x47\x9C\x48\x54\x51\x52\x53\x58\x55\x56\x57' .
1524    '\x8C\x49\xCD\xCE\xCB\xCF\xCC\xE1\x70\xDD\xDE\xDB\xDC\x8D\x8E\xDF';
1525
1526my $cp_1047 =   # EBCDIC code page 1047
1527    '\x00\x01\x02\x03\x37\x2D\x2E\x2F\x16\x05\x15\x0B\x0C\x0D\x0E\x0F' .
1528    '\x10\x11\x12\x13\x3C\x3D\x32\x26\x18\x19\x3F\x27\x1C\x1D\x1E\x1F' .
1529    '\x40\x5A\x7F\x7B\x5B\x6C\x50\x7D\x4D\x5D\x5C\x4E\x6B\x60\x4B\x61' .
1530    '\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\x7A\x5E\x4C\x7E\x6E\x6F' .
1531    '\x7C\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xD1\xD2\xD3\xD4\xD5\xD6' .
1532    '\xD7\xD8\xD9\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xAD\xE0\xBD\x5F\x6D' .
1533    '\x79\x81\x82\x83\x84\x85\x86\x87\x88\x89\x91\x92\x93\x94\x95\x96' .
1534    '\x97\x98\x99\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xC0\x4F\xD0\xA1\x07' .
1535    '\x20\x21\x22\x23\x24\x25\x06\x17\x28\x29\x2A\x2B\x2C\x09\x0A\x1B' .
1536    '\x30\x31\x1A\x33\x34\x35\x36\x08\x38\x39\x3A\x3B\x04\x14\x3E\xFF' .
1537    '\x41\xAA\x4A\xB1\x9F\xB2\x6A\xB5\xBB\xB4\x9A\x8A\xB0\xCA\xAF\xBC' .
1538    '\x90\x8F\xEA\xFA\xBE\xA0\xB6\xB3\x9D\xDA\x9B\x8B\xB7\xB8\xB9\xAB' .
1539    '\x64\x65\x62\x66\x63\x67\x9E\x68\x74\x71\x72\x73\x78\x75\x76\x77' .
1540    '\xAC\x69\xED\xEE\xEB\xEF\xEC\xBF\x80\xFD\xFE\xFB\xFC\xBA\xAE\x59' .
1541    '\x44\x45\x42\x46\x43\x47\x9C\x48\x54\x51\x52\x53\x58\x55\x56\x57' .
1542    '\x8C\x49\xCD\xCE\xCB\xCF\xCC\xE1\x70\xDD\xDE\xDB\xDC\x8D\x8E\xDF';
1543
1544my $cp_bc = # EBCDIC code page POSiX-BC
1545    '\x00\x01\x02\x03\x37\x2D\x2E\x2F\x16\x05\x15\x0B\x0C\x0D\x0E\x0F' .
1546    '\x10\x11\x12\x13\x3C\x3D\x32\x26\x18\x19\x3F\x27\x1C\x1D\x1E\x1F' .
1547    '\x40\x5A\x7F\x7B\x5B\x6C\x50\x7D\x4D\x5D\x5C\x4E\x6B\x60\x4B\x61' .
1548    '\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\x7A\x5E\x4C\x7E\x6E\x6F' .
1549    '\x7C\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xD1\xD2\xD3\xD4\xD5\xD6' .
1550    '\xD7\xD8\xD9\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xBB\xBC\xBD\x6A\x6D' .
1551    '\x4A\x81\x82\x83\x84\x85\x86\x87\x88\x89\x91\x92\x93\x94\x95\x96' .
1552    '\x97\x98\x99\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xFB\x4F\xFD\xFF\x07' .
1553    '\x20\x21\x22\x23\x24\x25\x06\x17\x28\x29\x2A\x2B\x2C\x09\x0A\x1B' .
1554    '\x30\x31\x1A\x33\x34\x35\x36\x08\x38\x39\x3A\x3B\x04\x14\x3E\x5F' .
1555    '\x41\xAA\xB0\xB1\x9F\xB2\xD0\xB5\x79\xB4\x9A\x8A\xBA\xCA\xAF\xA1' .
1556    '\x90\x8F\xEA\xFA\xBE\xA0\xB6\xB3\x9D\xDA\x9B\x8B\xB7\xB8\xB9\xAB' .
1557    '\x64\x65\x62\x66\x63\x67\x9E\x68\x74\x71\x72\x73\x78\x75\x76\x77' .
1558    '\xAC\x69\xED\xEE\xEB\xEF\xEC\xBF\x80\xE0\xFE\xDD\xFC\xAD\xAE\x59' .
1559    '\x44\x45\x42\x46\x43\x47\x9C\x48\x54\x51\x52\x53\x58\x55\x56\x57' .
1560    '\x8C\x49\xCD\xCE\xCB\xCF\xCC\xE1\x70\xC0\xDE\xDB\xDC\x8D\x8E\xDF';
1561
1562my $straight =  # Avoid ranges
1563    '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F' .
1564    '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F' .
1565    '\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F' .
1566    '\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x3E\x3F' .
1567    '\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F' .
1568    '\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\x5C\x5D\x5E\x5F' .
1569    '\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F' .
1570    '\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B\x7C\x7D\x7E\x7F' .
1571    '\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F' .
1572    '\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F' .
1573    '\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF' .
1574    '\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF' .
1575    '\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF' .
1576    '\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF' .
1577    '\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF' .
1578    '\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF';
1579
1580# The following 2 functions allow tests to work on both EBCDIC and
1581# ASCII-ish platforms.  They convert string scalars between the native
1582# character set and the set of 256 characters which is usually called
1583# Latin1.
1584#
1585# These routines don't work on UTF-EBCDIC and UTF-8.
1586
1587sub native_to_latin1($) {
1588    my $string = shift;
1589
1590    return $string if ord('^') == 94;   # ASCII, Latin1
1591    my $cp;
1592    if (ord('^') == 95) {    # EBCDIC 1047
1593        $cp = \$cp_1047;
1594    }
1595    elsif (ord('^') == 106) {   # EBCDIC POSIX-BC
1596        $cp = \$cp_bc;
1597    }
1598    elsif (ord('^') == 176)  {   # EBCDIC 037 */
1599        $cp = \$cp_0037;
1600    }
1601    else {
1602        die "Unknown native character set";
1603    }
1604
1605    eval '$string =~ tr/' . $$cp . '/' . $straight . '/';
1606    return $string;
1607}
1608
1609sub latin1_to_native($) {
1610    my $string = shift;
1611
1612    return $string if ord('^') == 94;   # ASCII, Latin1
1613    my $cp;
1614    if (ord('^') == 95) {    # EBCDIC 1047
1615        $cp = \$cp_1047;
1616    }
1617    elsif (ord('^') == 106) {   # EBCDIC POSIX-BC
1618        $cp = \$cp_bc;
1619    }
1620    elsif (ord('^') == 176)  {   # EBCDIC 037 */
1621        $cp = \$cp_0037;
1622    }
1623    else {
1624        die "Unknown native character set";
1625    }
1626
1627    eval '$string =~ tr/' . $straight . '/' . $$cp . '/';
1628    return $string;
1629}
1630
1631sub ord_latin1_to_native {
1632    # given an input code point, return the platform's native
1633    # equivalent value.  Anything above latin1 is itself.
1634
1635    my $ord = shift;
1636    return $ord if $ord > 255;
1637    return ord latin1_to_native(chr $ord);
1638}
1639
1640sub ord_native_to_latin1 {
1641    # given an input platform code point, return the latin1 equivalent value.
1642    # Anything above latin1 is itself.
1643
1644    my $ord = shift;
1645    return $ord if $ord > 255;
1646    return ord native_to_latin1(chr $ord);
1647}
1648
16491;
1650