debugsrv/runmodedebug/tsrc/rm_debug/performance_test/t_rmdebug_performance_test.cpp
author hgs
Fri, 08 Oct 2010 14:56:39 +0300
changeset 56 aa2539c91954
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56
hgs
parents:
diff changeset
     1
// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     2
// All rights reserved.
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     7
//
hgs
parents:
diff changeset
     8
// Initial Contributors:
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    10
//
hgs
parents:
diff changeset
    11
// Contributors:
hgs
parents:
diff changeset
    12
//
hgs
parents:
diff changeset
    13
// Description:
hgs
parents:
diff changeset
    14
// Tests performance of run mode debug device component   
hgs
parents:
diff changeset
    15
//
hgs
parents:
diff changeset
    16
hgs
parents:
diff changeset
    17
#include <e32base.h>
hgs
parents:
diff changeset
    18
#include <e32property.h>
hgs
parents:
diff changeset
    19
#include <e32test.h>
hgs
parents:
diff changeset
    20
#include <e32def.h>
hgs
parents:
diff changeset
    21
#include <e32const.h>
hgs
parents:
diff changeset
    22
#include <hal.h>
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
#include "t_rmdebug_performance_test.h"
hgs
parents:
diff changeset
    25
#include "t_debug_logging.h"
hgs
parents:
diff changeset
    26
#include "t_rmdebug_app.h"
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
const TVersion securityServerVersion(0,1,1);
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
_LIT(KTestName, "T_RMDEBUG_PERFORMANCE_TEST");
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
LOCAL_D RTest test(KTestName);
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
using namespace Debug;
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
CRunModeAgent* CRunModeAgent::NewL()
hgs
parents:
diff changeset
    37
    {
hgs
parents:
diff changeset
    38
    LOG_ENTRY();
hgs
parents:
diff changeset
    39
    CRunModeAgent* self = new(ELeave) CRunModeAgent();
hgs
parents:
diff changeset
    40
    self->ConstructL();
hgs
parents:
diff changeset
    41
    LOG_EXIT();
hgs
parents:
diff changeset
    42
    return self;
hgs
parents:
diff changeset
    43
    }
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
void CRunModeAgent::ConstructL()
hgs
parents:
diff changeset
    46
    {
hgs
parents:
diff changeset
    47
    // ConstructL list does not match destruction list as R-Class member variables are implicitly open.
hgs
parents:
diff changeset
    48
    // DebugDriver().Connect() is conditionally set depending on the test case hence not part of this function.
hgs
parents:
diff changeset
    49
    LOG_ENTRY();
hgs
parents:
diff changeset
    50
    User::LeaveIfError(iIntegerProperty.Attach(RProcess().SecureId(), EPropertyTimeOfCrash, EOwnerThread));
hgs
parents:
diff changeset
    51
    LOG_EXIT(); 
hgs
parents:
diff changeset
    52
    }
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
CRunModeAgent::~CRunModeAgent()
hgs
parents:
diff changeset
    55
    {
hgs
parents:
diff changeset
    56
    LOG_ENTRY();   
hgs
parents:
diff changeset
    57
    DebugDriver().Close();
hgs
parents:
diff changeset
    58
    iTimeDifs.Close();
hgs
parents:
diff changeset
    59
    iIntegerProperty.Close();
hgs
parents:
diff changeset
    60
    RProperty::Delete(EPropertyTimeOfCrash);
hgs
parents:
diff changeset
    61
    LOG_EXIT(); 
hgs
parents:
diff changeset
    62
    }
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
void CRunModeAgent::ClientAppL()
hgs
parents:
diff changeset
    66
    {
hgs
parents:
diff changeset
    67
    LOG_ENTRY();   
hgs
parents:
diff changeset
    68
   
hgs
parents:
diff changeset
    69
    if ( ParseCommandLine() == EDisplayHelp )
hgs
parents:
diff changeset
    70
        {
hgs
parents:
diff changeset
    71
        DisplayUsage();
hgs
parents:
diff changeset
    72
        }
hgs
parents:
diff changeset
    73
    else
hgs
parents:
diff changeset
    74
        {
hgs
parents:
diff changeset
    75
        static _LIT_SECURITY_POLICY_PASS(KAllowAllPolicy);
hgs
parents:
diff changeset
    76
        RProperty::Define(RProcess().SecureId(), EPropertyTimeOfCrash, RProperty::EInt, KAllowAllPolicy, KAllowAllPolicy);        
hgs
parents:
diff changeset
    77
        StartTest();
hgs
parents:
diff changeset
    78
        }
hgs
parents:
diff changeset
    79
        
hgs
parents:
diff changeset
    80
    LOG_EXIT(); 
hgs
parents:
diff changeset
    81
    }
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
TInt CRunModeAgent::GetTimeInMs()
hgs
parents:
diff changeset
    84
{
hgs
parents:
diff changeset
    85
    return User::NTickCount() * iTickPeriodMs;
hgs
parents:
diff changeset
    86
}
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
void CRunModeAgent::GetStartTime()
hgs
parents:
diff changeset
    89
    {    
hgs
parents:
diff changeset
    90
    LOG_ENTRY();
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
    test ( KErrNone == iIntegerProperty.Get(iParams.iCountStart) );    
hgs
parents:
diff changeset
    93
    LOG_MSG2("iParams.iCountStart %d", iParams.iCountStart);
hgs
parents:
diff changeset
    94
    
hgs
parents:
diff changeset
    95
    LOG_EXIT();
hgs
parents:
diff changeset
    96
    }
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
void CRunModeAgent::GetNanoTickPeriod()
hgs
parents:
diff changeset
    99
    {
hgs
parents:
diff changeset
   100
    LOG_ENTRY();
hgs
parents:
diff changeset
   101
    
hgs
parents:
diff changeset
   102
    TInt period = 0;
hgs
parents:
diff changeset
   103
    User::LeaveIfError(HAL::Get(HALData::ENanoTickPeriod, period));
hgs
parents:
diff changeset
   104
    iTickPeriodMs = period / 1000;
hgs
parents:
diff changeset
   105
    LOG_MSG("iTickPeriodMs = %d\n", iTickPeriodMs);
hgs
parents:
diff changeset
   106
    
hgs
parents:
diff changeset
   107
    LOG_EXIT();
hgs
parents:
diff changeset
   108
    }
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
void CRunModeAgent::StartTest()
hgs
parents:
diff changeset
   111
    {
hgs
parents:
diff changeset
   112
    LOG_ENTRY();
hgs
parents:
diff changeset
   113
    
hgs
parents:
diff changeset
   114
    GetNanoTickPeriod();
hgs
parents:
diff changeset
   115
    
hgs
parents:
diff changeset
   116
    if (iParams.iTestType == PerformanceTestParams::EBenchMarkTest)
hgs
parents:
diff changeset
   117
        {
hgs
parents:
diff changeset
   118
        RunBenchMarkTest();
hgs
parents:
diff changeset
   119
        }
hgs
parents:
diff changeset
   120
    else 
hgs
parents:
diff changeset
   121
        {
hgs
parents:
diff changeset
   122
        TestDriverPerformance();
hgs
parents:
diff changeset
   123
        }
hgs
parents:
diff changeset
   124
    
hgs
parents:
diff changeset
   125
    CalculatePerformance();
hgs
parents:
diff changeset
   126
    
hgs
parents:
diff changeset
   127
    LOG_EXIT();
hgs
parents:
diff changeset
   128
    }
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
// This function allows us to provide a benchmark when comparing the performance with the 
hgs
parents:
diff changeset
   131
