kerneltest/e32test/prime/t_timer.cpp
changeset 0 a41df078684a
child 6 0173bcd7697c
equal deleted inserted replaced
-1:000000000000 0:a41df078684a
       
     1 // Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of the License "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // e32test\prime\t_timer.cpp
       
    15 // Overview:
       
    16 // Time and Timer tests.
       
    17 // API Information:
       
    18 // RTimer, TTime
       
    19 // Details:
       
    20 // - Test relative timers using the RTimer::After() method. Verify 
       
    21 // results are as expected.
       
    22 // - Set the date and time using TTime::HomeTime() and verify results
       
    23 // are as expected.
       
    24 // - Test absolute timers using RTimer::At() method. Verify results
       
    25 // are as expected.
       
    26 // - Test the timer is ok if its thread terminates.
       
    27 // - Test synchronising time via the RTimer::Lock() method. Verify 
       
    28 // results are as expected.
       
    29 // - Test locked timers abort when the system time changes.
       
    30 // - Test User::ResetInactivityTime() results are as expected.
       
    31 // Platforms/Drives/Compatibility:
       
    32 // All.
       
    33 // Assumptions/Requirement/Pre-requisites:
       
    34 // Failures and causes:
       
    35 // Base Port information:
       
    36 // 
       
    37 //
       
    38 
       
    39 // the following was used to help debug emulator implemenation of user mode callbacks
       
    40 //#define REQUEST_STATUS_POLL_SOAK_TEST  
       
    41 
       
    42 #define __E32TEST_EXTENSION__
       
    43 
       
    44 #include <e32test.h>
       
    45 #include <e32hal.h>
       
    46 #include <e32panic.h>
       
    47 #include <hal.h>
       
    48 #include <e32power.h>
       
    49 #include <e32math.h>
       
    50 
       
    51 LOCAL_D RTest test(_L("T_TIMER"));
       
    52 TInt MachineUid;
       
    53 
       
    54 TInt AfterNegative(TAny*)
       
    55 	{
       
    56 	RTimer t;
       
    57 	TInt r=t.CreateLocal();
       
    58 	test(r==KErrNone);
       
    59 	TRequestStatus s;
       
    60 	t.After(s,-1);
       
    61 	return KErrNone;
       
    62 	}
       
    63 
       
    64 TInt AfterTwice(TAny*)
       
    65 	{
       
    66 	RTimer t;
       
    67 	TInt r=t.CreateLocal();
       
    68 	test(r==KErrNone);
       
    69 	TRequestStatus s;
       
    70 	t.After(s,1000000);
       
    71 	test(s==KRequestPending);
       
    72 	t.After(s,1000000);
       
    73 	return KErrNone;
       
    74 	}
       
    75 
       
    76 void PrintTime()
       
    77 	{
       
    78 	TTime now;
       
    79 	now.HomeTime();
       
    80 	TDateTime dt(now.DateTime());
       
    81 	test.Printf(_L("Time: %02d:%02d:%02d:%06d\n"),dt.Hour(),dt.Minute(),dt.Second(),dt.MicroSecond());
       
    82 	}
       
    83 
       
    84 TBool RequestIsComplete(TRequestStatus& s)
       
    85 	{
       
    86 	return s != KRequestPending;
       
    87 	}
       
    88 
       
    89 LOCAL_C void testRel()
       
    90 //
       
    91 // Test relative timers.
       
    92 //
       
    93 	{
       
    94 
       
    95 	test.Start(_L("After 0"));
       
    96 	RTimer t;
       
    97 	TInt r=t.CreateLocal();
       
    98 	test(r==KErrNone);
       
    99 	TRequestStatus s;
       
   100 	t.After(s,0);
       
   101 	test(s==KRequestPending || s==KErrNone);
       
   102 	User::WaitForRequest(s);
       
   103 	test(s==KErrNone);
       
   104 //
       
   105 	test.Next(_L("After 1 tenth"));
       
   106 	t.After(s,100000);
       
   107 #ifdef __WINS__
       
   108 	// On WINS we can't guarantee thread scheduling so timer may already have
       
   109 	// completed before we get to test the status. Therefore, allow KErrNone.
       
   110 	test(s==KRequestPending || s==KErrNone);
       
   111 	if(s==KErrNone)
       
   112 		test.Printf(_L("NOTE: completed 'early'"));
       
   113 #else
       
   114 	test(s==KRequestPending);
       
   115 #endif
       
   116 	User::WaitForRequest(s);
       
   117 	test(s==KErrNone);
       
   118 //
       
   119 	test.Next(_L("After -1 millionth"));
       
   120 	RThread thread;
       
   121 	r=thread.Create(_L("After -1"),AfterNegative,KDefaultStackSize,NULL,&thread);
       
   122 	test(r==KErrNone);
       
   123 	thread.Logon(s);
       
   124 	test(s==KRequestPending);
       
   125 	TBool justInTime=User::JustInTime();
       
   126 	User::SetJustInTime(EFalse);
       
   127 	thread.Resume();
       
   128 	User::WaitForRequest(s);
       
   129 	test(s==ERTimerAfterTimeNegative);
       
   130 	test(thread.ExitCategory()==_L("USER"));
       
   131 	test(thread.ExitReason()==ERTimerAfterTimeNegative);
       
   132 	test(thread.ExitType()==EExitPanic);
       
   133 	CLOSE_AND_WAIT(thread);
       
   134 	User::SetJustInTime(justInTime);
       
   135 //
       
   136 	test.Next(_L("After 1 second"));
       
   137 	t.After(s,1000000);
       
   138 	test(s==KRequestPending);
       
   139 	User::WaitForRequest(s);
       
   140 	test(s==KErrNone);
       
   141 //
       
   142 	test.Next(_L("After 1 second polling"));
       
   143 	t.After(s,1000000);
       
   144 	test(s==KRequestPending);
       
   145 	// Have to be careful the compiler doesn't optimise this away
       
   146 	while(!RequestIsComplete(s))
       
   147 		; // poll
       
   148 	test(s==KErrNone);
       
   149 	User::WaitForRequest(s);
       
   150 //
       
   151 	test.Next(_L("Cancel"));
       
   152 	t.After(s,1000000);
       
   153 	test(s==KRequestPending);
       
   154 	t.Cancel();
       
   155 	User::WaitForRequest(s);
       
   156 	test(s==KErrCancel);
       
   157 	t.Close();
       
   158 //
       
   159 	test.Next(_L("Request twice"));
       
   160 	r=thread.Create(_L("After twice"),AfterTwice,KDefaultStackSize,NULL,&thread);
       
   161 	test(r==KErrNone);
       
   162 	thread.Logon(s);
       
   163 	test(s==KRequestPending);
       
   164 	User::SetJustInTime(EFalse);
       
   165 	thread.Resume();
       
   166 	User::WaitForRequest(s);
       
   167 	test(s==ETimerAlreadyPending);
       
   168 	test(thread.ExitCategory()==_L("KERN-EXEC"));
       
   169 	test(thread.ExitReason()==ETimerAlreadyPending);
       
   170 	test(thread.ExitType()==EExitPanic);
       
   171 	CLOSE_AND_WAIT(thread);
       
   172 	User::SetJustInTime(justInTime);
       
   173 //
       
   174 	test.End();
       
   175 	}
       
   176 
       
   177 #ifdef REQUEST_STATUS_POLL_SOAK_TEST
       
   178 
       
   179 static volatile TBool PollTestRunning;
       
   180 
       
   181 LOCAL_C TInt PollThread(TAny* aArg)
       
   182 	{
       
   183 	const TInt KMaxTimers = 1000;
       
   184 
       
   185 	TInt threadIndex = (TInt)aArg;
       
   186 	TInt64 seed = 5511498647534504549 + RThread().Id();
       
   187 	RTimer timers[KMaxTimers];
       
   188 	TRequestStatus statuses[KMaxTimers];
       
   189 
       
   190 	TInt i;
       
   191 	for (i = 0 ; i < KMaxTimers ; ++i)
       
   192 		{
       
   193 		test_KErrNone(timers[i].CreateLocal());
       
   194 		statuses[i] = 1;
       
   195 		}
       
   196 
       
   197 	TInt totalComplete = 0;
       
   198 	TInt totalWaiting = 0;
       
   199 	
       
   200 	while(PollTestRunning)
       
   201 		{
       
   202 		for (i = 0 ; i < KMaxTimers ; ++i)
       
   203 			{
       
   204 			switch(statuses[i].Int())
       
   205 				{
       
   206 				case KRequestPending:
       
   207 					// do nothing
       
   208 					++totalWaiting;
       
   209 					break;
       
   210 					
       
   211 				case KErrNone:
       
   212 					User::WaitForRequest(statuses[i]);
       
   213 					++totalComplete;
       
   214 					// fall through
       
   215 
       
   216 				case 1:
       
   217 					{
       
   218 					TInt after = ((TUint)Math::Rand(seed) >> 28) + 1;
       
   219 					timers[i].HighRes(statuses[i], after);
       
   220 					}
       
   221 					break;
       
   222 
       
   223 				default:
       
   224 					return statuses[i].Int();
       
   225 				}
       
   226 			}
       
   227 		}
       
   228 		
       
   229 	for (i = 0 ; i < KMaxTimers ; ++i)
       
   230 		{
       
   231 		User::WaitForRequest(statuses[i]);
       
   232 		if (statuses[i].Int() != KErrNone)
       
   233 			return statuses[i].Int();
       
   234 		timers[i].Close();
       
   235 		}
       
   236 
       
   237 	RDebug::Printf("%d: %d %d\n", threadIndex, totalComplete, totalWaiting);
       
   238 	return KErrNone;
       
   239 	}
       
   240 
       
   241 LOCAL_C void testPoll()
       
   242 	{
       
   243 	const TInt KMaxThreads = 10;
       
   244 	const TInt KSecondsToTest = 60;
       
   245 
       
   246 	RThread threads[KMaxThreads];
       
   247 	TRequestStatus statuses[KMaxThreads];
       
   248 	
       
   249 	test.Start(_L("Test polling"));
       
   250 
       
   251 	PollTestRunning = ETrue;
       
   252 
       
   253 	TInt i;
       
   254 	for (i = 0 ; i < KMaxThreads ; ++i)
       
   255 		{
       
   256 		test_KErrNone(threads[i].Create(KNullDesC, PollThread, 0x1000, NULL, (TAny*)i));
       
   257 		threads[i].Logon(statuses[i]);
       
   258 		threads[i].Resume();
       
   259 		}
       
   260 
       
   261 	User::After(KSecondsToTest * 1000 * 1000);
       
   262 	
       
   263 	PollTestRunning = EFalse;
       
   264 
       
   265 	for (i = 0 ; i < KMaxThreads ; ++i)
       
   266 		{
       
   267 		User::WaitForRequest(statuses[i]);
       
   268 		test_KErrNone(statuses[i].Int());
       
   269 		test_Equal(EExitKill, threads[i].ExitType());
       
   270 		threads[i].Close();
       
   271 		}
       
   272 	
       
   273 	test.End();
       
   274 	}
       
   275 
       
   276 #endif
       
   277 
       
   278 LOCAL_C void testHomeTime()
       
   279 //
       
   280 // Test HomeTime.
       
   281 //
       
   282 	{
       
   283 
       
   284     TTime t1, t2;
       
   285     t1.HomeTime();
       
   286     for (TInt x=0;x<100;x++)
       
   287         {
       
   288         do
       
   289             {
       
   290             t2.HomeTime();
       
   291             }
       
   292         while (t2==t1);
       
   293 #if defined(_DEBUG)
       
   294 		TDateTime dt=t2.DateTime();
       
   295 		test.Printf(_L("%d:%d\r\n"),dt.Second(),dt.MicroSecond());
       
   296 #endif
       
   297         test(t2>t1);
       
   298         t1=t2;
       
   299         }
       
   300 #if defined(_DEBUG)
       
   301 	test.Printf(_L("\r\n"));
       
   302 #endif
       
   303     }
       
   304 
       
   305 TInt AtTwice(TAny*)
       
   306 	{
       
   307 	RTimer t;
       
   308 	TInt r=t.CreateLocal();
       
   309 	test(r==KErrNone);
       
   310 	TRequestStatus s;
       
   311 	TTime time;
       
   312 	time.UniversalTime();
       
   313 	t.AtUTC(s,time+TTimeIntervalSeconds(1));
       
   314 	test(s==KRequestPending);
       
   315 	t.AtUTC(s,time+TTimeIntervalSeconds(2));
       
   316 	return KErrNone;
       
   317 	}
       
   318 
       
   319 TInt AtAfter(TAny*)
       
   320 	{
       
   321 	RTimer t;
       
   322 	TInt r=t.CreateLocal();
       
   323 	test(r==KErrNone);
       
   324 	TRequestStatus s;
       
   325 	TTime time;
       
   326 	time.UniversalTime();
       
   327 	t.AtUTC(s,time+TTimeIntervalSeconds(1));
       
   328 	test(s==KRequestPending);
       
   329 	t.After(s,1000000);
       
   330 	return KErrNone;
       
   331 	}
       
   332 
       
   333 TInt AfterAt(TAny*)
       
   334 	{
       
   335 	RTimer t;
       
   336 	TInt r=t.CreateLocal();
       
   337 	test(r==KErrNone);
       
   338 	TRequestStatus s;
       
   339 	TTime time;
       
   340 	time.UniversalTime();
       
   341 	t.After(s,1000000);
       
   342 	test(s==KRequestPending);
       
   343 	t.AtUTC(s,time+TTimeIntervalSeconds(2));
       
   344 	return KErrNone;
       
   345 	}
       
   346 
       
   347 LOCAL_C void testAbs()
       
   348 //
       
   349 // Test absolute timers.
       
   350 //
       
   351 	{
       
   352 
       
   353 	test.Start(_L("Now -1"));
       
   354 	RTimer t;
       
   355 	TInt r=t.CreateLocal();
       
   356 	test(r==KErrNone);
       
   357 	TRequestStatus s;
       
   358 	TTime time;
       
   359 	time.UniversalTime();
       
   360 	t.AtUTC(s,time+TTimeIntervalSeconds(-2));
       
   361 	test(s==KErrUnderflow);  // =KRequestPending
       
   362 	User::WaitForRequest(s);
       
   363 	test(s==KErrUnderflow);
       
   364 //
       
   365 	TTime time2;
       
   366 	test.Next(_L("Synchronise to clock"));
       
   367 	time.UniversalTime();
       
   368     TDateTime dateTime=time.DateTime();
       
   369 	dateTime.SetMicroSecond(0);
       
   370     time=dateTime;
       
   371  	time+=TTimeIntervalSeconds(2);
       
   372 	t.AtUTC(s,time);
       
   373 	User::WaitForRequest(s);
       
   374 
       
   375 	test.Next(_L("Now +1"));
       
   376 	time += TTimeIntervalSeconds(1);
       
   377 	t.AtUTC(s,time);
       
   378 	test(s==KRequestPending);
       
   379 	User::WaitForRequest(s);
       
   380 	time2.UniversalTime();
       
   381 	test(s==KErrNone);
       
   382 	TTimeIntervalMicroSeconds delay=time2.MicroSecondsFrom(time);
       
   383 	// Test we are in the same second as the requested time...
       
   384 	test(delay>=TTimeIntervalMicroSeconds(0));
       
   385 	test(delay<TTimeIntervalMicroSeconds(1000000));
       
   386 
       
   387 	test.Next(_L("Now +3"));
       
   388 	time += TTimeIntervalSeconds(3);
       
   389 	t.AtUTC(s,time);
       
   390 	test(s==KRequestPending);
       
   391 	User::WaitForRequest(s);
       
   392 	time2.UniversalTime();
       
   393 	test(s==KErrNone);
       
   394 	delay=time2.MicroSecondsFrom(time);
       
   395 	// Test we are in the same second as the requested time...
       
   396 	test(delay>=TTimeIntervalMicroSeconds(0));
       
   397 	test(delay<TTimeIntervalMicroSeconds(1000000));
       
   398 //
       
   399 	test.Next(_L("UTC vs local"));
       
   400 	TTimeIntervalSeconds savedOffset = User::UTCOffset();
       
   401 	User::SetUTCOffset(3600);
       
   402 	
       
   403 	time.HomeTime();
       
   404 	time += TTimeIntervalSeconds(1);
       
   405 	t.At(s,time);
       
   406 	test(s==KRequestPending);
       
   407 	User::WaitForRequest(s);
       
   408 	time2.HomeTime();
       
   409 	test(s==KErrNone);
       
   410 	delay=time2.MicroSecondsFrom(time);
       
   411 	// Test we are in the same second as the requested time...
       
   412 	test(delay>=TTimeIntervalMicroSeconds(0));
       
   413 	test(delay<TTimeIntervalMicroSeconds(1000000));
       
   414 	
       
   415 	time.UniversalTime();
       
   416 	time += TTimeIntervalSeconds(1);
       
   417 	t.AtUTC(s,time);
       
   418 	test(s==KRequestPending);
       
   419 	User::WaitForRequest(s);
       
   420 	time2.UniversalTime();
       
   421 	test(s==KErrNone);
       
   422 	delay=time2.MicroSecondsFrom(time);
       
   423 	// Test we are in the same second as the requested time...
       
   424 	test(delay>=TTimeIntervalMicroSeconds(0));
       
   425 	test(delay<TTimeIntervalMicroSeconds(1000000));
       
   426 	
       
   427 	User::SetUTCOffset(savedOffset);	
       
   428 //
       
   429 	test.Next(_L("Cancel"));
       
   430 	time.UniversalTime();
       
   431 	t.AtUTC(s,time+TTimeIntervalSeconds(10));
       
   432 	test(s==KRequestPending);
       
   433 	t.Cancel();
       
   434 	User::WaitForRequest(s);
       
   435 	test(s==KErrCancel);
       
   436 	t.Close();						
       
   437 //
       
   438 	test.Next(_L("Request twice"));
       
   439 	RThread thread;
       
   440 	r=thread.Create(_L("At twice"),AtTwice,KDefaultStackSize,NULL,&thread);
       
   441 	test(r==KErrNone);
       
   442 	thread.Logon(s);
       
   443 	test(s==KRequestPending);
       
   444 	TBool justInTime=User::JustInTime();
       
   445 	User::SetJustInTime(EFalse);
       
   446 	thread.Resume();
       
   447 	User::WaitForRequest(s);
       
   448 	User::SetJustInTime(justInTime);
       
   449 	test(s==ETimerAlreadyPending);
       
   450 	test(thread.ExitCategory()==_L("KERN-EXEC"));
       
   451 	test(thread.ExitReason()==ETimerAlreadyPending);
       
   452 	test(thread.ExitType()==EExitPanic);
       
   453 	CLOSE_AND_WAIT(thread);
       
   454 //
       
   455 	r=thread.Create(_L("At After"),AtAfter,KDefaultStackSize,NULL,&thread);
       
   456 	test(r==KErrNone);
       
   457 	thread.Logon(s);
       
   458 	test(s==KRequestPending);
       
   459 	User::SetJustInTime(EFalse);
       
   460 	thread.Resume();
       
   461 	User::WaitForRequest(s);
       
   462 	User::SetJustInTime(justInTime);
       
   463 	test(s==ETimerAlreadyPending);
       
   464 	test(thread.ExitCategory()==_L("KERN-EXEC"));
       
   465 	test(thread.ExitReason()==ETimerAlreadyPending);
       
   466 	test(thread.ExitType()==EExitPanic);
       
   467 	CLOSE_AND_WAIT(thread);
       
   468 //
       
   469 	r=thread.Create(_L("After At"),AfterAt,KDefaultStackSize,NULL,&thread);
       
   470 	test(r==KErrNone);
       
   471 	thread.Logon(s);
       
   472 	test(s==KRequestPending);
       
   473 	User::SetJustInTime(EFalse);
       
   474 	thread.Resume();
       
   475 	User::WaitForRequest(s);
       
   476 	User::SetJustInTime(justInTime);
       
   477 	test(s==ETimerAlreadyPending);
       
   478 	test(thread.ExitCategory()==_L("KERN-EXEC"));
       
   479 	test(thread.ExitReason()==ETimerAlreadyPending);
       
   480 	test(thread.ExitType()==EExitPanic);
       
   481 	CLOSE_AND_WAIT(thread);
       
   482 //
       
   483 	test.End();
       
   484 	}
       
   485 
       
   486 TInt LockTwice(TAny*)
       
   487 	{
       
   488 	RTimer t;
       
   489 	test(t.CreateLocal()==KErrNone);
       
   490 	TRequestStatus stat;
       
   491 	t.Lock(stat, ETwelveOClock);
       
   492 	User::WaitForRequest(stat);
       
   493 	test(stat==KErrGeneral);
       
   494 	t.Lock(stat, ETwelveOClock);
       
   495 	t.Lock(stat, ETwelveOClock);
       
   496 	return KErrNone;
       
   497 	}
       
   498 
       
   499 LOCAL_C void testLock()
       
   500 //
       
   501 // Test locked timers
       
   502 //
       
   503 	{
       
   504 
       
   505 	test.Start(_L("Test synchronise to ETwelveOClock"));
       
   506 	RTimer t;
       
   507 	TTime time,time2;
       
   508 	test(t.CreateLocal()==KErrNone);
       
   509 	TRequestStatus stat;
       
   510 	t.Lock(stat, ETwelveOClock);
       
   511 	User::WaitForRequest(stat);
       
   512 	test(stat==KErrGeneral);
       
   513 	time.UniversalTime();
       
   514 	t.Lock(stat, ETwelveOClock);
       
   515 	User::WaitForRequest(stat);
       
   516 	test(stat==KErrNone);
       
   517 	time2.UniversalTime();
       
   518 	test(time<time2);
       
   519 	User::After(500000);
       
   520 	test.Next(_L("Test sync to EOneOClock for 4 seconds"));
       
   521 	t.Lock(stat, EOneOClock);
       
   522 	User::WaitForRequest(stat);
       
   523 	test(stat==KErrGeneral);
       
   524 	time.UniversalTime();
       
   525 	TInt i;
       
   526 	for (i=0; i<5; i++)
       
   527 		{
       
   528 		t.Lock(stat, EOneOClock);
       
   529 		User::WaitForRequest(stat);
       
   530 		test(stat==KErrNone);
       
   531 		test.Printf(_L("."));
       
   532 		}
       
   533 	time2.UniversalTime();
       
   534 	TTimeIntervalSeconds ti;
       
   535 	test(time2.SecondsFrom(time, ti)==KErrNone);
       
   536 	test(ti>=TTimeIntervalSeconds(4));
       
   537 	test.Printf(_L("\n"));
       
   538 	test.Next(_L("Test sync to every half second, from EFourOClock for 5 seconds"));
       
   539 	t.Lock(stat, ETwelveOClock);
       
   540 	User::WaitForRequest(stat);
       
   541 	for (i=0; i<5; i++)
       
   542 		{
       
   543 		t.Lock(stat, EFourOClock);
       
   544 		User::WaitForRequest(stat);
       
   545 		test(stat==KErrNone);
       
   546 		test.Printf(_L("."));
       
   547 		t.Lock(stat, ETenOClock);
       
   548 		User::WaitForRequest(stat);
       
   549 		test(stat==KErrNone);
       
   550 		test.Printf(_L(","));
       
   551 		}
       
   552 	test.Printf(_L("\n"));
       
   553 	test.Next(_L("Test KErrGeneral after delay"));
       
   554 	User::After(1000000);
       
   555 	t.Lock(stat,EThreeOClock);
       
   556 	User::WaitForRequest(stat);
       
   557 	test(stat==KErrGeneral);
       
   558 	test.Next(_L("Test cancel, and re-request immediately"));
       
   559 	User::After(1000000);
       
   560 	t.Lock(stat, ETwelveOClock);
       
   561 	User::WaitForRequest(stat);
       
   562 	test(stat==KErrGeneral);
       
   563 	t.Lock(stat, EElevenOClock);
       
   564 	t.Cancel();
       
   565 	User::WaitForRequest(stat);
       
   566 	test(stat==KErrCancel);
       
   567 	t.Lock(stat, EElevenOClock);
       
   568 	User::WaitForRequest(stat);
       
   569 	test(stat==KErrNone);
       
   570 	test.Next(_L("Test complete a request at 1, then cancel a request for 11, and re-request at 3 gives KErrGeneral"));
       
   571 	User::After(1000000);
       
   572 	t.Lock(stat, ETwelveOClock);
       
   573 	User::WaitForRequest(stat);
       
   574 	test(stat==KErrGeneral);
       
   575 	t.Lock(stat,EOneOClock);
       
   576 	User::WaitForRequest(stat);
       
   577 	test(stat==KErrNone);
       
   578 	t.Lock(stat,EElevenOClock);
       
   579 	User::After(400000); // ensure EThreeOClock is in the past
       
   580 	t.Cancel();
       
   581 	User::WaitForRequest(stat);
       
   582 	test(stat==KErrCancel);
       
   583 	t.Lock(stat,EThreeOClock);
       
   584 	User::WaitForRequest(stat);
       
   585 	// EThreeOClock should be more than one second away from the previous timer expiration
       
   586 	test(stat==KErrGeneral);
       
   587 //
       
   588 	test.Next(_L("Lock twice"));
       
   589 	RThread thread;
       
   590 	TInt r=thread.Create(_L("Lock twice"),LockTwice,KDefaultStackSize,NULL,&thread);
       
   591 	test(r==KErrNone);
       
   592 	thread.Logon(stat);
       
   593 	test(stat==KRequestPending);
       
   594 	TBool justInTime=User::JustInTime();
       
   595 	User::SetJustInTime(EFalse);
       
   596 	thread.Resume();
       
   597 	User::WaitForRequest(stat);
       
   598 	User::SetJustInTime(justInTime);
       
   599 	test(stat==ETimerAlreadyPending);
       
   600 	test(thread.ExitCategory()==_L("KERN-EXEC"));
       
   601 	test(thread.ExitReason()==ETimerAlreadyPending);
       
   602 	test(thread.ExitType()==EExitPanic);
       
   603 	CLOSE_AND_WAIT(thread);
       
   604 //
       
   605 	
       
   606 #if !(defined(__EPOC32__) && defined(__X86__))
       
   607 	TInt muid = 0;
       
   608 	HAL::Get(HAL::EMachineUid, muid);
       
   609 	if(muid!=HAL::EMachineUid_Lubbock && muid!=HAL::EMachineUid_NE1_TB)
       
   610 		{
       
   611 		test.Next(_L("Test sequential locks fail over on/off"));
       
   612 		RTimer tat;
       
   613 		TRequestStatus sat;
       
   614 		r=tat.CreateLocal();
       
   615 		TTime now;
       
   616 		now.UniversalTime();
       
   617 		tat.At(sat, now+TTimeIntervalSeconds(10)); // turn on in 10 seconds
       
   618 		t.Lock(stat, ETwelveOClock);
       
   619 		User::WaitForRequest(stat);
       
   620 		test(stat==KErrGeneral);
       
   621 		t.Lock(stat, EElevenOClock);
       
   622 		User::WaitForRequest(stat);
       
   623 		PrintTime();
       
   624 		// Go to standby 
       
   625 		r = Power::EnableWakeupEvents(EPwStandby);
       
   626 		test (r == KErrNone);
       
   627 		r = Power::PowerDown();
       
   628 		test (r == KErrNone);
       
   629 		test(stat==KErrNone);
       
   630 		PrintTime();
       
   631 		t.Lock(stat, EElevenOClock);
       
   632 		User::WaitForRequest(stat);
       
   633 		test(stat==KErrGeneral);
       
   634 		tat.Close();
       
   635 		}
       
   636 #endif
       
   637 
       
   638 	t.Close();
       
   639 	test.End();
       
   640 	}
       
   641 
       
   642 
       
   643 void testChange()
       
   644 //
       
   645 // Bug HA-255
       
   646 // Test locked timers abort when the system time changes
       
   647 //
       
   648 	{
       
   649 
       
   650     RTimer rr;
       
   651 	TRequestStatus stat;
       
   652     rr.CreateLocal();
       
   653     rr.Lock(stat, ETwelveOClock);
       
   654     User::WaitForRequest(stat);
       
   655     test(stat==KErrGeneral);
       
   656     RTimer rrr;
       
   657     rrr.CreateLocal();
       
   658     rrr.After(stat, 1000000);
       
   659     User::WaitForRequest(stat);
       
   660     
       
   661 	RTimer r;
       
   662 	TRequestStatus sstat;
       
   663 	TTime t;
       
   664 	r.CreateLocal();
       
   665 	r.Lock(stat,ETwelveOClock);
       
   666 	rr.Lock(sstat,EOneOClock);
       
   667 	User::WaitForRequest(stat);
       
   668 	test(stat==KErrGeneral);
       
   669 	User::WaitForRequest(sstat);
       
   670 	test(sstat==KErrGeneral);
       
   671 	r.Lock(stat,ETwelveOClock);
       
   672 	rr.Lock(sstat,EOneOClock);
       
   673 	User::WaitForRequest(stat);
       
   674 	test(stat==KErrNone);
       
   675 	User::WaitForRequest(sstat);
       
   676 	test(sstat==KErrNone);
       
   677 	t.UniversalTime();
       
   678 	r.Lock(stat,ETwelveOClock);
       
   679 	rr.Lock(sstat,EOneOClock);
       
   680 	TInt ret=User::SetUTCTime(t-TTimeIntervalSeconds(100));
       
   681 	test(ret==KErrNone);
       
   682 	t.UniversalTime();
       
   683 	ret=User::SetUTCTime(t+TTimeIntervalSeconds(100));
       
   684 	test(ret==KErrNone);
       
   685 	User::WaitForRequest(stat);
       
   686 	test(stat==KErrAbort);
       
   687 	User::WaitForRequest(sstat);
       
   688 	test(sstat==KErrAbort);
       
   689 
       
   690 	// Check that changing the *secure* time *doesn't* abort a locked timer
       
   691 	r.Lock(stat, ETwelveOClock);
       
   692 	User::WaitForRequest(stat);		// stat will be KErrGeneral after abort above, but time will be TwelveOClock anyway
       
   693 	t.UniversalTimeSecure();
       
   694 	r.Lock(stat, EEightOClock);
       
   695 	ret = User::SetUTCTimeSecure(t+TTimeIntervalSeconds(100));
       
   696 	User::WaitForRequest(stat);		// this timer should complete at EightOClock with status KErrNone, *not* KErrAbort
       
   697 	r.Lock(sstat, ETwelveOClock);
       
   698 	User::WaitForRequest(sstat);	// this should complete one whole second after we read the secure time above
       
   699 	User::SetUTCTimeSecure(t+TTimeIntervalSeconds(1));
       
   700 	test(stat == KErrNone);
       
   701 	test(sstat == KErrNone);
       
   702 	if (ret != KErrNone)
       
   703 		RDebug::Printf("WARNING: Secure clock change test skipped because secure time could not be changed!");
       
   704 
       
   705 	r.Close();
       
   706 	rr.Close();
       
   707 	rrr.Close();
       
   708 	}
       
   709 
       
   710 void testInactivity()
       
   711 //
       
   712 //
       
   713 //
       
   714 	{
       
   715 	
       
   716 	test.Start(_L("Test User::ResetInactivityTime()"));
       
   717 	RTimer t,t2;
       
   718 	TRequestStatus stat,stat2;
       
   719 	t.CreateLocal();
       
   720 	t2.CreateLocal();
       
   721 	User::ResetInactivityTime();
       
   722 	t.Inactivity(stat, 4);
       
   723 	t2.Inactivity(stat2, 2);
       
   724 	TTime now;
       
   725 	now.UniversalTime();
       
   726 	TInt r=User::SetUTCTime(now+TTimeIntervalDays(1));
       
   727 	test(r==KErrNone);
       
   728 	test(stat==KRequestPending);
       
   729 	test(stat2==KRequestPending);
       
   730 	r=User::SetUTCTime(now-TTimeIntervalDays(1));
       
   731 	test(r==KErrNone);
       
   732 	test(stat==KRequestPending);
       
   733 	test(stat2==KRequestPending);
       
   734 	r=User::SetUTCTime(now);
       
   735 	test(r==KErrNone);
       
   736 	test(stat==KRequestPending);
       
   737 	test(stat2==KRequestPending);
       
   738 	User::After(1000000);
       
   739 	User::ResetInactivityTime();
       
   740 	test(stat==KRequestPending);
       
   741 	test(stat2==KRequestPending);
       
   742 	User::After(3000000);
       
   743 	User::ResetInactivityTime();
       
   744 	test(stat==KRequestPending);
       
   745 	test(stat2!=KRequestPending);
       
   746 	User::After(2000000);
       
   747 	User::ResetInactivityTime();
       
   748 	test(stat==KRequestPending);
       
   749 	User::After(2000000);
       
   750 	User::ResetInactivityTime();
       
   751 	test(stat==KRequestPending);
       
   752 	User::After(5000000);
       
   753 	test(stat!=KRequestPending);
       
   754 	test.End();
       
   755 	}
       
   756 
       
   757 GLDEF_C TInt E32Main()
       
   758 //
       
   759 // Test timers.
       
   760 //
       
   761     {
       
   762 
       
   763 	test.Title();
       
   764 	TInt r=HAL::Get(HAL::EMachineUid,MachineUid);
       
   765 	test(r==KErrNone);
       
   766 	test.Start(_L("Testing relative timers"));
       
   767 	testRel();
       
   768 //
       
   769 #ifdef REQUEST_STATUS_POLL_SOAK_TEST
       
   770 	test.Next(_L("Testing polling"));
       
   771 	testPoll();
       
   772 #endif
       
   773 //
       
   774     test.Next(_L("Testing HomeTime()"));
       
   775     testHomeTime();
       
   776 //
       
   777 	test.Next(_L("Testing absolute timers"));
       
   778 	testAbs();
       
   779 //
       
   780 	test.Next(_L("Testing locked timers"));
       
   781 	testLock();
       
   782 //
       
   783 	test.Next(_L("Testing changing time"));
       
   784 	testChange();
       
   785 //
       
   786 	test.Next(_L("Testing inactivity timers"));
       
   787 	testInactivity();
       
   788 //
       
   789 	test.End();
       
   790 	return(KErrNone);
       
   791     }
       
   792