1*62c56f98SSadaf Ebrahimi#!/usr/bin/env perl 2*62c56f98SSadaf Ebrahimi 3*62c56f98SSadaf Ebrahimi# run-test-suites.pl 4*62c56f98SSadaf Ebrahimi# 5*62c56f98SSadaf Ebrahimi# Copyright The Mbed TLS Contributors 6*62c56f98SSadaf Ebrahimi# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 7*62c56f98SSadaf Ebrahimi 8*62c56f98SSadaf Ebrahimi=head1 SYNOPSIS 9*62c56f98SSadaf Ebrahimi 10*62c56f98SSadaf EbrahimiExecute all the test suites and print a summary of the results. 11*62c56f98SSadaf Ebrahimi 12*62c56f98SSadaf Ebrahimi run-test-suites.pl [[-v|--verbose] [VERBOSITY]] [--skip=SUITE[...]] 13*62c56f98SSadaf Ebrahimi 14*62c56f98SSadaf EbrahimiOptions: 15*62c56f98SSadaf Ebrahimi 16*62c56f98SSadaf Ebrahimi -v|--verbose Print detailed failure information. 17*62c56f98SSadaf Ebrahimi -v 2|--verbose=2 Print detailed failure information and summary messages. 18*62c56f98SSadaf Ebrahimi -v 3|--verbose=3 Print detailed information about every test case. 19*62c56f98SSadaf Ebrahimi --skip=SUITE[,SUITE...] 20*62c56f98SSadaf Ebrahimi Skip the specified SUITE(s). This option can be used 21*62c56f98SSadaf Ebrahimi multiple times. 22*62c56f98SSadaf Ebrahimi 23*62c56f98SSadaf Ebrahimi=cut 24*62c56f98SSadaf Ebrahimi 25*62c56f98SSadaf Ebrahimiuse warnings; 26*62c56f98SSadaf Ebrahimiuse strict; 27*62c56f98SSadaf Ebrahimi 28*62c56f98SSadaf Ebrahimiuse utf8; 29*62c56f98SSadaf Ebrahimiuse open qw(:std utf8); 30*62c56f98SSadaf Ebrahimi 31*62c56f98SSadaf Ebrahimiuse Getopt::Long qw(:config auto_help gnu_compat); 32*62c56f98SSadaf Ebrahimiuse Pod::Usage; 33*62c56f98SSadaf Ebrahimi 34*62c56f98SSadaf Ebrahimimy $verbose = 0; 35*62c56f98SSadaf Ebrahimimy @skip_patterns = (); 36*62c56f98SSadaf EbrahimiGetOptions( 37*62c56f98SSadaf Ebrahimi 'skip=s' => \@skip_patterns, 38*62c56f98SSadaf Ebrahimi 'verbose|v:1' => \$verbose, 39*62c56f98SSadaf Ebrahimi ) or die; 40*62c56f98SSadaf Ebrahimi 41*62c56f98SSadaf Ebrahimi# All test suites = executable files with a .datax file. 42*62c56f98SSadaf Ebrahimimy @suites = (); 43*62c56f98SSadaf Ebrahimifor my $data_file (glob 'test_suite_*.datax') { 44*62c56f98SSadaf Ebrahimi (my $base = $data_file) =~ s/\.datax$//; 45*62c56f98SSadaf Ebrahimi push @suites, $base if -x $base; 46*62c56f98SSadaf Ebrahimi push @suites, "$base.exe" if -e "$base.exe"; 47*62c56f98SSadaf Ebrahimi} 48*62c56f98SSadaf Ebrahimidie "$0: no test suite found\n" unless @suites; 49*62c56f98SSadaf Ebrahimi 50*62c56f98SSadaf Ebrahimi# "foo" as a skip pattern skips "test_suite_foo" and "test_suite_foo.bar" 51*62c56f98SSadaf Ebrahimi# but not "test_suite_foobar". 52*62c56f98SSadaf Ebrahimimy $skip_re = 53*62c56f98SSadaf Ebrahimi ( '\Atest_suite_(' . 54*62c56f98SSadaf Ebrahimi join('|', map { 55*62c56f98SSadaf Ebrahimi s/[ ,;]/|/g; # allow any of " ,;|" as separators 56*62c56f98SSadaf Ebrahimi s/\./\./g; # "." in the input means ".", not "any character" 57*62c56f98SSadaf Ebrahimi $_ 58*62c56f98SSadaf Ebrahimi } @skip_patterns) . 59*62c56f98SSadaf Ebrahimi ')(\z|\.)' ); 60*62c56f98SSadaf Ebrahimi 61*62c56f98SSadaf Ebrahimi# in case test suites are linked dynamically 62*62c56f98SSadaf Ebrahimi$ENV{'LD_LIBRARY_PATH'} = '../library'; 63*62c56f98SSadaf Ebrahimi$ENV{'DYLD_LIBRARY_PATH'} = '../library'; 64*62c56f98SSadaf Ebrahimi 65*62c56f98SSadaf Ebrahimimy $prefix = $^O eq "MSWin32" ? '' : './'; 66*62c56f98SSadaf Ebrahimi 67*62c56f98SSadaf Ebrahimimy (@failed_suites, $total_tests_run, $failed, $suite_cases_passed, 68*62c56f98SSadaf Ebrahimi $suite_cases_failed, $suite_cases_skipped, $total_cases_passed, 69*62c56f98SSadaf Ebrahimi $total_cases_failed, $total_cases_skipped ); 70*62c56f98SSadaf Ebrahimimy $suites_skipped = 0; 71*62c56f98SSadaf Ebrahimi 72*62c56f98SSadaf Ebrahimisub pad_print_center { 73*62c56f98SSadaf Ebrahimi my( $width, $padchar, $string ) = @_; 74*62c56f98SSadaf Ebrahimi my $padlen = ( $width - length( $string ) - 2 ) / 2; 75*62c56f98SSadaf Ebrahimi print $padchar x( $padlen ), " $string ", $padchar x( $padlen ), "\n"; 76*62c56f98SSadaf Ebrahimi} 77*62c56f98SSadaf Ebrahimi 78*62c56f98SSadaf Ebrahimifor my $suite (@suites) 79*62c56f98SSadaf Ebrahimi{ 80*62c56f98SSadaf Ebrahimi print "$suite ", "." x ( 72 - length($suite) - 2 - 4 ), " "; 81*62c56f98SSadaf Ebrahimi if( $suite =~ /$skip_re/o ) { 82*62c56f98SSadaf Ebrahimi print "SKIP\n"; 83*62c56f98SSadaf Ebrahimi ++$suites_skipped; 84*62c56f98SSadaf Ebrahimi next; 85*62c56f98SSadaf Ebrahimi } 86*62c56f98SSadaf Ebrahimi 87*62c56f98SSadaf Ebrahimi my $command = "$prefix$suite"; 88*62c56f98SSadaf Ebrahimi if( $verbose ) { 89*62c56f98SSadaf Ebrahimi $command .= ' -v'; 90*62c56f98SSadaf Ebrahimi } 91*62c56f98SSadaf Ebrahimi my $result = `$command`; 92*62c56f98SSadaf Ebrahimi 93*62c56f98SSadaf Ebrahimi $suite_cases_passed = () = $result =~ /.. PASS/g; 94*62c56f98SSadaf Ebrahimi $suite_cases_failed = () = $result =~ /.. FAILED/g; 95*62c56f98SSadaf Ebrahimi $suite_cases_skipped = () = $result =~ /.. ----/g; 96*62c56f98SSadaf Ebrahimi 97*62c56f98SSadaf Ebrahimi if( $? == 0 ) { 98*62c56f98SSadaf Ebrahimi print "PASS\n"; 99*62c56f98SSadaf Ebrahimi if( $verbose > 2 ) { 100*62c56f98SSadaf Ebrahimi pad_print_center( 72, '-', "Begin $suite" ); 101*62c56f98SSadaf Ebrahimi print $result; 102*62c56f98SSadaf Ebrahimi pad_print_center( 72, '-', "End $suite" ); 103*62c56f98SSadaf Ebrahimi } 104*62c56f98SSadaf Ebrahimi } else { 105*62c56f98SSadaf Ebrahimi push @failed_suites, $suite; 106*62c56f98SSadaf Ebrahimi print "FAIL\n"; 107*62c56f98SSadaf Ebrahimi if( $verbose ) { 108*62c56f98SSadaf Ebrahimi pad_print_center( 72, '-', "Begin $suite" ); 109*62c56f98SSadaf Ebrahimi print $result; 110*62c56f98SSadaf Ebrahimi pad_print_center( 72, '-', "End $suite" ); 111*62c56f98SSadaf Ebrahimi } 112*62c56f98SSadaf Ebrahimi } 113*62c56f98SSadaf Ebrahimi 114*62c56f98SSadaf Ebrahimi my ($passed, $tests, $skipped) = $result =~ /([0-9]*) \/ ([0-9]*) tests.*?([0-9]*) skipped/; 115*62c56f98SSadaf Ebrahimi $total_tests_run += $tests - $skipped; 116*62c56f98SSadaf Ebrahimi 117*62c56f98SSadaf Ebrahimi if( $verbose > 1 ) { 118*62c56f98SSadaf Ebrahimi print "(test cases passed:", $suite_cases_passed, 119*62c56f98SSadaf Ebrahimi " failed:", $suite_cases_failed, 120*62c56f98SSadaf Ebrahimi " skipped:", $suite_cases_skipped, 121*62c56f98SSadaf Ebrahimi " of total:", ($suite_cases_passed + $suite_cases_failed + 122*62c56f98SSadaf Ebrahimi $suite_cases_skipped), 123*62c56f98SSadaf Ebrahimi ")\n" 124*62c56f98SSadaf Ebrahimi } 125*62c56f98SSadaf Ebrahimi 126*62c56f98SSadaf Ebrahimi $total_cases_passed += $suite_cases_passed; 127*62c56f98SSadaf Ebrahimi $total_cases_failed += $suite_cases_failed; 128*62c56f98SSadaf Ebrahimi $total_cases_skipped += $suite_cases_skipped; 129*62c56f98SSadaf Ebrahimi} 130*62c56f98SSadaf Ebrahimi 131*62c56f98SSadaf Ebrahimiprint "-" x 72, "\n"; 132*62c56f98SSadaf Ebrahimiprint @failed_suites ? "FAILED" : "PASSED"; 133*62c56f98SSadaf Ebrahimiprintf( " (%d suites, %d tests run%s)\n", 134*62c56f98SSadaf Ebrahimi scalar(@suites) - $suites_skipped, 135*62c56f98SSadaf Ebrahimi $total_tests_run, 136*62c56f98SSadaf Ebrahimi $suites_skipped ? ", $suites_skipped suites skipped" : "" ); 137*62c56f98SSadaf Ebrahimi 138*62c56f98SSadaf Ebrahimiif( $verbose && @failed_suites ) { 139*62c56f98SSadaf Ebrahimi # the output can be very long, so provide a summary of which suites failed 140*62c56f98SSadaf Ebrahimi print " failed suites : @failed_suites\n"; 141*62c56f98SSadaf Ebrahimi} 142*62c56f98SSadaf Ebrahimi 143*62c56f98SSadaf Ebrahimiif( $verbose > 1 ) { 144*62c56f98SSadaf Ebrahimi print " test cases passed :", $total_cases_passed, "\n"; 145*62c56f98SSadaf Ebrahimi print " failed :", $total_cases_failed, "\n"; 146*62c56f98SSadaf Ebrahimi print " skipped :", $total_cases_skipped, "\n"; 147*62c56f98SSadaf Ebrahimi print " of tests executed :", ( $total_cases_passed + $total_cases_failed ), 148*62c56f98SSadaf Ebrahimi "\n"; 149*62c56f98SSadaf Ebrahimi print " of available tests :", 150*62c56f98SSadaf Ebrahimi ( $total_cases_passed + $total_cases_failed + $total_cases_skipped ), 151*62c56f98SSadaf Ebrahimi "\n"; 152*62c56f98SSadaf Ebrahimi if( $suites_skipped != 0 ) { 153*62c56f98SSadaf Ebrahimi print "Note: $suites_skipped suites were skipped.\n"; 154*62c56f98SSadaf Ebrahimi } 155*62c56f98SSadaf Ebrahimi} 156*62c56f98SSadaf Ebrahimi 157*62c56f98SSadaf Ebrahimiexit( @failed_suites ? 1 : 0 ); 158*62c56f98SSadaf Ebrahimi 159