os/kernelhwsrv/kerneltest/e32test/prime/t_timer.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     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 
    90 LOCAL_C void testRel()
    91 //
    92 // Test relative timers.
    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 
   279 LOCAL_C void testHomeTime()
   280 //
   281 // Test HomeTime.
   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 
   348 LOCAL_C void testAbs()
   349 //
   350 // Test absolute timers.
   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 
   500 LOCAL_C void testLock()
   501 //
   502 // Test locked timers
   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 #if !(defined(__EPOC32__) && defined(__X86__))
   606 	TInt muid = 0;
   607 	HAL::Get(HAL::EMachineUid, muid);
   608 	if(muid!=HAL::EMachineUid_Lubbock && muid!=HAL::EMachineUid_NE1_TB && muid!=HAL::EMachineUid_STE8500)
   609 		{
   610 		test.Next(_L("Test sequential locks fail over on/off"));
   611 		RTimer tat;
   612 		TRequestStatus sat;
   613 		r=tat.CreateLocal();
   614 		TTime now;
   615 		now.UniversalTime();
   616 		tat.AtUTC(sat, now+TTimeIntervalSeconds(10)); // turn on in 10 seconds
   617 		test(sat==KRequestPending);
   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     RTimer rr;
   650 	TRequestStatus stat;
   651     rr.CreateLocal();
   652     rr.Lock(stat, ETwelveOClock);
   653     User::WaitForRequest(stat);
   654     test(stat==KErrGeneral);
   655     RTimer rrr;
   656     rrr.CreateLocal();
   657     rrr.After(stat, 1000000);
   658     User::WaitForRequest(stat);
   659 
   660 	RTimer r;
   661 	TRequestStatus sstat;
   662 	TTime t;
   663 	r.CreateLocal();
   664 	r.Lock(stat,ETwelveOClock);
   665 	rr.Lock(sstat,EOneOClock);
   666 	User::WaitForRequest(stat);
   667 	test(stat==KErrGeneral);
   668 	User::WaitForRequest(sstat);
   669 	test(sstat==KErrGeneral);
   670 	r.Lock(stat,ETwelveOClock);
   671 	rr.Lock(sstat,EOneOClock);
   672 	User::WaitForRequest(stat);
   673 	test(stat==KErrNone);
   674 	User::WaitForRequest(sstat);
   675 	test(sstat==KErrNone);
   676 	t.UniversalTime();
   677 	r.Lock(stat,ETwelveOClock);
   678 	rr.Lock(sstat,EOneOClock);
   679 	TInt ret=User::SetUTCTime(t-TTimeIntervalSeconds(100));
   680 	test(ret==KErrNone);
   681 	t.UniversalTime();
   682 	ret=User::SetUTCTime(t+TTimeIntervalSeconds(100));
   683 	test(ret==KErrNone);
   684 	User::WaitForRequest(stat);
   685 	test(stat==KErrAbort);
   686 	User::WaitForRequest(sstat);
   687 	test(sstat==KErrAbort);
   688 
   689 	// Check that changing the *secure* time *doesn't* abort a locked timer
   690 	r.Lock(stat, ETwelveOClock);
   691 	User::WaitForRequest(stat);		// stat will be KErrGeneral after abort above, but time will be TwelveOClock anyway
   692 	t.UniversalTimeSecure();
   693 	r.Lock(stat, EEightOClock);
   694 	ret = User::SetUTCTimeSecure(t+TTimeIntervalSeconds(100));
   695 	User::WaitForRequest(stat);		// this timer should complete at EightOClock with status KErrNone, *not* KErrAbort
   696 	r.Lock(sstat, ETwelveOClock);
   697 	User::WaitForRequest(sstat);	// this should complete one whole second after we read the secure time above
   698 	User::SetUTCTimeSecure(t+TTimeIntervalSeconds(1));
   699 	test(stat == KErrNone);
   700 	test(sstat == KErrNone);
   701 	if (ret != KErrNone)
   702 		RDebug::Printf("WARNING: Secure clock change test skipped because secure time could not be changed!");
   703 
   704 	r.Close();
   705 	rr.Close();
   706 	rrr.Close();
   707 	}
   708 
   709 void testInactivity()
   710 	{
   711 	test.Start(_L("Test User::ResetInactivityTime()"));
   712 	RTimer t,t2;
   713 	TRequestStatus stat,stat2;
   714 	t.CreateLocal();
   715 	t2.CreateLocal();
   716 	User::ResetInactivityTime();
   717 	t.Inactivity(stat, 4);
   718 	t2.Inactivity(stat2, 2);
   719 	TTime now;
   720 	now.UniversalTime();
   721 	TInt r=User::SetUTCTime(now+TTimeIntervalDays(1));
   722 	test(r==KErrNone);
   723 	test(stat==KRequestPending);
   724 	test(stat2==KRequestPending);
   725 	r=User::SetUTCTime(now-TTimeIntervalDays(1));
   726 	test(r==KErrNone);
   727 	test(stat==KRequestPending);
   728 	test(stat2==KRequestPending);
   729 	r=User::SetUTCTime(now);
   730 	test(r==KErrNone);
   731 	test(stat==KRequestPending);
   732 	test(stat2==KRequestPending);
   733 	User::After(1000000);
   734 	User::ResetInactivityTime();
   735 	test(stat==KRequestPending);
   736 	test(stat2==KRequestPending);
   737 	User::After(3000000);
   738 	User::ResetInactivityTime();
   739 	test(stat==KRequestPending);
   740 	test(stat2!=KRequestPending);
   741 	User::After(2000000);
   742 	User::ResetInactivityTime();
   743 	test(stat==KRequestPending);
   744 	User::After(2000000);
   745 	User::ResetInactivityTime();
   746 	test(stat==KRequestPending);
   747 	User::After(5000000);
   748 	test(stat!=KRequestPending);
   749 	test.End();
   750 	}
   751 
   752 
   753 GLDEF_C TInt E32Main()
   754 //
   755 // Test timers.
   756 //
   757     {
   758 	test.Title();
   759 	TInt r=HAL::Get(HAL::EMachineUid,MachineUid);
   760 	test(r==KErrNone);
   761 	test.Start(_L("Testing relative timers"));
   762 	testRel();
   763 
   764 #ifdef REQUEST_STATUS_POLL_SOAK_TEST
   765 	test.Next(_L("Testing polling"));
   766 	testPoll();
   767 #endif
   768 
   769     test.Next(_L("Testing HomeTime()"));
   770     testHomeTime();
   771 
   772 	test.Next(_L("Testing absolute timers"));
   773 	testAbs();
   774 
   775 	test.Next(_L("Testing locked timers"));
   776 	testLock();
   777 
   778 	test.Next(_L("Testing changing time"));
   779 	testChange();
   780 
   781 	test.Next(_L("Testing inactivity timers"));
   782 	testInactivity();
   783 
   784 	test.End();
   785 	return(KErrNone);
   786     }
   787