keepalive/flextimer/test/testflextimer/src/testflexperiodic.cpp
author hgs
Mon, 24 May 2010 20:51:35 +0300
changeset 32 5c4486441ae6
permissions -rw-r--r--
201021
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* ============================================================================
hgs
parents:
diff changeset
     3
*  Name        : testflexperiodic.cpp
hgs
parents:
diff changeset
     4
*  Part of     : src / testflextimer
hgs
parents:
diff changeset
     5
*  Description : STIF test cases for CFlexPeriodic timer.
hgs
parents:
diff changeset
     6
*  Version     : %version: 1 %
hgs
parents:
diff changeset
     7
*
hgs
parents:
diff changeset
     8
*  Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     9
*  All rights reserved.
hgs
parents:
diff changeset
    10
*  This component and the accompanying materials are made available
hgs
parents:
diff changeset
    11
*  under the terms of the License "Eclipse Public License v1.0"
hgs
parents:
diff changeset
    12
*  which accompanies this distribution, and is available
hgs
parents:
diff changeset
    13
*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
    14
*
hgs
parents:
diff changeset
    15
*  Initial Contributors:
hgs
parents:
diff changeset
    16
*  Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    17
*
hgs
parents:
diff changeset
    18
*  Contributors:
hgs
parents:
diff changeset
    19
*  Nokia Corporation
hgs
parents:
diff changeset
    20
* ============================================================================
hgs
parents:
diff changeset
    21
* Template version: 4.1
hgs
parents:
diff changeset
    22
*/
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
#include <e32debug.h>               // for RDebug
hgs
parents:
diff changeset
    25
#include <flexperiodic.h>           // for CFlexPeriodic
hgs
parents:
diff changeset
    26
#include <stiftesteventinterface.h> // for TEventIf 
hgs
parents:
diff changeset
    27
#include "testflextimer.h"          // for global constants
hgs
parents:
diff changeset
    28
#include "testflexperiodic.h"
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
/**
hgs
parents:
diff changeset
    31
 *  Timer can be expired 1 sec late
hgs
parents:
diff changeset
    32
 *  
hgs
parents:
diff changeset
    33
 *  Note! Definition
hgs
parents:
diff changeset
    34
 *  
hgs
parents:
diff changeset
    35
 *      const TTimeIntervalMicroSeconds32 KTimerResolution( 1000000 );
hgs
parents:
diff changeset
    36
 * 
hgs
parents:
diff changeset
    37
 * will cause writable static data due non-trivial constructor of 
hgs
parents:
diff changeset
    38
 * TTimeIntervalMicroSeconds32.
hgs
parents:
diff changeset
    39
 *  
hgs
parents:
diff changeset
    40
 */
hgs
parents:
diff changeset
    41
const TInt KTimerResolution( 1000000 );
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
// ======== LOCAL FUNCTIONS ========
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
// ======== MEMBER FUNCTIONS ========
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    48
// Constructor
hgs
parents:
diff changeset
    49
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    50
//
hgs
parents:
diff changeset
    51
CTestFlexPeriodic::CTestFlexPeriodic()
hgs
parents:
diff changeset
    52
    {
hgs
parents:
diff changeset
    53
    }
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    56
// Destructor
hgs
parents:
diff changeset
    57
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    58
//
hgs
parents:
diff changeset
    59
CTestFlexPeriodic::~CTestFlexPeriodic()
hgs
parents:
diff changeset
    60
    {
hgs
parents:
diff changeset
    61
    }
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    64
// _ _ _ ____ _ ___    _    ____ ____ ___  
hgs
parents:
diff changeset
    65
// | | | |__| |  |     |    |  | |  | |__] 
hgs
parents:
diff changeset
    66
// |_|_| |  | |  |     |___ |__| |__| |    
hgs
parents:
diff changeset
    67
//                                         
hgs
parents:
diff changeset
    68
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    71
// Start scheduler for given time.
hgs
parents:
diff changeset
    72
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    73
//
hgs
parents:
diff changeset
    74
void CTestFlexPeriodic::WaitL( TTimeIntervalMicroSeconds32 aPeriod )
hgs
parents:
diff changeset
    75
    {
hgs
parents:
diff changeset
    76
    CPeriodic* watchdog = CPeriodic::NewL( CActive::EPriorityStandard );
hgs
parents:
diff changeset
    77
    CleanupStack::PushL( watchdog );
hgs
parents:
diff changeset
    78
    watchdog->Start( aPeriod, aPeriod, TCallBack( StopScheduler, NULL ) );
hgs
parents:
diff changeset
    79
    
hgs
parents:
diff changeset
    80
    // Start scheduler. Wait here until the timer expires and stops the
hgs
parents:
diff changeset
    81
    // scheduler.
hgs
parents:
diff changeset
    82
    CActiveScheduler::Start();
hgs
parents:
diff changeset
    83
    
hgs
parents:
diff changeset
    84
    // Clean-up
hgs
parents:
diff changeset
    85
    watchdog->Cancel();
hgs
parents:
diff changeset
    86
    CleanupStack::PopAndDestroy( watchdog );
hgs
parents:
diff changeset
    87
    }
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    90
// TCallBack function to stop the scheduler.
hgs
parents:
diff changeset
    91
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    92
//
hgs
parents:
diff changeset
    93
TInt CTestFlexPeriodic::StopScheduler( TAny* /* aArgument */ )
hgs
parents:
diff changeset
    94
    {
hgs
parents:
diff changeset
    95
    CActiveScheduler::Stop();
hgs
parents:
diff changeset
    96
    return KErrNone;
hgs
parents:
diff changeset
    97
    }
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   101
// ____ ____ _    _    ___  ____ ____ _  _ ____ 
hgs
parents:
diff changeset
   102
// |    |__| |    |    |__] |__| |    |_/  [__  
hgs
parents:
diff changeset
   103
// |___ |  | |___ |___ |__] |  | |___ | \_ ___] 
hgs
parents:
diff changeset
   104
//                                              
hgs
parents:
diff changeset
   105
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   106
hgs
parents:
diff changeset
   107
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   108
// TCallBack function that does nothing. Not ment to be called - just to 
hgs
parents:
diff changeset
   109
// fulfill the interface.
hgs
parents:
diff changeset
   110
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   111
//
hgs
parents:
diff changeset
   112
TInt CTestFlexPeriodic::DoNothing( TAny* /* aArgument */ )
hgs
parents:
diff changeset
   113
    {
hgs
parents:
diff changeset
   114
    return KErrNone;
hgs
parents:
diff changeset
   115
    }
hgs
parents:
diff changeset
   116
hgs
parents:
diff changeset
   117
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   118
// TCallBack function that panics testcase if it get called.
hgs
parents:
diff changeset
   119
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   120
//
hgs
parents:
diff changeset
   121
TInt CTestFlexPeriodic::PanicClient( TAny* /* aArgument */ )
hgs
parents:
diff changeset
   122
    {
hgs
parents:
diff changeset
   123
    User::Panic(_L("NotCalled CB got called"), 0xDEAD);
hgs
parents:
diff changeset
   124
    return KErrNone;
hgs
parents:
diff changeset
   125
    }
hgs
parents:
diff changeset
   126
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   127
// TCallBack function for adding time stamp to an RArray of TTimes.
hgs
parents:
diff changeset
   128
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   129
//
hgs
parents:
diff changeset
   130
TInt CTestFlexPeriodic::AddTimestamp( TAny* aArgument )
hgs
parents:
diff changeset
   131
    {
hgs
parents:
diff changeset
   132
    __ASSERT_ALWAYS(
hgs
parents:
diff changeset
   133
        aArgument != NULL,
hgs
parents:
diff changeset
   134
        User::Panic( KTestFlexTimerPanicCategory, KErrArgument ) );
hgs
parents:
diff changeset
   135
hgs
parents:
diff changeset
   136
    //RDebug::Print( _L("CTestFlexPeriodic::AddTimestamp()") );
hgs
parents:
diff changeset
   137
    
hgs
parents:
diff changeset
   138
    RArray<TTime>* times =  reinterpret_cast<RArray<TTime>*>( aArgument );
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
    TTime now;
hgs
parents:
diff changeset
   141
    now.UniversalTime();
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
    TInt err = times->Append( now ); // Data is copied by RArray
hgs
parents:
diff changeset
   144
    __ASSERT_ALWAYS(
hgs
parents:
diff changeset
   145
        err == KErrNone,
hgs
parents:
diff changeset
   146
        User::Panic( KTestFlexTimerPanicCategory, err ) );
hgs
parents:
diff changeset
   147
hgs
parents:
diff changeset
   148
    return KErrNone;
hgs
parents:
diff changeset
   149
    }
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   152
// TCallBack function for restarting CFlexPeriodic timer.
hgs
parents:
diff changeset
   153
// Action depends the value of iFirstTicksLeft;
hgs
parents:
diff changeset
   154
// >0 -- Add timestamp to iFirstTimestamps 
hgs
parents:
diff changeset
   155
// <0 -- Add timestamp to iSecondTimestamps
hgs
parents:
diff changeset
   156
// =0 -- Add timestamp to iFirstTimestamps AND iSecondTimestamps AND restart
hgs
parents:
diff changeset
   157
//       the timer with iSecondInterval
hgs
parents:
diff changeset
   158
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   159
//
hgs
parents:
diff changeset
   160
TInt CTestFlexPeriodic::RestartTimer( TAny* aArgument )
hgs
parents:
diff changeset
   161
    {
hgs
parents:
diff changeset
   162
    __ASSERT_ALWAYS(
hgs
parents:
diff changeset
   163
        aArgument != NULL,
hgs
parents:
diff changeset
   164
        User::Panic( KTestFlexTimerPanicCategory, KErrArgument ) );
hgs
parents:
diff changeset
   165
hgs
parents:
diff changeset
   166
    TRestartInfo* info =  reinterpret_cast<TRestartInfo*>( aArgument );
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
    __ASSERT_ALWAYS(
hgs
parents:
diff changeset
   169
        info->iTimer != NULL && 
hgs
parents:
diff changeset
   170
        info->iFirstTimestamps != NULL && 
hgs
parents:
diff changeset
   171
        info->iSecondTimestamps != NULL,
hgs
parents:
diff changeset
   172
        User::Panic( KTestFlexTimerPanicCategory, KErrArgument ) );
hgs
parents:
diff changeset
   173
    
hgs
parents:
diff changeset
   174
    // Add current time to timestamps
hgs
parents:
diff changeset
   175
    // Data is copied by RArray - no need to use heap
hgs
parents:
diff changeset
   176
    TTime now;
hgs
parents:
diff changeset
   177
    now.UniversalTime();
hgs
parents:
diff changeset
   178
    
hgs
parents:
diff changeset
   179
    TInt ticks( info->iFirstTicksLeft-- ); // Update the ticks
hgs
parents:
diff changeset
   180
    TInt err( KErrNone );
hgs
parents:
diff changeset
   181
    if ( ticks > 0 )
hgs
parents:
diff changeset
   182
        {
hgs
parents:
diff changeset
   183
        err = info->iFirstTimestamps->Append( now );
hgs
parents:
diff changeset
   184
        }
hgs
parents:
diff changeset
   185
    else if ( ticks < 0 )
hgs
parents:
diff changeset
   186
        {
hgs
parents:
diff changeset
   187
        err = info->iSecondTimestamps->Append( now );
hgs
parents:
diff changeset
   188
        }
hgs
parents:
diff changeset
   189
    else // ticks == 0
hgs
parents:
diff changeset
   190
        {
hgs
parents:
diff changeset
   191
        // Set the timestamps.
hgs
parents:
diff changeset
   192
        // 1st timer settings expiration time is the starting time of the
hgs
parents:
diff changeset
   193
        // second timer settings. Add timestamp to both arrays.
hgs
parents:
diff changeset
   194
        err = info->iFirstTimestamps->Append( now );
hgs
parents:
diff changeset
   195
        __ASSERT_ALWAYS(
hgs
parents:
diff changeset
   196
            err == KErrNone,
hgs
parents:
diff changeset
   197
            User::Panic( KTestFlexTimerPanicCategory, err ) );
hgs
parents:
diff changeset
   198
        err = info->iSecondTimestamps->Append( now );
hgs
parents:
diff changeset
   199
hgs
parents:
diff changeset
   200
        // Restart the timer
hgs
parents:
diff changeset
   201
        info->iTimer->Cancel();
hgs
parents:
diff changeset
   202
        info->iTimer->Start(
hgs
parents:
diff changeset
   203
            info->iSecondInterval,
hgs
parents:
diff changeset
   204
            info->iSecondInterval, 
hgs
parents:
diff changeset
   205
            TCallBack( RestartTimer, info ) );
hgs
parents:
diff changeset
   206
        }
hgs
parents:
diff changeset
   207
    __ASSERT_ALWAYS(
hgs
parents:
diff changeset
   208
        err == KErrNone,
hgs
parents:
diff changeset
   209
        User::Panic( KTestFlexTimerPanicCategory, err ) );
hgs
parents:
diff changeset
   210
hgs
parents:
diff changeset
   211
    return KErrNone;
hgs
parents:
diff changeset
   212
    }
hgs
parents:
diff changeset
   213
hgs
parents:
diff changeset
   214
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   215
// TCallBack function for trying to configure timer in callback.
hgs
parents:
diff changeset
   216
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   217
//
hgs
parents:
diff changeset
   218
TInt CTestFlexPeriodic::ConfigureTimer( TAny* aArgument )
hgs
parents:
diff changeset
   219
    {
hgs
parents:
diff changeset
   220
    __ASSERT_ALWAYS(
hgs
parents:
diff changeset
   221
        aArgument != NULL,
hgs
parents:
diff changeset
   222
        User::Panic( KTestFlexTimerPanicCategory, KErrArgument ) );
hgs
parents:
diff changeset
   223
hgs
parents:
diff changeset
   224
    TConfigureInfo* info =  reinterpret_cast<TConfigureInfo*>( aArgument );
hgs
parents:
diff changeset
   225
hgs
parents:
diff changeset
   226
    const TTimeIntervalMicroSeconds32 delayWindow32( info->iDelayWindow );
hgs
parents:
diff changeset
   227
    const TTimeIntervalMicroSeconds32 intervalWindow32( info->iIntervalWindow );
hgs
parents:
diff changeset
   228
hgs
parents:
diff changeset
   229
    const TTimeIntervalMicroSeconds delayWindow64( info->iDelayWindow );
hgs
parents:
diff changeset
   230
    const TTimeIntervalMicroSeconds intervalWindow64( info->iIntervalWindow );
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
    info->iConfigResult32 = info->iTimer->Configure( delayWindow32,
hgs
parents:
diff changeset
   233
                                                     intervalWindow32);
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
    info->iConfigResult64 = info->iTimer->Configure( delayWindow64,
hgs
parents:
diff changeset
   236
                                                     intervalWindow64);
hgs
parents:
diff changeset
   237
hgs
parents:
diff changeset
   238
    return KErrNone;
hgs
parents:
diff changeset
   239
    }
hgs
parents:
diff changeset
   240
hgs
parents:
diff changeset
   241
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   242
// TCallBack function for starting a flexible periodic timer.
hgs
parents:
diff changeset
   243
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   244
//
hgs
parents:
diff changeset
   245
TInt CTestFlexPeriodic::StartTimer( TAny* aArgument )
hgs
parents:
diff changeset
   246
    {
hgs
parents:
diff changeset
   247
    __ASSERT_ALWAYS(
hgs
parents:
diff changeset
   248
        aArgument != NULL,
hgs
parents:
diff changeset
   249
        User::Panic( KTestFlexTimerPanicCategory, KErrArgument ) );
hgs
parents:
diff changeset
   250
hgs
parents:
diff changeset
   251
    const TTimeIntervalMicroSeconds32 KTimerDelay( 2000000 );
hgs
parents:
diff changeset
   252
    const TTimeIntervalMicroSeconds32 KTimerInterval( 2000000 );
hgs
parents:
diff changeset
   253
hgs
parents:
diff changeset
   254
    CFlexPeriodic* timer =  reinterpret_cast<CFlexPeriodic*>( aArgument );
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
    timer->Start(
hgs
parents:
diff changeset
   257
        KTimerDelay,
hgs
parents:
diff changeset
   258
        KTimerInterval,
hgs
parents:
diff changeset
   259
        TCallBack( StartTimer, timer )
hgs
parents:
diff changeset
   260
        );
hgs
parents:
diff changeset
   261
hgs
parents:
diff changeset
   262
    return KErrNone;
hgs
parents:
diff changeset
   263
    }
hgs
parents:
diff changeset
   264
hgs
parents:
diff changeset
   265
hgs
parents:
diff changeset
   266
hgs
parents:
diff changeset
   267
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   268
// ___ _ _  _ ____ ____ ___ ____ _  _ ___     ____ _  _ _  _ ____ . ____ 
hgs
parents:
diff changeset
   269
//  |  | |\/| |___ [__   |  |__| |\/| |__]    |___ |  | |\ | |    ' [__  
hgs
parents:
diff changeset
   270
//  |  | |  | |___ ___]  |  |  | |  | |       |    |__| | \| |___   ___] 
hgs
parents:
diff changeset
   271
//
hgs
parents:
diff changeset
   272
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   273
hgs
parents:
diff changeset
   274
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   275
// Verify that the timestamps are expired at window.
hgs
parents:
diff changeset
   276
//
hgs
parents:
diff changeset
   277
// Note that the timer resolution is 1 sec, so, the actual expiration time can
hgs
parents:
diff changeset
   278
// be later than set.
hgs
parents:
diff changeset
   279
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   280
//
hgs
parents:
diff changeset
   281
TBool CTestFlexPeriodic::AreTimestampsAtWindow( 
hgs
parents:
diff changeset
   282
    const RArray<TTime>& aTimestamps,
hgs
parents:
diff changeset
   283
    const TTimeIntervalMicroSeconds32& aDelay,
hgs
parents:
diff changeset
   284
    const TTimeIntervalMicroSeconds32& aInterval,
hgs
parents:
diff changeset
   285
    const TTimeIntervalMicroSeconds32& aDelayWindow,
hgs
parents:
diff changeset
   286
    const TTimeIntervalMicroSeconds32& aIntervalWindow )
