blob: 7ffbd745bde4f4ec014ad8daad6e1d872a760d98 [file] [log] [blame]
fbrosson3a745712018-04-04 22:26:56 +00001#!/usr/bin/env perl
Manuel Pégourié-Gonnard85113842015-07-08 21:20:03 +01002
SimonBad8fbc02016-03-11 17:33:39 +00003# run-test-suites.pl
4#
SimonB8ca7bc42016-04-17 23:24:50 +01005# This file is part of mbed TLS (https://tls.mbed.org)
6#
Gilles Peskine0626ebb2018-12-14 18:23:13 +01007# Copyright (c) 2015-2018, ARM Limited, All Rights Reserved
8
9=head1 SYNOPSIS
10
11Execute all the test suites and print a summary of the results.
12
13 run-test-suites.pl [[-v|--verbose] [VERBOSITY]]
14
15Options:
16
17 -v|--verbose Print detailed failure information.
18 -v 2|--verbose=2 Print detailed failure information and summary messages.
19 -v 3|--verbose=3 Print detailed information about every test case.
20
21=cut
SimonBad8fbc02016-03-11 17:33:39 +000022
Manuel Pégourié-Gonnard85113842015-07-08 21:20:03 +010023use warnings;
24use strict;
25
26use utf8;
27use open qw(:std utf8);
28
Gilles Peskine0626ebb2018-12-14 18:23:13 +010029use Getopt::Long qw(:config auto_help);
30use Pod::Usage;
SimonBad8fbc02016-03-11 17:33:39 +000031
Jaeden Amero9bd49042018-10-05 13:23:35 +010032my $verbose = 0;
Gilles Peskine0626ebb2018-12-14 18:23:13 +010033GetOptions(
34 'verbose|v:1' => \$verbose,
35 ) or die;
SimonBad8fbc02016-03-11 17:33:39 +000036
Gilles Peskine071db412017-05-03 16:26:47 +020037# All test suites = executable files, excluding source files, debug
38# and profiling information, etc. We can't just grep {! /\./} because
Simon Butcherd620f6f2018-06-27 16:16:39 +010039# some of our test cases' base names contain a dot.
Gilles Peskine071db412017-05-03 16:26:47 +020040my @suites = grep { -x $_ || /\.exe$/ } glob 'test_suite_*';
Simon Butchereb219392018-09-30 21:57:34 +010041@suites = grep { !/\.c$/ && !/\.data$/ && -f } @suites;
Manuel Pégourié-Gonnard85113842015-07-08 21:20:03 +010042die "$0: no test suite found\n" unless @suites;
43
44# in case test suites are linked dynamically
45$ENV{'LD_LIBRARY_PATH'} = '../library';
Andres Amaya Garcia28d97e12018-03-27 19:57:58 +010046$ENV{'DYLD_LIBRARY_PATH'} = '../library';
Manuel Pégourié-Gonnard85113842015-07-08 21:20:03 +010047
48my $prefix = $^O eq "MSWin32" ? '' : './';
49
SimonBad8fbc02016-03-11 17:33:39 +000050my ($failed_suites, $total_tests_run, $failed, $suite_cases_passed,
51 $suite_cases_failed, $suite_cases_skipped, $total_cases_passed,
52 $total_cases_failed, $total_cases_skipped );
53
Jaeden Amero5758d8c2018-10-05 12:21:15 +010054sub pad_print_center {
55 my( $width, $padchar, $string ) = @_;
56 my $padlen = ( $width - length( $string ) - 2 ) / 2;
57 print $padchar x( $padlen ), " $string ", $padchar x( $padlen ), "\n";
58}
59
Manuel Pégourié-Gonnard85113842015-07-08 21:20:03 +010060for my $suite (@suites)
61{
62 print "$suite ", "." x ( 72 - length($suite) - 2 - 4 ), " ";
Jaeden Amero5758d8c2018-10-05 12:21:15 +010063 my $command = "$prefix$suite";
64 if( $verbose ) {
65 $command .= ' -v';
66 }
67 my $result = `$command`;
SimonBad8fbc02016-03-11 17:33:39 +000068
69 $suite_cases_passed = () = $result =~ /.. PASS/g;
70 $suite_cases_failed = () = $result =~ /.. FAILED/g;
71 $suite_cases_skipped = () = $result =~ /.. ----/g;
72
Manuel Pégourié-Gonnard85113842015-07-08 21:20:03 +010073 if( $result =~ /PASSED/ ) {
74 print "PASS\n";
Jaeden Amero9bd49042018-10-05 13:23:35 +010075 if( $verbose > 2 ) {
76 pad_print_center( 72, '-', "Begin $suite" );
77 print $result;
78 pad_print_center( 72, '-', "End $suite" );
79 }
Manuel Pégourié-Gonnard85113842015-07-08 21:20:03 +010080 } else {
81 $failed_suites++;
82 print "FAIL\n";
Jaeden Amero5758d8c2018-10-05 12:21:15 +010083 if( $verbose ) {
84 pad_print_center( 72, '-', "Begin $suite" );
85 print $result;
86 pad_print_center( 72, '-', "End $suite" );
87 }
Manuel Pégourié-Gonnard85113842015-07-08 21:20:03 +010088 }
SimonBad8fbc02016-03-11 17:33:39 +000089
90 my ($passed, $tests, $skipped) = $result =~ /([0-9]*) \/ ([0-9]*) tests.*?([0-9]*) skipped/;
91 $total_tests_run += $tests - $skipped;
92
Jaeden Amero9bd49042018-10-05 13:23:35 +010093 if( $verbose > 1 ) {
SimonBad8fbc02016-03-11 17:33:39 +000094 print "(test cases passed:", $suite_cases_passed,
95 " failed:", $suite_cases_failed,
96 " skipped:", $suite_cases_skipped,
SimonB8ca7bc42016-04-17 23:24:50 +010097 " of total:", ($suite_cases_passed + $suite_cases_failed +
98 $suite_cases_skipped),
SimonBad8fbc02016-03-11 17:33:39 +000099 ")\n"
100 }
101
102 $total_cases_passed += $suite_cases_passed;
103 $total_cases_failed += $suite_cases_failed;
104 $total_cases_skipped += $suite_cases_skipped;
Manuel Pégourié-Gonnard85113842015-07-08 21:20:03 +0100105}
106
107print "-" x 72, "\n";
108print $failed_suites ? "FAILED" : "PASSED";
109printf " (%d suites, %d tests run)\n", scalar @suites, $total_tests_run;
SimonBad8fbc02016-03-11 17:33:39 +0000110
Jaeden Amero9bd49042018-10-05 13:23:35 +0100111if( $verbose > 1 ) {
SimonBad8fbc02016-03-11 17:33:39 +0000112 print " test cases passed :", $total_cases_passed, "\n";
113 print " failed :", $total_cases_failed, "\n";
114 print " skipped :", $total_cases_skipped, "\n";
115 print " of tests executed :", ( $total_cases_passed + $total_cases_failed ),
116 "\n";
117 print " of available tests :",
118 ( $total_cases_passed + $total_cases_failed + $total_cases_skipped ),
119 "\n"
120 }
121
Manuel Pégourié-Gonnard85113842015-07-08 21:20:03 +0100122exit( $failed_suites ? 1 : 0 );
SimonBad8fbc02016-03-11 17:33:39 +0000123