appfw/uiftestfw/src/appfwk_tmsteststep.cpp
author William Roberts <williamr@symbian.org>
Fri, 23 Apr 2010 14:37:17 +0100
branchRCL_3
changeset 22 c82a39b81a38
parent 0 2e3d3ce01487
permissions -rw-r--r--
Rework addition of Symbian splash screen to reduce the source impact (uses SVG from Bug 2414) Notes: by using the OPTION SOURCEDIR parameter in the mifconv extension instructions, I can arrange to use the same source file name in sfimage, without having to export over the original Nokia file. This means that the name inside splashscreen.mbg is the same, which removes the need for the conditional compilation in SplashScreen.cpp, and gets rid of sf_splashscreen.mmp.

/*
* Copyright (c) 2008 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:
*
*/


/**
@file
@test
@internalComponent
*/

#include <bautils.h>
#include <test/appfwk_tmsteststep.h>
#include "f32file.h"
#include <e32std.h>


_LIT(KLogLocation,"c:\\logs\\testexecute\\TMS_Log.txt");
_LIT8(KLogPass," PASS");
_LIT8(KLogFail," FAIL");
_LIT8(KRet, "\n");
_LIT8 (KBlankSpace," ");

// Special notes about using this class
//
// In any derived CTxxxxStep class after the __CONSTRUCT_STEP__(xxxx) macro (generally at the end of the file)
// if the methods void CTxxxxxStep::TestSetupL() and void CTxxxxStep::TestClose() do not exist
// they should be added as follows :-
//
//	void CTxxxxStep::TestSetupL()
//		{
//		MultipleResultsForSameID(ETrue); // true or false set on test requirements
//		}
//
//	void CTxxxxStep::TestClose()
//		{
//		iTestStepNames.Close();
//		}
//
// if the methods do already exist add the MultipleResultsForSameID and iTestStepNames.Close lines to them respectivly
//

TInt CTmsTestStep::ReadNextLineL( RFile &aFile, TDes8 &aLine )
// read a cr/lf limiited line from the file,  assumes file is a valid file
// and that aLine is of sufficient length to hold the data
	{
	aLine.Zero();
	TBuf8<1> chr;
	for (;;)
		{
		aFile.Read(chr);
		if ( chr.Length() == 0 )
			{
			break;
			}
		if (chr.CompareF(KRet) == 0)
			{
			// got a line, exctract newline as well
			aFile.Read(chr);
			break;
			}
		else
			{
			aLine.Append(chr);
			}
		}

	return aLine.Length();
	}

void CTmsTestStep::CleanUpAndWriteResults()
	{
	RFs fs;
	fs.Connect();
	CleanupClosePushL(fs);

	iTestStepPositions.Close();
	if (iTestStepNames != NULL)
		{
		iTestStepNames->Reset();
		delete iTestStepNames;
		iTestStepNames = NULL;

		if (BaflUtils::FolderExists(fs, KLogLocation))
		   	{
			RFile file;
			if (BaflUtils::FileExists( fs, KLogLocation ))
				{
				// open the temporary tms log
				TInt err = file.Open( fs, KLogLocation, EFileRead|EFileShareAny);
			    if(err == KErrInUse)
			    	{
			       	CleanupStack::PopAndDestroy();
			       	return;
				   	}
			    if (err == KErrNone)
			    	{
			    	CleanupClosePushL(file);
			    	TBuf8<256> line;
			    	TBuf<250> testID;
			    	TBuf<6> testResult;
			    	// get a line from the temporary tms log
			    	while (CTmsTestStep::ReadNextLineL(file,line))
			    		{
			    		TInt blankPos = line.Find(KBlankSpace);

			    		// get the ID from the line
			    		testID.Copy(line.Left(blankPos));

			    		//get the pass or fail result from the line
			    		testResult.Copy(line.Mid(blankPos+1,4));

			    		// print into the standard tef log the id and the result in the correct format
			    		// so that they are correctly parsed into the TMS csv file
			    		INFO_PRINTF2(_L("START_TESTCASE %S"),&testID);
			    		INFO_PRINTF2(_L("Line = 1 Command = START_TESTCASE %S"),&testID);
			    		INFO_PRINTF2(_L("END_TESTCASE %S"),&testID);
			    		INFO_PRINTF3(_L("Line = 1 Command = END_TESTCASE %S ***TestCaseResult = %S"),&testID,&testResult);
			    		}
			    	CleanupStack::PopAndDestroy();
			    	}
			    // remove the temporary tms log
			    fs.Delete(KLogLocation);
			    }
			}
		}
	CleanupStack::PopAndDestroy();
	}

