installationservices/swcomponentregistry/test/tscr/source/subsessionsteps.cpp
changeset 24 84a16765cd86
child 25 98b66e4fb0be
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/installationservices/swcomponentregistry/test/tscr/source/subsessionsteps.cpp	Fri Mar 19 09:33:35 2010 +0200
@@ -0,0 +1,321 @@
+/*
+* Copyright (c) 2008-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: 
+* Implements test steps for the subsessions interfaces in the SCR
+*
+*/
+
+
+#include "subsessionsteps.h"
+#include <scs/cleanuputils.h>
+#include "tscrdefs.h"
+
+using namespace Usif;
+
+TBool IsEqual(const CComponentEntry& aLhsEntry, const CComponentEntry& aRhsEntry)
+	{
+	return (aLhsEntry == aRhsEntry);
+	}
+
+TBool IsEqual(const HBufC& aLhs, const HBufC& aRhs)
+	{
+	return const_cast<HBufC &>(aLhs).Des() == const_cast<HBufC &>(aRhs).Des();
+	}
+
+template <class T> TBool VerifyMatchingL(const T* aObj, RPointerArray<T>& aExpectedArray)
+	{
+	TInt pos = aExpectedArray.Find(aObj, IsEqual);
+	if (pos != KErrNotFound)
+		{
+		T* foundObj = aExpectedArray[pos];
+		delete foundObj;
+		aExpectedArray.Remove(pos);
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+
+// -----------CScrGetComponentStep-----------------
+
+CScrComponentRegistrySubsessionStep::CScrComponentRegistrySubsessionStep(CScrTestServer& aParent)	: CScrTestStep(aParent)
+	{
+	}
+
+void CScrComponentRegistrySubsessionStep::ImplTestStepPreambleL()
+	{
+	CScrTestStep::ImplTestStepPreambleL();
+	}
+
+void CScrComponentRegistrySubsessionStep::GetComponentEntriesFromConfigL(RPointerArray<CComponentEntry>& aEntries)
+	{
+	TInt componentsCount(0);
+	if (!GetIntFromConfig(ConfigSection(), KComponentsCountName, componentsCount))
+		{
+		CComponentEntry *componentEntry = GetComponentEntryFromConfigLC();
+		aEntries.AppendL(componentEntry);
+		CleanupStack::Pop(componentEntry);
+		}
+	
+	for (TInt i = 0; i < componentsCount; ++i)
+		{
+		CComponentEntry *componentEntry = GetComponentEntryFromConfigLC(EFalse,i);
+		aEntries.AppendL(componentEntry);
+		CleanupStack::Pop(componentEntry);
+		}
+	}
+
+void CScrComponentRegistrySubsessionStep::VerifyNonReturnedEntriesL(const RPointerArray<CComponentEntry>& aExpectedEntries)
+	{
+	// Check if we need to verify the returned components
+	// Performance tests don't need verification.
+	TBool noVerification = EFalse;
+	GetBoolFromConfig(ConfigSection(), _L("NoVerification"), noVerification);
+	if(noVerification) return;
+
+	if (aExpectedEntries.Count() > 0)
+		{
+		TComponentId componentId = aExpectedEntries[0]->ComponentId(); 
+		const TDesC& componentName = aExpectedEntries[0]->Name();
+		ERR_PRINTF3(_L("At least one expected entry was not returned by the API - id %d, name %S"), componentId, &componentName);
+		SetTestStepResult(EFail);
+		}	
+	}
+
+void CScrComponentRegistrySubsessionStep::TestSingleModeL(const RSoftwareComponentRegistryView& aSubSession, RPointerArray<CComponentEntry>& aExpectedEntries)
+	{
+	// Check if we need to verify the returned components
+	// Performance tests don't need verification. Because the impact verification on performance results.
+	// In addition, we cannot simply verify some test cases such as retrieving all components or removable components. 
+	// Because, the perforamce test databases are populated with random data, and in the future we cannot guarantee 
+	// the values will stay same if the databases are recreated.
+	
+	TBool noVerification = EFalse;
+	GetBoolFromConfig(ConfigSection(), _L("NoVerification"), noVerification);
+
+	// Read continuously entries from the sub-session
+	while (1)
+		{
+		CComponentEntry* componentEntry = aSubSession.NextComponentL();
+		if (componentEntry == NULL)
+			break; // No more entries were found
+		CleanupStack::PushL(componentEntry);
+		
+		if(noVerification)
+			{
+			CleanupStack::PopAndDestroy(componentEntry);
+			continue;
+			}
+		// For each entry, check whether it was found in the expected array.
+		// If found, delete it from the expected array. If not, fail the test step
+		if (!VerifyMatchingL(componentEntry, aExpectedEntries))
+			{
+			ERR_PRINTF2(_L("The API returned an unexpected entry with id %d"), componentEntry->ComponentId());
+			SetTestStepResult(EFail);		
+			CleanupStack::PopAndDestroy(componentEntry);
+			return;
+			}
+				
+		CleanupStack::PopAndDestroy(componentEntry);
+		}
+			
+	// At the end, check whether there were expected entries which were not found
+	VerifyNonReturnedEntriesL(aExpectedEntries);
+	}
+
+void CScrComponentRegistrySubsessionStep::TestSetModeL(const RSoftwareComponentRegistryView& aSubSession, TInt aSetSize, RPointerArray<CComponentEntry>& aExpectedEntries)
+	{
+	// Check if we need to verify the returned components
+	// Performance tests don't need verification. See TestSingleModeL for more information.
+	TBool noVerification = EFalse;
+	GetBoolFromConfig(ConfigSection(), _L("NoVerification"), noVerification);
+
+	while (1)
+		{
+		RPointerArray<CComponentEntry> componentSet;
+		CleanupResetAndDestroyPushL(componentSet);
+		
+		aSubSession.NextComponentSetL(aSetSize, componentSet);
+		TInt returnedComponentsCount = componentSet.Count(); 
+		if (returnedComponentsCount <= 0)
+			{
+			CleanupStack::PopAndDestroy(&componentSet);
+			break;
+			}
+		
+		if(noVerification) 
+			{
+			CleanupStack::PopAndDestroy(&componentSet);
+			continue;
+			}
+				
+		for (TInt i = 0; i < returnedComponentsCount; ++i)
+			{
+			if (!VerifyMatchingL(componentSet[i], aExpectedEntries))
+				{
+				ERR_PRINTF2(_L("The API returned an unexpected entry with id %d"), componentSet[i]->ComponentId());
+				SetTestStepResult(EFail);				
+				CleanupStack::PopAndDestroy(&componentSet);
+				return;
+				}
+			}
+		
+		CleanupStack::PopAndDestroy(&componentSet);
+		}
+	
+	VerifyNonReturnedEntriesL(aExpectedEntries); 
+	}
+
+void CScrComponentRegistrySubsessionStep::ImplTestStepL()
+	{	
+	CComponentFilter* componentFilter = ReadComponentFilterFromConfigLC();
+	INFO_PRINTF1(_L("Read component filter from configuration"));
+	
+	INFO_PRINTF1(_L("Opened subsession to SCR"));
+	
+	//Get testing mode from configuration (sets or single iteration)
+	//Delegate the actual invocation and comparison according to the testing mode	
+	TInt setSize = GetSetSizeFromConfigL();
+	INFO_PRINTF2(_L("Test set size %d"), setSize);
+	
+	// Read expected results from config
+	RPointerArray<CComponentEntry> expectedComponentEntries;
+	CleanupResetAndDestroyPushL(expectedComponentEntries);
+	GetComponentEntriesFromConfigL(expectedComponentEntries);
+	StartTimer();
+	// Open the subsession
+	RSoftwareComponentRegistryView subSession;
+	CleanupClosePushL(subSession);	
+	subSession.OpenViewL(iScrSession, componentFilter);
+		
+	if (setSize == 1)
+		TestSingleModeL(subSession, expectedComponentEntries);
+	else
+		TestSetModeL(subSession, setSize, expectedComponentEntries);
+		
+	CleanupStack::PopAndDestroy(3, componentFilter); // expectedComponentEntries, subSession, componentFilter
+	}
+
+void CScrComponentRegistrySubsessionStep::ImplTestStepPostambleL()
+	{
+	CScrTestStep::ImplTestStepPostambleL();
+	}
+
+// -----------CScrFileListSubsessionStep-----------------
+
+CScrFileListSubsessionStep::CScrFileListSubsessionStep(CScrTestServer& aParent)	: CScrTestStep(aParent)
+	{
+	}
+
+void CScrFileListSubsessionStep::ImplTestStepPreambleL()
+	{
+	CScrTestStep::ImplTestStepPreambleL();
+	}
+
+void CScrFileListSubsessionStep::VerifyNonReturnedFilesL(const RPointerArray<HBufC>& aExpectedFiles)
+	{
+	if (aExpectedFiles.Count() > 0)
+		{
+		HBufC* fileName = aExpectedFiles[0]; 
+		ERR_PRINTF2(_L("At least one expected files was not returned by the API - name %S"), fileName);
+		SetTestStepResult(EFail);
+		}	
+	}
+
+void CScrFileListSubsessionStep::ReportUnexpectedFileL(const TDesC& aUnexpectedFileName)
+	{
+	ERR_PRINTF2(_L("The API returned an unexpected file entry with name %S"), &aUnexpectedFileName);
+	SetTestStepResult(EFail);		
+	}
+
+void CScrFileListSubsessionStep::TestSingleModeL(const RSoftwareComponentRegistryFilesList& aSubSession, 
+													 RPointerArray<HBufC> &aExpectedFiles)
+	{
+	FOREVER
+		{
+		HBufC *nextFile = aSubSession.NextFileL();
+		if (!nextFile)
+			break;
+		CleanupStack::PushL(nextFile);
+		
+		if (!VerifyMatchingL(nextFile, aExpectedFiles))
+			{
+			ReportUnexpectedFileL(*nextFile);
+			CleanupStack::PopAndDestroy(nextFile);
+			return;
+			}
+		
+		CleanupStack::PopAndDestroy(nextFile);
+		}
+	
+	VerifyNonReturnedFilesL(aExpectedFiles);
+	}
+
+void CScrFileListSubsessionStep::TestSetModeL(const RSoftwareComponentRegistryFilesList& aSubSession, TInt aSetSize, 
+											 	  RPointerArray<HBufC>& aExpectedFiles)
+	{
+	FOREVER
+		{
+		RPointerArray<HBufC> foundFiles;
+		CleanupResetAndDestroyPushL(foundFiles);
+		
+		aSubSession.NextFileSetL(aSetSize, foundFiles);
+		TInt returnedFilesCount = foundFiles.Count(); 
+		if (returnedFilesCount <= 0)
+			{
+			CleanupStack::PopAndDestroy(&foundFiles);
+			break;
+			}
+		for (TInt i = 0; i < returnedFilesCount; ++i)
+			{
+			if (!VerifyMatchingL(foundFiles[i], aExpectedFiles))
+				{
+				ReportUnexpectedFileL(*foundFiles[i]);
+				CleanupStack::PopAndDestroy(&foundFiles);
+				return;
+				}
+			}
+		
+		CleanupStack::PopAndDestroy(&foundFiles);
+		}
+	VerifyNonReturnedFilesL(aExpectedFiles);
+	}
+
+
+void CScrFileListSubsessionStep::ImplTestStepL()
+	{	
+	TInt componentId = GetComponentIdL();
+	RSoftwareComponentRegistryFilesList subSession;
+	CleanupClosePushL(subSession);
+	
+	subSession.OpenListL(iScrSession, componentId);
+	
+	RPointerArray<HBufC> expectedFiles;
+	CleanupResetAndDestroyPushL(expectedFiles);
+	
+	GetFileNameListFromConfigL(expectedFiles);
+	TInt setSize = GetSetSizeFromConfigL();
+
+	if (setSize > 1)
+		TestSingleModeL(subSession, expectedFiles);
+	else
+		TestSetModeL(subSession, setSize, expectedFiles);	
+			
+	CleanupStack::PopAndDestroy(2, &subSession); //expectedEntries 
+	}
+
+void CScrFileListSubsessionStep::ImplTestStepPostambleL()
+	{
+	CScrTestStep::ImplTestStepPostambleL();
+	}