hgs
parents:
diff changeset
   287
    {
hgs
parents:
diff changeset
   288
    __ASSERT_ALWAYS(
hgs
parents:
diff changeset
   289
        aTimestamps.Count() >= 2 && 
hgs
parents:
diff changeset
   290
        aDelay.Int() >= 0 &&
hgs
parents:
diff changeset
   291
        aInterval.Int() >= 0 &&
hgs
parents:
diff changeset
   292
        aDelayWindow.Int() >= 0 &&
hgs
parents:
diff changeset
   293
        aIntervalWindow.Int() >= 0,
hgs
parents:
diff changeset
   294
        User::Panic( KTestFlexTimerPanicCategory, KErrArgument ) );
hgs
parents:
diff changeset
   295
hgs
parents:
diff changeset
   296
    // Timestamps are correct unless proved otherwise 
hgs
parents:
diff changeset
   297
    TBool ret = ETrue;
hgs
parents:
diff changeset
   298
hgs
parents:
diff changeset
   299
    // For the 1st expiration is delay
hgs
parents:
diff changeset
   300
    TTimeIntervalMicroSeconds delay;
hgs
parents:
diff changeset
   301
    delay = aTimestamps[1].MicroSecondsFrom( aTimestamps[0] );
hgs
parents:
diff changeset
   302
    RDebug::Print( _L("Timer delay %Ld"), delay.Int64() );
hgs
parents:
diff changeset
   303
hgs
parents:
diff changeset
   304
    if ( delay < aDelay.Int() - aDelayWindow.Int() || 
hgs
parents:
diff changeset
   305
         delay > aDelay.Int() + KTimerResolution )
hgs
parents:
diff changeset
   306
        {
hgs
parents:
diff changeset
   307
        ret = EFalse;
hgs
parents:
diff changeset
   308
        }
hgs
parents:
diff changeset
   309
hgs
parents:
diff changeset
   310
    // The rest of the expirations are intervals
hgs
parents:
diff changeset
   311
    for ( TInt i( 2 ); i < aTimestamps.Count(); ++i )
hgs
parents:
diff changeset
   312
        {
hgs
parents:
diff changeset
   313
        TTimeIntervalMicroSeconds interval;
hgs
parents:
diff changeset
   314
        interval = aTimestamps[i].MicroSecondsFrom( aTimestamps[i-1] );
hgs
parents:
diff changeset
   315
        RDebug::Print( _L("Timer interval %Ld"), interval.Int64() );
hgs
parents:
diff changeset
   316
hgs
parents:
diff changeset
   317
        if ( interval < aInterval.Int() - aIntervalWindow.Int() || 
hgs
parents:
diff changeset
   318
             interval > aInterval.Int() + KTimerResolution )
hgs
parents:
diff changeset
   319
            {
hgs
parents:
diff changeset
   320
            ret = EFalse;
hgs
parents:
diff changeset
   321
            }
hgs
parents:
diff changeset
   322
        }
hgs
parents:
diff changeset
   323
hgs
parents:
diff changeset
   324
    return ret;
hgs
parents:
diff changeset
   325
    }
hgs
parents:
diff changeset
   326
hgs
parents:
diff changeset
   327
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   328
// Convert the intervals from 64 bit to 32 bit and call 32 bit checking 
hgs
parents:
diff changeset
   329
// function.
hgs
parents:
diff changeset
   330
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   331
//
hgs
parents:
diff changeset
   332
TBool CTestFlexPeriodic::AreTimestampsAtWindow( 
hgs
parents:
diff changeset
   333
    const RArray<TTime>& aTimestamps,
hgs
parents:
diff changeset
   334
    const TTimeIntervalMicroSeconds& aDelay,
hgs
parents:
diff changeset
   335
    const TTimeIntervalMicroSeconds& aInterval,
hgs
parents:
diff changeset
   336
    const TTimeIntervalMicroSeconds& aDelayWindow,
hgs
parents:
diff changeset
   337
    const TTimeIntervalMicroSeconds& aIntervalWindow )
hgs
parents:
diff changeset
   338
    {
hgs
parents:
diff changeset
   339
    __ASSERT_ALWAYS(
hgs
parents:
diff changeset
   340
        I64HIGH( aDelay.Int64() ) == 0 &&
hgs
parents:
diff changeset
   341
        I64HIGH( aInterval.Int64() ) == 0 &&
hgs
parents:
diff changeset
   342
        I64HIGH( aDelayWindow.Int64() ) == 0 &&
hgs
parents:
diff changeset
   343
        I64HIGH( aIntervalWindow.Int64() ) == 0,
hgs
parents:
diff changeset
   344
        User::Panic( KTestFlexTimerPanicCategory, KErrArgument ) );
hgs
parents:
diff changeset
   345
hgs
parents:
diff changeset
   346
    TTimeIntervalMicroSeconds32 delay( I64INT( aDelay.Int64() ) );
hgs
parents:
diff changeset
   347
    TTimeIntervalMicroSeconds32 interval( I64INT( aInterval.Int64() ) );
hgs
parents:
diff changeset
   348
    TTimeIntervalMicroSeconds32 delayWindow( I64INT( aDelayWindow.Int64() ) );
hgs
parents:
diff changeset
   349
    TTimeIntervalMicroSeconds32 intervalWindow( I64INT( aIntervalWindow.Int64() ) );
hgs
parents:
diff changeset
   350
hgs
parents:
diff changeset
   351
    return AreTimestampsAtWindow( aTimestamps, 
hgs
parents:
diff changeset
   352
                                  delay,
hgs
parents:
diff changeset
   353
                                  interval,
hgs
parents:
diff changeset
   354
                                  delayWindow,
hgs
parents:
diff changeset
   355
                                  intervalWindow );
hgs
parents:
diff changeset
   356
    }
hgs
parents:
diff changeset
   357
hgs
parents:
diff changeset
   358
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   359
// Compare are timestamp arrays same
hgs
parents:
diff changeset
   360
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   361
//
hgs
parents:
diff changeset
   362
TBool CTestFlexPeriodic::AreTimestampsSame(
hgs
parents:
diff changeset
   363
    const RArray<TTime>& aLeft,
hgs
parents:
diff changeset
   364
    const RArray<TTime>& aRight )
hgs
parents:
diff changeset
   365
    {
hgs
parents:
diff changeset
   366
    TBool ret( ETrue );
hgs
parents:
diff changeset
   367
    if ( aLeft.Count() == aRight.Count() )
hgs
parents:
diff changeset
   368
        {
hgs
parents:
diff changeset
   369
        for ( TInt i( 0 ); i < aLeft.Count(); ++i )
hgs
parents:
diff changeset
   370
            {
hgs
parents:
diff changeset
   371
            if ( aLeft[i] != aRight[i] )
hgs
parents:
diff changeset
   372
                { // Different timestamp has been found
hgs
parents:
diff changeset
   373
                ret = EFalse;
hgs
parents:
diff changeset
   374
                break;
hgs
parents:
diff changeset
   375
                }
hgs
parents:
diff changeset
   376
            }
hgs
parents:
diff changeset
   377
        }
hgs
parents:
diff changeset
   378
    else
hgs
parents:
diff changeset
   379
        { // Arrays has different number of timestamps.
hgs
parents:
diff changeset
   380
        ret = EFalse;
hgs
parents:
diff changeset
   381
        }
hgs
parents:
diff changeset
   382
hgs
parents:
diff changeset
   383
    return ret;
hgs
parents:
diff changeset
   384
    }
hgs
parents:
diff changeset
   385
hgs
parents:
diff changeset
   386
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   387
// ___ ____ _  _ ___  _    ____ ___ ____    ____ _  _ _  _ ____ . ____ 
hgs
parents:
diff changeset
   388
//  |  |___ |\/| |__] |    |__|  |  |___    |___ |  | |\ | |    ' [__  
hgs
parents:
diff changeset
   389
//  |  |___ |  | |    |___ |  |  |  |___    |    |__| | \| |___   ___] 
hgs
parents:
diff changeset
   390
//
hgs
parents:
diff changeset
   391
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   392
hgs
parents:
diff changeset
   393
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   394
// Configure window sizes - template function
hgs
parents:
diff changeset
   395
// 
hgs
parents:
diff changeset
   396
// Timers are designed so that the 1st timer will test that the delay is
hgs
parents:
diff changeset
   397
// correct and the 2nd timer will test that the interval is correct
hgs
parents:
diff changeset
   398
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   399
template <class firstType, class secondType>
hgs
parents:
diff changeset
   400
TInt CTestFlexPeriodic::ConfigureWindowL( TTestResult& aResult )
hgs
parents:
diff changeset
   401
    {
hgs
parents:
diff changeset
   402
    __UHEAP_MARK;
hgs
parents:
diff changeset
   403
hgs
parents:
diff changeset
   404
    // Constants
hgs
parents:
diff changeset
   405
    const firstType KFirstDelay( 3000000 );             // 3 sec
hgs
parents:
diff changeset
   406
    const firstType KFirstInterval( 2000000 );          // 2 sec
hgs
parents:
diff changeset
   407
    const firstType KFirstDelayWindow( 0 );             // no window
hgs
parents:
diff changeset
   408
    const firstType KFirstIntervalWindow( 1500000 );    // 1.5 sec
hgs
parents:
diff changeset
   409
hgs
parents:
diff changeset
   410
    const secondType KSecondDelay( 3500000 );           // 3.5 sec
hgs
parents:
diff changeset
   411
    const secondType KSecondInterval( 1000000 );        // 1 sec
hgs
parents:
diff changeset
   412
    const secondType KSecondDelayWindow( 1500000 );     // 1.5 sec
hgs
parents:
diff changeset
   413
    const secondType KSecondIntervalWindow( 0 );        // no window
hgs
parents:
diff changeset
   414
hgs
parents:
diff changeset
   415
    const TUint KTestRunTime( 10000000 ); // 10 sec
hgs
parents:
diff changeset
   416
hgs
parents:
diff changeset
   417
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
   418
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
   419
hgs
parents:
diff changeset
   420
    // Create, configure and start the flexible periodic timer
hgs
parents:
diff changeset
   421
    RArray<TTime> firstTimestamps;
hgs
parents:
diff changeset
   422
    CFlexPeriodic* firstTimer = CFlexPeriodic::NewL( CActive::EPriorityStandard );
hgs
parents:
diff changeset
   423
    CleanupStack::PushL( firstTimer );
hgs
parents:
diff changeset
   424
    firstTimer->Configure( KFirstDelayWindow, KFirstIntervalWindow );
hgs
parents:
diff changeset
   425
    firstTimer->Start( 
hgs
parents:
diff changeset
   426
        KFirstDelay, 
hgs
parents:
diff changeset
   427
        KFirstInterval, 
hgs
parents:
diff changeset
   428
        TCallBack( AddTimestamp, &firstTimestamps ) );
hgs
parents:
diff changeset
   429
hgs
parents:
diff changeset
   430
    RArray<TTime> secondTimestamps;
hgs
parents:
diff changeset
   431
    CFlexPeriodic* secondTimer = CFlexPeriodic::NewL( CActive::EPriorityStandard );
hgs
parents:
diff changeset
   432
    CleanupStack::PushL( secondTimer );
hgs
parents:
diff changeset
   433
    secondTimer->Configure( KSecondDelayWindow, KSecondIntervalWindow );
hgs
parents:
diff changeset
   434
    secondTimer->Start( 
hgs
parents:
diff changeset
   435
        KSecondDelay, 
hgs
parents:
diff changeset
   436
        KSecondInterval,
hgs
parents:
diff changeset
   437
        TCallBack( AddTimestamp, &secondTimestamps ) );
hgs
parents:
diff changeset
   438
hgs
parents:
diff changeset
   439
    // Initialize timer expiration time array with starting time to 
hgs
parents:
diff changeset
   440
    // ease analysing of data.
hgs
parents:
diff changeset
   441
    TTime startTime;
hgs
parents:
diff changeset
   442
    startTime.UniversalTime();
hgs
parents:
diff changeset
   443
    firstTimestamps.Append( startTime );
hgs
parents:
diff changeset
   444
    secondTimestamps.Append( startTime );
hgs
parents:
diff changeset
   445
hgs
parents:
diff changeset
   446
    // The execution will be pending here while active scheduler is running...
hgs
parents:
diff changeset
   447
hgs
parents:
diff changeset
   448
                            //    //  ___     _____
hgs
parents:
diff changeset
   449
    WaitL( KTestRunTime ); // // // //_ // //  //
hgs
parents:
diff changeset
   450
                          //_//_// //  // //  //
hgs
parents:
diff changeset
   451
hgs
parents:
diff changeset
   452
    // Analyze results
hgs
parents:
diff changeset
   453
    aResult.SetResult( KErrNone, _L("Test case passed") );
hgs
parents:
diff changeset
   454
hgs
parents:
diff changeset
   455
    // Check the 1st timer expiration time
hgs
parents:
diff changeset
   456
    if ( !AreTimestampsAtWindow( 
hgs
parents:
diff changeset
   457
            firstTimestamps, 
hgs
parents:
diff changeset
   458
            KFirstDelay, 
hgs
parents:
diff changeset
   459
            KFirstInterval, 
hgs
parents:
diff changeset
   460
            KFirstDelayWindow, 
hgs
parents:
diff changeset
   461
            KFirstIntervalWindow ) )
hgs
parents:
diff changeset
   462
        {
hgs
parents:
diff changeset
   463
        aResult.SetResult( 
hgs
parents:
diff changeset
   464
            KErrGeneral, 
hgs
parents:
diff changeset
   465
            _L("Test case failed. First timer not in window.") );
hgs
parents:
diff changeset
   466
        }
hgs
parents:
diff changeset
   467
hgs
parents:
diff changeset
   468
    // Check the 2nd timer expiration time
hgs
parents:
diff changeset
   469
    else if ( !AreTimestampsAtWindow( 
hgs
parents:
diff changeset
   470
            secondTimestamps, 
hgs
parents:
diff changeset
   471
            KSecondDelay, 
hgs
parents:
diff changeset
   472
            KSecondInterval, 
hgs
parents:
diff changeset
   473
            KSecondDelayWindow, 
hgs
parents:
diff changeset
   474
            KSecondIntervalWindow ) )
hgs
parents:
diff changeset
   475
        {
hgs
parents:
diff changeset
   476
        aResult.SetResult( 
hgs
parents:
diff changeset
   477
            KErrGeneral, 
hgs
parents:
diff changeset
   478
            _L("Test case failed. Second timer not in window.") );
hgs
parents:
diff changeset
   479
        }
hgs
parents:
diff changeset
   480
    
hgs
parents:
diff changeset
   481
    // Check that both timers are expired at the same time
hgs
parents:
diff changeset
   482
    else if ( !AreTimestampsSame( firstTimestamps, secondTimestamps ) )
hgs
parents:
diff changeset
   483
        {
hgs
parents:
diff changeset
   484
        aResult.SetResult( 
hgs
parents:
diff changeset
   485
            KErrGeneral, 
hgs
parents:
diff changeset
   486
            _L("Test case failed. Timers are not expired at the same time.") );
hgs
parents:
diff changeset
   487
        }
hgs
parents:
diff changeset
   488
hgs
parents:
diff changeset
   489
    // Clean up
hgs
parents:
diff changeset
   490
    secondTimer->Cancel();
hgs
parents:
diff changeset
   491
    secondTimestamps.Close();
hgs
parents:
diff changeset
   492
    CleanupStack::PopAndDestroy( secondTimer );
hgs
parents:
diff changeset
   493
hgs
parents:
diff changeset
   494
    firstTimer->Cancel();
hgs
parents:
diff changeset
   495
    firstTimestamps.Close();
hgs
parents:
diff changeset
   496
    CleanupStack::PopAndDestroy( firstTimer );
hgs
parents:
diff changeset
   497
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
   498
hgs
parents:
diff changeset
   499
    return KErrNone;
hgs
parents:
diff changeset
   500
    }
hgs
parents:
diff changeset
   501
hgs
parents:
diff changeset
   502
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   503
// Configure window sizes and start timer with given values - template 
hgs
parents:
diff changeset
   504
// function
hgs
parents:
diff changeset
   505
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   506
template <class configureType, class startType>
hgs
parents:
diff changeset
   507
void CTestFlexPeriodic::ConfigureAndStartTimerL( 
hgs
parents:
diff changeset
   508
    RArray<TTime>& aTimestamps,
hgs
parents:
diff changeset
   509
    TInt64 aDelay,
hgs
parents:
diff changeset
   510
    TInt64 aInterval,
hgs
parents:
diff changeset
   511
    TInt64 aDelayWindow,
hgs
parents:
diff changeset
   512
    TInt64 aIntervalWindow )
hgs
parents:
diff changeset
   513
    {
hgs
parents:
diff changeset
   514
    const startType KDelay( aDelay );
hgs
parents:
diff changeset
   515
    const startType KInterval( aInterval );
hgs
parents:
diff changeset
   516
    const configureType KDelayWindow( aDelayWindow );
hgs
parents:
diff changeset
   517
    const configureType KIntervalWindow( aIntervalWindow );
hgs
parents:
diff changeset
   518
hgs
parents:
diff changeset
   519
    const TUint KTestRunTime( 3000000 );
hgs
parents:
diff changeset
   520
hgs
parents:
diff changeset
   521
    TTime now;
hgs
parents:
diff changeset
   522
    now.UniversalTime();
hgs
parents:
diff changeset
   523
    aTimestamps.Append( now );
hgs
parents:
diff changeset
   524
hgs
parents:
diff changeset
   525
    // Create and start the flexible periodic timer
hgs
parents:
diff changeset
   526
    CFlexPeriodic* timer = CFlexPeriodic::NewL( CActive::EPriorityStandard );
hgs
parents:
diff changeset
   527
    CleanupStack::PushL( timer );
hgs
parents:
diff changeset
   528
    timer->Configure( KDelayWindow, KIntervalWindow );
hgs
parents:
diff changeset
   529
    timer->Start( KDelay, KInterval, TCallBack( AddTimestamp, &aTimestamps ) );
hgs
parents:
diff changeset
   530
    
hgs
parents:
diff changeset
   531
    // The execution will be pending here while active scheduler is running...
hgs
parents:
diff changeset
   532
hgs
parents:
diff changeset
   533
                            //    //  ___     _____
hgs
parents:
diff changeset
   534
    WaitL( KTestRunTime ); // // // //_ // //  //
hgs
parents:
diff changeset
   535
                          //_//_// //  // //  //
hgs
parents:
diff changeset
   536
hgs
parents:
diff changeset
   537
    // Clean up
hgs
parents:
diff changeset
   538
    timer->Cancel();
hgs
parents:
diff changeset
   539
    CleanupStack::PopAndDestroy( timer );
hgs
parents:
diff changeset
   540
    }
