# 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 "Symbian Foundation License v1.0"# which accompanies this distribution, and is available# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".## Initial Contributors:# Nokia Corporation - initial contribution.## Contributors:## Description:# SmokeTestSuite.pm # 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 -wpackage SmokeTest;use SmokeTestROM;use SmokeTestSuite;use FindBin;use lib "$FindBin::Bin\\..\\..\\..\\..\\os\\buildtools\\bldsystemtools\\commonbldutils\\GenResult\\";use FileRead; #Need to include a Findbin::pathuse strict;## Global Variables#our $BuildDir = $ENV{'BuildDir'}; # usually M:our $serverpool = $ENV{'SmokeTestServerPool'};our $buildNo = $ENV{'BuildShortName'}; # Eg. 9.1# The Client is run from the dir where SmokeTestClient.pl is located# This is to ensure that any ROMs and test packages created are stored there.our $sourceDir = "$BuildDir\\src\\common\\testtools";our $TestSuite = "SmokeTest";our $SmokeTestDir;our $NandDir;our $TestDriverLocation = "\\epoc32\\tools\\TDEP"; # location for TD zipsour $TestDriverDrive = "M:";our $TestDriverCmd = "$TestDriverDrive\\testdriver\\testdriver.cmd";our $TestDriverXML;# Publish detailsour $PublishServer = $ENV{'PublishLocation'};our $ProductType = $ENV{'Type'};our $BuildNum = $ENV{'BuildNumber'};our $LogsDir = $ENV{'LogsDir'};# Epocwind.outmy $tempDirLocation = $ENV{'TEMP'};## CheckVars: ensures that the essential environment vars and directories exist#sub CheckVars{ print "\n** Settings **\n"; print "Build Drive = $BuildDir\n"; print "Smoke Test Server Pool = $serverpool\n"; print "Build Product = $buildNo\n"; print "TestDriver Zip Location = $TestDriverLocation\n"; print "TestDriver XML Location = $TestDriverXML\n"; print "TestDriver Source Location = $sourceDir\n"; print "TestDriver Drive = $TestDriverDrive\n"; print "SmokeTest working directory= $SmokeTestDir\n"; print "NAND build directory = $NandDir\n"; print "\n** Publishing Information **\n"; print "Publish server = $PublishServer\n"; print "Product Type = $ProductType\n"; print "Build Number = $BuildNum\n"; DieLog("CheckVars: \"Build Directory\" not defined") if !defined $BuildDir; DieLog("CheckVars: \"Smoke Test Server Pool\" not defined") if !defined $serverpool; DieLog("CheckVars: \"Build Product\" not defined") if !defined $buildNo; DieLog("CheckVars: \"Publish server\" not defined") if !defined $PublishServer; DieLog("CheckVars: \"Product Type\" not defined") if !defined $ProductType; DieLog("CheckVars: \"Build Number\" not defined") if !defined $BuildNum; DieLog("CheckVars: Directory \"SmokeTest working directory\" does not exist") if ! -e $SmokeTestDir; DieLog("CheckVars: Directory \"TestDriver Zip Location\" does not exist") if ! -e $TestDriverLocation;}sub main{ print "\n\n*** START OF SMOKE TEST ***\n\n"; PrintDateTime(); my ($iSourceDir, $iTestSuite, $iProduct, $iServerPool, $iProductType, $iPublishLocation, $iBuildNumber, $iXML, $iUnzip, $iBuildDrive, $iTDDrive) = @_; $TestSuite = $iTestSuite if defined $iTestSuite; $BuildDir = $iBuildDrive if defined $iBuildDrive; $sourceDir = $BuildDir.$iSourceDir if defined $iSourceDir; $buildNo = $iProduct if defined $iProduct; $serverpool = $iServerPool if defined $iServerPool; $ProductType = $iProductType if defined $iProductType; $PublishServer = $iPublishLocation if defined $iPublishLocation; $BuildNum = $iBuildNumber if defined $iBuildNumber; $TestDriverDrive = $iTDDrive if defined $iTDDrive; $SmokeTestDir = "$sourceDir\\$TestSuite"; if (defined $iXML) { $TestDriverXML = $iXML; } else { $TestDriverXML = $SmokeTestDir."\\xml"; } $NandDir = "$BuildDir\\src\\cedar\\generic\\base\\e32\\rombuild"; CheckVars(); # change dir to Smoketest dir chdir "$SmokeTestDir" or DieLog("Can't cd to $SmokeTestDir"); # unzip latest version of TD if (defined $iUnzip) { unpackTestDriver2(); } # configure TD configureTestDriver2(); # # Copy the correct configuration.cfg file # But such source only exists for these products: 8.0a, 8.0b, 8.1a, 8.1b, 9.0, 9.1 # print "\n#\n# Copy the correct configuration.cfg file\n#\n"; ExecCommand("COPY /Y $SmokeTestDir\\Group\\$buildNo\\configuration.cfg $SmokeTestDir\\Group\\configuration.cfg"); #Read in hash of smoketests to be run for each product. my ($iCfgFileLocation) = "$FindBin::Bin\\..\\..\\..\\..\\os\\buildtools\\bldsystemtools\\commonbldutils\\GenResult"; #Read in the smoketest list from a cfg file my $text = &FileRead::file_read ("$iCfgFileLocation\\Product.cfg"); #Search for an entry matching (At the beginning of line there should be 1 or more alphanumberic chars #Followed by a "."(optional to allow codenames) followed by more alphanumberic chars followed by 0 or more spaces then an = then 0 #or more spaces then any amount of chars till the end of the line. #8.1b = EMULATOR_WINSCW ARM4_LUBBOCK ARMV5_LUBBOCK my %iProducts = $text =~ /^\s*(\w+\.?\w+)\s*=\s*(.+)$/mg ; #Get the list of platforms to be smoketested for the product. #Need to turn the hash value into an array using split my @iPlatforms = split (/ /,$iProducts{$buildNo}); #Build and Execute Test package for each platform as read from configuration file and create and zip rom. ProcessPlatforms (@iPlatforms); # # Build Test Package for ROMs # if ($buildNo eq '8.1a' || $buildNo eq '8.1b') { &SmokeTestSuite::BuildAndPackage("ARM4"); } if ($buildNo ne '8.1a') { &SmokeTestSuite::BuildAndPackage("ARMv5"); } # # Find out which server to use # print "\n#\n# Find out which server to use\n#\n"; ProcessPlatformsforSmoketest(@iPlatforms); # # End of Smoke Test # print "\n\n*** END OF SMOKE TEST ***\n\n";}## DieLog: Exits script and inserts a Remark in the build log, which will be picked up by htmlscanlog#sub DieLog{ die "\nREMARK: $_[0]\n $!\n\n\n";}## Build and publish based on entries in the Product.cfg file#sub ProcessPlatforms {my $i = 0;my @temp;my @iPlatforms = @_;foreach my $platform (@iPlatforms) { undef @temp; @temp = split (/_/,$iPlatforms[$i]); $i++; if( $temp[0] eq "EMULATOR") { &SmokeTestSuite::BuildAndPublish("$temp[1]"); CheckPlatsecErrors("$temp[1]"); } else { if(3 == scalar(@temp)) # there are 3 arguments, so this will be a NAND ROM { if((lc($temp[1]) eq "h4hrp") && (lc($temp[2]) eq "nand\(dp\)" )) # H4HRP Demand Paging ROM options is -D_NAND2 { &SmokeTestROM::CreateAndZipROM("$temp[0]", "$temp[1]", "pagedrom", "PlatSec", "$buildNo", "-D_NAND2" ); } elsif((lc($temp[1]) eq "h4hrp") && (lc($temp[2]) eq "nand" )) # H4 options is -D_NAND2 { &SmokeTestROM::CreateAndZipROM("$temp[0]", "$temp[1]", "-DRVCT", "PlatSec", "$buildNo", "-D_NAND2"); } elsif(lc($temp[1]) eq "h2") # H2 options is -D_NAND# H2 option is NAND2 due to CR 0844 (Both H2 and H4 use -D_NAND2) { &SmokeTestROM::CreateAndZipROM("$temp[0]", "$temp[1]", "-DRVCT", "PlatSec", "$buildNo", "-D_NAND2"); } else # Bad option entered { die "SmokeTest::ProcessPlatforms error: invalid board type entered: $temp[1]. Check that Product.cfg is correct.\n"; } } else # This is the NOR ROM. { &SmokeTestROM::CreateAndZipROM("$temp[0]", "$temp[1]", "-DRVCT", "PlatSec", "$buildNo"); } } }}## Build and publish based on entries in the Product.cfg file#sub ProcessPlatformsforSmoketest{my $i = 0;my @temp;my @iPlatforms = @_;foreach my $platform (@iPlatforms) { undef @temp; @temp = split (/_/,$iPlatforms[$i]); $i++; if( $temp[0] eq "EMULATOR") { next; } my $mServ = &SmokeTestSuite::PollServers("$temp[1]"); unless (defined $mServ) { next; } if(3 == scalar(@temp)) { if(lc($temp[2]) eq "nand\(dp\)" ) { &SmokeTestSuite::RunRemote("$temp[0]", "$temp[1]", $mServ, "NAND\(DP\)\\"); } elsif(lc($temp[2]) eq "nand") { &SmokeTestSuite::RunRemote("$temp[0]", "$temp[1]", $mServ, "NAND\\"); } } else { &SmokeTestSuite::RunRemote("$temp[0]", "$temp[1]", $mServ); } }}## Check for platsec errors - checks the epocwind.out on build machine#sub CheckPlatsecErrors{ print "\n"; print "#\n# Check for platsec errors\n#\n"; print "\n"; PrintDateTime(); # open epocwind.out and parse for both errors and warnings open EPOCWIND, "$tempDirLocation\\epocwind.out" or print "\nERROR: Cannot open EPOCWIND.OUT\n"; my @epocWind = <EPOCWIND>; close EPOCWIND; foreach my $tempEW (@epocWind) { if ($tempEW =~ m/(\*PlatSec\* ERROR)(.*)/i) { print "\nERROR: $_[0] - $1$2"; } elsif ($tempEW =~ m/(\*PlatSec\* WARNING)(.*)/i) { print "\nWARNING: $_[0] - $1$2"; } }}## Take TestDriver and unpack into a given location.#sub unpackTestDriver2(){ # # Unzip TestDriver # print "\n#\n# Unzip TestDriver\n#\n"; PrintDateTime(); # first remove the "old" version of test driver print "\n"; ExecCommand("RMDIR $TestDriverDrive\\testdriver\\ /Q /S"); # now unzip the latest version of testdriver which has been synced down ExecCommand("%EPOCROOT%epoc32\\tools\\unzip.exe $TestDriverLocation\\TestDriver2.zip -d $TestDriverDrive\\testdriver\\"); # now copy the latest version of testdriver_new.cmd which has been obtained ExecCommand("COPY \\\\builds01\\devbuilds\\buildteam\\testdriverv2\\testdriver_new.cmd $TestDriverCmd"); # now copy the latest version of logging.properties which has been obtained ExecCommand("COPY \\\\builds01\\devbuilds\\buildteam\\testdriverv2\\logging.properties $TestDriverDrive\\testdriver\\"); # 11-08-08 - additional steps required for SITK1.2 version of TD2 ExecCommand("MKDIR $TestDriverDrive\\testdriver\\eclipse\\links\\"); ExecCommand("COPY \\\\builds01\\devbuilds\\buildteam\\testdriverv2\\testdriver.link $TestDriverDrive\\testdriver\\eclipse\\links\\"); # # Unzip JRE v1.5 # print "\n"; print "#\n# Unzip JRE 1.5 required by TestDriver v2\n#\n"; print "\n"; ExecCommand("%EPOCROOT%epoc32\\tools\\unzip.exe \\\\builds01\\devbuilds\\BuildPCs\\Software\\JDK1.5.0_13\\jre1.5.zip -d $TestDriverDrive\\testdriver\\");}sub configureTestDriver2(){ # # Configure TestDriver # print "\n"; print "#\n# Configure TestDriver\n#\n"; print "\n"; my $localtimes = localtime; PrintDateTime(); ExecCommand("$TestDriverDrive\\testdriver\\testdriver.cmd config -e $BuildDir\\ -x $TestDriverXML -l $TestDriverDrive\\TestDriver\\Results --source $sourceDir -s smoketest -r $TestDriverDrive\\TestDriver\\Repos -c $TestDriverDrive\\TestDriver\\Results"); ExecCommand("$TestDriverDrive\\testdriver\\testdriver.cmd config --commdb overwrite"); ExecCommand("$TestDriverDrive\\testdriver\\testdriver.cmd config --bldclean off"); # platsec for > 9.x only if ($buildNo ne "8.1a" && $buildNo ne "8.1b") { ExecCommand("$TestDriverDrive\\testdriver\\testdriver.cmd config -p ON"); } # Setup commdb for WINSCW smoketest print "\n*** Setup commdb for WINSCW to use WinTAP ***\n"; # export smoketest_commdb.xml to a place that ced.exe can see it ExecCommand("copy $SmokeTestDir\\smoketest_commdb.xml $BuildDir\\epoc32\\WINSCW\\c\\"); ExecCommand("$BuildDir\\epoc32\\release\\WINSCW\\udeb\\ced.exe c:\\smoketest_commdb.xml"); print "\n*** Confirm TestDriver Config ***\n"; ExecCommand("$TestDriverDrive\\testdriver\\testdriver.cmd config"); print "\n";}# ExecCommand## Execute a system command, having first echoed it. Display and return the output of the command.## Input: Command string (without final newline)## Output: Command output (including STDERR) to STDOUT## Return: Command output (including STDERR)#sub ExecCommand{ my $iCmd = shift; print "\n================================================================\n"; print "Command: $iCmd\n"; print "----------------------------------------------------------------\n"; my $iRet = `$iCmd 2>&1`; chomp $iRet; print "Return: $iRet\n"; print "================================================================\n"; return $iRet;}# PrintDateTime## Print to STDOUT, Current Date and Time## Input: none## Output: text to STDOUT#sub PrintDateTime{ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); #### my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = gmtime(time); $year += 1900; $mon += 1; printf "\n*** Current Time: %04d/%02d/%02d %02d:%02d:%02d ***\n", $year,$mon,$mday,$hour,$min,$sec;}1;