X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fop%2Fexec.t;h=c23364b29d4707bb959392eb46e6e86b0c34a387;hb=1db36481d13cc744ff50a6e79d19885d5071f098;hp=f3012fd2f95502a235c301e23b1a35086eb7c09d;hpb=fe14fcc35f78a371a174a1d14256c2f35ae4262b;p=p5sagit%2Fp5-mst-13.2.git diff --git a/t/op/exec.t b/t/op/exec.t old mode 100644 new mode 100755 index f3012fd..c23364b --- a/t/op/exec.t +++ b/t/op/exec.t @@ -1,21 +1,129 @@ #!./perl -# $Header: exec.t,v 4.0 91/03/20 01:52:25 lwall Locked $ +BEGIN { + chdir 't' if -d 't'; + @INC = ('../lib'); + require './test.pl'; +} + +# supress VMS whinging about bad execs. +use vmsish qw(hushed); $| = 1; # flush stdout -print "1..8\n"; -print "not ok 1\n" if system "echo ok \\1"; # shell interpreted -print "not ok 2\n" if system "echo ok 2"; # split and directly called -print "not ok 3\n" if system "echo", "ok", "3"; # directly called +$ENV{LC_ALL} = 'C'; # Forge English error messages. +$ENV{LANGUAGE} = 'C'; # Ditto in GNU. + +my $Is_VMS = $^O eq 'VMS'; +my $Is_Win32 = $^O eq 'MSWin32'; + +skip_all("Tests mostly usesless on MacOS") if $^O eq 'MacOS'; + +plan(tests => 22); + +my $Perl = which_perl(); + +my $exit; +SKIP: { + skip("bug/feature of pdksh", 2) if $^O eq 'os2'; + + my $tnum = curr_test(); + $exit = system qq{$Perl -le "print q{ok $tnum - interp system(EXPR)"}}; + next_test(); + is( $exit, 0, ' exited 0' ); +} + +my $tnum = curr_test(); +$exit = system qq{$Perl -le "print q{ok $tnum - split & direct system(EXPR)"}}; +next_test(); +is( $exit, 0, ' exited 0' ); + +# On VMS and Win32 you need the quotes around the program or it won't work. +# On Unix its the opposite. +my $quote = $Is_VMS || $Is_Win32 ? '"' : ''; +$tnum = curr_test(); +$exit = system $Perl, '-le', + "${quote}print q{ok $tnum - system(PROG, LIST)}${quote}"; +next_test(); +is( $exit, 0, ' exited 0' ); + + +# Some basic piped commands. Some OS's have trouble with "helpfully" +# putting newlines on the end of piped output. So we split this into +# newline insensitive and newline sensitive tests. +my $echo_out = `$Perl -e "print 'ok'" | $Perl -le "print "`; +$echo_out =~ s/\n\n/\n/g; +is( $echo_out, "ok\n", 'piped echo emulation'); + +{ + # here we check if extra newlines are going to be slapped on + # piped output. + local $TODO = 'VMS sticks newlines on everything' if $Is_VMS; + + is( scalar `$Perl -e "print 'ok'"`, + "ok", 'no extra newlines on ``' ); + + is( scalar `$Perl -e "print 'ok'" | $Perl -e "print "`, + "ok", 'no extra newlines on pipes'); + + is( scalar `$Perl -le "print 'ok'" | $Perl -le "print "`, + "ok\n\n", 'doubled up newlines'); + + is( scalar `$Perl -e "print 'ok'" | $Perl -le "print "`, + "ok\n", 'extra newlines on inside pipes'); + + is( scalar `$Perl -le "print 'ok'" | $Perl -e "print "`, + "ok\n", 'extra newlines on outgoing pipes'); + + { + local($/) = \2; + $out = runperl(prog => 'print q{1234}'); + is($out, "1234", 'ignore $/ when capturing output in scalar context'); + } +} + + +is( system(qq{$Perl -e "exit 0"}), 0, 'Explicit exit of 0' ); + +my $exit_one = $Is_VMS ? 4 << 8 : 1 << 8; +is( system(qq{$Perl "-I../lib" -e "use vmsish qw(hushed); exit 1"}), $exit_one, + 'Explicit exit of 1' ); + +$rc = system { "lskdfj" } "lskdfj"; +unless( ok($rc == 255 << 8 or $rc == -1 or $rc == 256 or $rc == 512) ) { + print "# \$rc == $rc\n"; +} + +unless ( ok( $! == 2 or $! =~ /\bno\b.*\bfile/i or + $! == 13 or $! =~ /permission denied/i or + $! == 22 or $! =~ /invalid argument/i ) ) { + printf "# \$! eq %d, '%s'\n", $!, $!; +} + -if (system "true") {print "not ok 4\n";} else {print "ok 4\n";} +is( `$Perl -le "print 'ok'"`, "ok\n", 'basic ``' ); +is( <<`END`, "ok\n", '<<`HEREDOC`' ); +$Perl -le "print 'ok'" +END -if ((system "/bin/sh -c 'exit 1'") != 256) { print "not "; } -print "ok 5\n"; +{ + my $_ = qq($Perl -le "print 'ok'"); + is( readpipe, "ok\n", 'readpipe default argument' ); +} -if ((system "lskdfj") == 255 << 8) {print "ok 6\n";} else {print "not ok 6\n";} +TODO: { + my $tnum = curr_test(); + if( $^O =~ /Win32/ ) { + print "not ok $tnum - exec failure doesn't terminate process " . + "# TODO Win32 exec failure waits for user input\n"; + next_test(); + last TODO; + } -unless (exec "lskdjfalksdjfdjfkls") {print "ok 7\n";} else {print "not ok 7\n";} + ok( !exec("lskdjfalksdjfdjfkls"), + "exec failure doesn't terminate process"); +} -exec "echo","ok","8"; +my $test = curr_test(); +exec $Perl, '-le', qq{${quote}print 'ok $test - exec PROG, LIST'${quote}}; +fail("This should never be reached if the exec() worked");