diff -r 000000000000 -r 32704c33136d installationservices/swi/test/tsisregistrytest/sessionstep.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/installationservices/swi/test/tsisregistrytest/sessionstep.cpp Tue Jan 26 12:06:03 2010 +0200 @@ -0,0 +1,2721 @@ +/* +* 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 +#include + +#include "sessionstep.h" +#include "sisregistrysession.h" +#include "sisregistryentry.h" +#include "sisregistrypackage.h" +#include "installtypes.h" +#include "cleanuputils.h" +#include "hashcontainer.h" +#include "testutilclientswi.h" +#include "arrayutils.h" +#include "sisregistrytoken.h" +#include "sisregistrylog.h" +#include "s32file.h" +#include "sishelperclient.h" +#include "sisregistrywritableentry.h" +#include "sisregistryfiledescription.h" +#include "sisregistrydependency.h" +#include "sisregistryobject.h" +#include "controllerinfo.h" +#include "hashcontainer.h" +#include "sisregistryproperty.h" + +const TInt KDefaultBufferSize = 2048; +///////////////////////////////////////////////////////////////////// +// defs, Constants used by test steps +///////////////////////////////////////////////////////////////////// + +_LIT(KNoUid, "nouid"); +_LIT(KUid, "uid"); +_LIT(KDrivebitmapcount, "drivebitmapcout"); +_LIT(KSid, "sid"); +_LIT(KPackage, "package"); +_LIT(KVendor, "vendor"); +_LIT(KSisFile, "sis"); +_LIT(KKeyFormat, "-%02d"); +_LIT(KSidFileNameSec, "file"); +_LIT(KModFileName, "file"); +_LIT(KModTag, "modtag"); +_LIT(KHashFileName, "file"); +_LIT(KHashFileValue, "hashvalue"); +_LIT(KRootCertTag, "rootcert"); +_LIT(KResultTag, "expectedresult"); +_LIT(KDateTime, "datetime"); //YYYYMMDD:HHMMSS.MMMMMM +_LIT(KPkgCount, "embeddingpkgcount"); +_LIT(KCertChainCount, "certChainCount"); +_LIT(KLanguage, "language"); + +_LIT(KSisRegistryPath, "\\sys\\install\\sisregistry\\"); +_LIT(KCacheBackupFile, "\\sys\\install\\sisregistry\\backup.lst"); +_LIT(KCorruptCacheBackupFile, "z:\\tswi\\tsisregistrytest\\data\\hashforlang_txt.dat"); +_LIT(KSysBackupFileBackup, "\\sys\\install\\sisregistry\\backup.bak"); + +///////////////////////////////////////////////////////////////////// +// Tags used by test steps +///////////////////////////////////////////////////////////////////// +using namespace Swi; + +///////////////////////////////////////////////////////////////////// +// CSisRegistrySessionStep +///////////////////////////////////////////////////////////////////// +TVerdict CSisRegistrySessionStep::doTestStepPreambleL() + { + __UHEAP_MARK; + + // Install an active scheduler + CActiveScheduler* s = new (ELeave) CActiveScheduler; + s->Install(s); + + INFO_PRINTF1(_L("Connecting to SisRegistry..")); + User::LeaveIfError(iSisRegistry.Connect()); + INFO_PRINTF1(_L("Connected!")); + + StartTimer(); + return TestStepResult(); + } + +TVerdict CSisRegistrySessionStep::doTestStepPostambleL() + { + StopTimerAndPrintResultL(); + // Remove the installed active scheduler + CActiveScheduler* s = CActiveScheduler::Current(); + s->Install(NULL); + delete s; + INFO_PRINTF1(_L("Disconnecting from SisRegistry..")); + iSisRegistry.Close(); + + __UHEAP_MARKEND; + + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CRegistryEntryStep +///////////////////////////////////////////////////////////////////// +TVerdict CRegistryEntryStep::doTestStepPreambleL() + { + CSisRegistrySessionStep::doTestStepPreambleL(); + TUid pckgUid; + if(!GetUidFromConfig(ConfigSection(), KUid, pckgUid)) + { + ERR_PRINTF1(_L("Package UID is missing in the configuration file!")); + SetTestStepResult(EFail); + return TestStepResult(); + } + + TInt err = iRegistryEntry.Open(iSisRegistry, pckgUid); + if (KErrNone != err) + { + ERR_PRINTF2(_L("Registry entry couldn't be opened (Error code=%d)!"), err); + SetTestStepResult(EFail); + return TestStepResult(); + } + StartTimer(); // Start timer again to ignore the time taken to open the registry entry + return TestStepResult(); + } + +TVerdict CRegistryEntryStep::doTestStepPostambleL() + { + iRegistryEntry.Close(); + CSisRegistrySessionStep::doTestStepPostambleL(); + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CEmbeddingPackageStep - Checks the embedding packages for a given package +///////////////////////////////////////////////////////////////////// +CEmbeddingPackageStep::CEmbeddingPackageStep() + { + SetTestStepName(KEmbeddingPackageStep); + } + +TVerdict CEmbeddingPackageStep::doTestStepL() + { + SetTestStepResult(EPass); + + TInt embeddingPkgCount; + if(!GetIntFromConfig(ConfigSection(), KPkgCount, embeddingPkgCount)) + { + ERR_PRINTF1(_L("Missing expected package count")); + SetTestStepResult(EFail); + return TestStepResult(); + } + + RPointerArray packages; + //StartTimer again to ignore time taken to read from config file + StartTimer(); + iRegistryEntry.EmbeddingPackagesL(packages); + CleanupResetAndDestroyPushL(packages); + + if(packages.Count() != embeddingPkgCount) + { + ERR_PRINTF3(_L("The actual number of embedding packages does not meet expected. Expected: %d Actual: %d"), embeddingPkgCount, packages.Count()); + SetTestStepResult(EFail); + } + CleanupStack::PopAndDestroy(&packages); + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CSidFileStep - Checks the filename to sid mapping +///////////////////////////////////////////////////////////////////// +CSidFileStep::CSidFileStep() + { + SetTestStepName(KSidFileName); + } + +TVerdict CSidFileStep::doTestStepL() + { + RArray theSids; + CleanupClosePushL(theSids); + GetUidArrayFromConfigL(ConfigSection(), KSid, theSids); + + //RArray thePackageUids; + //CleanupClosePushL(thePackageUids); + //GetUidArrayFromConfigL(ConfigSection(), KUid, thePackageUids); + + RArray expectedSidNames; + CleanupClosePushL(expectedSidNames); + GetStringArrayFromConfigL(ConfigSection(), KSidFileNameSec, expectedSidNames); + + SetTestStepResult(EPass); + + if (theSids.Count() != expectedSidNames.Count()) + { + User::LeaveIfError(KErrCorrupt); + } + + TBuf fileName; + //StartTimer again to ignore time taken to read from config file + StartTimer(); + for (TInt sidCount(0); sidCount theFileNames; + CleanupClosePushL(theFileNames); + GetStringArrayFromConfigL(ConfigSection(), KModFileName, theFileNames); + + RArray expectedModifiableTags; + CleanupClosePushL(expectedModifiableTags); + GetIntArrayFromConfigL(ConfigSection(), KModTag, expectedModifiableTags); + + SetTestStepResult(EPass); + + if (theFileNames.Count() != expectedModifiableTags.Count()) + { + User::LeaveIfError(KErrCorrupt); + } + + TInt numModFiles = theFileNames.Count(); + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + + for (TInt i=0; i theFileNames; + CleanupClosePushL(theFileNames); + GetStringArrayFromConfigL(ConfigSection(), KHashFileName, theFileNames); + + // Get the filenames that contain the expected hash values, + // from the test section. + RArray expectedHashFiles; + CleanupClosePushL(expectedHashFiles); + GetStringArrayFromConfigL(ConfigSection(), KHashFileValue, expectedHashFiles); + + // Initialise the test step result to pass. + SetTestStepResult(EPass); + + // Ensure that there are as many filenames whose hash will be calculated, + // as there are files with expected hash values. + TInt numModFiles = theFileNames.Count(); + if (numModFiles != expectedHashFiles.Count()) + { + User::LeaveIfError(KErrCorrupt); + } + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + + // For each file in config section KHashFileName, calculate its hash + // value and compare it with the corresponding expected hash value. + // Fail the test case if they don't match. + for (TInt i=0; iData(); + INFO_PRINTF2(_L("Received hash with length %d"), calcHashValue.Length()); + + // Open for reading the file that has the expected hash value. + INFO_PRINTF2(_L("Reading Expected hash value from: %S"), &expectedHashFiles[i]); + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + + RFile fileToRead; + User::LeaveIfError(fileToRead.Open(fs, expectedHashFiles[i], + EFileRead | EFileShareReadersOnly | EFileStream)); + CleanupClosePushL(fileToRead); + + // Create a block of memory to store the expected hash value. + TInt fileSize = 0; + User::LeaveIfError(fileToRead.Size(fileSize)); + HBufC8* memForExpectedHashValue = HBufC8::NewLC(fileSize); + + // Read the expected hash value into the previously created memory block. + TPtr8 expectedHashValue(memForExpectedHashValue->Des()); + User::LeaveIfError(fileToRead.Read(0, expectedHashValue, fileSize)); + + INFO_PRINTF2(_L("Expecting hash with length %d"), expectedHashValue.Length()); + + INFO_PRINTF1(_L("Comparing hash values")); + + // Compare the calculated has value against its expected value. + if (calcHashValue.Compare(expectedHashValue) != KErrNone) + { + SetTestStepResult(EFail); + + // Items popped and cleaned up from the stack (in this order): + // memForExpectedHashValue, &fileToRead, &fs and hashContainer. + CleanupStack::PopAndDestroy(4, hashContainer); + + break; + } + + // Items popped and cleaned up from the stack (in this order): + // memForExpectedHashValue, &fileToRead, &fs and hashContainer. + CleanupStack::PopAndDestroy(4, hashContainer); + } + + // Items popped and cleaned up from the stack (in this order): + // &expectedHashFiles and &theFileNames. + CleanupStack::PopAndDestroy(2, &theFileNames); + + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CInstalledUidsStep - checks installed packages Uids list +///////////////////////////////////////////////////////////////////// +CInstalledUidsStep::CInstalledUidsStep() + { + SetTestStepName(KInstalledUids); + } + +TVerdict CInstalledUidsStep::doTestStepL() + { + RArray expectedUids; + CleanupClosePushL(expectedUids); + GetUidArrayFromConfigL(ConfigSection(), KUid, expectedUids); + + RArray actualUids; + CleanupClosePushL(actualUids); + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + iSisRegistry.InstalledUidsL(actualUids); + + SetTestStepResult(EPass); + + for (TInt index=0; index < expectedUids.Count(); index++) + { + if(actualUids.Find(expectedUids[index]) != KErrNotFound) + { + INFO_PRINTF2(_L("Uid: 0x%08x was found!"), expectedUids[index]); + } + else + { + SetTestStepResult(EFail); + ERR_PRINTF2(_L("Uid: 0x%08x not found!"), expectedUids[index]); + } + } + + CleanupStack::PopAndDestroy(2, &expectedUids); //actualUids + + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CInstalledPackagesStep - checks installed packages names and vendor list +///////////////////////////////////////////////////////////////////// +CInstalledPackagesStep::CInstalledPackagesStep() + { + SetTestStepName(KInstalledPackages); + } + +TVerdict CInstalledPackagesStep::doTestStepL() + { + RArray expectedUids; + CleanupClosePushL(expectedUids); + GetUidArrayFromConfigL(ConfigSection(), KUid, expectedUids); + + RArray expectedPackageNames; + CleanupClosePushL(expectedPackageNames); + GetStringArrayFromConfigL(ConfigSection(), KPackage, expectedPackageNames); + + RArray expectedVendorNames; + CleanupClosePushL(expectedVendorNames); + GetStringArrayFromConfigL(ConfigSection(), KVendor, expectedVendorNames); + + RPointerArray packages; + CleanupResetAndDestroy >::PushL(packages); + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + iSisRegistry.InstalledPackagesL(packages); + + SetTestStepResult(EPass); + + for (TInt expected = 0; expected < expectedPackageNames.Count(); expected++) + { + TBool result = EFalse; + for (TInt actual = 0; actual < packages.Count(); ++actual) + { + if (packages[actual]->Uid() == expectedUids[expected] && + !packages[actual]->Name().CompareF(expectedPackageNames[expected]) && + !packages[actual]->Vendor().CompareF(expectedVendorNames[expected])) + { + result = ETrue; + break; + } + } + + if(result) + { + INFO_PRINTF3(_L("Package %S by Vendor %S was found!"), &expectedPackageNames[expected], &expectedVendorNames[expected]); + } + else + { + SetTestStepResult(EFail); + ERR_PRINTF3(_L("Package %S by Vendor %S was not found!"), &expectedPackageNames[expected], &expectedVendorNames[expected]); + } + } + + CleanupStack::PopAndDestroy(4, &expectedUids); //packages, expectedVendorNames, expectedPackageNames + + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CRemovablePackagesStep - checks removable packages names and vendor list +///////////////////////////////////////////////////////////////////// +CRemovablePackagesStep::CRemovablePackagesStep() + { + SetTestStepName(KRemovablePackages); + } + +TVerdict CRemovablePackagesStep::doTestStepL() + { + RArray expectedNoUids; + CleanupClosePushL(expectedNoUids); + GetUidArrayFromConfigL(ConfigSection(), KNoUid, expectedNoUids); + + RArray expectedUids; + CleanupClosePushL(expectedUids); + GetUidArrayFromConfigL(ConfigSection(), KUid, expectedUids); + + RArray expectedPackageNames; + CleanupClosePushL(expectedPackageNames); + GetStringArrayFromConfigL(ConfigSection(), KPackage, expectedPackageNames); + + RArray expectedVendorNames; + CleanupClosePushL(expectedVendorNames); + GetStringArrayFromConfigL(ConfigSection(), KVendor, expectedVendorNames); + + RPointerArray packages; + CleanupResetAndDestroy >::PushL(packages); + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + + iSisRegistry.RemovablePackagesL(packages); + + TInt expected = 0; + for (expected = 0; expected < expectedPackageNames.Count(); expected++) + { + TBool result = EFalse; + for (TInt actual = 0; actual < packages.Count(); ++actual) + { + if (packages[actual]->Uid() == expectedUids[expected] && + !packages[actual]->Name().CompareF(expectedPackageNames[expected]) && + !packages[actual]->Vendor().CompareF(expectedVendorNames[expected])) + { + result = ETrue; + break; + } + } + + if(result) + { + INFO_PRINTF3(_L("Package %S by Vendor %S was found!"), &expectedPackageNames[expected], &expectedVendorNames[expected]); + } + else + { + SetTestStepResult(EFail); + ERR_PRINTF3(_L("Package %S by Vendor %S was not found!"), &expectedPackageNames[expected], &expectedVendorNames[expected]); + } + } + + for (expected = 0; expected < expectedNoUids.Count(); expected++) + { + TBool result = ETrue; + for (TInt actual = 0; actual < packages.Count(); ++actual) + { + if (packages[actual]->Uid() == expectedNoUids[expected]) + { + result = EFalse; + break; + } + } + + if(result) + { + INFO_PRINTF2(_L("Non-Removable Package %d was not found!"), &expectedNoUids[expected]); + } + else + { + SetTestStepResult(EFail); + ERR_PRINTF2(_L("Non-Removable Package %d was found!"), &expectedNoUids[expected]); + } + } + + CleanupStack::PopAndDestroy(5, &expectedNoUids); //packages, expectedVendorNames, expectedPackageNames + + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CNonRemovablePackagesStep - checks Non-removable packages in rom +///////////////////////////////////////////////////////////////////// +CInRomNonRemovablePackage::CInRomNonRemovablePackage() + { + SetTestStepName(KInRomNonRemovablePackages); + } + +TVerdict CInRomNonRemovablePackage::doTestStepL() + { + RPointerArray packages; + CleanupResetAndDestroy >::PushL(packages); + + iSisRegistry.RemovablePackagesL(packages); + + RSisRegistryEntry entry; + TBool inrom = EFalse; + for (TInt i = 0; i < packages.Count(); ++i) + { + User::LeaveIfError(entry.OpenL(iSisRegistry, *packages[i])); + inrom = entry.IsInRomL(); + + if(inrom) + { + SetTestStepResult(EFail); + } + } + INFO_PRINTF1(_L("Packages which are removable are not in ROM")); + CleanupStack::PopAndDestroy(&packages); + + return TestStepResult(); + } + +////////////////////////////////////////////////////////////////////////////// +// CInstalledDrives - check all the drives where files are installed from SIS +////////////////////////////////////////////////////////////////////////////// +CInstalledDrives::CInstalledDrives() + { + SetTestStepName(KInstalledDrives); + } + +TVerdict CInstalledDrives::doTestStepL() + { + TInt drivebitmapcount=0; + TUid expectedUid; + GetUidFromConfig(ConfigSection(), KUid, expectedUid); + GetIntFromConfig(ConfigSection(), KDrivebitmapcount, drivebitmapcount); + + RSisRegistryEntry entry; + CleanupClosePushL(entry); + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + + User::LeaveIfError(entry.Open(iSisRegistry, expectedUid)); + + TUint drives = entry.InstalledDrivesL(); + if (drives != drivebitmapcount) + { + SetTestStepResult(EFail); + INFO_PRINTF3(_L("Drive bitmask count is not correct, expected %d but received %d"), drivebitmapcount, drives); + } + else + { + INFO_PRINTF1(_L("Drive bitmask count is OK...")); + } + + CleanupStack::PopAndDestroy(&entry); + + return TestStepResult(); + } + + +///////////////////////////////////////////////////////////////////// +// CIsUidInstalledStep - checks whether an Uid is registered +///////////////////////////////////////////////////////////////////// +CIsUidInstalledStep::CIsUidInstalledStep() + { + SetTestStepName(KIsUidInstalled); + } + +TVerdict CIsUidInstalledStep::doTestStepL() + { + RArray expectedUids; + CleanupClosePushL(expectedUids); + GetUidArrayFromConfigL(ConfigSection(), KUid, expectedUids); + + SetTestStepResult(EPass); + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + + for (TInt index = 0; index < expectedUids.Count(); index++) + { + if(iSisRegistry.IsInstalledL(expectedUids[index])) + { + INFO_PRINTF2(_L("Uid: 0x%08x was found!"), expectedUids[index]); + } + else + { + SetTestStepResult(EFail); + ERR_PRINTF2(_L("Uid: 0x%08x not found!"), expectedUids[index]); + } + } + CleanupStack::PopAndDestroy(&expectedUids); + + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CIsPackageInstalledStep - checks if packages are registered +///////////////////////////////////////////////////////////////////// + +CIsPackageInstalledStep::CIsPackageInstalledStep() + { + SetTestStepName(KIsPackageInstalled); + } + +TVerdict CIsPackageInstalledStep::doTestStepL() + { + RArray expectedUids; + CleanupClosePushL(expectedUids); + GetUidArrayFromConfigL(ConfigSection(), KUid, expectedUids); + + RArray expectedPackageNames; + CleanupClosePushL(expectedPackageNames); + GetStringArrayFromConfigL(ConfigSection(), KPackage, expectedPackageNames); + + RArray expectedVendorNames; + CleanupClosePushL(expectedVendorNames); + GetStringArrayFromConfigL(ConfigSection(), KVendor, expectedVendorNames); + + RPointerArray packages; + CleanupResetAndDestroy >::PushL(packages); + + SetTestStepResult(EPass); + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + + for (TInt i = 0; i < expectedUids.Count(); ++i) + { + CSisRegistryPackage* package = CSisRegistryPackage::NewLC(expectedUids[i], + expectedPackageNames[i], expectedVendorNames[i]); + package->SetIndex(0); + + RSisRegistryEntry entry; + CleanupClosePushL(entry); + + TInt err = entry.Open(iSisRegistry, package->Name(), package->Vendor()); + if (err != KErrNone) + { + SetTestStepResult(EFail); + ERR_PRINTF2(_L("Uid: 0x%08x not found!"), expectedUids[i]); + } + + CleanupStack::PopAndDestroy(2, package); //entry + } + + CleanupStack::PopAndDestroy(4, &expectedUids); // expectedVendorNames, expectedPackageNames + + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CIsControllerInstalledStep - checks whether a Controller is present +///////////////////////////////////////////////////////////////////// +CIsControllerInstalledStep::CIsControllerInstalledStep() + { + SetTestStepName(KIsControllerInstalled); + } + +TVerdict CIsControllerInstalledStep::doTestStepL() + { + RArray expectedControllersSisFiles; + CleanupClosePushL(expectedControllersSisFiles); + GetStringArrayFromConfigL(ConfigSection(), KSisFile, expectedControllersSisFiles); + + SetTestStepResult(EPass); + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + + for (TInt index = 0; index < expectedControllersSisFiles.Count(); index++) + { + HBufC8* controllerData = GetControllerFromSisLC(expectedControllersSisFiles[index]); + const TInt controllerOffset = 4; + // The registry does not store the first 4 bytes of the controller - see CInstallationProcessor + TPtrC8 controllerDataPtr = controllerData->Mid(controllerOffset); + + if(iSisRegistry.IsInstalledL(controllerDataPtr)) + { + INFO_PRINTF2(_L("%S matching controller was found!"), &expectedControllersSisFiles[index]); + } + else + { + SetTestStepResult(EFail); + INFO_PRINTF2(_L("%S controller did not match expected!"), &expectedControllersSisFiles[index]); + } + CleanupStack::PopAndDestroy(controllerData); + } + CleanupStack::PopAndDestroy(2, &expectedControllersSisFiles); //fs., + + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CGetControllersStep - checks whether one can get the binary version +// of entry controllers present +///////////////////////////////////////////////////////////////////// +CGetControllersStep::CGetControllersStep() + { + SetTestStepName(KGetControllers); + } + +TVerdict CGetControllersStep::doTestStepL() + { + SetTestStepResult(EPass); + RArray expectedUids; + CleanupClosePushL(expectedUids); + GetUidArrayFromConfigL(ConfigSection(), KUid, expectedUids); + RFs fs; + CleanupClosePushL(fs); + User::LeaveIfError(fs.Connect()); + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + + for (TInt index = 0; index < expectedUids.Count(); index++) + { + TInt res; + RSisRegistryEntry entry; + CleanupClosePushL(entry); + INFO_PRINTF3(_L("Open: %08x %d entry!"), expectedUids[index],index); + res = entry.Open(iSisRegistry, expectedUids[index]); + if (res != KErrNone) + { + SetTestStepResult(EFail); + INFO_PRINTF2(_L("Failed Open Uid: %08x entry!"), expectedUids[index]); + User::Leave(res); + } + + RPointerArray actualControllers; + CleanupResetAndDestroy >::PushL(actualControllers); + TRAP(res, entry.ControllersL(actualControllers)); + if (res != KErrNone) + { + INFO_PRINTF3(_L("Accessing controllers for uid: %08x left with %d!"), expectedUids[index], res); + SetTestStepResult(EFail); + User::Leave(res); + } + + // In the test, we exctract the controllers from the SIS files in order to compare them with the ones stored in the registry + HBufC* keyName = HBufC::NewLC(KUid().Length() + KKeyFormat().Length() + + KSisFile().Length() + KKeyFormat().Length()); + TPtr ptr(keyName->Des()); + ptr = KUid(); + ptr.AppendFormat(KKeyFormat(), index + 1); + ptr.Append(KSisFile); + + RArray sisFilenames; + CleanupClosePushL(sisFilenames); + GetStringArrayFromConfigL(ConfigSection(), ptr, sisFilenames); + + if (sisFilenames.Count() != actualControllers.Count()) + { + ERR_PRINTF3(_L("Actual Controllers = %d, Expected Controllers = %d"), actualControllers.Count(), sisFilenames.Count()); + SetTestStepResult(EFail); + } + + for (TInt filenameIndex = 0; filenameIndex < sisFilenames.Count(); filenameIndex++) + { + HBufC8* controllerData = GetControllerFromSisLC(sisFilenames[filenameIndex]); + const TInt controllerOffset = 4; + // The registry does not store the first 4 bytes of the controller - see CInstallationProcessor + TPtrC8 controllerDataPtr = controllerData->Mid(controllerOffset); + TBool found = EFalse; + for (TInt controller = 0; controller < actualControllers.Count(); controller++) + { + if(*actualControllers[controller] == controllerDataPtr) + { + found = ETrue; + break; + } + } + + if(found) + { + INFO_PRINTF3(_L("Matching controller #%d found for Uid: %08x!"), filenameIndex, expectedUids[index]); + } + else + { + SetTestStepResult(EFail); + ERR_PRINTF3(_L("Matching controller #%d not found for Uid: %08x!"), filenameIndex, expectedUids[index]); + } + + CleanupStack::PopAndDestroy(controllerData); + } + + CleanupStack::PopAndDestroy(4, &entry); // actualControllers, sisFilenames, keyNames + } + + CleanupStack::PopAndDestroy(2, &expectedUids); // fs + + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CEntryUidOpenCloseStep +///////////////////////////////////////////////////////////////////// +CEntryUidOpenCloseStep::CEntryUidOpenCloseStep() + { + SetTestStepName(KEntryUidOpenClose); + } + +TVerdict CEntryUidOpenCloseStep::doTestStepL() + { + RArray uids; + CleanupClosePushL(uids); + TBool isUidGiven(EFalse); + (void)GetBoolFromConfig(ConfigSection(), _L("UidGiven"), isUidGiven); // if not specified, the UidGiven is false. + + if(!isUidGiven) + iSisRegistry.InstalledUidsL(uids); + else + GetUidArrayFromConfigL(ConfigSection(), KUid, uids); + + SetTestStepResult(EPass); + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + + for(TInt index = 0; index < uids.Count(); index++) + { + Swi::RSisRegistryEntry entry; + CleanupClosePushL(entry); + TInt result = entry.Open(iSisRegistry, uids[index]); + if (result == KErrNone) + { + INFO_PRINTF2(_L("Uid: 0x%08x was opened successfully!"), uids[index]); + entry.Close(); + INFO_PRINTF2(_L("Uid: 0x%08x was closed successfully!"), uids[index]); + } + else + { + SetTestStepResult(EFail); + ERR_PRINTF3(_L("Uid: 0x%08x not opened, error %d!"), uids[index], result); + } + CleanupStack::PopAndDestroy(&entry); + } + + CleanupStack::PopAndDestroy(&uids); + + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CEntryPackageOpenCloseStep +///////////////////////////////////////////////////////////////////// +CEntryPackageOpenCloseStep::CEntryPackageOpenCloseStep() + { + SetTestStepName(KEntryPackageOpenClose); + } + +TVerdict CEntryPackageOpenCloseStep::doTestStepL() + { + RPointerArray packages; + CleanupResetAndDestroy >::PushL(packages); + + iSisRegistry.InstalledPackagesL(packages); + + SetTestStepResult(EPass); + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + + for(TInt index = 0; index < packages.Count(); index++) + { + TPtrC package = packages[index]->Name(); + TPtrC vendor = packages[index]->Vendor(); + + Swi::RSisRegistryEntry entry; + + TInt result = entry.OpenL(iSisRegistry, *packages[index]); + if (result == KErrNone) + { + CleanupClosePushL(entry); + INFO_PRINTF3(_L("Package %S by Vendor %S was opened successfully!"), &package, &vendor); + CleanupStack::PopAndDestroy(&entry); + INFO_PRINTF3(_L("Package %S by Vendor %S was closed successfully!"), &package, &vendor); + } + else + { + SetTestStepResult(EFail); + ERR_PRINTF4(_L("Package %S by Vendor %S not opened, error %d!"), &package, &vendor, result); + } + } + + CleanupStack::PopAndDestroy(&packages); + + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CEntryNameOpenCloseStep +///////////////////////////////////////////////////////////////////// +CEntryNameOpenCloseStep::CEntryNameOpenCloseStep() + { + SetTestStepName(KEntryNameOpenClose); + } + +TVerdict CEntryNameOpenCloseStep::doTestStepL() + { + RPointerArray packages; + CleanupResetAndDestroy >::PushL(packages); + + iSisRegistry.InstalledPackagesL(packages); + + SetTestStepResult(EPass); + for(TInt index = 0; index < packages.Count(); index++) + { + TPtrC package = packages[index]->Name(); + TPtrC vendor = packages[index]->Vendor(); + + Swi::RSisRegistryEntry entry; + + TInt result = entry.Open(iSisRegistry, package, vendor); + if (result == KErrNone) + { + CleanupClosePushL(entry); + INFO_PRINTF3(_L("Package %S by Vendor %S was opened successfully!"), &package, &vendor); + CleanupStack::PopAndDestroy(&entry); + INFO_PRINTF3(_L("Package %S by Vendor %S was closed successfully!"), &package, &vendor); + } + else + { + SetTestStepResult(EFail); + ERR_PRINTF4(_L("Package %S by Vendor %S not opened, error %d!"), &package, &vendor, result); + } + } + + CleanupStack::PopAndDestroy(&packages); + + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CEntryMethodsTestStep - tests specific to entry methods +///////////////////////////////////////////////////////////////////// +CEntryMethodsStep::CEntryMethodsStep() + { + SetTestStepName(KEntryMethods); + } + +TVerdict CEntryMethodsStep::doTestStepL() + { + RPointerArray packages; + CleanupResetAndDestroy >::PushL(packages); + + iSisRegistry.InstalledPackagesL(packages); + + SetTestStepResult(EPass); + for(TInt index = 0; index < packages.Count(); index++) + { + TPtrC package = packages[index]->Name(); + TPtrC vendor = packages[index]->Vendor(); + + Swi::RSisRegistryEntry entry; + + INFO_PRINTF3(_L("Opening Package %S by Vendor %S..."), &package, &vendor); + User::LeaveIfError(entry.OpenL(iSisRegistry, *packages[index])); + CleanupClosePushL(entry); + // get the version + TVersion packageVersion = entry.VersionL(); + INFO_PRINTF4(_L("Version %d %d %d"), packageVersion.iMajor, packageVersion.iMinor, packageVersion.iBuild ); + + // get sids + RArray sids; + CleanupClosePushL(sids); + entry.SidsL(sids); + if (sids.Count() <= 0) + { + INFO_PRINTF1(_L("No sids installed!")); + } + else + { + for (TInt sid = 0; sid < sids.Count(); sid++) + { + INFO_PRINTF2(_L("Sid: 0x%08x was found!"), sids[sid]); + } + } + + CleanupStack::PopAndDestroy(&sids); + + // get the vendor; package name + HBufC* reportedVendor = entry.UniqueVendorNameL(); + CleanupStack::PushL(reportedVendor); + HBufC* reportedPackage = entry.PackageNameL(); + CleanupStack::PushL(reportedPackage); + + INFO_PRINTF3(_L("Package: %S from Vendor: %S"), reportedPackage, reportedVendor); + + CleanupStack::PopAndDestroy(reportedPackage); + CleanupStack::PopAndDestroy(reportedVendor); + + // get the localised vendor name + HBufC* vendorLocal = entry.LocalizedVendorNameL(); + CleanupStack::PushL(vendorLocal); + INFO_PRINTF2(_L("Localised Vendor Name: %S"), vendorLocal); + + CleanupStack::PopAndDestroy(vendorLocal); + + // get uid + TUid uid = entry.UidL(); + INFO_PRINTF3(_L("Package Uid: %d 0x%08x"), uid.iUid, uid.iUid); + + // get language + TLanguage language = entry.LanguageL(); + INFO_PRINTF3(_L("Package Language: %d 0x%08x"), language, language); + + // get property + TInt32 propertyKey = 10; + TInt32 propertyValue = entry.PropertyL(propertyKey); + INFO_PRINTF3(_L("Package property: key %d value %d"), propertyKey, propertyValue); + + // is present - currenty relies on default value + TBool isPresent = entry.IsPresentL(); + INFO_PRINTF2(_L("Package present is %d"), isPresent); + + // is signed + TBool isSigned = entry.IsSignedL(); + INFO_PRINTF2(_L("Package signed is %d"), isSigned); + + + // check Trust + switch(entry.TrustL()) + { + case ESisPackageUnsignedOrSelfSigned: + INFO_PRINTF1(_L("Packaged Trust: Unsigned or self signed")); + break; + case ESisPackageCertificateChainNoTrustAnchor: + INFO_PRINTF1(_L("Packaged Trust: Certificate Chain has no trust anchor in Cert store")); + break; + case ESisPackageCertificateChainValidatedToTrustAnchor: + INFO_PRINTF1(_L("Packaged Trust: Certificate Chain Validated to Trust Anchor in Cert store")); + break; + case ESisPackageChainValidatedToTrustAnchorOCSPTransientError: + INFO_PRINTF1(_L("Packaged Trust: Certificate Chain Validated and OCSP Transient Error")); + break; + case ESisPackageChainValidatedToTrustAnchorAndOCSPValid: + INFO_PRINTF1(_L("Packaged Trust: Certificate Chain Validated and OCSP Valid")); + break; + case ESisPackageBuiltIntoRom: + INFO_PRINTF1(_L("Packaged Trust: Built into ROM")); + break; + case ESisPackageValidationFailed: + INFO_PRINTF1(_L("Packaged Trust: Certificate Chain Validation Failed")); + break; + default: + INFO_PRINTF1(_L("Packaged Trust: Unknown")); + break; + }; + + // Time at which the trust was established + TTime timeStamp = entry.TrustTimeStampL(); + TBuf <32> dateTimeText; + TRAP_IGNORE(timeStamp.FormatL(dateTimeText, _L("%H%:1%T%:2%S on %1%/1%2%/2%3"))); + INFO_PRINTF2(_L("Package Trust Established: %S"), &dateTimeText); + + // is in rom + TBool inRom = entry.IsInRomL(); + INFO_PRINTF2(_L("Package inRom is %d"), inRom); + + // is an augmentation + TBool isAug = entry.IsAugmentationL(); + INFO_PRINTF2(_L("Package isAug is %d"), isAug); + + // installation size + TInt64 size = entry.SizeL(); + INFO_PRINTF3(_L("Package size is %d %d"), I64HIGH(size), I64LOW(size)); + + // get list of files + RPointerArray files; + CleanupResetAndDestroy >::PushL(files); + entry.FilesL(files); + INFO_PRINTF2(_L("Package has %d files"), files.Count()); + for (TInt file = 0; file < files.Count(); file++) + { + // INFO_PRINTF3(_L("File %d file path %S"),file + 1, files[file]); + } + CleanupStack::PopAndDestroy(&files); + + CleanupStack::PopAndDestroy(&entry); + } + + CleanupStack::PopAndDestroy(&packages); + + return TestStepResult(); + } + + +///////////////////////////////////////////////////////////////////// +// CEntrySidsStep - obtain a list of Sids from an entry +///////////////////////////////////////////////////////////////////// +CEntrySidsStep::CEntrySidsStep() + { + SetTestStepName(KEntrySids); + } + +TVerdict CEntrySidsStep::doTestStepL() + { + SetTestStepResult(EFail); + + RArray expectedSids; + GetUidArrayFromConfigL(ConfigSection(), KSid, expectedSids); + CleanupClosePushL(expectedSids); + + Swi::RSisRegistryEntry entry; + + TPtrC package; + TPtrC vendor; + if(GetStringFromConfig(ConfigSection(), KPackage, package) + && GetStringFromConfig(ConfigSection(), KVendor, vendor)) + { + //StartTimer again to ignore time taken to read from config file + StartTimer(); + User::LeaveIfError(entry.Open(iSisRegistry, package, vendor)); + } + else + { + TUid packageUid; + if(!GetUidFromConfig(ConfigSection(), KUid, packageUid)) + { + ERR_PRINTF1(_L("Neither package-vendor name nor UID found!")); + User::Leave(KErrNotFound); + } + //StartTimer again to ignore time taken to read from config file + StartTimer(); + User::LeaveIfError(entry.Open(iSisRegistry, packageUid)); + } + CleanupClosePushL(entry); + + RArray sids; + entry.SidsL(sids); + CleanupClosePushL(sids); + + if (sids.Count() != expectedSids.Count()) + { + ERR_PRINTF3(_L("Actual Sids = %d, Expected Sids = %d"), sids.Count(), expectedSids.Count()); + } + else + { + SetTestStepResult(EPass); + for (TInt index=0; index < expectedSids.Count(); index++) + { + if(sids.Find(expectedSids[index]) != KErrNotFound) + { + INFO_PRINTF2(_L("Sid: 0x%08x was found!"), expectedSids[index]); + } + else + { + SetTestStepResult(EFail); + ERR_PRINTF2(_L("Sid: 0x%08x not found!"), expectedSids[index]); + } + } + } + + CleanupStack::PopAndDestroy(3, &expectedSids); // expectedSids, entry, sids + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CIsSidPresentStep - test package SIDs are reported as present. +///////////////////////////////////////////////////////////////////// + +CIsSidPresentStep::CIsSidPresentStep() + { + SetTestStepName(KIsSidPresentStep); + } + +TVerdict CIsSidPresentStep::doTestStepL() + { + // iterate through every sid which is installed in a package + RPointerArray packages; + CleanupResetAndDestroy >::PushL(packages); + + iSisRegistry.InstalledPackagesL(packages); + + TInt32 minSid = KMaxTInt32; + TInt32 maxSid = KMinTInt32; + + for (TInt i = packages.Count() - 1; i >= 0; --i) + { + const CSisRegistryPackage& pkg = *packages[i]; + + Swi::RSisRegistryEntry e; + TInt r = e.Open(iSisRegistry, pkg.Uid()); + User::LeaveIfError(r); + CleanupClosePushL(e); + + RArray sids; + e.SidsL(sids); + CleanupClosePushL(sids); + + for (TInt j = sids.Count() - 1; j >= 0; --j) + { + TUid sid = sids[j]; + minSid = Min(minSid, sid.iUid); + maxSid = Max(maxSid, sid.iUid); + + TBool sidPresent = iSisRegistry.IsSidPresentL(sid); + TESTL(sidPresent); + } + + CleanupStack::PopAndDestroy(2, &e); + } + + TUid minSidM1(TUid::Uid(minSid - 1)); + TESTL(! iSisRegistry.IsSidPresentL(minSidM1)); + TUid maxSidP1(TUid::Uid(minSid + 1)); + TESTL(! iSisRegistry.IsSidPresentL(maxSidP1)); + + CleanupStack::PopAndDestroy(&packages); + + SetTestStepResult(EPass); + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CIsPackagePresentStep - Test the IsPresent method +///////////////////////////////////////////////////////////////////// + +CIsPackagePresentStep::CIsPackagePresentStep() + { + SetTestStepName(KIsPackagePresentStep); + } + +TVerdict CIsPackagePresentStep::doTestStepL() + { + SetTestStepResult(EPass); + + RArray pUids; + CleanupClosePushL(pUids); + GetUidArrayFromConfigL(ConfigSection(), KUid, pUids); + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + + // Create a session with the SCR + Usif::RSoftwareComponentRegistry scrSession; + User::LeaveIfError(scrSession.Connect()); + CleanupClosePushL(scrSession); + + TInt count(pUids.Count()); + for (TInt i = 0; i < count; ++i) + { + // query the registry to see if this entry is present + RSisRegistryEntry entry; + //Since the SisRegistry is inconsistent from hardware and emulator, we won't check + //whether a package is presented on device if it's not installed at all thus no registry entry (e.g. MIDP) + #ifdef __WINS__ + User::LeaveIfError(entry.Open(iSisRegistry, pUids[i])); + #else + TInt err = entry.Open(iSisRegistry, pUids[i]); + if(KErrNotFound == err) + { + INFO_PRINTF2(_L("Package with UID 0x%08x is not installed on HW. IsPresent test skipped"), + pUids[i]); + continue; + } + User::LeaveIfError(err); + #endif + CleanupClosePushL(entry); + + if (!entry.IsPresentL()) + { + INFO_PRINTF2(_L("Package with UID 0x%08x is marked as not present!"), + pUids[i]); + SetTestStepResult(EFail); + CleanupStack::PopAndDestroy(&entry); + // Since package is not present in SWI Registry, we are not checking again in SCR + continue; + } + + // Convert the Uid to ComponentId + Usif::TComponentId componentId = iSisRegistry.GetComponentIdForUidL(pUids[i]); + + // Check if the component is present in SCR + if (!scrSession.IsComponentPresentL(componentId)) + { + INFO_PRINTF2(_L("Package with UID 0x%08x is present in SWI Registry, but not in SCR"), pUids[i]); + SetTestStepResult(EFail); + } + + CleanupStack::PopAndDestroy(&entry); + } + CleanupStack::PopAndDestroy(2, &pUids); // scrSession, pUids + return TestStepResult(); + } +CIntegrityCheckStep::CIntegrityCheckStep() + { + SetTestStepName(KIntegrityCheckStep); + } +CIntegrityCheckStep::~CIntegrityCheckStep() + { + } + +TVerdict CIntegrityCheckStep::doTestStepL() + { + TInt result=0; + + CleanupResetAndDestroy >::PushL(iCertArray); + + InitializeL(); + TUid pUid; + GetUidFromConfig(ConfigSection(), KUid, pUid); + GetIntFromConfig(ConfigSection(),KResultTag,result); + + RSisRegistryEntry entry; + + SetTestStepResult(EFail); + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + + // query the registry to see if this entry is present + User::LeaveIfError (entry.Open(iSisRegistry, pUid)); + + //Call the controller + TBool check = entry.VerifyControllerSignatureL(iCertArray); + + if(check!=result) + { + ERR_PRINTF3(_L("ERROR: Received result: %d. Expected Result: %d"), check, result); + SetTestStepResult(EFail); + } + else + { + SetTestStepResult(EPass); + } + entry.Close(); + CleanupStack::PopAndDestroy(&iCertArray); + return TestStepResult(); + } + +void CIntegrityCheckStep::InitializeL() + { + CX509Certificate* cert = NULL; + RArray rootCertificates; + CleanupClosePushL(rootCertificates); + GetStringArrayFromConfigL(ConfigSection(), KRootCertTag, rootCertificates); + + User::LeaveIfError (fs.Connect()); + //opens the data file + CleanupClosePushL(fs); + + //Loop through all the X509 root certificates and load them + for (TInt i=0; iDes()); + rawDataPtr.SetLength(fileSize); + file.Read (rawDataPtr); + + file.Close(); + + return rawData; + } + +///////////////////////////////////////////////////////////////////// +// CIntegrityDateAndTimeCheckStep - +///////////////////////////////////////////////////////////////////// + + +CIntegrityDateAndTimeCheckStep::CIntegrityDateAndTimeCheckStep() + { + SetTestStepName(KDateAndTimeIntegrityCheckStep); + } + + +TVerdict CIntegrityDateAndTimeCheckStep::doTestStepPreambleL() + { + CIntegrityCheckStep::doTestStepPreambleL(); + + GetUidFromConfig(ConfigSection(), KUid, iPackageUid); + GetIntFromConfig(ConfigSection(),KResultTag,iExpectedResult); + + TPtrC dateAndTime; + GetStringFromConfig(ConfigSection(), KDateTime, dateAndTime); + iTime = TTime(dateAndTime); + + iOriginalTime.UniversalTime(); + User::SetUTCTime(iTime); + + return EPass; + } + +TVerdict CIntegrityDateAndTimeCheckStep::doTestStepPostambleL() + { + TTime timeNow; + timeNow.UniversalTime(); + + TTimeIntervalMicroSeconds timeInterval = timeNow.MicroSecondsFrom(iTime); + timeNow = iOriginalTime + timeInterval; + + User::SetUTCTime(timeNow); + + return TestStepResult(); + } + +TVerdict CIntegrityDateAndTimeCheckStep::doTestStepL() + { + CleanupResetAndDestroy >::PushL(iCertArray); + + InitializeL(); + + RSisRegistryEntry entry; + + SetTestStepResult(EPass); + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + + // query the registry to see if this entry is present + User::LeaveIfError(entry.Open(iSisRegistry, iPackageUid)); + CleanupClosePushL(entry); + + //Call the controller + TBool check = EFalse; + + check = entry.VerifyControllerSignatureL(iCertArray, ETrue); + if(check!=iExpectedResult) + { + ERR_PRINTF3(_L("ERROR: First call to verify failed. Result: %d. Expected Result: %d"), check, iExpectedResult); + SetTestStepResult(EFail); + } + + check = entry.VerifyControllerSignatureL(iCertArray, EFalse); + if(check==EFalse) + { + ERR_PRINTF2(_L("ERROR: Second call to verify failed. Result: %d. Expected Result: ETrue"), check); + SetTestStepResult(EFail); + } + + check = entry.VerifyControllerSignatureL(iCertArray, ETrue); + if(check!=iExpectedResult) + { + ERR_PRINTF3(_L("ERROR: Third call to verify failed. Result: %d. Expected Result: %d"), check, iExpectedResult); + SetTestStepResult(EFail); + } + + CleanupStack::PopAndDestroy(2, &iCertArray); + + return TestStepResult(); + } + + +///////////////////////////////////////////////////////////////////// +// CLoggingFileInfoStep - +///////////////////////////////////////////////////////////////////// + +CLoggingFileInfoStep::CLoggingFileInfoStep() + { + SetTestStepName(KLoggingFileInfo); + } + +TVerdict CLoggingFileInfoStep::doTestStepL() + { + SetTestStepResult(EPass); + __UHEAP_MARK; + RPointerArray fileInfo; + CleanupResetAndDestroy >::PushL(fileInfo); + iSisRegistry.RetrieveLogFileL(fileInfo); + + if (fileInfo.Count()>0) + { + for (TInt i = 0; i < 5; i++) + { + TInt var = 1; + TBuf<16> entry; + entry.Format(_L("LOGENTRY%d.%d"),i,var); + TPtrC text0; + GetStringFromConfig(ConfigSection(), entry, text0); + entry.Format(_L("LOGENTRY%d.%d"),i,++var); + TPtrC text1; + GetStringFromConfig(ConfigSection(), entry, text1); + entry.Format(_L("LOGENTRY%d.%d"),i,++var); + TPtrC text2; + GetStringFromConfig(ConfigSection(), entry, text2); + entry.Format(_L("LOGENTRY%d.%d"),i,++var); + TPtrC text3; + GetStringFromConfig(ConfigSection(), entry, text3); + + TBuf<16> pkgName = fileInfo[0]->GetPkgName(); + TBuf<20> versiontext; + versiontext.Format(_L("%d.%d.%d"),fileInfo[i]->GetMajorVersion(),fileInfo[i]->GetMinorVersion(),fileInfo[i]->GetBuildVersion()); + + enum Swi::TSwiLogTypes s = fileInfo[i]->GetInstallType(); + TBuf<16> installType ; + switch (s) + { + case 0: // Swi::TSwiLogTypes::ESwiLogInstall : + installType.Format(_L("Install")); + break; + case 1: + installType.Format(_L("UnInstall")); + + break; + case 2: // Swi::TSwiLogTypes::ESwiLogUpgrade : + installType.Format(_L("Upgrade")); + + break; + default: + installType.Format(_L("Error unknown value")); + + break; + } + + TBuf<16> uidOfPkg; + uidOfPkg.Format(_L("%x"),fileInfo[i]->GetUid()); + + if(pkgName == text0 && versiontext == text1 + && installType ==text2 && uidOfPkg ==text3) + { + SetTestStepResult(EPass); + } + else + { + SetTestStepResult(EFail); + } + } + } + else + { + SetTestStepResult(EPass); + } + CleanupStack::PopAndDestroy(&fileInfo); + __UHEAP_MARKEND; + return TestStepResult(); + } + +CRomStubPerformanceStep::CRomStubPerformanceStep() + { + SetTestStepName(KRomStubPerformanceStep); + } + +TVerdict CRomStubPerformanceStep::doTestStepL() + { + // Simple test step to determine how long it takes to + // regenerate the cache. + + // Make sure the sisregistry is deleted before regenerating the cache. This + // will ensure that the registry entries are created from the ROM stub, instead + // of being read from the harddisk + RTestUtilSessionSwi util; + User::LeaveIfError(util.Connect()); + CleanupClosePushL(util); + + TDriveUnit sysDrive (RFs::GetSystemDrive()); + TBuf<128> sisRegistryPath (sysDrive.Name()); + sisRegistryPath.Append(KSisRegistryPath); + + TInt err = util.RmDir(sisRegistryPath); + if(err != KErrNone && err != KErrPathNotFound && err != KErrNotFound) + { + User::Leave(err); + } + else + { + INFO_PRINTF1(_L("Sis Registry Deleted!")); + } + + INFO_PRINTF1(_L("Regenerate the cache. Starting the timer...")); + TTime startTime; + startTime.UniversalTime(); + + // Stop the timer + TTime endTime; + endTime.UniversalTime(); + INFO_PRINTF1(_L("Cache regenerated. Timer stopped.")); + + TInt64 durationMicro=endTime.MicroSecondsFrom(startTime).Int64(); + TInt durationMilli=durationMicro/1000; + + INFO_PRINTF2(_L("Duration (milliseconds): %d"),durationMilli); + CleanupStack::PopAndDestroy(&util); + + SetTestStepResult(EPass); + + return TestStepResult(); + } + +////////////////////////////////////////////////////////////// +// CCorruptCacheStep - The Sis Registry will leave backup.bak +// around when it encounters a corrupt cache file +////////////////////////////////////////////////////////////// + +CCorruptCacheStep::CCorruptCacheStep() + { + SetTestStepName(KCorruptCacheStep); + } + +TVerdict CCorruptCacheStep::doTestStepL() + { + SetTestStepResult(EFail); + + __UHEAP_MARK; + + RTestUtilSessionSwi util; + User::LeaveIfError(util.Connect()); + CleanupClosePushL(util); + TDriveUnit sysDrive (RFs::GetSystemDrive()); + TDriveName sysDriveName (sysDrive.Name()); + + // Close the Sis Registry and wait for 3 secs for + // server to shut down + iSisRegistry.Close(); + + INFO_PRINTF1(_L("Sis Registry shut down")); + User::After(3000000); + + // Delete the "good" backup.lst (if present) + TInt err = util.Delete(KCacheBackupFile); + + if (err == KErrNone) + { + INFO_PRINTF2(_L("Deleted '%S'"), &KCacheBackupFile); + } + + // Use hashforlang_txt.dat as a corrupt backup.lst and connect to the + // Sis Registry. + util.Copy(KCorruptCacheBackupFile, KCacheBackupFile); + + INFO_PRINTF3(_L("Copied '%S' to '%S'"), &KCorruptCacheBackupFile, &KCacheBackupFile); + + INFO_PRINTF1(_L("Connecting to SisRegistry...")); + + RProcess sisRegistryServer; + TInt retVal = sisRegistryServer.Create(_L("SisRegistryServer"),KNullDesC); + + if (retVal == KErrNone) + { + TRequestStatus status; + sisRegistryServer.Logon(status); + sisRegistryServer.Resume(); + User::WaitForRequest(status); + + TExitCategoryName panicName = sisRegistryServer.ExitCategory(); + TPtrC name(panicName); + TInt reasonNumber = sisRegistryServer.ExitReason(); + + if (reasonNumber == 0 && name.Compare(_L("Kill")) == KErrNone) + { + if (util.FileExistsL(KSysBackupFileBackup)) + { + if (util.FileExistsL(KCacheBackupFile)) + { + INFO_PRINTF4(_L("'%S' and '%S' exist in System Drive: %S\\"), + &KSysBackupFileBackup, &KCacheBackupFile, &sysDriveName); + SetTestStepResult(EPass); + } + else + { + INFO_PRINTF3(_L("Expecting '%S' exist in System Drive: %S\\ but not found"), + &KCacheBackupFile, &sysDriveName); + } + } + else + { + INFO_PRINTF3(_L("Expecting '%S' exist in System Drive: %S\\ but not found"), + &KSysBackupFileBackup, &sysDriveName); + } + } + + INFO_PRINTF3(_L("CCorruptCacheStep - Exit Reason Number: %d Exit Reason Code: %S"), + reasonNumber, &name); + } + + sisRegistryServer.Terminate(0); + sisRegistryServer.Close(); + + CleanupStack::PopAndDestroy(&util); + + __UHEAP_MARKEND; + + return TestStepResult(); + } + +//////////////////////////////////////////////////////////////// +// CCorruptCacheRecoverStep - Checks to see if the Sis Registry +// recovers from a corrupt token cache file +//////////////////////////////////////////////////////////////// + +CCorruptCacheRecoverStep::CCorruptCacheRecoverStep() + { + SetTestStepName(KCorruptCacheRecoverStep); + } + +TVerdict CCorruptCacheRecoverStep::doTestStepL() + { + SetTestStepResult(EFail); + + RTestUtilSessionSwi util; + User::LeaveIfError(util.Connect()); + CleanupClosePushL(util); + TDriveUnit sysDrive (RFs::GetSystemDrive()); + TDriveName sysDriveName (sysDrive.Name()); + + // Close the Sis Registry and wait for 3 secs for + // the server to shut down + iSisRegistry.Close(); + INFO_PRINTF1(_L("Sis Registry shut down")); + User::After(3000000); + + // Attempt to read from the token cache file + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + + RFileReadStream stream; + User::LeaveIfError(stream.Open(fs, KCacheBackupFile, EFileRead | EFileShareReadersOnly)); + CleanupClosePushL(stream); + + INFO_PRINTF2(_L("'%S' regenerated successfully. Check by reading and internalizing..."), &KCacheBackupFile); + + RPointerArray tokens; + CleanupResetAndDestroy >::PushL(tokens); + + // Will not catch a panic, but still a worthwhile check to make + TRAPD(err, stream.ReadUint32L()); + TRAP(err, InternalizePointerArrayL(tokens, stream)); + + if (err == KErrNone) + { + INFO_PRINTF2(_L("'%S' successfully read!"), &KCacheBackupFile); + + if (!util.FileExistsL(KSysBackupFileBackup)) + { + if (util.FileExistsL(KCacheBackupFile)) + { + INFO_PRINTF3(_L("'%S' exist in System Drive: %S\\"), + &KCacheBackupFile, &sysDriveName); + + SetTestStepResult(EPass); + } + else + { + INFO_PRINTF3(_L("Expecting '%S' exist in System Drive: %S\\ but not found"), + &KCacheBackupFile, &sysDriveName); + } + } + else + { + INFO_PRINTF3(_L("'%S' exist in System Drive: %S\\ but shouldn't"), + &KSysBackupFileBackup, &sysDriveName); + } + } + + CleanupStack::PopAndDestroy(4, &util); + + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CChangeLocaleStep - Changes the locale +///////////////////////////////////////////////////////////////////// + +CChangeLocaleStep::CChangeLocaleStep() + { + SetTestStepName(KChangeLocale); + } + +TVerdict CChangeLocaleStep::doTestStepL() + { + SetTestStepResult(EFail); + + TInt language=0; + if (!GetIntFromConfig(ConfigSection(), KLanguage, language)) + { + INFO_PRINTF1(_L("Missing language in config section")); + return EFail; + } + + #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL + _LIT(KLitLanguageLocaleDllNameBase, "elocl_lan"); + //Region and collation code values are hard coded, as the check, after changing the locale is made for the language only. + _LIT(KLitRegionLocaleDllNameBase, "elocl_reg.826"); + _LIT(KLitCollationLocaleDllNameBase, "elocl_col.001"); + _LIT(ThreeDigExt,".%03d"); + + TExtendedLocale localeDll; + const TUidType uidType(TUid::Uid(0x10000079),TUid::Uid(0x100039e6)); + TBuf<16> languageLocaleDllName(KLitLanguageLocaleDllNameBase); + languageLocaleDllName.AppendFormat(ThreeDigExt, language); + TBuf<16> regionLocaleDllName(KLitRegionLocaleDllNameBase); + TBuf<16> collationLocaleDllName(KLitCollationLocaleDllNameBase); + // Try to load the locale dll + TInt error=localeDll.LoadLocale(languageLocaleDllName, regionLocaleDllName, collationLocaleDllName); + + if (error==KErrNotFound) + { + // Locale dll is not found for the asked language. + ERR_PRINTF2(_L("Failed to find the locale dll for %d"), language); + } + + User::LeaveIfError(error); + localeDll.SaveSystemSettings(); + + #else + _LIT(KLitLocaleDllNameBase, "ELOCL"); + _LIT(TwoDigExt,".%02d"); + + RLibrary localeDll; + CleanupClosePushL(localeDll); + + const TUidType uidType(TUid::Uid(0x10000079),TUid::Uid(0x100039e6)); + TBuf<16> localeDllName(KLitLocaleDllNameBase); + localeDllName.AppendFormat(TwoDigExt, language); + + // Try to load the locale dll + TInt error=localeDll.Load(localeDllName, uidType); + if (error==KErrNotFound) + { + // Locale dll is not found for the asked language. + ERR_PRINTF2(_L("Failed to find the locale dll for %d"), language); + } + + User::LeaveIfError(error); + User::LeaveIfError(UserSvr::ChangeLocale(localeDllName)); + CleanupStack::PopAndDestroy(); // localeDll + #endif + + // Check if the device locale has changed + if (language == User::Language()) + { + SetTestStepResult(EPass); + } + else + { + ERR_PRINTF3(_L("Failed to change the locale to %d whereas the current locale is"), language, User::Language()); + } + + return TestStepResult(); + } + +// Creates an dummy token object used in further steps. +void CreateTokenObjectL(RBufWriteStream& aWriteStream) + { + // Package details + aWriteStream.WriteInt32L(732875480); //Uid + aWriteStream << _L("DummyPkg"); // Name + aWriteStream << _L("Vendor"); // Vendor + aWriteStream.WriteInt32L(0); // Index + + aWriteStream.WriteUint32L(0); // Drives + + aWriteStream.WriteInt32L(0); // SID array count + aWriteStream.WriteInt32L(0); // Controller array count + + // Version + aWriteStream.WriteInt32L(1); // Major + aWriteStream.WriteInt32L(1); // Minor + aWriteStream.WriteInt32L(1); // Build + + // user selected options + aWriteStream.WriteInt32L(static_cast(1)); // Selected Language + aWriteStream.WriteUint32L(static_cast(25)); // Selected Drive + } + + +// These tests are added to improve the coverage. +CCreateTokenByCopy::CCreateTokenByCopy() + { + SetTestStepName(KCreateTokenByCopy); + } + +TVerdict CCreateTokenByCopy::doTestStepL() + { + SetTestStepResult(EFail); + + CSisRegistryToken* registryToken = CSisRegistryToken::NewL(); + CleanupStack::PushL(registryToken); + + // Create a buffer + CBufFlat* tokenBuf = CBufFlat::NewL(KDefaultBufferSize); + CleanupStack::PushL(tokenBuf); + + // create write stream + RBufWriteStream writeStream(*tokenBuf); + CleanupClosePushL(writeStream); + + // Create the dummy token object + CreateTokenObjectL(writeStream); + + // create read stream + RBufReadStream readStream(*tokenBuf); + CleanupClosePushL(readStream); + + registryToken->InternalizeL(readStream); + + CSisRegistryToken* copyRegistryToken = CSisRegistryToken::NewL(*registryToken); + CleanupStack::PushL(copyRegistryToken); + + CleanupStack::PopAndDestroy(5, registryToken); //registryToken, tokenBuf, writeStream, readStream, copyRegistryToken + + SetTestStepResult(EPass); + + return TestStepResult(); + } + +CCreateTokenFromStream::CCreateTokenFromStream() + { + SetTestStepName(KCreateTokenFromStream); + } + +TVerdict CCreateTokenFromStream::doTestStepL() + { + SetTestStepResult(EFail); + + // Create a buffer + CBufFlat* tokenBuf = CBufFlat::NewL(KDefaultBufferSize); + CleanupStack::PushL(tokenBuf); + + // create write stream + RBufWriteStream writeStream(*tokenBuf); + CleanupClosePushL(writeStream); + + // create read stream + RBufReadStream readStream(*tokenBuf); + CleanupClosePushL(readStream); + + // Create the dummy token object + CreateTokenObjectL(writeStream); + + //Ignore the error as we try to read the object an empty stream. + CSisRegistryToken* tokenFromStream = CSisRegistryToken::NewL(readStream); + CleanupStack::PushL(tokenFromStream); + + CleanupStack::PopAndDestroy(4, tokenBuf); // tokenBuf, writeStream, readStream, tokenFromStream + + SetTestStepResult(EPass); + + return TestStepResult(); + } + + + +///////////////////////////////////////////////////////////////////// +// CCertificateChainListStep - Checks the certificate chain count for a given package. +///////////////////////////////////////////////////////////////////// +CCertificateChainListStep::CCertificateChainListStep() + { + SetTestStepName(KCertificateChainListStep); + } + +TVerdict CCertificateChainListStep::doTestStepL() + { + SetTestStepResult(EPass); + + TUid uidOpen; + TInt certChainCount; + RSisRegistryEntry entry; + + if(!GetUidFromConfig(ConfigSection(), KUid, uidOpen) || !GetIntFromConfig(ConfigSection(), KCertChainCount, certChainCount)) + { + ERR_PRINTF1(_L("Missing package Uid or expected certificate chain count")); + SetTestStepResult(EFail); + return TestStepResult(); + } + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + + if (KErrNone != entry.Open(iSisRegistry, uidOpen)) + { + SetTestStepResult(EFail); + return TestStepResult(); + } + CleanupClosePushL(entry); + + RPointerArray chains; + CleanupResetAndDestroyPushL(chains); + TRAP_IGNORE(entry.CertificateChainsL(chains)); + + if(chains.Count() != certChainCount) + { + ERR_PRINTF3(_L("The actual certificate chain count does not meet expected. Expected: %d Actual: %d"), certChainCount, chains.Count()); + SetTestStepResult(EFail); + } + + CleanupStack::PopAndDestroy(2, &entry); //chains and entry. + return TestStepResult(); + } + + +//////////////////////////////////////////////////////////////////////////// +// CSidToPackageStep - Returns a pointer to package containing the Sid given +//////////////////////////////////////////////////////////////////////////// +CSidToPackageStep::CSidToPackageStep() + { + SetTestStepName(KSidToPackage); + } + +TVerdict CSidToPackageStep::doTestStepL() + { + TUid sid; + if(!GetUidFromConfig(ConfigSection(), KSid, sid)) + { + ERR_PRINTF1(_L("Sid is missing in the configuration file!")); + SetTestStepResult(EFail); + return TestStepResult(); + } + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + + CSisRegistryPackage *pckg = iSisRegistry.SidToPackageL(sid); + if(!pckg) + { + ERR_PRINTF1(_L("NULL package returned!")); + SetTestStepResult(EFail); + } + else + { + delete pckg; + } + return TestStepResult(); + } + +//////////////////////////////////////////////////////////////////////////// +// CIsSidPresentSingleStep - test package SIDs are reported as present. +//////////////////////////////////////////////////////////////////////////// +CIsSidPresentSingleStep::CIsSidPresentSingleStep() + { + SetTestStepName(KIsSidPresentSingleStep); + } + +TVerdict CIsSidPresentSingleStep::doTestStepL() + { + TUid sid; + if(!GetUidFromConfig(ConfigSection(), KSid, sid)) + { + ERR_PRINTF1(_L("Sid is missing in the configuration file!")); + SetTestStepResult(EFail); + return TestStepResult(); + } + + TBool expectedresult(EFalse); + (void)GetBoolFromConfig(ConfigSection(), KResultTag, expectedresult); // if not specified, expected result is false. + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + + TBool result = iSisRegistry.IsSidPresentL(sid); + if(result != expectedresult) + { + ERR_PRINTF2(_L("The result is different from the expected one!"), sid); + SetTestStepResult(EFail); + } + return TestStepResult(); + } + +//////////////////////////////////////////////////////////////////////////// +// CFileDescriptionsStep - Return the file descriptions associated with the given package +//////////////////////////////////////////////////////////////////////////// +CFileDescriptionsStep::CFileDescriptionsStep() + { + SetTestStepName(KFileDescriptionsStep); + } + +TVerdict CFileDescriptionsStep::doTestStepL() + { + TUid pckgUid; + if(!GetUidFromConfig(ConfigSection(), KUid, pckgUid)) + { + ERR_PRINTF1(_L("Package UID is missing in the configuration file!")); + SetTestStepResult(EFail); + return TestStepResult(); + } + + RSisRegistryWritableEntry writableEntry; + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + + TInt err = writableEntry.Open(iSisRegistry, pckgUid); + if (KErrNone != err) + { + ERR_PRINTF2(_L("Writable entry couldn't be opened (Error code=%d)!"), err); + SetTestStepResult(EFail); + return TestStepResult(); + } + CleanupClosePushL(writableEntry); + + RPointerArray fileDescriptions; + CleanupResetAndDestroyPushL(fileDescriptions); + writableEntry.FileDescriptionsL(fileDescriptions); + TInt fileCount = fileDescriptions.Count(); + CleanupStack::PopAndDestroy(2, &writableEntry); // writableEntry, fileDescriptions + if(!fileCount) + return PrintErrorAndReturnFailL(_L("No file returned!")); + return TestStepResult(); + } + +//////////////////////////////////////////////////////////////////////////// +// CIsAugmentationStep - whether or not the given package augments another package +//////////////////////////////////////////////////////////////////////////// +CIsAugmentationStep::CIsAugmentationStep() + { + SetTestStepName(KIsAugmentationStep); + } + +TVerdict CIsAugmentationStep::doTestStepL() + { + TBool expectedresult(EFalse); + (void)GetBoolFromConfig(ConfigSection(), KResultTag, expectedresult); // if not specified, expected result is false. + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + + TBool result = iRegistryEntry.IsAugmentationL(); + if(result != expectedresult) + { + ERR_PRINTF1(_L("The result is different from the expected one!")); + SetTestStepResult(EFail); + } + + return TestStepResult(); + } + +//////////////////////////////////////////////////////////////////////////// +// CFilesStep - Provides a list of files installed by the given package +//////////////////////////////////////////////////////////////////////////// +CFilesStep::CFilesStep() + { + SetTestStepName(KFilesStep); + } + +TVerdict CFilesStep::doTestStepL() + { + RPointerArray files; + CleanupResetAndDestroyPushL(files); + iRegistryEntry.FilesL(files); + if(!files.Count()) + { + ERR_PRINTF1(_L("The package files couldn't be retrieved!")); + SetTestStepResult(EFail); + } + CleanupStack::PopAndDestroy(&files); + + return TestStepResult(); + } + +//////////////////////////////////////////////////////////////////////////// +// CAugmentationsStep - Returns all augmentations to the given package. +//////////////////////////////////////////////////////////////////////////// +CAugmentationsStep::CAugmentationsStep() + { + SetTestStepName(KAugmentationsStep); + } + +TVerdict CAugmentationsStep::doTestStepL() + { + RPointerArray packages; + CleanupResetAndDestroyPushL(packages); + iRegistryEntry.AugmentationsL(packages); + if(!packages.Count()) + { + ERR_PRINTF1(_L("The augmentation package couldn't be retrieved!")); + SetTestStepResult(EFail); + } + CleanupStack::PopAndDestroy(&packages); + + return TestStepResult(); + } + +//////////////////////////////////////////////////////////////////////////// +// CPackageStep - Returns the package of a current entry +//////////////////////////////////////////////////////////////////////////// +CPackageStep::CPackageStep() + { + SetTestStepName(KPackageStep); + } + +TVerdict CPackageStep::doTestStepL() + { + CSisRegistryPackage* package=iRegistryEntry.PackageL(); + if(!package) + { + ERR_PRINTF1(_L("The package couldn't be retrieved!")); + SetTestStepResult(EFail); + } + delete package; + return TestStepResult(); + } + +//////////////////////////////////////////////////////////////////////////// +// CDependentPackagesStep - Returns the array of packages dependent on the given package. +//////////////////////////////////////////////////////////////////////////// +CDependentPackagesStep::CDependentPackagesStep() + { + SetTestStepName(KDependentPackagesStep); + } + +TVerdict CDependentPackagesStep::doTestStepL() + { + RPointerArray dependents; + CleanupResetAndDestroyPushL(dependents); + iRegistryEntry.DependentPackagesL(dependents); + if(!dependents.Count()) + { + ERR_PRINTF1(_L("The dependant package couldn't be retrieved!")); + SetTestStepResult(EFail); + } + CleanupStack::PopAndDestroy(&dependents);; + return TestStepResult(); + } + +//////////////////////////////////////////////////////////////////////////// +// CDependenciesStep - Returns the dependency array for the given package +//////////////////////////////////////////////////////////////////////////// +CDependenciesStep::CDependenciesStep() + { + SetTestStepName(KDependenciesStep); + } + +TVerdict CDependenciesStep::doTestStepL() + { + RPointerArray dependencies; + CleanupResetAndDestroyPushL(dependencies); + iRegistryEntry.DependenciesL(dependencies); + if(!dependencies.Count()) + { + ERR_PRINTF1(_L("The dependency package couldn't be retrieved!")); + SetTestStepResult(EFail); + } + CleanupStack::PopAndDestroy(&dependencies);; + return TestStepResult(); + } + +//////////////////////////////////////////////////////////////////////////// +// CEmbeddedPackagesStep - return a array of packages that were embedded within the given package. +//////////////////////////////////////////////////////////////////////////// +CEmbeddedPackagesStep::CEmbeddedPackagesStep() + { + SetTestStepName(KEmbeddedPackagesStep); + } + +TVerdict CEmbeddedPackagesStep::doTestStepL() + { + RPointerArray embedded; + CleanupResetAndDestroyPushL(embedded); + iRegistryEntry.EmbeddedPackagesL(embedded); + if(!embedded.Count()) + { + ERR_PRINTF1(_L("The embedded package couldn't be retrieved!")); + SetTestStepResult(EFail); + } + CleanupStack::PopAndDestroy(&embedded);; + return TestStepResult(); + } + + +// Test creation of SisRegistryObject. + +CCreateSisRegistryObject::CCreateSisRegistryObject() + { + SetTestStepName(KCreateSisRegistryObject); + } + +TVerdict CCreateSisRegistryObject::doTestStepL() + { + SetTestStepResult(EFail); + + CSisRegistryObject* registryObject = CSisRegistryObject::NewL(); + delete registryObject; + + SetTestStepResult(EPass); + return TestStepResult(); + } + +//////////////////////////////////////////////////////////////////////////// +// CIsFileRegisteredStep - Tests IsFileRegisteredL API in SWI Registry +//////////////////////////////////////////////////////////////////////////// +CIsFileRegisteredStep::CIsFileRegisteredStep() + { + SetTestStepName(KIsFileRegisteredStep); + } + +TVerdict CIsFileRegisteredStep::doTestStepL() + { + TBool expectedResult(EFalse); + GetBoolFromConfig(ConfigSection(), _L("expectedResult"), expectedResult); + TPtrC testedFilename; + if (!GetStringFromConfig(ConfigSection(), _L("testedFilename"), testedFilename)) + { + ERR_PRINTF1(_L("testedFilename property was not found in IsFileRegistered test step!")); + SetTestStepResult(EFail); + return TestStepResult(); + } + INFO_PRINTF2(_L("Testing presence of file %S in the registry"), &testedFilename); + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + + TBool foundResult = iSisRegistry.IsFileRegisteredL(testedFilename); + if (foundResult != expectedResult) + { + ERR_PRINTF3(_L("File presence test failed! Expected %d, but received %d"), expectedResult, foundResult); + SetTestStepResult(EFail); + } + return TestStepResult(); + } + +CGetComponentIdForUidStep::CGetComponentIdForUidStep() + { + } + +TVerdict CGetComponentIdForUidStep::doTestStepL() + { + TUid uid; + if (!GetUidFromConfig(ConfigSection(), _L("uid"), uid)) + { + ERR_PRINTF1(_L("uid property was not found in GetComponentIdForUid test step!")); + SetTestStepResult(EFail); + return TestStepResult(); + } + INFO_PRINTF2(_L("Retrieving component id for UID %d"), uid.iUid); + + //StartTimer again to ignore time taken to read from config file + StartTimer(); + + Usif::TComponentId componentId = iSisRegistry.GetComponentIdForUidL(uid); + INFO_PRINTF3(_L("Retrieved component id %d for UID %d"), componentId, uid.iUid); + return TestStepResult(); + } + +// Test creation of CSisRegistryDependency objects. + +// Creates a dummy CSisRegistryDependency object. +void CreateSisRegDependencyObjectL(RBufWriteStream& aWriteStream) + { + // Package Uid + aWriteStream.WriteInt32L(732875480); //Uid + + // From Version + aWriteStream.WriteInt32L(1); // Major + aWriteStream.WriteInt32L(0); // Minor + aWriteStream.WriteInt32L(0); // Build + + // To Version + aWriteStream.WriteInt32L(2); // Major + aWriteStream.WriteInt32L(0); // Minor + aWriteStream.WriteInt32L(0); // Build + } + +CSisRegistryDependencyStep::CSisRegistryDependencyStep() + { + SetTestStepName(KSisRegistryDependencyStep); + } + +TVerdict CSisRegistryDependencyStep::doTestStepL() + { + SetTestStepResult(EFail); + + // Create a buffer + CBufFlat* buffer = CBufFlat::NewL(KDefaultBufferSize); + CleanupStack::PushL(buffer); + + // create write stream + RBufWriteStream writeStream(*buffer); + CleanupClosePushL(writeStream); + + // create read stream + RBufReadStream readStream(*buffer); + CleanupClosePushL(readStream); + + CreateSisRegDependencyObjectL(writeStream); + + CSisRegistryDependency* objFromStream = CSisRegistryDependency::NewL(readStream); + CleanupStack::PushL(objFromStream); + + CSisRegistryDependency* objectByCopy = CSisRegistryDependency::NewL(*objFromStream); + CleanupStack::PushL(objectByCopy); + + _LIT(KPkgMajor, "pkgMajor"); + TInt pkgMajor = 0; + if(!GetIntFromConfig(ConfigSection(), KPkgMajor, pkgMajor)) + { + ERR_PRINTF1(_L("Missing major version!")); + SetTestStepResult(EFail); + return TestStepResult(); + } + + _LIT(KPkgMinor, "pkgMinor"); + TInt pkgMinor = 0; + if(!GetIntFromConfig(ConfigSection(), KPkgMinor, pkgMinor)) + { + ERR_PRINTF1(_L("Missing minor version!")); + SetTestStepResult(EFail); + return TestStepResult(); + } + + _LIT(KPkgBuild, "pkgBuild"); + TInt pkgBuild = 0; + if(!GetIntFromConfig(ConfigSection(), KPkgBuild, pkgBuild)) + { + ERR_PRINTF1(_L("Missing build!")); + SetTestStepResult(EFail); + return TestStepResult(); + } + + TVersion version(pkgMajor, pkgMinor, pkgBuild); + + if(!(objectByCopy->IsCompatible(version))) + { + SetTestStepResult(EFail); + } + + CleanupStack::PopAndDestroy(5, buffer); // buffer, writeStream, readStream, objFromStream and objByCopy. + SetTestStepResult(EPass); + + return TestStepResult(); + } + +// Test creation of CSisRegistryFileDescription object. + +CSisRegistryFileDescStep::CSisRegistryFileDescStep() + { + SetTestStepName(KSisRegistryFileDescStep); + } + +void CSisRegistryFileDescStep::CreateSisRegFileDescObjectL(RBufWriteStream& aWriteStream, TDesC8& aHashData, TDesC& aTarget, TDesC& aMimeType) + { + aWriteStream << aTarget; //file name + aWriteStream << aMimeType; // file mime type + aWriteStream.WriteInt32L(1); //operation + aWriteStream.WriteInt32L(1); //operation options + aWriteStream.WriteInt32L(2); //hash algorithm + aWriteStream << aHashData; //hash data + aWriteStream.WriteInt32L(1200); //uncompressed length + aWriteStream.WriteInt32L(1400); //uncompressed length + aWriteStream.WriteInt32L(0); //index + aWriteStream.WriteInt32L(12341212); //SID. + } + +TVerdict CSisRegistryFileDescStep::doTestStepL() + { + SetTestStepResult(EFail); + + CSisRegistryFileDescription* object = CSisRegistryFileDescription::NewL(); + delete object; + + // Create a buffer + CBufFlat* buffer = CBufFlat::NewL(KDefaultBufferSize); + CleanupStack::PushL(buffer); + + // create write stream + RBufWriteStream writeStream(*buffer); + CleanupClosePushL(writeStream); + + // create read stream + RBufReadStream readStream(*buffer); + CleanupClosePushL(readStream); + + _LIT8(KHashData, "kshfashgkghsrewiturtugit"); + TInt dataLen = 24; + HBufC8* hashData = HBufC8::NewLC(dataLen); + *hashData = KHashData; + + _LIT(KTargetName, "c:\\sys\\bin\\test.exe"); + HBufC* target = HBufC::NewLC(dataLen); + *target = KTargetName; + + HBufC* mimeType = HBufC::NewLC(dataLen); + + CreateSisRegFileDescObjectL(writeStream, *hashData, *target, *mimeType); + + CSisRegistryFileDescription* obj = CSisRegistryFileDescription::NewL(readStream); + delete obj; + + CleanupStack::PopAndDestroy(6, buffer); //mime type, target, hashData, readStream, writeStream and buffer. + + SetTestStepResult(EPass); + return TestStepResult(); + } + +// Test creation of CControllerInfo object. + +CControllerInfoStep::CControllerInfoStep() + { + SetTestStepName(KControllerInfoStep); + } + + +// Creates an dummy CControllerInfo object. +void CControllerInfoStep::CreateCControllerInfoObjectL(RBufWriteStream& aWriteStream, TDesC8& aHashData) + { + aWriteStream.WriteInt32L(1); //major version + aWriteStream.WriteInt32L(0); //minor version + aWriteStream.WriteInt32L(1); //build version + aWriteStream.WriteInt32L(0); //offset + aWriteStream.WriteInt32L(2); //hash algorithm + aWriteStream << aHashData; //hashdata + } + +TVerdict CControllerInfoStep::doTestStepL() + { + SetTestStepResult(EFail); + + // Create a buffer + CBufFlat* buffer = CBufFlat::NewL(KDefaultBufferSize); + CleanupStack::PushL(buffer); + + // create write stream + RBufWriteStream writeStream(*buffer); + CleanupClosePushL(writeStream); + + // create read stream + RBufReadStream readStream(*buffer); + CleanupClosePushL(readStream); + + _LIT8(KHashData, "kshfashgkghs"); + TInt dataLen = 12; + HBufC8* hashData = HBufC8::NewLC(dataLen); + *hashData = KHashData; + + CreateCControllerInfoObjectL(writeStream, *hashData); + + CControllerInfo* objFromStream = CControllerInfo::NewL(readStream); + CleanupStack::PushL(objFromStream); + + CControllerInfo* object = CControllerInfo::NewL(*objFromStream); + delete object; + + TVersion version(1, 5, 9); + CHashContainer* hashContainer = CHashContainer::NewLC(CMessageDigest::ESHA1, *hashData); + + CControllerInfo* controllerObj = CControllerInfo::NewL(version, *hashContainer); + CleanupStack::PushL(controllerObj); + + TVersion controllerVersion = controllerObj->Version(); + if((controllerVersion.iMajor!= version.iMajor) || (controllerVersion.iMinor!= version.iMinor) || (controllerVersion.iBuild!= version.iBuild)) + { + SetTestStepResult(EFail); + } + + CleanupStack::PopAndDestroy(7, buffer); //controllerObj, hashContainer, objFromStream, hashData, readStream, writeStream and buffer. + + SetTestStepResult(EPass); + return TestStepResult(); + } + +// Test creation of CSisRegistryProperty object. + +CSisRegistryPropertyStep::CSisRegistryPropertyStep() + { + SetTestStepName(KSisRegistryPropertyStep); + } + + +// Creates an dummy CSisRegistryProperty object. +void CSisRegistryPropertyStep::CreateCSisRegPropertyObjectL(RBufWriteStream& aWriteStream) + { + aWriteStream.WriteInt32L(1); //key + aWriteStream.WriteInt32L(-1); //value + } + +TVerdict CSisRegistryPropertyStep::doTestStepL() + { + SetTestStepResult(EFail); + + // Create a buffer + CBufFlat* buffer = CBufFlat::NewL(KDefaultBufferSize); + CleanupStack::PushL(buffer); + + // create write stream + RBufWriteStream writeStream(*buffer); + CleanupClosePushL(writeStream); + + // create read stream + RBufReadStream readStream(*buffer); + CleanupClosePushL(readStream); + + CreateCSisRegPropertyObjectL(writeStream); + + CSisRegistryProperty* object = CSisRegistryProperty::NewL(readStream); + delete object; + + CleanupStack::PopAndDestroy(3, buffer); //readStream, writeStream and buffer. + + SetTestStepResult(EPass); + return TestStepResult(); + } + +//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +// This test case is used only for performance measurement to check that a typical UI app. manager performs well with the SWI Registry +CSisApplicationManagerStep::CSisApplicationManagerStep() + { + SetTestStepName(KApplicationManagerStep); + } + +TVerdict CSisApplicationManagerStep::doTestStepL() + { + RPointerArray packages; + CleanupResetAndDestroy >::PushL(packages); + // First get the list of removable packages + iSisRegistry.RemovablePackagesL(packages); + for (TInt i = 0; i < packages.Count(); ++i) + { + Swi::RSisRegistryEntry entry; + User::LeaveIfError(entry.OpenL(iSisRegistry, *packages[i])); + CleanupClosePushL(entry); + TBool isPresent = entry.IsPresentL(); + TSisPackageTrust trust = entry.TrustL(); + TInt64 size = entry.SizeL(); + TVersion version = entry.VersionL(); + // Disable compiler warnings + while (isPresent && trust && size && version.iMajor) + break; + CleanupStack::PopAndDestroy(&entry); + } + CleanupStack::PopAndDestroy(&packages); + SetTestStepResult(EPass); + return TestStepResult(); + }