// old and new APIs using the TestDriverPerformance function below. The two possible 
hgs
parents:
diff changeset
   132
// configurations are as follows: 
hgs
parents:
diff changeset
   133
// 1. Run t_rmdebug_app with a prefetch abort configuration and measure the time from the 
hgs
parents:
diff changeset
   134
// point of crash to the logon request completion.
hgs
parents:
diff changeset
   135
// 2. Load the debug-system and then run the above configuration.  
hgs
parents:
diff changeset
   136
void CRunModeAgent::RunBenchMarkTest()
hgs
parents:
diff changeset
   137
    {
hgs
parents:
diff changeset
   138
    LOG_ENTRY();
hgs
parents:
diff changeset
   139
    
hgs
parents:
diff changeset
   140
    test.Start(_L("RunBenchMarkTest"));
hgs
parents:
diff changeset
   141
    
hgs
parents:
diff changeset
   142
    RProcess process;
hgs
parents:
diff changeset
   143
    TRequestStatus status; 
hgs
parents:
diff changeset
   144
    
hgs
parents:
diff changeset
   145
    if (iParams.iDriver)
hgs
parents:
diff changeset
   146
         {
hgs
parents:
diff changeset
   147
         RDebug::Printf("RunBenchMarkTest() - DebugDriver().Connect()");
hgs
parents:
diff changeset
   148
         test(KErrNone == DebugDriver().Connect(securityServerVersion));
hgs
parents:
diff changeset
   149
         }
hgs
parents:
diff changeset
   150
 
hgs
parents:
diff changeset
   151
    LOG_MSG("iParams.iNumOfTestRuns = %d", iParams.iNumOfTestRuns);
hgs
parents:
diff changeset
   152
    
hgs
parents:
diff changeset
   153
    for ( TUint i = 0; i < iParams.iNumOfTestRuns; i++ )
hgs
parents:
diff changeset
   154
        {
hgs
parents:
diff changeset
   155
        // Start test application
hgs
parents:
diff changeset
   156
        test( KErrNone == LaunchProcessL(process, KRMDebugTestApplication(), KTargetOptions()) );
hgs
parents:
diff changeset
   157
               
hgs
parents:
diff changeset
   158
        process.Logon(status);
hgs
parents:
diff changeset
   159
        User::WaitForRequest(status);
hgs
parents:
diff changeset
   160
hgs
parents:
diff changeset
   161
        // Stop timer on logon request completion
hgs
parents:
diff changeset
   162
        iParams.iCountEnd = GetTimeInMs();
hgs
parents:
diff changeset
   163
        LOG_MSG("iParams.iCountEnd = %d", iParams.iCountEnd);
hgs
parents:
diff changeset
   164
        
hgs
parents:
diff changeset
   165
        LOG_MSG( "status.Int() = %d " , status.Int() );
hgs
parents:
diff changeset
   166
        
hgs
parents:
diff changeset
   167
        // prefetch abort should raise a KERN-EXEC 3
hgs
parents:
diff changeset
   168
        test(3 == status.Int());
hgs
parents:
diff changeset
   169
        
hgs
parents:
diff changeset
   170
        process.Close();
hgs
parents:
diff changeset
   171
        GetStartTime(); 
hgs
parents:
diff changeset
   172
       
hgs
parents:
diff changeset
   173
        // NTickCount shouldn't overflow, so no reason why this assertion should fail
hgs
parents:
diff changeset
   174
        test(iParams.iCountEnd > iParams.iCountStart);
hgs
parents:
diff changeset
   175
        iTimeDifs.Append( iParams.iCountEnd - iParams.iCountStart );
hgs
parents:
diff changeset
   176
       }
hgs
parents:
diff changeset
   177
    
hgs
parents:
diff changeset
   178
    LOG_EXIT();
hgs
parents:
diff changeset
   179
    }
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
// This function can be used to compare the performance with the old (e.g. attachExe) and new 
hgs
parents:
diff changeset
   182
