qt5base-lts/tests/auto/test.pl
Jani Heikkinen f776595cc1 Updated license headers
From Qt 5.7 -> tools & applications are lisenced under GPL v3 with some
exceptions, see
http://blog.qt.io/blog/2016/01/13/new-agreement-with-the-kde-free-qt-foundation/

Updated license headers to use new GPL-EXCEPT header instead of LGPL21 one
(in those files which will be under GPL 3 with exceptions)

Change-Id: I42a473ddc97101492a60b9287d90979d9eb35ae1
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
2016-01-21 18:55:18 +00:00

224 lines
6.2 KiB
Perl
Executable File

#!/usr/bin/env perl
#############################################################################
##
## Copyright (C) 2016 The Qt Company Ltd.
## Contact: https://www.qt.io/licensing/
##
## This file is part of the test suite of the Qt Toolkit.
##
## $QT_BEGIN_LICENSE:GPL-EXCEPT$
## Commercial License Usage
## Licensees holding valid commercial Qt licenses may use this file in
## accordance with the commercial license agreement provided with the
## Software or, alternatively, in accordance with the terms contained in
## a written agreement between you and The Qt Company. For licensing terms
## and conditions see https://www.qt.io/terms-conditions. For further
## information use the contact form at https://www.qt.io/contact-us.
##
## GNU General Public License Usage
## Alternatively, this file may be used under the terms of the GNU
## General Public License version 3 as published by the Free Software
## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
## included in the packaging of this file. Please review the following
## information to ensure the GNU General Public License requirements will
## be met: https://www.gnu.org/licenses/gpl-3.0.html.
##
## $QT_END_LICENSE$
##
#############################################################################
use strict;
use Cwd;
use warnings;
# 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 $currentDirectory;
our $testRoot;
# 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="/Contents/MacOS/";
$EXE_SUFFIX=".app";
} 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();
$testRoot = Cwd::abs_path($SEARCH_PATH);
# We assume that by default goes to "reports" unless the user specifies it.
$REPORTDIR = $ARGV[2];
if(!$REPORTDIR)
{
$REPORTDIR = $testRoot."/reports";
mkdir $REPORTDIR;
} else {
mkdir $REPORTDIR;
$REPORTDIR = Cwd::abs_path($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';
handleDir($testRoot);
print " ** Statistics ** \n";
print " Tests started: $totalStarted \n";
print " Tests executed: $totalExecuted \n";
print " Tests timed out: $totalTimedOut \n";
sub handleDir {
my ($dir) = @_;
my $currentDir = getcwd();
opendir(DIR, $dir);
my @files = readdir(DIR);
closedir DIR;
my $file;
foreach $file (@files) {
#skip hidden files
next if (substr($file,0,1) eq ".");
if ( -d $dir."/".$file) {
handleDir($dir."/".$file)
} elsif ( $file =~ /^tst_/ and -x $dir."/".$file ) {
chdir($dir) || die("Could not chdir to $dir");
executeTestCurrentDir($file);
chdir($currentDir);
}
}
}
sub executeTestCurrentDir {
my ($command) = @_;
print "Executing $command \n";
my $myPid;
$myPid = fork();
if($myPid == 0)
{
my $realCommand;
if($EXEC_MODE =~/^M$/)
{
$realCommand = "./".$command.$EXE_SUFFIX.$EXE_PREFIX.$command;
} else {
$realCommand = $EXE_PREFIX.$command.$EXE_SUFFIX;
}
my $outputRedirection = $REPORTDIR."/".$command.$EXE_SUFFIX.".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";
}
}
# This procedure takes care of handling dead children on due time
sub handleDeath {
$buryChildren = 1;
}
# This takes care of timeouts
sub handleTimeout {
$timeoutChildren = 1;
}