common/tools/ats/ats_specialise_test_drop.pl
changeset 134 039d0b7e56f3
child 279 6aa713519d4e
equal deleted inserted replaced
113:7f0174848f99 134:039d0b7e56f3
       
     1 #!/usr/bin/perl
       
     2 
       
     3 # Copyright (c) 2009 Symbian Foundation Ltd
       
     4 # This component and the accompanying materials are made available
       
     5 # under the terms of the License "Eclipse Public License v1.0"
       
     6 # which accompanies this distribution, and is available
       
     7 # at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 #
       
     9 # Initial Contributors:
       
    10 # Symbian Foundation Ltd - initial contribution.
       
    11 #   Mike Kinghan, mikek@symbian.org
       
    12 #
       
    13 # Contributors:
       
    14 #
       
    15 # Description:
       
    16 #   This is a tool for setting the name of an ATS test drop, and/or the build id
       
    17 #   of the build being tested, and/or the name of the device on which
       
    18 #   it is to be run, by modifying the XML test drop specificcation.
       
    19 
       
    20 use strict;
       
    21 use Getopt::Long;
       
    22 use XML::Simple;
       
    23 use File::Copy;
       
    24 use Data::Dumper;
       
    25 
       
    26 my $test_drop_name;	# Test drop name to be embedded in output XML
       
    27 my $build_id;    # Build ID to be embedded in output XML 
       
    28 my $device_name; # Device name to be embedded in output XML
       
    29 my $srcfile;	# Input test drop file, either .xml or .zip
       
    30 my $destfile;	# Leafname for output file. Extension will be .xml or .zip as input.
       
    31 				# If unspecified then the input file is updated. 
       
    32 my $help;		# Do help?
       
    33 my $srctype;	# Type of inpout file, .xml or .zip
       
    34 my $dev_null = $^O =~ /^MSWin/ ? "nul" : "/dev/null";	# OS-dependent nul device.
       
    35 my $zipper;		# Zip command, depending on whether zip or 7z is available.
       
    36 my $unzipper;	# Unzip command, depending on whether [unzip or 7z is available.
       
    37 my $xml_in;		# Name of the input xml file. Always 'test.xml' if extracted from zipped test drop.
       
    38 my $temp_dest_name; # Leafname of temporary output file, if $destfile undefined.
       
    39 
       
    40 sub usage($);
       
    41 sub help();
       
    42 sub usage_error();
       
    43 sub silent_command($);
       
    44 
       
    45 my %optmap = (  'test-drop-name' => \$test_drop_name,
       
    46 			    'device-name' => \$device_name,
       
    47 			    'build-id' => \$build_id,
       
    48 			    'src' => \$srcfile,
       
    49 			    'dest' => \$destfile,
       
    50                 'help' => \$help);
       
    51 
       
    52 GetOptions(\%optmap,
       
    53           'test-drop-name=s',
       
    54           'device-name=s',
       
    55           'build-id=s',
       
    56           'src=s',
       
    57           'dest=s',
       
    58           'help!') 
       
    59           or usage_error();
       
    60 
       
    61 if ($help) {
       
    62 	help();
       
    63 }
       
    64 
       
    65 # --src is mandatory.
       
    66 usage_error(), unless (defined($srcfile));
       
    67 if ($srcfile =~ /(\.xml$)/i) {
       
    68     $srctype = lc($1);
       
    69 }
       
    70 elsif ($srcfile =~ /(\.zip$)/i) {
       
    71     $srctype = lc($1);
       
    72 }
       
    73 else {
       
    74 	# src file must have extension .xml or .zip
       
    75     usage_error();
       
    76 }
       
    77 die("File \"$srcfile\" does not exist"), unless -f $srcfile;
       
    78 
       
    79 if (!$destfile) { # dest file unspecified. We will update the src file.
       
    80 	$temp_dest_name = "ats_specialise_test_drop.out";
       
    81 	$destfile = $temp_dest_name;
       
    82 }
       
    83 else {
       
    84     # If dest file has same extension as src then strip off, cos we'll append it anyway.
       
    85     $destfile =~ s/$srctype$//;
       
    86 }
       
    87 
       
    88 
       
    89 if ($srctype =~ /^\.zip$/) { # Test drop is zip. Must contain test.xml.
       
    90     $xml_in = "test.xml"; # This is our input XML.
       
    91     if ( -f $xml_in) {
       
    92 		# Pre-emptively delete anystale xml file.
       
    93         unlink($xml_in) or die("Cannot delete stale $xml_in: $!\n");
       
    94     }
       
    95     if (!silent_command("zip -v")) { # See if we've got zip
       
    96         $zipper = "zip -m $destfile.zip test.xml";
       
    97         $unzipper = "unzip -o $srcfile $xml_in -d .";
       
    98     }
       
    99     elsif (!silent_command("7z -version")) { # Else see if we've got 7zip
       
   100         $zipper = "7z u $destfile.zip test.xml";
       
   101         $unzipper = "7z e $srcfile $xml_in";
       
   102     }
       
   103     else { # Got no archiver.
       
   104         die ("Need programs zip/unzip or 7z. Not found\n");
       
   105     }
       
   106     # Extract test.xml from zip.
       
   107     system("$unzipper > $dev_null") and die("Could not unzip \"$srcfile\"\n");
       
   108     die("Did not find $xml_in within \"$srcfile\"\n"), unless( -f "$xml_in");
       
   109     
       
   110 }
       
   111 else {
       
   112     $xml_in = $srcfile;
       
   113 }
       
   114 
       
   115 # Parse the input XML into hashref.
       
   116 my $test_drop = XMLin("./$xml_in", keeproot => 1,
       
   117     forcearray => [ 'name', 'id','owner','priority','buildid','target','device', 'property', 'command', 'param'],#
       
   118         keyattr => [] );
       
   119     
       
   120         
       
   121 # Insert the specified test drop name, if any.
       
   122 $test_drop->{'test'}->{'name'}->[0] = $test_drop_name, if $test_drop_name;
       
   123 # Insert the specified build id, if any.
       
   124 $test_drop->{'test'}->{'buildid'}->[0] = $build_id, if $build_id;
       
   125 
       
   126 if ($device_name) { # Also insert sepcified device name.
       
   127 	
       
   128 	my $device_properties = $test_drop->{'test'}->{'target'}->[0]->{'device'}->[0]->{'property'};
       
   129 	my $num_properties = @{$device_properties};
       
   130 	$device_properties->[$num_properties]= { 'name' => "NAME", 'value' => "$device_name" };
       
   131 	$test_drop->{'test'}->{'target'}->[0]->{'device'}->[0]->{'property'} = $device_properties;
       
   132     #print Dumper($device_properties);
       
   133     #exit(0);		
       
   134 }
       
   135 
       
   136 if ($srctype =~ /^\.xml$/i ) { # Input file was XML
       
   137     # Write new XML to dest file.
       
   138     open OUT,">$destfile.xml" or die("Cannot open file \"$destfile.xml\" for writing. $!\n");
       
   139     print OUT XMLout($test_drop, keeproot => 1);
       
   140     close OUT;    
       
   141 }
       
   142 else { #Input file was a zip.
       
   143     # Write new XML to test.xml
       
   144     open OUT,">test.xml" or die("Cannot open file \"test.xml\" for writing. $!\n");
       
   145     print OUT XMLout($test_drop, keeproot => 1);
       
   146     close OUT;
       
   147     if ( -f "$destfile.zip") {
       
   148         unlink("$destfile.zip") or die("Could not delete \"$destfile.zip\": $!\n");
       
   149     } 
       
   150     copy("$srcfile","$destfile.zip") or die("Could not copy \"$srcfile\" -> \"$destfile.zip\": $!\n");
       
   151     system("$zipper > $dev_null") and die("Could not zip \"test.xml\" into \"$destfile\"\n");    
       
   152 }
       
   153 
       
   154 if ($temp_dest_name) { # We are to update the src file. dest file is a temporary.
       
   155    # Delete src file 
       
   156    unlink($srcfile) or die("Cannot delete file \"$srcfile\" to replace: $!\n");
       
   157    # Replace with temporary.
       
   158    move("$destfile$srctype","$srcfile") or die("Could not move \"$destfile$srctype\" -> \"$srcfile\": $!\n");
       
   159 }
       
   160 
       
   161 print "OK\n";
       
   162 exit 0;
       
   163 
       
   164 sub usage($)
       
   165 {
       
   166     my $error = shift;
       
   167     my $fh = $error == 0 ? *STDOUT : *STDERR;
       
   168     print $fh "ats_specialise_test_drop.pl\n" .
       
   169             "Specify the name, build id and target device in an ATS XML test drop\n" .
       
   170             "synopsis:\n" .
       
   171             "  ats_specialise_test_drop.pl --help\n" .
       
   172             "  ats_specialise_test_drop.pl [--test-drop-name=TESTNAME] [--build-id=BUILDID] [--device-name=DEVICENAME] [--dest=FILE] --src=FILE \n" .
       
   173             "options:\n" .
       
   174             "  --help                        Display this help and exit\n" .
       
   175             "  --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" .
       
   176             "  --build-id=BUILDID            BUILDID is id of the build being tested. If not specified then the build id is not modified.\n" .            
       
   177             "  --device-name=DEVICENAME      DEVICENAME  is the name of the device on which the test should be run. " .
       
   178             "If not specified then the test device name is not modified.\n" .
       
   179             "  --src=INFILE                  INFILE is the file containing the test drop XML to be modified, or else a zip file " .
       
   180             "                                containing the test drop XML in the file 'test.xml'. INFILE must have extension .xml or.zip\n" .
       
   181             "  --dest=OUTFILE                The modified output will be written to the file OUTFILE.EXT " .
       
   182             "where EXT is same extention, .xml or .zip, found on INFILE. " .
       
   183             "If OUTFILE is not specified then INFILE is modified\n";              
       
   184     exit $error;            
       
   185 }
       
   186 
       
   187 sub help()
       
   188 {
       
   189     usage(0);
       
   190 }
       
   191 
       
   192 sub usage_error()
       
   193 {
       
   194     usage(1);
       
   195 }             
       
   196 
       
   197 sub silent_command($)
       
   198 {
       
   199     my $cmd = shift;
       
   200     system("$cmd 1> $dev_null 2>&1");
       
   201     return $? >> 8;
       
   202 }