// (e.g. attachAll) APIs depending depending on the parameters passed in when running this test.  
hgs
parents:
diff changeset
   183
void CRunModeAgent::TestDriverPerformance()
hgs
parents:
diff changeset
   184
    {
hgs
parents:
diff changeset
   185
    LOG_ENTRY();    
hgs
parents:
diff changeset
   186
    test.Start(_L("TestDriverPerformance"));
hgs
parents:
diff changeset
   187
   
hgs
parents:
diff changeset
   188
    RProcess process;
hgs
parents:
diff changeset
   189
    
hgs
parents:
diff changeset
   190
    test(KErrNone == DebugDriver().Connect(securityServerVersion));
hgs
parents:
diff changeset
   191
    
hgs
parents:
diff changeset
   192
    LOG_MSG("iParams.iNumOfTestRuns = %d", iParams.iNumOfTestRuns);
hgs
parents:
diff changeset
   193
    for ( TUint i = 0; i < iParams.iNumOfTestRuns; i++ )
hgs
parents:
diff changeset
   194
        {
hgs
parents:
diff changeset
   195
        ilaunchCompleted = EFalse;
hgs
parents:
diff changeset
   196
     
hgs
parents:
diff changeset
   197
        Attach();
hgs
parents:
diff changeset
   198
        SetEventAction();
hgs
parents:
diff changeset
   199
        test(KErrNone == LaunchProcessL(process, KRMDebugTestApplication(), KTargetOptions));
hgs
parents:
diff changeset
   200
        
hgs
parents:
diff changeset
   201
        LOG_MSG("CRunModeAgent::TestDriverPerformance - process.Logon");
hgs
parents:
diff changeset
   202
        
hgs
parents:
diff changeset
   203
        while ( !ilaunchCompleted )
hgs
parents:
diff changeset
   204
            {
hgs
parents:
diff changeset
   205
            LOG_MSG("CRunModeAgent::TestDriverPerformance - DebugDriver().GetEvent");
hgs
parents:
diff changeset
   206
       
hgs
parents:
diff changeset
   207
            GetEvent();
hgs
parents:
diff changeset
   208
       
hgs
parents:
diff changeset
   209
            LOG_MSG("CRunModeAgent::TestDriverPerformance - User::WaitForRequest");
hgs
parents:
diff changeset
   210
hgs
parents:
diff changeset
   211
            User::WaitForRequest(iStatus);
hgs
parents:
diff changeset
   212
            LOG_MSG( "iStatus.Int() = %d " , iStatus.Int() );
hgs
parents:
diff changeset
   213
            
hgs
parents:
diff changeset
   214
            LOG_MSG("CRunModeAgent::TestDriverPerformance - HandleEvent");
hgs
parents:
diff changeset
   215
            HandleEvent(iSEventInfo.iEventInfo);
hgs
parents:
diff changeset
   216
            }
hgs
parents:
diff changeset
   217
        
hgs
parents:
diff changeset
   218
        process.Logon(iStatus);
hgs
parents:
diff changeset
   219
        LOG_MSG("CRunModeAgent::TestDriverPerformance - process.Logon, User::WaitForRequest");
hgs
parents:
diff changeset
   220
        User::WaitForRequest(iStatus);
hgs
parents:
diff changeset
   221
        LOG_MSG( "iStatus.Int() = %d " , iStatus.Int() );
hgs
parents:
diff changeset
   222
        
hgs
parents:
diff changeset
   223
        // Stop timer on logon request completion as in benchmark performance test
hgs
parents:
diff changeset
   224
        iParams.iCountEnd = GetTimeInMs();
hgs
parents:
diff changeset
   225
                
hgs
parents:
diff changeset
   226
        // prefetch abort should raise a KERN-EXEC 3
hgs
parents:
diff changeset
   227
        test(3 == iStatus.Int());
hgs
parents:
diff changeset
   228
                    
hgs
parents:
diff changeset
   229
        Detach();
hgs
parents:
diff changeset
   230
        process.Close();       
hgs
parents:
diff changeset
   231
        GetStartTime();
hgs
parents:
diff changeset
   232
 
hgs
parents:
diff changeset
   233
        // NTickCount shouldn't overflow, so no reason why this assertion should fail
hgs
parents:
diff changeset
   234
        test(iParams.iCountEnd > iParams.iCountStart);
hgs
parents:
diff changeset
   235
        iTimeDifs.Append( iParams.iCountEnd - iParams.iCountStart );
hgs
parents:
diff changeset
   236
       }
hgs
parents:
diff changeset
   237
        
hgs
parents:
diff changeset
   238
       LOG_EXIT();
hgs
parents:
diff changeset
   239
    }
hgs
parents:
diff changeset
   240
hgs
parents:
diff changeset
   241