hgs
parents:
diff changeset
   541
hgs
parents:
diff changeset
   542
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   543
// TEST CASE: Start timer with NULL callback 
hgs
parents:
diff changeset
   544
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   545
//
hgs
parents:
diff changeset
   546
template<class startType>
hgs
parents:
diff changeset
   547
TInt CTestFlexPeriodic::StartWithNullCallBackL(
hgs
parents:
diff changeset
   548
    TTestResult& aResult, 
hgs
parents:
diff changeset
   549
    CTestFlexTimer* aCallback )
hgs
parents:
diff changeset
   550
    {
hgs
parents:
diff changeset
   551
    __UHEAP_MARK;
hgs
parents:
diff changeset
   552
hgs
parents:
diff changeset
   553
    // Constants
hgs
parents:
diff changeset
   554
    const startType KTimerDelay( 1000000 );
hgs
parents:
diff changeset
   555
    const startType KTimerInterval( 1000000 );
hgs
parents:
diff changeset
   556
hgs
parents:
diff changeset
   557
    TInt(* nullCallback)(TAny*) = NULL;
hgs
parents:
diff changeset
   558
    
hgs
parents:
diff changeset
   559
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
   560
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
   561
hgs
parents:
diff changeset
   562
    // ConfigureAndStartTimerL should panic:
hgs
parents:
diff changeset
   563
    //  Category: "CFlexPeriodic" 
hgs
parents:
diff changeset
   564
    //  Reason:   31 (EFlexPeriodicCallbackFunctionIsNull)
hgs
parents:
diff changeset
   565
    // Set the panic code to acceptable exit reason
hgs
parents:
diff changeset
   566
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::EPanic, 31 );
hgs
parents:
diff changeset
   567
    
hgs
parents:
diff changeset
   568
    CFlexPeriodic* timer = CFlexPeriodic::NewL( CActive::EPriorityStandard );
hgs
parents:
diff changeset
   569
    CleanupStack::PushL( timer );
hgs
parents:
diff changeset
   570
    timer->Start( 
hgs
parents:
diff changeset
   571
        KTimerDelay, 
hgs
parents:
diff changeset
   572
        KTimerInterval, 
hgs
parents:
diff changeset
   573
        TCallBack( nullCallback, NULL ) );
hgs
parents:
diff changeset
   574
hgs
parents:
diff changeset
   575
    // No panic, change result back to normal
hgs
parents:
diff changeset
   576
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::ENormal, KErrNone );
hgs
parents:
diff changeset
   577
    aResult.SetResult( KErrGeneral, _L("Test case failed. No panic.") );
hgs
parents:
diff changeset
   578
    
hgs
parents:
diff changeset
   579
    // Clean up
hgs
parents:
diff changeset
   580
    timer->Cancel();
hgs
parents:
diff changeset
   581
    CleanupStack::PopAndDestroy( timer );
hgs
parents:
diff changeset
   582
hgs
parents:
diff changeset
   583
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
   584
hgs
parents:
diff changeset
   585
    return KErrNone;
hgs
parents:
diff changeset
   586
    }
hgs
parents:
diff changeset
   587
hgs
parents:
diff changeset
   588
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   589
// Panic thread after a few seconds
hgs
parents:
diff changeset
   590
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   591
//
hgs
parents:
diff changeset
   592
TInt CTestFlexPeriodic::DoPanicL(
hgs
parents:
diff changeset
   593
    TTestResult& aResult, 
hgs
parents:
diff changeset
   594
    CTestFlexTimer* /* aCallback */ )
hgs
parents:
diff changeset
   595
    {
hgs
parents:
diff changeset
   596
    __UHEAP_MARK;
hgs
parents:
diff changeset
   597
hgs
parents:
diff changeset
   598
    // Constants
hgs
parents:
diff changeset
   599
    const TTimeIntervalMicroSeconds32 KTimerDelay( 1000000 );
hgs
parents:
diff changeset
   600
    const TTimeIntervalMicroSeconds32 KTimerInterval( 1000000 );
hgs
parents:
diff changeset
   601
    const TTimeIntervalMicroSeconds32 KTestRunTime( 3000000 );
hgs
parents:
diff changeset
   602
hgs
parents:
diff changeset
   603
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
   604
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
   605
hgs
parents:
diff changeset
   606
    CFlexPeriodic* timer = CFlexPeriodic::NewL( CActive::EPriorityStandard );
hgs
parents:
diff changeset
   607
    CleanupStack::PushL( timer );
hgs
parents:
diff changeset
   608
    timer->Start( 
hgs
parents:
diff changeset
   609
        KTimerDelay, 
hgs
parents:
diff changeset
   610
        KTimerInterval, 
hgs
parents:
diff changeset
   611
        TCallBack( DoNothing, NULL ) );
hgs
parents:
diff changeset
   612
hgs
parents:
diff changeset
   613
                            //    //  ___     _____
hgs
parents:
diff changeset
   614
    WaitL( KTestRunTime ); // // // //_ // //  //
hgs
parents:
diff changeset
   615
                          //_//_// //  // //  //
hgs
parents:
diff changeset
   616
hgs
parents:
diff changeset
   617
    User::Panic(_L("Die die die!"), 0xDEAD);
hgs
parents:
diff changeset
   618
hgs
parents:
diff changeset
   619
    // We should NEVER be here...
hgs
parents:
diff changeset
   620
    aResult.SetResult( KErrGeneral, _L("Test case failed. No panic.") );
hgs
parents:
diff changeset
   621
    
hgs
parents:
diff changeset
   622
    // Clean up
hgs
parents:
diff changeset
   623
    timer->Cancel();
hgs
parents:
diff changeset
   624
    CleanupStack::PopAndDestroy( timer );
hgs
parents:
diff changeset
   625
hgs
parents:
diff changeset
   626
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
   627
hgs
parents:
diff changeset
   628
    return KErrNone;
hgs
parents:
diff changeset
   629
    }
hgs
parents:
diff changeset
   630
hgs
parents:
diff changeset
   631
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   632
// ____ _  _ _  _    _ _  _    ___ _  _ ____ ____ ____ ___  
hgs
parents:
diff changeset
   633
// |__/ |  | |\ |    | |\ |     |  |__| |__/ |___ |__| |  \ 
hgs
parents:
diff changeset
   634
// |  \ |__| | \|    | | \|     |  |  | |  \ |___ |  | |__/ 
hgs
parents:
diff changeset
   635
//
hgs
parents:
diff changeset
   636
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   637
hgs
parents:
diff changeset
   638
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   639
// Run test case in own thread
hgs
parents:
diff changeset
   640
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   641
//
hgs
parents:
diff changeset
   642
TInt CTestFlexPeriodic::RunInThread( 
hgs
parents:
diff changeset
   643
    RThread& aThread, 
hgs
parents:
diff changeset
   644
    TTestCaseArguments& aArguments )
hgs
parents:
diff changeset
   645
    {
hgs
parents:
diff changeset
   646
    // RThread::Create() parameters
hgs
parents:
diff changeset
   647
    const TInt stackSize = 1024;
hgs
parents:
diff changeset
   648
    const TInt heapMinSize = 1024;
hgs
parents:
diff changeset
   649
    const TInt heapMaxSize = 1024;
hgs
parents:
diff changeset
   650
hgs
parents:
diff changeset
   651
    TBuf<8> processName;
hgs
parents:
diff changeset
   652
    processName.Format( _L("%x"), &aArguments.iResult );
hgs
parents:
diff changeset
   653
    
hgs
parents:
diff changeset
   654
    // Create the thread
hgs
parents:
diff changeset
   655
    TInt ret = aThread.Create(
hgs
parents:
diff changeset
   656
        processName,
hgs
parents:
diff changeset
   657
        RunTestCase, 
hgs
parents:
diff changeset
   658
        stackSize,
hgs
parents:
diff changeset
   659
        heapMinSize,
hgs
parents:
diff changeset
   660
        heapMaxSize,
hgs
parents:
diff changeset
   661
        &aArguments,
hgs
parents:
diff changeset
   662
        EOwnerProcess );
hgs
parents:
diff changeset
   663
hgs
parents:
diff changeset
   664
    // Start execution of the thread
hgs
parents:
diff changeset
   665
    aThread.Resume();
hgs
parents:
diff changeset
   666
hgs
parents:
diff changeset
   667
    return ret;
hgs
parents:
diff changeset
   668
    }
hgs
parents:
diff changeset
   669
hgs
parents:
diff changeset
   670
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   671
// Create cleanup stack
hgs
parents:
diff changeset
   672
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   673
//
hgs
parents:
diff changeset
   674
TInt CTestFlexPeriodic::RunTestCase( TAny* aArgument )
hgs
parents:
diff changeset
   675
    {
hgs
parents:
diff changeset
   676
    CTrapCleanup* cleanup = CTrapCleanup::New();
hgs
parents:
diff changeset
   677
hgs
parents:
diff changeset
   678
    // Out of memory assert
hgs
parents:
diff changeset
   679
    __ASSERT_ALWAYS(
hgs
parents:
diff changeset
   680
        cleanup != NULL, 
hgs
parents:
diff changeset
   681
        User::Panic( KTestFlexTimerPanicCategory, KErrNoMemory ) );
hgs
parents:
diff changeset
   682
    
hgs
parents:
diff changeset
   683
    TRAPD( err, CTestFlexPeriodic::RunTestCaseL( aArgument ) );
hgs
parents:
diff changeset
   684
hgs
parents:
diff changeset
   685
    delete cleanup;
hgs
parents:
diff changeset
   686
    return err;
hgs
parents:
diff changeset
   687
    }
hgs
parents:
diff changeset
   688
hgs
parents:
diff changeset
   689
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   690
// Create scheduler and run the test case
hgs
parents:
diff changeset
   691
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   692
//
hgs
parents:
diff changeset
   693
void CTestFlexPeriodic::RunTestCaseL( TAny* aArgument )
hgs
parents:
diff changeset
   694
    {
hgs
parents:
diff changeset
   695
    // Create and install active scheduler
hgs
parents:
diff changeset
   696
    CActiveScheduler* scheduler = scheduler = new (ELeave) CActiveScheduler;
hgs
parents:
diff changeset
   697
    CleanupStack::PushL( scheduler );
hgs
parents:
diff changeset
   698
    CActiveScheduler::Install( scheduler );
hgs
parents:
diff changeset
   699
    
hgs
parents:
diff changeset
   700
    // Parse the arguments
hgs
parents:
diff changeset
   701
    TTestCaseArguments* args = reinterpret_cast<TTestCaseArguments*>( aArgument );
hgs
parents:
diff changeset
   702
    
hgs
parents:
diff changeset
   703
    // Call the function pointer with given arguments
hgs
parents:
diff changeset
   704
    TInt ret = (*(args->iTestFunction))(args->iResult, args->iCallback );
hgs
parents:
diff changeset
   705
    User::LeaveIfError( ret );
hgs
parents:
diff changeset
   706
hgs
parents:
diff changeset
   707
    // Clean up
hgs
parents:
diff changeset
   708
    CleanupStack::PopAndDestroy( scheduler );
hgs
parents:
diff changeset
   709
    }
hgs
parents:
diff changeset
   710
hgs
parents:
diff changeset
   711
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   712
// ___ ____ ____ ___    ____ ____ ____ ____ ____ 
hgs
parents:
diff changeset
   713
//  |  |___ [__   |     |    |__| [__  |___ [__  
hgs
parents:
diff changeset
   714
//  |  |___ ___]  |     |___ |  | ___] |___ ___] 
hgs
parents:
diff changeset
   715
//
hgs
parents:
diff changeset
   716
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   717
hgs
parents:
diff changeset
   718
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   719
// TEST CASE: Start one CFlexPeriodic and wait for few expirations.
hgs
parents:
diff changeset
   720
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   721
//
hgs
parents:
diff changeset
   722
TInt CTestFlexPeriodic::StartOneTimerL( 
hgs
parents:
diff changeset
   723
        TTestResult& aResult, 
hgs
parents:
diff changeset
   724
        CTestFlexTimer* /* aCallback */ )
hgs
parents:
diff changeset
   725
    {
hgs
parents:
diff changeset
   726
    __UHEAP_MARK;
hgs
parents:
diff changeset
   727
hgs
parents:
diff changeset
   728
    // Constants
hgs
parents:
diff changeset
   729
    const TTimeIntervalMicroSeconds32 KTickInterval( 1000000 ); // 1 sec
hgs
parents:
diff changeset
   730
    const TUint KTestRunTime( 5000000 );
hgs
parents:
diff changeset
   731
hgs
parents:
diff changeset
   732
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
   733
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
   734
hgs
parents:
diff changeset
   735
    // Storage for flexible periodic timer timestamps
hgs
parents:
diff changeset
   736
    RArray<TTime> timestamps;
hgs
parents:
diff changeset
   737
hgs
parents:
diff changeset
   738
    // Create and start the flexible periodic timer
hgs
parents:
diff changeset
   739
    CFlexPeriodic* timer = CFlexPeriodic::NewL( CActive::EPriorityStandard );
hgs
parents:
diff changeset
   740
    CleanupStack::PushL( timer );
hgs
parents:
diff changeset
   741
    timer->Start( 
hgs
parents:
diff changeset
   742
        KTickInterval, 
hgs
parents:
diff changeset
   743
        KTickInterval, 
hgs
parents:
diff changeset
   744
        TCallBack( AddTimestamp, &timestamps ) );
hgs
parents:
diff changeset
   745
hgs
parents:
diff changeset
   746
    // Initialize timer expiration time array with starting time to 
hgs
parents:
diff changeset
   747
    // ease analysing of data.
hgs
parents:
diff changeset
   748
    TTime startTime;
hgs
parents:
diff changeset
   749
    startTime.UniversalTime();
hgs
parents:
diff changeset
   750
    timestamps.Append( startTime );
hgs
parents:
diff changeset
   751
    
hgs
parents:
diff changeset
   752
    // The execution will be pending here while active scheduler is running...
hgs
parents:
diff changeset
   753
hgs
parents:
diff changeset
   754
                            //    //  ___     _____
hgs
parents:
diff changeset
   755
    WaitL( KTestRunTime ); // // // //_ // //  //
hgs
parents:
diff changeset
   756
                          //_//_// //  // //  //
hgs
parents:
diff changeset
   757
hgs
parents:
diff changeset
   758
    // Analyze results
hgs
parents:
diff changeset
   759
    aResult.SetResult( KErrNone, _L("Test case passed") );
hgs
parents:
diff changeset
   760
hgs
parents:
diff changeset
   761
    // Only start time in timestamp array
hgs
parents:
diff changeset
   762
    if ( timestamps.Count() == 1 )
hgs
parents:
diff changeset
   763
        {
hgs
parents:
diff changeset
   764
        aResult.SetResult( 
hgs
parents:
diff changeset
   765
            KErrGeneral, 
hgs
parents:
diff changeset
   766
            _L("Test case failed. No timer expired.") );
hgs
parents:
diff changeset
   767
        }
hgs
parents:
diff changeset
   768
hgs
parents:
diff changeset
   769
    // Check that the timers are expired at maximum delay due there are only
hgs
parents:
diff changeset
   770
    // one timer, so, no alignment can be happened.
hgs
parents:
diff changeset
   771
    if ( !AreTimestampsAtWindow( timestamps, KTickInterval, KTickInterval, 0, 0 ) )
hgs
parents:
diff changeset
   772
        {
hgs
parents:
diff changeset
   773
        aResult.SetResult( 
hgs
parents:
diff changeset
   774
            KErrGeneral, 
hgs
parents:
diff changeset
   775
            _L("Test case failed. Timer not in maximum window.") );
hgs
parents:
diff changeset
   776
        }
hgs
parents:
diff changeset
   777
hgs
parents:
diff changeset
   778
    // Clean up
hgs
parents:
diff changeset
   779
    timer->Cancel();
hgs
parents:
diff changeset
   780
    timestamps.Close();
hgs
parents:
diff changeset
   781
    CleanupStack::PopAndDestroy( timer );
hgs
parents:
diff changeset
   782
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
   783
hgs
parents:
diff changeset
   784
    return KErrNone;
hgs
parents:
diff changeset
   785
    }
hgs
parents:
diff changeset
   786
hgs
parents:
diff changeset
   787
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   788
// TEST CASE: Start one CFlexPeriodic and wait for few expirations.
hgs
parents:
diff changeset
   789
// Give also Error callback function.
hgs
parents:
diff changeset
   790
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   791
//
hgs
parents:
diff changeset
   792
TInt CTestFlexPeriodic::StartOneTimerWithErrorCbL( 
hgs
parents:
diff changeset
   793
        TTestResult& aResult, 
hgs
parents:
diff changeset
   794
        CTestFlexTimer* /* aCallback */ )
