dbgsrv/coredumpserver/test/automatictests/tcds_app/src/utracestep.cpp
changeset 0 c6b0df440bee
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dbgsrv/coredumpserver/test/automatictests/tcds_app/src/utracestep.cpp	Tue Mar 02 10:33:16 2010 +0530
@@ -0,0 +1,357 @@
+// 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 SELFStep.cpp
+ @internalTechnology
+*/
+#include "utracestep.h"
+#include "tcoredumpserversuitedefs.h"
+#include "tcoredumpserverSuiteServer.h"
+#include <crashdatasave.h>
+#include <s32file.h>
+#include <e32property.h>
+
+CUTraceStep::~CUTraceStep()
+/**
+ * Destructor
+ */
+	{
+	}
+
+CUTraceStep::CUTraceStep()
+/**
+ * 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 (KUTraceUserSide);
+	}
+
+TVerdict CUTraceStep::doTestStepPreambleL()
+/**
+ * @return - TVerdict code
+ * Override of base class virtual
+ */
+	{
+	TInt ret = KErrNone;
+	ret = iSess.Connect ();
+	if ( ret != KErrNone)
+		{
+		SetTestStepResult ( EFail);
+		INFO_PRINTF2 (_L ("Error %d from iSess->Connect()/n"), ret);
+		}
+	else
+		{
+		SetTestStepResult (EPass);
+		}
+
+	ret = iFs.Connect ();
+	if ( ret != KErrNone)
+		{
+		SetTestStepResult ( EFail);
+		INFO_PRINTF2 (_L ("Error %d from iFs->Connect()/n"), ret);
+		}
+	else
+		{
+		SetTestStepResult (EPass);
+		}
+
+	return TestStepResult ();
+	}
+
+void CUTraceStep::ClientAppL()
+/**
+ * @return void
+ * This calls each stage of the test
+ */
+	{
+	INFO_PRINTF1 (_L ("Starting UTrace User Side Test Suite"));
+	TestTraceDataL ();
+
+	}
+
+void CUTraceStep::TestTraceDataL()
+	{
+	_LIT (KCrashFileName, "c:\\trace");
+	HandleCrashL (KCrashFileName);
+	}
+
+void CUTraceStep::HandleCrashL(const TDesC& aFileName)
+/**
+ * @return void
+ * Tests handling a crash
+ */
+	{
+
+	if ( TestStepResult ()==EPass)
+		{
+		_LIT (KCrashAppParam, "-d1 -t");
+
+		INFO_PRINTF3 (_L ("The CrashApp Param is %S, The Filename is is %S"),
+				&KCrashAppParam, &aFileName);
+
+		//Start the process that we intend to crash....
+		RProcess crashProcess;
+		CleanupClosePushL (crashProcess);
+
+		TInt ret = crashProcess.Create ( KCrashAppFileName, KCrashAppParam);
+		if ( ret != KErrNone)
+			{
+			INFO_PRINTF2 (
+					_L ("Error %d from RProcess.Create(z:\\sys\\bin\\crashapp.exe)/n"),
+					ret);
+			SetTestStepResult (EFail);
+			User::Leave (ret);
+			}
+
+		LoadUTraceFormatterL ();
+		LoadFileWriterL ();
+
+		//configure cds and writer
+		_LIT ( KFilePathPrompt, "not_important");
+
+		INFO_PRINTF1 (_L ("Configuring CDS"));
+		DoConfigureL (2, CDS_UID.iUid, COptionConfig::ECoreDumpServer,
+				COptionConfig::ETUInt, KPostCrashEventActionPrompt, 1,
+				KNullDesC, 4, KNullDesC, 0);
+
+		INFO_PRINTF1 (_L ("Configuring File Writer"));
+		DoConfigureL ((TInt)(CCrashDataSave::ECoreFilePath), WRITER_UID.iUid,
+				COptionConfig::EWriterPlugin, COptionConfig::ETFileName,
+				KFilePathPrompt, 1, KNullDesC, 0, aFileName, 0);
+
+		// Observe the process and wait for a crash
+		INFO_PRINTF1 (_L ("Observing bad boy crash app"));
+		TRAP (ret, iSess.ObservationRequestL ( KCrashAppFileName,
+				KCrashAppFileName, ETrue));
+		if ( ret != KErrNone)
+			{
+			INFO_PRINTF2 (
+					_L ("Error %d iSess.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);
+
+		//Check dump has been generated...and valid
+		CDir *fileList = NULL;
+		TFindFile fileFinder(iFs);
+		TRAP (ret, fileList = CTe_coredumpserverSuite::DoesFileExistL (
+				aFileName, fileFinder));
+
+		if ( (ret != KErrNone) || (fileList == NULL))
+			{
+			INFO_PRINTF2 (_L ("Expected crash file was not generated:  %d"),
+					ret);
+			SetTestStepResult (EFail);
+			User::Leave ( ret);
+			}
+
+		CleanupStack::PushL (fileList);
+		for (TInt i = 0; i < fileList->Count (); i++)
+			{
+			TParse fullName;
+			fullName.Set ((*fileList)[i].iName, &fileFinder.File(), NULL);
+			VerifyTraceDataL (fullName.FullName ());
+			INFO_PRINTF2 (_L ("Deleting %S"), &fullName.FullName ());
+			User::LeaveIfError (iFs.Delete (fullName.FullName ()));
+			}
+		CleanupStack::PopAndDestroy (fileList);
+
+		INFO_PRINTF1 (_L ("Expected trace crash file was generated and parsed successfully"));
+
+		}
+
+	}
+
+void CUTraceStep::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 != KStartOfUTraceProc)
+		{
+		INFO_PRINTF1 (_L ("UTRACE formatter has not started processing the data"));
+		}
+
+	INFO_PRINTF1 (_L ("UTRACE formatter has 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 ("UTRACE formatter has finished processing the data"));
+	}
+
+void CUTraceStep::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)
+/**
+ * @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
+ */
+	{
+	COptionConfig * config;
+
+	config = COptionConfig::NewL ( aIndex, aUID, aSource, aType, aPrompt,
+			aNumOptions, aOptions, aVal, aStrValue);
+
+	CleanupStack::PushL (config);
+
+	config->Instance (aInstance);
+
+	//Configure now...
+	TRAPD (ret, iSess.SetConfigParameterL (*config));
+	if ( ret != KErrNone)
+		{
+		INFO_PRINTF2 (_L ("Error %d changing param/n"), ret);
+		SetTestStepResult (EFail);
+		User::Leave (ret);
+		}
+
+	CleanupStack::PopAndDestroy (config);
+	}
+
+void CUTraceStep::LoadUTraceFormatterL()
+/**
+ * @return void
+ * Utility function to load the UTRACE formatter
+ */
+	{
+
+	INFO_PRINTF1 (_L ("Attempting to load UTRACE Plugin"));
+
+	TPluginRequest req;
+	req.iPluginType = TPluginRequest::EFormatter;
+	req.iLoad = ETrue;
+	req.iUid = UTRACE_UID;
+
+	// Should be allowed to load utrace formatter
+	TRAPD (ret, iSess.PluginRequestL ( req));
+	if ( ret != KErrNone)
+		{
+		ERR_PRINTF2 (_L ("Failed to load writer plugin, error = %d"), ret);
+		SetTestStepResult (EFail);
+		User::Leave (ret);
+		}
+
+	}
+
+void CUTraceStep::LoadFileWriterL()
+	{
+	TPluginRequest req;
+	TUid writerUid = WRITER_UID;
+	req.iUid = writerUid;
+	req.iPluginType = TPluginRequest::EWriter;
+	req.iLoad = ETrue;
+
+	TRAPD (ret, iSess.PluginRequestL ( req));
+	if ( ret != KErrNone)
+		{
+		ERR_PRINTF2 (_L ("Failed to load writer plugin, error = %d"), ret);
+		SetTestStepResult (EFail);
+		User::Leave (ret);
+		}
+
+	}
+
+TVerdict CUTraceStep::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 CTestFormatterUserSideStep->ClientAppL()"),
+					ret);
+			}
+
+		__UHEAP_MARKEND;
+
+		}
+	return TestStepResult ();
+	}
+
+TVerdict CUTraceStep::doTestStepPostambleL()
+/**
+ * @return - TVerdict code
+ * Override of base class virtual
+ */
+	{
+	iSess.Disconnect ();
+	User::After (10000000); //ensure we give enough time for session to close
+	iFs.Close ();
+	return EPass;
+	}
+
+void CUTraceStep::VerifyTraceDataL(const TDesC& aFullFilename)
+	{
+	INFO_PRINTF2 (_L ("VerifyTraceDataL (Not Implemented) The Filename is is %S"),
+			 &aFullFilename);
+
+	}
+