diff -r a151135b0cf9 -r aa2539c91954 debugsrv/runmodedebug/rmdebug_test/rm_debug/multi_target_tests/t_multi_target.cpp --- a/debugsrv/runmodedebug/rmdebug_test/rm_debug/multi_target_tests/t_multi_target.cpp Wed Sep 29 17:45:35 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,405 +0,0 @@ -// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "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: -// Test the ability of the debug system to handle events from several debug targets -// -// - -#include -#include - -#include -#include - -#include "t_multi_target.h" -#include "t_target_launcher.h" -#include "t_rmdebug_app.h" - -#ifdef KERNEL_OOM_TESTING - #ifdef USER_OOM_TESTING - #error "Cannot define both KERNEL_OOM_TESTING and USER_OOM_TESTING" - #endif -#endif - - -using namespace Debug; - -const TVersion securityServerVersion(0,1,1); - -const TVersion testVersion(2,1,0); - -#ifdef NO_DEBUGTOKEN -LOCAL_D RTest test(_L("T_RMDEBUG_MULTI_TARGET")); -#endif - -#ifdef SOMECAPS_DEBUGTOKEN -LOCAL_D RTest test(_L("T_RMDEBUG_MULTI_TARGET_OEM")); -#endif - -#ifdef FEWCAPS_DEBUGTOKEN -LOCAL_D RTest test(_L("T_RMDEBUG_MULTI_TARGET_OEM2")); -#endif - - - -CMultiTargetAgent* CMultiTargetAgent::NewL() -// -// CMultiTargetAgent::NewL -// - { - CMultiTargetAgent* self = new(ELeave) CMultiTargetAgent(); - - self->ConstructL(); - - return self; - } - - -CMultiTargetAgent::~CMultiTargetAgent() -// -// CMultiTargetAgent destructor -// - { - RDebug::Printf("~CMultiTargetAgent\n"); - iServSession.Close(); - } - - -CMultiTargetAgent::CMultiTargetAgent() : - iEventPtr( (TUint8*)&iEventInfo, sizeof(TEventInfo) ) - { - } - - -void CMultiTargetAgent::ConstructL() -// -// CMultiTargetAgent::ConstructL -// - { - } - -/** - * Helper code for the stepping tests. Returns the number of nanokernel ticks in one second. - * - * @return Number of nanokernel ticks. 0 if unsuccesful. - */ -TInt CMultiTargetAgent::HelpTicksPerSecond(void) - { - TInt nanokernel_tick_period; - HAL::Get(HAL::ENanoTickPeriod, nanokernel_tick_period); - - ASSERT(nanokernel_tick_period != 0); - - static const TInt KOneMillion = 1000000; - - return KOneMillion/nanokernel_tick_period; - } - -void CMultiTargetAgent::ClientAppL() -// -// Performs each test in turn -// - { - test.Start(_L("ClientAppL")); - TInt err = iServSession.Connect(securityServerVersion); - if (err != KErrNone) - { - User::Panic(_L("Can't open server session"), err); - } - SetupDebugServerL(); - LaunchTargetsInOrderL(); - RDebug::Printf( "returning from CMultiTargetAgent::ClientAppL" ); - test.End(); - } - -/** - Launch a process - - @param aProcess The RProcess object to use to create the process - @param aExeName File name of the executable to create the process from - @param aCommandLine The command line to pass to the new process - @return KErrNone on success, or one of the other system wide error codes - */ -TInt CMultiTargetAgent::LaunchProcess(RProcess& aProcess, TDesC & aExeName, TDesC & aCommandLine ) - { - TInt err = aProcess.Create( aExeName, aCommandLine ); - if(err != KErrNone) - { - RDebug::Printf( "aProcess.Create ret %d", err); - return err; - } - - TRequestStatus status = KRequestPending; - aProcess.Rendezvous(status); - if(KRequestPending != status.Int()) - { - // startup failed so kill the process - aProcess.Kill(KErrNone); - return status.Int(); - } - else - { - // start up succeeded so resume the process - aProcess.Resume(); - // Give the process a chance to run - User::After( 500000 ); - return KErrNone; - } - } - -void CMultiTargetAgent::SetupDebugServerL() - { - RDebug::Printf( "CMultiTargetAgent::SetupDebugServerL" ); - test.Next(_L("SetupDebugServerL\n")); - iTargets.ReserveL( KNumApps ); - - RBuf targetName; - CleanupClosePushL( targetName ); - - for( TInt numApps = 0; numApps < KNumApps; numApps++ ) - { - iTargets.AppendL( targetName ); - RDebug::Printf( "Attach to DSS for app %d ", numApps ); - - iTargets[numApps].CreateL( KTargetExe().Length() + 2 ); - iTargets[numApps].Format( KTargetExe(), numApps+1 ); - - TInt ret = iServSession.AttachExecutable( iTargets[numApps], EFalse ); - test( ret == KErrNone ); - - RDebug::Printf( ">SetEventAction app %d, EEventsStartThread EActionSuspend", numApps ); - ret = iServSession.SetEventAction( iTargets[numApps], EEventsStartThread, EActionSuspend ); - test( ret == KErrNone ); - - RDebug::Printf( ">SetEventAction app %d, EEventsAddProcess EActionContinue", numApps ); - ret = iServSession.SetEventAction( iTargets[numApps], EEventsAddProcess, EActionContinue ); - test( ret == KErrNone ); - - RDebug::Printf( ">SetEventAction app %d, EEventsRemoveProcess EActionContinue", numApps ); - ret = iServSession.SetEventAction( iTargets[numApps], EEventsRemoveProcess, EActionContinue ); - test( ret == KErrNone ); - } - - CleanupStack::PopAndDestroy( &targetName ); // targetName - - } - - - -TInt CMultiTargetAgent::LaunchTargetsInOrderL() - { - RDebug::Printf( "CMultiTargetAgent::LaunchTargetsInOrderL" ); - - RBuf launcher; - CleanupClosePushL( launcher ); - launcher.CreateL( KLauncherExe() ); - - RBuf launcherOptions; - CleanupClosePushL( launcherOptions ); - launcherOptions.CreateL( KTargetOptions().Length() + 2 ); - launcherOptions.Format( KTargetOptions(), (TUint)ENormalExit ); - - RDebug::Printf( ">LaunchProcess()" ); - RProcess launcherProc; - CleanupClosePushL( launcherProc ); - - TInt ret = LaunchProcess( launcherProc, launcher, launcherOptions ); - RDebug::Printf( " Find Launch Semaphote.Next ret=%d, %lS", ret, &semaphoreResult ); - test( ret == KErrNone ); - - ret = launchSemaphore.OpenGlobal( semaphoreResult ); - RDebug::Printf( "> OpenGlobal semaphore ret=%d", ret ); - test( ret == KErrNone ); - - TBool thisLaunchCompleted; - - test.Next(_L("LaunchTargetsInOrderL\n")); - for( TInt numLaunches = KNumLaunches; numLaunches > 0; numLaunches-- ) - { - for( TInt numApps = KNumApps; numApps > 0; numApps-- ) - { - thisLaunchCompleted = EFalse; - // This will trigger the launcher app to launch the next target - RDebug::Printf( " >Semaphore.Signal app=%d, launch=%d", numApps, numLaunches); - launchSemaphore.Signal(); - - RBuf8 tgt8Name; - CleanupClosePushL( tgt8Name ); - - RBuf tgtCollapseName; - CleanupClosePushL( tgtCollapseName ); - - tgtCollapseName.CreateL( iTargets[numApps-1] ); - tgt8Name.CreateL( tgtCollapseName.Collapse() ); - - - while( ! thisLaunchCompleted ) - { - RDebug::Printf( ">GetEvent app %d for %S", numApps, &tgt8Name ); - iServSession.GetEvent( iTargets[numApps-1], iStatus, iEventPtr ); - - // Wait for the target to get started. - RDebug::Printf( " >Wait for event from target app=%d, launch=%d\n", numApps, numLaunches); - User::WaitForRequest( iStatus ); - RDebug::Printf( " Got iEventType =%d, app=%d", iEventInfo.iEventType, numApps ); - switch( iEventInfo.iEventType ) - { - case EEventsAddProcess: - { - RDebug::Printf( "Got EEventsAddProcess" ); - TPtrC8 exeNamePtr8( iEventInfo.iAddProcessInfo.iFileName, iEventInfo.iAddProcessInfo.iFileNameLength ); - - RBuf8 exeName8; - CleanupClosePushL( exeName8 ); - exeName8.CreateL( exeNamePtr8 ); - RDebug::Printf( " from event: exeName8=%S", &exeName8 ); - CleanupStack::PopAndDestroy( &exeName8 ); - - RBuf8 compareName8; - CleanupClosePushL( compareName8 ); - compareName8.CreateL( KTargetExeName().Length() + 10 ); - compareName8.Format( KTargetExeName(), numApps ); - RDebug::Printf( " comparing to: compareName8=%S", &compareName8 ); - - test( compareName8.CompareC( exeNamePtr8 ) == 0 ); - CleanupStack::PopAndDestroy( &compareName8 ); - - RDebug::Printf( "Testing if event process id is valid" ); - test( iEventInfo.iProcessIdValid ); - RDebug::Printf( "Got iEventInfo.iProcessId=%d", I64LOW( iEventInfo.iProcessId ) ); - - RProcess targetProc; - ret = targetProc.Open( TProcessId( iEventInfo.iProcessId ) ); - RDebug::Printf( "RProcess open ret=%d",ret ); - targetProc.Close(); - test( ret == KErrNone ); - - break; - }//EEventsAddProcess - - case EEventsStartThread: - { - RDebug::Printf( "Got EEventsStartThread" ); - - TPtrC8 exeNamePtr8( iEventInfo.iStartThreadInfo.iFileName, iEventInfo.iStartThreadInfo.iFileNameLength ); - RBuf8 exe8Name; - CleanupClosePushL( exe8Name ); - exe8Name.CreateL( exeNamePtr8 ); - RDebug::Printf( " from event: exeName8=%S", &exe8Name ); - CleanupStack::PopAndDestroy( &exe8Name ); - - test( tgt8Name.CompareC( exeNamePtr8 ) == 0 ); - - RDebug::Printf( "Testing if event process id is valid" ); - test( iEventInfo.iProcessIdValid ); - RDebug::Printf( "Got iEventInfo.iProcessId=%d", I64LOW( iEventInfo.iProcessId ) ); - - RDebug::Printf( "Testing if event thread id is valid" ); - test( iEventInfo.iThreadIdValid ); - RDebug::Printf( "Got iEventInfo.iThreadId=%d", I64LOW( iEventInfo.iThreadId ) ); - - RThread targetThread; - CleanupClosePushL( targetThread ); - - ret = targetThread.Open( TThreadId( iEventInfo.iThreadId ) ); - RDebug::Printf( "RThread open ret=%d", ret ); - test( ret == KErrNone ); - - test( iEventInfo.iThreadId == targetThread.Id() ); - - RDebug::Printf( "Resuming thread for app=%d, id=%d", numApps, I64LOW( targetThread.Id() )); - ret = iServSession.ResumeThread( iEventInfo.iThreadId ); - CleanupStack::PopAndDestroy( &targetThread ); - - test( ret == KErrNone ); - - ret = iServSession.ResumeThread( iEventInfo.iThreadId ); - break; - }//case EEventsStartThread - - case ( EEventsRemoveProcess ): - { - RDebug::Printf( "*** Got EEventsRemoveProcess. app%d has exited. Moving on to next app", numApps ); - thisLaunchCompleted = ETrue; - break; - } - - default : - RDebug::Printf( "Got unknown event" ); - test( EFalse ); - break; - } - }//while - - CleanupStack::PopAndDestroy( &tgtCollapseName ); // tgtCollapseName - CleanupStack::PopAndDestroy( &tgt8Name ); // tgt8Name - } - } - - launchSemaphore.Signal(); - - CleanupStack::PopAndDestroy( &launchSemaphore ); // launchSemaphore - - for( TInt i = iTargets.Count()-1; i>=0; i-- ) - { - RDebug::Printf( "Closing target %d", i ); - iTargets[ i ].Close(); - } - - iTargets.Close(); - - return KErrNone; - } - - -GLDEF_C TInt E32Main() - { - TInt ret = KErrNone; - - - CTrapCleanup* trap = CTrapCleanup::New(); - if (!trap) - return KErrNoMemory; - test.Title(); - - CMultiTargetAgent *runModeAgent = CMultiTargetAgent::NewL(); - if (runModeAgent != NULL) - { - __UHEAP_MARK; - TRAP(ret,runModeAgent->ClientAppL()); - __UHEAP_MARKEND; - - RDebug::Printf( "ClientAppL returned %d", ret ); - delete runModeAgent; - } - - delete trap; - return ret; - }