hgs
parents:
diff changeset
   795
    {
hgs
parents:
diff changeset
   796
    __UHEAP_MARK;
hgs
parents:
diff changeset
   797
hgs
parents:
diff changeset
   798
    // Constants
hgs
parents:
diff changeset
   799
    const TTimeIntervalMicroSeconds32 KTickInterval( 1000000 ); // 1 sec
hgs
parents:
diff changeset
   800
    const TUint KTestRunTime( 5000000 );
hgs
parents:
diff changeset
   801
hgs
parents:
diff changeset
   802
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
   803
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
   804
hgs
parents:
diff changeset
   805
    // Storage for flexible periodic timer timestamps
hgs
parents:
diff changeset
   806
    RArray<TTime> timestamps;
hgs
parents:
diff changeset
   807
hgs
parents:
diff changeset
   808
    // Create and start the flexible periodic timer
hgs
parents:
diff changeset
   809
    CFlexPeriodic* timer = CFlexPeriodic::NewL( CActive::EPriorityStandard );
hgs
parents:
diff changeset
   810
    CleanupStack::PushL( timer );
hgs
parents:
diff changeset
   811
    timer->Start( 
hgs
parents:
diff changeset
   812
        KTickInterval, 
hgs
parents:
diff changeset
   813
        KTickInterval, 
hgs
parents:
diff changeset
   814
        TCallBack( AddTimestamp, &timestamps ),
hgs
parents:
diff changeset
   815
        TCallBack( PanicClient, NULL ) );
hgs
parents:
diff changeset
   816
hgs
parents:
diff changeset
   817
    // Initialize timer expiration time array with starting time to 
hgs
parents:
diff changeset
   818
    // ease analysing of data.
hgs
parents:
diff changeset
   819
    TTime startTime;
hgs
parents:
diff changeset
   820
    startTime.UniversalTime();
hgs
parents:
diff changeset
   821
    timestamps.Append( startTime );
hgs
parents:
diff changeset
   822
    
hgs
parents:
diff changeset
   823
    // The execution will be pending here while active scheduler is running...
hgs
parents:
diff changeset
   824
hgs
parents:
diff changeset
   825
                            //    //  ___     _____
hgs
parents:
diff changeset
   826
    WaitL( KTestRunTime ); // // // //_ // //  //
hgs
parents:
diff changeset
   827
                          //_//_// //  // //  //
hgs
parents:
diff changeset
   828
hgs
parents:
diff changeset
   829
    // Analyze results
hgs
parents:
diff changeset
   830
    aResult.SetResult( KErrNone, _L("Test case passed") );
hgs
parents:
diff changeset
   831
hgs
parents:
diff changeset
   832
    // Only start time in timestamp array
hgs
parents:
diff changeset
   833
    if ( timestamps.Count() == 1 )
hgs
parents:
diff changeset
   834
        {
hgs
parents:
diff changeset
   835
        aResult.SetResult( 
hgs
parents:
diff changeset
   836
            KErrGeneral, 
hgs
parents:
diff changeset
   837
            _L("Test case failed. No timer expired.") );
hgs
parents:
diff changeset
   838
        }
hgs
parents:
diff changeset
   839
hgs
parents:
diff changeset
   840
    // Check that the timers are expired at maximum delay due there are only
hgs
parents:
diff changeset
   841
    // one timer, so, no alignment can be happened.
hgs
parents:
diff changeset
   842
    if ( !AreTimestampsAtWindow( timestamps, KTickInterval, KTickInterval, 0, 0 ) )
hgs
parents:
diff changeset
   843
        {
hgs
parents:
diff changeset
   844
        aResult.SetResult( 
hgs
parents:
diff changeset
   845
            KErrGeneral, 
hgs
parents:
diff changeset
   846
            _L("Test case failed. Timer not in maximum window.") );
hgs
parents:
diff changeset
   847
        }
hgs
parents:
diff changeset
   848
hgs
parents:
diff changeset
   849
    // Clean up
hgs
parents:
diff changeset
   850
    timer->Cancel();
hgs
parents:
diff changeset
   851
    timestamps.Close();
hgs
parents:
diff changeset
   852
    CleanupStack::PopAndDestroy( timer );
hgs
parents:
diff changeset
   853
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
   854
hgs
parents:
diff changeset
   855
    return KErrNone;
hgs
parents:
diff changeset
   856
    }
hgs
parents:
diff changeset
   857
hgs
parents:
diff changeset
   858
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   859
// TEST CASE: Start one CFlexPeriodic, cancel it and restart it in callback
hgs
parents:
diff changeset
   860
// function.
hgs
parents:
diff changeset
   861
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   862
//
hgs
parents:
diff changeset
   863
TInt CTestFlexPeriodic::CallbackRestartL( 
hgs
parents:
diff changeset
   864
    TTestResult& aResult, 
hgs
parents:
diff changeset
   865
    CTestFlexTimer* /* aCallback */ )
hgs
parents:
diff changeset
   866
    {
hgs
parents:
diff changeset
   867
    __UHEAP_MARK;
hgs
parents:
diff changeset
   868
hgs
parents:
diff changeset
   869
    // Constants
hgs
parents:
diff changeset
   870
    const TTimeIntervalMicroSeconds KTickInterval( 1000000 ); // 1 sec
hgs
parents:
diff changeset
   871
    const TTimeIntervalMicroSeconds KTick2ndInterval( 2000000 ); // 2 sec
hgs
parents:
diff changeset
   872
    const TUint KTestRunTime( 10000000 );
hgs
parents:
diff changeset
   873
hgs
parents:
diff changeset
   874
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
   875
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
   876
hgs
parents:
diff changeset
   877
    RArray<TTime> firstTimestamps;
hgs
parents:
diff changeset
   878
    RArray<TTime> secondTimestamps;
hgs
parents:
diff changeset
   879
hgs
parents:
diff changeset
   880
    TRestartInfo info;
hgs
parents:
diff changeset
   881
    info.iTimer = CFlexPeriodic::NewL( CActive::EPriorityStandard );
hgs
parents:
diff changeset
   882
    info.iFirstTicksLeft = 1;
hgs
parents:
diff changeset
   883
    info.iFirstTimestamps = &firstTimestamps;
hgs
parents:
diff changeset
   884
    info.iSecondTimestamps = &secondTimestamps;
hgs
parents:
diff changeset
   885
    info.iSecondInterval = KTick2ndInterval;
hgs
parents:
diff changeset
   886
hgs
parents:
diff changeset
   887
    // Create and start the flexible periodic timer
hgs
parents:
diff changeset
   888
    CleanupStack::PushL( info.iTimer );
hgs
parents:
diff changeset
   889
    info.iTimer->Start( 
hgs
parents:
diff changeset
   890
        KTickInterval, 
hgs
parents:
diff changeset
   891
        KTickInterval, 
hgs
parents:
diff changeset
   892
        TCallBack( RestartTimer, &info ) );
hgs
parents:
diff changeset
   893
hgs
parents:
diff changeset
   894
    // Initialize timer expiration time array with starting time to 
hgs
parents:
diff changeset
   895
    // ease analysing of data.
hgs
parents:
diff changeset
   896
    TTime startTime;
hgs
parents:
diff changeset
   897
    startTime.UniversalTime();
hgs
parents:
diff changeset
   898
    firstTimestamps.Append( startTime );
hgs
parents:
diff changeset
   899
    
hgs
parents:
diff changeset
   900
    // The execution will be pending here while active scheduler is running...
hgs
parents:
diff changeset
   901
hgs
parents:
diff changeset
   902
                            //    //  ___     _____
hgs
parents:
diff changeset
   903
    WaitL( KTestRunTime ); // // // //_ // //  //
hgs
parents:
diff changeset
   904
                          //_//_// //  // //  //
hgs
parents:
diff changeset
   905
hgs
parents:
diff changeset
   906
    // Analyze results
hgs
parents:
diff changeset
   907
    aResult.SetResult( KErrNone, _L("Test case passed") );
hgs
parents:
diff changeset
   908
hgs
parents:
diff changeset
   909
    // Check the 1st timer expiration time
hgs
parents:
diff changeset
   910
    if ( !AreTimestampsAtWindow( firstTimestamps, KTickInterval, KTickInterval, 0, 0 ) )
hgs
parents:
diff changeset
   911
        {
hgs
parents:
diff changeset
   912
        aResult.SetResult( 
hgs
parents:
diff changeset
   913
            KErrGeneral, 
hgs
parents:
diff changeset
   914
            _L("Test case failed. Pre-reset timer not in maximum window.") );
hgs
parents:
diff changeset
   915
        }
hgs
parents:
diff changeset
   916
    
hgs
parents:
diff changeset
   917
    // Check the rest of timers
hgs
parents:
diff changeset
   918
    else if ( !AreTimestampsAtWindow( secondTimestamps, KTick2ndInterval, KTick2ndInterval, 0, 0 ) )
hgs
parents:
diff changeset
   919
        {
hgs
parents:
diff changeset
   920
        aResult.SetResult( 
hgs
parents:
diff changeset
   921
            KErrGeneral, 
hgs
parents:
diff changeset
   922
            _L("Test case failed. Post-reset timer not in maximum window.") );
hgs
parents:
diff changeset
   923
        }
hgs
parents:
diff changeset
   924
    
hgs
parents:
diff changeset
   925
    // Clean up
hgs
parents:
diff changeset
   926
    info.iTimer->Cancel();
hgs
parents:
diff changeset
   927
    firstTimestamps.Close();
hgs
parents:
diff changeset
   928
    secondTimestamps.Close();
hgs
parents:
diff changeset
   929
    CleanupStack::PopAndDestroy( info.iTimer );
hgs
parents:
diff changeset
   930
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
   931
hgs
parents:
diff changeset
   932
    return KErrNone;
hgs
parents:
diff changeset
   933
    }
hgs
parents:
diff changeset
   934
hgs
parents:
diff changeset
   935
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   936
// TEST CASE: Configure window sizes - 32 bit
hgs
parents:
diff changeset
   937
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   938
//
hgs
parents:
diff changeset
   939
TInt CTestFlexPeriodic::ConfigureWindow32L( 
hgs
parents:
diff changeset
   940
    TTestResult& aResult, 
hgs
parents:
diff changeset
   941
    CTestFlexTimer* /* aCallback */ )
hgs
parents:
diff changeset
   942
    {
hgs
parents:
diff changeset
   943
    return ConfigureWindowL<TTimeIntervalMicroSeconds32,TTimeIntervalMicroSeconds32>( aResult );
hgs
parents:
diff changeset
   944
    }
hgs
parents:
diff changeset
   945
hgs
parents:
diff changeset
   946
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   947
// TEST CASE: Configure window sizes - 64 bit
hgs
parents:
diff changeset
   948
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   949
//
hgs
parents:
diff changeset
   950
TInt CTestFlexPeriodic::ConfigureWindow64L(
hgs
parents:
diff changeset
   951
    TTestResult& aResult, 
hgs
parents:
diff changeset
   952
    CTestFlexTimer* /* aCallback */ )
hgs
parents:
diff changeset
   953
    {
hgs
parents:
diff changeset
   954
    return ConfigureWindowL<TTimeIntervalMicroSeconds,TTimeIntervalMicroSeconds>( aResult );
hgs
parents:
diff changeset
   955
    }
hgs
parents:
diff changeset
   956
hgs
parents:
diff changeset
   957
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   958
// OK TEST CASE: Configure window sizes - mixed 32 bit and 64 bit
hgs
parents:
diff changeset
   959
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   960
//
hgs
parents:
diff changeset
   961
TInt CTestFlexPeriodic::ConfigureWindowMixL(
hgs
parents:
diff changeset
   962
    TTestResult& aResult, 
hgs
parents:
diff changeset
   963
    CTestFlexTimer* /* aCallback */ )
hgs
parents:
diff changeset
   964
    {
hgs
parents:
diff changeset
   965
    return ConfigureWindowL<TTimeIntervalMicroSeconds32,TTimeIntervalMicroSeconds>( aResult );
hgs
parents:
diff changeset
   966
    }
hgs
parents:
diff changeset
   967
hgs
parents:
diff changeset
   968
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   969
// TEST CASE: Configure after timer has started 
hgs
parents:
diff changeset
   970
// The test case is divided into following parts:
hgs
parents:
diff changeset
   971
// 1) Remove slack from the heartbeat to make it sure that timer's default
hgs
parents:
diff changeset
   972
//    windows does not cause the drifting of the timer.
hgs
parents:
diff changeset
   973
// 2) Start timer, try to configure it, verify that configure has not been
hgs
parents:
diff changeset
   974
//    changed (no alignment should be made by heartbeat)
hgs
parents:
diff changeset
   975
// 3) Cancel the timer and start it with a callback that tries to configure
hgs
parents:
diff changeset
   976
//    it while in callback, check the results
hgs
parents:
diff changeset
   977
// 4) Verify that the configuration stil works by happened timer alignment
hgs
parents:
diff changeset
   978
//    by the heartbeat
hgs
parents:
diff changeset
   979
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   980
//
hgs
parents:
diff changeset
   981
TInt CTestFlexPeriodic::ConfigureAfterStartL(
hgs
parents:
diff changeset
   982
    TTestResult& aResult, 
hgs
parents:
diff changeset
   983
    CTestFlexTimer* /* aCallback */ )
