xref: /aosp_15_r20/external/mbedtls/tests/scripts/run-test-suites.pl (revision 62c56f9862f102b96d72393aff6076c951fb8148)
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