diff -r 000000000000 -r 1918ee327afb tests/auto/test.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/test.pl Mon Jan 11 14:00:40 2010 +0000 @@ -0,0 +1,232 @@ +#!/usr/bin/env perl +############################################################################# +## +## Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +## All rights reserved. +## Contact: Nokia Corporation (qt-info@nokia.com) +## +## This file is part of the test suite of the Qt Toolkit. +## +## $QT_BEGIN_LICENSE:LGPL$ +## No Commercial Usage +## This file contains pre-release code and may not be distributed. +## You may use this file in accordance with the terms and conditions +## contained in the Technology Preview License Agreement accompanying +## this package. +## +## GNU Lesser General Public License Usage +## Alternatively, this file may be used under the terms of the GNU Lesser +## General Public License version 2.1 as published by the Free Software +## Foundation and appearing in the file LICENSE.LGPL included in the +## packaging of this file. Please review the following information to +## ensure the GNU Lesser General Public License version 2.1 requirements +## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +## +## In addition, as a special exception, Nokia gives you certain additional +## rights. These rights are described in the Nokia Qt LGPL Exception +## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +## +## If you have questions regarding the use of this file, please contact +## Nokia at qt-info@nokia.com. +## +## +## +## +## +## +## +## +## $QT_END_LICENSE$ +## +############################################################################# + +use strict; +use Cwd; + +# Usage: test.pl +# 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 dead children on due time +sub handleDeath { + $buryChildren = 1; +} + +# This takes care of timeouts +sub handleTimeout { + $timeoutChildren = 1; +} +