void CRunModeAgent::CalculatePerformance()
hgs
parents:
diff changeset
   242
    {
hgs
parents:
diff changeset
   243
    LOG_ENTRY();
hgs
parents:
diff changeset
   244
hgs
parents:
diff changeset
   245
    TUint median;
hgs
parents:
diff changeset
   246
    TUint arrayCount = iTimeDifs.Count();
hgs
parents:
diff changeset
   247
hgs
parents:
diff changeset
   248
    for (TInt i = 0; i < arrayCount; i++)
hgs
parents:
diff changeset
   249
         {
hgs
parents:
diff changeset
   250
         RDebug::Printf("iTimeDifs[%d] = %d ",i,iTimeDifs[i]);
hgs
parents:
diff changeset
   251
         }
hgs
parents:
diff changeset
   252
    
hgs
parents:
diff changeset
   253
    // Sort in ascending order
hgs
parents:
diff changeset
   254
    iTimeDifs.Sort();
hgs
parents:
diff changeset
   255
            
hgs
parents:
diff changeset
   256
    //If the number of elements is odd, the middle element in the sorted array is the median. 
hgs
parents:
diff changeset
   257
    //If the number of elements is even, the median is the average of the two midmost elements.
hgs
parents:
diff changeset
   258
    if ( arrayCount%2  != 0 )
hgs
parents:
diff changeset
   259
        {
hgs
parents:
diff changeset
   260
        median = iTimeDifs[arrayCount/2];
hgs
parents:
diff changeset
   261
        }
hgs
parents:
diff changeset
   262
    else
hgs
parents:
diff changeset
   263
        {
hgs
parents:
diff changeset
   264
        median = (iTimeDifs[arrayCount/2] + iTimeDifs[arrayCount/2 -1])/2;
hgs
parents:
diff changeset
   265
        }
hgs
parents:
diff changeset
   266
    
hgs
parents:
diff changeset
   267
    RDebug::Printf("Median time %d ms", median );
hgs
parents:
diff changeset
   268
    
hgs
parents:
diff changeset
   269
    LOG_EXIT();
hgs
parents:
diff changeset
   270
    }
hgs
parents:
diff changeset
   271
hgs
parents:
diff changeset
   272
/**
hgs
parents:
diff changeset
   273
  Launch a process
hgs
parents:
diff changeset
   274
  @param aExeName the executable used to create the process
hgs
parents:
diff changeset
   275
  @param aCommandLine the commandline parameters passed to the new process file name of the executable used to create the process
hgs
parents:
diff changeset
   276
  @return KErrNone on success, or one of the other system wide error codes
hgs
parents:
diff changeset
   277
  */
hgs
parents:
diff changeset
   278
TInt CRunModeAgent::LaunchProcessL( RProcess& aProcess, const TDesC& aExeName, const TDesC& aCommandLine )
hgs
parents:
diff changeset
   279
    {
hgs
parents:
diff changeset
   280
    LOG_ENTRY(); 
hgs
parents:
diff changeset
   281
    
hgs
parents:
diff changeset
   282
    RBuf launcherOptions;
hgs
parents:
diff changeset
   283
    launcherOptions.CleanupClosePushL();
hgs
parents:
diff changeset
   284
    const TInt additionalWords = 1; 
hgs
parents:
diff changeset
   285
    launcherOptions.CreateL( aCommandLine.Length() + additionalWords );
hgs
parents:
diff changeset
   286
    launcherOptions.Format( aCommandLine, iParams.iTestTargetPriority);
hgs
parents:
diff changeset
   287
   
hgs
parents:
diff changeset
   288
    LOG_DES(_L("launcherOptions %S"), &launcherOptions);
hgs
parents:
diff changeset
   289
    
hgs
parents:
diff changeset
   290
    TInt err = aProcess.Create( aExeName, launcherOptions );   
hgs
parents:
diff changeset
   291
    CleanupStack::PopAndDestroy();
hgs
parents:
diff changeset
   292
    
hgs
parents:
diff changeset
   293
    // check that there was no error raised
hgs
parents:
diff changeset
   294
    if (err != KErrNone)
hgs
parents:
diff changeset
   295
        return err;
hgs
parents:
diff changeset
   296
    
hgs
parents:
diff changeset
   297
    // rendezvous with process
hgs
parents:
diff changeset
   298
    TRequestStatus status = KRequestPending;
hgs
parents:
diff changeset
   299
    aProcess.Rendezvous(status);
hgs
parents:
diff changeset
   300
hgs
parents:
diff changeset
   301
    // start the test target
hgs
parents:
diff changeset
   302
    aProcess.Resume();
hgs
parents:
diff changeset
   303
    User::WaitForRequest(status);
hgs
parents:
diff changeset
   304
  
hgs
parents:
diff changeset
   305
    if(KErrNone != status.Int())
hgs
parents:
diff changeset
   306
        {
hgs
parents:
diff changeset
   307
        aProcess.Kill(KErrNone);
hgs
parents:
diff changeset
   308
        }
hgs
parents:
diff changeset
   309
     LOG_EXIT(); 
hgs
parents:
diff changeset
   310
     return status.Int();
hgs
parents:
diff changeset
   311
hgs
parents:
diff changeset
   312
    }
hgs
parents:
diff changeset
   313
hgs
parents:
diff changeset
   314
