installationservices/swi/test/tsisregistrytest/writablesessionstep.cpp
changeset 4 32704c33136d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/installationservices/swi/test/tsisregistrytest/writablesessionstep.cpp	Tue Jan 26 12:06:03 2010 +0200
@@ -0,0 +1,498 @@
+/*
+* 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 <test/testexecutelog.h>
+#include "writablesessionstep.h"
+#include "sisregistrypackage.h"
+#include "sisregistrywritableentry.h"
+#include "sisregistrywritablesession.h"
+#include "installtypes.h"
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+#include <usif/sts/sts.h>
+#else
+#include "integrityservices.h"
+#endif
+#include "cleanuputils.h"
+#include "dessisdataprovider.h"
+#include "siscontroller.h"
+#include "application.h"
+#include "userselections.h"
+#include "sisregistryaccess_client.h"
+
+_LIT(KUid, "uid");
+_LIT(KPackage, "package");
+_LIT(KVendor, "vendor");
+_LIT(KSisFile, "sis");
+
+using namespace Swi;
+
+/////////////////////////////////////////////////////////////////////
+// CSisRegistryStep
+/////////////////////////////////////////////////////////////////////
+TVerdict CSisRegistryWritableSessionStep::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 CSisRegistryWritableSessionStep::doTestStepPostambleL()
+	{
+	StopTimerAndPrintResultL();
+	// Remove the installed active scheduler
+	CActiveScheduler* s = CActiveScheduler::Current();
+	s->Install(NULL);
+	delete s;
+	INFO_PRINTF1(_L("Disconnecting to SisRegistry.."));
+	iSisRegistry.Close();
+	
+	__UHEAP_MARKEND;
+
+	return TestStepResult();
+	}
+
+/////////////////////////////////////////////////////////////////////
+// CPoliceSidsStep - tests specific to Sid access methods
+/////////////////////////////////////////////////////////////////////
+CPoliceSidsStep::CPoliceSidsStep()
+	{
+	SetTestStepName(KPoliceSids);
+	}
+
+TVerdict CPoliceSidsStep::doTestStepL()
+	{
+	// this test checks that this client would not be permitted to 
+	// perform the operations - the  drive state update methods are
+	// particularly important - no caps are required and hence policing on sid 
+	// is required. 
+	// the attempt to delete registry entries is important as a reassurance that 
+	// the both capability and sid based policing are enforced
+	TInt res;
+	SetTestStepResult(EPass);
+	TInt drive = 1;
+	// add drive 
+	TRAP(res, iSisRegistry.AddDriveL(drive));
+	INFO_PRINTF3(_L("Add drive %d returned %d"), drive, res);
+	if (res != KErrPermissionDenied)
+		{
+		SetTestStepResult(EFail);
+		}
+	
+#ifndef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+	// remove drive 
+	TRAP(res, iSisRegistry.RemoveDriveL(drive));
+	INFO_PRINTF3(_L("Remove drive %d returned %d"), drive, res);
+	if (res != KErrPermissionDenied)
+		{
+		SetTestStepResult(EFail);
+		}
+#endif
+		
+	RPointerArray<CSisRegistryPackage> packages;
+	CleanupResetAndDestroy<RPointerArray<CSisRegistryPackage> >::PushL(packages);
+	
+	iSisRegistry.InstalledPackagesL(packages);
+	
+	for(TInt index = 0; index < packages.Count(); index++)
+		{
+		INFO_PRINTF3(_L("(Vendor Name:) %S (Package Name:) %S"), 
+														&packages[index]->Vendor(), 
+														&packages[index]->Name());
+		
+		TRAP(res, iSisRegistry.DeleteEntryL(*packages[index], 0))
+		INFO_PRINTF3(_L("DeleteEntryL %d returned %d"), index, res);
+
+		if (res != KErrPermissionDenied)
+			{
+			SetTestStepResult(EFail);
+			}
+		}	
+
+	CleanupStack::PopAndDestroy(&packages);
+
+ 	SetTestStepResult(EPass);
+ 	return TestStepResult();
+	}	
+
+/////////////////////////////////////////////////////////////////////
+// CWritableEntryMethodsStep - tests specific to entry methods
+/////////////////////////////////////////////////////////////////////
+CWritableEntryMethodsStep::CWritableEntryMethodsStep()
+	{
+	SetTestStepName(KWritableEntryMethods);
+	}
+
+TVerdict CWritableEntryMethodsStep::doTestStepL()
+	{
+	RPointerArray<CSisRegistryPackage> packages;
+	CleanupResetAndDestroy<RPointerArray<CSisRegistryPackage> >::PushL(packages);
+	
+	iSisRegistry.InstalledPackagesL(packages);
+	
+	for(TInt index = 0; index < packages.Count(); index++)
+		{
+		INFO_PRINTF3(_L("(Vendor Name:) %S (Package Name:) %S"), 
+														&packages[index]->Vendor(), 
+														&packages[index]->Name());
+		
+		Swi::RSisRegistryWritableEntry entry;
+		CleanupClosePushL(entry);
+		TInt res = entry.OpenL(iSisRegistry, *packages[index]);
+		if (res == KErrNone)
+			{
+			PrintWritableEntryContents(entry);	
+			}	
+		CleanupStack::PopAndDestroy(&entry);
+		}	
+
+	CleanupStack::PopAndDestroy(&packages);
+
+ 	SetTestStepResult(EPass);
+ 	return TestStepResult();
+	}	
+
+void CWritableEntryMethodsStep::PrintWritableEntryContents(Swi::RSisRegistryWritableEntry &aEntry)
+	{
+	INFO_PRINTF1(_L("-------------------------------------\n")); 
+	// get the vendor; package name 
+	HBufC* vendor = aEntry.UniqueVendorNameL();
+	CleanupStack::PushL(vendor);
+	HBufC* package = aEntry.PackageNameL();
+	CleanupStack::PushL(package);
+	INFO_PRINTF3(_L("Package: %S from Vendor: %S"), package, vendor); 
+	CleanupStack::PopAndDestroy(package);
+	CleanupStack::PopAndDestroy(vendor);
+
+	// get the localised vendor name 
+	HBufC* vendorLocal = aEntry.LocalizedVendorNameL();
+	CleanupStack::PushL(vendorLocal);
+	INFO_PRINTF2(_L("Localised Vendor Name: %S"), vendorLocal); 
+	CleanupStack::PopAndDestroy(vendorLocal);
+
+	// get uid
+	TUid uid = aEntry.UidL();
+	INFO_PRINTF3(_L("Package Uid: %d 0x%08x"), uid.iUid, uid.iUid);
+	
+	// get the version
+	TVersion packageVersion = aEntry.VersionL(); 
+	INFO_PRINTF4(_L("Version  %d %d %d"), packageVersion.iMajor, packageVersion.iMinor, packageVersion.iBuild );
+	
+	// get sids	
+	RArray<TUid> sids;
+	CleanupClosePushL(sids);
+	aEntry.SidsL(sids);
+	if (sids.Count() <= 0)
+		{
+		INFO_PRINTF1(_L("No sids installed!"));
+		}
+	else 
+		{
+		for (TInt index = 0; index < sids.Count(); index++)
+			{
+			INFO_PRINTF2(_L("Sid: 0x%08x was found!"), sids[index]);
+			}
+		}
+	CleanupStack::PopAndDestroy(&sids);
+
+	// get language
+	TLanguage language = aEntry.LanguageL();
+	INFO_PRINTF3(_L("Package Language: %d 0x%08x"), language, language);
+
+	// get property
+	TInt32 propertyKey = 10;
+	TInt32 propertyValue = aEntry.PropertyL(propertyKey);
+	INFO_PRINTF3(_L("Package property: key %d  value %d"), propertyKey, propertyValue);
+
+	// is present - currenty relies on default value
+	TBool isPresent = aEntry.IsPresentL();
+	INFO_PRINTF2(_L("Package present is  %d"), isPresent);
+  	
+  	// is signed
+	TBool isSigned = aEntry.IsSignedL();
+	INFO_PRINTF2(_L("Package signed is  %d"), isSigned);
+
+	if (isSigned)
+		{
+		RPointerArray<HBufC8> certChains;
+		CleanupResetAndDestroy<RPointerArray<HBufC8> >::PushL(certChains);
+		aEntry.CertificateChainsL(certChains);
+		INFO_PRINTF2(_L("Package signed with %d chains"), certChains.Count());
+		CleanupStack::PopAndDestroy(&certChains);
+		}
+		
+		// check Trust
+		switch(aEntry.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 = aEntry.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 = aEntry.IsInRomL();
+	INFO_PRINTF2(_L("Package inRom is  %d"), inRom);
+
+    // is an augmentation
+	TBool isAug = aEntry.IsAugmentationL();
+	INFO_PRINTF2(_L("Package isAug is  %d"), isAug);
+  	// is preinstalled
+	/*  	
+    Sis::TInstallType installType = aEntry.InstallTypeL();
+	INFO_PRINTF3(_L("Package type is  %d %S"), 
+							installType, &installTypeNames[installType]);
+	*/
+  	// get list of files
+  	RPointerArray<HBufC> files;
+  	CleanupResetAndDestroy<RPointerArray<HBufC> >::PushL(files);
+  	aEntry.FilesL(files);
+ 	INFO_PRINTF2(_L("Package has %d files"), files.Count());
+ 	for (TInt i=0; i<files.Count(); i++)
+	 	{
+	 	INFO_PRINTF3(_L("File %d - file path %S"), i+1, files[i]);	
+	 	}
+			  	
+  	CleanupStack::PopAndDestroy(&files);
+  	
+    // get the drive selected by the user
+ 	TChar setDrive = aEntry.SelectedDriveL();
+	TUint setdrive(setDrive);
+	INFO_PRINTF2(_L("User selected drive is %c"), setdrive); 
+	
+	INFO_PRINTF1(_L("-------------------------------------\n")); 
+	}	
+	
+/////////////////////////////////////////////////////////////////////
+// CEntryDeleteUidStep - delete a operation
+/////////////////////////////////////////////////////////////////////
+CEntryDeleteStep::CEntryDeleteStep()
+	{
+	SetTestStepName(KEntryDelete);
+	}
+
+TVerdict CEntryDeleteStep::doTestStepL()
+	{
+	SetTestStepResult(EFail);
+	
+	RArray<TUid> deleteUids;
+	CleanupClosePushL(deleteUids);
+	GetUidArrayFromConfigL(ConfigSection(), KUid, deleteUids);
+	
+	RArray<TPtrC> deletePackageNames;
+	CleanupClosePushL(deletePackageNames);
+	GetStringArrayFromConfigL(ConfigSection(), KPackage, deletePackageNames);
+	
+	RArray<TPtrC> deleteVendorNames;
+	CleanupClosePushL(deleteVendorNames);
+	GetStringArrayFromConfigL(ConfigSection(), KVendor, deleteVendorNames);
+	
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+	TInt64 transactionID = -1;
+	Usif::RStsSession stsSession;
+	CleanupClosePushL(stsSession);
+#else
+	TInt64 transactionID = 1;
+	_LIT(KIntegrityServicesPath, "\\sys\\install\\integrityservices\\");
+#endif
+
+	for (TInt index = 0; index < deleteUids.Count(); index++)
+		{
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+		transactionID = stsSession.CreateTransactionL();
+#else
+		CIntegrityServices* integrityService = CIntegrityServices::NewLC(transactionID, KIntegrityServicesPath);
+#endif
+		INFO_PRINTF3(_L("Transaction %d Deleting registry entry with Uid 0x%08x"),
+									I64LOW(transactionID), deleteUids[index]);
+
+		CSisRegistryPackage* package = CSisRegistryPackage::NewLC(deleteUids[index], deletePackageNames[index], deleteVendorNames[index]);
+		TRAP_IGNORE(iSisRegistry.DeleteEntryL(*package, transactionID));
+		CleanupStack::PopAndDestroy(package);
+
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+		stsSession.CommitL();
+#else
+		integrityService->CommitL();
+		CleanupStack::PopAndDestroy(integrityService);
+#endif
+		// should not be able to find this entry
+		if(!iSisRegistry.IsInstalledL(deleteUids[index]))
+			{
+			SetTestStepResult(EPass);
+			}
+		}
+
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+	CleanupStack::PopAndDestroy(4, &deleteUids); //deletePackageNames, deleteVendorNames, stsSession
+#else
+	CleanupStack::PopAndDestroy(3, &deleteUids); //deletePackageNames, deleteVendorNames
+#endif
+	return TestStepResult();
+	}
+
+/////////////////////////////////////////////////////////////////////
+// CAddEntryStep - Adds a registry entry representing a given package
+/////////////////////////////////////////////////////////////////////
+CAddEntryStep::CAddEntryStep()
+	{
+	SetTestStepName(KAddEntryStep);
+	}
+
+TVerdict CAddEntryStep::doTestStepL()
+	{
+	TPtrC sisFile;	
+	if(!GetStringFromConfig(ConfigSection(), KSisFile, sisFile))
+		return PrintErrorAndReturnFailL(_L("SIS file couldn't be found in the configuration!"));
+	
+	HBufC8 *controllerData = GetControllerFromSisLC(sisFile);
+	const TInt controllerOffset = 4;
+	// The registry does not store the first 4 bytes of the controller - see CInstallationProcessor
+	TPtrC8 controllerDataPtr = controllerData->Mid(controllerOffset);
+			
+	RSisRegistryAccessSession sras;
+	User::LeaveIfError(sras.Connect());
+	CleanupClosePushL(sras);
+	sras.AddEntryL(controllerDataPtr, iTimeMeasuredExternally);
+	CleanupStack::PopAndDestroy(2, controllerData); // controllerData, sras
+	return TestStepResult();
+	}
+
+/////////////////////////////////////////////////////////////////////////////
+// CUpdateEntryStep - Updates the registry entry representing a given package
+/////////////////////////////////////////////////////////////////////////////
+CUpdateEntryStep::CUpdateEntryStep()
+	{
+	SetTestStepName(KUpdateEntryStep);
+	}
+
+TVerdict CUpdateEntryStep::doTestStepL()
+	{
+	TPtrC sisFile;	
+	if(!GetStringFromConfig(ConfigSection(), KSisFile, sisFile))
+		return PrintErrorAndReturnFailL(_L("SIS file couldn't be found in the configuration!"));
+
+	HBufC8 *controllerData = GetControllerFromSisLC(sisFile);
+	const TInt controllerOffset = 4;
+	// The registry does not store the first 4 bytes of the controller - see CInstallationProcessor
+	TPtrC8 controllerDataPtr = controllerData->Mid(controllerOffset);
+		
+	RSisRegistryAccessSession sras;
+	User::LeaveIfError(sras.Connect());
+	CleanupClosePushL(sras);
+	sras.UpdateEntryL(controllerDataPtr, iTimeMeasuredExternally);
+	CleanupStack::PopAndDestroy(2, controllerData); // controllerData, sras
+	return TestStepResult();
+	}
+
+/////////////////////////////////////////////////////////////////////////////
+// CSingleEntryDeleteStep - Deletes the registry entry representing a given package uid
+/////////////////////////////////////////////////////////////////////////////
+CSingleEntryDeleteStep::CSingleEntryDeleteStep()
+	{
+	SetTestStepName(KDeleteSingleEntry);
+	}
+
+TVerdict CSingleEntryDeleteStep::doTestStepL()
+	{
+	TUid uid;
+	if(!GetUidFromConfig(ConfigSection(), KUid, uid))
+		return PrintErrorAndReturnFailL(_L("Uid is missing in the configuration file!"));
+		
+	TPtrC package;	
+	if(!GetStringFromConfig(ConfigSection(), KPackage, package))
+		return PrintErrorAndReturnFailL(_L("Package couldn't be found in the configuration!"));
+	
+	TPtrC vendor;	
+	if(!GetStringFromConfig(ConfigSection(), KVendor, vendor))
+		return PrintErrorAndReturnFailL(_L("Vendor couldn't be found in the configuration!"));
+	
+	CSisRegistryPackage *sisPackage = CSisRegistryPackage::NewLC(uid, package, vendor);
+	
+	RSisRegistryAccessSession sras;
+	User::LeaveIfError(sras.Connect());
+	CleanupClosePushL(sras);
+	sras.DeleteEntryL(*sisPackage, iTimeMeasuredExternally);
+	CleanupStack::PopAndDestroy(2, sisPackage); // sisPackage, sras
+	return TestStepResult();
+	}
+
+/////////////////////////////////////////////////////////////////////////////
+// CPackageExistsInRomStep - Returns ETrue if any ROM stub in the filesystem has the package uid specified
+/////////////////////////////////////////////////////////////////////////////
+CPackageExistsInRomStep::CPackageExistsInRomStep()
+	{
+	SetTestStepName(KIsPackageExistInRomStep);
+	}
+
+TVerdict CPackageExistsInRomStep::doTestStepL()
+	{
+	TUid uid;
+	if(!GetUidFromConfig(ConfigSection(), KUid, uid))
+		{
+		ERR_PRINTF1(_L("Uid is missing in the configuration file!"));
+		SetTestStepResult(EFail);
+		return TestStepResult();
+		}
+	TBool ret = iSisRegistry.PackageExistsInRomL(uid);
+
+	return TestStepResult();
+	}
+
+
+