dbgsrv/coredumpserver/test/automatictests/tcds_app/src/SELFusersidestrace.cpp
changeset 0 c6b0df440bee
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dbgsrv/coredumpserver/test/automatictests/tcds_app/src/SELFusersidestrace.cpp	Tue Mar 02 10:33:16 2010 +0530
@@ -0,0 +1,895 @@
+// Copyright (c) 2005-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:
+// Example CTestStep derived implementation
+//
+
+
+
+/**
+ @file SELFusersidestrace.cpp
+ @internalTechnology
+*/
+#include "SELFusersidetrace.h"
+#include "tcoredumpserverSuiteDefs.h"
+#include "tcoredumpserverSuiteServer.h"
+#include "optionconfig.h"
+#include <coredumpserverapi.h>
+#include <e32property.h>
+#include <crashdatasave.h>
+
+CSELFUserSideTrace::~CSELFUserSideTrace()
+/**
+ * Destructor
+ */
+	{
+	}
+
+CSELFUserSideTrace::CSELFUserSideTrace()
+/**
+ * Constructor
+ */
+	{
+	// **MUST** call SetTestStepName in the constructor as the controlling
+	// framework uses the test step name immediately following construction to set
+	// up the step's unique logging ID.
+	SetTestStepName(KSELFUserSideTrace);
+	}
+
+TVerdict CSELFUserSideTrace::doTestStepPreambleL()
+/**
+ * @return - TVerdict code
+ * Override of base class virtual
+ */
+	{
+	   
+	TInt ret = KErrNone;
+	ret = iCoreDumpSession.Connect(); 
+	if(ret != KErrNone)
+		{
+		SetTestStepResult( EFail );
+		INFO_PRINTF2(_L("Error %d from iCoreDumpSession->Connect()/n"), ret);
+		}	
+	else
+		{
+		SetTestStepResult(EPass);
+		}
+	
+	ret = iFsSession.Connect();
+	if(ret != KErrNone)
+		{
+		SetTestStepResult( EFail );
+		INFO_PRINTF2(_L("Error %d from iFsSession->Connect()/n"), ret);
+		}	
+	else
+		{
+		SetTestStepResult(EPass);
+		}
+
+	return TestStepResult();
+	}
+
+
+TVerdict CSELFUserSideTrace::doTestStepL()
+/**
+ * @return - TVerdict code
+ * Override of base class pure virtual
+ * Our implementation only gets called if the base class doTestStepPreambleL() did
+ * not leave. That being the case, the current test result value will be EPass.
+ */
+	{
+
+	if (TestStepResult()==EPass)
+		{	
+		TInt ret = KErrNone;
+
+		__UHEAP_MARK;		
+		
+		TRAP(ret, ClientAppL());
+		if(KErrNone != ret)
+			{
+			SetTestStepResult(EFail);
+			INFO_PRINTF2(_L("Error %d from CSELFStep->ClientAppL()"), ret);
+			}		
+
+		__UHEAP_MARKEND;
+
+		}
+	return TestStepResult();  
+	}
+
+void CSELFUserSideTrace::ClientAppL()
+/**
+ * @return void
+ * This calls each stage of the test
+ */
+	{
+	INFO_PRINTF1(_L("Starting SELF Test Suite") );
+	HandleCrashL();
+    //CheckParameters();
+	}
+
+void CSELFUserSideTrace::HandleCrashL()
+/**
+ * @return void
+ * Tests handling a crash
+ */
+	{
+	iTraceFlag = EFalse;
+	if(TestStepResult()==EPass)
+		{
+		TPtrC crashAppParam;
+		TInt tracePresent;
+		
+		if(!GetStringFromConfig(ConfigSection(), KTe_CrashAppParam, crashAppParam) ||
+		   !GetIntFromConfig(ConfigSection(), KTrace, tracePresent))
+			{
+			INFO_PRINTF1(_L("Failed to get data from ini file"));
+			SetTestStepResult(EFail);
+			User::Leave(KErrGeneral);
+			}
+		
+		INFO_PRINTF3(_L("The CrashApp Param is %S, Ok so the trace parameter is %d"), &crashAppParam, &tracePresent); // Block end
+				
+		if(tracePresent == 1)
+			iTraceFlag = ETrue; //trace is present
+		else
+			iTraceFlag = EFalse; //trace not present
+			
+		INFO_PRINTF2(_L("iTraceFlag %d"), iTraceFlag);
+		
+		//Start the process that we intend to crash....
+		RProcess crashProcess;
+		CleanupClosePushL(crashProcess);
+		
+		TInt ret = crashProcess.Create( KCrashAppFileName, crashAppParam);
+		if(ret != KErrNone)
+			{
+			INFO_PRINTF2(_L("Error %d from RProcess .Create(z:\\sys\\bin\\crashapp.exe)/n"), ret);
+			SetTestStepResult(EFail);
+			User::Leave(ret);
+			}
+		
+		INFO_PRINTF1(_L("Started userside crash app"));
+		
+		//Load SELF and Writer Formatter 
+		DoCmdLoadPluginsL();
+		
+		//configure the CDS and File Writer
+		DoCmdConfigurePluginsL();
+		
+		//configure the SELF formatter accordingly for trace/no trace
+		ConfigureSELF(iTraceFlag);
+		
+		// Observe the process and wait for a crash
+		TRAP(ret, iCoreDumpSession.ObservationRequestL( KCrashAppFileName, KCrashAppFileName, ETrue) );
+		if(ret != KErrNone)
+			{
+			INFO_PRINTF2(_L("Error %d iCoreDumpSession.ObservationRequestL(z:\\sys\\bin\\crashapp.exe)\n"), ret);
+			SetTestStepResult(EFail);
+			User::Leave( ret );
+			}
+		
+		//start the crash process
+		crashProcess.Resume();
+		CleanupStack::PopAndDestroy(&crashProcess); //this is for crashProcess
+	
+		//Monitor the progress of the crash file being generated...
+		MonitorProgressL();
+        User::After(5000000);
+        
+        iFsSession.SetSessionPath(KDir); //set the default path to e:\\ MMC card
+    	//Use wildcard utilities to search for the SELF FIle Created
+    	TBuf<32> buf;
+    	buf = KDir;
+    	TUidType uid1;
+    	TUidType uid2(uid1.MostDerived());
+    	CFindFileByType* obj = new(ELeave) CFindFileByType(iFsSession);
+    	CleanupStack::PushL(obj);
+
+    	ret = obj->FindFirst(KCrashWildCard, buf, uid2);
+    	if (ret != KErrNone)
+    		{
+    		ERR_PRINTF2(
+    				_L("GenerateElfFileL Error finding the SELF File %d"),
+    				ret);
+    		SetTestStepResult(EFail);
+    		User::Leave(ret);
+    		}
+
+    	iSELFFileName = obj->Entry().iName;
+    	CleanupStack::PopAndDestroy(); //CFindFileByType
+        
+    	INFO_PRINTF2(_L("SELF File found: %S"),&iSELFFileName);
+    	
+    	//test for a valid Trace section
+    	DoTestTraceSectionSELFFileL(iTraceFlag);
+		
+		INFO_PRINTF1(_L("SUCCESS Trace Data Presence/Absence verified!"));
+		}
+	}
+
+/**
+ * Validates the presence of the trace data in the SELF file generated
+ */
+void CSELFUserSideTrace::DoTestTraceSectionSELFFileL(TBool aFlag)
+	{
+	
+	TInt err = iSELFFile.Open(iFsSession, iSELFFileName, EFileStream|EFileRead);
+	if (err != KErrNone)
+		{
+		ERR_PRINTF2(
+				_L("CProcessCrashWrapper::ProcessELFFile Error opening the SELF File %d"),
+				err);
+		SetTestStepResult(EFail);
+		User::Leave(err);
+		}
+	
+	//validate the SELF Header Format	
+	ValidateHeaderELFFileL();
+	
+	//validate the Program Header and store information about the string section Sections
+	ValidateProgramHeaderELFFileL();
+
+	//validate the trace section to be present
+	ValidateTraceSectionELFFileL(aFlag);
+	
+	//do the necessary clean up 
+	CleanupMethod(iSELFFileName);
+		
+	}
+
+/**
+ * Validates the Header Format Elf32_Ehdr for the SELF file 
+ */
+void CSELFUserSideTrace::ValidateHeaderELFFileL()
+	{// Elf32_Ehdr
+	INFO_PRINTF1(_L("CSELFUserSideTrace::ValidateHeaderELFFileL validating Elf32_Ehdr"));
+	
+	TInt sizeofELFHeader = sizeof(Elf32_Ehdr); //size of Elf32_Ehdr structure
+
+	// allocate buffer Elf32_Ehdr
+	TUint8* SELFHeader = new TUint8[sizeofELFHeader];
+	TPtr8 elfHeaderPointer(SELFHeader, sizeofELFHeader, sizeofELFHeader);
+	CleanupStack::PushL(SELFHeader);
+
+	//read the SELF file for Elf32_Ehdr
+	TInt ret = iSELFFile.Read(0, elfHeaderPointer, sizeofELFHeader);
+	if (ret != KErrNone)
+		{
+		ERR_PRINTF2(
+				_L("CSELFUserSideTrace::ValidateHeaderELFFile Error reading the SELF Header Elf32_Ehdr %d"),
+				ret);
+		SetTestStepResult(EFail);
+		User::Leave(ret);
+		}
+	//
+	Elf32_Ehdr* eh=(Elf32_Ehdr *)SELFHeader;
+
+	//VALIDATE THE Elf32_Ehdr
+
+	if (eh->e_ident[EI_MAG0] !=0x7f || eh->e_ident[EI_MAG1] != 0x45
+			|| eh->e_ident[EI_MAG2] !=0x4c || eh->e_ident[EI_MAG3] != 0x46)
+		{
+		// EI_MAG0 to EI_MAG3 - A files' first 4 bytes hold a 'magic number', identifying the file as an ELF object file.
+		ERR_PRINTF1(_L("Error:  is not a valid ELF file"));
+		SetTestStepResult(EFail);
+		User::Leave(KErrGeneral);
+		}
+	if (eh->e_ident[EI_DATA] == 2)
+		{
+		// ELF Header size should be 52 bytes or converted into Big-Endian system 13312
+		if (eh->e_ehsize != 13312)
+			{
+			ERR_PRINTF1(_L("Error:  ELF Header contains invalid file typ"));
+			SetTestStepResult(EFail);
+			User::Leave(KErrGeneral);
+			}
+		// e_ident[EI_DATA] specifies the data encoding of the processor-specific data in the object file.
+		ERR_PRINTF1(_L("Error:  Data encoding ELFDATA2MSB (Big-Endian) not supported"));
+		SetTestStepResult(EFail);
+		User::Leave(KErrGeneral);
+		}
+	if (eh->e_ehsize != 52)
+		{
+		// ELF Header size should be 52 bytes
+		ERR_PRINTF1(_L("Error:  ELF Header contains invalid file type"));
+		SetTestStepResult(EFail);
+		User::Leave(KErrGeneral);
+		}
+
+	//Number of entries in the program header table
+	if ((eh->e_phnum) == 0)
+		{
+		ERR_PRINTF1(_L("Error:  ELF Header contains zero program headers"));
+		SetTestStepResult(EFail);
+		User::Leave(KErrGeneral);
+		}
+	
+	//store number of program header entries
+	iPHEntries = eh->e_phnum;
+	INFO_PRINTF2(_L("Program header entries:%d"), iPHEntries);
+
+	//Offset in bytes from the start of the file to the section header table
+	if ((eh->e_phoff) == 0)
+		{
+		ERR_PRINTF1(_L("Error:  ELF Header contains zero offset to the section header table"));
+		SetTestStepResult(EFail);
+		User::Leave(KErrGeneral);
+		}
+
+	//store program header offset
+	iPHOffset = eh->e_phoff;
+	INFO_PRINTF2(_L("Program header offsett:%d"), iPHOffset);
+
+	CleanupStack::PopAndDestroy(SELFHeader);
+	
+	INFO_PRINTF1(_L("Validation of Elf32_Ehdr successful"));
+	}
+
+/**
+ * Validates the Program Header Entries Elf32_Phdr of the SELF file 
+ */
+void CSELFUserSideTrace::ValidateProgramHeaderELFFileL()
+	{//Elf32_Phdr
+	INFO_PRINTF1(_L("CSELFUserSideTrace::ValidateProgramHeaderELFFileL validating the program header Entries"));
+
+	TInt sizeofELFProgramHeader = sizeof(Elf32_Phdr); //size of Elf32_Phdr
+	TInt totalsizeofELFProgramHeader = iPHEntries * sizeofELFProgramHeader;
+
+	//allocate buffer Elf32_Phdr
+	iSELFPHHeader = new TUint8[totalsizeofELFProgramHeader];
+	TPtr8 elfPHHeaderPointer(iSELFPHHeader, totalsizeofELFProgramHeader,
+			totalsizeofELFProgramHeader);
+
+	//read the SELF for the whole Program Header Table
+	TInt ret = iSELFFile.Read(iPHOffset, elfPHHeaderPointer,
+			totalsizeofELFProgramHeader);
+	if (ret != KErrNone)
+		{
+		ERR_PRINTF2(
+				_L("CSELFUserSideTrace::ValidateProgramHeaderELFFileL Error reading the SELF Header Elf32_Phdr %d"),
+				ret);
+		SetTestStepResult(EFail);
+		User::Leave(ret);
+		}
+
+	Elf32_Phdr* phdr = (Elf32_Phdr*) iSELFPHHeader;//Elf32_Phdr Program Header
+
+	//Prepare for each of the DHDR buffers 
+	TInt sizeofDhdr = sizeof(Sym32_dhdr);
+
+	//loop through the program headers to find out more information on the String section
+	for (TInt i = 0; i < iPHEntries; i++)
+		{
+		//allocate DHDR buffers Sym32_dhdr
+		iDHDRBuffer[i] = new TUint8[sizeofDhdr];
+		TPtr8 dhdrPointer(iDHDRBuffer[i], sizeofDhdr, sizeofDhdr);
+        
+		//read SELF file for the Sym32_dhdr
+		TInt ret = iSELFFile.Read(phdr[i].p_offset, dhdrPointer, sizeofDhdr);
+		if (ret != KErrNone)
+			{
+			ERR_PRINTF2(
+					_L("CSELFUserSideTrace::ValidateHeaderELFFile Error reading the SELF Header Sym32_dhdr %d"),
+					ret);
+			SetTestStepResult(EFail);
+			User::Leave(ret);
+			}
+
+		idhdr[i] = (Sym32_dhdr*) iDHDRBuffer[i];//array of Sym32_dhdr store it
+
+		//find information about the String Info section
+		if (phdr[i].p_type == PT_NOTE)
+			{
+			// Intend to store information about the string section ESYM_NOTE_STR
+			//the srting section is to be accessed for all sectiosn to be parsed
+			if (idhdr[i]->d_type == ESYM_NOTE_STR)
+				{
+				INFO_PRINTF2(_L("ESYM_NOTE_STR Header offset %d"),
+						phdr[i].p_offset);
+				INFO_PRINTF2(
+						_L("ESYM_NOTE_STR Size of single descriptor element %d "),
+						idhdr[i]->d_descrsz);
+
+				iOffsetStringSection = phdr[i].p_offset + sizeof(Sym32_dhdr);
+				iSizeofStringSection = idhdr[i]->d_descrsz;
+
+				}//if ESYM_NOTE_STR		
+			}//if PT_NOTE
+		}//for loop
+
+	}//end of function
+
+/**
+ * Validates the Trace Section Sym32_tracedata of the SELF file 
+ */
+void CSELFUserSideTrace::ValidateTraceSectionELFFileL(TBool aTraceCheck)
+	{
+	
+	INFO_PRINTF1(_L("CSELFUserSideTrace::ValidateTraceSectionELFFileL validating the Trace Section"));
+	
+	Elf32_Phdr* phdr = (Elf32_Phdr*) iSELFPHHeader;//Elf32_Phdr Program Header
+	
+	TBool dataPresent = EFalse;
+	//loop through the program headers to get information about the Symbian Info section
+	for (TInt i = 0; i < iPHEntries; i++)
+		{
+		if (phdr[i].p_type == PT_NOTE)
+			{
+			if (idhdr[i]->d_type == ESYM_NOTE_TRACE) //Trace Info
+				{
+				TInt sizeoftraceinfo = sizeof(Sym32_tracedata);
+				INFO_PRINTF2(_L("ESYM_NOTE_TRACE Size of trace section %d"), sizeoftraceinfo);
+				INFO_PRINTF2(_L("ESYM_NOTE_TRACE Header offset %d"), phdr[i].p_offset);
+				INFO_PRINTF2(_L("ESYM_NOTE_TRACE Size of single descriptor element %d"),
+						idhdr[i]->d_descrsz);
+				INFO_PRINTF2(_L("ESYM_NOTE_TRACE Number of elements %d"), idhdr[i]->d_elemnum); 
+
+				if (sizeof(Sym32_tracedata) != (idhdr[i]->d_descrsz))
+					{
+					ERR_PRINTF1(_L("CSELFUserSideTrace::ValidateTraceSectionELFFileL sizeof(Sym32_tracedata) %d is different from descriptor size") );
+					SetTestStepResult(EFail);
+					User::Leave(KErrGeneral);
+					}
+				
+				TInt offsettotraceinfod = phdr[i].p_offset + sizeof(Sym32_dhdr);
+				//allocate buffer for Sym32_tracedata
+				TUint8* symbianTraceSection = new TUint8[sizeoftraceinfo];
+				CleanupStack::PushL(symbianTraceSection);
+
+				TPtr8 ptrSymbianTraceSection(symbianTraceSection, sizeoftraceinfo,
+						sizeoftraceinfo);
+
+				TInt ret = iSELFFile.Read(offsettotraceinfod, ptrSymbianTraceSection, sizeoftraceinfo);
+				if (ret != KErrNone)
+					{
+					ERR_PRINTF2(
+							_L("CSELFUserSideTrace::ValidateTraceSectionELFFileL Error reading the SELF Header Sym32_thrdinfod %d"), ret);
+					SetTestStepResult(EFail);
+					User::Leave(ret);
+					}
+
+				Sym32_tracedata *traceInfo =
+										(Sym32_tracedata*) symbianTraceSection;
+			
+				INFO_PRINTF2(_L("Size of trace buffer: %d"), traceInfo->tr_size);
+				INFO_PRINTF2(_L("Offset of trace buffer:%d"), traceInfo->tr_data);
+				
+				//checking for the presence of trace data
+				if(traceInfo->tr_size != 0)//trace data present
+					{
+					dataPresent = ETrue;
+					//read the trace buffer
+					//unsigned char* data = ADDR(unsigned char, aElfHdr, aTraceData->tr_data);	
+					
+					RBuf8 tracebufferString;
+					tracebufferString.CleanupClosePushL();
+
+					//create trace buffer of size  traceInfo->tr_size
+					tracebufferString.CreateL(traceInfo->tr_size);
+					
+					TInt ret = iSELFFile.Read(traceInfo->tr_data, tracebufferString, traceInfo->tr_size);
+					if (ret != KErrNone)
+						{
+						ERR_PRINTF2(
+								_L("CSELFUserSideTrace::ValidateTraceSectionELFFileL Error reading the Trace Information  %d"),
+								ret);
+						SetTestStepResult(EFail);
+						User::Leave(ret);
+						}
+					
+					INFO_PRINTF1(_L("Validate the trace buffer now"));
+					ValidateTraceBufferL(tracebufferString);
+					
+					CleanupStack::PopAndDestroy();//tracebufferString
+					CleanupStack::PopAndDestroy();//symbianTraceSection
+					break;
+					}
+				else //expecting trace data to be present otherwise complain
+					{
+					ERR_PRINTF1(
+							_L("CSELFUserSideTrace::ValidateTraceSectionELFFileL Error found trace size to be zero"));
+					SetTestStepResult(EFail);
+					User::Leave(KErrGeneral);
+					
+					}
+				}			
+			}
+			
+		}
+
+	if(!aTraceCheck && dataPresent )
+		{
+		ERR_PRINTF1(
+				_L("CSELFUserSideTrace::ValidateTraceSectionELFFileL Error found trace section when there shouldnt be one"));
+		SetTestStepResult(EFail);
+		User::Leave(KErrGeneral);
+		}
+	if(aTraceCheck  && !dataPresent )
+		{
+		ERR_PRINTF1(
+				_L("CSELFUserSideTrace::ValidateTraceSectionELFFileL Error did not find the trace section"));
+		SetTestStepResult(EFail);
+		User::Leave(KErrGeneral);
+		}
+	
+	
+	}
+
+/**
+ * Utility Function to do trace data verification
+ */
+void CSELFUserSideTrace::ValidateTraceBufferL(const TDesC8& aBuffer)
+{
+	INFO_PRINTF2(_L("CSELFUserSideTrace::ValidateTraceBufferL: size: %d"), aBuffer.Length());
+	
+	const TUint8* tracePtr = aBuffer.Ptr();
+	TInt traceSize = aBuffer.Length();
+	
+/*	TUint8 recSize = 0;
+	TUint8 flags = 0;
+	TUint8 subCategory = 0;*/
+	TUint8 category = 0;
+	TInt cateogryCount = 0;
+	TInt totalCount = 0;
+
+	const TUint8* endPtr = tracePtr+traceSize;
+	while(tracePtr < endPtr)
+	{ 
+		//count of the total number of records
+		totalCount++;
+		category = 0;
+		
+/*		
+ * for keeping a record of other fields in the Trace		
+ 		recSize = flags = subCategory = 0;
+		recSize = tracePtr[BTrace::ESizeIndex];
+		flags = tracePtr[BTrace::EFlagsIndex];
+		subCategory = tracePtr[BTrace::ESubCategoryIndex];*/
+/*		
+ * printing the values
+ *      INFO_PRINTF2(_L("recSize: %d"), recSize);
+		INFO_PRINTF2(_L("flags: %d"), flags);
+		INFO_PRINTF2(_L("subCategory: %d"), subCategory);
+		INFO_PRINTF2(_L("category: %d"), category);*/
+		
+		//read trace header and parse for the Category
+		category = tracePtr[BTrace::ECategoryIndex];
+		
+		//check the parameter Category 
+		if(category == KTraceCategory)
+			{
+			cateogryCount++;//count the number of times the category 200 has appeared
+			}
+								
+		// go to the next trace packet
+		tracePtr = BTrace::NextRecord((TAny*)tracePtr);
+	}
+	
+	if(category == 0)
+		{// no Category KTraceCategory trace found out
+		ERR_PRINTF2(
+			_L("CSELFUserSideTrace::ValidateTraceBufferL Category %d trace data NOT found!"), KTraceCategory);
+		INFO_PRINTF2(_L("Total Number of trace records found: %d"), totalCount);
+		SetTestStepResult(EFail);
+		User::Leave(KErrGeneral);
+		}
+	
+	if(category % KTRACENUMBER != 0)
+		{//checking for KTRACENUMBER number of KTraceCategory 
+		ERR_PRINTF3(	
+			_L("CSELFUserSideTrace::ValidateTraceBufferL %d number of Category type %d trace data NOT found!"), KTRACENUMBER, KTraceCategory);
+		INFO_PRINTF3(_L("Total number of Category type %d trace data found: %d"), KTraceCategory, cateogryCount);
+		INFO_PRINTF2(_L("Total Number of trace records found: %d"), totalCount);
+		SetTestStepResult(EFail);
+		User::Leave(KErrGeneral);	
+		}
+	
+	INFO_PRINTF3(_L("Total number of Category type %d trace data found: %d"), KTraceCategory, cateogryCount);
+	INFO_PRINTF2(_L("Total Number of trace records found: %d"), totalCount);
+	INFO_PRINTF1(_L("Validation of Trace Buffer Successful!!!")); 
+}
+
+/**
+* @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 CSELFUserSideTrace::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...
+	TRAPD(ret, iCoreDumpSession.SetConfigParameterL(*config) );
+	if(ret != KErrNone)
+		{
+		INFO_PRINTF2(_L("Error %d changing param/n"), ret );
+		SetTestStepResult(EFail);
+		User::Leave(ret);
+		}
+
+	CleanupStack::PopAndDestroy(config);
+	}
+
+/**
+ * @return void
+ * This method monitors the RProperty for the crash progress. There are several states of this but we are
+ * only interested in the start and finish of these properties
+ */
+void CSELFUserSideTrace::MonitorProgressL()
+	{
+	RProperty crashProgress;
+	User::LeaveIfError(crashProgress.Attach(KCoreDumpServUid, ECrashProgress));	
+	
+	TBuf<50> crashProg;			
+
+	TRequestStatus status;
+	crashProgress.Subscribe(status);
+	User::WaitForRequest(status);
+	//Subscribe for next one again...
+	crashProgress.Subscribe(status);
+	
+	//First one should be the start string = "-"
+	User::LeaveIfError(crashProgress.Get(crashProg ));		
+	if(crashProg != KStartOfSELFProc)
+		{
+		INFO_PRINTF1(_L("SELF formatter has not started processing the data"));
+		}
+	
+	INFO_PRINTF1(_L("SELF formatters have started processing the data"));
+	INFO_PRINTF1(_L("Waiting to be notified of the timeout of the processing. A timeout here is a fail"));
+	//Now we wait until its finished
+	do
+		{			
+		User::WaitForRequest(status);		
+		crashProgress.Subscribe(status);
+
+		User::LeaveIfError(crashProgress.Get(crashProg ));		
+		}
+	while(crashProg != KEndOfProcessing);
+	
+	INFO_PRINTF1(_L("SELF formatter has finished processing the data"));			
+	
+	}
+
+/**
+ * Loads the SELF Formatter and the File Writer plugin
+ */
+void CSELFUserSideTrace::DoCmdLoadPluginsL()
+	{
+	INFO_PRINTF1(_L("\nCProcessCrashWrapperloading SELF Formatter and File Writer!!!"));
+
+	TPluginRequest loadSELFReq;
+	loadSELFReq.iPluginType = TPluginRequest::EFormatter;
+	loadSELFReq.iLoad = ETrue;
+	loadSELFReq.iUid = KUidSELFFormatterV2;
+
+	TPluginRequest loadWriterReq;
+	loadWriterReq.iPluginType = TPluginRequest::EWriter;
+	loadWriterReq.iLoad = ETrue;
+	loadWriterReq.iUid = WRITER_UID;
+
+	// loading Symbian ELF formatter
+	TRAPD(ret, iCoreDumpSession.PluginRequestL(loadSELFReq));
+	if (ret != KErrNone)
+		{
+		ERR_PRINTF2(
+				_L("CSELFUserSideTrace::DoCmdLoadPluginsL: Could not load SELF plugin!, err:%d\n"),
+				ret);
+		SetTestStepResult(EFail);
+		User::Leave(ret);
+		}
+
+	// loading Symbian File writer
+	TRAP(ret, iCoreDumpSession.PluginRequestL(loadWriterReq));
+	if (ret != KErrNone)
+		{
+		ERR_PRINTF2(
+				_L("CSELFUserSideTrace::DoCmdLoadPluginsL: Could not load writer plugin!, err:%d\n"),
+				ret);
+		SetTestStepResult(EFail);
+		User::Leave(ret);
+		}
+
+	//intend to check for the loaded SELF formatter and File Writer
+	RPluginList pluginLists;
+	CleanupClosePushL(pluginLists);
+
+	TRAP(ret, iCoreDumpSession.GetPluginListL(pluginLists));
+
+	if (ret != KErrNone)
+		{
+		ERR_PRINTF2(
+				_L("CSELFUserSideTrace::DoCmdLoadPluginsL: Could not get plugin list!, err:%d\n"),
+				ret);
+		SetTestStepResult(EFail);
+		User::Leave(ret);
+		}
+
+	//Now we look through the list, until we find our plugin, its a fail
+
+	for (TInt i = 0; i < pluginLists.Count(); i++)
+		{
+		if (pluginLists[i].iUid == KUidSELFFormatterV2 && !(pluginLists[i].iLoaded))
+			{
+			ERR_PRINTF1(
+					_L("SELF Plugin Not loaded !\n"));
+			SetTestStepResult(EFail);
+			User::Leave(KErrNotFound);
+			}
+		}
+
+	for (TInt i = 0; i < pluginLists.Count(); i++)
+		{
+		if (pluginLists[i].iUid == WRITER_UID && !(pluginLists[i].iLoaded))
+			{
+			ERR_PRINTF1(
+								_L("Writer Plugin Not loaded !\n"));
+			SetTestStepResult(EFail);
+			User::Leave(KErrNotFound);
+			}
+		}
+
+	INFO_PRINTF1(_L("SELF Formatter and File Writer loaded successfully"));
+	CleanupStack::PopAndDestroy();//pluginLists	
+	}
+
+/**
+ * Configuring the Core Dump Server and the File Writer
+ */
+void CSELFUserSideTrace::DoCmdConfigurePluginsL()
+	{
+	INFO_PRINTF1(_L("CSELFUserSideTrace DoCmdConfigurePlugins configuring the Core dump server and File Writer plugin"));
+
+	//Configuring the Core Dump Server
+	TRAPD(ret, DoConfigureL(2, CDS_UID.iUid, COptionConfig::ECoreDumpServer,
+			COptionConfig::ETUInt, KPostCrashEventActionPrompt, 1, KNullDesC,
+			4, KNullDesC, 0));
+	if (ret != KErrNone)
+		{
+		ERR_PRINTF2(
+				_L("CSELFUserSideTrace::DoConfigureL for CDS Error %d changing param"),
+				ret);
+		SetTestStepResult(EFail);
+		User::Leave(ret);
+		}
+
+	//Configuring the file writer plugin to have a specified crash file name
+	TRAPD(err, DoConfigureL((TInt)(CCrashDataSave::ECoreFilePath),
+			WRITER_UID.iUid, COptionConfig::EWriterPlugin,
+			COptionConfig::ETFileName, KFilePathPrompt, 1, KNullDesC, 0,
+			KCrashFileName, 0));
+
+	if (err != KErrNone)
+		{
+		ERR_PRINTF2(_L("CSELFUserSideTrace::DoConfigureL for File Writer Error %d changing param"),
+				err);
+		SetTestStepResult(EFail);
+		User::Leave(err);
+		}
+
+	}
+
+/**
+ * Utility Function to do SELF Configurations
+ */
+void CSELFUserSideTrace::ConfigureSELF(TBool aTracePresent)
+	{
+	INFO_PRINTF2(_L("CProcessCrashWrapper::ConfigureSELF confiugring SELF for Trace presence %d"), aTracePresent);
+
+	if(aTracePresent)
+		{//configure to have trace segments upto have 10KB data
+		DoConfigureL(8, KUidSELFFormatterV2.iUid, COptionConfig::EFormatterPlugin,
+				COptionConfig::ETInt,  KCreateTraceData, 
+				1, KNullDesC, 10, KNullDesC, 0);
+		
+		}
+	else
+		{//configure NOT to have trace segments
+		DoConfigureL(8, KUidSELFFormatterV2.iUid, COptionConfig::EFormatterPlugin,
+				COptionConfig::ETInt,  KCreateTraceData, 
+				1, KNullDesC, 0, KNullDesC, 0);
+		}
+	
+	}
+
+/**
+ * Utility Function to do cleanup activities
+ */
+void CSELFUserSideTrace::CleanupMethod(const TDesC& aDes)
+	{
+	RBuf fileDelete;
+	fileDelete.CreateL(aDes);
+	fileDelete.SetMax();
+	fileDelete.CleanupClosePushL();
+	INFO_PRINTF2(_L("Entered deletion routine for file %S"), &fileDelete);
+	
+	//close the file
+	iSELFFile.Close();
+	
+
+	TInt ret = iFsSession.Delete(fileDelete);
+	if (ret != KErrNone)
+		{
+		ERR_PRINTF2(
+				_L("CSELFUserSideTrace::SELF File delete returned error %d"),
+				ret);
+		SetTestStepResult(EFail);
+		User::Leave(ret);
+		}
+
+	CleanupStack::PopAndDestroy();//fileDelete
+	
+
+	//delete the buffers
+	if (iSELFPHHeader)
+		{
+		delete [] iSELFPHHeader;
+		iSELFPHHeader = NULL;
+		}
+
+	for (TInt i = 0; i < iPHEntries; i++)
+		{
+		delete [] iDHDRBuffer[i];
+		}	 
+
+	
+	INFO_PRINTF1(_L("Cleanup Done"));
+	}
+
+/**
+ * @return - TVerdict code
+ * Override of base class virtual
+ */
+TVerdict CSELFUserSideTrace::doTestStepPostambleL()
+	{
+	iCoreDumpSession.Disconnect();
+	User::After(7000000); //ensure we give enough time for session to close
+	iFsSession.Close();
+	return EPass;	
+	}
+
+
+
+