lowlevellibsandfws/pluginfw/TestExecute/EComPerfTest/src/TE_EcomGranularityTestStep.cpp
changeset 0 e4d67989cc36
child 44 97b0fb8a2cc2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lowlevellibsandfws/pluginfw/TestExecute/EComPerfTest/src/TE_EcomGranularityTestStep.cpp	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,233 @@
+// Copyright (c) 2006-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:
+//
+
+/**
+ @file
+ @internalComponent
+*/
+#include <startup.hrh>
+#include <hal.h>
+#include "RegistryData.h"
+#include "Registrar.h"
+#include "RegistrarObserver.h"
+#include "DriveInfo.h"
+#include "TE_EcomGranularityTestStep.h"
+
+_LIT (KMinGranInfUidIndex, "MinGranInfUidIndex");
+_LIT (KMinGranImplUidIndex, "MinGranImplUidIndex");
+_LIT (KGranStep, "GranStep");
+_LIT (KMaxGranInfUidIndex, "MaxGranInfUidIndex");
+_LIT (KMaxGranImplUidIndex, "MaxGranImplUidIndex");
+
+
+/** Stub class needed to instantiate CRegistrar object. */
+class CTestRegistrarObserver : public MRegistrarObserver
+	{
+public:
+	// This is a stub. Hence do nothing in notification.
+	void Notification( TInt /*aNotification*/ ) {}
+	};
+
+/** Constructor of CEComImplIndexPerfTest */
+CEComImplIndexPerfTest::CEComImplIndexPerfTest()
+	{
+	SetTestStepName(KEComImplIndexPerfTest);
+	}
+
+/** destructor of CEComImplIndexPerfTest */
+CEComImplIndexPerfTest::~CEComImplIndexPerfTest()
+	{
+	iFs.Close();
+	delete iScheduler;
+	}
+
+/** Run the test */
+TVerdict CEComImplIndexPerfTest::doTestStepL()
+	{
+	iScheduler = new(ELeave) CActiveScheduler;
+	CActiveScheduler::Install(iScheduler);
+	User::LeaveIfError(iFs.Connect());
+
+	if (ReadConfigParameters() != EPass)
+		{
+		return TestStepResult();
+		}
+
+	TInt fastCounterFreq;
+	HAL::Get(HAL::EFastCounterFrequency, fastCounterFreq);
+	TUint numTicksInHalfMilliSec = fastCounterFreq / 2000;
+
+	const TInt KNumberOfDataPts = 
+		(iMaxInfUidIndexGranularity - iMinInfUidIndexGranularity) / iGranStep + 1;
+	HBufC* hbufc = HBufC::NewLC(10 * KNumberOfDataPts);
+	TPtr   buf = hbufc->Des();
+
+	// If a sample has the same granularities as the default values
+	// in RegistryData.h, save the result in defaultGranularityTime.
+	TUint32 defaultGranularityTime = 0x7fffffff;
+
+	TUint32 besttime = 0x7fffffff;
+	TUint32 worsttime = 0;
+	TInt bestAllImplGranularity = 0;
+	TInt bestImplUidGranularity = 0;
+
+	TUint32 startTicks, endTicks;
+
+	// Print header for table
+	_LIT(KTableLegend, "Columns = iInterfaceImplIndex granularity, rows = iImplIndex granularity");
+	Logger().Write(KTableLegend);
+
+	_LIT(KCommaNumber, ",%d");
+	_LIT(KCommaNumber3Wide, ",%3d");
+	_LIT(KNumber2Wide, "%2d");
+
+	_LIT(KColumnHeadSpace, "--");
+	buf.Copy(KColumnHeadSpace);
+	TInt j;
+	for (j = iMinInfUidIndexGranularity; j <= iMaxInfUidIndexGranularity; j += iGranStep)
+		{
+		buf.AppendFormat(KCommaNumber3Wide, j);
+		}
+	Logger().Write(buf);
+
+
+	CTestRegistrarObserver* registrarObserver = new (ELeave) CTestRegistrarObserver; 
+	CleanupStack::PushL(registrarObserver);
+
+	// The two nexting for loops below generate a 2-D table of
+	// discovery time at different combinations of granularities.
+	for (TInt implIndexGranularity = iMinIimplUidIndexGranularity;
+		 implIndexGranularity <= iMaxIimplUidIndexGranularity;
+		 implIndexGranularity += iGranStep)
+		{
+		buf.Format(KNumber2Wide, implIndexGranularity);
+
+		for (TInt infIndexGranularity = iMinInfUidIndexGranularity;
+			infIndexGranularity <= iMaxInfUidIndexGranularity; 
+			infIndexGranularity += iGranStep)
+			{
+			CRegistryData* registryData = CRegistryData::NewL(iFs, infIndexGranularity, implIndexGranularity); 
+			CleanupStack::PushL(registryData);
+
+			CRegistrar* registrar = CRegistrar::NewL(*registryData, *registrarObserver, iFs); 
+			CleanupStack::PushL(registrar);
+
+			startTicks = User::FastCounter();
+			registrar->ProcessSSAEventL(EStartupStateCriticalStatic);
+			endTicks = User::FastCounter();
+
+			TUint32 elapsedMilliSec = (endTicks - startTicks + numTicksInHalfMilliSec) * 1000 / fastCounterFreq;
+			buf.AppendFormat(KCommaNumber, elapsedMilliSec);
+
+			// Look for the best, worst and default granularity times.
+			if ((KDefaultInterfaceImplIndexGranularity == infIndexGranularity) &&
+			 	(KDefaultImplIndexGranularity == implIndexGranularity))
+				{
+				defaultGranularityTime = elapsedMilliSec;
+				}
+
+			if (besttime > elapsedMilliSec)
+				{
+				bestAllImplGranularity = infIndexGranularity;
+				bestImplUidGranularity = implIndexGranularity;
+				besttime = elapsedMilliSec;
+				}
+			else if (elapsedMilliSec > worsttime)
+				{
+				worsttime = elapsedMilliSec;
+				}
+
+			CleanupStack::PopAndDestroy(registrar);
+			CleanupStack::PopAndDestroy(registryData);
+			} // for AllImplementations index granularity
+
+		// Show one row of result.
+		Logger().Write(buf);
+		} // for impl. UID index granularity
+
+	CleanupStack::PopAndDestroy(registrarObserver);
+
+	_LIT(KBest, "Best time is %d milli sec at interface idx granularity %d, Impl UID index granularity %d");
+	INFO_PRINTF4(KBest, besttime, bestAllImplGranularity, bestImplUidGranularity);
+
+	_LIT(KWorst, "Worst time is %d milli sec.");
+	INFO_PRINTF2(KWorst, worsttime);
+
+	if (0x7fffffff != defaultGranularityTime)
+		{
+		_LIT(KDefGran, "Default granularities (%d,%d) time is %d.");
+		INFO_PRINTF4(KDefGran, KDefaultInterfaceImplIndexGranularity, KDefaultImplIndexGranularity, defaultGranularityTime);
+		}
+
+	CleanupStack::PopAndDestroy(hbufc);
+	return TestStepResult();
+	}
+
+/** Read test configuration from ini file.
+*/
+TVerdict CEComImplIndexPerfTest::ReadConfigParameters()
+	{
+	_LIT (KMissingParamMsg, "Missing %S in config file");
+
+	if (!GetIntFromConfig(ConfigSection(), KMinGranInfUidIndex, iMinInfUidIndexGranularity))
+		{
+		ERR_PRINTF2(KMissingParamMsg, &KMinGranInfUidIndex);
+		SetTestStepResult(EFail);
+		}
+
+	if (!GetIntFromConfig(ConfigSection(), KMaxGranInfUidIndex, iMaxInfUidIndexGranularity))
+		{
+		ERR_PRINTF2(KMissingParamMsg, &KMaxGranInfUidIndex);
+		SetTestStepResult(EFail);
+		}
+
+	if (!GetIntFromConfig(ConfigSection(), KMinGranImplUidIndex, iMinIimplUidIndexGranularity))
+		{
+		ERR_PRINTF2(KMissingParamMsg, &KMinGranImplUidIndex);
+		SetTestStepResult(EFail);
+		}
+
+	if (!GetIntFromConfig(ConfigSection(), KMaxGranImplUidIndex, iMaxIimplUidIndexGranularity))
+		{
+		ERR_PRINTF2(KMissingParamMsg, &KMaxGranImplUidIndex);
+		SetTestStepResult(EFail);
+		}
+
+	if (!GetIntFromConfig(ConfigSection(), KGranStep, iGranStep))
+		{
+		ERR_PRINTF2(KMissingParamMsg, &KGranStep);
+		SetTestStepResult(EFail);
+		}
+
+#if defined(__WINS__) || defined(__WINSCW__)
+	// On winscw, each data point in the plot takes 3 to 4 seconds (instead
+	// of 0.3 s).  A table of 12 columns x 20 rows needs 1000 s.
+	// It is not worthwhile to scan the full range because performance results
+	// on winscw is meaningless anyway. Hence adjust the range to reduce the
+	// stress on over night build.
+
+	// reduce number of columns to plot
+	iMinInfUidIndexGranularity += (iGranStep * 3);
+	iMaxInfUidIndexGranularity -= iGranStep;
+
+	iMinIimplUidIndexGranularity += (iGranStep * 4);
+	iMaxIimplUidIndexGranularity -= (iGranStep * 2);
+
+	INFO_PRINTF1(_L("This test takes too long to run on winscw."));
+	INFO_PRINTF5(_L("Range of I/F idx granularities narrowed to %d,%d, Impl. idx granularity narrowed to %d,%d"), iMinInfUidIndexGranularity, iMaxInfUidIndexGranularity, iMinIimplUidIndexGranularity, iMaxIimplUidIndexGranularity);
+#endif
+
+	return TestStepResult();
+	}