featuremgmt/featuremgr/test/tef/tef_efm_unit/src/efm_unit_teststeps.cpp
changeset 0 08ec8eefde2f
child 11 667e88a979d7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/featuremgmt/featuremgr/test/tef/tef_efm_unit/src/efm_unit_teststeps.cpp	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,554 @@
+// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "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:
+// UnitTestSteps.cpp
+// Feature Discovery unit test steps
+// 
+//
+
+/**
+ @file
+ @internalComponent
+ @test
+*/
+
+#include "efm_unit_teststeps.h"
+#include "efm_teststepbase.h"
+#include "featmgrfeatureregistry.h"
+#include "efm_test_consts.h"
+#include <apgcli.h>
+#include <apacmdln.h>
+
+CServerDataTestStep::CServerDataTestStep()
+	{
+	SetTestStepName(KServerDataTest);
+	}
+
+TVerdict CServerDataTestStep::doTestStepL()
+	{
+	TFeatureServerEntry defaultEntry;
+	TESTDIAGNOSTICERROR(defaultEntry.FeatureFlags().Value()==0,		
+		_L("TFeatureServerEntry has wrong feature flags: value = %d"),defaultEntry.FeatureFlags().Value());	
+	TESTDIAGNOSTICERROR(defaultEntry.FeatureData()==0,
+		_L("TFeatureServerEntry has wrong feature data: value = %d"),defaultEntry.FeatureData());
+	TESTDIAGNOSTICERROR(defaultEntry.FeatureUid().iUid==0,
+		_L("TFeatureServerEntry has wrong feature flags: value = %d"),defaultEntry.FeatureUid());	
+
+	TFeatureServerEntry uidEntry(KDefaultSupportedUid);
+	TESTDIAGNOSTICERROR(uidEntry.FeatureUid()==KDefaultSupportedUid,
+			_L("TFeatureServerEntry has wrong feature flags: value = %d"),defaultEntry.FeatureUid());
+	TESTDIAGNOSTICERROR(uidEntry.FeatureFlags().Value()==0,		
+		_L("TFeatureServerEntry has wrong feature flags: value = %d"),defaultEntry.FeatureFlags().Value());	
+	TESTDIAGNOSTICERROR(uidEntry.FeatureData()==0,
+		_L("TFeatureServerEntry has wrong feature data: value = %d"),defaultEntry.FeatureData());
+	
+	TFeatureServerEntry argumentListEntry(KDefaultSupportedUid, TBitFlags(1), 1);
+	TESTDIAGNOSTICERROR(argumentListEntry.FeatureUid()==KDefaultSupportedUid,
+			_L("TFeatureServerEntry has wrong feature flags: value = %d"),defaultEntry.FeatureUid());
+	TESTDIAGNOSTICERROR(argumentListEntry.FeatureFlags().Value()==1,		
+		_L("TFeatureServerEntry has wrong feature flags: value = %d"),defaultEntry.FeatureFlags().Value());	
+	TESTDIAGNOSTICERROR(argumentListEntry.FeatureData()==1,
+		_L("TFeatureServerEntry has wrong feature data: value = %d"),defaultEntry.FeatureData());
+
+	return TestStepResult();
+	}
+
+// ---------------------------------------------------------------------------
+
+// Create some resources necessary to the tests. Do this in the preamble
+// so that it isn't affected if we're running with the TEF '!OOM' option.
+// That only operates on the 'doTestStepL' method.
+TVerdict CServerBaseTestStep::doTestStepPreambleL()
+	{
+	CEFMConfigurableTestStepBase::doTestStepPreambleL();
+	TInt err = ifs.Connect();
+    TESTDIAGNOSTICERROR(err==KErrNone,
+		_L("CServerBaseTestStep::doTestStepPreambleL RFS::Connect expected to return KErrNone: returned value is %d"),err);	
+	if(err) return TestStepResult();
+	CleanupClosePushL(ifs);
+
+	ifeatureSet = CFeatMgrFeatureRegistry::NewL(ifs, *this);
+
+    CleanupStack::PushL(ifeatureSet);
+	return TestStepResult();
+	}
+
+// Clean up the resources previously allocated.
+TVerdict CServerBaseTestStep::doTestStepPostambleL()
+	{
+	CEFMConfigurableTestStepBase::doTestStepPostambleL();
+	CleanupStack::PopAndDestroy(ifeatureSet);
+	CleanupStack::PopAndDestroy(&ifs);
+	return TestStepResult();
+	}
+
+// ---------------------------------------------------------------------------
+
+CServerFeatureLookupTestStep::CServerFeatureLookupTestStep()
+	{
+	SetTestStepName(KServerFeatureLookupTest);
+	}
+
+TVerdict CServerFeatureLookupTestStep::doTestStepL()
+	{
+    //check that an emty registry returns expected values
+	TFeatureServerEntry feaureEntry1(KDefaultSupportedUid,TBitFlags32(1),0);
+	TInt supported = ifeatureSet->IsFeatureSupported( feaureEntry1 );
+	TESTDIAGNOSTICERROR(supported==KErrNotFound,
+		_L("Feature is not expected to be supported in the empty feature registry: value = %d"),supported);
+		
+	//add one feature and check that it is reported as found	
+	TInt error = ifeatureSet->AddFeature( feaureEntry1 );	
+	CheckCondition(error==KErrNone, error==KErrNoMemory,
+		_L("CFeatMgrFeatureRegistry::AddFeature failed: error = %d"),error);
+	if (error==KErrNoMemory)
+		{
+		return TestStepResult();
+		}
+	supported = ifeatureSet->IsFeatureSupported( feaureEntry1 );
+	TESTDIAGNOSTICERROR(supported==KFeatureSupported,
+		_L("Feature is expected to be supported after being added: value = %d"),supported);	
+		
+	//check that non-existing features are reported as not found	
+	TUid supportedUid(KDefaultSupportedUid);
+	TFeatureServerEntry feaureEntry2(TUid::Uid(supportedUid.iUid-1));
+	supported = ifeatureSet->IsFeatureSupported( feaureEntry2 );
+	TESTDIAGNOSTICERROR(supported==KErrNotFound,
+		_L("Feature is not expected to be supported: value = %d"),supported);		
+	TFeatureServerEntry feaureEntry3(TUid::Uid(supportedUid.iUid+1));
+	supported = ifeatureSet->IsFeatureSupported( feaureEntry3 );
+	TESTDIAGNOSTICERROR(supported==KErrNotFound,
+		_L("Feature is not expected to be supported: value = %d"),supported);			
+	
+	//add one more feature	
+	TFeatureServerEntry feaureEntry4(TUid::Uid(supportedUid.iUid+2),TBitFlags32(1),0);
+	error = ifeatureSet->AddFeature( feaureEntry4 );	
+	CheckCondition(error==KErrNone, error==KErrNoMemory,
+		_L("CFeatMgrFeatureRegistry::AddFeature failed: error = %d"),error);
+	if (error==KErrNoMemory)
+		{
+		return TestStepResult();
+		}
+	//check that the original feature is still supported
+	supported = ifeatureSet->IsFeatureSupported( feaureEntry1 );
+	TESTDIAGNOSTICERROR(supported==KFeatureSupported,
+		_L("Feature is expected to be supported after being added: value = %d"),supported);	
+	
+	//check that the newly added feature is supported
+	supported = ifeatureSet->IsFeatureSupported( feaureEntry4 );
+	TESTDIAGNOSTICERROR(supported==KFeatureSupported,
+		_L("Feature is expected to be supported after being added: value = %d"),supported);			
+	
+	//check that non-existing features are still reported as not found	
+	supported = ifeatureSet->IsFeatureSupported( feaureEntry2 );
+	TESTDIAGNOSTICERROR(supported==KErrNotFound,
+		_L("Feature is expected to be not found: value = %d"),supported);		
+	TFeatureServerEntry feaureEntry5(TUid::Uid(supportedUid.iUid+3));
+	supported = ifeatureSet->IsFeatureSupported( feaureEntry5 );
+	TESTDIAGNOSTICERROR(supported==KErrNotFound,
+		_L("Feature is expected to be not found: value = %d"),supported);				
+	
+	return TestStepResult();
+	}
+
+CServerUpdateCodeTestStep::CServerUpdateCodeTestStep()
+	{
+	SetTestStepName(KServerUpdateCodeTest);
+	}
+
+// Run the test..
+TVerdict CServerUpdateCodeTestStep::doTestStepL()
+	{
+    //read the feature data files
+    TRAPD(err, ifeatureSet->ReadFeatureFilesL());
+    CheckCondition(err==KErrNone,err==KErrNoMemory,
+		_L("CFeatMgrFeatureRegistry::ReadFeatureFilesL failed: error = %d"), err);
+    if (err==KErrNoMemory)
+    	{
+    	return TestStepResult();
+    	}
+    
+	TInt nfeat = ifeatureSet->NumberOfSupportedFeatures();
+	TESTDIAGNOSTICERROR(nfeat==1,
+		_L("CFeatMgrFeatureRegistry::NumberOfSupportedFeatures expected to return 1: returned value is %d"), nfeat);	
+
+    TUint32 featureData = KChangeData;
+    err = ifeatureSet->SetFeature( KDefaultSupportedUid, 0, &featureData);
+    CheckCondition(err==KErrNone,err==KErrNoMemory,
+		_L("CFeatMgrFeatureRegistry::SetFeature failed: error = %d"),err);
+    if (err==KErrNoMemory)
+        {
+        return TestStepResult();
+        }
+    
+	err = ifeatureSet->SetFeature(KUnknownUid, 0, &featureData);	
+	TESTDIAGNOSTICERROR(err==KErrNotFound, 
+		_L("CFeatMgrFeatureRegistry::SetFeature for an undefined feature failed: returned value is %d"),err);	
+	if (err==KErrNoMemory)
+	    {
+	    return TestStepResult();
+	    }
+	
+	err = ifeatureSet->SetFeature(KDSR1Uid, 0, &featureData); 
+	TESTDIAGNOSTICERROR(err==KErrNotFound, 
+		_L("CFeatMgrFeatureRegistry::SetFeature for a feature from DSR failed: returned value is %d"),err);
+			
+	return TestStepResult();
+	}
+
+CServerReadRuntimeFeaturesTestStep::CServerReadRuntimeFeaturesTestStep()
+	{
+	SetTestStepName(KServerReadRuntimeFeaturesTest);
+	}
+
+TVerdict CServerReadRuntimeFeaturesTestStep::doTestStepL()
+	{
+	TBool mybool;
+    TRAPD(err, ifeatureSet->ReadRuntimeFeaturesL(mybool));
+    TESTDIAGNOSTICERROR(err==KErrNone,
+		_L("CFeatMgrFeatureRegistry::ReadRuntimeFeaturesL is expected to return KErrNone: returned value is %d"), err);	
+    TESTDIAGNOSTICERROR(mybool,
+		_L("CFeatMgrFeatureRegistry::ReadRuntimeFeaturesL, boolean should be true. Returned value is %d"), mybool);	
+	
+	return TestStepResult();
+	}
+
+CServerMergePluginFeaturesTestStep::CServerMergePluginFeaturesTestStep()
+	{
+	SetTestStepName(KServerMergePluginFeaturesTest);
+	}
+
+TVerdict CServerMergePluginFeaturesTestStep::doTestStepPreambleL()
+	{
+	// Get the required RFs handle and CFeatMgrFeatureRegistry object set up.
+	CServerBaseTestStep::doTestStepPreambleL();
+
+	// Set up an RFeatureArray with 5 features. These uids are arbitrary.
+	// We do this in the preamble because this test is expected to operate
+	// under low memory conditions with the TEF '!OOM' option. We don't
+	// want that interfering with the creation of the RFeatureArray object
+	// necessary to the test.
+	TBitFlags32 flags1(0);
+	flags1.Set( EFeatureSupported );
+	flags1.Set( EFeatureModifiable );
+	TFeatureEntry newentry1(KMergeUid1, flags1, KDefaultData1 );
+
+	TBitFlags32 flags2(0);
+	flags2.Set( EFeatureSupported );
+	flags2.Set( EFeatureBlackListed );
+	TFeatureEntry newentry2(KMergeUid2, flags2, KDefaultData1 );
+
+	TBitFlags32 flags3(0);
+	flags3.Set( EFeatureSupported );
+	flags3.Set( EFeatureUpgradeable );
+	flags3.Set( EFeatureModifiable );
+	TFeatureEntry newentry3(KMergeUid3, flags3, KDefaultData1 );
+
+	TBitFlags32 flags4(0);
+	flags4.Set( EFeatureSupported );
+	flags4.Set( EFeatureUpgradeable );
+	TFeatureEntry newentry4(KMergeUid4, flags4, KDefaultData1 );
+
+	TBitFlags32 flags5(0);
+	flags5.Set( EFeatureSupported );
+	flags5.Set( EFeatureModifiable );
+	flags5.Set( EFeaturePersisted );
+	TFeatureEntry newentry5(KMergeUid5, flags5, KDefaultData1 );
+
+	CleanupClosePushL(irfa);
+	irfa.AppendL(newentry1);
+	irfa.AppendL(newentry2);
+	irfa.AppendL(newentry3);
+	irfa.AppendL(newentry4);
+	irfa.AppendL(newentry5);
+	
+	return TestStepResult();
+	}
+
+TVerdict CServerMergePluginFeaturesTestStep::doTestStepPostambleL()
+	{
+	CleanupStack::PopAndDestroy(&irfa);
+	CServerBaseTestStep::doTestStepPostambleL();
+	return TestStepResult();
+	}
+
+TVerdict CServerMergePluginFeaturesTestStep::doTestStepL()
+	{
+	// This is a void method, so we can't actually check directly if this worked
+	ifeatureSet->MergePluginFeatures(irfa);
+
+	// .. so get the supported features in this array and check
+	RFeatureUidArray rf;
+	CleanupClosePushL(rf);
+	ifeatureSet->SupportedFeaturesL(rf);
+	TInt nfeat = rf.Count();
+	CheckCondition(nfeat==5,nfeat==4,
+		_L("CFeatMgrFeatureRegistry::SupportedFeaturesL expected to return an array of 5: returned value is %d"), nfeat);	
+    CleanupStack::PopAndDestroy(&rf);
+	return TestStepResult();
+	}
+
+
+CServerMergePluginFeaturesTestStep2::CServerMergePluginFeaturesTestStep2()
+	{
+	SetTestStepName(KServerMergePluginFeaturesTest2);
+	}
+
+TVerdict CServerMergePluginFeaturesTestStep2::doTestStepPreambleL()
+	{
+	// Get the required RFs handle and CFeatMgrFeatureRegistry object set up.
+	CServerBaseTestStep::doTestStepPreambleL();
+	CleanupClosePushL(ifc);
+
+	// Get values that are easy to bitwise OR into flags.
+	TInt supported = (1 << EFeatureSupported);
+	TInt upgradeable = (1 << EFeatureUpgradeable);
+	TInt modifiable = (1 << EFeatureModifiable);
+	TInt blacklisted = (1 << EFeatureBlackListed);
+//	TInt uninitialized = (1 << EFeatureUninitialized); // not used.
+	TInt persisted = (1 << EFeaturePersisted);
+
+	// Set up an RFeatureArray with 5 features. These uids are arbitrary.
+	// We do this in the preamble because this test is expected to operate
+	// under low memory conditions with the TEF '!OOM' option. We don't
+	// want that interfering with the creation of the RFeatureArray object
+	// necessary to the test.
+    FeatureInfoCommand::TFeature feature1;
+
+	feature1.iFeatureID = KMergeUid1.iUid;
+    feature1.iValue = supported | modifiable;
+
+	FeatureInfoCommand::TFeature feature2;
+	feature2.iFeatureID = KMergeUid2.iUid;
+	feature2.iValue = supported | blacklisted;
+
+	FeatureInfoCommand::TFeature feature3;
+	feature3.iFeatureID = KMergeUid3.iUid;
+	feature3.iValue = supported | upgradeable | modifiable;
+
+	FeatureInfoCommand::TFeature feature4;
+	feature4.iFeatureID = KMergeUid4.iUid;
+	feature4.iValue = supported | upgradeable;
+
+	FeatureInfoCommand::TFeature feature5;
+	feature5.iFeatureID = KMergeUid5.iUid;
+	feature5.iValue = supported | modifiable | persisted;
+
+	ifc.AppendL(feature1);
+	ifc.AppendL(feature2);
+	ifc.AppendL(feature3);
+	ifc.AppendL(feature4);
+	ifc.AppendL(feature5);
+	
+	return TestStepResult();
+	}
+
+TVerdict CServerMergePluginFeaturesTestStep2::doTestStepPostambleL()
+	{
+	CleanupStack::PopAndDestroy(&ifc);
+	CServerBaseTestStep::doTestStepPostambleL();
+	return TestStepResult();
+	}
+
+TVerdict CServerMergePluginFeaturesTestStep2::doTestStepL()
+	{
+	// This is a void method, so we can't actually check directly if this worked
+	ifeatureSet->MergePluginFeatures(ifc);
+
+	// .. so get the supported features in this array and check
+	RFeatureUidArray rf;
+	CleanupClosePushL(rf);
+	ifeatureSet->SupportedFeaturesL(rf);
+	TInt nfeat = rf.Count();
+	CheckCondition(nfeat==5, nfeat==4,
+		_L("CFeatMgrFeatureRegistry::SupportedFeaturesL expected to return an array of 5: returned value is %d"), nfeat);	
+    CleanupStack::PopAndDestroy(&rf);
+	return TestStepResult();
+	}
+
+
+CControlASTimer* CControlASTimer::NewL()
+	{
+	CControlASTimer* self = new(ELeave) CControlASTimer();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CControlASTimer::CControlASTimer() : CTimer(EPriorityStandard)
+	{
+	}
+
+CControlASTimer::~CControlASTimer()
+	{
+	Cancel();
+	}
+
+void CControlASTimer::ConstructL()
+	{
+	CTimer::ConstructL();
+	CActiveScheduler::Add(this);
+	}
+
+void CControlASTimer::Start()
+	{
+	After(1500000);
+	CActiveScheduler::Start();
+	}
+
+void CControlASTimer::RunL()
+	{
+	CActiveScheduler::Stop();
+	}
+
+void CControlASTimer::DoCancel()
+	{
+	CTimer::DoCancel();
+	}
+
+CFeatmgrOomSWI::CFeatmgrOomSWI() : iIterations(1)
+	{
+	SetTestStepName(KFeatmgrOomSWI);
+	}
+
+TVerdict CFeatmgrOomSWI::doTestStepPreambleL()
+    {
+    INFO_PRINTF2(_L("Iteration: %d START"), iIterations);    	
+    
+    CServerBaseTestStep::doTestStepPreambleL();
+
+	// Launching dummyswi.exe
+	_LIT(KDummySWIPath, "dummyswi.exe");
+	TInt err = iSWIProcess.Create(KDummySWIPath, _L("1"));	// 1 = install success
+	TESTDIAGNOSTICERROR(err==KErrNone,
+			   _L("RProcess::Create expects KErrNone, returned value is = %d"),err);
+	if( err==KErrNone )
+		{
+	    RApaLsSession ls;
+		CApaCommandLine* cmdLine;		
+		User::LeaveIfError(ls.Connect());
+		CleanupClosePushL(ls);
+		cmdLine = CApaCommandLine::NewLC();
+		cmdLine->SetExecutableNameL(KDummySWIPath);
+		cmdLine->SetProcessEnvironmentL(iSWIProcess);
+		iSWIProcess.Resume();	
+		CleanupStack::PopAndDestroy(2);
+		cmdLine = NULL;			
+		}
+    
+	// Install the Active Scheduler. We need this for the SWIListener Active Object on the server to
+	// be able to subscribe to the P&S install property.
+	iActivescheduler = new(ELeave) CActiveScheduler();
+    CActiveScheduler::Install(iActivescheduler);
+	// Starts the Active Scheduler (after it is installed) and stops it after 1.5 seconds (the time 
+    // needed for DummySWI to reset the P&S install property to ESASwisStatusSuccess which indicates 
+    // a successful installation).
+	iAsTimer = CControlASTimer::NewL();
+
+	// Delay to prepare the listener for SWI install P&S property
+	User::After(1000000);
+	
+	// Get this process' ID
+    RThread thread;
+    RProcess thisprocess = RProcess();
+    TInt processId = TUint(thisprocess.Id());
+  
+    err = ifeatureSet->SWIStart(processId);
+    TESTDIAGNOSTICERROR(err==KErrNone,
+			_L("CFeatMgrFeatureRegistry::SWIStart failed: error = %d"),err);
+
+    return TestStepResult();
+    }
+
+TVerdict CFeatmgrOomSWI::doTestStepPostambleL()
+    {
+    INFO_PRINTF2(_L("Iteration: %d END"), iIterations);    	
+
+	iSWIProcess.Close();
+	delete iAsTimer;
+	iAsTimer = NULL;
+	delete iActivescheduler;
+	iActivescheduler = NULL;
+    CServerBaseTestStep::doTestStepPostambleL();
+	++iIterations;
+
+    return TestStepResult();
+    }
+
+TVerdict CFeatmgrOomSWI::doTestStepL() 
+	{	
+	TInt err(KErrGeneral);
+
+	// Get this process' ID
+    RThread thread;
+    RProcess thisprocess = RProcess();
+    TInt processId = TUint(thisprocess.Id());
+    
+	TBitFlags32 flags( 0 ); 	
+	flags.Set( EFeatureSupported);
+	flags.Set( EFeatureModifiable );
+	
+	// 
+	// Caching starts here
+	//
+	
+	// Adding feature KNewUid1
+	// In the second iteration in OOM this fails with KErrNoMemory, meaning that KNewUid1 
+	// could not be cached. 
+	TFeatureServerEntry entry1(KNewUid1,flags,KDefaultData1);
+	err = ifeatureSet->AddFeature( entry1, processId );	
+	TESTDIAGNOSTICERROR(err==KErrNone || err==KErrNoMemory,
+			_L("CFeatMgrFeatureRegistry::AddFeature for KNewUid1 failed: error = %d"),err);
+
+	// Adding feature KNewUid2	
+	TFeatureServerEntry entry2(KNewUid2,flags,KDefaultData1);
+	err = ifeatureSet->AddFeature( entry2, processId );	
+	TESTDIAGNOSTICERROR(err==KErrNone || err==KErrNoMemory,
+			_L("CFeatMgrFeatureRegistry::AddFeature for KNewUid2 failed: error = %d"),err);
+
+	// Setting feature KNewUid1
+	TUint32 value = 2;
+	TInt seterr = ifeatureSet->SetFeature( (TUid)KNewUid1, 1, &value, processId );
+	TESTDIAGNOSTICERROR(err==KErrNone || err==KErrNoMemory,       
+			_L("CFeatMgrFeatureRegistry::SetFeature - KErrNone or KErrNoMemory expected; error = %d"), seterr);
+
+	// In the second iteration this returns KErrGeneral which means that an OOM error 
+	// occurred during caching.
+	// In the third iteration it fails with KErrNoMemory because it failed to allocate 
+	// memory in the features list on the server for KNewUid1 and KNewUid2.
+	err = ifeatureSet->SWIEnd(processId);
+	TESTDIAGNOSTICERROR(err==KErrNone || err==KErrNoMemory,
+			_L("CFeatMgrFeatureRegistry::SWIEnd failed: error = %d"),err);
+
+	// 
+	// Committing is issued on the server after this point 
+	//
+
+	// Starts the Active Scheduler which was installed in doTestStepPreambleL.
+	// The Active Scheduler will be closed when the timer of iAsTimer expires and that
+	// will prevent the thread from hanging.
+	iAsTimer->Start();	
+
+	// Deleting feature KNewUid1
+	// On both the second and third iterations this fails with KErrNotFound because 
+	// KNewUid1 was not successfully added to the features list on the server.
+	TInt delerr = ifeatureSet->DeleteFeature( KNewUid1, processId );
+	TESTDIAGNOSTICERROR(delerr == KErrNone || delerr == KErrNotFound ,       
+			_L("CFeatMgrFeatureRegistry::DeleteFeature for KNewUid1 - KErrNone or KErrNotFound expected; error = %d"), delerr);
+	
+    return TestStepResult();
+	}
+
+
+