X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FIPC-MorseSignals.git;a=blobdiff_plain;f=t%2F10-base.t;h=bc55f14925352c77776be4f52e7d44f913e7af7d;hp=153cffe9d15ae07550ca2f742cd68b8126a36db3;hb=133946d2bfe0a5d47755a8f182a76e2f57b72e20;hpb=762a8a02ffc76d62c023619d0dffe451498ae2b0 diff --git a/t/10-base.t b/t/10-base.t index 153cffe..bc55f14 100644 --- a/t/10-base.t +++ b/t/10-base.t @@ -6,43 +6,51 @@ use POSIX qw/SIGINT SIGTERM SIGKILL EXIT_SUCCESS/; use IPC::MorseSignals qw/msend mrecv/; -my $speed = 128; - sub trysend { my ($msg, $desc) = @_; - pipe my $rdr, my $wtr or die "$desc: pipe() failed : $!"; - my $pid = fork; - if (!defined $pid) { - die "$desc: fork() failed : $!"; - } elsif ($pid == 0) { - close $rdr; - local @SIG{qw/USR1 USR2/} = mrecv sub { - print $wtr $_[0], "\n"; - close $wtr; - exit EXIT_SUCCESS; + my $speed = 2 ** 16; + my $ok = 0; +SPEED: + while (($speed > 1) && !$ok) { + $speed /= 2; + pipe my $rdr, my $wtr or die "$desc: pipe() failed : $!"; + my $pid = fork; + if (!defined $pid) { + die "$desc: fork() failed : $!"; + } elsif ($pid == 0) { + close $rdr; + local @SIG{qw/USR1 USR2/} = mrecv sub { + print $wtr $_[0], "\n"; + close $wtr; + exit EXIT_SUCCESS; + }; + 1 while 1; + } + close $wtr or die "$desc: close() failed : $!"; + eval { + local $SIG{ALRM} = sub { die 'timeout' }; + my $a = (int(100 * (3 * length $msg) / $speed) || 1); + $a = 10 if $a > 10; + alarm $a; + msend $msg => $pid, $speed; + waitpid $pid, 0; }; - 1 while 1; - } - close $wtr or die "$desc: close() failed : $!"; - eval { - local $SIG{ALRM} = sub { die 'timeout' }; - my $a = (int(100 * (3 * length $msg) / $speed) || 1); - $a = 10 if $a > 10; - alarm $a; - msend $msg => $pid, $speed; - waitpid $pid, 0; - }; - alarm 0; - if ($@) { - kill SIGINT, $pid; - kill SIGTERM, $pid; - kill SIGKILL, $pid; - die "$desc: died ($@)"; + alarm 0; + if ($@) { + kill SIGINT, $pid; + kill SIGTERM, $pid; + kill SIGKILL, $pid; + close $rdr or die "$desc: close() failed : $!"; + next SPEED; + } + my $recv = do { local $/; <$rdr> }; + close $rdr or die "$desc: close() failed : $!"; + next SPEED unless $recv; + chomp $recv; + next SPEED unless $msg eq $recv; + $ok = 1; } - my $recv = do { local $/; <$rdr> }; - close $rdr; - chomp $recv; - ok($msg eq $recv, $desc); + ok($speed >= 1, $desc); } for (1 .. 5) {