dbgsrv/coredumpserver/test/automatictests/tcds_kernel/src/cds/t_coredumpmonitor.cpp
changeset 0 c6b0df440bee
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dbgsrv/coredumpserver/test/automatictests/tcds_kernel/src/cds/t_coredumpmonitor.cpp	Tue Mar 02 10:33:16 2010 +0530
@@ -0,0 +1,488 @@
+// 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 "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
+ @internalTechnology
+*/
+
+#include "t_coredumpmonitor.h"
+
+//Names of functions to be tested - referenced from script file
+_LIT(KUntrustedAccessToSCMConfig, "UntrustedAccessToSCMConfig");
+_LIT(KGatherTraceBuffer, "GatherTraceBuffer");
+_LIT(KTrustedAccessToSCMConfig, "TrustedAccessToSCMConfig");
+_LIT(KReadDefaultConfigValues, "ReadDefaultConfigValues");
+_LIT(KValidateNewestCrash, "ValidateNewestCrash");
+
+/**
+ * Constructor for test wrapper
+ */
+CCoreDumpMonitorWrapper::CCoreDumpMonitorWrapper()
+	{
+	}
+
+/**
+ * Destructor
+ */
+CCoreDumpMonitorWrapper::~CCoreDumpMonitorWrapper()
+	{
+	iCoreDumpSession.Close();
+	iCrashList.ResetAndDestroy();
+	iFsSession.Close();
+	}
+
+/**
+ * Two phase constructor for CCoreDumpMonitorWrapper
+ * @return CCoreDumpMonitorWrapper object
+ * @leave
+ */
+CCoreDumpMonitorWrapper* CCoreDumpMonitorWrapper::NewL()
+	{
+	CCoreDumpMonitorWrapper* ret = new (ELeave) CCoreDumpMonitorWrapper();
+	CleanupStack::PushL(ret);
+	ret->ConstructL();
+	CleanupStack::Pop(ret);
+	return ret;
+	}
+
+/**
+ * Safe construction
+ * @leave
+ */
+void CCoreDumpMonitorWrapper::ConstructL()
+	{
+	
+
+	User::LeaveIfError(iCoreDumpSession.Connect());
+	User::LeaveIfError(iFsSession.Connect());
+	}
+
+/**
+ * Assign the object
+ * @param aObject TAny* to the object to test
+ * @leave
+ */
+void CCoreDumpMonitorWrapper::SetObjectL(TAny* aObject)
+	{}
+
+/**
+ * Runs a test preamble
+ */
+void CCoreDumpMonitorWrapper::PrepareTestL()
+	{
+	SetBlockResult(EPass);
+	INFO_PRINTF1(_L("CCoreDumpMonitorWrapper::Ready to start test"));
+	}
+
+/**
+ * Handle a command invoked from the script
+ * @param aCommand Is the name of the command for a TBuf
+ * @param aSection Is the .ini file section where parameters to the command are located
+ * @param aAsyncErrorIndex Is used by the TEF Block framework to handle asynchronous commands.
+ */
+TBool CCoreDumpMonitorWrapper::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
+	{
+	//__UHEAP_MARK;	
+	PrepareTestL();
+
+	if (KUntrustedAccessToSCMConfig() == aCommand)
+		{
+		TestUntrustedAccessToCDSConfigL();
+		}
+	else if(KGatherTraceBuffer() == aCommand)
+		{
+		TestTraceBufferAccessL();
+		}
+	else if(KTrustedAccessToSCMConfig() ==aCommand)
+		{
+		TestTrustedAccessToCDSConfigL();
+		}
+	else if (KReadDefaultConfigValues() == aCommand)
+		{
+		TestReadDefaultConfigValuesL();
+		}
+else if(KValidateNewestCrash() == aCommand)
+		{
+		TestValidateNewestCrashL();
+		}
+	else
+		{
+		return EFalse;
+		}
+
+	//__UHEAP_MARKEND;
+
+	return ETrue;
+	}
+
+void CCoreDumpMonitorWrapper::TestTrustedAccessToCDSConfigL()
+	{
+	INFO_PRINTF1(_L("TestTrustedAccessToCDSConfigL"));
+	
+	INFO_PRINTF1(_L("Getting the number of config parameters"));
+	
+	TUint numConfigParams = 0;
+	TRAPD(err, numConfigParams = iCoreDumpSession.GetNumberConfigParametersL());
+	if(KErrNone != err)
+		{
+		ERR_PRINTF2(_L("Unable to get the number of config parameters. Returned %d"), err);		
+		SetBlockResult(EFail);
+		return;
+		}
+	
+	INFO_PRINTF2(_L("Found %d params"), numConfigParams);
+	TBool foundScmConfig = EFalse;
+	
+	for (TInt i = 0; i < numConfigParams; i++)
+		{
+		COptionConfig* conf;
+		conf = iCoreDumpSession.GetConfigParameterL(i);
+		
+		if (conf->Source()== COptionConfig::ESCMConfig)
+			{
+			foundScmConfig = ETrue;
+			}
+		
+		delete conf;
+		}
+	
+	if(!foundScmConfig)
+		{
+		ERR_PRINTF1(_L("Not Able to retrieve a config param for the SCM"));		
+		SetBlockResult(EFail);
+		return;
+		}
+	
+	INFO_PRINTF1(_L("Looked at all config parameters and found some SCM params so that is a pass"));
+	}
+
+/**
+ * Tests that that CDS enforces that untrusted users cannot 
+ * access the CDS configuration
+ */
+void CCoreDumpMonitorWrapper::TestUntrustedAccessToCDSConfigL()
+	{
+	INFO_PRINTF1(_L("TestUntrustedAccessToCDSConfigL"));
+	
+	INFO_PRINTF1(_L("Getting the number of config parameters"));
+	
+	TUint numConfigParams = 0;
+	TRAPD(err, numConfigParams = iCoreDumpSession.GetNumberConfigParametersL());
+	if(KErrNone != err)
+		{
+		ERR_PRINTF2(_L("Unable to get the number of config parameters. Returned %d"), err);		
+		SetBlockResult(EFail);
+		return;
+		}
+	
+	INFO_PRINTF2(_L("Found %d params"), numConfigParams);
+	
+	for (TInt i = 0; i < numConfigParams; i++)
+		{
+		COptionConfig* conf;
+		conf = iCoreDumpSession.GetConfigParameterL(i);
+		
+		if (conf->Source()== COptionConfig::ESCMConfig)
+			{
+			ERR_PRINTF1(_L("Able to retrieve a config param for the SCM"));		
+			SetBlockResult(EFail);
+			delete conf;
+			return;
+			}
+		
+		delete conf;
+		}
+	
+	INFO_PRINTF1(_L("Looked at all config parameters and none were SCM params so that is a pass"));
+	}
+
+void CCoreDumpMonitorWrapper::TestTraceBufferAccessL()
+	{
+	//Step 1: Load the UTRACE formatter and file writter
+	INFO_PRINTF1(_L("CCoreDumpMonitorWrapper::TestTraceBufferAccessL loading UTRACE Formatter and File Writer"));
+
+	TPluginRequest loadUtracePlugin;
+	loadUtracePlugin.iPluginType = TPluginRequest::EFormatter;
+	loadUtracePlugin.iLoad = ETrue;
+	loadUtracePlugin.iUid = KUtraceUid;	
+	
+	TPluginRequest loadWriterReq;
+	loadWriterReq.iPluginType = TPluginRequest::EWriter;
+	loadWriterReq.iLoad = ETrue;
+	loadWriterReq.iUid = KUidFileWriter;
+	
+	// loading Symbian ELF formatter
+	TRAPD(err, iCoreDumpSession.PluginRequestL(loadUtracePlugin));
+	if (err != KErrNone)
+		{
+		ERR_PRINTF2(_L("CCoreDumpMonitorWrapper::TestTraceBufferAccessL() Could not load UTRACE plugin!, err:%d\n"), err);
+		SetBlockResult(EFail);
+		User::Leave(err);
+		}	
+	
+	// loading Symbian File writer
+	TRAP(err, iCoreDumpSession.PluginRequestL(loadWriterReq));
+	if (err != KErrNone)
+		{
+		ERR_PRINTF2(_L("CCoreDumpMonitorWrapper::TestTraceBufferAccessL() Could not load writer plugin!, err:%d\n"), err);
+		SetBlockResult(EFail);
+		User::Leave(err);
+		}
+	
+	//Configuring the file writer plugin to have a specified crash file name
+	TRAP(err, DoConfigureL((TInt)(CCrashDataSave::ECoreFilePath),
+			KUidFileWriter.iUid, COptionConfig::EWriterPlugin,
+			COptionConfig::ETFileName, KFilePathPrompt, 1, KNullDesC, 0,
+			KCrashFileName, 0));
+
+	if (err != KErrNone)
+		{
+		ERR_PRINTF2(_L("CCoreDumpMonitorWrapper::TestTraceBufferAccessL()() for File Writer Error %d changing param"),
+				err);
+		SetBlockResult(EFail);
+		User::Leave(err);
+		}	
+	
+	//List crashes in flash
+	iCrashList.Reset();
+	TRAP(err, iCoreDumpSession.ListCrashesInFlashL(iCrashList));
+	if (err != KErrNone)
+		{
+		ERR_PRINTF2(_L("CCoreDumpMonitorWrapper::TestTraceBufferAccessL() Could not read Crashes in the Flash! err:%d\n"), err);
+		SetBlockResult(EFail);
+		User::Leave(err);
+		}	
+	
+	INFO_PRINTF2(_L("Number of crashes present: %d"),	iCrashList.Count());
+	if(iCrashList.Count() == 0)
+		{
+		ERR_PRINTF1(_L("Failed to find any crashes in log for the analysing"));
+		SetBlockResult(EFail);
+		User::Leave(err);
+		}
+	
+	//Step 2: Process the crash
+	for (TInt i = 0; i < iCrashList.Count(); i++)
+		{
+		TRAP(err, iCoreDumpSession.ProcessCrashLogL(iCrashList[i]->iCrashId));
+		if (err != KErrNone)
+			{
+			ERR_PRINTF2(_L("CCoreDumpMonitorWrapper::TestTraceBufferAccessL() Could not process crash! err:%d\n"), err);
+			SetBlockResult(EFail);
+			User::Leave(err);
+			}
+		}
+	
+	INFO_PRINTF1(_L("Crashes Processed, Now looking for file generated"));
+	
+	//Step 3: Check the trace file has been generated
+	//Use wildcard utilities to search for the UTRACE FIle Created
+	TBuf<32> buf;
+	buf = KDir;
+	TUidType uid1;
+	TUidType uid2(uid1.MostDerived());
+
+	CFindFileByType* obj = new(ELeave) CFindFileByType(iFsSession);
+	CleanupStack::PushL(obj);
+
+	err = obj->FindFirst(KCrashWildCard, buf, uid2);
+	if (err != KErrNone)
+		{
+		ERR_PRINTF2(
+				_L("CCoreDumpMonitorWrapper::TestTraceBufferAccessL() Error finding the UTRACE File %d"),
+				err);
+		SetBlockResult(EFail);
+		User::Leave(err);
+		}
+	
+	INFO_PRINTF2(_L("The UTRACE File Found is E:\\:%S "), &(obj->Entry().iName));	
+	
+	CleanupStack::PopAndDestroy(); //CFindFileByType
+	
+	
+	//Future improvements: Check contents of file
+	}
+
+/**
+ * Tests that that after deletion of the entire partition  
+ * SCM config values should correspond to the default build time values
+ */
+void CCoreDumpMonitorWrapper::TestReadDefaultConfigValuesL()
+	{
+	INFO_PRINTF1(_L("CCoreDumpMonitorWrapper::TestReadDefaultConfigValuesL Match with Build time SCM config values"));
+	
+	TInt noConfigParams = 0;
+	TInt scmConfigParams = 0;
+	// this will ultimateley read the config
+    TRAPD(err, noConfigParams = iCoreDumpSession.GetNumberConfigParametersL());
+    if(err != KErrNone)
+        {
+        ERR_PRINTF1(_L("Could not read number of config params"));
+		SetBlockResult(EFail);
+		User::Leave(KErrGeneral);       
+        }
+    else
+    	{	
+    	INFO_PRINTF2(_L("Found %d config params"), noConfigParams);
+    	
+		for (TInt i = 0; i < noConfigParams; i++)
+			{
+			COptionConfig* conf = iCoreDumpSession.GetConfigParameterL(i);
+			CleanupStack::PushL(conf);
+			
+			if (conf->Source()== COptionConfig::ESCMConfig)
+				{
+				//count number of SCM configurations
+				scmConfigParams++;
+				TConfigItem::TSCMDataType dataType = (TConfigItem::TSCMDataType) conf->Instance();
+
+				//Default SCM Configuration for TConfigItem::EThreadsUsrStack has priority = 0
+				if(dataType == TConfigItem::EThreadsUsrStack && conf->Value() != 0)  
+					{
+					ERR_PRINTF3(_L("TConfigItem::EThreadsUsrStack did not match the ZERO Priority for config data type %d with priority %d"), dataType, conf->Value());
+					SetBlockResult(EFail);
+					User::Leave(KErrGeneral);
+					}
+				//Default SCM Configuration for TConfigItem::EThreadsSvrStack has priority = 0
+				else if(dataType == TConfigItem::EThreadsSvrStack && conf->Value() != 0)
+					{
+					ERR_PRINTF3(_L("TConfigItem::EThreadsSvrStack did not match the ZERO Priority for config data type %d with priority %d"), dataType, conf->Value());
+					SetBlockResult(EFail);
+					User::Leave(KErrGeneral);
+					}
+				else if (dataType == TConfigItem::EThreadsSvrStack || dataType == TConfigItem::EThreadsUsrStack)
+						{
+						INFO_PRINTF3(_L("VERIFIED ZERO priority for config data type %d priority %d"), dataType, conf->Value());
+						CleanupStack::PopAndDestroy(conf);
+						continue;
+						}
+ 
+				//Default SCM Configuration for all has a priority value equal to thier postion in the list + 1
+				if(conf->Value() != (dataType + 1) )
+					{
+					ERR_PRINTF3(_L("Did not match the DEFAULT Configurtion for config data type %d with priority %d"), dataType, conf->Value());
+					SetBlockResult(EFail);
+					User::Leave(KErrGeneral);			
+					}
+				
+				//happy to print the value
+				INFO_PRINTF3(_L("VERIFIED config data type %d has priority %d"), dataType, conf->Value());
+					
+				}
+		
+			CleanupStack::PopAndDestroy(conf);//COptionConfig
+			}//for loop for noConfigParams
+		
+		INFO_PRINTF2(_L("Match with DEFAULT config values Successful for %d SCM Configuration Parameters"),scmConfigParams);
+    	}//else for no errors GetNumberConfigParametersL
+	
+	}
+
+/**
+ * @return void
+ * @param aIndex Internal index to the component that owns the object
+ * @param aUID UID of the component that owns the object
+ * @param aSource Type of component that owns the object
+ * @param aType Type of parameter
+ * @param aPrompt Prompt to present to user 
+ * @param aNumOptions Number of options that the parameter can be set to. Only applies if type is ETMultiEntryEnum.
+ * @param aOptions Comma separated list of options. Applies to ETMultiEntryEnum and ETBool
+ * @param aVal Integer value. Applies to ETInt, ETUInt, ETBool
+ * @param aStrValue String value. Applies to ETString, ETFileName, ETMultiEntry, ETBool
+ */
+void CCoreDumpMonitorWrapper::DoConfigureL(const TUint32& aIndex,
+		const TUint32& aUID, const COptionConfig::TParameterSource& aSource,
+		const COptionConfig::TOptionType& aType, const TDesC& aPrompt,
+		const TUint32& aNumOptions, const TDesC& aOptions, const TInt32& aVal,
+		const TDesC& aStrValue, const TUint aInstance)
+	{
+	COptionConfig * config;
+
+	config = COptionConfig::NewL(aIndex, aUID, aSource, aType, aPrompt,
+			aNumOptions, aOptions, aVal, aStrValue);
+
+	CleanupStack::PushL(config);
+
+	config->Instance(aInstance);
+
+	//Configure now...
+	iCoreDumpSession.SetConfigParameterL(*config);
+
+	CleanupStack::PopAndDestroy(config);
+	}
+
+
+void CCoreDumpMonitorWrapper::TestValidateNewestCrashL()
+	{
+	
+	INFO_PRINTF1(_L("TestValidateNewestCrashL called"));
+	
+	//Do list all the Crash Information here
+	TRAPD(err, iCoreDumpSession.ListCrashesInFlashL(iCrashList));
+	if (err != KErrNone)
+		{
+		ERR_PRINTF2(
+				_L("TestValidateNewestCrashL Could not read Crashes in the Flash! err:%d\n"),
+				err);
+		SetBlockResult(EFail);
+		return;
+		//User::Leave(err);
+		}
+
+	INFO_PRINTF2(_L("TestValidateNewestCrashL Number of crash information present: %d"),
+			iCrashList.Count());
+
+	TInt expectedNewestIndex = 0;
+	
+	if( iCrashList.Count() > 0)
+		{
+		// must be entries for test to potentially fail	
+		TInt newestIndex = 0;
+		// start with first entry being newest time
+		TUint64 newestTime = iCrashList[0]->iTime;
+		
+		for (TInt i = 0; i < iCrashList.Count(); i++)
+			{		
+			INFO_PRINTF3(_L("Crash no: %d, CrashId %d"), i, iCrashList[i]->iCrashId);
+			INFO_PRINTF3(_L("Crash no: %d, Type %ld"), i, iCrashList[i]->iType);
+			INFO_PRINTF3(_L("Crash no: %d, Time %ld"), i, iCrashList[i]->iTime);
+			INFO_PRINTF3(_L("Crash no: %d, Thread ID %ld"), i, iCrashList[i]->iTid);
+			
+			// crash time held in the header as TUint64 - highest value should be the newset crash
+			if(iCrashList[i]->iTime > newestTime)
+				{
+				newestIndex = i;
+				newestTime = iCrashList[i]->iTime;
+				}	
+			}
+			
+		INFO_PRINTF2(_L("Newest crash is Crash no: %d"), newestIndex);
+		if(newestIndex != expectedNewestIndex)
+			{
+			ERR_PRINTF3(_L("DoCmdValidateNewestCrashL newest crash was not in expected position expected (%d) actual(%d)")
+					, expectedNewestIndex, newestIndex);
+			SetBlockResult(EFail);
+			//User::Leave(err);
+			}			
+		}
+	
+	INFO_PRINTF1(_L("TestValidateNewestCrashL finished"));
+	
+	}
+
+//eof