#!/usr/bin/env perl################################################################################# Copyright (C) 2010 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 <SearchPath> <ExecutionMode> <TestResults> <Timeout [Default 300 seconds]># Variable declarations to keep strict happyour $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 directorymkdir $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 timesub handleDeath { $buryChildren = 1;}# This takes care of timeoutssub handleTimeout { $timeoutChildren = 1;}