diff -r 33a5d2bbf6fc -r 73a1feb507fb tsrc/unittestrunner/unittest_qt.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/unittestrunner/unittest_qt.pl Tue Aug 31 15:12:07 2010 +0300 @@ -0,0 +1,442 @@ +# +# Copyright (c) 2009 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: +# +#!/usr/bin/perl + +use File::Copy; +use Cwd; +use Getopt::Long; +use XML::Parser::Expat; +use Data::Dumper; + +#---------------------------------------Initialization------------------------------------------------------# + +$projectrootname = "/"; #is set to correct at run-time +$projectdrive = "z:"; #is set to correct at run-time + +$unitTestRunner = "unittest_qt.pl"; +$scriptLocation = "mmsharinguis/tsrc/unittestrunner"; +$coverageResultsDirDefault = "mmsharinguis/tsrc/unittestrunner/qtresults/"; +$testConfigDefault = "unittest_qt_config.txt"; +$qtProFileDefault = "tsrc.pro"; +$buildResults = "BuildResults.txt"; +$coverageDat = "MON.dat"; +$coverageSymbols = "MON.sym"; +$coverageProfile = "profile.txt"; + +$coverageResultsFile = "CTCHTML/index.html"; +$finalResultsFile = "AllResults.html"; +$cssFile = "CTCHTML/ctc.css"; +$cssLink = " \$param_noclean, + "config:s" => \$testConfig, + "pro:s" => \$qtProFile, + "results:s" => \$coverageResultsDir, + "help" => \$help); + +$startdir = cwd; + +if (defined $help){ + print_help(); + exit; +} + +findProjectDriveAndRoot(); + +createResultsDir(); + +# set target for intrumentation result +$ENV{'CTC_DATA_PATH'}= "$coverageResultsDir"; + +doClean(); + +parseConfigFile(); + +buildTests(); + +runTests(); + +chdir($startdir); + +# create textual output +chdir("$coverageResultsDir"); +doSystemCall("ctcpost $coverageSymbols $coverageDat -p $coverageProfile -T 70"); +doSystemCall("ctc2html -i $coverageProfile -t 70"); + +# clear target for intrumentation result +$ENV{'CTC_DATA_PATH'}= ""; + +combineResults(); + +chdir($startdir); + +#---------------------------------------Main Ends-------------------------------------------------------------# + +# ----------------------------------------------------------------------------- +# +# ----------------------------------------------------------------------------- +# +sub findProjectDriveAndRoot() +{ + $tempStartDir = $startdir; + if ($tempStartDir =~ m/$scriptLocation/){ + # extract project root + for ($tempStartDir) { + s/$scriptLocation+$//; + } + # divide it to drive and root + if ($tempStartDir =~ /^(.:)(.*)/){ + $projectdrive = $1; + $projectrootname = $2; + } + print "project drive: $projectdrive \n"; + print "project root: $projectrootname \n"; + } + else{ + print "cannot determine project drive and root, use defaults!\n"; + } +} + +# ----------------------------------------------------------------------------- +# +# ----------------------------------------------------------------------------- +# +sub createResultsDir() +{ + # create directory for results + if ( defined $coverageResultsDir ){ + if ($coverageResultsDir =~ /^(.:)/){ + print("Drive name given in results dir arg\n"); + } + else{ + $coverageResultsDir = "$projectdrive" . "/" . "$coverageResultsDir"; + } + } + else{ + $coverageResultsDir = "$projectdrive$projectrootname$coverageResultsDirDefault"; + } + print ("Writing results to $coverageResultsDir \n\n"); + if (mkdir("$coverageResultsDir", 0755)){ + print("The results directory was created successfully! \n"); + } + else { + print("The results directory already exists. \n"); + } +} + +# ----------------------------------------------------------------------------- +# +# ----------------------------------------------------------------------------- +# +sub doClean() +{ + if (!defined $param_noclean) + { + # clear previous results + print("Cleaning previous results. \n"); + unlink("$coverageResultsDir$buildResults"); + unlink("$coverageResultsDir$coverageDat"); + unlink("$coverageResultsDir$coverageSymbols"); + unlink("$coverageResultsDir$coverageProfile"); + unlink("$coverageResultsDir$finalResultsFile"); + } +} + +# ----------------------------------------------------------------------------- +# +# ----------------------------------------------------------------------------- +# +sub parseConfigFile() +{ + if ( !defined $testConfig ){ + print("Config file not defined, using default. \n"); + $testConfig = $testConfigDefault; + } + + open(CONFIG, $testConfig) or die("file $testConfig not found!\n"); + + @config_file_content = ; + + + for ($j = 0; $j <= $#config_file_content; $j++) + { + # remove \n from each line + $currline = @config_file_content[$j]; + for ($currline) { + s/\n+$//; + } + @{ $testNamesAndLogFiles [$j] } = split( ",", $currline ); + } + + print Dumper( @testNamesAndLogFiles ); + + close(CONFIG); +} + +# ----------------------------------------------------------------------------- +# +# ----------------------------------------------------------------------------- +# +sub buildTests() +{ + if ( !defined $qtProFile ){ + print("Pro file not defined, using default. \n"); + $qtProFile = $qtProFileDefault; + } + doSystemCall( "qmake $qtProFile" ); + doSystemCall( "sbs reallyclean" ); + doSystemCall( "qmake $qtProFile" ); + + $exclude = "-C \"EXCLUDE+*\tsrc\*\" -C \"EXCLUDE+*/*/tsrc/*\" -C \"EXCLUDE+*/*/*/tsrc/*\" -C \"EXCLUDE+moc_*\""; + + doSystemCall( "call ctcwrap -i d -n $coverageResultsDir$coverageSymbols $exclude -2comp sbs.bat -c winscw_udeb" ); +} + +# ----------------------------------------------------------------------------- +# +# ----------------------------------------------------------------------------- +# +sub runTests() +{ + for $i ( 0 .. $#testNamesAndLogFiles ) { + $testName = $testNamesAndLogFiles[$i][0]; + print("Running tests for: $testName\n"); + + $testCall = "\\epoc32\\release\\winscw\\udeb\\" . $testName . " -xml"; + doSystemCall( $testCall ); + + for $j ( 1 .. $#{ $testNamesAndLogFiles [$i] } ) { + $logFile = $projectdrive . "\\epoc32\\winscw\\c\\" . $testNamesAndLogFiles[$i][$j]; + print("Copying log file: $logFile\n"); + copy( $logFile, "$coverageResultsDir" ); + } + } +} + +# ----------------------------------------------------------------------------- +# +# ----------------------------------------------------------------------------- +# +sub combineResults() +{ + open(COVERAGE, "$coverageResultsDir$coverageResultsFile") or die("file $coverageResultsFile not found!\n"); + @coverageFileContent = ; + + # append coverage information after eunit results + + for ($j = 0; $j <= $#coverageFileContent; $j++){ + $currentLine = @coverageFileContent[$j]; + + if ($currentLine =~ /$cssLink/){ + if ( open(CSSFILE, "$coverageResultsDir$cssFile") ){ + # append css styles to results html + $outputString .= "\n"; + close(CSSFILE); + } + } + else{ + $outputString .= $currentLine; + + if ($currentLine =~ /$outputFileBodyStart/){ + $outputString .= parseXmlResults(); + $outputString .= "

