2006-04-11 21:52:54 +00:00
#!/usr/bin/perl -w
#
# A simple driver for testing the subdomain parser.
# All files in $CWD named *.sd will be tested against the parser.
#
use strict ;
use Getopt::Long ;
2008-11-20 23:22:43 +00:00
use Test::More ;
2006-04-11 21:52:54 +00:00
my % config ;
2012-11-05 17:22:37 -08:00
$ config { 'parser' } = "/sbin/apparmor_parser" ;
2006-04-11 21:52:54 +00:00
$ config { 'profiledir' } = "./simple_tests/" ;
2017-10-23 15:28:48 +02:00
$ config { 'timeout' } = 480 ; # in seconds
2006-04-11 21:52:54 +00:00
my $ help ;
2006-12-15 08:10:25 +00:00
my $ pwd = `pwd` ;
chomp ( $ pwd ) ;
2006-04-11 21:52:54 +00:00
GetOptions (
"help|h" = > \ $ help ,
) ;
sub usage {
print STDERR "Usage $0 profile_directory\n" ;
print STDERR "\tTests the subdomain parser on the given profile directory\n" ;
print STDOUT "Bail out! Got the usage statement\n" ;
exit 0 ;
}
2008-11-20 23:22:43 +00:00
2006-04-11 21:52:54 +00:00
& usage if ( $ help ) ;
read_config ( ) ;
2012-11-05 17:22:37 -08:00
# let environment variable override config file, for use in automated
# test suites
if ( $ ENV { APPARMOR_PARSER } ) {
$ config { 'parser' } = $ ENV { APPARMOR_PARSER } ;
}
2006-04-11 21:52:54 +00:00
# Override config file profile location when passed on command line
if ( @ ARGV >= 1 ) {
$ config { 'profiledir' } = shift ;
2006-12-15 08:10:25 +00:00
}
2006-04-11 21:52:54 +00:00
if ( $ config { 'profiledir' } =~ /^\// ) {
$ config { 'includedir' } = $ config { 'profiledir' } ;
} else {
2006-12-15 08:10:25 +00:00
$ config { 'includedir' } = "$pwd/$config{'profiledir'}" ;
}
2006-04-11 21:52:54 +00:00
sub read_config {
my $ which ;
if ( open ( CONF , "uservars.conf" ) ) {
while ( <CONF> ) {
chomp ;
next if /^\s*#/ ;
if ( m/^\s*(\S+)\s*=\s*(.+)\s*$/ ) {
my ( $ key , $ value ) = ( $ 1 , $ 2 ) ;
$ config { $ key } = $ value ;
}
}
close ( CONF ) ;
}
}
sub test_profile {
my $ profile = shift ;
my $ description = "no description for testcase" ;
my $ expass = 1 ;
my $ istodo = 0 ;
my $ isdisabled = 0 ;
2013-09-11 11:56:47 -07:00
my $ result = 1 ;
my $ signal = 0 ;
my $ coredump = 0 ;
2008-11-20 23:22:43 +00:00
my $ child ;
2012-11-05 17:23:53 -08:00
$ child = open ( PARSER , "|-" ) ;
if ( $ child == 0 ) {
# child
open ( STDOUT , ">/dev/null" ) or die "Failed to redirect STDOUT" ;
open ( STDERR , ">/dev/null" ) or die "Failed to redirect STDERR" ;
2018-09-16 21:58:28 +02:00
exec ( "$config{'parser'}" , "--config-file=./parser.conf" , "-M" , "features_files/features.all" , "-S" , "-I" , "$config{'includedir'}" ) or die "Bail out! couldn't open parser" ;
2012-11-05 17:23:53 -08:00
# noreturn
}
# parent
2008-11-20 23:22:43 +00:00
eval {
local $ SIG { ALRM } = sub {
kill PIPE = > $ child ;
$ description = "$description - TESTCASE TIMED OUT" ;
} ;
alarm $ config { 'timeout' } ;
open ( PROFILE , $ profile ) or die "Bail out! couldn't open profile $profile" ;
while ( <PROFILE> ) {
2012-11-05 17:23:53 -08:00
if ( /^#=DESCRIPTION\s*(.*)/i ) {
2008-11-20 23:22:43 +00:00
$ description = $ 1 ;
} elsif ( /^#=EXRESULT\s*(\w+)/ ) {
if ( $ 1 eq "PASS" ) {
$ expass = 1 ;
} elsif ( $ 1 eq "FAIL" ) {
$ expass = 0 ;
} else {
die "Bail out! unknown expected result '$1' in $profile" ;
}
} elsif ( /^#=TODO\s*/ ) {
$ istodo = 1 ;
} elsif ( /^#=DISABLED\s*/ ) {
$ isdisabled = 1 ;
2006-04-11 21:52:54 +00:00
} else {
2008-11-20 23:22:43 +00:00
print PARSER if not $ isdisabled ;
2006-04-11 21:52:54 +00:00
}
}
2013-09-11 11:56:47 -07:00
close ( PARSER ) or ( $! and die "Bail out! couldn't close parser pipe" ) ;
$ result = $? >> 8 ;
$ signal = $? & 127 ;
$ coredump = $ signal ? $? & 128 : 0 ;
2008-11-20 23:22:43 +00:00
alarm 0 ;
} ;
alarm 0 ;
2006-04-11 21:52:54 +00:00
if ( $ isdisabled ) {
TODO: {
local $ TODO = "Disabled testcase." ;
ok ( 0 , "TODO: $profile: $description" ) ;
}
2013-09-11 11:56:47 -07:00
} elsif ( $ coredump ) {
ok ( 0 , "$profile: Produced core dump (signal $signal): $description" ) ;
2006-04-11 21:52:54 +00:00
} elsif ( $ istodo ) {
2018-09-20 00:49:42 +02:00
if ( $ expass != $ result ) {
fail ( "TODO passed unexpectedly: $profile: $description" ) ;
} else {
TODO: {
local $ TODO = "Unfixed testcase." ;
ok ( $ expass ? ! $ result : $ result , "TODO: $profile: $description" ) ;
}
2006-04-11 21:52:54 +00:00
}
} else {
2013-09-11 11:56:47 -07:00
ok ( $ expass ? ! $ result : $ result , "$profile: $description" ) ;
2006-04-11 21:52:54 +00:00
}
}
2009-07-22 22:19:23 +00:00
sub find_all_tests {
my $ testdir = shift ;
opendir ( DIR , $ testdir ) or die "Bail out! can't opendir $testdir: $!" ;
my @ files = sort grep { /\.sd$/ && - f "$testdir/$_" } readdir ( DIR ) ;
closedir ( DIR ) ;
my @ profiles ;
foreach my $ profile ( @ files ) {
push ( @ profiles , "$testdir/$profile" ) ;
}
opendir ( DIR , $ testdir ) or die "Bail out! can't opendir $testdir: $!" ;
my @ dirs = sort grep { /^[^\.]/ && - d "$testdir/$_" } readdir ( DIR ) ;
closedir ( DIR ) ;
foreach my $ dir ( @ dirs ) {
push ( @ profiles , find_all_tests ( "$testdir/$dir" ) ) ;
}
return @ profiles ;
}
my @ profiles = find_all_tests ( $ config { 'profiledir' } ) ;
2006-04-11 21:52:54 +00:00
plan tests = > scalar ( @ profiles ) ;
foreach my $ profile ( @ profiles ) {
2009-07-22 22:19:23 +00:00
test_profile ( "$profile" ) ;
2006-04-11 21:52:54 +00:00
}