hgs
parents:
diff changeset
   984
    {
hgs
parents:
diff changeset
   985
    __UHEAP_MARK;
hgs
parents:
diff changeset
   986
hgs
parents:
diff changeset
   987
    // Constants
hgs
parents:
diff changeset
   988
    
hgs
parents:
diff changeset
   989
    // Heartbeat timer
hgs
parents:
diff changeset
   990
    // Use 1us to adjust the engine's timer. 0 returns immediately.
hgs
parents:
diff changeset
   991
    const TTimeIntervalMicroSeconds32 KHeartbeatDelay( 1 );
hgs
parents:
diff changeset
   992
    const TTimeIntervalMicroSeconds32 KHeartbeatInterval( 1000000 );
hgs
parents:
diff changeset
   993
    const TTimeIntervalMicroSeconds32 KHeartbeatDelayWindow( 0 );
hgs
parents:
diff changeset
   994
    const TTimeIntervalMicroSeconds32 KHeartbeatIntervalWindow( 0 );
hgs
parents:
diff changeset
   995
hgs
parents:
diff changeset
   996
    // Timer under test
hgs
parents:
diff changeset
   997
    const TTimeIntervalMicroSeconds32 KTimerDelayNow( 0 );
hgs
parents:
diff changeset
   998
    const TTimeIntervalMicroSeconds32 KTimerDelay( 2000000 );
hgs
parents:
diff changeset
   999
    const TTimeIntervalMicroSeconds32 KTimerInterval( 2000000 );
hgs
parents:
diff changeset
  1000
    const TTimeIntervalMicroSeconds32 KTimerInitialDelayWindow( 0 );
hgs
parents:
diff changeset
  1001
    const TTimeIntervalMicroSeconds32 KTimerInitialIntervalWindow( 0 );
hgs
parents:
diff changeset
  1002
hgs
parents:
diff changeset
  1003
    const TTimeIntervalMicroSeconds32 KTimerDelayWindow32( 1500000 );
hgs
parents:
diff changeset
  1004
    const TTimeIntervalMicroSeconds32 KTimerIntervalWindow32( 1500000 );
hgs
parents:
diff changeset
  1005
hgs
parents:
diff changeset
  1006
    const TTimeIntervalMicroSeconds KTimerDelayWindow64( 1500000 );
hgs
parents:
diff changeset
  1007
    const TTimeIntervalMicroSeconds KTimerIntervalWindow64( 1500000 );
hgs
parents:
diff changeset
  1008
    
hgs
parents:
diff changeset
  1009
    const TUint KConfigNokTestRunTime( 7000000 );
hgs
parents:
diff changeset
  1010
    const TUint KTestCbConfigRunTime( KHeartbeatInterval.Int() );
hgs
parents:
diff changeset
  1011
    const TUint KConfigOkTestRunTime( 4000000 );
hgs
parents:
diff changeset
  1012
    
hgs
parents:
diff changeset
  1013
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
  1014
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
  1015
    
hgs
parents:
diff changeset
  1016
    // Create, configure and initialize and start the heartbeat
hgs
parents:
diff changeset
  1017
    // This timer is used for checking that the timer under test is reacting
hgs
parents:
diff changeset
  1018
    // correctly to configurations.
hgs
parents:
diff changeset
  1019
    RArray<TTime> heartbeatTimes;
hgs
parents:
diff changeset
  1020
    CFlexPeriodic* heartbeat = CFlexPeriodic::NewL( CActive::EPriorityStandard );
hgs
parents:
diff changeset
  1021
    CleanupStack::PushL( heartbeat );
hgs
parents:
diff changeset
  1022
    heartbeat->Configure( KHeartbeatDelayWindow, KHeartbeatIntervalWindow );
hgs
parents:
diff changeset
  1023
    heartbeat->Start( 
hgs
parents:
diff changeset
  1024
        KHeartbeatDelay, 
hgs
parents:
diff changeset
  1025
        KHeartbeatInterval, 
hgs
parents:
diff changeset
  1026
        TCallBack( AddTimestamp, &heartbeatTimes ) );
hgs
parents:
diff changeset
  1027
hgs
parents:
diff changeset
  1028
    // Remove the slack from timer start up -- wait till next second
hgs
parents:
diff changeset
  1029
    const TInt64 KSecondInMicroSeconds( 1000000 );
hgs
parents:
diff changeset
  1030
    TTime now;
hgs
parents:
diff changeset
  1031
    now.UniversalTime();
hgs
parents:
diff changeset
  1032
    heartbeatTimes.Append( now );
hgs
parents:
diff changeset
  1033
    TUint slack( I64LOW( KSecondInMicroSeconds - now.Int64() % KSecondInMicroSeconds ) );
hgs
parents:
diff changeset
  1034
hgs
parents:
diff changeset
  1035
                     //    //  ___     _____
hgs
parents:
diff changeset
  1036
    WaitL( slack ); // // // //_ // //  //
hgs
parents:
diff changeset
  1037
                   //_//_// //  // //  //
hgs
parents:
diff changeset
  1038
hgs
parents:
diff changeset
  1039
    // Create and start the flexible periodic timer
hgs
parents:
diff changeset
  1040
    RArray<TTime> timestamps;
hgs
parents:
diff changeset
  1041
    CFlexPeriodic* timer = CFlexPeriodic::NewL( CActive::EPriorityStandard );
hgs
parents:
diff changeset
  1042
    CleanupStack::PushL( timer );
hgs
parents:
diff changeset
  1043
    timer->Configure( KTimerInitialDelayWindow, KTimerInitialIntervalWindow );
hgs
parents:
diff changeset
  1044
    timer->Start( 
hgs
parents:
diff changeset
  1045
        KTimerDelay, 
hgs
parents:
diff changeset
  1046
        KTimerInterval, 
hgs
parents:
diff changeset
  1047
        TCallBack( AddTimestamp, &timestamps ) );
hgs
parents:
diff changeset
  1048
hgs
parents:
diff changeset
  1049
    aResult.SetResult( KErrNone, _L("Test case passed") );
hgs
parents:
diff changeset
  1050
hgs
parents:
diff changeset
  1051
    if ( timer->Configure( KTimerDelayWindow32, KTimerIntervalWindow32 ) != KErrInUse )
hgs
parents:
diff changeset
  1052
        {
hgs
parents:
diff changeset
  1053
        aResult.SetResult( 
hgs
parents:
diff changeset
  1054
            KErrGeneral, 
hgs
parents:
diff changeset
  1055
            _L("Test case failed. 32 bit configure didn't return KErrInUse") );
hgs
parents:
diff changeset
  1056
        }
hgs
parents:
diff changeset
  1057
    else if ( timer->Configure( KTimerDelayWindow64, KTimerIntervalWindow64 ) != KErrInUse )
hgs
parents:
diff changeset
  1058
        {
hgs
parents:
diff changeset
  1059
        aResult.SetResult( 
hgs
parents:
diff changeset
  1060
            KErrGeneral, 
hgs
parents:
diff changeset
  1061
            _L("Test case failed. 64 bit configure didn't return KErrInUse") );
hgs
parents:
diff changeset
  1062
        }
hgs
parents:
diff changeset
  1063
hgs
parents:
diff changeset
  1064
    // Initialize timer expiration time array with starting time to 
hgs
parents:
diff changeset
  1065
    // ease analysing of data.
hgs
parents:
diff changeset
  1066
    now.UniversalTime();
hgs
parents:
diff changeset
  1067
    timestamps.Append( now );
hgs
parents:
diff changeset
  1068
                                     //    //  ___     _____
hgs
parents:
diff changeset
  1069
    WaitL( KConfigNokTestRunTime ); // // // //_ // //  //
hgs
parents:
diff changeset
  1070
                                   //_//_// //  // //  //
hgs
parents:
diff changeset
  1071
hgs
parents:
diff changeset
  1072
    // Check the 1st timer expiration time
hgs
parents:
diff changeset
  1073
    RDebug::Print( _L("Timer:") );
hgs
parents:
diff changeset
  1074
    if ( !AreTimestampsAtWindow( 
hgs
parents:
diff changeset
  1075
            timestamps, 
hgs
parents:
diff changeset
  1076
            KTimerDelay,
hgs
parents:
diff changeset
  1077
            KTimerInterval,
hgs
parents:
diff changeset
  1078
            KTimerInitialDelayWindow,
hgs
parents:
diff changeset
  1079
            KTimerInitialIntervalWindow ) )
hgs
parents:
diff changeset
  1080
        {
hgs
parents:
diff changeset
  1081
        aResult.SetResult( 
hgs
parents:
diff changeset
  1082
            KErrGeneral, 
hgs
parents:
diff changeset
  1083
            _L("Test case failed. Configuration changed after start. ") );
hgs
parents:
diff changeset
  1084
        }
hgs
parents:
diff changeset
  1085
hgs
parents:
diff changeset
  1086
    // Restart the timer to try configuration while callback
hgs
parents:
diff changeset
  1087
    timer->Cancel();
hgs
parents:
diff changeset
  1088
hgs
parents:
diff changeset
  1089
    TConfigureInfo configInfo;
hgs
parents:
diff changeset
  1090
    configInfo.iTimer = timer;
hgs
parents:
diff changeset
  1091
    configInfo.iDelayWindow = KTimerDelayWindow32.Int();
hgs
parents:
diff changeset
  1092
    configInfo.iIntervalWindow = KTimerIntervalWindow32.Int();
hgs
parents:
diff changeset
  1093
    configInfo.iConfigResult32 = 0xDEADBEEF; // Initialize result
hgs
parents:
diff changeset
  1094
    configInfo.iConfigResult64 = 0xDEADBEEF; // Initialize result
hgs
parents:
diff changeset
  1095
hgs
parents:
diff changeset
  1096
    timer->Start(
hgs
parents:
diff changeset
  1097
        KTimerDelayNow, 
hgs
parents:
diff changeset
  1098
        KTimerInterval, 
hgs
parents:
diff changeset
  1099
        TCallBack( ConfigureTimer, &configInfo ) );
hgs
parents:
diff changeset
  1100
hgs
parents:
diff changeset
  1101
                                    //    //  ___     _____
hgs
parents:
diff changeset
  1102
    WaitL( KTestCbConfigRunTime ); // // // //_ // //  //
hgs
parents:
diff changeset
  1103
                                  //_//_// //  // //  //
hgs
parents:
diff changeset
  1104
hgs
parents:
diff changeset
  1105
    timer->Cancel();
hgs
parents:
diff changeset
  1106
hgs
parents:
diff changeset
  1107
    RDebug::Print( _L("configInfo.iConfigResult32=%d (0x%x)"), configInfo.iConfigResult32, configInfo.iConfigResult32 );
hgs
parents:
diff changeset
  1108
    RDebug::Print( _L("configInfo.iConfigResult64=%d (0x%x)"), configInfo.iConfigResult64, configInfo.iConfigResult64 );
hgs
parents:
diff changeset
  1109
hgs
parents:
diff changeset
  1110
    // Analyze the results
hgs
parents:
diff changeset
  1111
    if ( configInfo.iConfigResult32 != KErrInUse )
hgs
parents:
diff changeset
  1112
        {
hgs
parents:
diff changeset
  1113
        aResult.SetResult( 
hgs
parents:
diff changeset
  1114
            KErrGeneral, 
hgs
parents:
diff changeset
  1115
            _L("Test case failed. 32 bit configure in callback didn't return KErrInUse") );
hgs
parents:
diff changeset
  1116
        }
hgs
parents:
diff changeset
  1117
    else if ( configInfo.iConfigResult64 != KErrInUse )
hgs
parents:
diff changeset
  1118
        {
hgs
parents:
diff changeset
  1119
        aResult.SetResult( 
hgs
parents:
diff changeset
  1120
            KErrGeneral, 
hgs
parents:
diff changeset
  1121
            _L("Test case failed. 64 bit configure in callback didn't return KErrInUse") );
hgs
parents:
diff changeset
  1122
        }
hgs
parents:
diff changeset
  1123
hgs
parents:
diff changeset
  1124
    // Test that the configuration still works
hgs
parents:
diff changeset
  1125
    RArray<TTime> secondTimestamps;
hgs
parents:
diff changeset
  1126
    now.UniversalTime();
hgs
parents:
diff changeset
  1127
    secondTimestamps.Append( now );
hgs
parents:
diff changeset
  1128
hgs
parents:
diff changeset
  1129
    if ( timer->Configure( KTimerDelayWindow32, KTimerIntervalWindow32 ) != KErrNone )
hgs
parents:
diff changeset
  1130
        {
hgs
parents:
diff changeset
  1131
        aResult.SetResult( 
hgs
parents:
diff changeset
  1132
            KErrGeneral, 
hgs
parents:
diff changeset
  1133
            _L("Test case failed. Configure failed.") );
hgs
parents:
diff changeset
  1134
        }
hgs
parents:
diff changeset
  1135
    else
hgs
parents:
diff changeset
  1136
        {
hgs
parents:
diff changeset
  1137
        timer->Start(
hgs
parents:
diff changeset
  1138
            KTimerDelay,
hgs
parents:
diff changeset
  1139
            KTimerInterval,
hgs
parents:
diff changeset
  1140
            TCallBack( AddTimestamp, &secondTimestamps ));
hgs
parents:
diff changeset
  1141
hgs
parents:
diff changeset
  1142
                                        //    //  ___     _____
hgs
parents:
diff changeset
  1143
        WaitL( KConfigOkTestRunTime ); // // // //_ // //  //
hgs
parents:
diff changeset
  1144
                                      //_//_// //  // //  //
hgs
parents:
diff changeset
  1145
hgs
parents:
diff changeset
  1146
        // Check timestamps, they should be the same as heartbeat
hgs
parents:
diff changeset
  1147
        RDebug::Print( _L("secondTimestamps:") );
hgs
parents:
diff changeset
  1148
        if ( !AreTimestampsAtWindow( 
hgs
parents:
diff changeset
  1149
                secondTimestamps, 
hgs
parents:
diff changeset
  1150
                KHeartbeatInterval, // Heartbeat was running already 
hgs
parents:
diff changeset
  1151
                KHeartbeatInterval,
hgs
parents:
diff changeset
  1152
                KHeartbeatInterval, // There can be adjustement with 1st expiration 
hgs
parents:
diff changeset
  1153
                0 ) )
hgs
parents:
diff changeset
  1154
            {
hgs
parents:
diff changeset
  1155
            aResult.SetResult( 
hgs
parents:
diff changeset
  1156
                KErrGeneral, 
hgs
parents:
diff changeset
  1157
                _L("Test case failed. Configure does not work.") );
hgs
parents:
diff changeset
  1158
            }
hgs
parents:
diff changeset
  1159
        }
hgs
parents:
diff changeset
  1160
hgs
parents:
diff changeset
  1161
    RDebug::Print( _L("Heartbeat:") );
hgs
parents:
diff changeset
  1162
    if ( !AreTimestampsAtWindow( 
hgs
parents:
diff changeset
  1163
            heartbeatTimes, 
hgs
parents:
diff changeset
  1164
            KHeartbeatDelay,
hgs
parents:
diff changeset
  1165
            KHeartbeatInterval,
hgs
parents:
diff changeset
  1166
            KHeartbeatDelayWindow,
hgs
parents:
diff changeset
  1167
            KHeartbeatIntervalWindow ) )
hgs
parents:
diff changeset
  1168
        {
hgs
parents:
diff changeset
  1169
        aResult.SetResult( 
hgs
parents:
diff changeset
  1170
            KErrGeneral, 
hgs
parents:
diff changeset
  1171
            _L("Test case failed. Heartbeat failure.") );
hgs
parents:
diff changeset
  1172
        }
hgs
parents:
diff changeset
  1173
hgs
parents:
diff changeset
  1174
    // Clean up
hgs
parents:
diff changeset
  1175
    timestamps.Close();
hgs
parents:
diff changeset
  1176
    secondTimestamps.Close();
hgs
parents:
diff changeset
  1177
    timer->Cancel();
hgs
parents:
diff changeset
  1178
    CleanupStack::PopAndDestroy( timer );
hgs
parents:
diff changeset
  1179
hgs
parents:
diff changeset
  1180
    heartbeatTimes.Close();
hgs
parents:
diff changeset
  1181
    heartbeat->Cancel();
hgs
parents:
diff changeset
  1182
    CleanupStack::PopAndDestroy( heartbeat );
hgs
parents:
diff changeset
  1183
hgs
parents:
diff changeset
  1184
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
  1185
hgs
parents:
diff changeset
  1186
    return KErrNone;
hgs
parents:
diff changeset
  1187
    }
hgs
parents:
diff changeset
  1188
hgs
parents:
diff changeset
  1189
hgs
parents:
diff changeset
  1190
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1191
// TEST CASE: Start a running timer again.
hgs
parents:
diff changeset
  1192
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1193
//
hgs
parents:
diff changeset
  1194
TInt CTestFlexPeriodic::StartAfterStartL(
hgs
parents:
diff changeset
  1195
    TTestResult& aResult, 
hgs
parents:
diff changeset
  1196
    CTestFlexTimer* aCallback  )
hgs
parents:
diff changeset
  1197
    {
hgs
parents:
diff changeset
  1198
    __UHEAP_MARK;
hgs
parents:
diff changeset
  1199
hgs
parents:
diff changeset
  1200
    // Constants
hgs
parents:
diff changeset
  1201
    const TTimeIntervalMicroSeconds32 KTimerDelay( 2000000 );
hgs
parents:
diff changeset
  1202
    const TTimeIntervalMicroSeconds32 KTimerInterval( 2000000 );
hgs
parents:
diff changeset
  1203
hgs
parents:
diff changeset
  1204
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
  1205
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
  1206
hgs
parents:
diff changeset
  1207
    CFlexPeriodic* timer = CFlexPeriodic::NewL( CActive::EPriorityStandard );
hgs
parents:
diff changeset
  1208
    CleanupStack::PushL( timer );
hgs
parents:
diff changeset
  1209
hgs
parents:
diff changeset
  1210
    // This start should work...
hgs
parents:
diff changeset
  1211
    timer->Start( 
hgs
parents:
diff changeset
  1212
        KTimerDelay, 
hgs
parents:
diff changeset
  1213
        KTimerInterval, 
hgs
parents:
diff changeset
  1214
        TCallBack( DoNothing, NULL ) );
hgs
parents:
diff changeset
  1215
hgs
parents:
diff changeset
  1216
    // ... and next start should panic with
hgs
parents:
diff changeset
  1217
    // Panic category: "E32USER-CBase"
hgs
parents:
diff changeset
  1218
    // Panic reason:   42 (attempt to active CActive when a request is still 
hgs
parents:
diff changeset
  1219
    //                     outstanding)
hgs
parents:
diff changeset
  1220
    
hgs
parents:
diff changeset
  1221
    // Set panic code 42 to acceptable exit reason
hgs
parents:
diff changeset
  1222
    aCallback->TestModuleIf().SetExitReason( 
hgs
parents:
diff changeset
  1223
        CTestModuleIf::EPanic,
hgs
parents:
diff changeset
  1224
        42 );
hgs
parents:
diff changeset
  1225
hgs
parents:
diff changeset
  1226
    timer->Start( 
hgs
parents:
diff changeset
  1227
        KTimerDelay, 
hgs
parents:
diff changeset
  1228
        KTimerInterval, 
hgs
parents:
diff changeset
  1229
        TCallBack( DoNothing, NULL ) );
hgs
parents:
diff changeset
  1230
hgs
parents:
diff changeset
  1231
    // No panic, change result back to normal
hgs
parents:
diff changeset
  1232
    aCallback->TestModuleIf().SetExitReason( 
hgs
parents:
diff changeset
  1233
        CTestModuleIf::ENormal,
hgs
parents:
diff changeset
  1234
        KErrNone );
hgs
parents:
diff changeset
  1235
hgs
parents:
diff changeset
  1236
    aResult.SetResult( KErrGeneral, _L("Test case failed. No panic.") );
hgs
parents:
diff changeset
  1237
hgs
parents:
diff changeset
  1238
    // Clean up
hgs
parents:
diff changeset
  1239
    timer->Cancel();
hgs
parents:
diff changeset
  1240
    CleanupStack::PopAndDestroy( timer );
hgs
parents:
diff changeset
  1241
hgs
parents:
diff changeset
  1242
    __UHEAP_MARKEND;    
hgs
parents:
diff changeset
  1243
hgs
parents:
diff changeset
  1244
    return KErrNone;
hgs
parents:
diff changeset
  1245
    }
hgs
parents:
diff changeset
  1246
hgs
parents:
diff changeset
  1247
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1248
// TEST CASE: Start a running timer again in callback function
hgs
parents:
diff changeset
  1249
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1250
//
hgs
parents:
diff changeset
  1251
TInt CTestFlexPeriodic::StartInCallbackL(
hgs
parents:
diff changeset
  1252
    TTestResult& aResult, 
hgs
parents:
diff changeset
  1253
    CTestFlexTimer* aCallback  )
hgs
parents:
diff changeset
  1254
    {
hgs
parents:
diff changeset
  1255
    __UHEAP_MARK;
hgs
parents:
diff changeset
  1256
hgs
parents:
diff changeset
  1257
    // Constants
hgs
parents:
diff changeset
  1258
    const TTimeIntervalMicroSeconds32 KTimerDelay( 1000000 );
hgs
parents:
diff changeset
  1259
    const TTimeIntervalMicroSeconds32 KTimerInterval( 1000000 );
hgs
parents:
diff changeset
  1260
    const TTimeIntervalMicroSeconds32 KTestRunTime( 3000000 );
hgs
parents:
diff changeset
  1261
    
hgs
parents:
diff changeset
  1262
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
  1263
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
  1264
hgs
parents:
diff changeset
  1265
    CFlexPeriodic* timer = CFlexPeriodic::NewL( CActive::EPriorityStandard );
hgs
parents:
diff changeset
  1266
    CleanupStack::PushL( timer );
hgs
parents:
diff changeset
  1267
hgs
parents:
diff changeset
  1268
    // The callback should panic with
hgs
parents:
diff changeset
  1269
    // Panic category: "E32USER-CBase"
hgs
parents:
diff changeset
  1270
    // Panic reason:   42 (attempt to active CActive when a request is still 
hgs
parents:
diff changeset
  1271
    //                     outstanding)
hgs
parents:
diff changeset
  1272
    
hgs
parents:
diff changeset
  1273
    // Set panic code 42 to acceptable exit reason
hgs
parents:
diff changeset
  1274
    aCallback->TestModuleIf().SetExitReason( 
hgs
parents:
diff changeset
  1275
        CTestModuleIf::EPanic,
hgs
parents:
diff changeset
  1276
        42 );
hgs
parents:
diff changeset
  1277
hgs
parents:
diff changeset
  1278
    timer->Start( 
hgs
parents:
diff changeset
  1279
        KTimerDelay, 
hgs
parents:
diff changeset
  1280
        KTimerInterval, 
hgs
parents:
diff changeset
  1281
        TCallBack( StartTimer, timer ) );
hgs
parents:
diff changeset
  1282
hgs
parents:
diff changeset
  1283
                            //    //  ___     _____
hgs
parents:
diff changeset
  1284
    WaitL( KTestRunTime ); // // // //_ // //  //
hgs
parents:
diff changeset
  1285
                          //_//_// //  // //  //
hgs
parents:
diff changeset
  1286
hgs
parents:
diff changeset
  1287
    // No panic, change result back to normal
hgs
parents:
diff changeset
  1288
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::ENormal, KErrNone );
hgs
parents:
diff changeset
  1289
hgs
parents:
diff changeset
  1290
    aResult.SetResult( KErrGeneral, _L("Test case failed. No panic.") );
hgs
parents:
diff changeset
  1291
hgs
parents:
diff changeset
  1292
    // Clean up
hgs
parents:
diff changeset
  1293
    timer->Cancel();
hgs
parents:
diff changeset
  1294
    CleanupStack::PopAndDestroy( timer );
hgs
parents:
diff changeset
  1295
hgs
parents:
diff changeset
  1296
    __UHEAP_MARKEND;    
hgs
parents:
diff changeset
  1297
hgs
parents:
diff changeset
  1298
    return KErrNone;
hgs
parents:
diff changeset
  1299
    }
hgs
parents:
diff changeset
  1300
hgs
parents:
diff changeset
  1301
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1302
// TEST CASE: Start with negative delay, 32 bit interface
hgs
parents:
diff changeset
  1303
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1304
//
hgs
parents:
diff changeset
  1305
TInt CTestFlexPeriodic::StartWithNegativeDelay32L(
hgs
parents:
diff changeset
  1306
    TTestResult& aResult, 
hgs
parents:
diff changeset
  1307
    CTestFlexTimer* aCallback  )
