--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/system/t_inact.cpp Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,355 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\system\t_inact.cpp
+// Test inactivity timers
+//
+//
+
+#include <e32test.h>
+
+RTest test(_L("T_INACT"));
+
+class CTimer1 : public CTimer
+ {
+public:
+ static CTimer1* NewL();
+ CTimer1();
+ void Start();
+ virtual void RunL();
+ };
+
+class CTimer2 : public CTimer
+ {
+public:
+ static CTimer2* NewL();
+ CTimer2();
+ void Start();
+ virtual void RunL();
+ };
+
+class CTimer3 : public CTimer
+ {
+public:
+ static CTimer3* NewL();
+ CTimer3();
+ void Start();
+ virtual void RunL();
+public:
+ TInt iInactive;
+ };
+
+class CRepeatedTimer : public CTimer
+ {
+public:
+ static CRepeatedTimer* NewL(TInt aCount, TInt aPeriod);
+ CRepeatedTimer();
+ void Start();
+ virtual void RunL();
+public:
+ TInt iCount;
+ TInt iPeriod;
+ };
+
+CActiveScheduler* ActiveSched;
+CTimer1* Timer1;
+CTimer2* Timer2;
+CTimer3* Timer3;
+CRepeatedTimer* RepTimer;
+
+CTimer1::CTimer1()
+ : CTimer(EPriorityStandard)
+ {
+ }
+
+CTimer1* CTimer1::NewL()
+ {
+ CTimer1* pT=new (ELeave) CTimer1;
+ CleanupStack::PushL(pT);
+ pT->ConstructL();
+ CleanupStack::Pop();
+ return pT;
+ }
+
+void CTimer1::Start()
+ {
+ Inactivity(7);
+ }
+
+void CTimer1::RunL()
+ {
+ test.Printf(_L("CTimer1 expired\n"));
+ Start();
+ }
+
+CTimer2::CTimer2()
+ : CTimer(EPriorityStandard)
+ {
+ }
+
+CTimer2* CTimer2::NewL()
+ {
+ CTimer2* pT=new (ELeave) CTimer2;
+ CleanupStack::PushL(pT);
+ pT->ConstructL();
+ CleanupStack::Pop();
+ return pT;
+ }
+
+void CTimer2::Start()
+ {
+ Inactivity(13);
+ }
+
+void CTimer2::RunL()
+ {
+ test.Printf(_L("CTimer2 expired\n"));
+ Start();
+ }
+
+CTimer3::CTimer3()
+ : CTimer(EPriorityStandard)
+ {
+ }
+
+CTimer3* CTimer3::NewL()
+ {
+ CTimer3* pT=new (ELeave) CTimer3;
+ CleanupStack::PushL(pT);
+ pT->ConstructL();
+ CleanupStack::Pop();
+ return pT;
+ }
+
+void CTimer3::Start()
+ {
+ iInactive=User::InactivityTime().Int();
+ After(500000);
+ }
+
+void CTimer3::RunL()
+ {
+ TInt inactive=User::InactivityTime().Int();
+ if (inactive!=iInactive)
+ {
+ iInactive=inactive;
+ test.Printf(_L("%d\n"),inactive);
+ }
+ After(500000);
+ }
+
+CRepeatedTimer::CRepeatedTimer()
+ : CTimer(EPriorityStandard)
+ {
+ }
+
+CRepeatedTimer* CRepeatedTimer::NewL(TInt aCount, TInt aPeriod)
+ {
+ CRepeatedTimer* pT=new (ELeave) CRepeatedTimer;
+ pT->iCount=aCount;
+ pT->iPeriod=aPeriod;
+ CleanupStack::PushL(pT);
+ pT->ConstructL();
+ CleanupStack::Pop();
+ return pT;
+ }
+
+void CRepeatedTimer::Start()
+ {
+ Inactivity(iPeriod);
+ }
+
+void CRepeatedTimer::RunL()
+ {
+ test.Printf(_L("RepeatTimer expired %d\n"),iCount);
+ if (--iCount)
+ Start();
+ else
+ CActiveScheduler::Stop();
+ }
+
+void InitialiseL()
+ {
+ ActiveSched=new (ELeave) CActiveScheduler;
+ Timer1=CTimer1::NewL();
+ Timer2=CTimer2::NewL();
+ Timer3=CTimer3::NewL();
+ RepTimer=CRepeatedTimer::NewL(5,10);
+ CActiveScheduler::Install(ActiveSched);
+ CActiveScheduler::Add(Timer1);
+ CActiveScheduler::Add(Timer2);
+ CActiveScheduler::Add(Timer3);
+ CActiveScheduler::Add(RepTimer);
+ Timer1->Start();
+ Timer2->Start();
+ Timer3->Start();
+ RepTimer->Start();
+ }
+
+void TestNonPositiveTimeout()
+ {
+ TInt ret;
+ TRequestStatus x1,x2;
+ RTimer rt1,rt2;
+
+ test.Next(_L("Test RTimer::Inactivity() with zero timeout"));
+ ret=rt1.CreateLocal();
+ ret=rt2.CreateLocal();
+
+ rt1.Inactivity(x1, 2);
+ User::After(500000);
+ rt2.Inactivity(x2, 0);
+ User::ResetInactivityTime();
+
+ User::WaitForRequest(x1);
+ test(x1==KErrNone);
+ User::WaitForRequest(x2);
+ test(x2==KErrNone);
+
+ test.Next(_L("Test RTimer::Inactivity() with negative timeout"));
+ rt1.Inactivity(x1, -1);
+ User::WaitForRequest(x1);
+ test(x1==KErrArgument);
+ }
+
+GLDEF_C TInt E32Main()
+ {
+ test.Title();
+ __UHEAP_MARK;
+ test.Start(_L("Test RTimer::Inactivity"));
+
+ TestNonPositiveTimeout();
+
+ RTimer t1;
+ RTimer t2;
+ TInt r=t1.CreateLocal();
+ test(r==KErrNone);
+ r=t2.CreateLocal();
+ test(r==KErrNone);
+ test.Printf(_L("\nPress a key...\n"));
+ test.Getch();
+ TRequestStatus s;
+ t1.Inactivity(s,5);
+ TTime before;
+ before.UniversalTime();
+ test.Printf(_L("Wait... "));
+ User::WaitForRequest(s);
+ TTime after;
+ after.UniversalTime();
+ TTimeIntervalMicroSeconds interval=after.MicroSecondsFrom(before);
+ TInt interval_int=I64INT(interval.Int64());
+ test.Printf(_L("Timer expired after %d us\n"),interval_int);
+ test.Printf(_L("Press a key...\n"));
+ test.Getch();
+ t1.Inactivity(s,5);
+ before.UniversalTime();
+ test.Printf(_L("Test changing time"));
+ r=User::SetUTCTime(before+TTimeIntervalDays(1));
+ test(r==KErrNone);
+ test(s==KRequestPending); // make sure time change doesn't trigger inactivity timers
+ r=User::SetUTCTime(before-TTimeIntervalDays(1));
+ test(r==KErrNone);
+ test(s==KRequestPending); // make sure time change doesn't trigger inactivity timers
+ r=User::SetUTCTime(before);
+ test(r==KErrNone);
+ test(s==KRequestPending); // make sure time change doesn't trigger inactivity timers
+
+ TTime secure;
+ if ((r = secure.UniversalTimeSecure()) == KErrNone)
+ r = User::SetUTCTimeSecure(secure-TTimeIntervalDays(1));
+ if (r != KErrNone)
+ {
+ RDebug::Printf("WARNING: Secure clock change test skipped because secure time could not be changed!");
+ }
+ else
+ {
+ User::SetUTCTimeSecure(secure+TTimeIntervalDays(1));
+ User::SetUTCTimeSecure(secure);
+ test(s == KRequestPending); // make sure secure time change doesn't trigger inactivity timers
+ }
+
+ User::WaitForRequest(s);
+ after.UniversalTime();
+ interval=after.MicroSecondsFrom(before);
+ interval_int=I64INT(interval.Int64());
+ test.Printf(_L("Timer expired after %d us\n"),interval_int);
+ test.Printf(_L("Press a key...\n"));
+ test.Getch();
+
+ TInt inactive=User::InactivityTime().Int();
+ TRequestStatus s1;
+ TRequestStatus s2;
+ t1.Inactivity(s1, 10);
+ t2.Inactivity(s2, 15);
+ FOREVER
+ {
+ TInt new_inact=User::InactivityTime().Int();
+ if (new_inact!=inactive)
+ {
+ inactive=new_inact;
+ test.Printf(_L("%d\n"),inactive);
+ }
+ if (s2!=KRequestPending)
+ {
+ User::WaitForRequest(s2);
+ test(s2.Int()==KErrNone);
+ test.Printf(_L("Timer 2 expired\n"));
+ break;
+ }
+ if (s1!=KRequestPending)
+ {
+ User::WaitForRequest(s1);
+ test(s1.Int()==KErrNone);
+ test.Printf(_L("Timer 1 expired\n"));
+ s1=KRequestPending;
+ }
+ }
+
+ test.Next(_L("Test RTimer::Cancel()"));
+ test.Printf(_L("Press a key...\n"));
+ test.Getch();
+ t1.Inactivity(s1, 300);
+ t1.Cancel();
+ User::WaitForRequest(s1);
+ test(s1==KErrCancel);
+
+ test.Next(_L("Test CTimer::Inactivity()"));
+ test.Printf(_L("Press a key...\n"));
+ test.Getch();
+
+ CTrapCleanup* pC=CTrapCleanup::New();
+ test(pC!=NULL);
+ TRAP(r,InitialiseL());
+ test(r==KErrNone);
+
+ CActiveScheduler::Start();
+
+ Timer1->Cancel();
+ Timer2->Cancel();
+ Timer3->Cancel();
+ RepTimer->Cancel();
+
+ delete Timer1;
+ delete Timer2;
+ delete Timer3;
+ delete RepTimer;
+ delete ActiveSched;
+ delete pC;
+
+ test.Printf(_L("Press a key...\n"));
+ test.Getch();
+
+ test.End();
+ __UHEAP_MARKEND;
+ return KErrNone;
+ }