diff -r 000000000000 -r ba25891c3a9e installationservices/switestfw/test/autotesting/cdrive.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/installationservices/switestfw/test/autotesting/cdrive.pl Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,363 @@ +# +# Copyright (c) 2006-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: +# Created by Relja Arandjelovic +# relja.arandjelovic@symbian.com +# Used to check for occurrences of "C: , EDriveC and []='C' and report warnings about it into HTML file +# USAGE: +# cdrive.pl -exclude=exclude.txt -excludedir=/common/generic/security/caf2/ -log=logfilename.htm path1 path2 ... +# log is created in $ENV{EPOCROOT}epoc32\\winscw\\c\\ +# add -mytest option if the log should be stored in the execution directory +# (for example, if you are not using the script during overnight builds) +# exclude contains items formated as as follows (new line corresponds to new line in file): +# filename +# line content +# comment about why the warning should be excluded (may be in several lines, but with no line with only whice characters) +# line with only white characters +# NB: paths in cdrive.pl argumetns and filename in exclude list should be absolute paths +# + +use strict; +use Getopt::Std; +use Getopt::Long; +use File::Find; + +my @ListOfFiles=(); +my @FileIsTest=(); +my $nTests=0; +my %Exclude=(); + +my $exclude=""; +my $excludedir="_no_dir_"; +my $LogFileName=""; + + + +################ +######## +sub TypeOfWarning($$$$){ + my ($FileName,$FileIsTest,$linetext,$Warning)=@_; + + $linetext=~ s/^\s*//; $linetext=~ s/\s*$//; + + $$Warning="warning"; + + if ($FileIsTest==1){ + $$Warning="test"; + } else { + # check if in include list + + my $ExcludeLine; + foreach $ExcludeLine (@{$Exclude{$FileName}}){ + if ($linetext eq $ExcludeLine) { + $$Warning="ignoredwarning"; + last; + } + } + } + +} + + + +################ +######## + + +my $FirstWarning=1; +my $PrevFileName="_no_file_"; + +sub printHTML($$$$){ + my ($FileName,$linenumber,$linetext,$Warning)=@_; + + + $linetext=~ s/^\s*//; $linetext=~ s/\s*$//; + + # convert special characters to HTML format + $linetext=~ s/&/&/sg; + $linetext=~ s//>/sg; + + + if ($FileName ne $PrevFileName){ + print HTML " +  + + $FileName + +"; + } + + print HTML " +  + + Line number: $linenumber + + +$linetext + +"; + + $PrevFileName=$FileName; + $FirstWarning=0; +} + +################ +######## +my $prevDir="_no_previous_dir_"; +my $isTest=0; + +sub MakeList(){ + + + if (lc($File::Find::dir) =~ /^$excludedir/) { return; } + if (lc($File::Find::dir) =~ /test/i) { return; } + if (lc($File::Find::dir) =~ /examples/i) { return; } + if (lc($File::Find::dir) =~ /tpkcs10/i) { return; } + if (lc($File::Find::dir) =~ /tocsp/i) { return; } + if (lc($File::Find::dir) =~ /dumpswicertstoretool/i) { return; } + if (!(lc($File::Find::name) =~ /\.(cpp|cxx|c\+\+|c|h)$/)){ return; } + + # include in list of files to be searched only if not test code + # ie distribution policy doesn't include Reference/Test + if ($prevDir ne lc($File::Find::dir)){ # new dir => search for distribution.policy + $isTest=0; + my $policy="".($File::Find::dir)."/distribution.policy"; + + if (-e $policy){ + open (POLICY , "<$policy" ); + while (){ + if ($_ =~ /Reference\/Test/){ + $isTest=1; + last; + } + } + close (POLICY); + } + } + + push(@ListOfFiles,lc($File::Find::name)); + push(@FileIsTest,$isTest); + if ($isTest) { $nTests++; } + + $prevDir=lc($File::Find::dir); +} + +################ +######## +sub FindC($$$$){ + my ($FileName,$FileIsTest,$count,$countunique)=@_; + + open(SOURCE,"<$FileName") or die ("Could not open file: $FileName"); + + my $prevCount=$$count; + my $line; my $templine; my $linenumber=1; + my $MultiLineComment=0; + my $MadeChangeDueToComments; + my $FirstLine=0; + + my $HTMLFirstWarning=1; + + while ($line=){ + + $templine=$line; + $linenumber++; + $FirstLine=0; + + # process comments + do { + + $MadeChangeDueToComments=0; + + if ($MultiLineComment==0){ + + # remove text in // coments + $templine=~ s/(.*?)\/\/.*$/$1/; + # remove /* */ comments found in one line + $templine=~ s/\/\*.*\*\///g; + + # if only /* then remove text after it and mark the start of comment + if ($templine=~ /^(.*?)\/\*/){ + $templine=$1; + $MultiLineComment=1; + $MadeChangeDueToComments=1; + $FirstLine=1; + } + + } else { # $MultiLineComment==1 + + # if */ end comment + if ($templine=~ /\*\/(.*)$/){ + $templine=$1; + $MultiLineComment=0; + $MadeChangeDueToComments=1; + } + + } + + } while ($MadeChangeDueToComments==1); + # end of processing comments + + + if ($MultiLineComment==1 && $FirstLine==0) { next; } # skip checking if in comment + + + if ( + $templine=~ /["'][cC]:/ || # '" # need comment for correct highlighting in codewarrior + $templine=~ /EDriveC/ || + $templine=~ /\[.+\]\s*=\s*'[cC]':/ + ){ + + my $Warning; + TypeOfWarning($FileName,$FileIsTest,$line,\$Warning); + printHTML($FileName,$linenumber,$line,$Warning); + if ($Warning eq "warning") { $$count++; } + + } + + } + + close(SOURCE); + + if ($prevCount<$$count) { $$countunique++; } +} + +################ +######## +sub ReadExcludeList(){ + + #print "\n"; + + + if ($exclude eq ""){ + #print "Exclude list file not specified\nCarrying on without an exclude list\n"; + return; + } elsif (!(-e $exclude)){ + #print "Exclude list file doesn't exist!\nCarrying on without an exclude list\n"; + return; + } + + + my $line; my $FileName; my $LineText; my $justification; + + open (EXCLUDE,"<$exclude"); + while (1){ + + $line= or last; + $line=~ s/^(\s*)//g; $line=~ s/(\s*)$//g; + $line=~ s/\\/\//g; + $FileName=lc($line); + + $line=; $line=~ s/^(\s*)//g; $line=~ s/(\s*)$//g; + $LineText=$line; + + $justification=0; + while($line=){ + $line=~ s/^(\s*)//g; $line=~ s/(\s*)$//g; + if ($line eq "") { last;} + $justification=1; + } + + if ($justification==0){ + #print "Not added to the excludion list since no justification found for:\n$FileName\n$LineText\n"; + } else { + push(@{$Exclude{$FileName}},$LineText); + } + + } + close(EXCLUDE); + +} + +################ +######## Main + + + my $MyTest=0; + + GetOptions( + "exclude=s" => \$exclude , + "excludedir=s" => \$excludedir, # one dir to be excluded from scaning (along wih its subdirs) + "log=s" => \$LogFileName, + "mytest" => \$MyTest # inteded for my personal testing (so that path is not the one for overnight testing) + ); + + $excludedir=~ s/\\/\//g; # convert \ into / so that it matches perl's path form + + ReadExcludeList(); + + + if ($MyTest==0){ # overnight + $LogFileName = "$ENV{EPOCROOT}epoc32\\winscw\\c\\".$LogFileName; + } + + + my $iArgv; + for ($iArgv=0;$iArgv<@ARGV;$iArgv++){ + $ARGV[$iArgv]=~ s/\\/\//g; # convert \ into / so that it matches perl's path form + find(\&MakeList, ($ARGV[$iArgv]) ); + } + + + open(HTML,">$LogFileName"); + print HTML " + + + + CDrive warnings + + + + + +"; + + + my $count=0; my $countunique=0; + my $iList; my $nList=@ListOfFiles; + for ($iList=0;$iList<$nList;$iList++){ + FindC($ListOfFiles[$iList],$FileIsTest[$iList],\$count,\$countunique); + } + + + print HTML "\n
\n"; + + my $total=$nList-$nTests; + # workaround in order to be reported to the standardised system + print HTML "
$countunique tests failed out of $total\n
\n"; + + print HTML " + + + "; + + #print "\n\tNumber of files:\t$nList\n"; + #print "\n\tNumber of warnings:\t$count\n"; + #print "\n\tNumber of unique warnings:\t$countunique\n"; + + close(HTML); + +################ +######## end-Main +