2000-04-13 06:33:22 +00:00
#!/usr/local/bin/perl -w
#
# Run the test suite and generate a report
#
if ( ! - f "Configure" ) {
print "Please run perl util/selftest.pl in the OpenSSL directory.\n" ;
exit 1 ;
}
my $ report = "testlog" ;
my $ os = "??" ;
my $ version = "??" ;
my $ platform0 = "??" ;
my $ platform = "??" ;
my $ options = "??" ;
my $ last = "??" ;
my $ ok = 0 ;
my $ cc = "cc" ;
my $ cversion = "??" ;
my $ sep = "-----------------------------------------------------------------------------\n" ;
2000-11-13 01:03:58 +00:00
my $ not_our_fault = "\nPlease ask your system administrator/vendor for more information.\n[Problems with your operating system setup should not be reported\nto the OpenSSL project.]\n" ;
2000-04-13 06:33:22 +00:00
open ( OUT , ">$report" ) or die ;
print OUT "OpenSSL self-test report:\n\n" ;
$ uname = `uname -a` ;
$ uname = "??\n" if $ uname eq "" ;
$ c = `sh config -t` ;
foreach $ _ ( split ( "\n" , $ c ) ) {
$ os = $ 1 if ( /Operating system: (.*)$/ ) ;
$ platform0 = $ 1 if ( /Configuring for (.*)$/ ) ;
}
2005-02-25 05:39:05 +00:00
system "sh config" if ( ! - f "Makefile" ) ;
2000-04-13 06:33:22 +00:00
2005-02-25 05:39:05 +00:00
if ( open ( IN , "<Makefile" ) ) {
2000-04-13 06:33:22 +00:00
while ( <IN> ) {
$ version = $ 1 if ( /^VERSION=(.*)$/ ) ;
$ platform = $ 1 if ( /^PLATFORM=(.*)$/ ) ;
$ options = $ 1 if ( /^OPTIONS=(.*)$/ ) ;
$ cc = $ 1 if ( /^CC= *(.*)$/ ) ;
}
close ( IN ) ;
} else {
print OUT "Error running config!\n" ;
}
$ cversion = `$cc -v 2>&1` ;
2006-07-29 19:10:21 +00:00
$ cversion = `$cc -V 2>&1` if $ cversion =~ "[Uu]sage" ;
2003-01-28 21:43:22 +00:00
$ cversion = `$cc -V |head -1` if $ cversion =~ "Error" ;
2000-04-13 06:33:22 +00:00
$ cversion = `$cc --version` if $ cversion eq "" ;
$ cversion =~ s/Reading specs.*\n// ;
$ cversion =~ s/usage.*\n// ;
chomp $ cversion ;
if ( open ( IN , "<CHANGES" ) ) {
while ( <IN> ) {
2002-07-30 12:44:15 +00:00
if ( /\*\) (.{0,55})/ && ! /applies to/ ) {
2000-04-13 06:33:22 +00:00
$ last = $ 1 ;
last ;
}
}
close ( IN ) ;
}
print OUT "OpenSSL version: $version\n" ;
print OUT "Last change: $last...\n" ;
print OUT "Options: $options\n" if $ options ne "" ;
print OUT "OS (uname): $uname" ;
print OUT "OS (config): $os\n" ;
print OUT "Target (default): $platform0\n" ;
print OUT "Target: $platform\n" ;
print OUT "Compiler: $cversion\n" ;
print OUT "\n" ;
print "Checking compiler...\n" ;
if ( open ( TEST , ">cctest.c" ) ) {
2000-11-13 01:03:58 +00:00
print TEST "#include <stdio.h>\n#include <errno.h>\nmain(){printf(\"Hello world\\n\");}\n" ;
2000-04-13 06:33:22 +00:00
close ( TEST ) ;
system ( "$cc -o cctest cctest.c" ) ;
if ( `./cctest` !~ /Hello world/ ) {
print OUT "Compiler doesn't work.\n" ;
2000-11-13 01:03:58 +00:00
print OUT $ not_our_fault ;
2000-04-13 06:33:22 +00:00
goto err ;
}
system ( "ar r cctest.a /dev/null" ) ;
if ( not - f "cctest.a" ) {
print OUT "Check your archive tool (ar).\n" ;
2000-11-13 01:03:58 +00:00
print OUT $ not_our_fault ;
2000-04-13 06:33:22 +00:00
goto err ;
}
} else {
print OUT "Can't create cctest.c\n" ;
}
if ( open ( TEST , ">cctest.c" ) ) {
print TEST "#include <openssl/opensslv.h>\nmain(){printf(OPENSSL_VERSION_TEXT);}\n" ;
close ( TEST ) ;
system ( "$cc -o cctest -Iinclude cctest.c" ) ;
$ cctest = `./cctest` ;
if ( $ cctest !~ /OpenSSL $version/ ) {
if ( $ cctest =~ /OpenSSL/ ) {
print OUT "#include uses headers from different OpenSSL version!\n" ;
} else {
print OUT "Can't compile test program!\n" ;
}
2000-11-13 01:03:58 +00:00
print OUT $ not_our_fault ;
2000-04-13 06:33:22 +00:00
goto err ;
}
} else {
print OUT "Can't create cctest.c\n" ;
}
print "Running make...\n" ;
if ( system ( "make 2>&1 | tee make.log" ) > 255 ) {
print OUT "make failed!\n" ;
if ( open ( IN , "<make.log" ) ) {
print OUT $ sep ;
while ( <IN> ) {
print OUT ;
}
close ( IN ) ;
print OUT $ sep ;
} else {
print OUT "make.log not found!\n" ;
}
goto err ;
}
2006-07-29 19:10:21 +00:00
# Not sure why this is here. The tests themselves can detect if their
# particular feature isn't included, and should therefore skip themselves.
# To skip *all* tests just because one algorithm isn't included is like
# shooting mosquito with an elephant gun...
# -- Richard Levitte, inspired by problem report 1089
#
#$_=$options;
#s/no-asm//;
#s/no-shared//;
#s/no-krb5//;
#if (/no-/)
#{
# print OUT "Test skipped.\n";
# goto err;
#}
2000-04-13 06:33:22 +00:00
print "Running make test...\n" ;
if ( system ( "make test 2>&1 | tee maketest.log" ) > 255 )
{
print OUT "make test failed!\n" ;
} else {
$ ok = 1 ;
}
if ( $ ok and open ( IN , "<maketest.log" ) ) {
while ( <IN> ) {
$ ok = 2 if /^platform: $platform/ ;
}
close ( IN ) ;
}
if ( $ ok != 2 ) {
print OUT "Failure!\n" ;
if ( open ( IN , "<make.log" ) ) {
print OUT $ sep ;
while ( <IN> ) {
print OUT ;
}
close ( IN ) ;
print OUT $ sep ;
} else {
print OUT "make.log not found!\n" ;
}
if ( open ( IN , "<maketest.log" ) ) {
while ( <IN> ) {
print OUT ;
}
close ( IN ) ;
print OUT $ sep ;
} else {
print OUT "maketest.log not found!\n" ;
}
} else {
print OUT "Test passed.\n" ;
}
err:
close ( OUT ) ;
print "\n" ;
open ( IN , "<$report" ) or die ;
while ( <IN> ) {
if ( /$sep/ ) {
print "[...]\n" ;
last ;
}
print ;
}
print "\nTest report in file $report\n" ;