This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
t/op/sselect.t: reduce random failures (hopefully)
[perl5.git] / t / op / sselect.t
1 #!./perl
2
3 my $hires;
4 BEGIN {
5     chdir 't' if -d 't';
6     @INC = ('.', '../lib');
7     $hires = eval 'use Time::HiResx "time"; 1';
8 }
9
10 require 'test.pl';
11
12 plan (11);
13
14 my $blank = "";
15 eval {select undef, $blank, $blank, 0};
16 is ($@, "", 'select undef  $blank $blank 0');
17 eval {select $blank, undef, $blank, 0};
18 is ($@, "", 'select $blank undef  $blank 0');
19 eval {select $blank, $blank, undef, 0};
20 is ($@, "", 'select $blank $blank undef  0');
21
22 eval {select "", $blank, $blank, 0};
23 is ($@, "", 'select ""     $blank $blank 0');
24 eval {select $blank, "", $blank, 0};
25 is ($@, "", 'select $blank ""     $blank 0');
26 eval {select $blank, $blank, "", 0};
27 is ($@, "", 'select $blank $blank ""     0');
28
29 eval {select "a", $blank, $blank, 0};
30 like ($@, qr/^Modification of a read-only value attempted/,
31             'select "a"    $blank $blank 0');
32 eval {select $blank, "a", $blank, 0};
33 like ($@, qr/^Modification of a read-only value attempted/,
34             'select $blank "a"    $blank 0');
35 eval {select $blank, $blank, "a", 0};
36 like ($@, qr/^Modification of a read-only value attempted/,
37             'select $blank $blank "a"    0');
38
39 my $sleep = 3;
40 # Actual sleep time on Windows may be rounded down to an integral
41 # multiple of the system clock tick interval.  Clock tick interval
42 # is configurable, but usually about 15.625 milliseconds.
43 # time() however (if we haven;t loaded Time::HiRes), doesn't return
44 # fractional values, so the observed delay may be 1 second short.
45 #
46 # There is also a report that old linux kernels may return 0.5ms early:
47 # <20110520081714.GC17549@mars.tony.develop-help.com>.
48 #
49
50 my $under = $hires ? 0.1 : 1;
51
52 my $t0 = time;
53 select(undef, undef, undef, $sleep);
54 my $t1 = time;
55 my $diff = $t1-$t0;
56 ok($diff >= $sleep-$under, "select(u,u,u,\$sleep):  at least $sleep seconds have passed");
57 note("diff=$diff under=$under");
58
59 my $empty = "";
60 vec($empty,0,1) = 0;
61 $t0 = time;
62 select($empty, undef, undef, $sleep);
63 $t1 = time;
64 $diff = $t1-$t0;
65 ok($diff >= $sleep-$under, "select(\$e,u,u,\$sleep): at least $sleep seconds have passed");
66 note("diff=$diff under=$under");