void CRunModeAgent::SetEventAction()
hgs
parents:
diff changeset
   315
    {
hgs
parents:
diff changeset
   316
    LOG_ENTRY();
hgs
parents:
diff changeset
   317
    
hgs
parents:
diff changeset
   318
    if (iParams.iTestType == PerformanceTestParams::EAttachExe)
hgs
parents:
diff changeset
   319
        {
hgs
parents:
diff changeset
   320
        test(KErrNone == DebugDriver().SetEventAction( KRMDebugTestApplication(), EEventsKillThread, EActionContinue));
hgs
parents:
diff changeset
   321
             
hgs
parents:
diff changeset
   322
        if ( iParams.iEvents )
hgs
parents:
diff changeset
   323
            {
hgs
parents:
diff changeset
   324
            test(KErrNone == DebugDriver().SetEventAction( KRMDebugTestApplication(), EEventsAddLibrary, EActionContinue));
hgs
parents:
diff changeset
   325
            test(KErrNone == DebugDriver().SetEventAction( KRMDebugTestApplication(), EEventsUserTrace, EActionContinue));
hgs
parents:
diff changeset
   326
            test(KErrNone == DebugDriver().SetEventAction( KRMDebugTestApplication(), EEventsStartThread, EActionContinue));
hgs
parents:
diff changeset
   327
            test(KErrNone == DebugDriver().SetEventAction( KRMDebugTestApplication(), EEventsAddProcess, EActionContinue));
hgs
parents:
diff changeset
   328
            test(KErrNone == DebugDriver().SetEventAction( KRMDebugTestApplication(), EEventsRemoveProcess, EActionContinue));
hgs
parents:
diff changeset
   329
            }
hgs
parents:
diff changeset
   330
        }
hgs
parents:
diff changeset
   331
    else
hgs
parents:
diff changeset
   332
        {
hgs
parents:
diff changeset
   333
        test(KErrNone == DebugDriver().SetEventAction( EEventsKillThread, EActionContinue));
hgs
parents:
diff changeset
   334
             
hgs
parents:
diff changeset
   335
        if ( iParams.iEvents )
hgs
parents:
diff changeset
   336
            {
hgs
parents:
diff changeset
   337
            test(KErrNone == DebugDriver().SetEventAction( EEventsAddLibrary, EActionContinue));
hgs
parents:
diff changeset
   338
            test(KErrNone == DebugDriver().SetEventAction( EEventsUserTrace, EActionContinue));
hgs
parents:
diff changeset
   339
            test(KErrNone == DebugDriver().SetEventAction( EEventsStartThread, EActionContinue));
hgs
parents:
diff changeset
   340
            test(KErrNone == DebugDriver().SetEventAction( EEventsAddProcess, EActionContinue));
hgs
parents:
diff changeset
   341
            test(KErrNone == DebugDriver().SetEventAction( EEventsRemoveProcess, EActionContinue));
hgs
parents:
diff changeset
   342
            }
hgs
parents:
diff changeset
   343
        }
hgs
parents:
diff changeset
   344
    
hgs
parents:
diff changeset
   345
    LOG_EXIT();
hgs
parents:
diff changeset
   346
    }
hgs
parents:
diff changeset
   347
hgs
parents:
diff changeset
   348
void CRunModeAgent::Attach()
hgs
parents:
diff changeset
   349
    {
hgs
parents:
diff changeset
   350
    LOG_ENTRY();
hgs
parents:
diff changeset
   351
    
hgs
parents:
diff changeset
   352
    if( iParams.iTestType == PerformanceTestParams::EAttachExe ) 
hgs
parents:
diff changeset
   353
        {
hgs
parents:
diff changeset
   354
        // Attach to process non-passively
hgs
parents:
diff changeset
   355
        test(KErrNone == DebugDriver().AttachExecutable( KRMDebugTestApplication(), EFalse));
hgs
parents:
diff changeset
   356
        LOG_MSG("DebugDriver().AttachExecutable");
hgs
parents:
diff changeset
   357
        }
hgs
parents:
diff changeset
   358
    else 
hgs
parents:
diff changeset
   359
        {
hgs
parents:
diff changeset
   360
        // Attach to all the processes on the system
hgs
parents:
diff changeset
   361
        test(KErrNone == DebugDriver().AttachAll());
hgs
parents:
diff changeset
   362
        LOG_MSG("DebugDriver().AttachAll()");
hgs
parents:
diff changeset
   363
        }
hgs
parents:
diff changeset
   364
    
hgs
parents:
diff changeset
   365
    LOG_EXIT();
hgs
parents:
diff changeset
   366
    }
hgs
parents:
diff changeset
   367
hgs
parents:
diff changeset
   368
void CRunModeAgent::GetEvent()
hgs
parents:
diff changeset
   369
    {
hgs
parents:
diff changeset
   370
    LOG_ENTRY();
hgs
parents:
diff changeset
   371
hgs
parents:
diff changeset
   372
    if( iParams.iTestType == PerformanceTestParams::EAttachExe ) 
hgs
parents:
diff changeset
   373
        {
hgs
parents:
diff changeset
   374
        DebugDriver().GetEvent( KRMDebugTestApplication(), iStatus, iSEventInfo.iEventInfoBuf );
hgs
parents:
diff changeset
   375
        }
hgs
parents:
diff changeset
   376
    else
hgs
parents:
diff changeset
   377
        {
hgs
parents:
diff changeset
   378
        DebugDriver().GetEvent( iStatus, iSEventInfo.iEventInfoBuf );
hgs
parents:
diff changeset
   379
        }
hgs
parents:
diff changeset
   380
    
hgs
parents:
diff changeset
   381
    LOG_EXIT();
hgs
parents:
diff changeset
   382
    }
