# Copyright (c) 2004-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:
# The SmokeTestSuite package contains subroutines that are needed to build a
# testdriver test suite.
# This script was born on 18/04/2005
#
#
#!/usr/bin/perl -w
package SmokeTestSuite;
use strict;
my $servicename;
#
# BuildAndPackage: Used to create a test package for remote execution on the ROM
#
sub BuildAndPackage
{
#
# Build Test Package for $_[0]
#
print "\n#\n# Build Test Package for $_[0]\n#\n";
SmokeTest::PrintDateTime();
my $testbuild = SmokeTest::ExecCommand ("$SmokeTest::TestDriverCmd build -p $_[0] -b udeb -s $SmokeTest::TestSuite");
# now check for results
$testbuild =~ m/fail\:\s(\d+)\s\%/i;
if ( ($testbuild =~ m/\*\*error\:/i) || $1 == 100 )
{
print "\nREMARK: Smoke Test *** Building the Test failed $!\n";
#&SmokeTest::DieLog("Error In Smoke Test: Building the Test failed");
}
else
{
print "\n*** Test Building successful ***\n";
}
SmokeTest::PrintDateTime();
my $testpackage = SmokeTest::ExecCommand ("$SmokeTest::TestDriverCmd package -p $_[0] -b udeb -s $SmokeTest::TestSuite --tp $SmokeTest::SmokeTestDir\\$_[0].tpkg");
print "\n";
if (($testpackage =~ m/\*\*error/i))
{
print "\nREMARK: Smoke Test *** Building the Test Package failed\n\"$1\"\n";
#&SmokeTest::DieLog("Error In Smoke Test: Building the Test Package failed");
}
else
{
print "\n*** Building the Test Package successful ***\n";
}
SmokeTest::PrintDateTime();
}
#
# BuildAndPublish: used to build and test the smoketest test suite on an Emulator
#
sub BuildAndPublish
{
my $runid = 0;
my $buildname;
#
# Build Test Suite for $_[0]
#
print "\n#\n# Build Test Suite for $_[0]\n#\n";
SmokeTest::PrintDateTime();
my $testbuildwinscw = SmokeTest::ExecCommand ("$SmokeTest::TestDriverCmd build -p $_[0] -b udeb -s $SmokeTest::TestSuite");
# now check for results
$testbuildwinscw =~ m/fail\:\s(\d+)\s\%/i;
if ( ($testbuildwinscw =~ m/\*\*error\:/i) || $1 == 100 )
{
print "\nREMARK: Smoke Test *** Building the Test for $_[0] failed $!\n";
#&SmokeTest::DieLog("Error In Smoke Test: Building the Test failed");
}
else
{
print "\n*** Test Build successful ***\n";
}
#
# Run Test Suite for $_[0]
#
print "\n";
print "#\n# Run Test Package for $_[0]\n#\n";
print "\n";
SmokeTest::PrintDateTime();
SmokeTest::ExecCommand ("$SmokeTest::TestDriverCmd run -p $_[0] -b udeb -s $SmokeTest::TestSuite");
SmokeTest::PrintDateTime();
#
# Publish results of emulator onto publish server
#
print "\n";
print "#\n# Publish results of emulator onto publish server\n#\n";
print "\n";
#
# Find the correct directory to publish
#
my $source = "$SmokeTest::TestDriverDrive\\TestDriver\\Results";
if (opendir Results, $source)
{
my @dirArray = readdir(Results);
#print "@results";
# to remove "." and ".." from this list
shift @dirArray;
shift @dirArray;
if (!scalar(@dirArray))
{
print "REMARK: The emulator for $_[0] has an empty $source directory";
return;
}
else
{
print "\nContents of $source = @dirArray\n";
$source .= "\\$dirArray[0]";
# dirArray should always have just the one subdir - 0XXXX_Symbian_OS_vX.X
$buildname = $dirArray[0];
if (opendir tempDir, "$source")
{
# to remove "." and ".." from this list
@dirArray = readdir(tempDir);
shift @dirArray;
shift @dirArray;
print "\nContents of $source = @dirArray\n";
foreach my $directory (@dirArray)
{
if ($directory =~ /(?:$_[0])/i)
{
$source .= "\\$directory";
# added this to remove udeb/xx
if (opendir tempDir, "$source")
{
# to remove "." and ".." from this list
@dirArray = readdir(tempDir);
shift @dirArray;
shift @dirArray;
print "\nContents of $source = @dirArray\n";
foreach my $directory (@dirArray)
{
if ($directory =~ /(udeb|urel)/i)
{
$source .= "\\$directory";
if (opendir tempDir, "$source")
{
# to remove "." and ".." from this list
@dirArray = readdir(tempDir);
shift @dirArray;
shift @dirArray;
print "\nContents of $source = @dirArray\n";
my @iNumericDirList = ();
foreach my $directory (@dirArray)
{
if ($directory =~ /(^[0-9]+)/i)
{
push @iNumericDirList, $directory;
}
}
@iNumericDirList = sort { $b <=> $a } @iNumericDirList;
$runid = $iNumericDirList[0];
$source .= "\\$runid";
last;
}
last;
}
}
}
}
}
print "\nThe final source directory = $source\n";
}
else
{
print "REMARK: The emulator for $_[0] has an empty $source directory";
return;
}
}
my $emulatorpublish = "$SmokeTest::PublishServer\\$SmokeTest::ProductType\\$SmokeTest::BuildNum\\logs\\SmokeTest\\Emulator\\$_[0]";
SmokeTest::ExecCommand ("MKDIR $emulatorpublish"); # or GoNext("$publishlocation\\$name\\");
SmokeTest::ExecCommand ("XCOPY /C /Y /E $source\\xml $emulatorpublish\\xml\\");
#
# Copy runXX_<snapshot>_SymbianOS_vYY.xml/html to <snapshot>_Symbian_OS_vYY.xml/html
#
my $xmlfile = "$source\\run".$runid."_".$buildname."\.xml";
my $htmlfile = "$source\\run".$runid."_".$buildname."\.html";
if (-e $xmlfile)
{
SmokeTest::ExecCommand ("COPY $xmlfile $emulatorpublish\\$buildname.xml");
}
if (-e $htmlfile)
{
SmokeTest::ExecCommand ("COPY $htmlfile $emulatorpublish\\$buildname.html");
}
#
# Publish results of emulator onto logs dir
#
print "\n";
print "#\n# Publish results of emulator onto Logs Dir\n#\n";
print "\n";
my $emulatorpublish = "$SmokeTest::LogsDir\\SmokeTest\\Emulator\\$_[0]\\";
SmokeTest::ExecCommand ("MKDIR $emulatorpublish"); # or GoNext("$publishlocation\\$name\\");
SmokeTest::ExecCommand ("XCOPY /C /Y /E $source $emulatorpublish");
}
else
{
print "REMARK: Cannot open dir $source: $!";
return;
}
SmokeTest::PrintDateTime();
}
#
# PollServers: Polls all the servers from the Pool and picks out the one with the shortest queue.
#
sub PollServers
{
#
# Parse ENV and create an array of smoketest servers for $_[0]
#
print "\n";
print "#\n# Parse ENV and create an array of smoketest servers for $_[0]\n#\n";
print "\n";
SmokeTest::PrintDateTime();
if (($_[0] eq "Lubbock") || ($_[0] eq "LUBBOCK"))
{
$SmokeTest::servicename = "RemoteTestDriverLubbock";
}
elsif ($_[0] eq "H2")
{
$SmokeTest::servicename = "RemoteTestDriverH2";
}
elsif ($_[0] eq "H4HRP")
{
$SmokeTest::servicename = "RemoteTestDriverH4HRP";
}
else
{
&SmokeTest::DieLog("Cannot poll serverpool for pool \"$_[0]\"");
}
my @servers = split /\#/, $SmokeTest::serverpool;
if (@servers < 1)
{
&SmokeTest::DieLog("*** Error In Smoke Test ***\nNo SmokeTest Servers specified for $_[0]$!\n");
}
else
{
print "\n*** Retrieved Pool of Smoke Test Servers from ENV for $_[0]***\n";
}
#
# Poll each of the smoke test servers and parse the results
#
print "\n";
print "#\n# Poll each of the smoke test servers and parse the results\n#\n";
print "\n";
my %serverlist;
print "Checking TestDriver Version\n";
SmokeTest::ExecCommand ("$SmokeTest::TestDriverCmd version");
foreach my $server (@servers)
{
print "Polling Server: $server\n";
my $masterstatus = SmokeTest::ExecCommand ("$SmokeTest::TestDriverCmd masterstatus --srv //$server/$SmokeTest::servicename");
my $value = -2;
if ($masterstatus =~ m/Master: TestDriver is currently (....)/i)
{
if ($1 eq 'free')
{
#print "Free!\n";
$value = 0;
}
else
{
$masterstatus =~ m/are\s+(\w+)\s+jobs/i;
if ($1 =~ m/\D+/)
{
$value = 1;
}
else
{
$value = $1 + 1;
}
}
}
else
{
# The master is not running a service
$value = -1;
}
$serverlist{$server} = $value;
print "\n";
}
#
# Decide which server to use
#
print "\n";
print "#\n# STEP8 Decide which server to use\n#\n";
print "\n";
my $masterserver;
# Loop through first time only to print out all the available servers
print "\nAvailable Servers\n";
foreach my $servername (sort { $serverlist{$a} <=> $serverlist{$b} } keys %serverlist)
{
print "\n$servername : number in queue are $serverlist{$servername}\n";
}
# Loop through second time to actually select the correct server
foreach my $servername (sort { $serverlist{$a} <=> $serverlist{$b} } keys %serverlist)
{
if ($serverlist{$servername} > -1)
{
$masterserver = $servername;
last;
}
}
if (defined $masterserver)
{
print "\n*** The Smoke Test Server to be used for $_[0] is $masterserver ***\n";
}
else
{
print "\nREMARK: Smoke Test *** No available Smoke Test Servers for $_[0] \n";
#&SmokeTest::DieLog("Error In Smoke Test: No available Smoke Test Servers for $_[0]");
}
SmokeTest::PrintDateTime();
return $masterserver;
}
#
# Usage: RunRemote(Architecture, Testing Board, Server)
#
sub RunRemote
{
my $masterserver = $_[2];
#
# Call TestDriver runremote for $_[0]
#
print "\n";
print "#\n# Call TestDriver runremote for $_[0]\n#\n";
print "\n";
SmokeTest::PrintDateTime();
my $tempZipLocation = "$SmokeTest::SmokeTestDir\\$_[0]\\$_[1]";
if ($_[3] eq "NAND\\")
{
$tempZipLocation .= "\\NAND";
}
elsif ($_[3] eq "NAND\(DP\)\\")
{
$tempZipLocation .= "\\NAND\(DP\)";
}
SmokeTest::ExecCommand ("COPY /Y $tempZipLocation\\sys\$rom.zip $SmokeTest::SmokeTestDir\\sys\$rom.zip");
# Decide whether this is a platsec ROM or not
my $platsec;
if ($SmokeTest::buildNo eq "9.1" || $SmokeTest::buildNo eq "9.2" || $SmokeTest::buildNo eq "9.3" || $SmokeTest::buildNo eq "Future" || $SmokeTest::buildNo eq "9.4" || $SmokeTest::buildNo eq "9.5" || $SmokeTest::buildNo eq "9.6" || $SmokeTest::buildNo eq "tb91")
{
$platsec = "ON";
}
else
{
$platsec = "OFF";
}
# calling testdriver for $_[0]
my $runremote = SmokeTest::ExecCommand ("$SmokeTest::TestDriverCmd runremote -m async -i $SmokeTest::SmokeTestDir --tp $_[0].tpkg -r sys\$rom.zip --srv //$masterserver/$SmokeTest::servicename --platsec $platsec --testexec ON");
#
# Parse output to get the job number or error
#
print "\n";
print "#\n# Parse output to get the job number or error\n#\n";
print "\n";
my $jobid;
if ($runremote =~ m/job id/i)
{
$runremote =~ m/job id: (\d+)/i;
$jobid = $1;
print "\n*** Job submitted successfully ***\n\nJob Id = $jobid\n";
}
else
{
print "\nREMARK: Smoke Test Job Submission failed\n";
#&SmokeTest::DieLog("Error In Smoke Test: Submitting the Job failed");
return;
}
#
# Create a text file with publish details
#
print "\n";
print "#\n# Create a text file with publish details\n#\n";
print "\n";
my $publishstring;
$publishstring = "Publish: $SmokeTest::PublishServer\\$SmokeTest::ProductType\\$SmokeTest::BuildNum\\logs\\Smoketest\\$_[0]\\$_[1]\\";
print "$publishstring";
if ( (defined $SmokeTest::PublishServer) && (defined $SmokeTest::ProductType) && (defined $SmokeTest::BuildNum) )
{
open PublishFile, ">$_[0]$_[1].txt" or &SmokeTest::DieLog("Cannot open File $_[0]$_[1].txt: $!\n");
$publishstring = "$SmokeTest::PublishServer\\$SmokeTest::ProductType\\$SmokeTest::BuildNum\\logs\\Smoketest\\$_[0]\\$_[1]\\";
if ($_[3] eq "NAND\\")
{
$publishstring .= "NAND\\";
}
elsif ($_[3] eq "NAND\(DP\)\\")
{
$publishstring .= "NAND\(DP\)\\";
}
print PublishFile "$publishstring";
$publishstring = "\n$SmokeTest::PublishServer\\$SmokeTest::ProductType\\logs\\$SmokeTest::BuildNum\\Smoketest\\$_[0]\\$_[1]\\";
if ($_[3] eq "NAND\\")
{
$publishstring .= "NAND\\";
}
elsif ($_[3] eq "NAND\(DP\)\\")
{
$publishstring .= "NAND\(DP\)\\";
}
print PublishFile "$publishstring";
close PublishFile;
print "\n*** Publish file created successfully ***\n";
}
else
{
print "\nREMARK: Smoke Test *** Could not Create Publish File\n$!";
#&SmokeTest::DieLog("Error In Smoke Test: Could not Create Publish File");
}
#
# Copy This publish file to the correct directory
#
print "\n";
print "#\n# Copy This publish file to the correct directory \n#\n";
print "\n";
###print "\nabout to move /Y $_[0]$_[1].txt \\\\$masterserver\\Jobs\\$jobid\\publish.txt\n";
SmokeTest::ExecCommand ("MOVE /Y $_[0]$_[1].txt \\\\$masterserver\\Jobs\\$jobid\\publish.txt");
SmokeTest::PrintDateTime();
}
1;