EXPORT_C CTmsTestStep::CTmsTestStep() : iStepPassFail(ETrue), iShowMultipleResults(EFalse)
	{
	iCurrentTestStepName.Copy(KUnknownSYMTestCaseIDName);
	iTestStepNames=new CDesCArrayFlat(1);
	RFs fs;
	fs.Connect();
	CleanupClosePushL(fs);
	if (BaflUtils::FolderExists(fs, KLogLocation))
		   {
		   if (BaflUtils::FileExists( fs, KLogLocation ))
			   {
			   // remove the temporary tms log
			   fs.Delete(KLogLocation);
			   }
		   }
	CleanupStack::PopAndDestroy();
	}

EXPORT_C void CTmsTestStep::CloseTMSGraphicsStep()
	{
	CTmsTestStep::CleanUpAndWriteResults();

	}

EXPORT_C CTmsTestStep::~CTmsTestStep()
	{
	CTmsTestStep::CleanUpAndWriteResults();
	}

// writes out the results of a test that has just been executed to the log file(s)
// the first time a test result is written it is also added to the iTestStepNames array.
// This array is then checked on subsequent tests to see if the test has already been written to log
// if it has and multiple test results are not wanted further logging of this test is omitted.


void CTmsTestStep::DebugLogL(const TDesC8& aTestCaseID, const TDesC8& aResult, TInt aPos = -1)
	{
    TInt pos = 0;
	RFs fs;
	fs.Connect();
	CleanupClosePushL(fs);

	if (BaflUtils::FolderExists(fs, KLogLocation))
	   {
		RFile file;
		if (!BaflUtils::FileExists( fs, KLogLocation ))
			{
		    User::LeaveIfError( file.Create( fs, KLogLocation, EFileWrite|EFileShareAny));
			}
		else
			{
		    TInt err = file.Open( fs, KLogLocation, EFileWrite|EFileShareAny);
		    if(err == KErrInUse)
			   {
		       CleanupStack::PopAndDestroy();
			   return;
			   }
		    if (aPos == -1)
		    	file.Seek(ESeekEnd, pos);
		    else
		    	file.Seek(ESeekCurrent, aPos);
	        }
			file.Write(aTestCaseID);
			file.Write(aResult);
			file.Write(_L8("\r\n "));
			file.Flush();
			file.Close();
	   }
		CleanupStack::PopAndDestroy();
	}

TInt CTmsTestStep::DebugLogPosL()
	{
    TInt pos = 0;
    TInt pos1 = 0;
	RFs fs;
	fs.Connect();
	CleanupClosePushL(fs);

	if (BaflUtils::FolderExists(fs, KLogLocation))
	   {
		RFile file;
		if (!BaflUtils::FileExists( fs, KLogLocation ))
			{
		    User::LeaveIfError( file.Create( fs, KLogLocation, EFileWrite|EFileShareAny));
			}
		else
			{
		    TInt err = file.Open( fs, KLogLocation, EFileWrite|EFileShareAny);
		    if(err == KErrInUse)
			   {
		       CleanupStack::PopAndDestroy();
			   return KErrGeneral;
			   }
		    file.Seek(ESeekEnd, pos);
		    file.Seek(ESeekCurrent, pos1);
		    file.Close();
	        }


	   }
	   CleanupStack::PopAndDestroy();
	   return pos1;
	}