hgs
parents:
diff changeset
   383
hgs
parents:
diff changeset
   384
void CRunModeAgent::Detach()
hgs
parents:
diff changeset
   385
    {
hgs
parents:
diff changeset
   386
    LOG_ENTRY();
hgs
parents:
diff changeset
   387
    
hgs
parents:
diff changeset
   388
    if( iParams.iTestType == PerformanceTestParams::EAttachExe )
hgs
parents:
diff changeset
   389
        {
hgs
parents:
diff changeset
   390
        test (KErrNone == DebugDriver().DetachExecutable(KRMDebugTestApplication()));
hgs
parents:
diff changeset
   391
        }
hgs
parents:
diff changeset
   392
    else
hgs
parents:
diff changeset
   393
        {
hgs
parents:
diff changeset
   394
        test(KErrNone == DebugDriver().DetachAll());
hgs
parents:
diff changeset
   395
        }
hgs
parents:
diff changeset
   396
    
hgs
parents:
diff changeset
   397
    LOG_EXIT();
hgs
parents:
diff changeset
   398
    }
hgs
parents:
diff changeset
   399
hgs
parents:
diff changeset
   400
void CRunModeAgent::HandleEvent(TEventInfo& aEventInfo)
hgs
parents:
diff changeset
   401
    {
hgs
parents:
diff changeset
   402
    LOG_ENTRY(); 
hgs
parents:
diff changeset
   403
hgs
parents:
diff changeset
   404
    switch ( aEventInfo.iEventType )
hgs
parents:
diff changeset
   405
        {
hgs
parents:
diff changeset
   406
        case EEventsAddProcess:
hgs
parents:
diff changeset
   407
            {
hgs
parents:
diff changeset
   408
            LOG_MSG(">>> EEventsAddProcess");                        
hgs
parents:
diff changeset
   409
            break;
hgs
parents:
diff changeset
   410
            }
hgs
parents:
diff changeset
   411
    
hgs
parents:
diff changeset
   412
        case EEventsStartThread:
hgs
parents:
diff changeset
   413
            {
hgs
parents:
diff changeset
   414
            LOG_MSG(">>> EEventsStartThread");                
hgs
parents:
diff changeset
   415
            break;                    
hgs
parents:
diff changeset
   416
            }                       
hgs
parents:
diff changeset
   417
hgs
parents:
diff changeset
   418
        case EEventsUserTrace:
hgs
parents:
diff changeset
   419
            {
hgs
parents:
diff changeset
   420
            LOG_MSG(">>> EEventsUserTrace");  
hgs
parents:
diff changeset
   421
            break;
hgs
parents:
diff changeset
   422
            }
hgs
parents:
diff changeset
   423
hgs
parents:
diff changeset
   424
        case EEventsRemoveProcess:
hgs
parents:
diff changeset
   425
            {
hgs
parents:
diff changeset
   426
            LOG_MSG(">>> EEventsRemoveProcess");                        
hgs
parents:
diff changeset
   427
            break;
hgs
parents:
diff changeset
   428
            }
hgs
parents:
diff changeset
   429
    
hgs
parents:
diff changeset
   430
        case EEventsKillThread:
hgs
parents:
diff changeset
   431
            {
hgs
parents:
diff changeset
   432
            LOG_MSG(">>> EEventsKillThread");   
hgs
parents:
diff changeset
   433
            ilaunchCompleted = ETrue;          
hgs
parents:
diff changeset
   434
            break;
hgs
parents:
diff changeset
   435
            }
hgs
parents:
diff changeset
   436
            
hgs
parents:
diff changeset
   437
        default:   
hgs
parents:
diff changeset
   438
            {
hgs
parents:
diff changeset
   439
            LOG_MSG( ">>> Unknown event ");
hgs
parents:
diff changeset
   440
            break;
hgs
parents:
diff changeset
   441
            }   
hgs
parents:
diff changeset
   442
        }
hgs
parents:
diff changeset
   443
     
hgs
parents:
diff changeset
   444
    LOG_EXIT(); 
hgs
parents:
diff changeset
   445
    }
hgs
parents:
diff changeset
   446
hgs
parents:
diff changeset
   447
void CRunModeAgent::SetDefaultParamValues()
hgs
parents:
diff changeset
   448
    {
hgs
parents:
diff changeset
   449
    LOG_ENTRY();
hgs
parents:
diff changeset
   450
    
hgs
parents:
diff changeset
   451
    iParams.iNumOfTestRuns = KNumOfTestRuns;
hgs
parents:
diff changeset
   452
    iParams.iTestType = PerformanceTestParams::EBenchMarkTest;
hgs
parents:
diff changeset
   453
    iParams.iTestTargetPriority = 0;
hgs
parents:
diff changeset
   454
    iParams.iEvents = 0;
hgs
parents:
diff changeset
   455
    iParams.iDriver = 0;
hgs
parents:
diff changeset
   456
    
hgs
parents:
diff changeset
   457
    LOG_EXIT();
hgs
parents:
diff changeset
   458
    }
hgs
parents:
diff changeset
   459
hgs
parents:
diff changeset
   460
