alarm() test, take two
Michael G. Schwern [Sun, 16 Dec 2001 23:59:01 +0000 (18:59 -0500)]
Message-ID: <20011217045901.GL17232@blackrider>

p4raw-id: //depot/perl@13735

t/op/alarm.t [new file with mode: 0644]

diff --git a/t/op/alarm.t b/t/op/alarm.t
new file mode 100644 (file)
index 0000000..0dfc661
--- /dev/null
@@ -0,0 +1,50 @@
+#!./perl 
+
+BEGIN {
+    chdir 't';
+    @INC = '../lib';
+    require './test.pl';
+}
+
+BEGIN {
+    use Config;
+    if( !$Config{d_alarm} ) {
+        skip_all("alarm() not implemented on this platform");
+    }
+}
+
+plan tests => 4;
+my $Perl = which_perl();
+
+my $start_time = time;
+eval {
+    local $SIG{ALRM} = sub { die "ALARM!\n" };
+    alarm 3;
+
+    # perlfunc recommends against using sleep in combination with alarm.
+    1 while (time - $start_time < 6);
+};
+alarm 0;
+my $diff = time - $start_time;
+
+# alarm time might be one second less than you said.
+is( $@, "ALARM!\n",             'alarm w/$SIG{ALRM} vs inf loop' );
+ok( $diff == 3 || $diff == 2,   '   right time' );
+
+
+my $start_time = time;
+eval {
+    local $SIG{ALRM} = sub { die "ALARM!\n" };
+    alarm 3;
+    system(qq{$Perl -e "sleep 6"});
+};
+alarm 0;
+$diff = time - $start_time;
+
+# alarm time might be one second less than you said.
+is( $@, "ALARM!\n",             'alarm w/$SIG{ALRM} vs system()' );
+
+TODO: {
+    local $TODO = "alarm() can't stop a system call with \$SIG{ALRM} set";
+    ok( $diff == 3 || $diff == 2,   '   right time' );
+}