Microperl findings.
[p5sagit/p5-mst-13.2.git] / ext / Time / HiRes / HiRes.t
CommitLineData
dcf686c9 1BEGIN {
2 chdir 't' if -d 't';
3 @INC = '../lib';
4}
5
3c72ec00 6BEGIN { $| = 1; print "1..19\n"; }
dcf686c9 7
8END {print "not ok 1\n" unless $loaded;}
9
10use Time::HiRes qw(tv_interval);
11
12$loaded = 1;
13
14print "ok 1\n";
15
16use strict;
17
18my $have_gettimeofday = defined &Time::HiRes::gettimeofday;
19my $have_usleep = defined &Time::HiRes::usleep;
20my $have_ualarm = defined &Time::HiRes::ualarm;
21
22import Time::HiRes 'gettimeofday' if $have_gettimeofday;
23import Time::HiRes 'usleep' if $have_usleep;
24import Time::HiRes 'ualarm' if $have_ualarm;
25
3c72ec00 26use Config;
27
dcf686c9 28sub skip {
29 map { print "ok $_ (skipped)\n" } @_;
30}
31
32sub ok {
33 my ($n, $result, @info) = @_;
34 if ($result) {
35 print "ok $n\n";
36 }
37 else {
38 print "not ok $n\n";
39 print "# @info\n" if @info;
40 }
41}
42
43if (!$have_gettimeofday) {
44 skip 2..6;
45}
46else {
47 my @one = gettimeofday();
48 ok 2, @one == 2, 'gettimeofday returned ', 0+@one, ' args';
49 ok 3, $one[0] > 850_000_000, "@one too small";
50
51 sleep 1;
52
53 my @two = gettimeofday();
54 ok 4, ($two[0] > $one[0] || ($two[0] == $one[0] && $two[1] > $one[1])),
55 "@two is not greater than @one";
56
57 my $f = Time::HiRes::time;
58 ok 5, $f > 850_000_000, "$f too small";
59 ok 6, $f - $two[0] < 2, "$f - @two >= 2";
60}
61
62if (!$have_usleep) {
63 skip 7..8;
64}
65else {
66 my $one = time;
67 usleep(10_000);
68 my $two = time;
69 usleep(10_000);
70 my $three = time;
71 ok 7, $one == $two || $two == $three, "slept too long, $one $two $three";
72
73 if (!$have_gettimeofday) {
74 skip 8;
75 }
76 else {
77 my $f = Time::HiRes::time;
78 usleep(500_000);
79 my $f2 = Time::HiRes::time;
80 my $d = $f2 - $f;
81 ok 8, $d > 0.4 && $d < 0.8, "slept $d secs $f to $f2";
82 }
83}
84
85# Two-arg tv_interval() is always available.
86{
87 my $f = tv_interval [5, 100_000], [10, 500_000];
88 ok 9, $f == 5.4, $f;
89}
90
91if (!$have_gettimeofday) {
92 skip 10;
93}
94else {
95 my $r = [gettimeofday()];
96 my $f = tv_interval $r;
97 ok 10, $f < 2, $f;
98}
99
100if (!$have_usleep) {
101 skip 11;
102}
103else {
104 my $r = [gettimeofday()];
105 #jTime::HiRes::sleep 0.5;
106 Time::HiRes::sleep( 0.5 );
107 my $f = tv_interval $r;
108 ok 11, $f > 0.4 && $f < 0.8, "slept $f secs";
109}
110
111if (!$have_ualarm) {
112 skip 12..13;
113}
114else {
115 my $tick = 0;
116 local $SIG{ALRM} = sub { $tick++ };
117
118 my $one = time; $tick = 0; ualarm(10_000); sleep until $tick;
119 my $two = time; $tick = 0; ualarm(10_000); sleep until $tick;
120 my $three = time;
121 ok 12, $one == $two || $two == $three, "slept too long, $one $two $three";
122
123 $tick = 0;
124 ualarm(10_000, 10_000);
125 sleep until $tick >= 3;
126 ok 13, 1;
127 ualarm(0);
128}
129
130# new test: did we even get close?
131
132{
133 my $t = time();
134 my $tf = Time::HiRes::time();
6119b5d3 135 ok 14, (abs($tf - $t) <= 1),
dcf686c9 136 "time $t differs from Time::HiRes::time $tf";
137}
138
139unless (defined &Time::HiRes::gettimeofday
140 && defined &Time::HiRes::ualarm
141 && defined &Time::HiRes::usleep) {
142 for (15..17) {
143 print "ok $_ # skipped\n";
144 }
145} else {
146 use Time::HiRes qw (time alarm sleep);
147
148 my ($f, $r, $i);
149
150 print "# time...";
151 $f = time;
152 print "$f\nok 15\n";
153
154 print "# sleep...";
155 $r = [Time::HiRes::gettimeofday];
156 sleep (0.5);
157 print Time::HiRes::tv_interval($r), "\nok 16\n";
158
159 $r = [Time::HiRes::gettimeofday];
160 $i = 5;
161 $SIG{ALRM} = "tick";
162 while ($i)
163 {
0e172911 164 alarm(0.3);
dcf686c9 165 select (undef, undef, undef, 10);
3c72ec00 166 print "# Select returned! $i ", Time::HiRes::tv_interval ($r), "\n";
dcf686c9 167 }
168
169 sub tick
170 {
dcf686c9 171 $i--;
3c72ec00 172 print "# Tick! $i ", Time::HiRes::tv_interval ($r), "\n";
dcf686c9 173 }
174 $SIG{ALRM} = 'DEFAULT';
175
176 print "ok 17\n";
177}
178
3c72ec00 179unless (defined &Time::HiRes::setitimer
180 && defined &Time::HiRes::getitimer
181 && exists &Time::HiRes::ITIMER_VIRTUAL
182 && $Config{d_select}) {
183 for (18..19) {
0e172911 184 print "ok $_ # Skip: no virtual interval timers\n";
3c72ec00 185 }
186} else {
187 use Time::HiRes qw (setitimer getitimer ITIMER_VIRTUAL);
188
189 my $i = 3;
190 my $r = [Time::HiRes::gettimeofday];
191
192 $SIG{VTALRM} = sub {
193 $i ? $i-- : setitimer(ITIMER_VIRTUAL, 0);
194 print "# Tick! $i ", Time::HiRes::tv_interval($r), "\n";
195 };
196
0e172911 197 print "# setitimer: ", join(" ", setitimer(ITIMER_VIRTUAL, 0.5, 0.4)), "\n";
198
199 # Assume interval timer granularity of 0.05 seconds. Too bold?
200 print "not " unless abs(getitimer(ITIMER_VIRTUAL) / 0.5) - 1 < 0.1;
201 print "ok 18\n";
3c72ec00 202
203 print "# getitimer: ", join(" ", getitimer(ITIMER_VIRTUAL)), "\n";
204
1c41c9bf 205 while (getitimer(ITIMER_VIRTUAL)) {
206 my $j; $j++ for 1..1000; # Can't be unbreakable, must test getitimer().
3c72ec00 207 }
208
209 print "# getitimer: ", join(" ", getitimer(ITIMER_VIRTUAL)), "\n";
210
0e172911 211 print "not " unless getitimer(ITIMER_VIRTUAL) == 0;
212 print "ok 19\n";
213
3c72ec00 214 $SIG{VTALRM} = 'DEFAULT';
215}
216