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