tsrc/testing/tools/updateHeliumCfgs.pl
changeset 0 96612d01cf9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tsrc/testing/tools/updateHeliumCfgs.pl	Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,423 @@
+#
+# Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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: 
+#
+
+
+#------------------------------------------------------------------------------------
+# Includes
+#------------------------------------------------------------------------------------
+#use strict;
+use warnings;
+use Cwd; # for cwd
+use FindBin; # for FindBin:Bin
+use File::Path; # for mkpath
+use Date::Calc;
+
+{ # No globals.
+    # Solve where the script is located.
+    $0=~/^(.+[\\\/])[^\\\/]+[\\\/]*$/;
+    my $cgidir= $1 || "./";
+    
+    # And try to solve relative path.
+    if( index( $cgidir, "..\\" ) != -1 )
+    {
+    	my $p = cwd;
+    	$p =~ s/\//\\/g;
+    	$cgidir =~ s/\//\\/g;
+    	while(1) 
+    	{
+    		my $pos = index( $cgidir, "..\\" );
+    		last if( $pos == -1 );
+    		$cgidir = substr( $cgidir, $pos+3 );
+    		
+    		$pos = rindex( $p, "\\" );
+    		last if( $pos == -1 );
+    		$p = substr( $p, 0, $pos);
+    	}
+    	$cgidir = $p . "\\" . $cgidir;
+    }
+    
+    if ( ! -e( $cgidir . "rerunsubs.pl" ) )
+    {
+        $cgidir = cwd;
+        my $domain = "VideoApp_Domain";
+        my $pos = index( $cgidir, $domain );
+        if( $pos != -1 )
+        {
+            $cgidir = substr( $cgidir, 0, $pos + length( $domain ) ) . "\\videoplayer\\tsrc\\testing\\tools\\";
+            
+        }
+    }
+    require( $cgidir . "utils.pl" );
+}
+
+#------------------------------------------------------------------------------------
+# GLOBAL CODE
+#------------------------------------------------------------------------------------
+
+my $argcount = scalar(@ARGV);
+
+while(scalar(@ARGV) >= 1)
+{
+	my $argument = shift(@ARGV);
+
+	if($argument eq "-h")
+	{
+		Help();
+		die;
+	}
+	else  {
+        Help();
+		die;
+	}
+}
+
+sub Help
+{
+    print("\nThis script updates test cases in *Helium.cfg files. First it reads all the CFGs from the same folder and then writes new *Helium.CFG\n");
+    exit;
+}
+
+
+UpdateHeliumCfgs();
+
+exit;
+
+sub UpdateHeliumCfgs
+{
+    my @cfgFiles;
+    
+    FindFiles( ".", "Helium.cfg", 0, \@cfgFiles );
+    
+    foreach my $file ( @cfgFiles )
+    {
+        print("Updating $file.\n");
+        UpdateHeliumCfg( $file );
+    }
+}
+
+sub UpdateHeliumCfg
+{
+    my ( $fileName ) = @_;
+    
+    my $file = GetPathFileName( $fileName );
+    my $path = GetPathDir( $fileName );
+    
+    # Read the cfg.
+	open(FILE_HANDLE, $fileName) or die ("ERROR! Could not open file $fileName\n");
+	my @heliumCfgLines = <FILE_HANDLE>;
+	close(FILE_HANDLE);    
+
+    # Find all cases in the cfg.
+    my @heliumCases;
+
+    foreach my $line ( @heliumCfgLines )
+    {
+        if( $line =~ m/^title /i )
+        {
+            push @heliumCases, ( $line );
+        }
+    }
+    
+    # Get all cfgs in same dir as the Helium cfg.
+    my @cfgs;
+    FindFiles( $path, ".cfg", 0, \@cfgs );
+    
+    # Get all cfgs that have cases in Helium cfg.
+    my @cfgsWithHeliumCases;
+    
+    foreach my $cfg ( @cfgs )
+    {
+        # Do not read cases again from helium cfg.
+        next if( $cfg =~ /helium\.cfg/i );
+        
+        my $cfgHasCasesForHelium = 0;
+        
+        foreach my $heliumCase ( @heliumCases )
+        {
+            if( CfgHasCase( $cfg, $heliumCase ) )
+            {
+                $cfgHasCasesForHelium = 1;
+                last;
+            }
+        }
+        
+        if( $cfgHasCasesForHelium )
+        {
+            push @cfgsWithHeliumCases, ( $cfg );
+        }
+    }
+    
+    # Read cases, defs and subs 
+    my @cfgDefsAndIncludes;
+    my @cfgSubs;
+    my @cfgCases;
+
+    foreach my $cfg ( @cfgsWithHeliumCases )
+    {
+        print("Reading: " . GetPathFileName($cfg) . "\n");
+        ReadCfgDefs( $cfg, \@cfgDefsAndIncludes );
+        ReadCfgSubs( $cfg, \@cfgSubs );
+        ReadCfgCases( $cfg, \@cfgCases, \@heliumCases );
+    }
+    
+    # Write the helium CFG.
+    open(FILE_HANDLE, ">$fileName") or die("Could not write into file $fileName\n");
+    
+    # Write everything from helium CFG before the first defs.
+    foreach my $line ( @heliumCfgLines )
+    {
+        if( $line =~ m/\[Define\]/ )
+        {
+            last; 
+        }
+        print FILE_HANDLE ( $line );
+    }
+    
+    # Write defs, includes and subs.
+    print FILE_HANDLE ( @cfgDefsAndIncludes );
+    print FILE_HANDLE ( "\n" );
+    print FILE_HANDLE ( @cfgSubs );
+    print FILE_HANDLE ( "\n" );
+    
+    # Write cases, in same order as they were.
+    foreach my $heliumCase ( @heliumCases )
+    {
+        my $caseFound = 0;
+        
+        foreach my $refCase ( @cfgCases )
+        {
+            if( @$refCase[0] eq $heliumCase )
+            {
+                my $refCaseLines = @$refCase[1];
+                print FILE_HANDLE ( @$refCaseLines );
+                $caseFound = 1;
+                last;
+            }
+        }
+        
+        if( $caseFound )
+        {
+            print FILE_HANDLE ( "\n" );
+        }
+        else
+        {
+            print(" - the cfg has following case but it was not found from other CFGs: $heliumCase\n");
+        }
+    }
+    
+    close( FILE_HANDLE );
+}
+
+sub CfgHasCase
+{
+    my ( $cfgFileName, $case ) = @_;
+    
+	open(FILE_HANDLE, $cfgFileName) or die ("ERROR! Could not open file $cfgFileName\n");
+	my @lines = <FILE_HANDLE>;
+	close(FILE_HANDLE);    
+	
+	foreach my $line ( @lines )
+	{
+	    if( $line =~ m/$case/i )
+	    {
+	        return 1;
+	    }
+	}	
+	return 0;
+}
+
+sub ReadCfgDefs
+{
+    my ( $cfgFileName, $refDefsAndIncludes ) = @_;
+    
+	open(FILE_HANDLE, $cfgFileName) or die ("ERROR! Could not open file $cfgFileName\n");
+	my @lines = <FILE_HANDLE>;
+	close(FILE_HANDLE);    
+
+	my $readLines = 0;
+	foreach my $line ( @lines )
+	{
+	    # Defs starts here.
+	    if( $line =~ m/\[Define\]/ )
+	    {
+	        $readLines = 1;
+	    }
+	    
+	    # Reading the defs.
+	    if( $readLines )
+	    {
+	        my $alreadyHaveThisLine = 0;
+	        
+	        # Check if we got the line already.
+	        foreach my $defLine ( @$refDefsAndIncludes )
+	        {
+	            if( $defLine eq $line )
+	            {
+	                $alreadyHaveThisLine = 1;
+	            }
+	        }
+	        
+	        # If not, save it.
+	        if( !$alreadyHaveThisLine )
+	        {
+	            print(" - Def: $line");
+	            push @$refDefsAndIncludes, ( $line );
+	        }
+	    }
+	    
+	    # End of defs.
+	    if( $line =~ m/\[Enddefine\]/ )
+	    {
+	        return;
+	    }
+	}
+}
+
+sub ReadCfgSubs
+{
+    my ( $cfgFileName, $refSubs ) = @_;
+    
+	open(FILE_HANDLE, $cfgFileName) or die ("ERROR! Could not open file $cfgFileName\n");
+	my @lines = <FILE_HANDLE>;
+	close(FILE_HANDLE);
+	
+	my $inSub = 0;
+	foreach my $line ( @lines )
+	{
+	    # A sub function starts here.
+	    if( $line =~ m/\[Sub/ )
+	    {
+	        $inSub = 1;
+            # Check if we got it already.
+	        foreach my $subLine ( @$refSubs )
+	        {
+	            if( $subLine =~ m/\[Sub/ && $subLine eq $line )
+	            {
+	                $inSub = 0; # Sub with same name has been already read.
+	                last; # Breakout from checking.
+	            }
+	        }
+	        if( $inSub )
+	        {
+	            print(" - Sub: $line");
+	        }
+	    }
+	    
+	    # Reading sub.
+	    if( $inSub )
+	    {
+	        push @$refSubs, ( $line );
+	    }
+	    
+	    # Sub ends here.
+	    if( $line =~ m/\[EndSub\]/ )
+	    {
+	        $inSub = 0;
+	    }
+	}
+}
+
+sub ReadCfgCases
+{
+    my ( $cfgFileName, $refCases, $refCasesToRead ) = @_;
+    
+	open(FILE_HANDLE, $cfgFileName) or die ("ERROR! Could not open file $cfgFileName\n");
+	my @lines = <FILE_HANDLE>;
+	close(FILE_HANDLE);
+	
+	my $inCase = 0;
+	my @caseLines;
+	my $caseTitle;
+
+	foreach my $line ( @lines )
+	{
+	    # Case starts here.
+	    if( $line =~ m/\[Test\]/ )
+	    {
+	        undef( @caseLines );
+	        $caseTitle = "";
+	        $inCase = 1;
+	    }
+	    
+	    # Found title for the case.
+	    if( $line =~ m/^title / )
+	    {
+	        $caseTitle = $line;
+	    }
+	    
+	    # Save case lines.
+	    if( $inCase )
+	    {
+	        push @caseLines, ( $line );
+	    }
+	    
+	    # End of test case.
+	    if( $line =~ m/\[Endtest\]/ )
+	    {
+	        $inCase = 0;
+	        
+	        # Was the case in list of cases to read.
+	        foreach my $heliumCases ( @$refCasesToRead )
+	        {
+	            if( $caseTitle eq $heliumCases )
+	            {
+    	            print(" - Case: $caseTitle");
+
+	                # Yes, save it.
+	                my @case;
+	                $case[0] = $caseTitle;
+	                $case[1] = [ @caseLines ];
+	                push @$refCases, [ @case ];
+	            }
+	        }
+	    }
+	}
+}
+
+sub FindFiles
+{
+	my ($godir, $fileSearch, $searchType, $refIncfiles) = @_;
+
+	my $startDir = cwd;
+
+	chdir($godir);
+
+	#print("Now in: " . cwd . "\n");
+
+	opendir(DIR, ".");
+	my @filelist = sort(readdir(DIR));
+	closedir(DIR);
+
+	foreach my $file(@filelist)
+	{
+		if($file eq "." or $file eq "..") {next};
+
+		if (-d $file)
+		{
+		 	FindFiles( $file, $fileSearch, $searchType, $refIncfiles);
+		} else
+		{
+			if( ($file =~ m/$fileSearch/i and $searchType == 0 ) or ($file =~ m/$fileSearch$/i and $searchType == 1 ) )
+			{
+                $file = cwd . "/" . $file;
+				push @$refIncfiles, $file;
+				#print("$file\n");
+			}
+		}
+	}
+
+	chdir ($startDir);
+}