diff -r 000000000000 -r ba25891c3a9e installationservices/swi/test/tintegrityservices/tintegrityservicesstep.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/installationservices/swi/test/tintegrityservices/tintegrityservicesstep.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,477 @@ +/* +* 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 "dummyintegrityservices.h" +#include +#include +#include "testutilclientswi.h" + + +///////////////////////////////////////////////////////////////////// +// Tags used by test steps +///////////////////////////////////////////////////////////////////// + +_LIT(KRemoveFile, "removefile"); +_LIT(KTempFile, "temporaryfile"); +_LIT(KAddFile, "addfile"); +_LIT(KFailType, "failtype"); +_LIT(KFailPosition, "failposition"); +_LIT(KFailFileName, "failfilename"); +_LIT(KPresent, "present"); +_LIT(KAbsent, "absent"); +_LIT(KCleanupFile, "cleanupfile"); +_LIT(KCleanupDirectory, "cleanupdirectory"); +_LIT(KArbitraryOpFile, "arbitraryopfile"); +_LIT(KOperation, "operation"); + +using namespace Swi; +using namespace Swi::Test; + +///////////////////////////////////////////////////////////////////// +// CIntegrityServicesStep +///////////////////////////////////////////////////////////////////// +TVerdict CIntegrityServicesStepBase::doTestStepPreambleL() + { + __UHEAP_MARK; + + // Install an active scheduler + CActiveScheduler* s = new (ELeave) CActiveScheduler; + s->Install(s); + + User::LeaveIfError(iIntegritySession.Connect()); + + ReadFailureSettings(); + return TestStepResult(); + } + +TVerdict CIntegrityServicesStepBase::doTestStepPostambleL() + { + // Remove the installed active scheduler + CActiveScheduler* s = CActiveScheduler::Current(); + s->Install(NULL); + delete s; + + iIntegritySession.Close(); + + __UHEAP_MARKEND; + + return TestStepResult(); + } + +void CIntegrityServicesStepBase::GetStringArrayFromConfigL(const TDesC& aSectName, const TDesC& aKeyName, RArray& aArray) + { + _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() + { + TInt result = ETrue; + RTestUtilSessionSwi testutil; + User::LeaveIfError(testutil.Connect()); + CleanupClosePushL(testutil); + RArray fileArray; + CleanupClosePushL(fileArray); + + GetStringArrayFromConfigL(ConfigSection(), KPresent, fileArray); + for (TInt file = 0; file < fileArray.Count();file++) + { + if(testutil.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(testutil.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); + + CleanupStack::PopAndDestroy(&testutil); + return result; + } + +void 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.SetSimulatedFailure(failType, failPosition, failFileName); + } + +void CIntegrityServicesStepBase::doInstallL() + { + RArray 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 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() + { + RArray fileArray; + CleanupClosePushL(fileArray); + + RTestUtilSessionSwi testutil; + User::LeaveIfError(testutil.Connect()); + CleanupClosePushL(testutil); + + GetStringArrayFromConfigL(ConfigSection(), KCleanupFile, fileArray); + for (TInt file = 0; file < fileArray.Count();file++) + { + TInt err = testutil.Delete(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++) + { + TInt err = testutil.RmDir(fileArray[file]); + if(err != KErrNone && err != KErrPathNotFound && err != KErrNotFound) + { + User::Leave(err); + } + } + fileArray.Reset(); + + CleanupStack::PopAndDestroy(&testutil); + CleanupStack::PopAndDestroy(&fileArray); + } + +///////////////////////////////////////////////////////////////////// +// CInstallStep +///////////////////////////////////////////////////////////////////// +CInstallStep::CInstallStep() + { + SetTestStepName(KInstall); + } + +TVerdict CInstallStep::doTestStepL() + { + TRAPD(err, doInstallL()); + + if(err == KErrNone || err == KIntegrityServicesSimulatedBatteryFailure) + { + if(CheckFilesL()) + { + SetTestStepResult(EPass); + } + else + { + SetTestStepResult(EFail); + } + } + else + { + User::Leave(err); + } + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CRecoverStep +///////////////////////////////////////////////////////////////////// +CRecoverStep::CRecoverStep() + { + SetTestStepName(KRecover); + } + +TVerdict CRecoverStep::doTestStepL() + { + // begin recovery + TRAPD(err, doRecoverL()); + + if(err == KErrNone || err == KIntegrityServicesSimulatedBatteryFailure) + { + if(CheckFilesL()) + { + SetTestStepResult(EPass); + } + else + { + SetTestStepResult(EFail); + } + } + else + { + User::Leave(err); + } + + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CCleanupStep +///////////////////////////////////////////////////////////////////// +CCleanupStep::CCleanupStep() + { + SetTestStepName(KCleanup); + } + +TVerdict CCleanupStep::doTestStepL() + { + doCleanupL(); + + SetTestStepResult(EPass); + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// COOMStep +///////////////////////////////////////////////////////////////////// +COOMStep::COOMStep() + { + SetTestStepName(KOOM); + } + +TVerdict COOMStep::doTestStepL() + { + const TInt maxFailCount = 200; + + __UHEAP_MARK; + + TInt installFailCount = 0; + TInt installResult = KErrNoMemory; + + while(installResult != KErrNone && installFailCount < maxFailCount) + { + INFO_PRINTF2(_L("OOM InstallFailCount: %d"), installFailCount); + + __UHEAP_MARK; + + __UHEAP_FAILNEXT(installFailCount); + + TRAP(installResult, doInstallL()); + + __UHEAP_MARKEND; + + __UHEAP_RESET; + + if(installResult == KErrNone) + { + if(CheckFilesL()) + { + SetTestStepResult(EPass); + } + else + { + SetTestStepResult(EFail); + } + + doCleanupL(); + } + else if(installResult == KErrNoMemory) + { + // recover any partial installation, again testing oom + TInt recoverFailCount = 0; + TInt recoverResult = KErrNoMemory; + + while(recoverResult != KErrNone && recoverFailCount < maxFailCount) + { + INFO_PRINTF2(_L("OOM RecoverFailCount: %d"), recoverFailCount); + + __UHEAP_MARK; + + __UHEAP_FAILNEXT(recoverFailCount); + + TRAP(recoverResult, doRecoverL()); + + __UHEAP_MARKEND; + + __UHEAP_RESET; + + // Fail further into the test + recoverFailCount++; + } + } + else + { + User::Leave(installResult); + } + + + // Fail further into the test + installFailCount++; + } + __UHEAP_MARKEND; + + SetTestStepResult(EPass); + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CRecoverStep +///////////////////////////////////////////////////////////////////// +CCheckStep::CCheckStep() + { + SetTestStepName(KCheck); + } + +TVerdict CCheckStep::doTestStepL() + { + // Just check for files + if(CheckFilesL()) + { + SetTestStepResult(EPass); + } + else + { + SetTestStepResult(EFail); + } + + return TestStepResult(); + }