EXPORT_C void CTmsTestStep::RecordTestResultL()
	{
	TBuf<64> unknownTMSID(KUnknownSYMTestCaseIDName);
	TBuf8<64> unknownID8;
	unknownID8.Copy(unknownTMSID);

	TBuf<64> undefinedTMSID(KUndefinedSYMTestCaseIDName);
	TBuf8<64> undefinedID8;
	undefinedID8.Copy(undefinedTMSID);

	TBuf<64> notaTMSID(KNotATestSYMTestCaseIDName);
	TBuf8<64> notaID8;
	notaID8.Copy(notaTMSID);

	TBuf<128> currentTSName;
	currentTSName.Copy(iCurrentTestStepName);

	if (iCurrentTestStepName.Compare(unknownID8) == 0) 	// unknown tests logged to warning file
		{
		INFO_PRINTF1(_L("ID NOT SET"));
		}
	else if (iCurrentTestStepName.Compare(undefinedID8) == 0)	// undefined tests logged to warning file
		{
		INFO_PRINTF1(_L("ID UNDEFINED"));
		}
	else if (iCurrentTestStepName.Compare(notaID8) == 0)
		{
		}
	else if(iShowMultipleResults)	// multiple results for same test should be logged
		{
		if( iStepPassFail == EFalse)
			{
			INFO_PRINTF2(_L("%S FAILED"), &currentTSName );
			DebugLogL(iCurrentTestStepName, KLogFail);
			}
		else
			{
			INFO_PRINTF2(_L("%S PASSED"), &currentTSName );
			DebugLogL(iCurrentTestStepName, KLogPass);
			}
		}
	else if (!iShowMultipleResults)
		{
		TInt existsInArray;
		if (iTestStepNames == NULL)
			iTestStepNames=new CDesCArrayFlat(1);

		if( iTestStepNames->Find(currentTSName,existsInArray) == 0)
			{
			if( iStepPassFail == EFalse)
				{
					INFO_PRINTF2(_L("%S FAILED"), &currentTSName );
					DebugLogL(iCurrentTestStepName, KLogFail, iTestStepPositions[existsInArray] );
				}
			}
		else
			{
			iTestStepPositions.AppendL(DebugLogPosL());
			iTestStepNames->AppendL(currentTSName);

			if( iStepPassFail == EFalse)
				{
					INFO_PRINTF2(_L("%S FAILED"), &currentTSName );
					DebugLogL(iCurrentTestStepName, KLogFail );
				}
				else
				{
					INFO_PRINTF2(_L("%S PASSED"), &currentTSName );
					DebugLogL(iCurrentTestStepName, KLogPass);
				}
			}
		}
	}

// sets the name and pass/fail state of the individual test that is about to be executed
EXPORT_C void CTmsTestStep::SetTestStepID(const TDesC& aStepName)
	{
	iCurrentTestStepName.Copy(aStepName);
	iStepPassFail = ETrue;
	}

EXPORT_C void CTmsTestStep::SetOverallTestStepID(const TDesC& aStepName)
	{
	iCurrentTestStepName.Copy(aStepName);
	iStepPassFail = ETrue;
	if (!TestStepResult() == EPass)
				TEST(EFalse);
	}

// needed for the overide of CTGraphicsBase::testBooleanTrue to allow us to set
// whether an individual test has passed or failed
EXPORT_C void CTmsTestStep::MQCTest(TBool aCondition, const TText8* aFile, TInt aLine)
	{
	if(!aCondition)
		{
		iStepPassFail = EFalse;
		}
	testBooleanTrue( aCondition, aFile, aLine, ETrue);
	}

// needed for the overide of CTGraphicsBase::testBooleanTrue to allow us to set
// whether an individual test has passed or failed
EXPORT_C void CTmsTestStep::MQCTestL(TBool aCondition, const TText8* aFile, TInt aLine)
	{
	if(!aCondition)
		{
		iStepPassFail = EFalse;
		}
	testBooleanTrueL( aCondition, aFile, aLine, ETrue);
	}

// sets whether tests with the same @SYMTestCaseID xxxxxx name are printed multiple times in the log files
EXPORT_C void CTmsTestStep::MultipleResultsForSameID(TBool aShowMultipleResults)
	{
	iShowMultipleResults = aShowMultipleResults;
	}