--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/traceservices/tracefw/integ_test/ost/TEF/te_ostv2integsuite_performance/src/te_perfapicall.cpp Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,346 @@
+// 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:
+// Ost Performance Tests API Test Object
+//
+
+
+
+/**
+ @file te_perfapicall.cpp
+ @internalTechnology
+ @prototype
+*/
+
+
+#include "te_perfapicall.h"
+#include "te_apirunconfig.h"
+#include "te_perftracetester.h"
+#include "te_lightlogger.h"
+#include "te_instrumentationpoints.h" //for TUptTraceCalls::IsKernelTrace
+#include "te_perfstackinfo.h"
+
+
+CApiCallTest::CApiCallTest()
+ {
+ }
+
+CApiCallTest::~CApiCallTest()
+ {
+ }
+
+
+/** This user-side method uses takes the parameters passed by the user to carry out a single API call test run
+@param aApiId is the API call method or API printf method, passed as an enum. (NB: enum is different for user vs kernel printf calls, and for static and nonstatic etc.)
+@param aUptPc is the TBool specifying the Program Counter parameter to pass to the UTrace API
+@param aUptContext is the TBool specifying the Context parameter to pass to the UTrace API
+@param aSizeOfUptData is the size in bytes of the Data field being used in the relevant API calls containing a data field, passed as a TInt
+@param aTestPrimary is the boolean specifying whether to test the Primary filter setting (ETrue does test the primary filter, EFalse doesn't)
+@param aTestSecondary is the boolean specifying whether to test the Secondary filter setting (ETrue does test the secondary filter, EFalse doesn't)
+@param aTestUTraceULoggerMatch is the boolean specifying whether the filter settings in ULogger match the filter parameters assigned to the Trace points (ETrue matches, EFalse doesn't match)
+@param aTestMinimumExecution is the boolean specifying whether to test the minimum execution time for the API call
+ ETrue = minimum execution time, i.e. cached trace
+ EFalse = typical execution time, i.e. uncached trace
+@return ApiTestResult is the API Call test result struct object returned to the calling program, which contains all the test results from the relevent test run
+ */
+TInt CApiCallTest::DoTestL(const TApiRunConfig& /*aApiRunConfig*/, TApiTestResult& /*aApiTestResult*/)
+ {
+ TInt error = KErrNotSupported;
+
+ //create a dummy time variable to be used for the baseline measurement
+ //TUint64 baselinetime = 0;
+
+ //now run tests to fill the results variables
+
+ __TEST_LOG("member functions initialised");
+
+ //Sorry, I cut out all the functionality here and stuck it in the methods below...
+ //I needed to know where the errors came from...
+
+ //err = HeapUsage(iApiTestResult->iApiHeapUsage);
+ __TEST_LOG("all trace ok - stack ERR IS");
+ __TEST_LOGNUM(error);
+
+ //return the results of the API call tests to the calling program
+ return error;
+ }
+
+TInt CApiCallTest::CachedTraceTime(TApiRunConfig& aApiRunConfig, TApiTestResult& aApiTestResult)
+ {
+ TInt error = KErrNotSupported;
+ //create a dummy time variable to be used for the baseline measurement
+ TInt32 baselinetime = 0;
+
+ //carry out the APIcall tests as required by the user
+ __TEST_LOG("about to carry out cache trace");
+ if(aApiRunConfig.iDoMinExecution)
+ {
+ CachedTraceBaselineTime(aApiRunConfig, baselinetime);
+ __TEST_LOG("cache baseline");
+ __TEST_LOGNUM(baselinetime);
+ error = CachedTraceTime(aApiRunConfig, aApiTestResult.iMinimumExecutionTime, baselinetime);
+ __TEST_LOG("cache");
+ __TEST_LOGNUM(aApiTestResult.iMinimumExecutionTime);
+ }
+ return error;
+ }
+
+TInt CApiCallTest::NonCachedTraceTime(TApiRunConfig& aApiRunConfig, TApiTestResult& aApiTestResult)
+ {
+ TInt error = KErrNotSupported;
+ //create a dummy time variable to be used for the baseline measurement
+ TInt32 baselinetime = 0;
+ __TEST_LOG("about to carry out non cache trace");
+ if(aApiRunConfig.iDoTypicalExecution)
+ {
+ NonCachedTraceBaselineTime(aApiRunConfig, baselinetime);
+ __TEST_LOG("noncache baseline");
+ __TEST_LOGNUM(baselinetime);
+ error = NonCachedTraceTime(aApiRunConfig, aApiTestResult.iTypicalExecutionTime, baselinetime);
+ __TEST_LOG("noncache");
+ __TEST_LOGNUM(aApiTestResult.iTypicalExecutionTime);
+ }
+ return error;
+ }
+
+TInt CApiCallTest::StackUsage(TApiRunConfig& aApiRunConfig, TApiTestResult& aApiTestResult)
+ {
+ __TEST_LOG("about to carry out stack usage trace");
+ TInt error = StackUsage(aApiRunConfig, aApiTestResult.iRunResults.iApiStackUsage);
+ if(aApiTestResult.iRunResults.iApiStackUsage == KErrNotSupported && !error)
+ error = KErrNotSupported;
+ return error;
+ }
+
+/** This user-side method is used to ensure that the cache has been flushed for calculating the API typical execution times
+@return KErrNone if command was prepared correctly and a system wide error code otherwise.
+ */
+TInt CApiCallTest::FlushTheCache()
+ {
+ //Put in empty call of certain size to flush the cache
+ TInt err=0;
+ /*
+#ifndef __WINSCW__
+ err=Te_Flush_The_Cache();
+#endif
+*/
+ return err;
+ }
+
+/** This user-side method calculates the minimum execution baseline time taken for a single commented API call.
+@param aMinimumExecutionBaselineTime is the minimum execution baseline time taken for the commented API call, calculated in nanoseconds
+@return KErrNone if command was prepared correctly and a system wide error code otherwise.
+ */
+TInt CApiCallTest::CachedTraceBaselineTime(TApiRunConfig& aApiRunConfig, TInt32& aMinimumExecutionBaselineTime)
+ {
+ //****NB: update this routine to something more maintainable
+ TUptTraceTester timer;
+ TInt error = KErrNone;
+
+ TApiRunResults apiRunResults;
+ TRunConfigurer::Init(apiRunResults);
+ TInt originalApiId = aApiRunConfig.iApiId;
+ if(TUptTraceCalls::IsKernelTrace(originalApiId))
+ aApiRunConfig.iApiId = UPTKernelBaseline;
+ else
+ aApiRunConfig.iApiId = UPTBaseline;
+ aApiRunConfig.iDoTrace=EFalse;
+ aApiRunConfig.iDoStack=EFalse;
+ aApiRunConfig.iDoFlush=EFalse;
+
+ error = timer.TimeTraceL(aApiRunConfig, apiRunResults);
+
+ aApiRunConfig.iApiId = originalApiId;
+ aMinimumExecutionBaselineTime = apiRunResults.iApiTraceTime;
+ return error;
+
+ }
+
+/** This user-side method calculates the minimum execution time taken for a single API call.
+@param aMinimumExecutionTime is the minimum execution time taken for the API call, calculated in nanoseconds
+@param aMinimumExecutionBaselineTime is the minimum execution baseline time taken for commented API call, calculated in nanoseconds
+@return KErrNone if command was prepared correctly and a system wide error code otherwise.
+ */
+TInt CApiCallTest::CachedTraceTime(TApiRunConfig& aApiRunConfig, TInt32& aMinimumExecutionTime, TInt32& aMinimumExecutionBaselineTime)
+ {
+ //NB!!! any changes to this routine and you have to update the baseline calculation as well
+ TUptTraceTester timer;
+
+ TInt err =KErrNone;
+ TApiRunResults apiRunResults;
+ TRunConfigurer::Init(apiRunResults);
+ aApiRunConfig.iDoTrace=ETrue;
+ aApiRunConfig.iDoStack=EFalse;
+ aApiRunConfig.iDoFlush=EFalse;
+
+ err=timer.TimeTraceL(aApiRunConfig, apiRunResults);
+
+ aMinimumExecutionTime = apiRunResults.iApiTraceTime - aMinimumExecutionBaselineTime;
+
+ return err;
+ }
+
+/** This user-side method calculates the typical execution baseline time taken for a single commented API call.
+@param aTypicalExecutionBaselineTime is the typical execution baseline time taken for the API call, calculated in nanoseconds
+@return KErrNone if command was prepared correctly and a system wide error code otherwise.
+ */
+TInt CApiCallTest::NonCachedTraceBaselineTime(TApiRunConfig& aApiRunConfig, TInt32& aTypicalExecutionBaselineTime)
+ {
+ //****NB: update this routine to something more maintainable
+ TUptTraceTester timer;
+
+ TInt error = KErrNone;
+
+ TApiRunResults apiRunResults;
+ TRunConfigurer::Init(apiRunResults);
+ TInt originalApiId = aApiRunConfig.iApiId;
+ if(TUptTraceCalls::IsKernelTrace(originalApiId))
+ aApiRunConfig.iApiId = UPTKernelBaseline;
+ else
+ aApiRunConfig.iApiId = UPTBaseline;
+ aApiRunConfig.iDoTrace = EFalse;
+ aApiRunConfig.iDoStack = EFalse;
+ aApiRunConfig.iDoFlush = ETrue;
+
+ error=timer.TimeTraceL(aApiRunConfig, apiRunResults);
+
+ aApiRunConfig.iApiId = originalApiId;
+ aTypicalExecutionBaselineTime = apiRunResults.iApiTraceTime;
+ return error;
+ }
+
+/** This user-side method calculates the typical execution time taken for a single API call.
+@param aTypicalExecutionTime is the typical execution time taken for the API call, calculated in nanoseconds
+@return KErrNone if command was prepared correctly and a system wide error code otherwise.
+ */
+TInt CApiCallTest::NonCachedTraceTime(TApiRunConfig& aApiRunConfig, TInt32& aTypicalExecutionTime, TInt32& aTypicalExecutionBaselineTime)
+ {
+
+ TUptTraceTester timer;
+
+ TInt err =KErrNone;
+ TApiRunResults apiRunResults;
+ TRunConfigurer::Init(apiRunResults);
+ aApiRunConfig.iDoTrace=ETrue;
+ aApiRunConfig.iDoStack=EFalse;
+ aApiRunConfig.iDoFlush=ETrue;
+
+ err=timer.TimeTraceL(aApiRunConfig, apiRunResults);
+
+ aTypicalExecutionTime = apiRunResults.iApiTraceTime - aTypicalExecutionBaselineTime;
+
+ return err;
+
+ }
+
+/*A test function available for use by TestStackUsage()
+ * */
+void foo()
+ {
+ volatile int gt[100]; //expect 400 bytes stack use - i.e. 100 words of 4bytes each
+ for(int i=0; i<100;++i)
+ gt[i] = i;
+ }
+
+
+/** This calculates the typical stack usage for a single API call.
+ * This is only done on hardware, but this is taken care of in the
+ * actual stack usage methods. For emulator the result will always be 0.
+ *
+ * @return KErrNone if command was prepared correctly and a system wide error code otherwise.
+ */
+TInt CApiCallTest::StackUsage(TApiRunConfig& aApiRunConfig, TInt& aApiStackUsage)
+ {
+ /*
+ PSEUDOCODE
+ 1) initiate a variable forced to the cleanup stack
+ static volatile int foo = 0;
+ 2) initiate a pointer to this variable
+ int* p=&foo;
+ 3) now fill the stack from this point to 0K with e.g. DEADBEEF bitpattern
+ memid=(foo, p, 0xDEADBEEF);
+ 4) (note will wind the pointer on to p = p & 0xFFFC000 (0k)
+ 5) take a copy of this bitmap pattern (memcopy (foo));
+ 6) take pointer back to foo
+ 7) execute UTrace(...)
+ 8) take a copy of the new bitmap patterm (memcopy (foo));
+ 9) compare the bitmap pattern from 5) and 9) to give stack usage
+ 10) verify this result with Lauterbach
+ */
+ TUptTraceTester tracecall;
+
+ TInt err=KErrNone;
+ TApiRunResults apiRunResults;
+ TRunConfigurer::Init(apiRunResults);
+ aApiRunConfig.iDoTrace=ETrue;
+ aApiRunConfig.iDoStack=ETrue;
+ aApiRunConfig.iDoFlush=EFalse; //not really needed but kept for consistency
+
+
+ err = tracecall.SendTraceL(aApiRunConfig, apiRunResults);
+ aApiStackUsage = apiRunResults.iApiStackUsage;
+ return err;
+ }
+
+/** This user-side method calculates the typical heap usage for a single API call. (Expected to be zero, but included for sanity)
+@return KErrNone if command was prepared correctly and a system wide error code otherwise.
+ */
+TInt CApiCallTest::HeapUsage(TInt& aApiHeapUsage)
+ {
+ aApiHeapUsage=-1;
+ return KErrNone;
+ }
+
+/** This sanity test method is executed at the start of the test run to verify that UPT methods in
+this class are stable before any of the performance tests are carried out
+@return KErrNone if command was prepared correctly and system wide error code otherwise.
+ */
+TInt CApiCallTest::Test()
+ {
+ TInt err=TestStackUsage();
+ return err;
+ }
+
+/** This sanity test method is executed in Test() to verify that UPT StackUsage() method in
+this class are stable before any of the stack size performance tests are carried out
+@return KErrNone if command was prepared correctly and system wide error code otherwise.
+ */
+TInt CApiCallTest::TestStackUsage()
+ {
+ TInt err=KErrNone;
+#ifndef __WINSCW__
+ err=KErrGeneral;
+ TInt32 stackBase=0;
+ TInt32 before=0;
+ TInt fooSize=400;
+ TBool doStack=ETrue;
+
+ //TTeUptStackInfo::MarkInitialStack(doStack, stackBase, before);
+ __MARK_INITIAL_STACK(doStack, stackBase, before);
+ foo();
+// TTeUptStackInfo::ReturnStackSize(doStack, stackBase, before, fooSize);
+ __RETURN_STACK_SIZE(doStack, stackBase, before, fooSize);
+
+ if(fooSize==400)
+ err=KErrNone;
+ else
+ err=fooSize;
+#endif
+
+ return err;
+ }
+
+
+
+
+