" + } + } + } + + open(NEWRESULTSFILE, "> $coverageResultsDir$finalResultsFile") or die "Cannot open final results file\n"; + print NEWRESULTSFILE "$outputString"; + close(NEWRESULTSFILE); + close(OUTPUT); + close(COVERAGE); +} + +# ----------------------------------------------------------------------------- +# +# ----------------------------------------------------------------------------- +# +sub parseXmlResults() +{ + $qtestOutputString = "QTestLib Results

\n"; + + + for $i ( 0 .. $#testNamesAndLogFiles ) { + $testName = $testNamesAndLogFiles[$i][0]; + + for $j ( 1 .. $#{ $testNamesAndLogFiles [$i] } ) { + $logFile = $testNamesAndLogFiles[$i][$j]; + if ( -e "$coverageResultsDir$logFile" ){ + print("Parsing: $logFile\n"); + open(TESTRESULTS, "$coverageResultsDir$logFile"); + $parser = new XML::Parser::Expat; + $parser->setHandlers('Start' => \&sh, + 'End' => \&eh, + 'Char' => \&ch); + + $totalCount = 0; + $passedCount = 0; + $failedCount = 0; + eval{ + ### try block + $parser->parse(*TESTRESULTS); + }; + if ($@){ + ### catch block + print("$logFile, parsing failed\n"); + $qtestOutputString .= "$logFile parsing failed, testcase execution might have failed
\n"; + }; + close(TESTRESULTS); + + } + else{ + + print("$logFile, not found\n"); + $qtestOutputString .= ""; + $qtestOutputString .= "$testName => "; + $qtestOutputString .= "$logFile not found, testcase building might have failed
\n"; + } + } + } + + return $qtestOutputString; +} + +# ----------------------------------------------------------------------------- +# +# ----------------------------------------------------------------------------- +# +sub sh +{ + my ($p, $el, %atts) = @_; + if ( $el eq $xmlDllLine ) + { + $qtestOutputString .= ""; + $dllName = %atts->{name}; + @dllNameParts = split m!(\\)!, $dllName; + $dllName = $dllNameParts[$#dllNameParts]; + $qtestOutputString .= "$dllName => "; + } + + if ( $el eq $xmlResultLine ) + { + $status = %atts->{type}; + if ( $status eq $xmlCasePassed ) + { + $passedCount++; + } + else + { + $failedCount++; + } + } +} + +# ----------------------------------------------------------------------------- +# +# ----------------------------------------------------------------------------- +# +sub eh +{ + my ($p, $el) = @_; + if ( $el eq $xmlDllLine ) + { + $totalCount = $passedCount + $failedCount; + if ( $failedCount > 0 || $totalCount == 0 ) + { + $qtestOutputString .= "Testcases passed/run: $passedCount/$totalCount
\n"; + } + else + { + $qtestOutputString .= "Testcases passed/run: $passedCount/$totalCount
\n"; + } + $passedCount = 0; + $failedCount = 0; + } +} + +# ----------------------------------------------------------------------------- +# +# ----------------------------------------------------------------------------- +# +sub ch +{ + my ($p, $el) = @_; + #print ("$el\n"); +} + +# ----------------------------------------------------------------------------- +# +# ----------------------------------------------------------------------------- +# +sub doSystemCall +{ + #print("\nDoing system call: $_[0]\n"); + #system($_[0]); + system("echo Doing system call: $_[0] >> $coverageResultsDir$buildResults"); + system("$_[0] >> $coverageResultsDir$buildResults 2>&1"); +} + +# ----------------------------------------------------------------------------- +# +# ----------------------------------------------------------------------------- +# +sub print_help +{ + print("\n*************************************************************\n\n"); + print("Script runs by default all multimediasharing qt tests\n"); + print("and creates build, test and coverage results to:\n\n"); + print(" mmsharing/src/internal/unittestrunner/qtresults/\n\n"); + print("Own configuration file (list of components to be processed)\n"); + print("can be used as well:\n\n"); + print(" >unittest_ctc.pl -config=myowntestcomponents.txt\n\n"); + print("The text file should follow the syntax of default configuration file\n"); + print("mmsharing/src/internal/unittestrunner/unittest_qt_config.txt\n\n"); + print("When running just some set of components you might want to \"merge\" the results"); + print("with existing coverage results.\n"); + print("That is possible with command:\n\n"); + print(" >unittest_ctc.pl -eunitdlls=myowneunitcomponents.txt -noclean\n"); + print("\n*************************************************************\n"); +}