diff -r 000000000000 -r c6b0df440bee dbgsrv/coredumpserver/test/automatictests/tcds_app/src/utracestep.cpp --- /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 +#include +#include + +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); + + } +