diff -r 22486c9c7b15 -r 378360dbbdba srctools/distillsrc/test/test.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srctools/distillsrc/test/test.pl Wed Jun 30 11:35:58 2010 +0800 @@ -0,0 +1,226 @@ +#!\bin\perl -w +# Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of the License "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# distillsrc.pl test script +# +# + +use FindBin; +use Cwd ('chdir','abs_path'); + +my $cwd = abs_path($FindBin::Bin."\\.."); +chdir($cwd) or die "Couldn't change directory to $cwd\n"; + +# Test cases +# +# Entry format: [parameters, [[pass regexps],[fail regexps]]] +# +# [pass regexps] and [fail regexps] are lists of regular expressions, each +# as a string. All pass regexps must match. No fail regexps may match. +# If a line matches both, it is said to have passed (hence a generic failure +# rule can be written to match any output which wasn't expected) +my @testcases = + ( + ['-r fred -l beech' , + [ + ['^ERROR: RealTimeBuild:.*srcpath must be given'], + ['^ERROR: RealTimeBuild:'] + ] + ], + ['-s fred -l beech' , + [ + ['^ERROR: RealTimeBuild:.*srcroot must be given'], + ['^ERROR: RealTimeBuild:'] + ] + ], + ['-r fred -s src' , + [ + ['^ERROR: RealTimeBuild:.*platform'], + ['^ERROR: RealTimeBuild:'] + ] + ], + ['-d -r test -s source -p prefix -l fred -c test\options.txt -N' , + [ + [ + '= spacey$', + '= whole$', + '^DUMMY: File test\\\\source\\\\fixer.mrp', + '^DUMMY: File test\\\\source\\\\DISTRIBUTION\\.POLICY', + '^DUMMY: File test\\\\source\\\\missing\\\\unowned' + ], + [ + '^DUMMY:.*is not specified in any \\.mrp file', + 'does not include itself' + ] + ] + ], + ['-d -r test -s source -p prefix -l fred -c test\options.txt -m test\source\fixer.mrp' , + [ + [ + '= spacey$', + '= whole$', + '= fixer$', + 'WARNING: \[fixer\] Case of .test\\\\soUrce\\\\DIStribuTION.poliCY. does not match.* Should be test\\\\source\\\\DISTRIBUTION.POLICY$', + 'WARNING: \[fixer\] Case of .test\\\\soUrce\\\\missing.* does not match.* Should be test\\\\source\\\\missing', + 'source\\\\spacey\\\\spa cey.txt = spacey$', + ], + [ + '^DUMMY:.*is not specified in any \\.mrp file', + 'does not include itself' + ] + ] + ], + ['-d -r test -s source -p prefix -l fred -f test\base.txt' , + [ + [ + '= whole$', + '^DUMMY: File test\\\\source\\\\fixer\\.mrp', + '^DUMMY: File test\\\\source\\\\DISTRIBUTION\\.POLICY', + '^DUMMY: Directory test\\\\source\\\\missing', + '^DUMMY: File test\\\\source\\\\shared\\\\missing', + '^DUMMY: Directory test\\\\source\\\\spacey' + ], + [ + '^DUMMY:.*is not specified in any \\.mrp file', + 'does not include itself' + ] + ] + ], + ['-d -r test -s nowt -l fred -m test\naughty.mrp' , + [ + [ + 'nothing_important.* doesn\'t exist', + 'No \.mrp files claim any source', + 'naughty\.mrp.*does not include itself' + ], + ['^DUMMY:.*is not specified in any \\.mrp file'] + ] + ], + ['-r test -s source -l fred -m test\not_present.mrp' , + [ + ['^ERROR: RealTimeBuild:.*not_present\\.mrp.*does not exist'], + [] + ] + ], + ['-r test -s source -l fred -m test\duffer.mrp', + [ + ['^ERROR: RealTimeBuild:.*not a valid command.*test\\\\duffer\\.mrp'], + ['= duffer$'] + ] + ], + ['-d -r test -s source -p prefix -l fred -f test\base.txt', + [ + [ + '^WARNING:.*Case of \'.*complete.mrp\' does not match.* Should be.*source.*$', + '^WARNING:.*Case of \'.*whole.mrp\' does not match.* Should be.*whole.whole.*$', + ], + ['^WARNING:.*Case of .* does not match.* Should be.*$'] + ] + ], + ['-d -r test -s source -p prefix -l fred -m test\bincase.mrp', + [ + [ + '^REMARK:.*\\\\epoc32\\\\thisOneIsnt should be lower case', + '^REMARK:.*\\\\epoc32\\\\andNorIs\/thisone should be lower case', + '^REMARK:.*\\\\epoc32\\\\thisonesNot should be lower case', + '^REMARK:.*\\\\epoc32\\\\norThis\\\\one should be lower case' + ], + ['^REMARK:.*should be lower case.*$'] + ] + ] + ); + +my $passes = 0; +my $tests = 0; + +foreach my $testcase (@testcases) + { + my $cmd = "distillsrc.pl ".$testcase->[0]; + print "\nRunning $cmd\n"; + my @output = `perl $cmd 2>&1`; + my @passregexps = @{$testcase->[1]->[0]}; + my @failregexps = @{$testcase->[1]->[1]}; + + my $testpass = -1; # (unset) + + foreach my $line (@output) + { + chomp ($line); + my $pass = 0; + my $fail = 0; + + foreach my $passregexp (@passregexps) + { + if ($line =~ /$passregexp/) + { + $pass = 1; + + # Remove rule from list + @passregexps = grep($_ ne $passregexp, @passregexps); + } + } + + if (!$pass) + { + foreach my $failregexp (@failregexps) + { + if ($line =~ /$failregexp/) + { + $fail = 1; + } + } + } + + if ($pass) + { + print "GOOD:$line\n"; + if ($testpass == -1) + { + $testpass = 1; # Passed (so far) + } + } + elsif ($fail) + { + print "BAD:$line\n"; + $testpass = 0; # Failed + } + else { print "OKEH:$line\n"; } + } + + if ($testpass == 1) + { + if ((scalar @passregexps) == 0) + { + print "*** PASS\n"; + $passes ++; + } + else + { + print "*** FAIL - tests not matched:\n> "; + print join("\n> ", @passregexps)."\n"; + } + } + elsif ($testpass == 0) + { + print "*** FAIL - hard fail\n"; + } + else + { + print "*** FAIL - no tests matched\n"; + } + + $tests ++; + } + +print "*** Out of $tests tests, $passes passed\n";