hgs
parents:
diff changeset
  1308
    {
hgs
parents:
diff changeset
  1309
    __UHEAP_MARK;
hgs
parents:
diff changeset
  1310
hgs
parents:
diff changeset
  1311
    const TInt KAllowedValue( 1 );
hgs
parents:
diff changeset
  1312
    const TInt KIllegalValue( -1 );
hgs
parents:
diff changeset
  1313
hgs
parents:
diff changeset
  1314
    RArray<TTime> timestamps;
hgs
parents:
diff changeset
  1315
hgs
parents:
diff changeset
  1316
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
  1317
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
  1318
hgs
parents:
diff changeset
  1319
    // ConfigureAndStartTimerL should panic:
hgs
parents:
diff changeset
  1320
    //  Category: "CFlexPeriodic" 
hgs
parents:
diff changeset
  1321
    //  Reason:   6 (EFlexPeriodicDelayLessThanZero)
hgs
parents:
diff changeset
  1322
    // Set the panic code to acceptable exit reason
hgs
parents:
diff changeset
  1323
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::EPanic, 6 );
hgs
parents:
diff changeset
  1324
hgs
parents:
diff changeset
  1325
    ConfigureAndStartTimerL<TTimeIntervalMicroSeconds32, TTimeIntervalMicroSeconds32>(
hgs
parents:
diff changeset
  1326
        timestamps,
hgs
parents:
diff changeset
  1327
        KIllegalValue,
hgs
parents:
diff changeset
  1328
        KAllowedValue,
hgs
parents:
diff changeset
  1329
        KAllowedValue,
hgs
parents:
diff changeset
  1330
        KAllowedValue );
hgs
parents:
diff changeset
  1331
hgs
parents:
diff changeset
  1332
    // No panic, change result back to normal
hgs
parents:
diff changeset
  1333
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::ENormal, KErrNone );
hgs
parents:
diff changeset
  1334
    aResult.SetResult( KErrGeneral, _L("Test case failed. No panic.") );
hgs
parents:
diff changeset
  1335
    
hgs
parents:
diff changeset
  1336
    // Clean up
hgs
parents:
diff changeset
  1337
    timestamps.Close();
hgs
parents:
diff changeset
  1338
    
hgs
parents:
diff changeset
  1339
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
  1340
hgs
parents:
diff changeset
  1341
    return KErrNone;
hgs
parents:
diff changeset
  1342
    }
hgs
parents:
diff changeset
  1343
hgs
parents:
diff changeset
  1344
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1345
// TEST CASE: Start with zero interval, 32 bit interface
hgs
parents:
diff changeset
  1346
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1347
//
hgs
parents:
diff changeset
  1348
TInt CTestFlexPeriodic::StartWithZeroInterval32L(
hgs
parents:
diff changeset
  1349
    TTestResult& aResult, 
hgs
parents:
diff changeset
  1350
    CTestFlexTimer* aCallback  )
hgs
parents:
diff changeset
  1351
    {
hgs
parents:
diff changeset
  1352
    __UHEAP_MARK;
hgs
parents:
diff changeset
  1353
hgs
parents:
diff changeset
  1354
    const TInt KAllowedValue( 1 );
hgs
parents:
diff changeset
  1355
    const TInt KIllegalValue( 0 );
hgs
parents:
diff changeset
  1356
hgs
parents:
diff changeset
  1357
    RArray<TTime> timestamps;
hgs
parents:
diff changeset
  1358
hgs
parents:
diff changeset
  1359
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
  1360
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
  1361
hgs
parents:
diff changeset
  1362
    // ConfigureAndStartTimerL should panic:
hgs
parents:
diff changeset
  1363
    //  Category: "CFlexPeriodic" 
hgs
parents:
diff changeset
  1364
    //  Reason:   7 (EFlexPeriodicIntervalTooSmall)
hgs
parents:
diff changeset
  1365
    // Set the panic code to acceptable exit reason
hgs
parents:
diff changeset
  1366
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::EPanic, 7 );
hgs
parents:
diff changeset
  1367
hgs
parents:
diff changeset
  1368
    ConfigureAndStartTimerL<TTimeIntervalMicroSeconds32, TTimeIntervalMicroSeconds32>(
hgs
parents:
diff changeset
  1369
        timestamps,
hgs
parents:
diff changeset
  1370
        KAllowedValue,
hgs
parents:
diff changeset
  1371
        KIllegalValue,
hgs
parents:
diff changeset
  1372
        KAllowedValue,
hgs
parents:
diff changeset
  1373
        KAllowedValue );
hgs
parents:
diff changeset
  1374
hgs
parents:
diff changeset
  1375
    // No panic, change result back to normal
hgs
parents:
diff changeset
  1376
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::ENormal, KErrNone );
hgs
parents:
diff changeset
  1377
    aResult.SetResult( KErrGeneral, _L("Test case failed. No panic.") );
hgs
parents:
diff changeset
  1378
    
hgs
parents:
diff changeset
  1379
    // Clean up
hgs
parents:
diff changeset
  1380
    timestamps.Close();
hgs
parents:
diff changeset
  1381
hgs
parents:
diff changeset
  1382
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
  1383
hgs
parents:
diff changeset
  1384
    return KErrNone;
hgs
parents:
diff changeset
  1385
    }
hgs
parents:
diff changeset
  1386
hgs
parents:
diff changeset
  1387
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1388
// TEST CASE: Start with negative interval, 32 bit interface
hgs
parents:
diff changeset
  1389
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1390
//
hgs
parents:
diff changeset
  1391
TInt CTestFlexPeriodic::StartWithNegativeInterval32L(
hgs
parents:
diff changeset
  1392
    TTestResult& aResult, 
hgs
parents:
diff changeset
  1393
    CTestFlexTimer* aCallback  )
hgs
parents:
diff changeset
  1394
    {
hgs
parents:
diff changeset
  1395
    __UHEAP_MARK;
hgs
parents:
diff changeset
  1396
hgs
parents:
diff changeset
  1397
    const TInt KAllowedValue( 1 );
hgs
parents:
diff changeset
  1398
    const TInt KIllegalValue( -1 );
hgs
parents:
diff changeset
  1399
hgs
parents:
diff changeset
  1400
    RArray<TTime> timestamps;
hgs
parents:
diff changeset
  1401
hgs
parents:
diff changeset
  1402
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
  1403
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
  1404
hgs
parents:
diff changeset
  1405
    // ConfigureAndStartTimerL should panic:
hgs
parents:
diff changeset
  1406
    //  Category: "CFlexPeriodic" 
hgs
parents:
diff changeset
  1407
    //  Reason:   7 (EFlexPeriodicIntervalTooSmall)
hgs
parents:
diff changeset
  1408
    // Set the panic code to acceptable exit reason
hgs
parents:
diff changeset
  1409
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::EPanic, 7 );
hgs
parents:
diff changeset
  1410
hgs
parents:
diff changeset
  1411
    ConfigureAndStartTimerL<TTimeIntervalMicroSeconds32, TTimeIntervalMicroSeconds32>(
hgs
parents:
diff changeset
  1412
        timestamps,
hgs
parents:
diff changeset
  1413
        KAllowedValue,
hgs
parents:
diff changeset
  1414
        KIllegalValue,
hgs
parents:
diff changeset
  1415
        KAllowedValue,
hgs
parents:
diff changeset
  1416
        KAllowedValue );
hgs
parents:
diff changeset
  1417
hgs
parents:
diff changeset
  1418
    // No panic, change result back to normal
hgs
parents:
diff changeset
  1419
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::ENormal, KErrNone );
hgs
parents:
diff changeset
  1420
    aResult.SetResult( KErrGeneral, _L("Test case failed. No panic.") );
hgs
parents:
diff changeset
  1421
    
hgs
parents:
diff changeset
  1422
    // Clean up
hgs
parents:
diff changeset
  1423
    timestamps.Close();
hgs
parents:
diff changeset
  1424
hgs
parents:
diff changeset
  1425
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
  1426
hgs
parents:
diff changeset
  1427
    return KErrNone;
hgs
parents:
diff changeset
  1428
    }
hgs
parents:
diff changeset
  1429
hgs
parents:
diff changeset
  1430
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1431
// TEST CASE: Start with negative delay, 64 bit interface
hgs
parents:
diff changeset
  1432
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1433
//
hgs
parents:
diff changeset
  1434
TInt CTestFlexPeriodic::StartWithNegativeDelay64L(
hgs
parents:
diff changeset
  1435
    TTestResult& aResult, 
hgs
parents:
diff changeset
  1436
    CTestFlexTimer* aCallback  )
hgs
parents:
diff changeset
  1437
    {
hgs
parents:
diff changeset
  1438
    __UHEAP_MARK;
hgs
parents:
diff changeset
  1439
hgs
parents:
diff changeset
  1440
    const TInt KAllowedValue( 1 );
hgs
parents:
diff changeset
  1441
    const TInt KIllegalValue( -1 );
hgs
parents:
diff changeset
  1442
hgs
parents:
diff changeset
  1443
    RArray<TTime> timestamps;
hgs
parents:
diff changeset
  1444
    
hgs
parents:
diff changeset
  1445
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
  1446
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
  1447
hgs
parents:
diff changeset
  1448
    // ConfigureAndStartTimerL should panic:
hgs
parents:
diff changeset
  1449
    //  Category: "CFlexPeriodic" 
hgs
parents:
diff changeset
  1450
    //  Reason:   6 (EFlexPeriodicDelayLessThanZero)
hgs
parents:
diff changeset
  1451
    // Set the panic code to acceptable exit reason
hgs
parents:
diff changeset
  1452
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::EPanic, 6 );
hgs
parents:
diff changeset
  1453
hgs
parents:
diff changeset
  1454
    ConfigureAndStartTimerL<TTimeIntervalMicroSeconds, TTimeIntervalMicroSeconds>(
hgs
parents:
diff changeset
  1455
        timestamps,
hgs
parents:
diff changeset
  1456
        KIllegalValue,
hgs
parents:
diff changeset
  1457
        KAllowedValue,
hgs
parents:
diff changeset
  1458
        KAllowedValue,
hgs
parents:
diff changeset
  1459
        KAllowedValue );
hgs
parents:
diff changeset
  1460
hgs
parents:
diff changeset
  1461
    // No panic, change result back to normal
hgs
parents:
diff changeset
  1462
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::ENormal, KErrNone );
hgs
parents:
diff changeset
  1463
    aResult.SetResult( KErrGeneral, _L("Test case failed. No panic.") );
hgs
parents:
diff changeset
  1464
    
hgs
parents:
diff changeset
  1465
    // Clean up
hgs
parents:
diff changeset
  1466
    timestamps.Close();
hgs
parents:
diff changeset
  1467
hgs
parents:
diff changeset
  1468
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
  1469
hgs
parents:
diff changeset
  1470
    return KErrNone;
hgs
parents:
diff changeset
  1471
    }
hgs
parents:
diff changeset
  1472
hgs
parents:
diff changeset
  1473
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1474
// TEST CASE: Start with zero interval, 64 bit interface
hgs
parents:
diff changeset
  1475
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1476
//
hgs
parents:
diff changeset
  1477
TInt CTestFlexPeriodic::StartWithZeroInterval64L(
hgs
parents:
diff changeset
  1478
    TTestResult& aResult, 
hgs
parents:
diff changeset
  1479
    CTestFlexTimer* aCallback  )
hgs
parents:
diff changeset
  1480
    {
hgs
parents:
diff changeset
  1481
    __UHEAP_MARK;
hgs
parents:
diff changeset
  1482
hgs
parents:
diff changeset
  1483
    const TInt KAllowedValue( 1 );
hgs
parents:
diff changeset
  1484
    const TInt KIllegalValue( 0 );
hgs
parents:
diff changeset
  1485
    
hgs
parents:
diff changeset
  1486
    RArray<TTime> timestamps;
hgs
parents:
diff changeset
  1487
    
hgs
parents:
diff changeset
  1488
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
  1489
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
  1490
hgs
parents:
diff changeset
  1491
    // ConfigureAndStartTimerL should panic:
hgs
parents:
diff changeset
  1492
    //  Category: "CFlexPeriodic" 
hgs
parents:
diff changeset
  1493
    //  Reason:   7 (EFlexPeriodicIntervalTooSmall)
hgs
parents:
diff changeset
  1494
    // Set the panic code to acceptable exit reason
hgs
parents:
diff changeset
  1495
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::EPanic, 7 );
hgs
parents:
diff changeset
  1496
hgs
parents:
diff changeset
  1497
    ConfigureAndStartTimerL<TTimeIntervalMicroSeconds, TTimeIntervalMicroSeconds>(
hgs
parents:
diff changeset
  1498
        timestamps,
hgs
parents:
diff changeset
  1499
        KAllowedValue,
hgs
parents:
diff changeset
  1500
        KIllegalValue,
hgs
parents:
diff changeset
  1501
        KAllowedValue,
hgs
parents:
diff changeset
  1502
        KAllowedValue );
hgs
parents:
diff changeset
  1503
hgs
parents:
diff changeset
  1504
    // No panic, change result back to normal
hgs
parents:
diff changeset
  1505
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::ENormal, KErrNone );
hgs
parents:
diff changeset
  1506
    aResult.SetResult( KErrGeneral, _L("Test case failed. No panic.") );
hgs
parents:
diff changeset
  1507
    
hgs
parents:
diff changeset
  1508
    // Clean up
hgs
parents:
diff changeset
  1509
    timestamps.Close();
hgs
parents:
diff changeset
  1510
hgs
parents:
diff changeset
  1511
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
  1512
hgs
parents:
diff changeset
  1513
    return KErrNone;
hgs
parents:
diff changeset
  1514
    }
hgs
parents:
diff changeset
  1515
hgs
parents:
diff changeset
  1516
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1517
// TEST CASE: Start with negative interval, 64 bit interface
hgs
parents:
diff changeset
  1518
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1519
//
hgs
parents:
diff changeset
  1520
TInt CTestFlexPeriodic::StartWithNegativeInterval64L(
hgs
parents:
diff changeset
  1521
    TTestResult& aResult, 
hgs
parents:
diff changeset
  1522
    CTestFlexTimer* aCallback  )
hgs
parents:
diff changeset
  1523
    {
hgs
parents:
diff changeset
  1524
    __UHEAP_MARK;
hgs
parents:
diff changeset
  1525
hgs
parents:
diff changeset
  1526
    const TInt KAllowedValue( 1 );
hgs
parents:
diff changeset
  1527
    const TInt KIllegalValue( -1 );
hgs
parents:
diff changeset
  1528
    
hgs
parents:
diff changeset
  1529
    RArray<TTime> timestamps;
hgs
parents:
diff changeset
  1530
    
hgs
parents:
diff changeset
  1531
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
  1532
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
  1533
hgs
parents:
diff changeset
  1534
    // ConfigureAndStartTimerL should panic:
hgs
parents:
diff changeset
  1535
    //  Category: "CFlexPeriodic" 
hgs
parents:
diff changeset
  1536
    //  Reason:   7 (EFlexPeriodicIntervalTooSmall)
hgs
parents:
diff changeset
  1537
    // Set the panic code to acceptable exit reason
hgs
parents:
diff changeset
  1538
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::EPanic, 7 );
hgs
parents:
diff changeset
  1539
hgs
parents:
diff changeset
  1540
    ConfigureAndStartTimerL<TTimeIntervalMicroSeconds, TTimeIntervalMicroSeconds>(
hgs
parents:
diff changeset
  1541
        timestamps,
hgs
parents:
diff changeset
  1542
        KAllowedValue,
hgs
parents:
diff changeset
  1543
        KIllegalValue,
hgs
parents:
diff changeset
  1544
        KAllowedValue,
hgs
parents:
diff changeset
  1545
        KAllowedValue );
hgs
parents:
diff changeset
  1546
hgs
parents:
diff changeset
  1547
    // No panic, change result back to normal
hgs
parents:
diff changeset
  1548
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::ENormal, KErrNone );
hgs
parents:
diff changeset
  1549
    aResult.SetResult( KErrGeneral, _L("Test case failed. No panic.") );
hgs
parents:
diff changeset
  1550
    
hgs
parents:
diff changeset
  1551
    // Clean up
hgs
parents:
diff changeset
  1552
    timestamps.Close();
hgs
parents:
diff changeset
  1553
hgs
parents:
diff changeset
  1554
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
  1555
hgs
parents:
diff changeset
  1556
    return KErrNone;
hgs
parents:
diff changeset
  1557
    }
hgs
parents:
diff changeset
  1558
hgs
parents:
diff changeset
  1559
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1560
// TEST CASE: Configure timer with negative delay window, 32 bit interface
hgs
parents:
diff changeset
  1561
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1562
//
hgs
parents:
diff changeset
  1563
TInt CTestFlexPeriodic::ConfigureWithNegativeDelayWindow32L(
hgs
parents:
diff changeset
  1564
    TTestResult& aResult, 
hgs
parents:
diff changeset
  1565
    CTestFlexTimer* aCallback  )
hgs
parents:
diff changeset
  1566
    {
hgs
parents:
diff changeset
  1567
    __UHEAP_MARK;
hgs
parents:
diff changeset
  1568
hgs
parents:
diff changeset
  1569
    const TInt KAllowedValue( 1 );
hgs
parents:
diff changeset
  1570
    const TInt KIllegalValue( -1 );
hgs
parents:
diff changeset
  1571
    
hgs
parents:
diff changeset
  1572
    RArray<TTime> timestamps;
hgs
parents:
diff changeset
  1573
    
hgs
parents:
diff changeset
  1574
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
  1575
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
  1576
hgs
parents:
diff changeset
  1577
    // ConfigureAndStartTimerL should panic:
hgs
parents:
diff changeset
  1578
    //  Category: "CFlexPeriodic" 
hgs
parents:
diff changeset
  1579
    //  Reason:   8 (EFlexPeriodicDelayWindowLessThanZero)
hgs
parents:
diff changeset
  1580
    // Set the panic code to acceptable exit reason
hgs
parents:
diff changeset
  1581
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::EPanic, 8 );
hgs
parents:
diff changeset
  1582
hgs
parents:
diff changeset
  1583
    ConfigureAndStartTimerL<TTimeIntervalMicroSeconds32, TTimeIntervalMicroSeconds32>(
hgs
parents:
diff changeset
  1584
        timestamps,
hgs
parents:
diff changeset
  1585
        KAllowedValue,
hgs
parents:
diff changeset
  1586
        KAllowedValue,
hgs
parents:
diff changeset
  1587
        KIllegalValue,
hgs
parents:
diff changeset
  1588
        KAllowedValue );
