Fail when measured latnecy is zero
[can-benchmark.git] / continuous / gw-setup / run.pl
1 #!/usr/bin/perl -w
2
3 use FindBin;
4
5 # Create startup script in ramdisk
6 my $S99 = "$FindBin::Bin/initramfs/etc/init.d/S99benchmark";
7 system("rm -f $S99");
8 system("cat > $S99; chmod +x $S99") unless -t STDIN;
9
10 # Boot gateway
11 my $boot;
12 my $pid = &run_boot;
13 $|=1;
14
15 my $ready;
16 while (<$boot>){
17     last if ($ready = m/Welcome to Buildroot/ ||
18                       m/UGW started/ ||
19                       m/t...a...s...k...s... ...s...t...a...r...t...e...d/); # RTEMS has bug - it sends 4 characters instead of just one
20 }
21 die "Boot failed" unless $ready;
22
23 # Measure latencies
24 my $latester=<<'EOF';
25 rm -f tmp-stat.txt
26 echo "Starting latester"
27 sudo ip l set eth0 down
28 sudo ~/bin/latester -d can0 -d can1 -d can2 -c 3200 -q --oneattime -n tmp
29 r=$?
30 sudo ip l set eth0 up
31 set -e
32 source tmp-stat.txt
33 for i in sent lost enobufs $(seq -f percentile%g 0 10 100); do keyval="$keyval $i=$((i))"; done
34 echo "! PERF: gw_latency $avg ┬Ás $keyval ok"
35 test $avg -eq 0 || exit 1
36 exit $r
37 EOF
38
39 my $status = system((qw(ssh -T glab), $latester));
40 kill('TERM', -$pid);
41 exit($status >> 8);
42
43 # Helper functions
44 sub kill_boot() { kill('TERM', -$pid) if defined $pid; }
45 sub run_boot()
46 {
47     # die("No boot command") if ($#ARGV eq -1);
48     my $bootcmd = scalar @ARGV ? "'".join("' '", @ARGV)."'" : "$FindBin::Bin/boot";
49
50     $SIG{INT} = sub { kill_boot(); exit; };
51     $SIG{HUP} = sub { kill_boot(); exit; };
52     $SIG{ALRM} = sub { kill_boot(); exit; };
53     $SIG{TERM} = sub { kill_boot(); exit; };
54     $SIG{QUIT} = sub { kill_boot(); exit; };
55
56     pipe($boot, $wh) || die("pipe: $!");
57     my $pid = fork() // die("fork: $!");
58     if ($pid == 0) {
59         setpgrp(); # Start new process group so that we can kill all
60                    # background processes at once
61         close($boot);
62         open(STDERR, ">&", $wh) || die "Can't dup STDERR: $!";
63         my $cmd = "$bootcmd 2>&1 | tee /dev/stderr";
64         exec($cmd) || die "Can't exec $cmd: $!";
65     }
66     close($wh);
67     return $pid;
68 }
69
70 END { kill_boot(); }