kerneltest/e32test/active/t_dtim.cpp
changeset 0 a41df078684a
child 293 0659d0e1a03c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/active/t_dtim.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,227 @@
+// Copyright (c) 1996-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\active\t_dtim.cpp
+// Overview:
+// Test delta timers. 
+// API Information:
+// CDeltaTimer.
+// Details:
+// - Create a delta timer and queue a number of timed events with different time intervals.
+// The callback functions of the timed events perform various actions: 
+// - Requeuing itself
+// - Cancelling the previous or next timer
+// - Doing nothing
+// - Stopping the active scheduler
+// - Verifies the timed events are run correctly and orderly
+// - The callback for each timed event increments a counter each time they are run
+// - The counters are checked to check how many times each callback has been called
+// Platforms/Drives/Compatibility:
+// All.
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32std.h>
+#include <e32std_private.h>
+#include <e32base.h>
+#include <e32base_private.h>
+#include <e32test.h>
+#include <e32hal.h>
+#include <e32def.h>
+#include <e32def_private.h>
+
+RTest test(_L("T_DTIM"));
+
+
+TInt theResults[10];
+TCallBack* theCallBacks;
+TDeltaTimerEntry TheTimers[10];
+CDeltaTimer* theTimer;
+
+class CMyActiveScheduler : public CActiveScheduler
+	{
+public:
+	void Error(TInt anError)const;
+	static CMyActiveScheduler* NewL();
+	};
+
+void CMyActiveScheduler::Error(TInt /*anError*/) const
+//
+//
+//
+	{
+	User::Panic(_L("MYActiveScheduler"),0);
+	}
+
+CMyActiveScheduler* CMyActiveScheduler::NewL()
+	{
+	return new(ELeave) CMyActiveScheduler;
+	}
+
+struct TDeltaTimerCallData
+	{
+	CDeltaTimer* iTimer;
+	TDeltaTimerEntry *iTimers;
+	TInt iIndex;
+	};
+
+TInt print(TAny* anArg)
+//
+// Null entry. Just prints and increments it's counter.
+//
+	{
+	TInt index=(TInt)anArg;
+	theResults[index]++;
+	test.Printf(_L("Callback %d\r\n"),index);
+	return 0;
+	}
+
+TInt cancelNext(TAny * anArg)
+//
+// Cancels the next entry - assumes it is valid.
+//
+	{
+	TInt index=(TInt)anArg;
+	theTimer->Remove(TheTimers[index+1]);
+	return print(anArg);
+	}
+
+TInt requeue(TAny * anArg)
+//
+// Note that a requeue will run once every 200 ms until stop is called.
+//
+	{
+	TTimeIntervalMicroSeconds32 tickPeriod;
+	UserHal::TickPeriod(tickPeriod);
+	const TInt K13Ticks = 13 * tickPeriod.Int();
+
+	TInt index=(TInt)anArg;
+	theTimer->Queue(K13Ticks*2/3,TheTimers[index]);
+	return print(anArg);
+	}
+
+TInt requeuePrevious(TAny * anArg)
+//
+// Requeue the previous entry (assumes previous entry is valid handle)
+//
+	{
+	TTimeIntervalMicroSeconds32 tickPeriod;
+	UserHal::TickPeriod(tickPeriod);
+	const TInt K13Ticks = 13 * tickPeriod.Int();
+
+	TInt index=(TInt)anArg - 1;
+	theTimer->Queue(K13Ticks,TheTimers[index]);
+	return print(anArg);
+	}
+
+TInt cancel2ndFollowing(TAny * anArg)
+//
+// Assumes that 2nd following timer handle is valid.
+//
+	{
+	TInt index=(TInt)anArg;
+	theTimer->Remove(TheTimers[index+2]);
+	return print(anArg);
+	}
+
+TInt stop(TAny * anArg)
+//
+// Stops the active schduler
+//
+	{
+	TInt index=(TInt)anArg;
+	theResults[index]++;
+	test.Printf(_L("Callback %d, stopping\r\n"),index);
+	CMyActiveScheduler::Stop();
+
+	return 0;
+	}
+
+TInt E32Main()
+//
+//
+//
+	{
+
+	CMyActiveScheduler* s=NULL;
+	TRAPD(ret,s=CMyActiveScheduler::NewL())
+	test(ret==KErrNone);
+
+	CActiveScheduler::Install(s);
+	test.Title();
+	test.Start(_L("Timer"));
+	
+	__KHEAP_MARK;
+
+	TTimeIntervalMicroSeconds32 tickPeriod;
+	UserHal::TickPeriod(tickPeriod);
+
+	TRAP(ret,theTimer=CDeltaTimer::NewL(100, tickPeriod.Int()));
+	test(ret==KErrNone);
+
+	Mem::FillZ(theResults,10*sizeof(TInt));
+
+	TCallBack callBacks[10]=
+		{
+		/* 0 */ TCallBack(print,(TAny*)0),
+		/* 1 */ TCallBack(cancelNext,(TAny*)1),
+		/* 2 */ TCallBack(print,(TAny*)2),	// Gets cancelled
+		/* 3 */ TCallBack(print,(TAny*)3),		// Runs twice
+		/* 4 */ TCallBack(requeuePrevious,(TAny*)4),
+		/* 5 */ TCallBack(cancel2ndFollowing,(TAny*)5),
+		/* 6 */ TCallBack(print,(TAny*)6),
+		/* 7 */ TCallBack(cancelNext,(TAny*)7),	// Gets cancelled
+		/* 8 */ TCallBack(requeue,(TAny*)8),	// Runs twice, once on the same RunL as the stop
+		/* 9 */ TCallBack(stop,(TAny*)9),
+		};
+
+	theCallBacks=callBacks;
+	for (TInt i=0;i<10;i++)
+		TheTimers[i].Set(theCallBacks[i]);
+
+	const TInt K13Ticks = 13 * tickPeriod.Int();
+
+	theTimer->Queue(K13Ticks,TheTimers[0]);
+	theTimer->Queue(2*K13Ticks,TheTimers[1]);
+	theTimer->Queue(3*K13Ticks,TheTimers[2]);
+	theTimer->Queue(4*K13Ticks,TheTimers[3]);
+	theTimer->Queue(5*K13Ticks,TheTimers[4]);
+	theTimer->Queue(6*K13Ticks,TheTimers[5]);
+	theTimer->Queue(7*K13Ticks,TheTimers[6]);
+	theTimer->Queue(8*K13Ticks,TheTimers[7]);
+	theTimer->Queue(9*K13Ticks,TheTimers[8]);
+	theTimer->Queue(10*K13Ticks,TheTimers[9]);
+
+	CActiveScheduler::Start();
+
+	test(theResults[0]==1);
+	test(theResults[1]==1);
+	test(theResults[2]==0);
+	test(theResults[3]==2);
+	test(theResults[4]==1);
+	test(theResults[5]==1);
+	test(theResults[6]==1);
+	test(theResults[7]==0);
+	test(theResults[8]==2);
+	test(theResults[9]==1);
+
+	delete theTimer;
+
+	__KHEAP_MARKEND;
+
+	test.End();
+	return 0;
+	}