cryptomgmtlibs/securitytestfw/test/autotesting/RunSecurityTests.pl
changeset 8 35751d3474b7
parent 0 2c201484c85f
--- a/cryptomgmtlibs/securitytestfw/test/autotesting/RunSecurityTests.pl	Tue Jul 21 01:04:32 2009 +0100
+++ b/cryptomgmtlibs/securitytestfw/test/autotesting/RunSecurityTests.pl	Thu Sep 10 14:01:51 2009 +0300
@@ -1,882 +1,882 @@
-#
-# Copyright (c) 2005-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: 
-#
-
-use strict;
-
-##################################################################################
-# These variables can be customised as required
-# define some global variables - customise as required
-my $REPORTDIR;
-my $MAINLINEZIPDIR;
-my $RELSUBSYSROOT;
-my $TECHVIEWROOT;
-
-# set variables which can be set from the environment. If no environment
-# equivalent is found, it will set to the default
-SetVariable(\$REPORTDIR, "REPORTDIR", "L:\\AutoSecTests");
-SetVariable(\$MAINLINEZIPDIR, "MAINLINEZIPDIR", "\\\\builds01\\Master");
-SetVariable(\$RELSUBSYSROOT, "RELSUBSYSROOT", "security");
-
-# To include Techview in build set environment variable:
-# TECHVIEWROOT=Techview
-SetVariable(\$TECHVIEWROOT, "TECHVIEWROOT", "");
-
-# host platforms define which platforms are to be built and tests to run. Target
-# platforms are those where roms are build
-my @HOSTPLATFORMS = ("wins", "winscw");
-my @TARGETPLATFORMS = ("arm4", "thumb");
-my @ROMPLATFORMS = ("lubbock", "assabet");
-my @BUILDTYPES = ("udeb", "urel");
-#
-# END of customisable variables
-####################################################################################
-
-my $P4CLIENTNAME = ConfigureDefaultClient();
-my $TESTCONFIGFILE;
-my $SUBSYSTEMROOT;
-# beech or cedar 
-my $BUILDPLATFORM; 
-
-# first get the date
-my @DATEARRAY = split(/[ \/]/, `date /t`);
-
-# command line arguments
-my %ARGS = ();
-
-# Parse command line parameters
-ProcessCommandLine();
-
-# now, DATEARRAY[0] will be day, 1 will be date of month, 2 will be month, 3 is year
-my $RESULTDIR = "$REPORTDIR\\$DATEARRAY[3]$DATEARRAY[2]$DATEARRAY[1]";
-
-# define the file where the config.txt file is post-processed
-my $POSTPROCESSED = "$RESULTDIR\\postprocessed.txt";
-
-# create a new directory for today
-system("mkdir \"$RESULTDIR\"");
-
-# create a logfile and error file
-open  (LOGFILE, "> $RESULTDIR\\log.txt") || die "error opening for writing";
-open  (ERRFILE, "> $RESULTDIR\\error.txt") || die "error opening for writing";
-
-# Derive rootdrive from perforce client. Set up variables
-# which required the root drive to be configured. Note that
-# the test config file is only overwritten if not configured by
-# the command line. By default it looks for config.txt in the current
-# directory
-my $ROOTDRIVE = "L:";
-GetRootDrive();
-if (!$TESTCONFIGFILE)
-{
-	use Cwd;
-	my $dir = cwd();
-	$TESTCONFIGFILE = "$dir\\config.txt";
-}
-if (!$SUBSYSTEMROOT)
-{ 
-	$SUBSYSTEMROOT = "$ROOTDRIVE\\$RELSUBSYSROOT";
-}
-
-if ($TECHVIEWROOT)
-{
-	$TECHVIEWROOT = "$ROOTDRIVE\\$TECHVIEWROOT";
-}
-
-# epoc root directory
-my $EPOCROOT = "$ROOTDRIVE\\epoc32";
-
-# add techview to build if requested
-my @BUILDDIRS = "";
-if ( $TECHVIEWROOT )
-{
-	@BUILDDIRS = ( $SUBSYSTEMROOT, "$TECHVIEWROOT\\toolkit\\startup\\group", "$TECHVIEWROOT\\apps\\appinstui\\group", "$TECHVIEWROOT\\apps\\secui\\group");
-}
-else
-{
-	@BUILDDIRS = ( $SUBSYSTEMROOT );
-}
-
-print "BUILDIRS = @BUILDDIRS\n";
-
-# call main
-main();
-
-# main function 
-sub main()
-{
-	print "REPORTDIR = $REPORTDIR\n";
-	print "MAINLINEZIPDIR = $MAINLINEZIPDIR\n";
-	print "SUBSYSTEMROOT = $SUBSYSTEMROOT\n";
-	print "TESTCONFIGFILE = $TESTCONFIGFILE\n";
-	print "TECHVIEWROOT = $TECHVIEWROOT\n";
-	print "BUILDPLATFORM = $BUILDPLATFORM\n";
-
-	# Figure out the second-latest release if none had been specified on the
-	# command line - we do not want the latest in case it has not yet been released. 
-	my $releasedir = "";
-	my $platformsuffix = "";
-	if ($BUILDPLATFORM)
-	{
-		$platformsuffix = "_$BUILDPLATFORM";
-	}
-
-	if (!$ARGS{"mainline"})
-	{
-		my $filelist = `dir $MAINLINEZIPDIR\\0????$platformsuffix /ad /b | sort /r`;
-		my @filearray = split "\n", $filelist;
-		$releasedir = $filearray[1];
-	}
-	else
-	{
-		$releasedir = "$ARGS{\"mainline\"}$platformsuffix";
-	}
-
-	# Display what's to be done
-	ReportToFiles("------ Script run on $DATEARRAY[1]/$DATEARRAY[2]/$DATEARRAY[3] with the following options\n");
-	ReportToFiles("------       Report directory: $REPORTDIR\n");
-	ReportToFiles("------       Subsystem root: $SUBSYSTEMROOT\n");
-	ReportToFiles("------       Test config file: $TESTCONFIGFILE\n");
-	ReportToFiles("------       Built against MCL platform: $BUILDPLATFORM\n");
-	if ($ARGS{s}) { ReportToFiles("------      Perforce synchronisation using client spec \"$P4CLIENTNAME\" on drive \"$ROOTDRIVE\"\n"); }
-	if ($ARGS{u}) { ReportToFiles("------      Mainline unzip using build $releasedir\n"); }
-	if ($ARGS{b}) { ReportToFiles("------      Build of production and test code\n"); }
-	if ($ARGS{t}) { ReportToFiles("------      Running of test code on the host using $TESTCONFIGFILE\n"); }
-	if ($ARGS{f}) { ReportToFiles("------      Build rom first\n"); }
-	if ($ARGS{t}) { ReportToFiles("------      Running of test code on the host using $TESTCONFIGFILE\n"); }
-
-	if ($ARGS{r}) 
-	{ 
-		ReportToFiles("------      Building of target roms: "); 
-		map { ReportToFiles("$_ "); } @ROMPLATFORMS;
-		ReportToFiles("\n");
-	}
-	ReportToFiles("------      Host builds used: ");
-	map { ReportToFiles("$_ "); } @HOSTPLATFORMS;
-	ReportToFiles("\n------      Target processor builds used: ");
-	map { ReportToFiles("$_ "); } @TARGETPLATFORMS;
-	ReportToFiles("\n------      Build types used: ");
-	map { ReportToFiles("$_ "); } @BUILDTYPES;
-	ReportToFiles("\n\n");
-
-	# Do a perforce sync
-	if ($ARGS{s})
-	{
-		DoPerforceSync();
-	}
-
-	# Now unzip the mainline
-	if ($ARGS{u})
-	{
-		DoMainlineUnzip($releasedir);
-	}
-
-	# Build the post-processed config file if the test flag is on
-	if ($ARGS{t})
-	{
-		ParseTestConfigFile();
-	}
-
-    # Build the tools
-	if ($ARGS{o})
-	{
-		foreach my $bt (@BUILDTYPES)
-		{
-			DoBuildTools($bt);
-		}
-	}
-
-	# Build rom first?
-	if ( $ARGS{f} ) 
-	{
-		# Now build the target platforms - no testing required
-		if ($ARGS{b})
-		{
-			foreach my $platform (@TARGETPLATFORMS)
-			{
-				foreach my $bt (@BUILDTYPES)
-				{
-					# Must build dummy midp2installerclient for cedar
-					if ( $BUILDPLATFORM eq "cedar" )
-					{
-						my @tempbuilddirs = @BUILDDIRS;
-						@BUILDDIRS = ("$SUBSYSTEMROOT\\appinst\\tsrc");
-						print "Building dummy midp2installerclient....on $platform/$bt\n";
-						DoBuild($platform, $bt);
-						# now build the rest
-						@BUILDDIRS = @tempbuilddirs;
-					}
-					DoBuild($platform, $bt);
-				}
-			}	
-		}
-		# Now build the roms if required
-		if ($ARGS{r})
-		{
-			DoBuildRoms();
-		}
-	}
-
-	# Build and test host platforms. They get built and then tested in order.
-	# This is required as the EPOC C drive is shared between udeb and urel.
-	# If the build/test is run together as a set, then the state of the C
-	# drive will be restored
-	foreach my $platform (@HOSTPLATFORMS)
-	{
-		foreach my $bt (@BUILDTYPES)
-		{
-			if ($ARGS{b})
-			{
-				DoBuild($platform, $bt);
-			}
-			if ($ARGS{t})
-			{
-				DoRunTests($platform, $bt);
-			}
-		}
-	}
-
-	# Now build the target platforms (unless this has been done in advance) - no testing required
-	if ( !$ARGS{f} ) 
-	{
-		if ($ARGS{b})
-		{
-			foreach my $platform (@TARGETPLATFORMS)
-			{
-				foreach my $bt (@BUILDTYPES)
-				{
-					# Must build dummy midp2installerclient for cedar
-					if ( $BUILDPLATFORM eq "cedar" )
-					{
-						my @tempbuilddirs = @BUILDDIRS;
-						@BUILDDIRS = ("$SUBSYSTEMROOT\\appinst\\tsrc");
-						print "Building dummy midp2installerclient....on $platform/$bt\n";
-						DoBuild($platform, $bt);
-						# now build the rest
-						@BUILDDIRS = @tempbuilddirs;
-					}
-					DoBuild($platform, $bt);
-				}
-			}	
-		}
-		# Now build the roms if required
-		if ($ARGS{r})
-		{
-			DoBuildRoms();
-		}
-	}
-
-	my $timeoutput = `time /t`;
-	ReportToFiles("\n------------------- Job finished at $timeoutput\n\n");
-
-}
-sub ConfigureDefaultClient
-{
-	# this subroutine figures out what default perforce client to use
-	my $clientoutput = `p4 client -o`;
-
-	if ($clientoutput =~ /\nClient:\s*([^\s]*)/ )
-	{
-		return $1;
-	}
-}
-
-sub GetRootDrive
-{
-	# this subroutine derives the rootdrive from the perforce client
-	my $clientoutput = `p4 client -o`;
-
-	if ($clientoutput =~ /\nRoot:\s*(.):/ )
-	{
-		$ROOTDRIVE = "$1:"
-	}
-}
-
-sub ProcessCommandLine
-{
-	use Getopt::Long;
-	&GetOptions (\%ARGS, "a", "h", "s", "u", "b", "t", "r", "o", "f", "client=s", "configfile=s", "workdir=s", "mainline=s", "subsystemroot=s", "nohost", "notgt", "platform=s", @HOSTPLATFORMS, @TARGETPLATFORMS, @ROMPLATFORMS, @BUILDTYPES);
-
-	# if the -a option is specified, this means that sync, unzip, build, run
-	# tests, and rom options should be set
-	if ($ARGS{a})
-	{
-		$ARGS{o} = $ARGS{s} = $ARGS{u} = $ARGS{b} = $ARGS{t} = $ARGS{r} = $ARGS{a};
-	}
-
-	# if the help option is specified, or none of the other arguments are specified,
-	# or both beech and cedar requested, then display the help
-	if ($ARGS{h} || (!$ARGS{s} && !$ARGS{u} && !$ARGS{b} && !$ARGS{t} && !$ARGS{r} && !$ARGS{o}))
-	{
-		print "Command line switches: \n";
-		print "    -s        Do perforce synchronisation\n";
-		print "    -u        Do unzipping from the mainline\n";
-		print "    -b        Build the appropriate targets\n";
-		print "    -t        Run the test suite\n";
-		print "    -r        Build the roms\n";
-        print "    -o        Build the tools\n";
-		print "    -a        Do all of the above\n";
-		print "    -f        Build rom First (before wins winscw)\n";
-		print "    -h        Display this screen\n";
-		print "\nOther options:\n";
-		print "    --wins    Use the wins platform for building and running of host tests\n";
-		print "    --winscw  Use the winscw platform for building and running of host tests\n";
-		print "    --nohost  Do not use any host platform\n";
-		print "    --arm4    Use the arm4 processor for rom building\n";
-		print "    --thumb   Use the thumb processor for rom building\n";
-		print "    --notgt   Do not use any target platform\n";
-		print "    --assabet Build roms for assabet platform\n";
-		print "    --lubbock Build roms for lubbock platform\n";
-		print "    --udeb    Build udeb version only\n";
-		print "    --urel    Build urel version only\n";
-		print "\nParameters:\n";
-		print "    --client=<client>   Specifies the perforce client to use (default: $P4CLIENTNAME)\n";
-		print "    --workdir=<dir>     Specifies the working directory (default: $REPORTDIR)\n";
-		print "    --subsystemroot=<dir> Specifies the root directory to build\n";
-		print "    --configfile=<file> Specifies the test config file\n";
-		print "    --mainline=<release number> Specifies the release number to use\n";
-        print "    --platform=<platform name>  Specifies MCL platform. Default is beech. Set to none for pre MCL builds\n";
-		print "\nExamples:\n";
-		print "    perl -w RunTests.pl -b -t -r --wins --lubbock --thumb --platform=cedar --client=lon-julianl\n\n";
-		print "    Uses drive m, client lon-julianl, build against cedar and builds and runs tests on the wins\n";
-		print "    platform and builds roms for lubbock\n\n";
-		print "    perl -w RunTests.pl -u -b --winscw --urel --notgt --mainline=01038\n\n";
-		print "    Unzips mainline 01038_beech and builds only winscw/urel. Uses default client\n";
-		print "    perl -w RunTests.pl -u -b --winscw --urel --notgt --platform=none --mainline=01038\n\n";
-		print "    Unzips mainline 01038 and builds only winscw/urel. Uses default client\n";
-		exit(0);
-	}
-
-	# Now parse the client, drive, and working directory parameters
-	if ($ARGS{"client"})
-	{
-		$P4CLIENTNAME = $ARGS{"client"};
-		$ENV{"P4CLIENT"} = $P4CLIENTNAME;
-	}
-	if ($ARGS{"configfile"})
-	{
-		$TESTCONFIGFILE = $ARGS{"configfile"};
-	}
-	if ($ARGS{"workdir"})
-	{
-		$REPORTDIR = $ARGS{"workdir"};
-	}
-	if ($ARGS{"subsystemroot"})
-	{
-		$SUBSYSTEMROOT = $ARGS{"subsystemroot"};
-	}
-
-	use Getopt::Long;
-
-	# now parse the host options
-	if ($ARGS{"nohost"})
-	{
-		@HOSTPLATFORMS = ();
-	}
-	else
-	{
-		ParseArguments(\@HOSTPLATFORMS);
-	}
-
-	# now parse the target platforms
-	if ($ARGS{"notgt"})
-	{
-		@TARGETPLATFORMS = ();
-	}
-	else
-	{
-		ParseArguments(\@TARGETPLATFORMS);
-	}
-
-	# now parse the rom platforms and the build types
-	ParseArguments(\@ROMPLATFORMS);
-	ParseArguments(\@BUILDTYPES);
-
-	if ($ARGS{"platform"})
-	{
-		$BUILDPLATFORM=$ARGS{"platform"};
-		if ($BUILDPLATFORM eq "none")
-		{
-			# set compatibity for pre MCL builds
-			$BUILDPLATFORM="";
-		}
-	}
-	else
-	{
-		# default
-		$BUILDPLATFORM="beech"; 
-	}
-}
-
-sub ParseArguments
-{
-	# common parsing of arguments in an array - returns another array
-	# which have the options specified.
-	# If none specified, it returns ALL the options.
-	#
-	# eg. If -wins specified, and options = ("wins", "winscw"), then
-	# return array is just ("wins"). If neither wins or winscw specified,
-	# then returns both
-	(my $options) = @_;
-	my @retoptions = ();
-
-	foreach my $opt (@$options)
-	{
-		if ($ARGS{$opt})
-		{
-			push(@retoptions, $opt);
-		}
-	}
-
-	# change if we have at least one option specified
-	if (scalar(@retoptions) > 0)
-	{
-		@$options = @retoptions;
-	}
-}
-
-# subroutine to do a perforce sync 
-sub DoPerforceSync
-{
-	print "Doing a Perforce synchronisation....\n";
-	ExecAndOutputToLog("p4 sync -f $SUBSYSTEMROOT\\...");
-    if ( $TECHVIEWROOT )
-    {
-        ExecAndOutputToLog("p4 sync -f $TECHVIEWROOT\\...");
-    }
-}
-
-# subroutine to do the unzipping
-sub DoMainlineUnzip
-{
-	my ($dir) = @_;
-	print "Doing an unzip of mainline $MAINLINEZIPDIR\\$dir...\n";
-
-	my @zipfiles = ("techview");
-
-	# firstly, delete anything already there
-	ExecAndOutputToLog("del \/F \/S \/Q $EPOCROOT");
-
-	# unzip all the zipfiles
-	map { ExecAndOutputToLog("t:\\tools\\unzip -o $MAINLINEZIPDIR\\$dir\\zips\\$_.zip -d $ROOTDRIVE\\"); } @zipfiles;
-}
-
-# subrountine to build or clean release or test build
-# call RunAbld("<Directory>", "<Command>", "<Target>", "test" or "")
-sub RunAbld
-{
-	my ($dir, $cmd, $target, $test, $bldtype) = @_;
-	chdir ($dir);
-
-	my $bldcommand = "abld $test $cmd -k $target $bldtype";
-	my $bldoutput = ExecAndOutputToLog($bldcommand);	
-	
-	if ($cmd eq "build")
-	{
-		# match "error:" or "error(s)" or fatal error
-		my @errout = grep(/(error(\(s\)|\:))|fatal error/i,  split("\n", $bldoutput));
-
-		if (scalar(@errout) > 0)
-		{
-			print ERRFILE "-------- Errors found when running $bldcommand\n";
-			map { print ERRFILE "$_\n"; } @errout;
-			print ERRFILE "-------- End of errors for $bldcommand\n\n";
-		}
-	}
-}
-
-# builds the release and test code for a specified platform and mode
-# eg WINS/UDEB
-sub DoBuild
-{
-	my ($platform, $bt) = @_;
-
-	RemoveWatchers($platform, $bt);
-
-	foreach my $bd (@BUILDDIRS)
-	{
-
-		chdir ($bd);
-		system("bldmake bldfiles");
-
-		print "Building build targets.... $bd on $platform/$bt\n";
-		ReportToFiles("\n------------------- Now building $bd on $platform/$bt\n\n");
-
-		RunAbld($bd, "clean", $platform, "", $bt);
-		RunAbld($bd, "clean", $platform, "test", $bt);
-		RunAbld($bd, "build", $platform, "", $bt);
-		RunAbld($bd, "build", $platform, "test", $bt);
-	}
-}
-
-# builds the tools for deb or rel
-sub DoBuildTools
-{
-	my ($bt) = @_;
-
-    #adjust for unicode
-    if ($bt eq "udeb")
-    {
-        $bt = "deb";
-    }
-    if ($bt eq "urel")
-    {
-        $bt = "rel";
-    }
-
-	foreach my $bd (@BUILDDIRS)
-	{
-		chdir ($bd);
-		system("bldmake bldfiles");
-
-		print "Building tools.... $bd on $bt\n";
-		ReportToFiles("\n------------------- Now building $bd for tools on $bt\n\n");
-
-		RunAbld($bd, "clean", "tools", "", $bt);
-		RunAbld($bd, "build", "tools", "", $bt);
-	}
-}
-
-# this subroutine executes the given command and outputs to the log file
-sub ExecAndOutputToLog
-{
-	my ($cmd) = @_;
-	my $timeoutput = `time /t`;
-	my $cmdoutput = `$cmd 2>&1`;
-
-	# capture output to log file
-	print LOGFILE "-------- Output of $cmd run at $timeoutput";
-	if ($cmdoutput) 
-	{
-		print LOGFILE "$cmdoutput\n";
-	}
-	else
-	{
-		print LOGFILE "(NO OUTPUT)\n";
-	}
-
-	if ($? != 0)
-	{
-		print ERRFILE "\n-------- Error code $? returned when executing:\n";
-		print ERRFILE "-------- \"$cmd\".\n";
-
-		if ($cmdoutput)
-		{
-			print ERRFILE "-------- Output:\n";
-			print ERRFILE "$cmdoutput";
-		}
-	}
-	return $cmdoutput;
-}
-
-# this subroutine executes all the tests as specified in the configuration file.
-# It will run the tests for the specified platform/built type
-#
-# The configuration file has the following valid commands:
-# 
-# #include <filename> - includes another config file
-# SYSTEMCMD <command and parameters> - executes a DOS command eg SYSTEMCMD copy a.txt b.txt
-# DOTEST <testname> <scriptname> <logname> ... - executes a test
-# COMP <filea> <fileb> - compares two files and logs result
-#
-# For SYSTEMCMD and COMP, the following variables get substituted
-# - $C - the current EPOC C drive (eg o:\epoc32\wins\c)
-# - $Z - the current EPOC Z drive (eg o:\epoc32\release\wins\udeb\z)
-# - $RELEASE - the epoc release directory for this build (eg o:\epoc32\release\wins\udeb)
-# - $EPOC - the epoc root (eg o:\epoc32)
-# - $ROOT - the root drive (eg o:)
-sub DoRunTests
-{
-	# platform and build type
-	my ($p, $bt) = @_; 
-	print "Running tests on platform $p/$bt\n";
-	ReportToFiles("\n------------------- Now running tests on platform $p/$bt\n\n");
-
-	# set the default directory to be the subsystem root
-	chdir($SUBSYSTEMROOT);
-
-	# Make the results directory
-	my $testlogs = "$RESULTDIR\\testlogs";
-	system("mkdir $testlogs");
-	system("mkdir $testlogs\\$p");
-	system("mkdir $testlogs\\$p\\$bt");
-
-	# open the post processed file
-	open (POSTFILE, "< $POSTPROCESSED") || die "error opening $POSTPROCESSED for reading";
-	# open a separate report file for test results
-	open (TESTREPFILE, "> $RESULTDIR\\testresults.$p.$bt.txt") || die "error opening for writing";
-
-	my $timeoutput = `time /t`;
-	print TESTREPFILE "-------- Test log file when running on platform $p/$bt at $timeoutput";
-
-	my $cdrive = "$EPOCROOT\\$p\\c";
-	while (<POSTFILE>)
-	{
-		my $line = $_;
-
-		# check for a line with SYSTEMCMD <command>
-		if ( $line =~ /^SYSTEMCMD[ ]+(.*)/ )
-		{
-			# Substitute $C for the cdrive, $Z for the zdrive, and $RELEASE
-			# for the release path, etc
-			my $cmd = $1;
-			SubstitutePaths($p, $bt, \$cmd);
-
-			print "  - executing system command: $cmd\n";
-			ExecAndOutputToLog($cmd);
-		}
-		elsif ( $line =~ /^\s*$/ )
-		{
-			# if we have an empty line then do nothing
-		}
-		elsif ( $line =~ /^DOTEST\s+([^\s]+)[\s]+([^\s]+)[\s]+([^\s]+)/ )
-		{
-			# if this pattern matches DOTEST <cmd> <scriptfile> <logfile>,
-			# then we execute this test - extra parameters can be supplied after the logfile
-			print "  - running test: $1 $2 $3\n";
-			ExecAndOutputToLog("$EPOCROOT\\release\\$p\\$bt\\$1 $2 $3 $'");
-
-			# log files are assumed to be stored in \epoc32\wins\c
-			my $outfile = "$cdrive\\$3";
-
-			print TESTREPFILE "\n---- Result of test \"$1 $2 $3\"\n";
-			if (-e $outfile)
-			{
-				# also, copy the log file into the results dir
-				copy ($outfile, "$testlogs\\$p\\$bt\\$3");
-				
-				# check to see if there is a failure
-				my $output = `type $outfile`;
-				if ($output =~ /(\d+) tests failed out of (\d+)/)
-				{
-					print TESTREPFILE "     $1 tests failed out of $2\n";
-					if ($1 ne "0") 
-					{
-						# if there is a fail, then print it in the test log
-						print ERRFILE "-------- Logfile $outfile produced a failure result!\n";
-						print ERRFILE "$output\n";
-						print TESTREPFILE "     There was a test FAILURE\n";
-					}
-					else
-					{
-						print TESTREPFILE "     All tests SUCCEEDED\n";
-					}
-				}
-				else
-				{
-					# if it doesn't conform to standard format, then need to notify
-					print TESTREPFILE "     WARNING: non-standard log file format - check log\n";
-				}
-			}
-			else
-			{
-				# if we get here, the output file didn't exist
-				print ERRFILE "-------- Logfile $outfile does not exist - did $1 fail to build?\n";
-				print TESTREPFILE "     ERROR! Log file $outfile does not exist\n";
-			}
-
-		}
-		elsif ( $line =~ /^COMP\s+([^\s]+)[\s]+([^\s]+)/ )
-		{
-			# Parse our paths
-			my $file1 = $1;
-			my $file2 = $2;
-
-			# substitute variables
-			SubstitutePaths($p, $bt, \$file1);
-			SubstitutePaths($p, $bt, \$file2);
-
-			print "  - doing comparison on $file1 and $file2\n";
-			print TESTREPFILE "\n---- Comparing $file1 and $file2\n";
-			my $output = ExecAndOutputToLog("diff -q $file1 $file2");
-
-			if ( $output =~ /differ/ )
-			{
-				print TESTREPFILE "     Comparison FAILED\n";
-			}
-			else
-			{
-				print TESTREPFILE "     Comparison SUCCESSFUL\n";
-			}
-		}
-
-		else
-		{
-			ReportToFiles("**** Error test config line: $line");
-		}
-	}
-	close (POSTFILE);
-	close (TESTREPFILE);
-}
-
-# - $C - the current EPOC C drive (eg o:\epoc32\wins\c)
-# - $Z - the current EPOC Z drive (eg o:\epoc32\release\wins\udeb\z)
-# - $RELEASE - the epoc release directory for this build (eg o:\epoc32\release\wins\udeb)
-# - $EPOC - the epoc root (eg o:\epoc32)
-# - $ROOT - the root drive (eg o:)
-# - $SUBSYSROOT - subsystem root e.g. security
-sub SubstitutePaths
-{
-	my ($platform, $buildtype, $cmdref) = @_;
-
-	my $cdrive = "$EPOCROOT\\$platform\\c";
-	my $releasedir = "$EPOCROOT\\release\\$platform\\$buildtype";
-	my $zdrive = "$releasedir\\z";
-
-	${$cmdref} =~ s/\$C/$cdrive/g;
-	${$cmdref} =~ s/\$Z/$zdrive/g;
-	${$cmdref} =~ s/\$RELEASE/$releasedir/g;
-	${$cmdref} =~ s/\$EPOC/$EPOCROOT/g;
-	${$cmdref} =~ s/\$ROOT/$ROOTDRIVE/g;
-	${$cmdref} =~ s/\$SUBSYSROOT/$RELSUBSYSROOT/g;
-}
-
-
-# This subroutine acts as a preprocessor for a config file. It
-# expands the test config file and produced a file in POSTPROCESSED
-sub ParseTestConfigFile
-{
-	use File::Copy;
-
-	# Firstly, copy the configuration file into the postprocessed file
-	copy($TESTCONFIGFILE, $POSTPROCESSED);
-
-	# set up boolean to indicate if preprocessing of #include is done
-	my $keepgoing = "1";
-
-	while ($keepgoing)
-	{
-		# reset the keepgoing flag
-		$keepgoing = "";
-
-		# if we have to keep going, copy the postprocessed file into a temp
-		my $tempfile = "$RESULTDIR\\temp.txt";
-		move ($POSTPROCESSED, $tempfile);
-
-		open  (TEMPFILE, "< $tempfile") || die "error opening $tempfile for reading";
-		open  (POSTFILE, "> $POSTPROCESSED") || die "error opening $POSTPROCESSED for writing";
-
-		# Now search the temp file for instances of #include
-		while (<TEMPFILE>)
-		{
-			my $line = $_;
-			# check for comments - use C++ style //
-			if ( $line =~ /(.*)\/\/.*/ )
-			{
-				# set the keepgoing flag
-				$keepgoing = "1";
-				print POSTFILE "$1\n";
-			}
-			elsif ( $line =~ /\#include[ ]+\"([^\"]*)\"/ )
-			{
-				# set the keepgoing flag because a #include has been found
-				$keepgoing = "1";
-
-				# now write the entire contents of this file into the
-				# the postprocessed file
-				my $contents = `type $SUBSYSTEMROOT\\$1`;
-				print POSTFILE "$contents\n";
-			}
-			elsif ( $line =~ /^\s*$/ )
-			{
-				# remove if we have only whitespaces
-			}
-			else 
-			{
-				print POSTFILE $line;
-			}
-		}
-		close (TEMPFILE);
-		close (POSTFILE);
-
-		# delete the temp file
-		unlink($tempfile);
-	}
-}
-
-sub ReportToFiles
-{
-	# this function just prints a string to both the log file and the error file
-	my ($str) = @_;
-
-	print LOGFILE $str;
-	print ERRFILE $str;
-}
-
-sub DoBuildRoms
-{
-	ReportToFiles("\n------------------- Now building roms\n\n");
-
-	chdir ("$EPOCROOT\\rom");
-
-	# create a new directory for the roms
-	my $romdir = "$RESULTDIR\\roms";
-	system("mkdir \"$romdir\"");
-
-	# define the oby file to use
-	my $oby_file = "techview.oby";
-
-	# firstly, make sure the SecurityTests.iby file has been included from the techview.oby
-	if (open(OBY, ">> include\\$oby_file"))
-	{
-		print OBY "\n#include <SecurityTests.iby>\n";
-		close(OBY);
-	}
-
-	# Now go through the list of rom targets and build
-	foreach my $rom (@ROMPLATFORMS)
-	{
-		ExecAndOutputToLog("tools\\buildrom -D__NOWATCHER__ -o$romdir\\$rom.img $rom $oby_file");
-	}
-}
-
-sub SetVariable
-{
-	# Sets a variable from an environment variable or a default value if the
-	# environment variable has not been set
-	my ($variable, $env_name, $default) = @_;
-
-	${$variable} = $ENV{$env_name};
-	if (!${$variable})
-	{
-		${$variable} = $default;
-	}
-}
-
-# remove the watchers (prevents connection intermittently to NTRas)
-sub RemoveWatchers
-{
-	my ($platform, $bt) = @_;
-
-	ReportToFiles("------------------- Removing watchers\n");
-
-	if ( ($platform eq "wins") or ($platform eq "winscw") )
-	{
-		# emulator build, delete the dlls for beech and exes for cedar
-		system("del $EPOCROOT\\release\\$platform\\$bt\\watcher.dll");
-		system("del $EPOCROOT\\release\\$platform\\$bt\\z\\system\\libs\\watcher.dll");
-		system("del $EPOCROOT\\release\\$platform\\$bt\\watcher.exe");
-		system("del $EPOCROOT\\release\\$platform\\$bt\\z\\system\\libs\\watcher.exe");
-	}
-	else
-	{
-		# hardware. remove the watchers from startup script
-		if ( $TECHVIEWROOT )
-		{
-			system("attrib -r $TECHVIEWROOT\\toolkit\\startup\\group\\start.rss");
-			system("copy $SUBSYSTEMROOT\\testframework\\test\\autotesting\\startnowatchers.rss $TECHVIEWROOT\\toolkit\\startup\\group\\start.rss");
-		}
-	}
-}
+#
+# Copyright (c) 2005-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: 
+#
+
+use strict;
+
+##################################################################################
+# These variables can be customised as required
+# define some global variables - customise as required
+my $REPORTDIR;
+my $MAINLINEZIPDIR;
+my $RELSUBSYSROOT;
+my $TECHVIEWROOT;
+
+# set variables which can be set from the environment. If no environment
+# equivalent is found, it will set to the default
+SetVariable(\$REPORTDIR, "REPORTDIR", "L:\\AutoSecTests");
+SetVariable(\$MAINLINEZIPDIR, "MAINLINEZIPDIR", "\\\\builds01\\Master");
+SetVariable(\$RELSUBSYSROOT, "RELSUBSYSROOT", "security");
+
+# To include Techview in build set environment variable:
+# TECHVIEWROOT=Techview
+SetVariable(\$TECHVIEWROOT, "TECHVIEWROOT", "");
+
+# host platforms define which platforms are to be built and tests to run. Target
+# platforms are those where roms are build
+my @HOSTPLATFORMS = ("wins", "winscw");
+my @TARGETPLATFORMS = ("arm4", "thumb");
+my @ROMPLATFORMS = ("lubbock", "assabet");
+my @BUILDTYPES = ("udeb", "urel");
+#
+# END of customisable variables
+####################################################################################
+
+my $P4CLIENTNAME = ConfigureDefaultClient();
+my $TESTCONFIGFILE;
+my $SUBSYSTEMROOT;
+# beech or cedar 
+my $BUILDPLATFORM; 
+
+# first get the date
+my @DATEARRAY = split(/[ \/]/, `date /t`);
+
+# command line arguments
+my %ARGS = ();
+
+# Parse command line parameters
+ProcessCommandLine();
+
+# now, DATEARRAY[0] will be day, 1 will be date of month, 2 will be month, 3 is year
+my $RESULTDIR = "$REPORTDIR\\$DATEARRAY[3]$DATEARRAY[2]$DATEARRAY[1]";
+
+# define the file where the config.txt file is post-processed
+my $POSTPROCESSED = "$RESULTDIR\\postprocessed.txt";
+
+# create a new directory for today
+system("mkdir \"$RESULTDIR\"");
+
+# create a logfile and error file
+open  (LOGFILE, "> $RESULTDIR\\log.txt") || die "error opening for writing";
+open  (ERRFILE, "> $RESULTDIR\\error.txt") || die "error opening for writing";
+
+# Derive rootdrive from perforce client. Set up variables
+# which required the root drive to be configured. Note that
+# the test config file is only overwritten if not configured by
+# the command line. By default it looks for config.txt in the current
+# directory
+my $ROOTDRIVE = "L:";
+GetRootDrive();
+if (!$TESTCONFIGFILE)
+{
+	use Cwd;
+	my $dir = cwd();
+	$TESTCONFIGFILE = "$dir\\config.txt";
+}
+if (!$SUBSYSTEMROOT)
+{ 
+	$SUBSYSTEMROOT = "$ROOTDRIVE\\$RELSUBSYSROOT";
+}
+
+if ($TECHVIEWROOT)
+{
+	$TECHVIEWROOT = "$ROOTDRIVE\\$TECHVIEWROOT";
+}
+
+# epoc root directory
+my $EPOCROOT = "$ROOTDRIVE\\epoc32";
+
+# add techview to build if requested
+my @BUILDDIRS = "";
+if ( $TECHVIEWROOT )
+{
+	@BUILDDIRS = ( $SUBSYSTEMROOT, "$TECHVIEWROOT\\toolkit\\startup\\group", "$TECHVIEWROOT\\apps\\appinstui\\group", "$TECHVIEWROOT\\apps\\secui\\group");
+}
+else
+{
+	@BUILDDIRS = ( $SUBSYSTEMROOT );
+}
+
+print "BUILDIRS = @BUILDDIRS\n";
+
+# call main
+main();
+
+# main function 
+sub main()
+{
+	print "REPORTDIR = $REPORTDIR\n";
+	print "MAINLINEZIPDIR = $MAINLINEZIPDIR\n";
+	print "SUBSYSTEMROOT = $SUBSYSTEMROOT\n";
+	print "TESTCONFIGFILE = $TESTCONFIGFILE\n";
+	print "TECHVIEWROOT = $TECHVIEWROOT\n";
+	print "BUILDPLATFORM = $BUILDPLATFORM\n";
+
+	# Figure out the second-latest release if none had been specified on the
+	# command line - we do not want the latest in case it has not yet been released. 
+	my $releasedir = "";
+	my $platformsuffix = "";
+	if ($BUILDPLATFORM)
+	{
+		$platformsuffix = "_$BUILDPLATFORM";
+	}
+
+	if (!$ARGS{"mainline"})
+	{
+		my $filelist = `dir $MAINLINEZIPDIR\\0????$platformsuffix /ad /b | sort /r`;
+		my @filearray = split "\n", $filelist;
+		$releasedir = $filearray[1];
+	}
+	else
+	{
+		$releasedir = "$ARGS{\"mainline\"}$platformsuffix";
+	}
+
+	# Display what's to be done
+	ReportToFiles("------ Script run on $DATEARRAY[1]/$DATEARRAY[2]/$DATEARRAY[3] with the following options\n");
+	ReportToFiles("------       Report directory: $REPORTDIR\n");
+	ReportToFiles("------       Subsystem root: $SUBSYSTEMROOT\n");
+	ReportToFiles("------       Test config file: $TESTCONFIGFILE\n");
+	ReportToFiles("------       Built against MCL platform: $BUILDPLATFORM\n");
+	if ($ARGS{s}) { ReportToFiles("------      Perforce synchronisation using client spec \"$P4CLIENTNAME\" on drive \"$ROOTDRIVE\"\n"); }
+	if ($ARGS{u}) { ReportToFiles("------      Mainline unzip using build $releasedir\n"); }
+	if ($ARGS{b}) { ReportToFiles("------      Build of production and test code\n"); }
+	if ($ARGS{t}) { ReportToFiles("------      Running of test code on the host using $TESTCONFIGFILE\n"); }
+	if ($ARGS{f}) { ReportToFiles("------      Build rom first\n"); }
+	if ($ARGS{t}) { ReportToFiles("------      Running of test code on the host using $TESTCONFIGFILE\n"); }
+
+	if ($ARGS{r}) 
+	{ 
+		ReportToFiles("------      Building of target roms: "); 
+		map { ReportToFiles("$_ "); } @ROMPLATFORMS;
+		ReportToFiles("\n");
+	}
+	ReportToFiles("------      Host builds used: ");
+	map { ReportToFiles("$_ "); } @HOSTPLATFORMS;
+	ReportToFiles("\n------      Target processor builds used: ");
+	map { ReportToFiles("$_ "); } @TARGETPLATFORMS;
+	ReportToFiles("\n------      Build types used: ");
+	map { ReportToFiles("$_ "); } @BUILDTYPES;
+	ReportToFiles("\n\n");
+
+	# Do a perforce sync
+	if ($ARGS{s})
+	{
+		DoPerforceSync();
+	}
+
+	# Now unzip the mainline
+	if ($ARGS{u})
+	{
+		DoMainlineUnzip($releasedir);
+	}
+
+	# Build the post-processed config file if the test flag is on
+	if ($ARGS{t})
+	{
+		ParseTestConfigFile();
+	}
+
+    # Build the tools
+	if ($ARGS{o})
+	{
+		foreach my $bt (@BUILDTYPES)
+		{
+			DoBuildTools($bt);
+		}
+	}
+
+	# Build rom first?
+	if ( $ARGS{f} ) 
+	{
+		# Now build the target platforms - no testing required
+		if ($ARGS{b})
+		{
+			foreach my $platform (@TARGETPLATFORMS)
+			{
+				foreach my $bt (@BUILDTYPES)
+				{
+					# Must build dummy midp2installerclient for cedar
+					if ( $BUILDPLATFORM eq "cedar" )
+					{
+						my @tempbuilddirs = @BUILDDIRS;
+						@BUILDDIRS = ("$SUBSYSTEMROOT\\appinst\\tsrc");
+						print "Building dummy midp2installerclient....on $platform/$bt\n";
+						DoBuild($platform, $bt);
+						# now build the rest
+						@BUILDDIRS = @tempbuilddirs;
+					}
+					DoBuild($platform, $bt);
+				}
+			}	
+		}
+		# Now build the roms if required
+		if ($ARGS{r})
+		{
+			DoBuildRoms();
+		}
+	}
+
+	# Build and test host platforms. They get built and then tested in order.
+	# This is required as the EPOC C drive is shared between udeb and urel.
+	# If the build/test is run together as a set, then the state of the C
+	# drive will be restored
+	foreach my $platform (@HOSTPLATFORMS)
+	{
+		foreach my $bt (@BUILDTYPES)
+		{
+			if ($ARGS{b})
+			{
+				DoBuild($platform, $bt);
+			}
+			if ($ARGS{t})
+			{
+				DoRunTests($platform, $bt);
+			}
+		}
+	}
+
+	# Now build the target platforms (unless this has been done in advance) - no testing required
+	if ( !$ARGS{f} ) 
+	{
+		if ($ARGS{b})
+		{
+			foreach my $platform (@TARGETPLATFORMS)
+			{
+				foreach my $bt (@BUILDTYPES)
+				{
+					# Must build dummy midp2installerclient for cedar
+					if ( $BUILDPLATFORM eq "cedar" )
+					{
+						my @tempbuilddirs = @BUILDDIRS;
+						@BUILDDIRS = ("$SUBSYSTEMROOT\\appinst\\tsrc");
+						print "Building dummy midp2installerclient....on $platform/$bt\n";
+						DoBuild($platform, $bt);
+						# now build the rest
+						@BUILDDIRS = @tempbuilddirs;
+					}
+					DoBuild($platform, $bt);
+				}
+			}	
+		}
+		# Now build the roms if required
+		if ($ARGS{r})
+		{
+			DoBuildRoms();
+		}
+	}
+
+	my $timeoutput = `time /t`;
+	ReportToFiles("\n------------------- Job finished at $timeoutput\n\n");
+
+}
+sub ConfigureDefaultClient
+{
+	# this subroutine figures out what default perforce client to use
+	my $clientoutput = `p4 client -o`;
+
+	if ($clientoutput =~ /\nClient:\s*([^\s]*)/ )
+	{
+		return $1;
+	}
+}
+
+sub GetRootDrive
+{
+	# this subroutine derives the rootdrive from the perforce client
+	my $clientoutput = `p4 client -o`;
+
+	if ($clientoutput =~ /\nRoot:\s*(.):/ )
+	{
+		$ROOTDRIVE = "$1:"
+	}
+}
+
+sub ProcessCommandLine
+{
+	use Getopt::Long;
+	&GetOptions (\%ARGS, "a", "h", "s", "u", "b", "t", "r", "o", "f", "client=s", "configfile=s", "workdir=s", "mainline=s", "subsystemroot=s", "nohost", "notgt", "platform=s", @HOSTPLATFORMS, @TARGETPLATFORMS, @ROMPLATFORMS, @BUILDTYPES);
+
+	# if the -a option is specified, this means that sync, unzip, build, run
+	# tests, and rom options should be set
+	if ($ARGS{a})
+	{
+		$ARGS{o} = $ARGS{s} = $ARGS{u} = $ARGS{b} = $ARGS{t} = $ARGS{r} = $ARGS{a};
+	}
+
+	# if the help option is specified, or none of the other arguments are specified,
+	# or both beech and cedar requested, then display the help
+	if ($ARGS{h} || (!$ARGS{s} && !$ARGS{u} && !$ARGS{b} && !$ARGS{t} && !$ARGS{r} && !$ARGS{o}))
+	{
+		print "Command line switches: \n";
+		print "    -s        Do perforce synchronisation\n";
+		print "    -u        Do unzipping from the mainline\n";
+		print "    -b        Build the appropriate targets\n";
+		print "    -t        Run the test suite\n";
+		print "    -r        Build the roms\n";
+        print "    -o        Build the tools\n";
+		print "    -a        Do all of the above\n";
+		print "    -f        Build rom First (before wins winscw)\n";
+		print "    -h        Display this screen\n";
+		print "\nOther options:\n";
+		print "    --wins    Use the wins platform for building and running of host tests\n";
+		print "    --winscw  Use the winscw platform for building and running of host tests\n";
+		print "    --nohost  Do not use any host platform\n";
+		print "    --arm4    Use the arm4 processor for rom building\n";
+		print "    --thumb   Use the thumb processor for rom building\n";
+		print "    --notgt   Do not use any target platform\n";
+		print "    --assabet Build roms for assabet platform\n";
+		print "    --lubbock Build roms for lubbock platform\n";
+		print "    --udeb    Build udeb version only\n";
+		print "    --urel    Build urel version only\n";
+		print "\nParameters:\n";
+		print "    --client=<client>   Specifies the perforce client to use (default: $P4CLIENTNAME)\n";
+		print "    --workdir=<dir>     Specifies the working directory (default: $REPORTDIR)\n";
+		print "    --subsystemroot=<dir> Specifies the root directory to build\n";
+		print "    --configfile=<file> Specifies the test config file\n";
+		print "    --mainline=<release number> Specifies the release number to use\n";
+        print "    --platform=<platform name>  Specifies MCL platform. Default is beech. Set to none for pre MCL builds\n";
+		print "\nExamples:\n";
+		print "    perl -w RunTests.pl -b -t -r --wins --lubbock --thumb --platform=cedar --client=lon-julianl\n\n";
+		print "    Uses drive m, client lon-julianl, build against cedar and builds and runs tests on the wins\n";
+		print "    platform and builds roms for lubbock\n\n";
+		print "    perl -w RunTests.pl -u -b --winscw --urel --notgt --mainline=01038\n\n";
+		print "    Unzips mainline 01038_beech and builds only winscw/urel. Uses default client\n";
+		print "    perl -w RunTests.pl -u -b --winscw --urel --notgt --platform=none --mainline=01038\n\n";
+		print "    Unzips mainline 01038 and builds only winscw/urel. Uses default client\n";
+		exit(0);
+	}
+
+	# Now parse the client, drive, and working directory parameters
+	if ($ARGS{"client"})
+	{
+		$P4CLIENTNAME = $ARGS{"client"};
+		$ENV{"P4CLIENT"} = $P4CLIENTNAME;
+	}
+	if ($ARGS{"configfile"})
+	{
+		$TESTCONFIGFILE = $ARGS{"configfile"};
+	}
+	if ($ARGS{"workdir"})
+	{
+		$REPORTDIR = $ARGS{"workdir"};
+	}
+	if ($ARGS{"subsystemroot"})
+	{
+		$SUBSYSTEMROOT = $ARGS{"subsystemroot"};
+	}
+
+	use Getopt::Long;
+
+	# now parse the host options
+	if ($ARGS{"nohost"})
+	{
+		@HOSTPLATFORMS = ();
+	}
+	else
+	{
+		ParseArguments(\@HOSTPLATFORMS);
+	}
+
+	# now parse the target platforms
+	if ($ARGS{"notgt"})
+	{
+		@TARGETPLATFORMS = ();
+	}
+	else
+	{
+		ParseArguments(\@TARGETPLATFORMS);
+	}
+
+	# now parse the rom platforms and the build types
+	ParseArguments(\@ROMPLATFORMS);
+	ParseArguments(\@BUILDTYPES);
+
+	if ($ARGS{"platform"})
+	{
+		$BUILDPLATFORM=$ARGS{"platform"};
+		if ($BUILDPLATFORM eq "none")
+		{
+			# set compatibity for pre MCL builds
+			$BUILDPLATFORM="";
+		}
+	}
+	else
+	{
+		# default
+		$BUILDPLATFORM="beech"; 
+	}
+}
+
+sub ParseArguments
+{
+	# common parsing of arguments in an array - returns another array
+	# which have the options specified.
+	# If none specified, it returns ALL the options.
+	#
+	# eg. If -wins specified, and options = ("wins", "winscw"), then
+	# return array is just ("wins"). If neither wins or winscw specified,
+	# then returns both
+	(my $options) = @_;
+	my @retoptions = ();
+
+	foreach my $opt (@$options)
+	{
+		if ($ARGS{$opt})
+		{
+			push(@retoptions, $opt);
+		}
+	}
+
+	# change if we have at least one option specified
+	if (scalar(@retoptions) > 0)
+	{
+		@$options = @retoptions;
+	}
+}
+
+# subroutine to do a perforce sync 
+sub DoPerforceSync
+{
+	print "Doing a Perforce synchronisation....\n";
+	ExecAndOutputToLog("p4 sync -f $SUBSYSTEMROOT\\...");
+    if ( $TECHVIEWROOT )
+    {
+        ExecAndOutputToLog("p4 sync -f $TECHVIEWROOT\\...");
+    }
+}
+
+# subroutine to do the unzipping
+sub DoMainlineUnzip
+{
+	my ($dir) = @_;
+	print "Doing an unzip of mainline $MAINLINEZIPDIR\\$dir...\n";
+
+	my @zipfiles = ("techview");
+
+	# firstly, delete anything already there
+	ExecAndOutputToLog("del \/F \/S \/Q $EPOCROOT");
+
+	# unzip all the zipfiles
+	map { ExecAndOutputToLog("t:\\tools\\unzip -o $MAINLINEZIPDIR\\$dir\\zips\\$_.zip -d $ROOTDRIVE\\"); } @zipfiles;
+}
+
+# subrountine to build or clean release or test build
+# call RunAbld("<Directory>", "<Command>", "<Target>", "test" or "")
+sub RunAbld
+{
+	my ($dir, $cmd, $target, $test, $bldtype) = @_;
+	chdir ($dir);
+
+	my $bldcommand = "abld $test $cmd -k $target $bldtype";
+	my $bldoutput = ExecAndOutputToLog($bldcommand);	
+	
+	if ($cmd eq "build")
+	{
+		# match "error:" or "error(s)" or fatal error
+		my @errout = grep(/(error(\(s\)|\:))|fatal error/i,  split("\n", $bldoutput));
+
+		if (scalar(@errout) > 0)
+		{
+			print ERRFILE "-------- Errors found when running $bldcommand\n";
+			map { print ERRFILE "$_\n"; } @errout;
+			print ERRFILE "-------- End of errors for $bldcommand\n\n";
+		}
+	}
+}
+
+# builds the release and test code for a specified platform and mode
+# eg WINS/UDEB
+sub DoBuild
+{
+	my ($platform, $bt) = @_;
+
+	RemoveWatchers($platform, $bt);
+
+	foreach my $bd (@BUILDDIRS)
+	{
+
+		chdir ($bd);
+		system("bldmake bldfiles");
+
+		print "Building build targets.... $bd on $platform/$bt\n";
+		ReportToFiles("\n------------------- Now building $bd on $platform/$bt\n\n");
+
+		RunAbld($bd, "clean", $platform, "", $bt);
+		RunAbld($bd, "clean", $platform, "test", $bt);
+		RunAbld($bd, "build", $platform, "", $bt);
+		RunAbld($bd, "build", $platform, "test", $bt);
+	}
+}
+
+# builds the tools for deb or rel
+sub DoBuildTools
+{
+	my ($bt) = @_;
+
+    #adjust for unicode
+    if ($bt eq "udeb")
+    {
+        $bt = "deb";
+    }
+    if ($bt eq "urel")
+    {
+        $bt = "rel";
+    }
+
+	foreach my $bd (@BUILDDIRS)
+	{
+		chdir ($bd);
+		system("bldmake bldfiles");
+
+		print "Building tools.... $bd on $bt\n";
+		ReportToFiles("\n------------------- Now building $bd for tools on $bt\n\n");
+
+		RunAbld($bd, "clean", "tools", "", $bt);
+		RunAbld($bd, "build", "tools", "", $bt);
+	}
+}
+
+# this subroutine executes the given command and outputs to the log file
+sub ExecAndOutputToLog
+{
+	my ($cmd) = @_;
+	my $timeoutput = `time /t`;
+	my $cmdoutput = `$cmd 2>&1`;
+
+	# capture output to log file
+	print LOGFILE "-------- Output of $cmd run at $timeoutput";
+	if ($cmdoutput) 
+	{
+		print LOGFILE "$cmdoutput\n";
+	}
+	else
+	{
+		print LOGFILE "(NO OUTPUT)\n";
+	}
+
+	if ($? != 0)
+	{
+		print ERRFILE "\n-------- Error code $? returned when executing:\n";
+		print ERRFILE "-------- \"$cmd\".\n";
+
+		if ($cmdoutput)
+		{
+			print ERRFILE "-------- Output:\n";
+			print ERRFILE "$cmdoutput";
+		}
+	}
+	return $cmdoutput;
+}
+
+# this subroutine executes all the tests as specified in the configuration file.
+# It will run the tests for the specified platform/built type
+#
+# The configuration file has the following valid commands:
+# 
+# #include <filename> - includes another config file
+# SYSTEMCMD <command and parameters> - executes a DOS command eg SYSTEMCMD copy a.txt b.txt
+# DOTEST <testname> <scriptname> <logname> ... - executes a test
+# COMP <filea> <fileb> - compares two files and logs result
+#
+# For SYSTEMCMD and COMP, the following variables get substituted
+# - $C - the current EPOC C drive (eg o:\epoc32\wins\c)
+# - $Z - the current EPOC Z drive (eg o:\epoc32\release\wins\udeb\z)
+# - $RELEASE - the epoc release directory for this build (eg o:\epoc32\release\wins\udeb)
+# - $EPOC - the epoc root (eg o:\epoc32)
+# - $ROOT - the root drive (eg o:)
+sub DoRunTests
+{
+	# platform and build type
+	my ($p, $bt) = @_; 
+	print "Running tests on platform $p/$bt\n";
+	ReportToFiles("\n------------------- Now running tests on platform $p/$bt\n\n");
+
+	# set the default directory to be the subsystem root
+	chdir($SUBSYSTEMROOT);
+
+	# Make the results directory
+	my $testlogs = "$RESULTDIR\\testlogs";
+	system("mkdir $testlogs");
+	system("mkdir $testlogs\\$p");
+	system("mkdir $testlogs\\$p\\$bt");
+
+	# open the post processed file
+	open (POSTFILE, "< $POSTPROCESSED") || die "error opening $POSTPROCESSED for reading";
+	# open a separate report file for test results
+	open (TESTREPFILE, "> $RESULTDIR\\testresults.$p.$bt.txt") || die "error opening for writing";
+
+	my $timeoutput = `time /t`;
+	print TESTREPFILE "-------- Test log file when running on platform $p/$bt at $timeoutput";
+
+	my $cdrive = "$EPOCROOT\\$p\\c";
+	while (<POSTFILE>)
+	{
+		my $line = $_;
+
+		# check for a line with SYSTEMCMD <command>
+		if ( $line =~ /^SYSTEMCMD[ ]+(.*)/ )
+		{
+			# Substitute $C for the cdrive, $Z for the zdrive, and $RELEASE
+			# for the release path, etc
+			my $cmd = $1;
+			SubstitutePaths($p, $bt, \$cmd);
+
+			print "  - executing system command: $cmd\n";
+			ExecAndOutputToLog($cmd);
+		}
+		elsif ( $line =~ /^\s*$/ )
+		{
+			# if we have an empty line then do nothing
+		}
+		elsif ( $line =~ /^DOTEST\s+([^\s]+)[\s]+([^\s]+)[\s]+([^\s]+)/ )
+		{
+			# if this pattern matches DOTEST <cmd> <scriptfile> <logfile>,
+			# then we execute this test - extra parameters can be supplied after the logfile
+			print "  - running test: $1 $2 $3\n";
+			ExecAndOutputToLog("$EPOCROOT\\release\\$p\\$bt\\$1 $2 $3 $'");
+
+			# log files are assumed to be stored in \epoc32\wins\c
+			my $outfile = "$cdrive\\$3";
+
+			print TESTREPFILE "\n---- Result of test \"$1 $2 $3\"\n";
+			if (-e $outfile)
+			{
+				# also, copy the log file into the results dir
+				copy ($outfile, "$testlogs\\$p\\$bt\\$3");
+				
+				# check to see if there is a failure
+				my $output = `type $outfile`;
+				if ($output =~ /(\d+) tests failed out of (\d+)/)
+				{
+					print TESTREPFILE "     $1 tests failed out of $2\n";
+					if ($1 ne "0") 
+					{
+						# if there is a fail, then print it in the test log
+						print ERRFILE "-------- Logfile $outfile produced a failure result!\n";
+						print ERRFILE "$output\n";
+						print TESTREPFILE "     There was a test FAILURE\n";
+					}
+					else
+					{
+						print TESTREPFILE "     All tests SUCCEEDED\n";
+					}
+				}
+				else
+				{
+					# if it doesn't conform to standard format, then need to notify
+					print TESTREPFILE "     WARNING: non-standard log file format - check log\n";
+				}
+			}
+			else
+			{
+				# if we get here, the output file didn't exist
+				print ERRFILE "-------- Logfile $outfile does not exist - did $1 fail to build?\n";
+				print TESTREPFILE "     ERROR! Log file $outfile does not exist\n";
+			}
+
+		}
+		elsif ( $line =~ /^COMP\s+([^\s]+)[\s]+([^\s]+)/ )
+		{
+			# Parse our paths
+			my $file1 = $1;
+			my $file2 = $2;
+
+			# substitute variables
+			SubstitutePaths($p, $bt, \$file1);
+			SubstitutePaths($p, $bt, \$file2);
+
+			print "  - doing comparison on $file1 and $file2\n";
+			print TESTREPFILE "\n---- Comparing $file1 and $file2\n";
+			my $output = ExecAndOutputToLog("diff -q $file1 $file2");
+
+			if ( $output =~ /differ/ )
+			{
+				print TESTREPFILE "     Comparison FAILED\n";
+			}
+			else
+			{
+				print TESTREPFILE "     Comparison SUCCESSFUL\n";
+			}
+		}
+
+		else
+		{
+			ReportToFiles("**** Error test config line: $line");
+		}
+	}
+	close (POSTFILE);
+	close (TESTREPFILE);
+}
+
+# - $C - the current EPOC C drive (eg o:\epoc32\wins\c)
+# - $Z - the current EPOC Z drive (eg o:\epoc32\release\wins\udeb\z)
+# - $RELEASE - the epoc release directory for this build (eg o:\epoc32\release\wins\udeb)
+# - $EPOC - the epoc root (eg o:\epoc32)
+# - $ROOT - the root drive (eg o:)
+# - $SUBSYSROOT - subsystem root e.g. security
+sub SubstitutePaths
+{
+	my ($platform, $buildtype, $cmdref) = @_;
+
+	my $cdrive = "$EPOCROOT\\$platform\\c";
+	my $releasedir = "$EPOCROOT\\release\\$platform\\$buildtype";
+	my $zdrive = "$releasedir\\z";
+
+	${$cmdref} =~ s/\$C/$cdrive/g;
+	${$cmdref} =~ s/\$Z/$zdrive/g;
+	${$cmdref} =~ s/\$RELEASE/$releasedir/g;
+	${$cmdref} =~ s/\$EPOC/$EPOCROOT/g;
+	${$cmdref} =~ s/\$ROOT/$ROOTDRIVE/g;
+	${$cmdref} =~ s/\$SUBSYSROOT/$RELSUBSYSROOT/g;
+}
+
+
+# This subroutine acts as a preprocessor for a config file. It
+# expands the test config file and produced a file in POSTPROCESSED
+sub ParseTestConfigFile
+{
+	use File::Copy;
+
+	# Firstly, copy the configuration file into the postprocessed file
+	copy($TESTCONFIGFILE, $POSTPROCESSED);
+
+	# set up boolean to indicate if preprocessing of #include is done
+	my $keepgoing = "1";
+
+	while ($keepgoing)
+	{
+		# reset the keepgoing flag
+		$keepgoing = "";
+
+		# if we have to keep going, copy the postprocessed file into a temp
+		my $tempfile = "$RESULTDIR\\temp.txt";
+		move ($POSTPROCESSED, $tempfile);
+
+		open  (TEMPFILE, "< $tempfile") || die "error opening $tempfile for reading";
+		open  (POSTFILE, "> $POSTPROCESSED") || die "error opening $POSTPROCESSED for writing";
+
+		# Now search the temp file for instances of #include
+		while (<TEMPFILE>)
+		{
+			my $line = $_;
+			# check for comments - use C++ style //
+			if ( $line =~ /(.*)\/\/.*/ )
+			{
+				# set the keepgoing flag
+				$keepgoing = "1";
+				print POSTFILE "$1\n";
+			}
+			elsif ( $line =~ /\#include[ ]+\"([^\"]*)\"/ )
+			{
+				# set the keepgoing flag because a #include has been found
+				$keepgoing = "1";
+
+				# now write the entire contents of this file into the
+				# the postprocessed file
+				my $contents = `type $SUBSYSTEMROOT\\$1`;
+				print POSTFILE "$contents\n";
+			}
+			elsif ( $line =~ /^\s*$/ )
+			{
+				# remove if we have only whitespaces
+			}
+			else 
+			{
+				print POSTFILE $line;
+			}
+		}
+		close (TEMPFILE);
+		close (POSTFILE);
+
+		# delete the temp file
+		unlink($tempfile);
+	}
+}
+
+sub ReportToFiles
+{
+	# this function just prints a string to both the log file and the error file
+	my ($str) = @_;
+
+	print LOGFILE $str;
+	print ERRFILE $str;
+}
+
+sub DoBuildRoms
+{
+	ReportToFiles("\n------------------- Now building roms\n\n");
+
+	chdir ("$EPOCROOT\\rom");
+
+	# create a new directory for the roms
+	my $romdir = "$RESULTDIR\\roms";
+	system("mkdir \"$romdir\"");
+
+	# define the oby file to use
+	my $oby_file = "techview.oby";
+
+	# firstly, make sure the SecurityTests.iby file has been included from the techview.oby
+	if (open(OBY, ">> include\\$oby_file"))
+	{
+		print OBY "\n#include <SecurityTests.iby>\n";
+		close(OBY);
+	}
+
+	# Now go through the list of rom targets and build
+	foreach my $rom (@ROMPLATFORMS)
+	{
+		ExecAndOutputToLog("tools\\buildrom -D__NOWATCHER__ -o$romdir\\$rom.img $rom $oby_file");
+	}
+}
+
+sub SetVariable
+{
+	# Sets a variable from an environment variable or a default value if the
+	# environment variable has not been set
+	my ($variable, $env_name, $default) = @_;
+
+	${$variable} = $ENV{$env_name};
+	if (!${$variable})
+	{
+		${$variable} = $default;
+	}
+}
+
+# remove the watchers (prevents connection intermittently to NTRas)
+sub RemoveWatchers
+{
+	my ($platform, $bt) = @_;
+
+	ReportToFiles("------------------- Removing watchers\n");
+
+	if ( ($platform eq "wins") or ($platform eq "winscw") )
+	{
+		# emulator build, delete the dlls for beech and exes for cedar
+		system("del $EPOCROOT\\release\\$platform\\$bt\\watcher.dll");
+		system("del $EPOCROOT\\release\\$platform\\$bt\\z\\system\\libs\\watcher.dll");
+		system("del $EPOCROOT\\release\\$platform\\$bt\\watcher.exe");
+		system("del $EPOCROOT\\release\\$platform\\$bt\\z\\system\\libs\\watcher.exe");
+	}
+	else
+	{
+		# hardware. remove the watchers from startup script
+		if ( $TECHVIEWROOT )
+		{
+			system("attrib -r $TECHVIEWROOT\\toolkit\\startup\\group\\start.rss");
+			system("copy $SUBSYSTEMROOT\\testframework\\test\\autotesting\\startnowatchers.rss $TECHVIEWROOT\\toolkit\\startup\\group\\start.rss");
+		}
+	}
+}