]> git.vpit.fr Git - perl/modules/IPC-MorseSignals.git/blob - t/10-base.t
Importing IPC-MorseSignals-0.04.tar.gz
[perl/modules/IPC-MorseSignals.git] / t / 10-base.t
1 #!perl -T
2
3 use Test::More tests => 4 * 5;
4
5 use POSIX qw/SIGINT SIGTERM SIGKILL EXIT_SUCCESS EXIT_FAILURE WIFEXITED WEXITSTATUS/;
6
7 use IPC::MorseSignals qw/msend mrecv/;
8
9 sub trysend {
10  my ($msg, $desc) = @_;
11  my $speed = 2 ** 16;
12  my $ok = 0;
13 SPEED:
14  while (($speed > 1) && !$ok) {
15   $speed /= 2;
16   my $pid = fork;
17   if (!defined $pid) {
18    die "$desc: fork() failed : $!";
19   } elsif ($pid == 0) {
20    local @SIG{qw/USR1 USR2/} = mrecv sub {
21     exit(($msg eq $_[0]) ? EXIT_SUCCESS : EXIT_FAILURE);
22    };
23    1 while 1;
24    exit EXIT_FAILURE;
25   }
26   eval {
27    local $SIG{ALRM} = sub { die 'timeout' };
28    my $a = (int(100 * (3 * length $msg) / $speed) || 1);
29    $a = 10 if $a > 10;
30    alarm $a;
31    msend $msg => $pid, speed => $speed;
32    waitpid $pid, 0;
33    $ok = (WIFEXITED($?) && (WEXITSTATUS($?) == EXIT_SUCCESS));
34   };
35   alarm 0;
36   if ($@) {
37    kill SIGINT,  $pid;
38    kill SIGTERM, $pid;
39    kill SIGKILL, $pid;
40   }
41  }
42  ok($speed >= 1, $desc);
43 }
44
45 for (1 .. 5) {
46  trysend 'hello', 'ascii';
47  trysend "\0" x 10, 'few bits';
48  trysend "\x{FF}" x 10, 'lots of bits';
49  trysend "a\0b", 'null character';
50 }