summaryrefslogtreecommitdiffstats
path: root/tests/auto/test.pl
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@nokia.com>2009-03-23 10:18:55 +0100
committerSimon Hausmann <simon.hausmann@nokia.com>2009-03-23 10:18:55 +0100
commite5fcad302d86d316390c6b0f62759a067313e8a9 (patch)
treec2afbf6f1066b6ce261f14341cf6d310e5595bc1 /tests/auto/test.pl
Long live Qt 4.5!
Diffstat (limited to 'tests/auto/test.pl')
-rwxr-xr-xtests/auto/test.pl191
1 files changed, 191 insertions, 0 deletions
diff --git a/tests/auto/test.pl b/tests/auto/test.pl
new file mode 100755
index 0000000000..f2a1fe43d2
--- /dev/null
+++ b/tests/auto/test.pl
@@ -0,0 +1,191 @@
+#!/usr/bin/perl
+use strict;
+use Cwd;
+
+# Usage: test.pl <SearchPath> <ExecutionMode> <TestResults> <Timeout [Default 300 seconds]>
+# Variable declarations to keep strict happy
+our $SEARCH_PATH;
+our $EXEC_MODE;
+our $EXE_PREFIX;
+our $EXE_SUFFIX;
+our $TIMEOUT;
+our $REPORTDIR;
+our $buryChildren;
+our $timeoutChildren;
+our $totalExecuted;
+our $totalStarted;
+our $totalTimedOut;
+our $next;
+our $currentDirectory;
+
+# Where do we run this script? What directory?
+$SEARCH_PATH=$ARGV[0];
+if(!$SEARCH_PATH)
+{
+ print "Please specify the search directory! \n";
+ exit(0);
+}
+
+# We have four options:
+# 'U': Unix
+# 'W': Windows
+# 'M': Mac
+# 'E': Embedded
+$EXEC_MODE=$ARGV[1];
+if($EXEC_MODE =~ /^U$/)
+{
+ print "Using Unix execution mode\n";
+ $EXE_PREFIX="./";
+ $EXE_SUFFIX="";
+} elsif($EXEC_MODE =~ /^W$/)
+{
+ print "Using Windows execution mode\n";
+ $EXE_PREFIX="";
+ $EXE_SUFFIX=".exe";
+} elsif($EXEC_MODE =~ /^M$/)
+{
+ print "Using OSX execution mode\n";
+ $EXE_PREFIX="/Content/MacOS/";
+ $EXE_SUFFIX="";
+} elsif($EXEC_MODE =~ /^E$/)
+{
+ print "Using embedded execution mode\n";
+ $EXE_PREFIX="./";
+ $EXE_SUFFIX="";
+} else {
+ print "Unknown execution mode: $EXEC_MODE \n";
+ print "Use: 'U' (Unix), 'W' (Windows), 'M' (MacOSX)\n";
+ exit(0);
+}
+# We get the current directory, we 'll need it afterwards
+$currentDirectory = getcwd();
+
+# We assume that by default goes to "reports" unless the user specifies it.
+$REPORTDIR = $ARGV[2];
+if(!$REPORTDIR)
+{
+ if($SEARCH_PATH =~ /^\.$/)
+ {
+# '.' ie current directory
+ $REPORTDIR = $currentDirectory."/reports";
+ } elsif($SEARCH_PATH =~ /^\//) {
+# Absolute path
+ $REPORTDIR = $SEARCH_PATH."/reports";
+ } else {
+# Relative path
+ $REPORTDIR = $currentDirectory.$SEARCH_PATH."/reports";
+ }
+}
+# Let's create the directory
+mkdir $REPORTDIR;
+
+# If given we use it, otherwise we default to 300 seconds.
+$TIMEOUT = $ARGV[3];
+if(!$TIMEOUT)
+{
+ $TIMEOUT=300;
+}
+print "Timeout value: $TIMEOUT\n";
+
+# Initialize 'global' variables
+$buryChildren = 0;
+$timeoutChildren = 0;
+$totalExecuted = 0;
+$totalStarted = 0;
+$totalTimedOut = 0;
+
+# Install signal handlers and pray for the best
+$SIG{'CHLD'} = 'handleDeath';
+$SIG{'ALRM'} = 'handleTimeout';
+
+while ($next = <$SEARCH_PATH/*>)
+{
+ if( -d $next )
+ {
+ print "Examining $next \n";
+ chdir($next) || die("Could not chdir to $next");
+ my @components;
+ my $command;
+ @components = split(/\//, $next);
+ if($EXEC_MODE =~ /^M$/)
+ {
+ $command = "tst_".$components[1].".app";
+ } else {
+ $command = "tst_".$components[1];
+ }
+ if( -e $command)
+ {
+ print "Executing $command \n";
+ my $myPid;
+ $myPid = fork();
+ if($myPid == 0)
+ {
+ my $realCommand;
+ if($EXEC_MODE =~/^M$/)
+ {
+ $realCommand = "./".$command.".app".$EXE_PREFIX.$command;
+ } else {
+ $realCommand = $EXE_PREFIX.$command.$EXE_SUFFIX;
+ }
+ my $outputRedirection = $REPORTDIR."/".$command.".xml";
+ if($EXEC_MODE =~ /^E$/)
+ {
+ exec($realCommand, "-qws", "-xml", "-o", $outputRedirection);
+ } else {
+ exec($realCommand, "-xml", "-o", $outputRedirection);
+ }
+ exit(0);
+ } elsif($myPid > 0 )
+ {
+ $totalStarted++;
+ alarm($TIMEOUT);
+ while(!$buryChildren && !$timeoutChildren)
+ {
+ sleep 10;
+ }
+ if($buryChildren)
+ {
+ my $value;
+ $value = waitpid($myPid , 0);
+ $buryChildren = 0;
+ $totalExecuted++;
+ } elsif($timeoutChildren)
+ {
+ kill 'INT', $myPid;
+ $timeoutChildren = 0;
+ $totalTimedOut++;
+ } else {
+ # What?? If we get here we need to abort, this is totally unexpected
+ print "Wrong condition evaluated, aborting to avoid damages\n";
+ exit(0);
+ }
+ # We need to handle children killed because of timeout
+ if($buryChildren)
+ {
+ my $value;
+ $value = waitpid($myPid , 0);
+ $buryChildren = 0;
+ }
+ } else {
+ print "Problems trying to execute $command";
+ }
+ }
+ }
+ chdir($currentDirectory);
+
+}
+print " ** Statistics ** \n";
+print " Tests started: $totalStarted \n";
+print " Tests executed: $totalExecuted \n";
+print " Tests timed out: $totalTimedOut \n";
+
+# This procedure takes care of handling death children on due time
+sub handleDeath {
+ $buryChildren = 1;
+}
+
+# This takes care of timeouts
+sub handleTimeout {
+ $timeoutChildren = 1;
+}
+