installationservices/swtransactionservices/test/tintegrityservices/source/tintegrityservicesstep.cpp
changeset 24 84a16765cd86
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/installationservices/swtransactionservices/test/tintegrityservices/source/tintegrityservicesstep.cpp	Fri Mar 19 09:33:35 2010 +0200
@@ -0,0 +1,1487 @@
+/*
+* Copyright (c) 2004-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: 
+*
+*/
+
+
+/**
+ @file 
+ @test
+ @internalTechnology
+*/
+ 
+#include "tintegrityservicesstep.h"
+#include <s32file.h>
+#include "journal.h"
+#include "journalfile.h"
+
+
+/////////////////////////////////////////////////////////////////////
+// CIntegrityServicesStep
+/////////////////////////////////////////////////////////////////////
+CIntegrityServicesStepBase::CIntegrityServicesStepBase(CStsTestServer &aStsTestServer):CStsBaseTestStep(aStsTestServer)
+	{
+	}
+void CIntegrityServicesStepBase::ImplTestStepPreambleL()
+	{
+	INFO_PRINTF1(_L("CIntegrityServicesStepBase::ImplTestStepPreambleL()"));
+	__UHEAP_MARK;
+
+	// Install an active scheduler
+	CActiveScheduler* s = new (ELeave) CActiveScheduler;
+	s->Install(s);
+	
+	User::LeaveIfError(iIntegritySession.Connect());
+
+	ReadFailureSettingsL();	
+	}
+
+void CIntegrityServicesStepBase::ImplTestStepPostambleL()
+	{
+	INFO_PRINTF1(_L("CIntegrityServicesStepBase::ImplTestStepPostambleL()"));
+	// Remove the installed active scheduler
+	CActiveScheduler* s = CActiveScheduler::Current();
+	s->Install(NULL);
+	delete s;
+
+	iIntegritySession.Close();
+
+__UHEAP_MARKEND;
+
+	
+	}
+
+void CIntegrityServicesStepBase::GetStringArrayFromConfigL(const TDesC& aSectName, const TDesC& aKeyName, RArray<TPtrC>& aArray)
+	{
+	INFO_PRINTF1(_L("CIntegrityServicesStepBase::GetStringArrayFromConfigL()"));
+	_LIT(KKeyFormat, "-%02d");
+	HBufC* buf = HBufC::NewLC(aKeyName.Length() + KKeyFormat().Length());
+	TPtr ptr(buf->Des());
+	INFO_PRINTF2(_L("Parsing attribute: %S"), &aKeyName);
+
+	TInt i = 0;
+	TBool cont = ETrue;
+	do
+		{
+		++i;
+		ptr = aKeyName;
+		ptr.AppendFormat(KKeyFormat(), i);
+		TPtrC val;
+
+		cont = GetStringFromConfig(aSectName, ptr, val);
+		if (cont)
+			{
+			User::LeaveIfError(aArray.Append(val));
+			}
+		} while (cont);
+
+	INFO_PRINTF2(_L("Element count: %d"), i-1);
+	CleanupStack::PopAndDestroy(buf);
+	}
+
+TBool CIntegrityServicesStepBase::CheckFilesL()
+	{
+	INFO_PRINTF1(_L("CIntegrityServicesStepBase::CheckFilesL()"));
+	TInt result = ETrue;
+	RArray<TPtrC> fileArray;
+	CleanupClosePushL(fileArray);
+	
+	GetStringArrayFromConfigL(ConfigSection(), KPresent, fileArray);
+	for (TInt file = 0; file < fileArray.Count();file++)
+		{
+		if(FileExistsL(fileArray[file]))
+			{
+			INFO_PRINTF2(_L("%S was found"), &fileArray[file]);
+			}
+		else
+			{
+			ERR_PRINTF2(_L("%S was not found"), &fileArray[file]);
+			result = EFalse;
+			}
+		}
+	fileArray.Reset();
+	
+	GetStringArrayFromConfigL(ConfigSection(), KAbsent, fileArray);
+	for (TInt file = 0; file < fileArray.Count();file++)
+		{
+		if(FileExistsL(fileArray[file]))
+			{
+			ERR_PRINTF2(_L("%S was found"), &fileArray[file]);
+			result = EFalse;
+			}
+		else
+			{
+			INFO_PRINTF2(_L("%S was not found"), &fileArray[file]);
+			}
+		}
+	fileArray.Reset();
+	CleanupStack::PopAndDestroy(&fileArray);
+	return result;
+	}
+
+void CIntegrityServicesStepBase::ReadFailureSettingsL()
+	{		
+	INFO_PRINTF1(_L("CIntegrityServicesStepBase::ReadFailureSettings()"));
+	TPtrC failType;
+	if(!GetStringFromConfig(ConfigSection(), KFailType, failType))
+		{
+		failType.Set(KNullDesC);
+		}
+		
+	TPtrC failPosition;
+	if(!GetStringFromConfig(ConfigSection(), KFailPosition, failPosition))
+		{
+		failPosition.Set(KNullDesC);
+		}
+		
+	TPtrC failFileName;
+	if(!GetStringFromConfig(ConfigSection(), KFailFileName, failFileName))
+		{
+		failFileName.Set(KNullDesC);
+		}
+	
+	iIntegritySession.SetSimulatedFailureL(failType, failPosition, failFileName);
+	}
+	
+void CIntegrityServicesStepBase::doInstallL()
+	{
+	INFO_PRINTF1(_L("CIntegrityServicesStepBase::doInstallL()"));
+	RArray<TPtrC> fileArray;
+	CleanupClosePushL(fileArray);
+	
+	GetStringArrayFromConfigL(ConfigSection(), KRemoveFile, fileArray);
+	for (TInt file = 0; file < fileArray.Count();file++)
+		{
+		INFO_PRINTF2(_L("RemovingFile: %S"), &fileArray[file]);
+		
+		iIntegritySession.RemoveL(fileArray[file]);
+		}
+	fileArray.Reset();
+	
+	
+	GetStringArrayFromConfigL(ConfigSection(), KAddFile, fileArray);
+	for (TInt file = 0; file < fileArray.Count();file++)
+		{
+		INFO_PRINTF2(_L("AddingFile: %S"), &fileArray[file]);
+		iIntegritySession.AddL(fileArray[file]);
+		iIntegritySession.CreateNewTestFileL(fileArray[file]);
+		}
+	fileArray.Reset();
+
+	GetStringArrayFromConfigL(ConfigSection(), KTempFile, fileArray);
+	for (TInt file = 0; file < fileArray.Count();file++)
+		{
+		INFO_PRINTF2(_L("TemporaryFile: %S"), &fileArray[file]);
+		iIntegritySession.TemporaryL(fileArray[file]);
+		iIntegritySession.CreateTempTestFileL(fileArray[file]);
+		}
+	fileArray.Reset();
+
+	RArray<TPtrC> operationArray;
+	CleanupClosePushL(operationArray);
+	
+	GetStringArrayFromConfigL(ConfigSection(), KArbitraryOpFile, fileArray);
+	GetStringArrayFromConfigL(ConfigSection(), KOperation, operationArray);
+	TInt fileCount = fileArray.Count();
+	
+	if (fileCount != operationArray.Count())
+		{
+		ERR_PRINTF3(_L("Number of files (%d) does not match number of operations (%d)"), fileCount, operationArray.Count());
+		SetTestStepResult(EFail);
+		}
+	else
+		{
+		for (TInt file = 0; file < fileCount;file++)
+			{
+			if (operationArray[file].CompareF(KAddFile) == 0)
+				{
+				INFO_PRINTF2(_L("AddingFile: %S"), &fileArray[file]);
+				iIntegritySession.AddL(fileArray[file]);
+				iIntegritySession.CreateNewTestFileL(fileArray[file]);
+				}
+			else if (operationArray[file].CompareF(KRemoveFile) == 0)
+				{
+				INFO_PRINTF2(_L("RemovingFile: %S"), &fileArray[file]);
+				iIntegritySession.RemoveL(fileArray[file]);
+				}
+			else if (operationArray[file].CompareF(KTempFile) == 0)
+				{
+				INFO_PRINTF2(_L("TemporaryFile: %S"), &fileArray[file]);
+				iIntegritySession.TemporaryL(fileArray[file]);
+				iIntegritySession.CreateTempTestFileL(fileArray[file]);
+				}
+			else
+				{
+				ERR_PRINTF3(_L("Operation %S not understood, skipping file %S"), &operationArray[file], &fileArray[file]);
+				}
+			}
+		}
+	CleanupStack::PopAndDestroy(2, &fileArray);
+	
+	iIntegritySession.CommitL();
+	}
+
+void CIntegrityServicesStepBase::doRecoverL()
+	{
+	INFO_PRINTF1(_L("CIntegrityServicesStepBase::doRecoverL()"));
+	iIntegritySession.RollBackL(EFalse);
+	}
+
+void CIntegrityServicesStepBase::doCleanupL()
+	{
+	
+	INFO_PRINTF1(_L("CIntegrityServicesStepBase::doCleanupL()"));
+	RArray<TPtrC> fileArray;
+	CleanupClosePushL(fileArray);
+	
+	GetStringArrayFromConfigL(ConfigSection(), KCleanupFile, fileArray);
+	for (TInt file = 0; file < fileArray.Count();file++)
+		{
+		TRAPD(err, DeleteFileL(fileArray[file]));
+		if(err != KErrNone && err != KErrPathNotFound && err != KErrNotFound)
+			{
+			User::Leave(err);
+			}
+		}
+	fileArray.Reset();
+	GetStringArrayFromConfigL(ConfigSection(), KCleanupDirectory, fileArray);
+	for (TInt file = 0; file < fileArray.Count();file++)
+		{
+		TRAPD(err, DeleteFileL(fileArray[file]));
+		if(err != KErrNone && err != KErrPathNotFound && err != KErrNotFound)
+			{
+			User::Leave(err);
+			}
+		}
+	fileArray.Reset();
+	CleanupStack::PopAndDestroy(&fileArray);
+	}
+
+/////////////////////////////////////////////////////////////////////
+// CInstallStep
+/////////////////////////////////////////////////////////////////////
+CInstallStep::CInstallStep(CStsTestServer &aStsTestServer):CIntegrityServicesStepBase(aStsTestServer)
+	{
+	SetTestStepName(KInstall);
+	}
+
+void CInstallStep::ImplTestStepL()
+	{
+	INFO_PRINTF1(_L("CInstallStep::ImplTestStepL()"));
+	TRAPD(err, doInstallL());
+	
+	if(err == KErrNone || err == KIntegrityServicesSimulatedBatteryFailure)
+		{
+		if(CheckFilesL())
+			{
+			SetTestStepResult(EPass);
+			}
+		else
+			{
+			SetTestStepResult(EFail);
+			}
+		}
+	else
+		{
+		User::Leave(err);
+		}
+	
+	}
+
+/////////////////////////////////////////////////////////////////////
+// CRecoverStep
+/////////////////////////////////////////////////////////////////////
+CRecoverStep::CRecoverStep(CStsTestServer &aStsTestServer):CIntegrityServicesStepBase(aStsTestServer)
+	{
+	SetTestStepName(KRecover);
+	}
+
+void CRecoverStep::ImplTestStepL()
+	{
+	INFO_PRINTF1(_L("CRecoverStep::ImplTestStepL()"));
+	// begin recovery
+	TRAPD(err, doRecoverL());
+	
+	if(err == KErrNone || err == KIntegrityServicesSimulatedBatteryFailure)
+		{
+		if(CheckFilesL())
+			{
+			SetTestStepResult(EPass);
+			}
+		else
+			{
+			SetTestStepResult(EFail);
+			}
+		}
+	else
+		{
+		User::Leave(err);
+		}
+
+	
+	}
+
+/////////////////////////////////////////////////////////////////////
+// CCleanupStep
+/////////////////////////////////////////////////////////////////////
+CCleanupStep::CCleanupStep(CStsTestServer &aStsTestServer):CIntegrityServicesStepBase(aStsTestServer)
+	{
+	SetTestStepName(KCleanup);
+	}
+
+void CCleanupStep::ImplTestStepL()
+	{
+	INFO_PRINTF1(_L("CCleanupStep::ImplTestStepL()"));
+	doCleanupL();
+	
+	SetTestStepResult(EPass);
+	
+	}
+
+/////////////////////////////////////////////////////////////////////
+// CRecoverStep
+/////////////////////////////////////////////////////////////////////
+CCheckStep::CCheckStep(CStsTestServer &aStsTestServer):CIntegrityServicesStepBase(aStsTestServer)
+	{
+	SetTestStepName(KCheck);
+	}
+
+void CCheckStep::ImplTestStepL()
+	{
+	INFO_PRINTF1(_L("CCheckStep::ImplTestStepL()"));
+	// Just check for files
+	if(CheckFilesL())
+		{
+		SetTestStepResult(EPass);
+		}
+	else
+		{
+		SetTestStepResult(EFail);
+		}
+		
+	
+	}
+
+
+//---------- new unit tests developed as part of the STS framework ----------
+using namespace Usif;
+
+//define event names for logging purposes (used in journal file unit tests and journal unit tests	
+_LIT(KENone, "ENone");
+_LIT(KERemovedFile,"ERemovedFile");
+_LIT(KEBackupFile,"EBackupFile");
+_LIT(KETempFile,"ETempFile");
+_LIT(KEAddedFile,"EAddedFile");
+_LIT(KECommitted,"ECommitted");
+_LIT(KEBackupFilesRemoved,"EBackupFilesRemoved");
+_LIT(KEAddedFilesRemoved,"EAddedFilesRemoved");
+_LIT(KERemovedFilesRestored,"ERemovedFilesRestored");
+_LIT(KETempFilesRemoved, "ETempFilesRemoved");
+	
+
+const TDesC* eventNames[] = {
+				&KENone,
+				&KERemovedFile,
+				&KEBackupFile,
+				&KETempFile,
+				&KEAddedFile,
+				&KECommitted,
+				&KEBackupFilesRemoved,
+				&KEAddedFilesRemoved,
+				&KERemovedFilesRestored,
+				&KETempFilesRemoved
+				};
+
+
+const TFileMode defaultJournalFileMode = TFileMode (TFileMode(EFileWrite) | TFileMode(EFileShareAny));
+
+CJournalFileUnitTest::CJournalFileUnitTest(CStsTestServer &aStsTestServer): CStsBaseTestStep(aStsTestServer)
+	{
+	// Call base class method to set up the human readable name for logging
+	SetTestStepName(KJournalFileUnitTest);
+	}
+
+CJournalFileUnitTest::~CJournalFileUnitTest()
+	{
+	delete testJournalFile;
+	iFs.Close();
+	iLoader.Close();
+	}
+
+
+void CJournalFileUnitTest::ImplTestStepPreambleL()
+/**
+ @return - void code
+ Override of base class virtual
+ */
+	{
+	INFO_PRINTF1(_L("JournalFileUnitTest Preamble"));
+	User::LeaveIfError(iFs.Connect());
+	User::LeaveIfError(iLoader.Connect());
+	testJournalFile = CTestFile::NewL(iFs);
+	SetTestStepResult(EPass);
+	
+	}
+
+void CJournalFileUnitTest::ImplTestStepL()
+/**
+ @return - void code
+ Override of base class pure virtual
+ */
+	{
+	INFO_PRINTF1(_L("JournalFileUnitTest in test step"));
+	SetTestStepResult(EPass);
+	
+	TPtrC journalFilePathInIni = GetTargetFilePathFromConfigL();
+	TParsePtrC journalFilePathParse(journalFilePathInIni);
+	TDriveUnit journaldrive(journalFilePathParse.Drive());
+	HBufC* targetFileName = HBufC::NewLC(KMaxFileName);
+	HBufC* backupFileName = HBufC::NewLC(KMaxFileName);
+	
+	CJournalFile* journalFile = CJournalFile::NewLC(iFs, iLoader, journalFilePathInIni, journaldrive);
+
+	//feed incorrect file to the journalfile (ie: file's on other drive)
+	TPtr targetFileNameBasePtr(targetFileName->Des());
+	targetFileNameBasePtr.Append(TDriveUnit(journaldrive+1).Name());
+	targetFileNameBasePtr.Append(journalFilePathParse.Path());
+
+	TPtr targetFileNamePtr(targetFileNameBasePtr);
+	targetFileNamePtr.Append(_L("dummyadd.txt"));
+
+	TPtr targetBackupFileNamePtr(backupFileName->Des());
+
+	TInt err(0);
+	
+	TInt seekPosition(0);
+	TInt seekToEndPosition(0);
+	TIntValue intValue = {0};
+	TIntValue extraByte = {0xFF};
+
+	TRAP(err, journalFile->AddL(targetFileNamePtr));
+	if(err!=KErrBadName)
+		{
+		ERR_PRINTF2(_L("<font color=red>CJournalFile::AddL() returned incorrect error code. KErrBadName is expected %d is returned!</font>"), err);
+		SetTestStepResult(EFail);
+		}
+	targetFileNamePtr.Set(targetFileNameBasePtr);
+	targetFileNamePtr.Append(_L("dummytemp.txt"));
+	TRAP(err, journalFile->TemporaryL(targetFileNamePtr));
+	if(err!=KErrBadName)
+		{
+		ERR_PRINTF2(_L("<font color=red>CJournalFile::RemoveL() returned incorrect error code. KErrBadName is expected %d is returned!</font>"), err);
+		SetTestStepResult(EFail);
+		}
+
+	targetFileNamePtr.Set(targetFileNameBasePtr);
+	targetFileNamePtr.Append(_L("dummyremove.txt"));
+	TRAP(err, journalFile->RemoveL(targetFileNamePtr, targetBackupFileNamePtr));
+	if(err!=KErrBadName)
+		{
+		ERR_PRINTF2(_L("<font color=red>CJournalFile::RemoveL() returned incorrect error code. KErrBadName is expected %d is returned!</font>"), err);
+		SetTestStepResult(EFail);
+		}
+
+	*targetFileName = KEmptyString;
+	targetFileNameBasePtr.Set(targetFileName->Des());
+	targetFileNameBasePtr.Append(journalFilePathParse.DriveAndPath());
+
+	CleanupStack::PopAndDestroy(journalFile);
+	DeleteFileL(journalFilePathInIni);	
+//-------------------------------------------------------------------------------------	
+//Steps: 
+//	1.) create a CJournalFile object
+//	2.) set last event by invoking CJournalFile::EventL() (this sets the iLastEvent as well as writes the event value to the journal file on disk)
+//	3.) destroy object 
+//	4.) corrupt information by overwriting the event value in the file to requested invalid value
+//	5.) recreate CjournalFile object -> this will trigger CJournalFile::ReadEntryL
+//  note: the purpose of this testcase to excersise the main switch-case in CJournalFile::ReadEntryL		
+//-------------------------------------------------------------------------------------
+	
+	TIntegrityServicesEvent eventsToSet[] = {ERemovedFile, 
+											 EBackupFile, 
+											 ETempFile,
+											 EAddedFile,
+											 ECommitted,
+											 EBackupFilesRemoved,
+											 EAddedFilesRemoved,
+											 //ETempFilesRemoved,
+											 ERemovedFilesRestored,
+											 };
+	TInt numOfInvalidEvents[] = {6, //number of invalid events for ERemovedFile
+								 1, //number of invalid events for EBackupFile
+								 6, //number of invalid events for ETempFile
+								 6, //number of invalid events for EAddedFile
+								 7, //number of invalid events for ECommitted
+								 9, //number of invalid events for EBackupFilesRemoved
+								 6, //number of invalid events for EAddedFilesRemoved
+								 //ETempFilesRemoved
+								 9 //number of invalid events for ERemovedFilesRestored
+	                             };
+	TIntegrityServicesEvent invalidEvents[][10] = {{EBackupFile, ECommitted, EBackupFilesRemoved, EAddedFilesRemoved, ERemovedFilesRestored, ETempFilesRemoved}, //invalid events for ERemovedFile
+			                                        {EBackupFile}, //invalid events for EBackupFile, this is not really invalid value for EBackupFile, actually EBackupFile itself is invalid on its own in the file
+													{EBackupFile, ECommitted, EBackupFilesRemoved, EAddedFilesRemoved, ERemovedFilesRestored, ETempFilesRemoved}, //invalid events for ETempFile
+													{EBackupFile, ECommitted, EBackupFilesRemoved, EAddedFilesRemoved, ERemovedFilesRestored, ETempFilesRemoved}, //invalid events for EAddedFile
+													{ENone, EBackupFile, ECommitted, EBackupFilesRemoved, EAddedFilesRemoved, ERemovedFilesRestored, ETempFilesRemoved}, //invalid events for ECommitted
+													{ENone, ERemovedFile, EBackupFile, ETempFile, EAddedFile, EBackupFilesRemoved, EAddedFilesRemoved, ERemovedFilesRestored, ETempFilesRemoved}, //invalid events for EBackupFilesRemoved
+													{ENone, EBackupFile, EBackupFilesRemoved, EAddedFilesRemoved, ERemovedFilesRestored, ETempFilesRemoved}, //invalid events for EAddedFilesRemoved
+													//{}, //invalid events for ETempFilesRemoved
+													{ENone, ERemovedFile, EBackupFile, ETempFile, EAddedFile, ECommitted, EBackupFilesRemoved, ETempFilesRemoved, ERemovedFilesRestored} //invalid events for ERemovedFilesRestored
+	                                               };
+	
+	ASSERT(sizeof(eventsToSet)/sizeof(TIntegrityServicesEvent) == sizeof(numOfInvalidEvents)/sizeof(TInt) == sizeof(invalidEvents)/(sizeof(TIntegrityServicesEvent)*10));
+	for (TInt i=0; i<sizeof(eventsToSet)/sizeof(TIntegrityServicesEvent); ++i)
+	{
+	for(TInt j=0; j<numOfInvalidEvents[i]; ++j)
+		{
+		journalFile=0;
+		journalFile = CJournalFile::NewLC(iFs, iLoader, journalFilePathInIni, journaldrive);
+		journalFile->EventL(invalidEvents[i][j]); //set last event to any of the requested invalid events (also writes it to jounral file)
+		CleanupStack::PopAndDestroy(journalFile);
+		intValue.int32 = static_cast<TInt32>(eventsToSet[i]);
+		seekPosition=0;
+		OpenJournalFileL(journalFilePathInIni, defaultJournalFileMode);
+		SeekInJournalFileL(ESeekStart, seekPosition);
+		WriteIntToJournalFileL(intValue, Mode32Bit); //write the requested event to journal file (overwrites last event set by EventL())
+		seekToEndPosition=0;
+		SeekInJournalFileL(ESeekEnd, seekToEndPosition);
+		WriteIntToJournalFileL(extraByte, Mode8Bit);
+		CloseJournalFile();
+		//force a Sync and catch the error that should be KErrCorrupt
+		journalFile=0;
+		TRAPD(err, 
+				journalFile = CJournalFile::NewLC(iFs, iLoader, journalFilePathInIni, journaldrive);
+				CleanupStack::PopAndDestroy(journalFile);
+				);
+		if(err!=KErrCorrupt)
+			{
+			ERR_PRINTF4(_L("<font color=red>CJournalFile::SynchL() returned incorrect error code. KErrCorrupt is expected and %d is returned! Conditions: last event set via EventL(): %S  Event written into journal file: %S</font>"), err, eventNames[invalidEvents[i][j]], eventNames[eventsToSet[i]]);
+			SetTestStepResult(EFail);
+			}
+		DeleteFileL(journalFilePathInIni);
+		}
+	}	
+//-------------------------------------------------------------------------------------	
+//Steps: 
+//	1.) create a journal file using CJournalFile::NewLC
+//  2.) add an item via AddL() or TemporaryL()	
+//	2.) corrupt disk information in the filename written into the file
+//	3.) try to recreate journal object using CJournalFile::NewLC
+//	4.) expect KErrCorrupt
+//-------------------------------------------------------------------------------------
+
+	targetFileNamePtr.Set(targetFileNameBasePtr);
+	targetFileNamePtr.Append(_L("dummyadd_or_temp.txt"));
+	for(TInt i=0; i<2; i++)
+		{
+		//create a journal file and add an item via AddL() or TemporaryL()
+		journalFile=0;
+		journalFile = CJournalFile::NewLC(iFs, iLoader, journalFilePathInIni, journaldrive);
+		if(i==0)
+			{
+			journalFile->AddL(targetFileNamePtr);
+			}
+		else if(i==1)
+			{
+			journalFile->TemporaryL(targetFileNamePtr);
+			}
+		CleanupStack::PopAndDestroy(journalFile);
+		//open journal file and corrupt it by overwriting the drive letter in the file's path
+		seekPosition=sizeof(TInt32)+1;
+		OpenJournalFileL(journalFilePathInIni, defaultJournalFileMode);
+		SeekInJournalFileL(ESeekStart, seekPosition);
+		intValue = ReadIntFromJournalFileL(Mode8Bit);
+		intValue.int8++; //corrupt drive letter (ie: 'c' ==> 'd')
+		SeekInJournalFileL(ESeekStart, seekPosition);
+		WriteIntToJournalFileL(intValue, Mode8Bit);
+		CloseJournalFile();
+		//check that CJournalFile recognizes corruption
+		journalFile=0;
+		TRAP(err, 
+				  journalFile = CJournalFile::NewLC(iFs, iLoader, journalFilePathInIni, journaldrive);
+		          CleanupStack::PopAndDestroy(journalFile);
+			 );
+		if(err!=KErrCorrupt)
+			{
+			ERR_PRINTF2(_L("<font color=red>CJournalFile::NewL() returned incorrect error code. KErrCorrupt is expected and %d is returned!</font>"), err);
+			SetTestStepResult(EFail);
+			}
+		DeleteFileL(journalFilePathInIni);
+		}
+//-------------------------------------------------------------------------------------	
+//Steps: 
+//	1.) create a journal file using CJournalFile::NewLC
+//  2.) add an item via RemoveyL()	
+//	2.) corrupt disk information in various ways in the file
+//	3.) try to recreate journal object using CJournalFile::NewL
+//	4.) expect KErrCorrupt
+//-------------------------------------------------------------------------------------
+
+	journalFile=0;
+	journalFile = CJournalFile::NewLC(iFs, iLoader, journalFilePathInIni, journaldrive);
+	targetFileNamePtr.Set(targetFileNameBasePtr);
+	targetFileNamePtr.Append(_L("dummyremove.txt"));
+	journalFile->RemoveL(targetFileNamePtr, targetBackupFileNamePtr);
+	CleanupStack::PopAndDestroy(journalFile);
+
+	OpenJournalFileL(journalFilePathInIni, defaultJournalFileMode);
+	seekPosition=sizeof(TInt32)+1+targetFileNamePtr.Length();
+	SeekInJournalFileL(ESeekStart, seekPosition);
+	intValue.int32 = static_cast<TInt32>(EAddedFile); //corrupt operation: originally EBackupFile is recorded here
+	WriteIntToJournalFileL(intValue, Mode32Bit);
+	
+	//check that CJournalFile recognizes corruption
+	journalFile=0;
+	TRAP(err, 
+			journalFile = CJournalFile::NewLC(iFs, iLoader, journalFilePathInIni, journaldrive);
+    		CleanupStack::PopAndDestroy(journalFile);
+		);
+	if(err!=KErrCorrupt)
+		{
+		ERR_PRINTF2(_L("<font color=red>CJournalFile::NewL() returned incorrect error code. KErrCorrupt is expected and %d is returned!</font>"), err);
+		SetTestStepResult(EFail);
+		}
+
+	SeekInJournalFileL(ESeekStart, seekPosition);
+	intValue.int32 = static_cast<TInt32>(EBackupFile); //restore original record
+	WriteIntToJournalFileL(intValue, Mode32Bit);
+
+	//check that journal file is not corrupted
+	journalFile=0;
+	TRAP(err, 
+			journalFile = CJournalFile::NewLC(iFs, iLoader, journalFilePathInIni, journaldrive);
+    		CleanupStack::PopAndDestroy(journalFile);
+		);
+	if(err!=KErrNone)
+		{
+		ERR_PRINTF2(_L("<font color=red>CJournalFile::NewL() returned incorrect error code. KErrNone is expected and %d is returned!</font>"), err);
+		SetTestStepResult(EFail);
+		}
+
+	seekPosition=sizeof(TInt32)+1;
+	SeekInJournalFileL(ESeekStart, seekPosition);
+	intValue = ReadIntFromJournalFileL(Mode8Bit); //read first file's drive letter
+	intValue.int8++; //corrupt drive letter (ie: 'c' ==> 'd')
+	SeekInJournalFileL(ESeekStart, seekPosition);
+	WriteIntToJournalFileL(intValue, Mode8Bit); //write corrupt drive letter to file
+
+	//check that CJournalFile recognizes corruption
+	journalFile=0;
+	TRAP(err, 
+			journalFile = CJournalFile::NewLC(iFs, iLoader, journalFilePathInIni, journaldrive);
+    		CleanupStack::PopAndDestroy(journalFile);
+		);
+	if(err!=KErrCorrupt)
+		{
+		ERR_PRINTF2(_L("<font color=red>CJournalFile::NewL() returned incorrect error code. KErrCorrupt is expected and %d is returned!</font>"), err);
+		SetTestStepResult(EFail);
+		}
+
+	intValue.int8--; //restore original drive letter
+	SeekInJournalFileL(ESeekStart, seekPosition);
+	WriteIntToJournalFileL(intValue, Mode8Bit); //write original drive letter to file
+
+		
+	//check that journal file is not corrupted
+	journalFile=0;
+	TRAP(err, 
+			journalFile = CJournalFile::NewLC(iFs, iLoader, journalFilePathInIni, journaldrive);
+    		CleanupStack::PopAndDestroy(journalFile);
+		);
+	if(err!=KErrNone)
+		{
+		ERR_PRINTF2(_L("<font color=red>CJournalFile::NewL() returned incorrect error code. KErrNone is expected and %d is returned!</font>"), err);
+		SetTestStepResult(EFail);
+		}
+
+	seekPosition=sizeof(TInt32)+1+targetFileNamePtr.Length()+sizeof(TInt32)+1;
+	SeekInJournalFileL(ESeekStart, seekPosition);
+	intValue = ReadIntFromJournalFileL(Mode8Bit); //read second file's drive letter (backup file name)
+	intValue.int8++; //corrupt drive letter (ie: 'c' ==> 'd')
+	SeekInJournalFileL(ESeekStart, seekPosition);
+	WriteIntToJournalFileL(intValue, Mode8Bit); //write corrupt drive letter to file
+
+	
+	//check that CJournalFile recognizes corruption
+	journalFile=0;
+	TRAP(err, 
+			journalFile = CJournalFile::NewLC(iFs, iLoader, journalFilePathInIni, journaldrive);
+    		CleanupStack::PopAndDestroy(journalFile);
+		);
+	if(err!=KErrCorrupt)
+		{
+		ERR_PRINTF2(_L("<font color=red>CJournalFile::NewL() returned incorrect error code. KErrCorrupt is expected and %d is returned!</font>"), err);
+		SetTestStepResult(EFail);
+		}
+	
+	intValue.int8--; //restore original drive letter
+	SeekInJournalFileL(ESeekStart, seekPosition);
+	WriteIntToJournalFileL(intValue, Mode8Bit); //write original drive letter to file
+
+	//check that journal file is not corrupted
+	journalFile=0;
+	TRAP(err, 
+			journalFile = CJournalFile::NewLC(iFs, iLoader, journalFilePathInIni, journaldrive);
+    		CleanupStack::PopAndDestroy(journalFile);
+		);
+	if(err!=KErrNone)
+		{
+		ERR_PRINTF2(_L("<font color=red>CJournalFile::NewL() returned incorrect error code. KErrNone is expected and %d is returned!</font>"), err);
+		SetTestStepResult(EFail);
+		}
+	CloseJournalFile();
+	INFO_PRINTF1(_L("Deleting journal file - Line 769"));
+	DeleteFileL(journalFilePathInIni);
+
+	
+	CreateJournalFileL(journalFilePathInIni, TFileMode(TFileMode(EFileWrite) | TFileMode(EFileShareExclusive)));
+	journalFile=0;
+	TRAP(err, 
+			journalFile = CJournalFile::NewLC(iFs, iLoader, journalFilePathInIni, journaldrive);
+    		CleanupStack::PopAndDestroy(journalFile);
+		);
+	if(err!=KErrInUse )
+		{
+		ERR_PRINTF2(_L("<font color=red>CJournalFile::NewL() returned incorrect error code. KErrInUse is expected and %d is returned!</font>"), err);
+		SetTestStepResult(EFail);
+		}
+	CloseJournalFile();
+	INFO_PRINTF1(_L("Deleting journal file - Line 783"));
+	DeleteFileL(journalFilePathInIni);
+
+	CleanupStack::PopAndDestroy(2, targetFileName);
+	}
+
+void CJournalFileUnitTest::ImplTestStepPostambleL()
+/**
+ @return - void code
+ Override of base class virtual
+ */
+	{
+	INFO_PRINTF1(_L("JournalFileUnitTest Postamble"));
+	delete testJournalFile;
+	testJournalFile=0;
+	iFs.Close();
+	iLoader.Close();
+	}
+
+void CJournalFileUnitTest::OpenJournalFileL(const TDesC& aFileName, TFileMode aMode)
+	{
+	testJournalFile->OpenJournalFileL(aFileName, aMode);
+	}
+
+void CJournalFileUnitTest::CreateJournalFileL(const TDesC& aFileName, TFileMode aMode)
+	{
+	testJournalFile->CreateJournalFileL(aFileName, aMode);
+	}
+
+void CJournalFileUnitTest::SeekInJournalFileL(TSeek aSeekMode, TInt &aPos)
+	{
+	testJournalFile->SeekInJournalFileL(aSeekMode, aPos);
+	}
+
+TIntValue CJournalFileUnitTest::ReadIntFromJournalFileL(TIntMode mode)
+	{
+	return testJournalFile->ReadIntFromJournalFileL(mode);
+	}
+
+void CJournalFileUnitTest::CloseJournalFile()
+	{
+	testJournalFile->CloseJournalFile();
+	}
+
+void CJournalFileUnitTest::WriteIntToJournalFileL(TIntValue value, TIntMode mode)
+	{
+	testJournalFile->WriteIntToJournalFileL(value, mode);
+	}
+
+
+
+/*static*/ CTestFile* CTestFile::NewL(RFs& aFs)
+	{
+	CTestFile* self = new(ELeave) CTestFile(aFs);
+	return self;
+	}
+
+CTestFile::CTestFile(RFs& aFs): iFs(aFs)
+	{
+	
+	}
+
+CTestFile::~CTestFile()
+	{
+	CloseJournalFile();
+	}
+
+void CTestFile::OpenJournalFileL(const TDesC& aFileName, TFileMode aMode)
+	{
+	TInt err = journalFile.Open(iFs, aFileName, aMode);
+	User::LeaveIfError(err);
+	}
+
+void CTestFile::CreateJournalFileL(const TDesC& aFileName, TFileMode aMode)
+	{
+	TInt err = iFs.MkDirAll(aFileName);
+	if(err != KErrNone && err != KErrAlreadyExists)
+		{
+		User::Leave(err);
+		}
+	err = journalFile.Create(iFs, aFileName, aMode);
+	User::LeaveIfError(err);
+	}
+
+void CTestFile::CloseJournalFile()
+	{
+	journalFile.Close();
+	}
+
+void CTestFile::WriteIntToJournalFileL(TIntValue value, TIntMode mode)
+	{
+	HBufC8* fileIOBuffer = HBufC8::NewLC(10);
+	TPtr8  fileIOBufferPtr(fileIOBuffer->Des());
+	TPckgC<TInt32> pckg(value.int32);
+	
+	switch(mode)
+		{
+		case Mode8Bit:
+		case Mode16Bit:
+		case Mode32Bit:
+			fileIOBufferPtr.Append(pckg);
+			User::LeaveIfError(journalFile.Write(fileIOBufferPtr, static_cast<TInt>(mode)));
+			break;
+		default:
+			User::Leave(KErrArgument);
+			break;
+		}
+	
+	CleanupStack::PopAndDestroy(fileIOBuffer);
+	}
+
+TIntValue CTestFile::ReadIntFromJournalFileL(TIntMode mode)
+	{
+	HBufC8* fileIOBuffer = HBufC8::NewLC(10);
+	TPtr8  fileIOBufferPtr(fileIOBuffer->Des());
+	User::LeaveIfError(journalFile.Read(fileIOBufferPtr, static_cast<TInt>(mode)));
+	TIntValue ret = {0};
+	
+	switch(mode)
+		{
+		case Mode8Bit: 
+		case Mode16Bit:
+		case Mode32Bit:
+			{
+			for(TInt i=0; i<static_cast<TInt>(mode); ++i)
+				{
+				ret.int32 |=  TInt32((*fileIOBuffer)[i]) << (8*i);
+				}
+			break;
+			}
+		default:
+			User::Leave(KErrArgument);
+			break;
+		}
+	CleanupStack::PopAndDestroy(fileIOBuffer);
+	return ret;
+	}
+	
+void CTestFile::SeekInJournalFileL(TSeek aSeekMode, TInt &aPos)
+	{
+	User::LeaveIfError(journalFile.Seek(aSeekMode, aPos));
+	}
+
+
+
+//------------------------------------------------------------------------------------------------------------
+
+CJournalFileUnitTestScenarioBase::CJournalFileUnitTestScenarioBase(CStsTestServer &aStsTestServer): CStsBaseTestStep(aStsTestServer), iCleanupNeeded(ETrue)
+	{
+	}
+
+CJournalFileUnitTestScenarioBase::~CJournalFileUnitTestScenarioBase()
+	{
+	iFs.Close();
+	iLoader.Close();
+	delete iTargetFileName;
+	delete iBackupFileName;
+	}
+
+
+void CJournalFileUnitTestScenarioBase::ImplTestStepPreambleL()
+	{
+	INFO_PRINTF1(_L("CJournalFileUnitTestScenarioBase Preamble"));
+	iJournalFileName.Set(GetTargetFilePathFromConfigL());
+	User::LeaveIfError(iFs.Connect());
+	User::LeaveIfError(iLoader.Connect());
+	iTargetFileName = HBufC::NewL(KMaxFileName);
+	iBackupFileName = HBufC::NewL(KMaxFileName);
+	TParsePtrC journalFilePathParse(iJournalFileName);
+	TPtr ptr(iTargetFileName->Des());
+	ptr.Append(journalFilePathParse.DriveAndPath());
+	ptr.Append(_L("journalfile_oom_test_dummyfile.txt"));
+	iJournaldrive = journalFilePathParse.Drive();
+	SetTestStepResult(EPass);
+	
+	}
+
+void CJournalFileUnitTestScenarioBase::ImplTestStepL()
+	{
+	CleanupStack::PushL(TCleanupItem(&CJournalFileUnitTestScenarioBase::InTestCleanup, this));
+	ImplTestCaseScenarioL();
+	CleanupStack::PopAndDestroy(this);
+	}
+
+void CJournalFileUnitTestScenarioBase::ImplTestStepPostambleL()
+	{
+	INFO_PRINTF1(_L("CJournalFileUnitTestScenarioBase Postamble"));
+	
+	delete iTargetFileName; 
+	iTargetFileName=0;
+	delete iBackupFileName; 
+	iBackupFileName=0;
+	iFs.Close();
+	iLoader.Close();
+	TRAP_IGNORE(DeleteFileL(iJournalFileName));
+	}
+
+/*static*/void CJournalFileUnitTestScenarioBase::InTestCleanup(TAny* aObject)
+	{
+	CJournalFileUnitTestScenarioBase* object=static_cast<CJournalFileUnitTestScenarioBase*>(aObject);
+	object->INFO_PRINTF1(_L("CJournalFileUnitTestScenarioBase::InTestCleanup()"));
+	if(object->iCleanupNeeded)
+		{
+		TRAP_IGNORE(object->DeleteFileL(object->iJournalFileName));
+		}
+	}
+
+//------------------------------------------------------------------------------------------------------------
+CJournalFileUnitTestAdd::CJournalFileUnitTestAdd(CStsTestServer &aStsTestServer): CJournalFileUnitTestScenarioBase(aStsTestServer)
+	{
+	SetTestStepName(KJournalFileUnitTestAdd);
+	}
+void CJournalFileUnitTestAdd::ImplTestCaseScenarioL()
+	{
+	INFO_PRINTF1(_L("CJournalFileUnitTestAdd in test step"));
+	CJournalFile* journalFile = CJournalFile::NewLC(iFs, iLoader, iJournalFileName, iJournaldrive);
+	journalFile->AddL(*iTargetFileName);
+	CleanupStack::PopAndDestroy(journalFile);
+	}
+//------------------------------------------------------------------------------------------------------------
+CJournalFileUnitTestTemp::CJournalFileUnitTestTemp(CStsTestServer &aStsTestServer): CJournalFileUnitTestScenarioBase(aStsTestServer)
+	{
+	SetTestStepName(KJournalFileUnitTestTemp);
+	}
+
+void CJournalFileUnitTestTemp::ImplTestCaseScenarioL()
+	{
+	INFO_PRINTF1(_L("CJournalFileUnitTestTemp in test step"));
+	CJournalFile* journalFile = CJournalFile::NewLC(iFs, iLoader, iJournalFileName, iJournaldrive);
+	journalFile->TemporaryL(*iTargetFileName);
+	CleanupStack::PopAndDestroy(journalFile);
+	}
+
+//------------------------------------------------------------------------------------------------------------
+CJournalFileUnitTestRemove::CJournalFileUnitTestRemove(CStsTestServer &aStsTestServer): CJournalFileUnitTestScenarioBase(aStsTestServer)
+	{
+	SetTestStepName(KJournalFileUnitTestRemove);
+	}
+
+void CJournalFileUnitTestRemove::ImplTestCaseScenarioL()
+	{
+	INFO_PRINTF1(_L("CJournalFileUnitTestRemove in test step"));
+	TPtr backupFileNamePtr(iBackupFileName->Des());
+	CJournalFile* journalFile = CJournalFile::NewLC(iFs, iLoader, iJournalFileName, iJournaldrive);
+	journalFile->RemoveL(*iTargetFileName, backupFileNamePtr);
+	CleanupStack::PopAndDestroy(journalFile);
+	}
+//------------------------------------------------------------------------------------------------------------
+CJournalFileUnitTestRead::CJournalFileUnitTestRead(CStsTestServer &aStsTestServer): CJournalFileUnitTestScenarioBase(aStsTestServer)
+	{
+	iCleanupNeeded=EFalse;
+	SetTestStepName(KJournalFileUnitTestRead);
+	}
+
+void CJournalFileUnitTestRead::ImplTestCaseScenarioL()
+	{
+	INFO_PRINTF1(_L("CJournalFileUnitTestRead in test step"));
+	CJournalFile* journalFile = CJournalFile::NewLC(iFs, iLoader, iJournalFileName, iJournaldrive);
+	CleanupStack::PopAndDestroy(journalFile);
+	}
+//------------------------------------------------------------------------------------------------------------
+CJournalFileUnitTestEvent::CJournalFileUnitTestEvent(CStsTestServer &aStsTestServer): CJournalFileUnitTestScenarioBase(aStsTestServer)
+	{
+	}
+
+void CJournalFileUnitTestEvent::ImplTestCaseScenarioL()
+	{
+	INFO_PRINTF1(_L("CJournalFileUnitTestEvent in test step"));
+	CJournalFile* journalFile = CJournalFile::NewLC(iFs, iLoader, iJournalFileName, iJournaldrive);
+	journalFile->EventL(ECommitted);
+	CleanupStack::PopAndDestroy(journalFile);
+	}
+//------------------------------------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------------------------------------
+CJournalUnitTest::CJournalUnitTest(CStsTestServer &aStsTestServer): CStsBaseTestStep(aStsTestServer)
+	{
+	// Call base class method to set up the human readable name for logging
+	SetTestStepName(KJournalUnitTest);
+	}
+
+CJournalUnitTest::~CJournalUnitTest()
+	{
+	delete iTestFileInterface;
+	iFs.Close();
+	iLoader.Close();
+	}
+
+void CJournalUnitTest::ImplTestStepPreambleL()
+	{
+	INFO_PRINTF1(_L("JournalFileUnitTest Preamble"));
+	iJournalPathInIni.Set(GetTargetFilePathFromConfigL());
+	iTrID = GetTransactionIdFromConfigL();
+	User::LeaveIfError(iFs.Connect());
+	User::LeaveIfError(iLoader.Connect());
+	iTestFileInterface = CTestFile::NewL(iFs);
+	SetTestStepResult(EPass);
+	
+	}
+
+void CJournalUnitTest::ImplTestStepL()
+	{
+	INFO_PRINTF1(_L("JournalUnitTest in test step"));
+	SetTestStepResult(EPass);
+	TestCase1L();
+	}
+
+void CJournalUnitTest::ImplTestStepPostambleL()
+	{
+	INFO_PRINTF1(_L("JournalFileUnitTest Postamble"));
+	delete iTestFileInterface;
+	iTestFileInterface=0;
+	iFs.Close();
+	iLoader.Close();
+	}
+
+void CJournalUnitTest::TestCase1L()
+	{
+	INFO_PRINTF1(_L("JournalFileUnitTest Test Case1"));
+
+//-------------------------------------------------------------------------------------	
+//Steps: 
+//	1.) create a corrupt journal file on C drive (by writing invalid event into the file /eg: with a value of EAddedFile+1000/) 
+//	2.) Create a journal
+//	3.) Add a file to the journal on C drive by invoking CJounral::AddL() 
+//	4.) this will create a new journal file object representing journal activity on drive C, however due to the corrupt file being already on the C drive CJournalFile::NewLC will throw KErrCorrupt
+//  5.) expect KErrCorrupt	
+//  note: the purpose of this testcase to excersise the conditional branches in CJournal::PrepareToWriteL		
+//-------------------------------------------------------------------------------------
+	
+	TInt err=0;
+	TDriveUnit driveUnitC(KDriveLetterC);
+	TDriveUnit driveUnitE(KDriveLetterE);
+	
+	
+	HBufC* journalFileName = HBufC::NewLC(KMaxFileName);
+	HBufC* targetFileName = HBufC::NewLC(KMaxFileName);
+	
+	TPtr journalFileNamePtr(journalFileName->Des());
+	journalFileNamePtr.Append(driveUnitC.Name());
+	CJournal::CreateJournalFileNameL(iTrID, iJournalPathInIni, journalFileNamePtr); 
+	
+	//create file path base (eg: drive:\path\)
+	TPtr targetFileNameBasePtr(targetFileName->Des());
+	targetFileNameBasePtr.Append(driveUnitC.Name());
+	targetFileNameBasePtr.Append(iJournalPathInIni);
+	
+	//open up the file via the test file interface (for writing corrupt data)
+	iTestFileInterface->CreateJournalFileL(journalFileNamePtr, defaultJournalFileMode);
+	TInt seekPosition=0;
+	TIntValue intValue = {0};
+	intValue.int32=static_cast<TInt32>(EAddedFile)+1000; //corrupt data in file (eg: write operation value to an invalid value)
+	//corrupt data in journal file
+	iTestFileInterface->SeekInJournalFileL(ESeekStart, seekPosition);
+	iTestFileInterface->WriteIntToJournalFileL(intValue, Mode32Bit);
+	iTestFileInterface->CloseJournalFile();
+
+	TPtr targetFileNamePtr(targetFileNameBasePtr);
+	targetFileNamePtr.Append(_L("dummyadd.txt"));
+	
+	//create a journal and add a file on C drive: that will force CJournalFile to read in and process the  
+	//previously created corrupt file. As the file contains corrupt information CJournalFile construction is expected to fail with KErrCorrupt 
+	CJournal* journal = CJournal::NewLC(iFs, iLoader, iTrID, iJournalPathInIni);
+	TRAP(err, journal->AddL(targetFileNamePtr));
+	if(err!=KErrCorrupt)
+		{
+		ERR_PRINTF2(_L("<font color=red>CJournal::AddL() returned incorrect error code. KErrCorrupt is expected and %d is returned!</font>"), err);
+		SetTestStepResult(EFail);
+		}
+	CleanupStack::PopAndDestroy(journal); journal=0;
+
+	//clean up: delete created journal file and drive file (.drv)
+	DeleteFileL(*journalFileName);
+	//reuse targetFileName buffer to create .drv filename to delete that file
+	*targetFileName=KEmptyString;
+	targetFileNamePtr.Set(targetFileName->Des());
+	CJournal::CreateDrvFileNameL(iTrID, iJournalPathInIni, targetFileNamePtr);
+	TRAP_IGNORE(DeleteFileL(targetFileNamePtr)); //clean up .drv file in case it's been created but avoid causing leave in case it hasn't 
+	
+	CleanupStack::PopAndDestroy(targetFileName);
+	CleanupStack::PopAndDestroy(journalFileName);
+	}
+
+//------------------------------------------------------------------------------------------------------------
+
+
+CJournalUnitTestScenarioBase::CJournalUnitTestScenarioBase(CStsTestServer &aStsTestServer): CStsBaseTestStep(aStsTestServer) 
+	{
+	iDriveUnitC = _L("c"); 
+	iDriveUnitE = _L("e");
+	}
+
+CJournalUnitTestScenarioBase::~CJournalUnitTestScenarioBase()
+	{
+	iFs.Close();
+	iLoader.Close();
+	delete iTargetFileName;
+	delete iJournalFileName;
+	delete iDrvFileName;
+	delete iBackupFileName;
+	}
+
+void CJournalUnitTestScenarioBase::ImplTestStepPreambleL()
+	{
+	INFO_PRINTF1(_L("CJournalUnitTestScenarioBase::ImplTestStepPreambleL()"));
+	iJournalPathInIni.Set(GetTargetFilePathFromConfigL());
+	iTrID = GetTransactionIdFromConfigL();
+	User::LeaveIfError(iFs.Connect());
+	User::LeaveIfError(iLoader.Connect());
+	iTargetFileName = HBufC::NewL(KMaxFileName);
+	iJournalFileName = HBufC::NewL(KMaxFileName);
+	iDrvFileName = HBufC::NewL(KMaxFileName);
+	iBackupFileName = HBufC::NewL(KMaxFileName);
+
+	TPtr ptr(iJournalFileName->Des());
+	ptr.Append(iDriveUnitC.Name());
+	ptr.Append(iJournalPathInIni);
+	ptr.AppendNumUC(iTrID, EHex);
+	ptr.Append(KKournalFileExt);
+	
+	ptr.Set(iTargetFileName->Des());
+	ptr.Append(iDriveUnitC.Name());
+	ptr.Append(iJournalPathInIni);
+
+	ptr.Set(iDrvFileName->Des());
+	CJournal::CreateDrvFileNameL(iTrID, iJournalPathInIni, ptr);
+
+	SetTestStepResult(EPass);
+	}
+
+void CJournalUnitTestScenarioBase::ImplTestStepL()
+	{
+	INFO_PRINTF1(_L("CJournalUnitTestScenarioBase::ImplTestStepL()"));
+
+	TPtr basePathPtr(iTargetFileName->Des());
+	TPtr fileNamePtr(basePathPtr);
+	TCleanupItem inTestCleanupItem(&CJournalUnitTestScenarioBase::InTestCleanUp, this);
+	CleanupStack::PushL(inTestCleanupItem);
+
+	CJournal* journal = CJournal::NewLC(iFs, iLoader, iTrID, iJournalPathInIni);
+	
+	*iBackupFileName=KEmptyString;
+	TPtr backupFileNamePtr(iBackupFileName->Des());
+	fileNamePtr.Set(basePathPtr);
+	fileNamePtr.Append(_L("journal_oom_test_dummyremovefile.txt"));
+	basePathPtr.Replace(0, 2, iDriveUnitC.Name());
+	journal->RemoveL(fileNamePtr, backupFileNamePtr);
+	*iBackupFileName=KEmptyString;
+	backupFileNamePtr.Set(iBackupFileName->Des());
+	basePathPtr.Replace(0, 2, iDriveUnitE.Name());
+	journal->RemoveL(fileNamePtr, backupFileNamePtr);
+	
+	  
+	fileNamePtr.Set(basePathPtr);
+	fileNamePtr.Append(_L("journal_oom_test_dummytempfile.txt"));
+	basePathPtr.Replace(0, 2, iDriveUnitC.Name());
+	journal->TemporaryL(fileNamePtr);
+	basePathPtr.Replace(0, 2, iDriveUnitE.Name());
+	journal->TemporaryL(fileNamePtr);
+	
+	
+	fileNamePtr.Set(basePathPtr);
+	fileNamePtr.Append(_L("journal_oom_test_dummyaddfile.txt"));
+	basePathPtr.Replace(0, 2, iDriveUnitC.Name());
+	journal->AddL(fileNamePtr);
+	basePathPtr.Replace(0, 2, iDriveUnitE.Name());
+	journal->AddL(fileNamePtr);
+	  
+	ScenarioEndL(journal);
+	CleanupStack::PopAndDestroy(journal);
+	CleanupStack::PopAndDestroy(this);
+	}
+
+void CJournalUnitTestScenarioBase::ImplTestStepPostambleL()
+	{
+	INFO_PRINTF1(_L("CJournalUnitTestScenarioBase::ImplTestStepPostambleL()"));
+	delete iTargetFileName;
+	iTargetFileName=0;
+	delete iJournalFileName;
+	iJournalFileName=0;
+	delete iDrvFileName;
+	iDrvFileName=0;
+	delete iBackupFileName;
+	iBackupFileName=0;
+	iFs.Close();
+	iLoader.Close();
+	}
+
+/*static*/ void CJournalUnitTestScenarioBase::InTestCleanUp(TAny* aObject)
+	{
+	CJournalUnitTestScenarioBase* object=static_cast<CJournalUnitTestScenarioBase*>(aObject);
+	object->INFO_PRINTF1(_L("CJournalUnitTestScenarioBase::InTestCleanUp()"));
+
+	TPtr ptr(object->iJournalFileName->Des());
+	ptr.Replace(0, 2, object->iDriveUnitC.Name());
+	TRAP_IGNORE(object->DeleteFileL(ptr)); //delete journal file on C drive
+	ptr.Replace(0, 2, object->iDriveUnitE.Name());
+	TRAP_IGNORE(object->DeleteFileL(ptr)); //delete journal file on E drive
+	TRAP_IGNORE(object->DeleteFileL(*(object->iDrvFileName))); //delete drv file on system drive
+	}
+
+//------------------------------------------------------------------------------------------------------------
+
+CJournalUnitTestInstall::CJournalUnitTestInstall(CStsTestServer &aStsTestServer): CJournalUnitTestScenarioBase(aStsTestServer)
+	{
+	// Call base class method to set up the human readable name for logging
+	SetTestStepName(KJournalUnitTestInstall);
+	}
+
+void CJournalUnitTestInstall::ScenarioEndL(CJournal* aJournal)
+	{
+	aJournal->CommitL();
+	}
+
+//------------------------------------------------------------------------------------------------------------
+
+CJournalUnitTestRollback::CJournalUnitTestRollback(CStsTestServer &aStsTestServer): CJournalUnitTestScenarioBase(aStsTestServer)
+	{
+	// Call base class method to set up the human readable name for logging
+	SetTestStepName(KJournalUnitTestRollback);
+	}
+
+void CJournalUnitTestRollback::ScenarioEndL(CJournal* aJournal)
+	{
+	aJournal->RollBackL();
+	}
+
+//------------------------------------------------------------------------------------------------------------
+
+
+CIntegrityServicesTestScenarioBase::CIntegrityServicesTestScenarioBase(CStsTestServer &aStsTestServer): CStsBaseTestStep(aStsTestServer) 
+	{
+	iDriveUnitC = _L("c"); 
+	iDriveUnitE = _L("e");
+	}
+
+CIntegrityServicesTestScenarioBase::~CIntegrityServicesTestScenarioBase()
+	{
+	iFs.Close();
+	iLoader.Close();
+	delete iTargetFileName;
+	delete iJournalFileName;
+	delete iDrvFileName;
+	delete iBackupFileName;
+	delete iTransactionBackupDirectoryPath;
+	}
+
+void CIntegrityServicesTestScenarioBase::ImplTestStepPreambleL()
+	{
+	INFO_PRINTF1(_L("IntegrityServicesTestOOM Preamble"));
+	iTargetPathInIni.Set(GetTargetFilePathFromConfigL());
+	iTrID = GetTransactionIdFromConfigL();
+	User::LeaveIfError(iFs.Connect());
+	User::LeaveIfError(iLoader.Connect());
+	iTargetFileName = HBufC::NewL(KMaxFileName);
+	iJournalFileName = HBufC::NewL(KMaxFileName);
+	iDrvFileName = HBufC::NewL(KMaxFileName);
+	iBackupFileName = HBufC::NewL(KMaxFileName);
+	iTransactionBackupDirectoryPath = HBufC::NewL(KMaxFileName);
+
+	TPtr ptr(iJournalFileName->Des());
+	ptr.Append(iDriveUnitC.Name());
+	CJournal::CreateJournalFileNameL(iTrID, KTransactionPath, ptr);
+
+	ptr.Set(iDrvFileName->Des());
+	CJournal::CreateDrvFileNameL(iTrID, KTransactionPath, ptr);
+	
+	TParsePtrC parse(*iDrvFileName);
+	ptr.Set(iTransactionBackupDirectoryPath->Des()); //this is the directory that holds the backup files for the transaction
+	ptr.Append(parse.DriveAndPath());
+	ptr.Append(parse.Name());
+	
+	ptr.Set(iTargetFileName->Des());
+	ptr.Append(iDriveUnitC.Name());
+	ptr.Append(iTargetPathInIni);
+	NormalizeDirectoryName(ptr); //removes trailing slash
+
+	SetTestStepResult(EPass);
+	}
+
+void CIntegrityServicesTestScenarioBase::ImplTestStepL()
+	{
+	TPtr basePathPtr(iTargetFileName->Des());
+	TPtr fileNamePtr(basePathPtr);
+	RFile newFile;
+	TUint fileMode(EFileShareExclusive | EFileWrite);
+	
+	TCleanupItem inTestCleanupItem(&CIntegrityServicesTestScenarioBase::InTestCleanUp, this);
+	CleanupStack::PushL(inTestCleanupItem);
+
+	CIntegrityServices* integrityServices = CIntegrityServices::NewLC(iTrID);
+	
+	fileNamePtr.Set(basePathPtr);
+	fileNamePtr.Append(_L("\\integrityservices_oom_test_dummyremovefile.txt"));
+	basePathPtr.Replace(0, 2, iDriveUnitC.Name());
+	integrityServices->RemoveL(fileNamePtr);
+	basePathPtr.Replace(0, 2, iDriveUnitE.Name());
+	integrityServices->RemoveL(fileNamePtr);
+	  
+	fileNamePtr.Set(basePathPtr);
+	fileNamePtr.Append(_L("\\integrityservices_oom_test_dummyregistertempfile.txt"));
+	basePathPtr.Replace(0, 2, iDriveUnitC.Name());
+	integrityServices->RegisterTemporaryL(fileNamePtr);
+	basePathPtr.Replace(0, 2, iDriveUnitE.Name());
+	integrityServices->RegisterTemporaryL(fileNamePtr);
+	
+	fileNamePtr.Set(basePathPtr);
+	fileNamePtr.Append(_L("\\integrityservices_oom_test_dummycreatetempfile.txt"));
+	basePathPtr.Replace(0, 2, iDriveUnitC.Name());
+	CleanupClosePushL(newFile);
+	integrityServices->CreateTemporaryL(fileNamePtr, newFile, fileMode);
+	CleanupStack::PopAndDestroy(&newFile);
+	basePathPtr.Replace(0, 2, iDriveUnitE.Name());
+	CleanupClosePushL(newFile);
+	integrityServices->CreateTemporaryL(fileNamePtr, newFile, fileMode);
+	CleanupStack::PopAndDestroy(&newFile);
+	
+	fileNamePtr.Set(basePathPtr);
+	fileNamePtr.Append(_L("\\integrityservices_oom_test_dummyaddfile.txt"));
+	basePathPtr.Replace(0, 2, iDriveUnitC.Name());
+	integrityServices->RegisterNewL(fileNamePtr);
+	basePathPtr.Replace(0, 2, iDriveUnitE.Name());
+	integrityServices->RegisterNewL(fileNamePtr);
+	 
+	fileNamePtr.Set(basePathPtr);
+	fileNamePtr.Append(_L("\\integrityservices_oom_test_dummycreatenewfile.txt"));
+	basePathPtr.Replace(0, 2, iDriveUnitC.Name());
+	CleanupClosePushL(newFile);
+	integrityServices->CreateNewL(fileNamePtr, newFile, fileMode);
+	CleanupStack::PopAndDestroy(&newFile);
+	basePathPtr.Replace(0, 2, iDriveUnitE.Name());
+	CleanupClosePushL(newFile);
+	integrityServices->CreateNewL(fileNamePtr, newFile, fileMode);
+	CleanupStack::PopAndDestroy(&newFile);
+	
+	fileNamePtr.Set(basePathPtr);
+	fileNamePtr.Append(_L("\\integrityservices_oom_test_dummyoverwritefile.txt"));
+	basePathPtr.Replace(0, 2, iDriveUnitC.Name());
+	CleanupClosePushL(newFile);
+	integrityServices->OverwriteL(fileNamePtr, newFile, fileMode);
+	CleanupStack::PopAndDestroy(&newFile);
+	basePathPtr.Replace(0, 2, iDriveUnitE.Name());
+	CleanupClosePushL(newFile);
+	integrityServices->OverwriteL(fileNamePtr, newFile, fileMode);
+	CleanupStack::PopAndDestroy(&newFile);
+	  
+	ScenarioEndL(integrityServices);
+	CleanupStack::PopAndDestroy(integrityServices);
+	CleanupStack::PopAndDestroy(this);
+	}
+
+void CIntegrityServicesTestScenarioBase::ImplTestStepPostambleL()
+	{
+	INFO_PRINTF1(_L("IntegrityServicesTestOOM Postamble"));
+	delete iTargetFileName;
+	iTargetFileName=0;
+	delete iJournalFileName;
+	iJournalFileName=0;
+	delete iDrvFileName;
+	iDrvFileName=0;
+	delete iBackupFileName;
+	iBackupFileName=0;
+	delete iTransactionBackupDirectoryPath;
+	iTransactionBackupDirectoryPath=0;
+	iFs.Close();
+	iLoader.Close();
+	}
+
+/*static*/void CIntegrityServicesTestScenarioBase::InTestCleanUp(TAny* aObject)
+	{
+	CIntegrityServicesTestScenarioBase* object=static_cast<CIntegrityServicesTestScenarioBase*>(aObject);
+	//first clean up transaction related files
+	TPtr ptr(object->iJournalFileName->Des());
+	ptr.Replace(0, 2, object->iDriveUnitC.Name());
+	TRAP_IGNORE(object->DeleteFileL(ptr)); //delete journal file on C drive
+	ptr.Replace(0, 2, object->iDriveUnitE.Name());
+	TRAP_IGNORE(object->DeleteFileL(ptr)); //delete journal file on E drive
+	TRAP_IGNORE(object->DeleteFileL(*(object->iDrvFileName))); //delete drv file on system drive
+	ptr.Set(object->iTransactionBackupDirectoryPath->Des());
+	ptr.Replace(0, 2, object->iDriveUnitC.Name());
+	TRAP_IGNORE(object->DeleteFileL(ptr)); //delete backup directory on C drive
+	ptr.Replace(0, 2, object->iDriveUnitE.Name());
+	TRAP_IGNORE(object->DeleteFileL(ptr)); //delete backup directory on E drive
+	
+	//then clean up all the added/created/etc... files
+	ptr.Set(object->iTargetFileName->Des());
+	ptr.Replace(0, 2, object->iDriveUnitC.Name());
+	TRAP_IGNORE(object->DeleteFileL(ptr)); //delete target dir on C drive
+	ptr.Replace(0, 2, object->iDriveUnitE.Name());
+	TRAP_IGNORE(object->DeleteFileL(ptr)); //delete target dir on E drive
+	
+	}
+
+void CIntegrityServicesTestScenarioBase::NormalizeDirectoryName(TDes& aFileName)
+{
+	TInt lastCharPos = aFileName.Length() - 1;
+	if ( lastCharPos >= 0 && aFileName[lastCharPos] == KPathDelimiter &&
+		 aFileName.Locate(KPathDelimiter) != lastCharPos) // Take care not to remove slash from "c:\" and the like
+		{
+		aFileName.Delete(lastCharPos, 1);
+		}			
+}
+
+//------------------------------------------------------------------------------------------------------------
+
+CIntegrityServicesTestInstall::CIntegrityServicesTestInstall(CStsTestServer &aStsTestServer): CIntegrityServicesTestScenarioBase(aStsTestServer)
+	{
+	// Call base class method to set up the human readable name for logging
+	SetTestStepName(KIntegrityservicesUnitTestInstall);
+	}
+
+void CIntegrityServicesTestInstall::ScenarioEndL(Usif::CIntegrityServices* aIntegrServ)
+	{
+	aIntegrServ->CommitL();
+	}
+
+//------------------------------------------------------------------------------------------------------------
+
+CIntegrityServicesTestRollback::CIntegrityServicesTestRollback(CStsTestServer &aStsTestServer): CIntegrityServicesTestScenarioBase(aStsTestServer)
+	{
+	// Call base class method to set up the human readable name for logging
+	SetTestStepName(KIntegrityservicesUnitTestRollback);
+	}
+
+void CIntegrityServicesTestRollback::ScenarioEndL(Usif::CIntegrityServices* aIntegrServ)
+	{
+	aIntegrServ->RollBackL();
+	}