common/tools/ats/smoketest/SmokeTestServer.pl
author Simon Howkins <simonh@symbian.org>
Tue, 10 Aug 2010 18:11:17 +0100
changeset 1206 4518bca1baf0
parent 872 17498133d9ad
permissions -rw-r--r--
Improved diagnostic output: when the build fails because a package cannot be cloned into the build drive, it says which package and the repo source and destination. Improved caching logic, so that it doesn't depend on network availability as much. Improved indentation.

# 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:
# TestServer.pl 
# This script was born on 19/10/2004
# 
#

use strict;

my $jobsfolder = "d:\\Jobs\\";

# Loop forever
while (1)
{
	open LogFile, ">>d:\\SmokeTestServerLog.txt" or die "Cannot open log file: $!";
	
	print "\n***********************\n";
	print "\n*** START PUBLISHER ***\n";
	print "\n***********************\n";
	print "\n";
	print LogFile "\n***********************\n";
	print LogFile "\n*** START PUBLISHER ***\n";
	print LogFile "\n***********************\n";
	print LogFile "\n";
	
	my $localtimes = localtime;
	print "\n*** Current Time: $localtimes ***\n";
	print LogFile "\n*** Current Time: $localtimes ***\n";
	
	# 
	# Check if there are any results ready for publishing
	#
	print "\n";
	print "#\n# Check if there are any results ready for publishing\n#\n"; 
	print "\n";	
	print LogFile "\n";
	print LogFile "#\n# Check if there are any results ready for publishing\n#\n"; 
	print LogFile "\n";	
	
	opendir JobDir, $jobsfolder or die "Cannot open jobs dir $jobsfolder: $!";
		
	my @jobs = readdir(JobDir);
	
	# to remove "." and ".." from this list
	shift @jobs;
	shift @jobs;
	
	if (!scalar(@jobs))
	{
		print "\nNo Jobs to publish\n";
		print LogFile "\nNo Jobs to publish\n";
	}
	else
	{
		# 
		# Loop though each directory and publish logs
		#
		print "\n";
		print "#\n# Loop though each directory and publish logs\n#\n"; 
		print "\n";
		print LogFile "\n";
		print LogFile "#\n# Loop though each directory and publish logs\n#\n"; 
		print LogFile "\n";
			
		foreach my $name (sort { $a <=> $b } @jobs)
		{
			if ( -d $jobsfolder.$name)
			{
				print "\n*** Found Job: $name ***\n";
				print LogFile "\n*** Found Job: $name ***\n";
				
				# Check to see if job has been completed.
				if (isJobFinished($name))
				{
					# 
					# Publish the results
					#
					print "\n";
					print "#\n# Publish the results\n#\n"; 
					print "\n";
					print LogFile "\n";
					print LogFile "#\n# Publish the results\n#\n"; 
					print LogFile "\n";
					
					my $publishfile = $jobsfolder.$name."\\publish.txt";
					
					if (-r $publishfile)
					{
						open (PUBLISH, $publishfile) or GoNext("Cannot find publish details for $name");
						my $count = 0;
						my $index = 0;
						while (my $publishlocation = <PUBLISH>)
						{
							chomp $publishlocation;
							
							$index++;
							
							print "\nPublish Location = $publishlocation\n";
							print LogFile "\nPublish Location = $publishlocation\n";
							
							`mkdir $publishlocation`; # or GoNext("$publishlocation\\$name\\");
							
							my $lookIn = "$jobsfolder$name\\output";
							my ($source,$runid,$buildname) = getSourceDir($lookIn);
							
							my $srcdir = $source."\\xml";
							my $trgtdir= $publishlocation."xml\\";
							
							my $xcopycmd= "xcopy /C /Y /E $srcdir $trgtdir ";
							print `$xcopycmd`;
							
							#
							# Copy the contents of Output and reports -
							#
							# 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)  {
								
								print "copy $xmlfile to $buildname.xml";
								system "copy $xmlfile $publishlocation\\$buildname.xml";
							}
							
							if (-e $htmlfile)  {
								
								print "copy $htmlfile to $buildname.html";
								system "copy $htmlfile $publishlocation\\$buildname.html";
							}
							
							print "\nNumber of Files Copied = $1\n" if $xcopycmd =~ m/(\d+)\s\w+/;
							print LogFile "\nNumber of Files Copied = $1\n" if $xcopycmd =~ m/(\d+)\s\w+/;
							
							$count += $1;
							
							# The input should be copied onto \\devbuilds\master\.. but not \\devbuilds\logs\master\..
							if ($index < 2)
							{
								print "\n\nCopy the Input\n";
								$source = "$jobsfolder$name\\input\\*";
								
								# Copy the contents of Input
								print "\ncmd: xcopy /C /Y /E $source $publishlocation 2>&1\n";
								print LogFile "\ncmd: xcopy /C /Y /E $source $publishlocation 2>&1\n";
								my $xcopy = `xcopy /C /Y /E $source $publishlocation 2>&1`;
								print $xcopy;
								
								print "\nNumber of Files Copied = $1\n" if $xcopy =~ m/(\d+)\s\w+/;
								print LogFile "\nNumber of Files Copied = $1\n" if $xcopy =~ m/(\d+)\s\w+/;
								$count += $1;
							}
						}						
						close Publish;
						
						print "\nTotal Number of files copied = $count\n";
						print LogFile "\nTotal Number of files copied = $count\n";
						
						# Minimum 3 files have to be copied - Trace.txt, sys$rom.bin and armX.tpkg
						if ($count >= 3)
						{
							# it is fine to delete the jobs dir
							print "\ncmd: rd $jobsfolder$name /Q /S  2>&1\n";
							print LogFile "\ncmd: rd $jobsfolder$name /Q /S  2>&1\n";
							print `rd $jobsfolder$name /Q /S  2>&1`;
						}
					}
					else
					{
						print "\n*** Error publishing results ***\n Cannot open publish file: $jobsfolder"."$name"."\\publish.txt\n";
						print LogFile "\n*** Error publishing results ***\n Cannot open publish file: $jobsfolder"."$name"."\\publish.txt\n";
					}
				}
				else
				{
					print "\nThe Job $name is either still running or has encountered an error\n";				
					print LogFile "\nThe Job $name is either still running or has encountered an error\n";				
				}
			}
			else
			{
				print "*** Error ***\nDir does not exist! $jobsfolder.$name\n";
				print LogFile "*** Error ***\nDir does not exist! $jobsfolder.$name\n";
			}
		}
	}
	close JobDir;
	
	my $localtimes = localtime;
	print "\n*** Current Time: $localtimes ***\n";
	print LogFile "\n*** Current Time: $localtimes ***\n";
	
	print "\n";
	print "\n*********************\n";
	print "\n*** END PUBLISHER ***\n";
	print "\n*********************\n";
	print "\n";
	print "\n";
	print LogFile "\n";
	print LogFile "\n*********************\n";
	print LogFile "\n*** END PUBLISHER ***\n";
	print LogFile "\n*********************\n";
	print LogFile "\n";
	print LogFile "\n";
	
	close LogFile;
	sleep 900;
}

sub GoNext
{
	print "\n*** Error in Publisher ***\n $_[0] $!\n";
	print LogFile "\n*** Error in Publisher ***\n $_[0] $!\n";
	next;
}

# identify if a job has finished
sub isJobFinished($) {
	
	my $jobid = shift;
	my @cmd_out = `testdriver.cmd jobstatus -j $jobid 2>&1`;
	
	foreach (@cmd_out) {
		if (m/completed/) { return 1; }
	}
	
	return 0;
}

sub getSourceDir($)
{
	my $source = shift;
	my $runid  = 0;
	my $buildname;
	
	#
	# Find the correct directory to publish
	#
	
	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 result 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
				my @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";
				
										foreach my $directory (@dirArray)
										{
											if ($directory =~ /(^[0-9]+)/i)
											{
												$source .= "\\$directory";
												$runid = $directory;
												last;
											}
										}
									}
									last;
								}
							}
						}
						
					}
				}
			}
		}
	}
	return ($source, $runid, $buildname);
}