TInt CRunModeAgent::ParseCommandLine()
hgs
parents:
diff changeset
   461
    {
hgs
parents:
diff changeset
   462
    LOG_ENTRY();
hgs
parents:
diff changeset
   463
    
hgs
parents:
diff changeset
   464
    TBool ifDisplayHelp = EDontDisplayHelp;
hgs
parents:
diff changeset
   465
    SetDefaultParamValues();
hgs
parents:
diff changeset
   466
    
hgs
parents:
diff changeset
   467
    TInt argc = User::CommandLineLength();
hgs
parents:
diff changeset
   468
    LOG_MSG( "Launcher Process() argc=%d", argc );
hgs
parents:
diff changeset
   469
hgs
parents:
diff changeset
   470
    if( argc )
hgs
parents:
diff changeset
   471
        {
hgs
parents:
diff changeset
   472
        HBufC* commandLine = NULL;
hgs
parents:
diff changeset
   473
        commandLine = HBufC::NewLC(argc);
hgs
parents:
diff changeset
   474
        TPtr commandLineBuffer = commandLine->Des();
hgs
parents:
diff changeset
   475
        User::CommandLine(commandLineBuffer);
hgs
parents:
diff changeset
   476
       
hgs
parents:
diff changeset
   477
        LOG_DES(_L("CommandLine = %S"), &commandLineBuffer);
hgs
parents:
diff changeset
   478
        
hgs
parents:
diff changeset
   479
        // create a lexer and read through the command line
hgs
parents:
diff changeset
   480
        TLex lex(*commandLine);
hgs
parents:
diff changeset
   481
        while (!lex.Eos())
hgs
parents:
diff changeset
   482
             {
hgs
parents:
diff changeset
   483
             // only look for options with first character '-', other switches are for the targets
hgs
parents:
diff changeset
   484
             if (lex.Get() == '-')
hgs
parents:
diff changeset
   485
                 {
hgs
parents:
diff changeset
   486
                 TChar arg = lex.Get();
hgs
parents:
diff changeset
   487
                 switch (arg)
hgs
parents:
diff changeset
   488
                     {
hgs
parents:
diff changeset
   489
                     case 'n':
hgs
parents:
diff changeset
   490
                         lex.Val( iParams.iNumOfTestRuns );
hgs
parents:
diff changeset
   491
                         LOG_MSG("Number of test runs %d", iParams.iNumOfTestRuns);
hgs
parents:
diff changeset
   492
                         break;
hgs
parents:
diff changeset
   493
                      case 't':
hgs
parents:
diff changeset
   494
                          lex.Val( iParams.iTestType );
hgs
parents:
diff changeset
   495
                          LOG_MSG("parsed testType as %d", iParams.iTestType );
hgs
parents:
diff changeset
   496
                          break;
hgs
parents:
diff changeset
   497
                      case 'p':
hgs
parents:
diff changeset
   498
                          lex.Val( iParams.iTestTargetPriority );
hgs
parents:
diff changeset
   499
                          LOG_MSG("parsed test target priority as %d", iParams.iTestTargetPriority );
hgs
parents:
diff changeset
   500
                          break;
hgs
parents:
diff changeset
   501
                      case 'e':
hgs
parents:
diff changeset
   502
                          lex.Val( iParams.iEvents );
hgs
parents:
diff changeset
   503
                          LOG_MSG("parsed events as %d", iParams.iEvents );
hgs
parents:
diff changeset
   504
                          break;
hgs
parents:
diff changeset
   505
                      case 'd':
hgs
parents:
diff changeset
   506
                          lex.Val( iParams.iDriver );
hgs
parents:
diff changeset
   507
                          LOG_MSG("parsed iDriver as %d", iParams.iDriver );
hgs
parents:
diff changeset
   508
                          break;
hgs
parents:
diff changeset
   509
                       case 'h':
hgs
parents:
diff changeset
   510
                          LOG_MSG( "Display help" );
hgs
parents:
diff changeset
   511
                          ifDisplayHelp = EDisplayHelp;
hgs
parents:
diff changeset
   512
                       default:
hgs
parents:
diff changeset
   513
                           LOG_MSG( "Default usage" );
hgs
parents:
diff changeset
   514
                           break;             
hgs
parents:
diff changeset
   515
                       }
hgs
parents:
diff changeset
   516
                  }
hgs
parents:
diff changeset
   517
              }
hgs
parents:
diff changeset
   518
            CleanupStack::PopAndDestroy(commandLine);
hgs
parents:
diff changeset
   519
        }
hgs
parents:
diff changeset
   520
    
hgs
parents:
diff changeset
   521
    LOG_EXIT();
hgs
parents:
diff changeset
   522
    return ifDisplayHelp;   
hgs
parents:
diff changeset
   523
    }
hgs
parents:
diff changeset
   524
hgs
parents:
diff changeset
   525
