summaryrefslogtreecommitdiff
path: root/t/01proc.t
diff options
context:
space:
mode:
Diffstat (limited to 't/01proc.t')
-rw-r--r--t/01proc.t213
1 files changed, 213 insertions, 0 deletions
diff --git a/t/01proc.t b/t/01proc.t
new file mode 100644
index 0000000..2baf515
--- /dev/null
+++ b/t/01proc.t
@@ -0,0 +1,213 @@
+# Before `make install' is performed this script should be runnable with
+# `make test'. After `make install' it should work as `perl test.pl'
+
+use strict;
+use vars qw($loaded);
+
+BEGIN { $| = 1; print "1..47\n"; }
+END {print "not ok 1\n" unless $loaded; }
+
+my $ok_count = 1;
+sub ok {
+ shift or print "not ";
+ print "ok $ok_count\n";
+ ++$ok_count;
+}
+
+use Proc::Background qw(timeout_system);
+
+package EmptySubclass;
+use Proc::Background;
+use vars qw(@ISA);
+@ISA = qw(Proc::Background);
+
+package main;
+
+# If we got here, then the package being tested was loaded.
+$loaded = 1;
+ok(1); # 1
+
+# Find the lib directory.
+my $lib;
+foreach my $l (qw(lib ../lib)) {
+ if (-d $l) {
+ $lib = $l;
+ last;
+ }
+}
+$lib or die "Cannot find lib directory.\n";
+
+# Find the sleep_exit.pl and timed-process scripts. The sleep_exit.pl
+# script takes a sleep time and an exit value. timed-process takes a
+# sleep time and a command to run.
+my $sleep_exit;
+my $timed_process;
+foreach my $dir (qw(. ./bin ./t ../bin ../t Proc-Background/t)) {
+ unless ($sleep_exit) {
+ my $s = "$dir/sleep_exit.pl";
+ $sleep_exit = $s if -r $s;
+ }
+ unless ($timed_process) {
+ my $t = "$dir/timed-process";
+ $timed_process = $t if -r $t;
+ }
+}
+$sleep_exit or die "Cannot find sleep_exit.pl.\n";
+$timed_process or die "Cannot find timed-process.\n";
+my @sleep_exit = ($^X, '-w', $sleep_exit);
+my @timed_process = ($^X, '-w', "-I$lib", $timed_process);
+
+# Test the alive and wait returns.
+my $p1 = EmptySubclass->new(@sleep_exit, 2, 26);
+ok($p1); # 2
+if ($p1) {
+ ok($p1->alive); # 3
+ sleep 3;
+ ok(!$p1->alive); # 4
+ ok(($p1->wait >> 8) == 26); # 5
+} else {
+ ok(0); # 3
+ ok(0); # 4
+ ok(0); # 5
+}
+
+# Test alive, wait, and die on already dead process. Also pass some
+# bogus command line options to the program to make sure that the
+# argument protecting code for Windows does not cause the shell any
+# confusion.
+my $p2 = EmptySubclass->new(@sleep_exit,
+ 2,
+ 5,
+ "\t",
+ '"',
+ '\" 10 \\" \\\\"');
+ok($p2); # 6
+if ($p2) {
+ ok($p2->alive); # 7
+ ok(($p2->wait >> 8) == 5); # 8
+ ok($p2->die); # 9
+ ok(($p2->wait >> 8) == 5); # 10
+} else {
+ ok(0); # 7
+ ok(0); # 8
+ ok(0); # 9
+ ok(0); # 10
+}
+
+# Test die on a live process and collect the exit value. The exit
+# value should not be 0.
+my $p3 = EmptySubclass->new(@sleep_exit, 10, 0);
+ok($p3); # 11
+if ($p3) {
+ ok($p3->alive); # 12
+ sleep 1;
+ ok($p3->die); # 13
+ ok(!$p3->alive); # 14
+ ok($p3->wait); # 15
+ ok($p3->end_time > $p3->start_time); # 16
+} else {
+ ok(0); # 12
+ ok(0); # 13
+ ok(0); # 14
+ ok(0); # 15
+ ok(0); # 16
+}
+
+# Test the timeout_system function. In the first case, sleep_exit.pl
+# should exit with 26 before the timeout, and in the other case, it
+# should be killed and exit with a non-zero status. Do not check the
+# wait return value when the process is killed, since the return value
+# is different on Unix and Win32 platforms.
+my $a = timeout_system(2, @sleep_exit, 0, 26);
+my @a = timeout_system(2, @sleep_exit, 0, 26);
+ok($a>>8 == 26); # 17
+ok(@a == 2); # 18
+ok($a[0]>>8 == 26); # 19
+ok($a[1] == 0); # 20
+$a = timeout_system(1, @sleep_exit, 4, 0);
+@a = timeout_system(1, @sleep_exit, 4, 0);
+ok($a); # 21
+ok(@a == 2); # 22
+ok($a[0]); # 23
+ok($a[1] == 1); # 24
+
+# Test the code to find a program if the path to it is not absolute.
+my $p4 = EmptySubclass->new(@sleep_exit, 0, 0);
+ok($p4); # 25
+if ($p4) {
+ ok($p4->pid); # 26
+ sleep 2;
+ ok(!$p4->alive); # 27
+ ok(($p4->wait >> 8) == 0); # 28
+} else {
+ ok(0); # 26
+ ok(0); # 27
+ ok(0); # 28
+}
+
+# Test a command line entered as a single string.
+my $p5 = EmptySubclass->new("@sleep_exit 2 26");
+ok($p5); # 29
+if ($p5) {
+ ok($p5->alive); # 30
+ sleep 3;
+ ok(!$p5->alive); # 31
+ ok(($p5->wait >> 8) == 26); # 32
+} else {
+ ok(0); # 30
+ ok(0); # 31
+ ok(0); # 32
+}
+
+sub System {
+ my $result = system(@_);
+ return ($? >> 8, $? & 127, $? & 128);
+}
+
+# Test the timed-process script. First test a normal exit.
+my @t_args = ($^X, '-w', "-I$lib", $timed_process);
+my @result = System(@t_args, '-e', 153, 3, "@sleep_exit 0 237");
+ok($result[0] == 237); # 33
+ok($result[1] == 0); # 34
+ok($result[2] == 0); # 35
+
+@result = System(@t_args, 1, "@sleep_exit 10 27");
+ok($result[0] == 255); # 36
+ok($result[1] == 0); # 37
+ok($result[2] == 0); # 38
+
+@result = System(@t_args, '-e', 153, 1, "@sleep_exit 10 27");
+ok($result[0] == 153); # 39
+ok($result[1] == 0); # 40
+ok($result[2] == 0); # 41
+
+# Test the ability to pass options to Proc::Background::new.
+my %options;
+my $p6 = EmptySubclass->new(\%options, @sleep_exit, 0, 43);
+ok($p6); # 42
+if ($p6) {
+ ok(($p6->wait >> 8) == 43); # 43
+} else {
+ ok(0); # 43
+}
+
+# Test to make sure that the process is killed when the
+# Proc::Background object goes out of scope.
+$options{die_upon_destroy} = 1;
+{
+ my $p7 = EmptySubclass->new(\%options, @sleep_exit, 99999, 98);
+ ok($p7); # 44
+ if ($p7) {
+ my $pid = $p7->pid;
+ ok(defined $pid); # 45
+ sleep 1;
+ ok(kill(0, $pid) == 1); # 46
+ $p7 = undef;
+ sleep 1;
+ ok(kill(0, $pid) == 0); # 47
+ } else {
+ ok(0); # 45
+ ok(0); # 46
+ ok(0); # 47
+ }
+}