hgs
parents:
diff changeset
  1589
hgs
parents:
diff changeset
  1590
    // No panic, change result back to normal
hgs
parents:
diff changeset
  1591
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::ENormal, KErrNone );
hgs
parents:
diff changeset
  1592
    aResult.SetResult( KErrGeneral, _L("Test case failed. No panic.") );
hgs
parents:
diff changeset
  1593
    
hgs
parents:
diff changeset
  1594
    // Clean up
hgs
parents:
diff changeset
  1595
    timestamps.Close();
hgs
parents:
diff changeset
  1596
hgs
parents:
diff changeset
  1597
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
  1598
hgs
parents:
diff changeset
  1599
    return KErrNone;
hgs
parents:
diff changeset
  1600
    }
hgs
parents:
diff changeset
  1601
hgs
parents:
diff changeset
  1602
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1603
// TEST CASE: Configure timer with negative interval window, 32 bit interface
hgs
parents:
diff changeset
  1604
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1605
//
hgs
parents:
diff changeset
  1606
TInt CTestFlexPeriodic::ConfigureWithNegativeIntervalWindow32L(
hgs
parents:
diff changeset
  1607
    TTestResult& aResult, 
hgs
parents:
diff changeset
  1608
    CTestFlexTimer* aCallback  )
hgs
parents:
diff changeset
  1609
    {
hgs
parents:
diff changeset
  1610
    __UHEAP_MARK;
hgs
parents:
diff changeset
  1611
hgs
parents:
diff changeset
  1612
    const TInt KAllowedValue( 1 );
hgs
parents:
diff changeset
  1613
    const TInt KIllegalValue( -1 );
hgs
parents:
diff changeset
  1614
    
hgs
parents:
diff changeset
  1615
    RArray<TTime> timestamps;
hgs
parents:
diff changeset
  1616
    
hgs
parents:
diff changeset
  1617
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
  1618
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
  1619
hgs
parents:
diff changeset
  1620
    // ConfigureAndStartTimerL should panic:
hgs
parents:
diff changeset
  1621
    //  Category: "CFlexPeriodic" 
hgs
parents:
diff changeset
  1622
    //  Reason:   9 (EFlexPeriodicIntervalWindowLessThanZero)
hgs
parents:
diff changeset
  1623
    // Set the panic code to acceptable exit reason
hgs
parents:
diff changeset
  1624
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::EPanic, 9 );
hgs
parents:
diff changeset
  1625
hgs
parents:
diff changeset
  1626
    ConfigureAndStartTimerL<TTimeIntervalMicroSeconds32, TTimeIntervalMicroSeconds32>(
hgs
parents:
diff changeset
  1627
        timestamps,
hgs
parents:
diff changeset
  1628
        KAllowedValue,
hgs
parents:
diff changeset
  1629
        KAllowedValue,
hgs
parents:
diff changeset
  1630
        KAllowedValue,
hgs
parents:
diff changeset
  1631
        KIllegalValue );
hgs
parents:
diff changeset
  1632
hgs
parents:
diff changeset
  1633
    // No panic, change result back to normal
hgs
parents:
diff changeset
  1634
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::ENormal, KErrNone );
hgs
parents:
diff changeset
  1635
    aResult.SetResult( KErrGeneral, _L("Test case failed. No panic.") );
hgs
parents:
diff changeset
  1636
    
hgs
parents:
diff changeset
  1637
    // Clean up
hgs
parents:
diff changeset
  1638
    timestamps.Close();
hgs
parents:
diff changeset
  1639
hgs
parents:
diff changeset
  1640
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
  1641
hgs
parents:
diff changeset
  1642
    return KErrNone;
hgs
parents:
diff changeset
  1643
    }
hgs
parents:
diff changeset
  1644
hgs
parents:
diff changeset
  1645
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1646
// TEST CASE: Configure timer with negative delay window, 64 bit interface
hgs
parents:
diff changeset
  1647
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1648
//
hgs
parents:
diff changeset
  1649
TInt CTestFlexPeriodic::ConfigureWithNegativeDelayWindow64L(
hgs
parents:
diff changeset
  1650
    TTestResult& aResult, 
hgs
parents:
diff changeset
  1651
    CTestFlexTimer* aCallback  )
hgs
parents:
diff changeset
  1652
    {
hgs
parents:
diff changeset
  1653
    __UHEAP_MARK;
hgs
parents:
diff changeset
  1654
hgs
parents:
diff changeset
  1655
    const TInt KAllowedValue( 1 );
hgs
parents:
diff changeset
  1656
    const TInt KIllegalValue( -1 );
hgs
parents:
diff changeset
  1657
    
hgs
parents:
diff changeset
  1658
    RArray<TTime> timestamps;
hgs
parents:
diff changeset
  1659
    
hgs
parents:
diff changeset
  1660
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
  1661
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
  1662
hgs
parents:
diff changeset
  1663
    // ConfigureAndStartTimerL should panic:
hgs
parents:
diff changeset
  1664
    //  Category: "CFlexPeriodic" 
hgs
parents:
diff changeset
  1665
    //  Reason:   8 (EFlexPeriodicDelayWindowLessThanZero)
hgs
parents:
diff changeset
  1666
    // Set the panic code to acceptable exit reason
hgs
parents:
diff changeset
  1667
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::EPanic, 8 );
hgs
parents:
diff changeset
  1668
hgs
parents:
diff changeset
  1669
    ConfigureAndStartTimerL<TTimeIntervalMicroSeconds, TTimeIntervalMicroSeconds>(
hgs
parents:
diff changeset
  1670
        timestamps,
hgs
parents:
diff changeset
  1671
        KAllowedValue,
hgs
parents:
diff changeset
  1672
        KAllowedValue,
hgs
parents:
diff changeset
  1673
        KIllegalValue,
hgs
parents:
diff changeset
  1674
        KAllowedValue );
hgs
parents:
diff changeset
  1675
hgs
parents:
diff changeset
  1676
    // No panic, change result back to normal
hgs
parents:
diff changeset
  1677
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::ENormal, KErrNone );
hgs
parents:
diff changeset
  1678
    aResult.SetResult( KErrGeneral, _L("Test case failed. No panic.") );
hgs
parents:
diff changeset
  1679
    
hgs
parents:
diff changeset
  1680
    // Clean up
hgs
parents:
diff changeset
  1681
    timestamps.Close();
hgs
parents:
diff changeset
  1682
hgs
parents:
diff changeset
  1683
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
  1684
hgs
parents:
diff changeset
  1685
    return KErrNone;
hgs
parents:
diff changeset
  1686
    }
hgs
parents:
diff changeset
  1687
hgs
parents:
diff changeset
  1688
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1689
// TEST CASE: Configure timer with negative interval window, 64 bit interface
hgs
parents:
diff changeset
  1690
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1691
//
hgs
parents:
diff changeset
  1692
TInt CTestFlexPeriodic::ConfigureWithNegativeIntervalWindow64L(
hgs
parents:
diff changeset
  1693
    TTestResult& aResult, 
hgs
parents:
diff changeset
  1694
    CTestFlexTimer* aCallback  )
hgs
parents:
diff changeset
  1695
    {
hgs
parents:
diff changeset
  1696
    __UHEAP_MARK;
hgs
parents:
diff changeset
  1697
hgs
parents:
diff changeset
  1698
    const TInt KAllowedValue( 1 );
hgs
parents:
diff changeset
  1699
    const TInt KIllegalValue( -1 );
hgs
parents:
diff changeset
  1700
    
hgs
parents:
diff changeset
  1701
    RArray<TTime> timestamps;
hgs
parents:
diff changeset
  1702
    
hgs
parents:
diff changeset
  1703
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
  1704
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
  1705
hgs
parents:
diff changeset
  1706
    // ConfigureAndStartTimerL should panic:
hgs
parents:
diff changeset
  1707
    //  Category: "CFlexPeriodic" 
hgs
parents:
diff changeset
  1708
    //  Reason:   9 (EFlexPeriodicIntervalWindowLessThanZero)
hgs
parents:
diff changeset
  1709
    // Set the panic code to acceptable exit reason
hgs
parents:
diff changeset
  1710
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::EPanic, 9 );
hgs
parents:
diff changeset
  1711
hgs
parents:
diff changeset
  1712
    ConfigureAndStartTimerL<TTimeIntervalMicroSeconds, TTimeIntervalMicroSeconds>(
hgs
parents:
diff changeset
  1713
        timestamps,
hgs
parents:
diff changeset
  1714
        KAllowedValue,
hgs
parents:
diff changeset
  1715
        KAllowedValue,
hgs
parents:
diff changeset
  1716
        KAllowedValue,
hgs
parents:
diff changeset
  1717
        KIllegalValue );
hgs
parents:
diff changeset
  1718
hgs
parents:
diff changeset
  1719
    // No panic, change result back to normal
hgs
parents:
diff changeset
  1720
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::ENormal, KErrNone );
hgs
parents:
diff changeset
  1721
    aResult.SetResult( KErrGeneral, _L("Test case failed. No panic.") );
hgs
parents:
diff changeset
  1722
    
hgs
parents:
diff changeset
  1723
    // Clean up
hgs
parents:
diff changeset
  1724
    timestamps.Close();
hgs
parents:
diff changeset
  1725
hgs
parents:
diff changeset
  1726
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
  1727
hgs
parents:
diff changeset
  1728
    return KErrNone;
hgs
parents:
diff changeset
  1729
    }
hgs
parents:
diff changeset
  1730
hgs
parents:
diff changeset
  1731
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1732
// TEST CASE: Start with minimum and maximum values
hgs
parents:
diff changeset
  1733
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1734
//
hgs
parents:
diff changeset
  1735
TInt CTestFlexPeriodic::StartWithMinAndMaxL(
hgs
parents:
diff changeset
  1736
    TTestResult& aResult, 
hgs
parents:
diff changeset
  1737
    CTestFlexTimer* /* aCallback */  )
hgs
parents:
diff changeset
  1738
    {
hgs
parents:
diff changeset
  1739
    __UHEAP_MARK;
hgs
parents:
diff changeset
  1740
hgs
parents:
diff changeset
  1741
    const TInt KMinimumDelayValue( 0 );
hgs
parents:
diff changeset
  1742
    const TInt KMinimumIntervalValue( 1 );
hgs
parents:
diff changeset
  1743
    const TInt KNormalValue( 1000000 );
hgs
parents:
diff changeset
  1744
    const TInt KMaximum32BitValue( 0x7FFFFFFF );
hgs
parents:
diff changeset
  1745
hgs
parents:
diff changeset
  1746
//    const TInt64 KLarge64BitValue( 0x6FFFFFFFFFFFFFFF );  // Should not panic (till few years)
hgs
parents:
diff changeset
  1747
hgs
parents:
diff changeset
  1748
    // Years * Days * Hours * Minutes * Seconds * Microseconds
hgs
parents:
diff changeset
  1749
    const TInt64 KLarge64BitValue( ((TInt64)(1)) * 365 * 24 * 60 * 60 * 1000000 );
hgs
parents:
diff changeset
  1750
    
hgs
parents:
diff changeset
  1751
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
  1752
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
  1753
    
hgs
parents:
diff changeset
  1754
    RArray<TTime> timestamps;
hgs
parents:
diff changeset
  1755
hgs
parents:
diff changeset
  1756
    TTime now;
hgs
parents:
diff changeset
  1757
    now.UniversalTime();
hgs
parents:
diff changeset
  1758
hgs
parents:
diff changeset
  1759
    // > DEBUG
hgs
parents:
diff changeset
  1760
    TTimeIntervalMicroSeconds longLongInterval( KLarge64BitValue );
hgs
parents:
diff changeset
  1761
    now += longLongInterval;
hgs
parents:
diff changeset
  1762
    TDateTime date;
hgs
parents:
diff changeset
  1763
    date = now.DateTime();
hgs
parents:
diff changeset
  1764
    // < DEBUG
hgs
parents:
diff changeset
  1765
hgs
parents:
diff changeset
  1766
    // Start with min delay, 32 bit
hgs
parents:
diff changeset
  1767
    ConfigureAndStartTimerL<TTimeIntervalMicroSeconds32, TTimeIntervalMicroSeconds32>(
hgs
parents:
diff changeset
  1768
        timestamps,
hgs
parents:
diff changeset
  1769
        KMinimumDelayValue,
hgs
parents:
diff changeset
  1770
        KNormalValue,
hgs
parents:
diff changeset
  1771
        KNormalValue,
hgs
parents:
diff changeset
  1772
        KNormalValue );
hgs
parents:
diff changeset
  1773
    // Validate results
hgs
parents:
diff changeset
  1774
    if ( !AreTimestampsAtWindow(
hgs
parents:
diff changeset
  1775
            timestamps,
hgs
parents:
diff changeset
  1776
            TTimeIntervalMicroSeconds32( KMinimumDelayValue ),
hgs
parents:
diff changeset
  1777
            TTimeIntervalMicroSeconds32( KNormalValue ),
hgs
parents:
diff changeset
  1778
            TTimeIntervalMicroSeconds32( KNormalValue ),
hgs
parents:
diff changeset
  1779
            TTimeIntervalMicroSeconds32( KNormalValue ) ) )
hgs
parents:
diff changeset
  1780
        {
hgs
parents:
diff changeset
  1781
        aResult.SetResult( KErrGeneral, _L("Test case failed. 32 bit min delay failed") );
hgs
parents:
diff changeset
  1782
        }
hgs
parents:
diff changeset
  1783
    timestamps.Reset();
hgs
parents:
diff changeset
  1784
hgs
parents:
diff changeset
  1785
    // Start with max delay, 32 bit
hgs
parents:
diff changeset
  1786
    ConfigureAndStartTimerL<TTimeIntervalMicroSeconds32, TTimeIntervalMicroSeconds32>(
hgs
parents:
diff changeset
  1787
        timestamps,
hgs
parents:
diff changeset
  1788
        KMaximum32BitValue,
hgs
parents:
diff changeset
  1789
        KNormalValue,
hgs
parents:
diff changeset
  1790
        KNormalValue,
hgs
parents:
diff changeset
  1791
        KNormalValue );
hgs
parents:
diff changeset
  1792
    // Validate results
hgs
parents:
diff changeset
  1793
    // Only one timestamp (the start time) is allowed
hgs
parents:
diff changeset
  1794
    if ( timestamps.Count() > 1 )
hgs
parents:
diff changeset
  1795
        {
hgs
parents:
diff changeset
  1796
        aResult.SetResult( KErrGeneral, _L("Test case failed. 32 bit max delay failed") );
hgs
parents:
diff changeset
  1797
        }
hgs
parents:
diff changeset
  1798
    timestamps.Reset();
hgs
parents:
diff changeset
  1799
hgs
parents:
diff changeset
  1800
    // Start with min interval, 32 bit
hgs
parents:
diff changeset
  1801
    ConfigureAndStartTimerL<TTimeIntervalMicroSeconds32, TTimeIntervalMicroSeconds32>(
hgs
parents:
diff changeset
  1802
        timestamps,
hgs
parents:
diff changeset
  1803
        KNormalValue,
hgs
parents:
diff changeset
  1804
        KMinimumIntervalValue,
hgs
parents:
diff changeset
  1805
        KNormalValue,
hgs
parents:
diff changeset
  1806
        KNormalValue );
hgs
parents:
diff changeset
  1807
    // Validate results
hgs
parents:
diff changeset
  1808
    if ( !AreTimestampsAtWindow(
hgs
parents:
diff changeset
  1809
            timestamps,
hgs
parents:
diff changeset
  1810
            TTimeIntervalMicroSeconds32( KNormalValue ),
hgs
parents:
diff changeset
  1811
            TTimeIntervalMicroSeconds32( KMinimumIntervalValue ),
hgs
parents:
diff changeset
  1812
            TTimeIntervalMicroSeconds32( KNormalValue ),
hgs
parents:
diff changeset
  1813
            TTimeIntervalMicroSeconds32( KNormalValue ) ) )
hgs
parents:
diff changeset
  1814
        {
hgs
parents:
diff changeset
  1815
        aResult.SetResult( KErrGeneral, _L("Test case failed. 32 bit min interval failed") );
hgs
parents:
diff changeset
  1816
        }
hgs
parents:
diff changeset
  1817
    timestamps.Reset();
hgs
parents:
diff changeset
  1818
hgs
parents:
diff changeset
  1819
    // Start with max interval, 32 bit
hgs
parents:
diff changeset
  1820
    ConfigureAndStartTimerL<TTimeIntervalMicroSeconds32, TTimeIntervalMicroSeconds32>(
hgs
parents:
diff changeset
  1821
        timestamps,
hgs
parents:
diff changeset
  1822
        KNormalValue,
hgs
parents:
diff changeset
  1823
        KMaximum32BitValue,
hgs
parents:
diff changeset
  1824
        KNormalValue,
hgs
parents:
diff changeset
  1825
        KNormalValue );
hgs
parents:
diff changeset
  1826
    // Validate results
hgs
parents:
diff changeset
  1827
    if ( !AreTimestampsAtWindow(
hgs
parents:
diff changeset
  1828
            timestamps,
hgs
parents:
diff changeset
  1829
            TTimeIntervalMicroSeconds32( KNormalValue ),
hgs
parents:
diff changeset
  1830
            TTimeIntervalMicroSeconds32( KMaximum32BitValue ),
hgs
parents:
diff changeset
  1831
            TTimeIntervalMicroSeconds32( KNormalValue ),
hgs
parents:
diff changeset
  1832
            TTimeIntervalMicroSeconds32( KNormalValue ) ) )
hgs
parents:
diff changeset
  1833
        {
hgs
parents:
diff changeset
  1834
        aResult.SetResult( KErrGeneral, _L("Test case failed. 32 bit min interval failed") );
hgs
parents:
diff changeset
  1835
        }
hgs
parents:
diff changeset
  1836
    timestamps.Reset();
hgs
parents:
diff changeset
  1837
hgs
parents:
diff changeset
  1838
    // Start with min delay, 64 bit
hgs
parents:
diff changeset
  1839
    ConfigureAndStartTimerL<TTimeIntervalMicroSeconds, TTimeIntervalMicroSeconds>(
hgs
parents:
diff changeset
  1840
        timestamps,
hgs
parents:
diff changeset
  1841
        KMinimumDelayValue,
hgs
parents:
diff changeset
  1842
        KNormalValue,
hgs
parents:
diff changeset
  1843
        KNormalValue,
hgs
parents:
diff changeset
  1844
        KNormalValue );
hgs
parents:
diff changeset
  1845
    // Validate results
hgs
parents:
diff changeset
  1846
    if ( !AreTimestampsAtWindow(
hgs
parents:
diff changeset
  1847
            timestamps,
hgs
parents:
diff changeset
  1848
            TTimeIntervalMicroSeconds( KMinimumDelayValue ),
hgs
parents:
diff changeset
  1849
            TTimeIntervalMicroSeconds( KNormalValue ),
hgs
parents:
diff changeset
  1850
            TTimeIntervalMicroSeconds( KNormalValue ),
hgs
parents:
diff changeset
  1851
            TTimeIntervalMicroSeconds( KNormalValue ) ) )
hgs
parents:
diff changeset
  1852
        {
hgs
parents:
diff changeset
  1853
        aResult.SetResult( KErrGeneral, _L("Test case failed. 64 bit min delay failed") );
hgs
parents:
diff changeset
  1854
        }
hgs
parents:
diff changeset
  1855
    timestamps.Reset();
hgs
parents:
diff changeset
  1856
hgs
parents:
diff changeset
  1857
    // Start with large delay, 64 bit
hgs
parents:
diff changeset
  1858
    ConfigureAndStartTimerL<TTimeIntervalMicroSeconds, TTimeIntervalMicroSeconds>(
hgs
parents:
diff changeset
  1859
        timestamps,
hgs
parents:
diff changeset
  1860
        KLarge64BitValue,
hgs
parents:
diff changeset
  1861
        KNormalValue,
hgs
parents:
diff changeset
  1862
        KNormalValue,
hgs
parents:
diff changeset
  1863
        KNormalValue );
hgs
parents:
diff changeset
  1864
    // Validate results
hgs
parents:
diff changeset
  1865
    // Only one timestamp (the start time) is allowed
hgs
parents:
diff changeset
  1866
    if ( timestamps.Count() > 1 )
hgs
parents:
diff changeset
  1867
        {
hgs
parents:
diff changeset
  1868
        aResult.SetResult( KErrGeneral, _L("Test case failed. 64 bit max delay failed") );
hgs
parents:
diff changeset
  1869
        }
hgs
parents:
diff changeset
  1870
    timestamps.Reset();
hgs
parents:
diff changeset
  1871
hgs
parents:
diff changeset
  1872
    // Start with min interval, 64 bit
hgs
parents:
diff changeset
  1873
    ConfigureAndStartTimerL<TTimeIntervalMicroSeconds, TTimeIntervalMicroSeconds>(
hgs
parents:
diff changeset
  1874
        timestamps,
hgs
parents:
diff changeset
  1875
        KNormalValue,
hgs
parents:
diff changeset
  1876
        KMinimumIntervalValue,
hgs
parents:
diff changeset
  1877
        KNormalValue,
hgs
parents:
diff changeset
  1878
        KNormalValue );
hgs
parents:
diff changeset
  1879
    // Validate results
hgs
parents:
diff changeset
  1880
    if ( !AreTimestampsAtWindow(
hgs
parents:
diff changeset
  1881
            timestamps,
hgs
parents:
diff changeset
  1882
            TTimeIntervalMicroSeconds( KNormalValue ),
hgs
parents:
diff changeset
  1883
            TTimeIntervalMicroSeconds( KMinimumIntervalValue ),
hgs
parents:
diff changeset
  1884
            TTimeIntervalMicroSeconds( KNormalValue ),
hgs
parents:
diff changeset
  1885
            TTimeIntervalMicroSeconds( KNormalValue ) ) )
hgs
parents:
diff changeset
  1886
        {
hgs
parents:
diff changeset
  1887
        aResult.SetResult( KErrGeneral, _L("Test case failed. 64 bit min interval failed") );
hgs
parents:
diff changeset
  1888
        }
hgs
parents:
diff changeset
  1889
    timestamps.Reset();
hgs
parents:
diff changeset
  1890
hgs
parents:
diff changeset
  1891
    // Start with large interval, 64 bit
hgs
parents:
diff changeset
  1892
    ConfigureAndStartTimerL<TTimeIntervalMicroSeconds, TTimeIntervalMicroSeconds>(
hgs
parents:
diff changeset
  1893
        timestamps,
hgs
parents:
diff changeset
  1894
        KNormalValue,
hgs
parents:
diff changeset
  1895
        KLarge64BitValue,
hgs
parents:
diff changeset
  1896
        KNormalValue,
hgs
parents:
diff changeset
  1897
        KNormalValue );
hgs
parents:
diff changeset
  1898
    // Validate results
hgs
parents:
diff changeset
  1899
    // AreTimestampsAtWindow() does not accept values over 0xFFFFFFFF.
hgs
parents:
diff changeset
  1900
    // However, this is not a problem due there should be only the timestamps
hgs
parents:
diff changeset
  1901
    // of start time and delay expiration; 32 bit value can be used instead of
hgs
parents:
diff changeset
  1902
    // the real interval.
hgs
parents:
diff changeset
  1903
    if ( !AreTimestampsAtWindow(
hgs
parents:
diff changeset
  1904
            timestamps,
hgs
parents:
diff changeset
  1905
            TTimeIntervalMicroSeconds( KNormalValue ),
hgs
parents:
diff changeset
  1906
            TTimeIntervalMicroSeconds( KMaximum32BitValue ),
hgs
parents:
diff changeset
  1907
            TTimeIntervalMicroSeconds( KNormalValue ),
hgs
parents:
diff changeset
  1908
            TTimeIntervalMicroSeconds( KNormalValue ) ) )
hgs
parents:
diff changeset
  1909
        {
hgs
parents:
diff changeset
  1910
        aResult.SetResult( KErrGeneral, _L("Test case failed. 64 bit max interval failed") );
hgs
parents:
diff changeset
  1911
        }
hgs
parents:
diff changeset
  1912
    timestamps.Reset();
hgs
parents:
diff changeset
  1913
hgs
parents:
diff changeset
  1914
    // If test execution is here, we'll passed
hgs
parents:
diff changeset
  1915
    aResult.SetResult( KErrNone, _L("Test case passed") );
hgs
parents:
diff changeset
  1916
hgs
parents:
diff changeset
  1917
    // Clean up
hgs
parents:
diff changeset
  1918
    timestamps.Close();
hgs
parents:
diff changeset
  1919
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
  1920
hgs
parents:
diff changeset
  1921
    return KErrNone;
hgs
parents:
diff changeset
  1922
    }