void CRunModeAgent::DisplayUsage()
hgs
parents:
diff changeset
   526
    {
hgs
parents:
diff changeset
   527
    LOG_ENTRY();
hgs
parents:
diff changeset
   528
    test.Printf(_L("\nUsage: t_rmdebug_performance_test [options] \nOptions:\n"));
hgs
parents:
diff changeset
   529
    
hgs
parents:
diff changeset
   530
    test.Printf(_L("\t-t  \t\ttest type\n"));
hgs
parents:
diff changeset
   531
    test.Printf(_L("\t\t\t  0 - AttachAll\n"));
hgs
parents:
diff changeset
   532
    test.Printf(_L("\t\t\t  1 - AttachExe\n"));
hgs
parents:
diff changeset
   533
    test.Printf(_L("\t\t\t  2 - None\n"));
hgs
parents:
diff changeset
   534
           
hgs
parents:
diff changeset
   535
    test.Printf(_L("\t-n \t\tnumber of iterations\n"));
hgs
parents:
diff changeset
   536
    test.Printf(_L("\t-e \t\ttest with events\n"));
hgs
parents:
diff changeset
   537
    test.Printf(_L("\t\t\t  0 - No\n"));
hgs
parents:
diff changeset
   538
    test.Printf(_L("\t\t\t  1 - Yes\n"));
hgs
parents:
diff changeset
   539
    test.Printf(_L("\t-p \t\tpriority of test target thread\n"));
hgs
parents:
diff changeset
   540
    
hgs
parents:
diff changeset
   541
    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteVeryLow \n"), EPriorityAbsoluteVeryLow);
hgs
parents:
diff changeset
   542
    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteLowNormal \n"), EPriorityAbsoluteLowNormal);
hgs
parents:
diff changeset
   543
    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteLow \n"), EPriorityAbsoluteLow);
hgs
parents:
diff changeset
   544
    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteBackgroundNormal \n"), EPriorityAbsoluteBackgroundNormal);
hgs
parents:
diff changeset
   545
    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteBackground \n"), EPriorityAbsoluteBackground);
hgs
parents:
diff changeset
   546
    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteForegroundNormal \n"), EPriorityAbsoluteForegroundNormal);
hgs
parents:
diff changeset
   547
    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteForeground \n"), EPriorityAbsoluteForeground);
hgs
parents:
diff changeset
   548
    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteHighNormal \n"), EPriorityAbsoluteHighNormal);
hgs
parents:
diff changeset
   549
    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteHigh \n"), EPriorityAbsoluteHigh);
hgs
parents:
diff changeset
   550
    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteRealTime1 \n"), EPriorityAbsoluteRealTime1);
hgs
parents:
diff changeset
   551
    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteRealTime2 \n"), EPriorityAbsoluteRealTime2);
hgs
parents:
diff changeset
   552
    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteRealTime3 \n"), EPriorityAbsoluteRealTime3);
hgs
parents:
diff changeset
   553
    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteRealTime4 \n"), EPriorityAbsoluteRealTime4);
hgs
parents:
diff changeset
   554
    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteRealTime5 \n"), EPriorityAbsoluteRealTime5);
hgs
parents:
diff changeset
   555
    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteRealTime6 \n"), EPriorityAbsoluteRealTime6);
hgs
parents:
diff changeset
   556
    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteRealTime7 \n"), EPriorityAbsoluteRealTime7);
hgs
parents:
diff changeset
   557
    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteRealTime8 \n"), EPriorityAbsoluteRealTime8);
hgs
parents:
diff changeset
   558
    
hgs
parents:
diff changeset
   559
    test.Printf(_L("\t-d  \t\tload driver\n"));
hgs
parents:
diff changeset
   560
    test.Printf(_L("\t\t\t  0 - No\n"));
hgs
parents:
diff changeset
   561
    test.Printf(_L("\t\t\t  1 - Yes\n"));
hgs
parents:
diff changeset
   562
        
hgs
parents:
diff changeset
   563
    test.Printf(_L("\t-h \t\tdisplay usage information\n\n"));
hgs
parents:
diff changeset
   564
    
hgs
parents:
diff changeset
   565
    test.Printf(_L("Press any key...\n"));
hgs
parents:
diff changeset
   566
    test.Getch();
hgs
parents:
diff changeset
   567
    
hgs
parents:
diff changeset
   568
    LOG_EXIT();
hgs
parents:
diff changeset
   569
    }
hgs
parents:
diff changeset
   570
hgs
parents:
diff changeset
   571
GLDEF_C TInt E32Main()
hgs
parents:
diff changeset
   572
    {
hgs
parents:
diff changeset
   573
    __UHEAP_MARK;
hgs
parents:
diff changeset
   574
hgs
parents:
diff changeset
   575
    TInt ret = KErrNone;        
hgs
parents:
diff changeset
   576
    CTrapCleanup* trap = CTrapCleanup::New();
hgs
parents:
diff changeset
   577
        
hgs
parents:
diff changeset
   578
    if (!trap)
hgs
parents:
diff changeset
   579
        return KErrNoMemory;
hgs
parents:
diff changeset
   580
    
hgs
parents:
diff changeset
   581
    test.Start(KTestName);
hgs
parents:
diff changeset
   582
       
hgs
parents:
diff changeset
   583
    CRunModeAgent *runModeAgent = CRunModeAgent::NewL();
hgs
parents:
diff changeset
   584
hgs
parents:
diff changeset
   585
    if (runModeAgent != NULL)
hgs
parents:
diff changeset
   586
        {
hgs
parents:
diff changeset
   587
        TRAP(ret,runModeAgent->ClientAppL());
hgs
parents:
diff changeset
   588
        LOG_MSG( "ClientAppL() returned %d", ret );
hgs
parents:
diff changeset
   589
        delete runModeAgent;
hgs
parents:
diff changeset
   590
        }
hgs
parents:
diff changeset
   591
    
hgs
parents:
diff changeset
   592
    test.End();
hgs
parents:
diff changeset
   593
    test.Close();
hgs
parents:
diff changeset
   594
hgs
parents:
diff changeset
   595
    delete trap;
hgs
parents:
diff changeset
   596
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
   597
    return ret;
hgs
parents:
diff changeset
   598
    }
hgs
parents:
diff changeset
   599