# HG changeset patch # User Mike Kinghan # Date 1244024484 -3600 # Node ID 039d0b7e56f3684a79e17a4ab754ddfc76b7c7a8 # Parent 7f0174848f99ae09b7953600a463e8aecb511938 Comments and code tidying for ats3_testdrop.pl Adding new ATS support script ats_specialise_test_drop.pl diff -r 7f0174848f99 -r 039d0b7e56f3 common/tools/ats/ats3_testdrop.pl --- a/common/tools/ats/ats3_testdrop.pl Thu May 28 14:55:09 2009 +0100 +++ b/common/tools/ats/ats3_testdrop.pl Wed Jun 03 11:21:24 2009 +0100 @@ -13,20 +13,26 @@ # Contributors: # # Description: -# This is a tool for sending an ATS3 testdrop to an ATS3 server. +# This is a tool for sending an ATS testdrop to an ATS server. use strict; use Getopt::Long; use File::Copy; use File::Spec; -my $username = "admin"; -my $password = "admin"; -my $host; -my $schedule; -my $host_drop_path; -my $local_drop_path; -my $local_test_pkg; +my $username = "admin"; # ATS server user name +my $password = "admin"; # ATS server password +my $host; # ATS server hostname +my $schedule; # Schedule string for test drop, if any +my $host_drop_path; # Directory path on the ATS server where the test drop will be placed. + # This must be physically the same path as $local_drop_path, via drive mapping. +my $local_drop_path; # Local directory path where the test drop will be placed. + # This must be physically the same path as $host_drop_path, via drive mapping. +my $local_test_pkg; # Local pathname of the test drop (zip or xml file). The test drop will be + # copied from here to $local_drop_path to make it accessible on the server, + # unless $local_test_pkg begins with "...". This indicates the test drop is already + # present in $local_drop_path and does need to be copied there. The remainder + # following "..." is the filename of the test drop. my $help; my $dev_null = $^O =~ /^MSWin/ ? "nul" : "/dev/null"; @@ -60,7 +66,7 @@ usage_error(), unless (defined($host) && defined($local_test_pkg) && defined($local_drop_path) && defined($host_drop_path)); -my $curl_version = $^O =~ /^MSWin/ ? `curl --version 1> $dev_null 2>&1` : `curl --version 1> $dev_null 2>&1`; +my $curl_version = `curl --version 1> $dev_null 2>&1`; die("Need program \"curl\". Not found"), if ($?); die("Test drop path \"$local_drop_path\" not found"), unless ( -d "$local_drop_path"); @@ -70,41 +76,44 @@ my $local_test_drop; my $host_test_drop; -if ($local_test_pkg =~ /^\.\.\.(.+)/ ) { - $pkg = $1; - $local_test_drop = File::Spec->catfile($local_drop_path,$pkg); +if ($local_test_pkg =~ /^\.\.\.(.+)/ ) { # Local test package name begins with "...". No need to copy. + $pkg = $1; # Get the filename of the test package. + # Compose the full name of the test drop within the local drop path. + $local_test_drop = File::Spec->catfile($local_drop_path,$pkg); die("Test package file \"$local_test_drop\" not found"), unless ( -f "$local_test_drop"); } -else { +else { # Local test package must be copied to local drop path. die("Test package file \"$local_test_pkg\" not found"), unless ( -f "$local_test_pkg"); + # Compose the full name of the test drop within the local drop path. ($vol,$dir,$pkg) = File::Spec->splitpath($local_test_pkg); $local_test_drop = File::Spec->catfile($local_drop_path,$pkg); if ( -f "$local_test_drop") { - my $cmp_local_test_drop = $local_test_drop; - my $cmp_local_test_pkg = $local_test_pkg; - if ($^O =~ /^MSWin/) { - $cmp_local_test_drop = lc($local_test_drop); - $cmp_local_test_pkg = lc($local_test_pkg); - } - if ("$cmp_local_test_drop" eq "$cmp_local_test_pkg") { - if (unlink($local_test_drop) == 0) { - die("Can't delete stale test drop \"$local_test_drop\". $!"); - } - else { - print("A stale test drop \"$local_test_drop\" existed. Deleted\n"); - } - } + # A state test drop of the same name exists. Delete. + unlink($local_test_drop) or die("Can't delete stale test drop \"$local_test_drop\". $!"); + print("A stale test drop \"$local_test_drop\" existed. Deleted\n"); } + # Copy the test drop to the local drop path. copy("$local_test_pkg","$local_test_drop") or die("Cannot copy \"$local_test_pkg\" -> \"$local_test_drop\". $!"); } +# Compose the full name of the test drop within the host drop path. $host_test_drop = File::Spec->catfile($host_drop_path,$pkg); +# Compose URL to notify server of test drop, requesting run. my $url ="http://$host/ats3/XTestRunExecute.do?username=$username&password=$password&testrunpath=$host_test_drop"; $url .= "&schedule=$schedule", if (defined($schedule)); +# Post URL to server with cURL. my $curl_cmd = "curl \"$url\""; -system("$curl_cmd"); -die("\nTest drop failed: $!"), if ($?); -print("\nTest drop done"); +my $curl_response = `$curl_cmd 2>$1`; +die("\nTest drop failed: $!\n"), if ($?); +if ($curl_response =~ /(TEST_RUN_REF_ID=\d+)/) { + #extract test run id from cURL response. + print "$1\n"; +} +else { + print "$curl_response\n"; + die("Test drop failed\n"); +} +print("Test drop done\n"); exit 0; diff -r 7f0174848f99 -r 039d0b7e56f3 common/tools/ats/ats_specialise_test_drop.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/common/tools/ats/ats_specialise_test_drop.pl Wed Jun 03 11:21:24 2009 +0100 @@ -0,0 +1,202 @@ +#!/usr/bin/perl + +# Copyright (c) 2009 Symbian Foundation Ltd +# 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: +# Symbian Foundation Ltd - initial contribution. +# Mike Kinghan, mikek@symbian.org +# +# Contributors: +# +# Description: +# This is a tool for setting the name of an ATS test drop, and/or the build id +# of the build being tested, and/or the name of the device on which +# it is to be run, by modifying the XML test drop specificcation. + +use strict; +use Getopt::Long; +use XML::Simple; +use File::Copy; +use Data::Dumper; + +my $test_drop_name; # Test drop name to be embedded in output XML +my $build_id; # Build ID to be embedded in output XML +my $device_name; # Device name to be embedded in output XML +my $srcfile; # Input test drop file, either .xml or .zip +my $destfile; # Leafname for output file. Extension will be .xml or .zip as input. + # If unspecified then the input file is updated. +my $help; # Do help? +my $srctype; # Type of inpout file, .xml or .zip +my $dev_null = $^O =~ /^MSWin/ ? "nul" : "/dev/null"; # OS-dependent nul device. +my $zipper; # Zip command, depending on whether zip or 7z is available. +my $unzipper; # Unzip command, depending on whether [unzip or 7z is available. +my $xml_in; # Name of the input xml file. Always 'test.xml' if extracted from zipped test drop. +my $temp_dest_name; # Leafname of temporary output file, if $destfile undefined. + +sub usage($); +sub help(); +sub usage_error(); +sub silent_command($); + +my %optmap = ( 'test-drop-name' => \$test_drop_name, + 'device-name' => \$device_name, + 'build-id' => \$build_id, + 'src' => \$srcfile, + 'dest' => \$destfile, + 'help' => \$help); + +GetOptions(\%optmap, + 'test-drop-name=s', + 'device-name=s', + 'build-id=s', + 'src=s', + 'dest=s', + 'help!') + or usage_error(); + +if ($help) { + help(); +} + +# --src is mandatory. +usage_error(), unless (defined($srcfile)); +if ($srcfile =~ /(\.xml$)/i) { + $srctype = lc($1); +} +elsif ($srcfile =~ /(\.zip$)/i) { + $srctype = lc($1); +} +else { + # src file must have extension .xml or .zip + usage_error(); +} +die("File \"$srcfile\" does not exist"), unless -f $srcfile; + +if (!$destfile) { # dest file unspecified. We will update the src file. + $temp_dest_name = "ats_specialise_test_drop.out"; + $destfile = $temp_dest_name; +} +else { + # If dest file has same extension as src then strip off, cos we'll append it anyway. + $destfile =~ s/$srctype$//; +} + + +if ($srctype =~ /^\.zip$/) { # Test drop is zip. Must contain test.xml. + $xml_in = "test.xml"; # This is our input XML. + if ( -f $xml_in) { + # Pre-emptively delete anystale xml file. + unlink($xml_in) or die("Cannot delete stale $xml_in: $!\n"); + } + if (!silent_command("zip -v")) { # See if we've got zip + $zipper = "zip -m $destfile.zip test.xml"; + $unzipper = "unzip -o $srcfile $xml_in -d ."; + } + elsif (!silent_command("7z -version")) { # Else see if we've got 7zip + $zipper = "7z u $destfile.zip test.xml"; + $unzipper = "7z e $srcfile $xml_in"; + } + else { # Got no archiver. + die ("Need programs zip/unzip or 7z. Not found\n"); + } + # Extract test.xml from zip. + system("$unzipper > $dev_null") and die("Could not unzip \"$srcfile\"\n"); + die("Did not find $xml_in within \"$srcfile\"\n"), unless( -f "$xml_in"); + +} +else { + $xml_in = $srcfile; +} + +# Parse the input XML into hashref. +my $test_drop = XMLin("./$xml_in", keeproot => 1, + forcearray => [ 'name', 'id','owner','priority','buildid','target','device', 'property', 'command', 'param'],# + keyattr => [] ); + + +# Insert the specified test drop name, if any. +$test_drop->{'test'}->{'name'}->[0] = $test_drop_name, if $test_drop_name; +# Insert the specified build id, if any. +$test_drop->{'test'}->{'buildid'}->[0] = $build_id, if $build_id; + +if ($device_name) { # Also insert sepcified device name. + + my $device_properties = $test_drop->{'test'}->{'target'}->[0]->{'device'}->[0]->{'property'}; + my $num_properties = @{$device_properties}; + $device_properties->[$num_properties]= { 'name' => "NAME", 'value' => "$device_name" }; + $test_drop->{'test'}->{'target'}->[0]->{'device'}->[0]->{'property'} = $device_properties; + #print Dumper($device_properties); + #exit(0); +} + +if ($srctype =~ /^\.xml$/i ) { # Input file was XML + # Write new XML to dest file. + open OUT,">$destfile.xml" or die("Cannot open file \"$destfile.xml\" for writing. $!\n"); + print OUT XMLout($test_drop, keeproot => 1); + close OUT; +} +else { #Input file was a zip. + # Write new XML to test.xml + open OUT,">test.xml" or die("Cannot open file \"test.xml\" for writing. $!\n"); + print OUT XMLout($test_drop, keeproot => 1); + close OUT; + if ( -f "$destfile.zip") { + unlink("$destfile.zip") or die("Could not delete \"$destfile.zip\": $!\n"); + } + copy("$srcfile","$destfile.zip") or die("Could not copy \"$srcfile\" -> \"$destfile.zip\": $!\n"); + system("$zipper > $dev_null") and die("Could not zip \"test.xml\" into \"$destfile\"\n"); +} + +if ($temp_dest_name) { # We are to update the src file. dest file is a temporary. + # Delete src file + unlink($srcfile) or die("Cannot delete file \"$srcfile\" to replace: $!\n"); + # Replace with temporary. + move("$destfile$srctype","$srcfile") or die("Could not move \"$destfile$srctype\" -> \"$srcfile\": $!\n"); +} + +print "OK\n"; +exit 0; + +sub usage($) +{ + my $error = shift; + my $fh = $error == 0 ? *STDOUT : *STDERR; + print $fh "ats_specialise_test_drop.pl\n" . + "Specify the name, build id and target device in an ATS XML test drop\n" . + "synopsis:\n" . + " ats_specialise_test_drop.pl --help\n" . + " ats_specialise_test_drop.pl [--test-drop-name=TESTNAME] [--build-id=BUILDID] [--device-name=DEVICENAME] [--dest=FILE] --src=FILE \n" . + "options:\n" . + " --help Display this help and exit\n" . + " --test-drop-name=TESTNAME TESTNAME is the desired name of the test drop. If not specified then the test drop name is not modified.\n" . + " --build-id=BUILDID BUILDID is id of the build being tested. If not specified then the build id is not modified.\n" . + " --device-name=DEVICENAME DEVICENAME is the name of the device on which the test should be run. " . + "If not specified then the test device name is not modified.\n" . + " --src=INFILE INFILE is the file containing the test drop XML to be modified, or else a zip file " . + " containing the test drop XML in the file 'test.xml'. INFILE must have extension .xml or.zip\n" . + " --dest=OUTFILE The modified output will be written to the file OUTFILE.EXT " . + "where EXT is same extention, .xml or .zip, found on INFILE. " . + "If OUTFILE is not specified then INFILE is modified\n"; + exit $error; +} + +sub help() +{ + usage(0); +} + +sub usage_error() +{ + usage(1); +} + +sub silent_command($) +{ + my $cmd = shift; + system("$cmd 1> $dev_null 2>&1"); + return $? >> 8; +}