hgs
parents:
diff changeset
  1923
hgs
parents:
diff changeset
  1924
hgs
parents:
diff changeset
  1925
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1926
// TEST CASE: Start timer with maximum delay, 64 bit interface
hgs
parents:
diff changeset
  1927
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1928
//
hgs
parents:
diff changeset
  1929
TInt CTestFlexPeriodic::StartWithMaximumDelay64L(
hgs
parents:
diff changeset
  1930
    TTestResult& aResult, 
hgs
parents:
diff changeset
  1931
    CTestFlexTimer* aCallback  )
hgs
parents:
diff changeset
  1932
    {
hgs
parents:
diff changeset
  1933
    __UHEAP_MARK;
hgs
parents:
diff changeset
  1934
hgs
parents:
diff changeset
  1935
    const TInt KAllowedValue( 1 );
hgs
parents:
diff changeset
  1936
    const TInt64 KIllegalValue( 0x7FFFFFFFFFFFFFFF );
hgs
parents:
diff changeset
  1937
    
hgs
parents:
diff changeset
  1938
    RArray<TTime> timestamps;
hgs
parents:
diff changeset
  1939
    
hgs
parents:
diff changeset
  1940
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
  1941
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
  1942
hgs
parents:
diff changeset
  1943
    // ConfigureAndStartTimerL should panic:
hgs
parents:
diff changeset
  1944
    //  Category: "CFlexPeriodic" 
hgs
parents:
diff changeset
  1945
    //  Reason:   24 (EFlexTimerServerIllegalTimerValue)
hgs
parents:
diff changeset
  1946
    // Set the panic code to acceptable exit reason
hgs
parents:
diff changeset
  1947
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::EPanic, 24 );
hgs
parents:
diff changeset
  1948
hgs
parents:
diff changeset
  1949
    ConfigureAndStartTimerL<TTimeIntervalMicroSeconds, TTimeIntervalMicroSeconds>(
hgs
parents:
diff changeset
  1950
        timestamps,
hgs
parents:
diff changeset
  1951
        KIllegalValue,
hgs
parents:
diff changeset
  1952
        KAllowedValue,
hgs
parents:
diff changeset
  1953
        KAllowedValue,
hgs
parents:
diff changeset
  1954
        KAllowedValue );
hgs
parents:
diff changeset
  1955
hgs
parents:
diff changeset
  1956
    // No panic, change result back to normal
hgs
parents:
diff changeset
  1957
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::ENormal, KErrNone );
hgs
parents:
diff changeset
  1958
    aResult.SetResult( KErrGeneral, _L("Test case failed. No panic.") );
hgs
parents:
diff changeset
  1959
    
hgs
parents:
diff changeset
  1960
    // Clean up
hgs
parents:
diff changeset
  1961
    timestamps.Close();
hgs
parents:
diff changeset
  1962
hgs
parents:
diff changeset
  1963
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
  1964
hgs
parents:
diff changeset
  1965
    return KErrNone;
hgs
parents:
diff changeset
  1966
    }
hgs
parents:
diff changeset
  1967
hgs
parents:
diff changeset
  1968
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1969
// TEST CASE: Start timer with maximum interval, 64 bit interface
hgs
parents:
diff changeset
  1970
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1971
//
hgs
parents:
diff changeset
  1972
TInt CTestFlexPeriodic::StartWithMaximumInterval64L(
hgs
parents:
diff changeset
  1973
    TTestResult& aResult, 
hgs
parents:
diff changeset
  1974
    CTestFlexTimer* aCallback  )
hgs
parents:
diff changeset
  1975
    {
hgs
parents:
diff changeset
  1976
    __UHEAP_MARK;
hgs
parents:
diff changeset
  1977
hgs
parents:
diff changeset
  1978
    const TInt KAllowedValue( 1 );
hgs
parents:
diff changeset
  1979
    const TInt64 KIllegalValue( 0x7FFFFFFFFFFFFFFF );
hgs
parents:
diff changeset
  1980
    
hgs
parents:
diff changeset
  1981
    RArray<TTime> timestamps;
hgs
parents:
diff changeset
  1982
    
hgs
parents:
diff changeset
  1983
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
  1984
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
  1985
hgs
parents:
diff changeset
  1986
    // ConfigureAndStartTimerL should panic:
hgs
parents:
diff changeset
  1987
    //  Category: "CFlexPeriodic" 
hgs
parents:
diff changeset
  1988
    //  Reason:   24 (EFlexTimerServerIllegalTimerValue)
hgs
parents:
diff changeset
  1989
    // Set the panic code to acceptable exit reason
hgs
parents:
diff changeset
  1990
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::EPanic, 24 );
hgs
parents:
diff changeset
  1991
hgs
parents:
diff changeset
  1992
    ConfigureAndStartTimerL<TTimeIntervalMicroSeconds, TTimeIntervalMicroSeconds>(
hgs
parents:
diff changeset
  1993
        timestamps,
hgs
parents:
diff changeset
  1994
        KAllowedValue,
hgs
parents:
diff changeset
  1995
        KIllegalValue,
hgs
parents:
diff changeset
  1996
        KAllowedValue,
hgs
parents:
diff changeset
  1997
        KAllowedValue );
hgs
parents:
diff changeset
  1998
hgs
parents:
diff changeset
  1999
    // No panic, change result back to normal
hgs
parents:
diff changeset
  2000
    aCallback->TestModuleIf().SetExitReason( CTestModuleIf::ENormal, KErrNone );
hgs
parents:
diff changeset
  2001
    aResult.SetResult( KErrGeneral, _L("Test case failed. No panic.") );
hgs
parents:
diff changeset
  2002
    
hgs
parents:
diff changeset
  2003
    // Clean up
hgs
parents:
diff changeset
  2004
    timestamps.Close();
hgs
parents:
diff changeset
  2005
hgs
parents:
diff changeset
  2006
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
  2007
hgs
parents:
diff changeset
  2008
    return KErrNone;
hgs
parents:
diff changeset
  2009
    }
hgs
parents:
diff changeset
  2010
hgs
parents:
diff changeset
  2011
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2012
// TEST CASE: Start timer with NULL callback (32 bit)
hgs
parents:
diff changeset
  2013
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2014
//
hgs
parents:
diff changeset
  2015
TInt CTestFlexPeriodic::StartWithNullCallBack32L(
hgs
parents:
diff changeset
  2016
    TTestResult& aResult, 
hgs
parents:
diff changeset
  2017
    CTestFlexTimer* aCallback )
hgs
parents:
diff changeset
  2018
    {
hgs
parents:
diff changeset
  2019
    return StartWithNullCallBackL<TTimeIntervalMicroSeconds32>( aResult, aCallback );
hgs
parents:
diff changeset
  2020
    }
hgs
parents:
diff changeset
  2021
hgs
parents:
diff changeset
  2022
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2023
// TEST CASE: Start timer with NULL callback (64 bit)
hgs
parents:
diff changeset
  2024
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2025
//
hgs
parents:
diff changeset
  2026
TInt CTestFlexPeriodic::StartWithNullCallBack64L(
hgs
parents:
diff changeset
  2027
    TTestResult& aResult, 
hgs
parents:
diff changeset
  2028
    CTestFlexTimer* aCallback )
hgs
parents:
diff changeset
  2029
    {
hgs
parents:
diff changeset
  2030
    return StartWithNullCallBackL<TTimeIntervalMicroSeconds>( aResult, aCallback );
hgs
parents:
diff changeset
  2031
    }
hgs
parents:
diff changeset
  2032
hgs
parents:
diff changeset
  2033
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2034
// TEST CASE: Client crashes
hgs
parents:
diff changeset
  2035
// 1) Start two timers in separate threads
hgs
parents:
diff changeset
  2036
// 2) The 1st timer will panic after a while
hgs
parents:
diff changeset
  2037
// 3) Check that the 2nd timer is ok -> server works OK
hgs
parents:
diff changeset
  2038
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2039
//
hgs
parents:
diff changeset
  2040
TInt CTestFlexPeriodic::ClientCrashL(
hgs
parents:
diff changeset
  2041
    TTestResult& aResult, 
hgs
parents:
diff changeset
  2042
    CTestFlexTimer* aCallback )
hgs
parents:
diff changeset
  2043
    {
hgs
parents:
diff changeset
  2044
    __UHEAP_MARK;
hgs
parents:
diff changeset
  2045
hgs
parents:
diff changeset
  2046
    // Must be bigger than ClientCrashL and StartOneTimerL
hgs
parents:
diff changeset
  2047
    const TTimeIntervalMicroSeconds32 KTestRunTime( 6000000 );
hgs
parents:
diff changeset
  2048
hgs
parents:
diff changeset
  2049
    // Default result if anything leaves i.e. no analyze done.
hgs
parents:
diff changeset
  2050
    aResult.SetResult( KErrGeneral, _L("Test case leaved") );
hgs
parents:
diff changeset
  2051
    
hgs
parents:
diff changeset
  2052
    // Start test case ClientCrashL
hgs
parents:
diff changeset
  2053
    RThread threadA;
hgs
parents:
diff changeset
  2054
    TTestResult resultA;
hgs
parents:
diff changeset
  2055
    TTestCaseArguments caseA = { DoPanicL, resultA, aCallback }; 
hgs
parents:
diff changeset
  2056
    RunInThread( threadA, caseA );
hgs
parents:
diff changeset
  2057
hgs
parents:
diff changeset
  2058
    // Start test case StartOneTimerL
hgs
parents:
diff changeset
  2059
    RThread threadB;
hgs
parents:
diff changeset
  2060
    TTestResult resultB;
hgs
parents:
diff changeset
  2061
    TTestCaseArguments caseB = { StartOneTimerL, resultB, aCallback }; 
hgs
parents:
diff changeset
  2062
    RunInThread( threadB, caseB );
hgs
parents:
diff changeset
  2063
hgs
parents:
diff changeset
  2064
                            //    //  ___     _____
hgs
parents:
diff changeset
  2065
    WaitL( KTestRunTime ); // // // //_ // //  //
hgs
parents:
diff changeset
  2066
                          //_//_// //  // //  //
hgs
parents:
diff changeset
  2067
hgs
parents:
diff changeset
  2068
    // Analyze results
hgs
parents:
diff changeset
  2069
    aResult.SetResult(KErrNone, _L("Test case passed.") );
hgs
parents:
diff changeset
  2070
hgs
parents:
diff changeset
  2071
    // ClientCrashL should be paniced with reason 0xDEAD
hgs
parents:
diff changeset
  2072
    if ( threadA.ExitType() != EExitPanic || threadA.ExitReason() != 0xDEAD )
hgs
parents:
diff changeset
  2073
        {
hgs
parents:
diff changeset
  2074
        aResult.SetResult( 
hgs
parents:
diff changeset
  2075
            KErrGeneral, 
hgs
parents:
diff changeset
  2076
            _L("Test case failed. Client did not panic (correctly).") );
hgs
parents:
diff changeset
  2077
        }
hgs
parents:
diff changeset
  2078
    // StartOneTimerL should be finished ok
hgs
parents:
diff changeset
  2079
    else if ( resultB.iResult != KErrNone || threadB.ExitType() == EExitPanic )
hgs
parents:
diff changeset
  2080
        {
hgs
parents:
diff changeset
  2081
        aResult.SetResult( 
hgs
parents:
diff changeset
  2082
            KErrGeneral, 
hgs
parents:
diff changeset
  2083
            _L("Test case failed. Timer failed.") );
hgs
parents:
diff changeset
  2084
        }
hgs
parents:
diff changeset
  2085
hgs
parents:
diff changeset
  2086
    threadA.Close();
hgs
parents:
diff changeset
  2087
    threadB.Close();
hgs
parents:
diff changeset
  2088
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
  2089
hgs
parents:
diff changeset
  2090
    return KErrNone;
hgs
parents:
diff changeset
  2091
    }