tsrc/scripts/EunitRunner.bat
changeset 0 f0cf47e981f9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tsrc/scripts/EunitRunner.bat	Thu Dec 17 08:44:37 2009 +0200
@@ -0,0 +1,517 @@
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description:
+rem
+
+@goto invoke_perl
+
+#!perl
+#line 5
+
+################################################################################################################
+# This Script will be used to run EUnit testcases with or without codetest 
+# Instrumentation.
+################################################################################################################
+
+#	Packages needed
+#use strict;					# strict naming rules
+use File::Find;			# File operations
+use XML::Simple;		# XML parsing
+File::Spec::Win32;  # File operartions
+use Getopt::Long;		# parameter handling
+use Cwd;						# Directory operations
+Getopt::Long::Configure( "bundling_override","ignore_case_always" );
+
+#	Global variables
+
+# System defined location of files
+my($eunit_destination_dir)= "\\Epoc32\\release\\winscw\\udeb\\z\\sys\\bin\\";
+my($build_destination_dir)= "\\Epoc32\\release\\winscw\\udeb\\";
+my($build_tools_dir)= "\\Epoc32\\tools\\";
+my($eunit_xml_file)= "\\Epoc32\\winscw\\C\\DigiaEUnit\\Logs\\DigiaEUnit_log.xml";
+
+# Default names
+my($codetest_workspace)="codetest.idb";
+my($unittest_result_file)="eunit_result.html";
+my($currentdir)= cwd;
+my($results_destinationdir)=cwd;	
+
+# Variables
+my (@subsystems, 						# List of user selected sub systems
+		@sourcefiles,						# List of user selected source files
+		@makefiles,							# List of make files
+		@dll_filenames);				# List of dll file names
+		
+my ($param_help,		 			  # To extract all zip files
+		$param_command,		 		  # Command to Run
+		$param_dest,						# Copy results to
+		$param_all,							# Destination directory
+		$param_selectedsource,	# Debug version enables data dumber		
+		$param_noclean,					# Debug builds
+		$param_nobuild,					# Creates an Environment		
+		$param_nostub,					# Dont build stubs
+		$param_nosdkinst,			  # Dont Instrument SDK
+		$param_exe,			        # Launch the exe specified
+		$param_version);				# Version		
+		
+my($choice,
+	$user_selection,
+	$count);
+
+#---------------------------------------Main Start----------------------------------------------------------#
+
+
+# read commandline parameters
+my $result = GetOptions('help'			=> \$param_help,						# Display help info
+												'command=s' => \$param_command,					# Command to run
+												'dest=s' 		=> \$param_dest,					  # Destination directory
+												'all'				=> \$param_all,       			# Run all
+												'sourcefiles'	=> \$param_selectedsource,# To Select Source files												
+ 												'noclean'  	=> \$param_noclean,    			# Dont run reallyclean
+												'nobuild'		=> \$param_nobuild, 		    # Dont run symbian build commands
+												'nostub'		=> \$param_nostub, 				  # Dont build stupbs
+												'nosdkinst' => \$param_nosdkinst,			  # Dont instrument SDK. It is already done
+												'exe=s'     => \$param_exe,			            # Launch the exe specified.if nothing then epoc will be used
+												'version'   => \$param_version);				# Version Information
+#Parse user options
+usage()if(!defined $param_command);                          # command is manadatory
+$choice=1 if $param_command eq ('ct'|'CT');									 # set choice 1 if ct ( codtest)
+$param_exe=$build_destination_dir.'EUnitExeRunner' if(!defined $param_exe);
+
+#Checking for EUnit. Cant proceed without Eunit.
+if (! -e $build_destination_dir."EUnitExeRunner.exe") {	
+  print "*** EUnit is not installed for this SDK. Install EUnit by using Installation Manager from SymSEE ***\n";
+  exit 1;  
+  }
+  
+if($param_command eq ('eu'|'EU')){							  					 # set choice 2 if eu ( Eunit)
+	unset_codetest_commands();                                 # unset the codetest commands
+	$choice=2;
+	}
+$choice=3 if $param_command eq ('mm'|'MM');					         # set choice 3 if mm ( manual codtest run)
+if(defined $param_dest){
+	$results_destinationdir=$param_dest ;		
+	}
+else{
+	print "\n Note: No results destination directory specified.Results will be copied to Current Directory\n";
+	$results_destinationdir=~s/\//\\/g;
+	$results_destinationdir=$results_destinationdir."\\";
+	}	
+
+$param_noclean=1 if(defined $param_nobuild);
+run_system_command("bldmake bldfiles") if (!defined $param_nobuild);
+display_sybsystems();                                       # display list of subsystems
+
+if(defined $param_all){
+	print "\nOptions -all specified.Building all components \n ";
+	$user_selection=0;
+	}
+else {	
+	print "\t Options selected : ";
+	$user_selection = <STDIN>;chomp ($user_selection);
+	exit 0 if $user_selection =~ /^[Qq]/;
+	}
+
+if(!$param_nostub){
+	print "\n\n *** Building stubs first ***\n\n ";
+	system("abld reallyclean winscw udeb");
+	system("abld build winscw udeb");
+	print "\n\n *** End of building stubs ***\n\n ";	
+	}
+
+print "\n\n *** Building test components ***\n\n";
+build_user_selected();
+print "\n\n *** End of Building test components ***\n\n ";
+
+chomp(@dll_filenames);
+foreach my $dll(@dll_filenames){   	
+		run_system_command("copy ".$build_destination_dir.$dll." ".$eunit_destination_dir.$dll);     	 	
+  	}  	
+
+#Move Codetest.idb to temp directory so that codetest.py automation script can use it
+if($choice==1){
+	open DATFILE , ">$ENV{'TEMP'}/unitrunner.dat";
+	my(@drive);
+	@drive=split(/:/,$currentdir);
+	if($param_exe=~/EUnitExeRunner/)
+	  {
+	  print DATFILE @drive[0].":".$build_destination_dir.$param_exe."\n";	 	
+	  print DATFILE "$param_exe /L xml /E S60AppEnv /T 100 "."@dll_filenames"."\n";
+	  }
+	else
+	  {
+	  print DATFILE @drive[0].":".$build_tools_dir.$param_exe."\n";
+	  }	
+	close DATFILE;  		  	
+	run_system_command("move codetest.idb $ENV{'TEMP'}/codetest.idb");	
+	print "\n\n *** Running codetest python script ***\n\n";
+	run_system_command("$ENV{'AMC_HOME'}/bin/ctmgr --cli codetest.py %1 %2 %3 %4 %5 %6 %7 %8 %9");		
+	#Move Log files to user destination directory
+	print "\n\n *** Moving Results ***\n\n";
+	$results_destinationdir.="\\CodeTest";
+	system("mkdir $results_destinationdir");
+	system("move $ENV{'TEMP'}\\codetest*.html $results_destinationdir");
+	system("move $ENV{'TEMP'}\\codetest*.txt $results_destinationdir");		
+	system("move $ENV{'TEMP'}\\codetest*.idb $results_destinationdir");
+	}
+elsif($choice==2)	{
+	#Run Eunit TestReport		
+	print "\n\n *** Running EUnit with selected subsystems ***\n\n";
+	if($param_exe=~/EUnitExeRunner/)
+		  {
+		  run_system_command("$param_exe /L xml /E S60AppEnv /T 100 "."@dll_filenames");   	
+		  }
+		else
+		  {		  
+		  run_system_command("$param_exe");   
+		  print " Press a key to continue \n";
+		  <STDIN>;	
+		  }
+	print "\n\n *** Printing Reports ***\n\n";
+	$results_destinationdir.="\\EUnit";
+	system("mkdir $results_destinationdir");
+	print_html_report();	
+	system("copy $eunit_xml_file $results_destinationdir");
+	}
+elsif($choice==3)	{
+	#Run Eunit with instrumentation		
+	do {
+		print "\n Please start CodetestManager and Target Server \n";
+		print " And load swic source codetest.idb\n";
+		print " And Press Y/N to Continue or Exit ! ";
+		$user_selection = <STDIN>;
+		chomp ($user_selection);
+		}while($user_selection !~ /^[nN||yY]/);
+		exit 0 if $user_selection =~ /^[nN]/;
+		print "\n\n *** Running EUnit with instrumented subsystems ***\n\n";
+		if($param_exe=~/EUnitExeRunner/)
+		  {
+		  run_system_command("$param_exe /L xml /E S60AppEnv /T 100 "."@dll_filenames");   	
+		  }
+		else
+		  {
+		  run_system_command("$param_exe"); 
+		  print " Press a key to continue \n";
+		  <STDIN>;	  	
+		  }
+	}
+
+print "\n\n *** DONE ***\n\n";
+
+#---------------------------------------Main Ends-------------------------------------------------------------#
+
+
+sub display_sybsystems {  
+   get_subsystems();
+   display_critical_error("Can't find a subsystem.Please Check your bld.inf file!") if(scalar @subsystems==0);   
+   print "\n\tPlease choose an option listed below \n";   
+   print "\n\tenter +/- to build backward or forward \n";   
+   print "\t\t0.To build all \n";    	
+   $count=1;
+   foreach(@subsystems){   	
+   	print "\t\t".$count++. "." .$_."\n";   	
+   	}
+   print "\t\tq.Exit \n\n";   
+  }
+
+sub build_user_selected {	  	
+ 	 if($user_selection==0){
+  		system("abld test reallyclean winscw udeb") if(!defined $param_noclean or !defined $param_nobuild);
+  		run_system_command("abld test build winscw udeb")	if(!defined $param_nobuild);  		
+  		foreach my $subsystem (@makefiles){
+  			get_dll_names($subsystem);
+  			get_source_files($subsystem)if($choice==1);  						
+  			}
+  		if($choice==1 or $choice==3){
+  			print "\n\n *** Setting the CodeTest Options *** \n\n";
+  			set_codetest_commands(); 
+  			print "\n\n *** Building again with Instrumentation *** \n\n";
+  			system("abld test reallyclean winscw udeb"); # better to clean before running codetest
+  			run_system_command("abld test build winscw udeb");	
+  			print "\n\n *** End of Building with Instrumentation *** \n\n";
+  			print "\n\n *** UnSetting the CodeTest Options *** \n\n";
+  			unset_codetest_commands(); 			
+  			}  	
+  		splice(@sourcefiles, 0, scalar @sourcefiles); # delete sourcefiles
+  		}  	  		  		 
+		elsif($user_selection=~/\+/){ 				 			
+  			for($count=substr($user_selection,0,1)-1;$count<@subsystems;$count++){
+  				system("abld test reallyclean winscw udeb @subsystems[$count]")if(!defined $param_noclean or !defined $param_nobuild);
+  				run_system_command("abld test build winscw udeb @subsystems[$count]")if(!defined $param_nobuild);  		  				
+  				get_dll_names(@makefiles[$count]);
+  				if($choice==1 or $choice==3){
+  					get_source_files(@makefiles[$count]);		
+  					print "\n\n *** Setting the CodeTest Options *** \n\n";
+  					set_codetest_commands(); 
+  					print "\n\n *** Building again with Instrumentation *** \n\n";	
+  				 	system("abld test reallyclean winscw udeb @subsystems[$count]");
+  					run_system_command("abld test build winscw udeb @subsystems[$count]");
+  					print "\n\n *** End of Building with Instrumentation *** \n\n";
+  					}
+  				print "\n\n *** UnSetting the CodeTest Options *** \n\n" if(!defined $param_nobuild);  ;	
+  				unset_codetest_commands() if(!defined $param_nobuild);  
+  				splice(@sourcefiles, 0, scalar @sourcefiles); # delete sourcefiles
+  				}
+  		}
+  	elsif($user_selection=~/\-/) {  		  
+  		  for($count=0;$count<substr($user_selection,0,1);$count++)	{  				
+  				system("abld test reallyclean winscw udeb @subsystems[$count]")if(!defined $param_noclean or !defined $param_nobuild);
+  				run_system_command("abld test build winscw udeb @subsystems[$count]")if(!defined $param_nobuild);  		
+  				get_dll_names(@makefiles[$count]);
+  				if($choice==1 or $choice==3){
+  					get_source_files(@makefiles[$count]);	
+  					print "\n\n *** Setting the CodeTest Options *** \n\n";		
+  				 	set_codetest_commands(); 			
+  				 	print "\n\n *** Building again with Instrumentation *** \n\n";			
+  				 	system("abld test reallyclean winscw udeb @subsystems[$count]");
+  					run_system_command("abld test build winscw udeb @subsystems[$count]");
+  					print "\n\n *** End of Building with Instrumentation *** \n\n";
+  					}
+  				print "\n\n *** UnSetting the CodeTest Options *** \n\n" if(!defined $param_nobuild);
+  				unset_codetest_commands() if(!defined $param_nobuild);
+  				splice(@sourcefiles, 0, scalar @sourcefiles); # delete sourcefiles
+  				}
+  		  }  	 
+    else	{
+    		$count=0;
+  			while($count<length $user_selection)	{
+  				my $str = substr ($user_selection,$count,1); 
+  				system("abld test reallyclean winscw udeb @subsystems[$str-1]")if(!defined $param_noclean or !defined $param_nobuild);
+  				run_system_command("abld test build winscw udeb @subsystems[$str-1]")if(!defined $param_nobuild);  		
+  				get_dll_names(@makefiles[$str-1]);
+  				if($choice==1 or $choice==3){
+  					get_source_files(@makefiles[$str-1]);	 
+  					print "\n\n *** Setting the CodeTest Options *** \n\n";					
+  				 	set_codetest_commands(); 		
+  				 	print "\n\n *** Building again with Instrumentation *** \n\n";
+  				 	system("abld test reallyclean winscw udeb @subsystems[$str-1]");
+  					run_system_command("abld test build winscw udeb @subsystems[$str-1]");
+  					print "\n\n *** End of Building with Instrumentation *** \n\n";
+  					}
+  				unset_codetest_commands(); 		
+  				print "\n\n *** UnSetting the CodeTest Options *** \n\n"	;	  				
+  				splice(@sourcefiles, 0, scalar @sourcefiles); # delete sourcefiles
+  				$count++;  		  				
+  				}
+  			}  	  		  		  	
+	}
+
+
+sub set_codetest_commands	{	
+	if( !defined $param_nosdkinst) {	
+	print "\n*** Instrumenting SDK for CodeTest. ***\n";
+	print "\tIf you done this already for your SDK use -nosdkinst option.\n\n";
+	run_system_command("copy C:\\APPS\\ct\\cttarget\\rtos\\symbian\\Support\\native\\* $build_destination_dir\\");
+	run_system_command("copy C:\\APPS\\ct\\cttarget\\rtos\\symbian\\binaries\\SOS_9\\native\\winscw\\* $build_destination_dir\\");	
+	run_system_command("instctsymb.cmd "." -v ".(split(/:/,$currentdir))[0].":\ SOS_9");
+	$param_nosdkinst = 1;
+	}
+	
+	$ENV{'CODETEST_LIB'}= "NTmvc_TargetLibMD.lib ctsymbiannativemem.lib";	
+	chomp(@sourcefiles);
+	my $filename = join ",",@sourcefiles;
+	$filename =" -CTonly-tag-files=".$filename;	
+	my $val="-CTsize_t=unsigned -CTtag-allocator -CTv -CTno-tag-includes -CTtag-level=DC".$filename." -CTidb=".$codetest_workspace;			
+	$ENV{'CTDRIVER_ARGS'}= $val;
+	print "CTDRIVER_ARGS=".$ENV{'CTDRIVER_ARGS'}."\n";		
+	}
+
+sub unset_codetest_commands	{			
+	$ENV{'CODETEST_LIB'}= "";	
+	$ENV{'CTDRIVER_ARGS'}= "";		
+	}
+
+sub display_critical_error {  
+  print "\n->Error Occured : ".$?."\n" if(!@_[0]);  
+  print "\n->Error Occured : ".@_[0]."\n" if(@_[0]);  	
+  exit 1;
+  }
+
+sub run_system_command {
+	system(@_[0]);
+	display_critical_error() if($?!=0);   
+	}
+
+sub usage	{
+print<<ENDOFUSAGE;
+ Usage :
+      eunitrunner -command=ct|eu|mm -dest=resultdir	
+        -ct -> To run Codetest.
+        -eu -> To run EunitTestcases.
+        -mm -> To run Manual Mode.Useful if you want to find the coverage inside your code.
+        -resultdir->In where results will be copied.	
+		    		
+     Also you can specify some optional flags to change the behaviour of the script.
+       -all -> To run all subsystems.
+       -sourcefiles -> To Select Source files for instrumentation
+       -noclean -> Don't run reallyclean
+       -nobuild -> Dont run symbian build commands
+       -nostub	 -> Dont build stubs
+       -nosdkinst-> Dont instrument sdk
+		
+     Some miscellaneous Commands
+       -version -> Version Information.
+       -help -> Usage information.
+	
+  Examples :
+       eunitrunner -command=ct
+       eunitrunner -command=eu C:/temp/results
+       eunitrunner -command=eu C:/temp/results -all
+       eunitrunner -command=ct C:/temp/results\ -sourcefiles -nobuild -noclean -nostub
+       
+  Note:This script should be run from where bld.inf file available
+  Note:Also you must specify TEMP environmental variable.(By default this exists in All windows system)
+ENDOFUSAGE
+	exit 0;
+	}
+
+sub	get_subsystems(){	
+	open WHATCMD, "abld test makefile winscw -w |";
+	my @temparray;
+	while(<WHATCMD>){
+		chomp;
+		my $makeFile = $_;	
+		if( $makeFile =~ /winscw$/i )	{
+			@temparray=split(/\./,$makeFile);
+			@temparray=split(/\\/,@temparray[0]);
+			push @subsystems,pop(@temparray);						
+			push @makefiles,$makeFile;
+			}
+		}
+	close WHATCMD;	
+	}
+
+sub get_source_files($)	{
+	open MAKE, @_[0] or die "Cant open $!";	
+	my @temparray;
+	while (<MAKE>){
+			my($line)=$_;						
+			if($line=~/(EPOCBLDUREL).*.\.o.*.:.*.\.cpp/){
+					if($line!~/INTERNAL|internal/){		
+						@temparray=split(/:/,$line);
+						@temparray=split(/\\/,@temparray[1]);					
+						push @sourcefiles,pop @temparray;						
+						}
+				}			
+		}
+	close MAKE;	
+	}
+
+ sub get_dll_names($){ 	
+	open MAKE, @_[0] or die "Cant open $_ $!";		
+	my @temparray;
+	my $dll_name;
+	while (<MAKE>){
+		my($line)=$_;									
+		chomp($line);
+		if($line=~/Target.*.\.dll/)	{				
+				@temparray=split(/\s+/,$line);				
+				$dll_name=pop @temparray;								
+				chomp($dll_name);										
+				push @dll_filenames,$dll_name;
+				last;
+				} 
+		}
+	close MAKE;	
+	}
+
+sub print_html_report	{
+	my $simple = XML::Simple->new();
+	my($total)=0;
+	my($pass_count)=0;
+	my($fail_count)=0;
+	my($passPercent)=0.00;
+	my $struct = $simple->XMLin($eunit_xml_file, forcearray => 1,keyattr => []);	
+	open(HTML_FILE, ">$results_destinationdir/$unittest_result_file") || die "Can't open file: $!\n";	
+	# Print initial HTML tags
+	print HTML_FILE "<TABLE BORDER CELLSPACING=\"2\" CELLPADDING=\"2\" WIDTH=\"80%\">\n";		
+	print HTML_FILE "<CAPTION><H3><P ALIGN=Left>Overall Result:          Passed</H3></CAPTION>\n";									
+	print HTML_FILE "<tr>\n";	
+	print HTML_FILE "<th BGCOLOR=\"#CCCCCC\">Total TestCases</th>\n";
+	print HTML_FILE "<th BGCOLOR=\"#00FF00\">Total Passed</th>\n";
+	print HTML_FILE "<th BGCOLOR=\"#FF0000\">Total Failed</th>\n";
+	print HTML_FILE "</tr>\n";	
+	print HTML_FILE "<tr>\n";							
+	print HTML_FILE "<td><P ALIGN=Center>      </td>\n";
+	print HTML_FILE "<td><P ALIGN=Center>      </td>\n";
+	print HTML_FILE "<td><P ALIGN=Center>      </td>\n";
+	print HTML_FILE "</tr>\n";	
+	print HTML_FILE "</table>\n";
+	print HTML_FILE "                                                     <BR>";
+	
+	foreach my $dll(@{$struct->{dll}}){
+		foreach my $mtestsuite(@{$dll->{testsuite}}){				
+			#if($mtestsuite->{name} eq "Wizard generated"){
+			#		next;
+			#		}
+			foreach my $testsuite(@{$mtestsuite->{testsuite}}){				
+				my($testcount)=1;						
+				print HTML_FILE "<TABLE BORDER CELLSPACING=\"2\" CELLPADDING=\"2\" WIDTH=\"80%\">\n";
+				print HTML_FILE "<CAPTION><H3><P ALIGN=Left>$testsuite->{name}</H3></CAPTION>\n";						
+				print HTML_FILE "<tr>\n";	
+				print HTML_FILE "<th>No</th>\n";
+				print HTML_FILE "<th>Name</th>\n";
+				print HTML_FILE "<th>Class</th>\n";
+				print HTML_FILE "<th>Method</th>\n";
+				print HTML_FILE "<th>Type</th>\n";
+				print HTML_FILE "<th>Result</th>\n";
+				print HTML_FILE "</tr>\n";	
+			foreach my $testcase(@{$testsuite->{testcase}}){											
+					print HTML_FILE "<tr>\n";							
+					print HTML_FILE "<td BGCOLOR=\"#CCCCCC\"><P ALIGN=Left>$testcount</td>\n";
+					print HTML_FILE "<td BGCOLOR=\"#CCCCCC\"><P ALIGN=Left>$testcase->{name}</td>\n";
+					print HTML_FILE "<td BGCOLOR=\"#CCCCCC\"><P ALIGN=left>$testcase->{class}</td>\n";
+					print HTML_FILE "<td BGCOLOR=\"#CCCCCC\"><P ALIGN=Left>$testcase->{method}</td>\n";
+					print HTML_FILE "<td BGCOLOR=\"#CCCCCC\"><P ALIGN=Left>$testcase->{type}</td>\n";
+					if($testcase->{result}->[0]->{status} eq "OK"){
+						print HTML_FILE "<TD BGCOLOR=\"#00FF00\"><P ALIGN=Left>PASS</TD>\n";		
+						$pass_count++;				
+						}
+					else{
+						print HTML_FILE "<TD BGCOLOR=\"#FF0000\"><P ALIGN=Left>FAIL</TD>\n";
+						$fail_count++;
+						}
+					print HTML_FILE "</tr>\n";	
+					$testcount++;
+					}
+				print HTML_FILE "</table>\n";
+				print HTML_FILE "<BR>\n";
+				}
+			}
+		}
+	
+	# Print ending HTML tags
+	print HTML_FILE "</body><br></html>";	
+	$total=$fail_count+$pass_count;
+	seek HTML_FILE,301,0;
+	print HTML_FILE "$total";
+	seek HTML_FILE,334,0;
+	print HTML_FILE "$pass_count";
+	seek HTML_FILE,367,0;
+	print HTML_FILE "$fail_count";
+	if($pass_count>0 && $total>0){
+		$passPercent=sprintf "%.2f", (($pass_count/$total)*100);	
+		}
+	else{
+		$passPercent=sprintf "%.2f","0.00";	
+		}
+	seek HTML_FILE,103,0;
+	print HTML_FILE "$passPercent%";		
+	close (HTML_FILE);                   # Close html
+	}
+	
+__END__
+
+:invoke_perl
+@perl -x -S EunitRunner.bat %1 %2 %3 %4 %5 %6 %7 %8 %9