1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker * Copyright (c) 2016, The OpenThread Authors.
3*cfb92d14SAndroid Build Coastguard Worker * All rights reserved.
4*cfb92d14SAndroid Build Coastguard Worker *
5*cfb92d14SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
6*cfb92d14SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met:
7*cfb92d14SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
8*cfb92d14SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
9*cfb92d14SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
10*cfb92d14SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
11*cfb92d14SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
12*cfb92d14SAndroid Build Coastguard Worker * 3. Neither the name of the copyright holder nor the
13*cfb92d14SAndroid Build Coastguard Worker * names of its contributors may be used to endorse or promote products
14*cfb92d14SAndroid Build Coastguard Worker * derived from this software without specific prior written permission.
15*cfb92d14SAndroid Build Coastguard Worker *
16*cfb92d14SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*cfb92d14SAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*cfb92d14SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*cfb92d14SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20*cfb92d14SAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*cfb92d14SAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*cfb92d14SAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*cfb92d14SAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*cfb92d14SAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*cfb92d14SAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*cfb92d14SAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE.
27*cfb92d14SAndroid Build Coastguard Worker */
28*cfb92d14SAndroid Build Coastguard Worker
29*cfb92d14SAndroid Build Coastguard Worker #include "test_platform.h"
30*cfb92d14SAndroid Build Coastguard Worker
31*cfb92d14SAndroid Build Coastguard Worker #include "common/array.hpp"
32*cfb92d14SAndroid Build Coastguard Worker #include "common/code_utils.hpp"
33*cfb92d14SAndroid Build Coastguard Worker #include "common/debug.hpp"
34*cfb92d14SAndroid Build Coastguard Worker #include "common/num_utils.hpp"
35*cfb92d14SAndroid Build Coastguard Worker #include "common/timer.hpp"
36*cfb92d14SAndroid Build Coastguard Worker #include "instance/instance.hpp"
37*cfb92d14SAndroid Build Coastguard Worker
38*cfb92d14SAndroid Build Coastguard Worker namespace ot {
39*cfb92d14SAndroid Build Coastguard Worker
40*cfb92d14SAndroid Build Coastguard Worker enum
41*cfb92d14SAndroid Build Coastguard Worker {
42*cfb92d14SAndroid Build Coastguard Worker kCallCountIndexAlarmStop = 0,
43*cfb92d14SAndroid Build Coastguard Worker kCallCountIndexAlarmStart,
44*cfb92d14SAndroid Build Coastguard Worker kCallCountIndexTimerHandler,
45*cfb92d14SAndroid Build Coastguard Worker
46*cfb92d14SAndroid Build Coastguard Worker kCallCountIndexMax
47*cfb92d14SAndroid Build Coastguard Worker };
48*cfb92d14SAndroid Build Coastguard Worker
49*cfb92d14SAndroid Build Coastguard Worker uint32_t sNow;
50*cfb92d14SAndroid Build Coastguard Worker uint32_t sPlatT0;
51*cfb92d14SAndroid Build Coastguard Worker uint32_t sPlatDt;
52*cfb92d14SAndroid Build Coastguard Worker bool sTimerOn;
53*cfb92d14SAndroid Build Coastguard Worker uint32_t sCallCount[kCallCountIndexMax];
54*cfb92d14SAndroid Build Coastguard Worker
55*cfb92d14SAndroid Build Coastguard Worker extern "C" {
56*cfb92d14SAndroid Build Coastguard Worker
otPlatAlarmMilliStop(otInstance *)57*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMilliStop(otInstance *)
58*cfb92d14SAndroid Build Coastguard Worker {
59*cfb92d14SAndroid Build Coastguard Worker sTimerOn = false;
60*cfb92d14SAndroid Build Coastguard Worker sCallCount[kCallCountIndexAlarmStop]++;
61*cfb92d14SAndroid Build Coastguard Worker }
62*cfb92d14SAndroid Build Coastguard Worker
otPlatAlarmMilliStartAt(otInstance *,uint32_t aT0,uint32_t aDt)63*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMilliStartAt(otInstance *, uint32_t aT0, uint32_t aDt)
64*cfb92d14SAndroid Build Coastguard Worker {
65*cfb92d14SAndroid Build Coastguard Worker sTimerOn = true;
66*cfb92d14SAndroid Build Coastguard Worker sCallCount[kCallCountIndexAlarmStart]++;
67*cfb92d14SAndroid Build Coastguard Worker sPlatT0 = aT0;
68*cfb92d14SAndroid Build Coastguard Worker sPlatDt = aDt;
69*cfb92d14SAndroid Build Coastguard Worker }
70*cfb92d14SAndroid Build Coastguard Worker
otPlatAlarmMilliGetNow(void)71*cfb92d14SAndroid Build Coastguard Worker uint32_t otPlatAlarmMilliGetNow(void) { return sNow; }
72*cfb92d14SAndroid Build Coastguard Worker
73*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
otPlatAlarmMicroStop(otInstance *)74*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMicroStop(otInstance *)
75*cfb92d14SAndroid Build Coastguard Worker {
76*cfb92d14SAndroid Build Coastguard Worker sTimerOn = false;
77*cfb92d14SAndroid Build Coastguard Worker sCallCount[kCallCountIndexAlarmStop]++;
78*cfb92d14SAndroid Build Coastguard Worker }
79*cfb92d14SAndroid Build Coastguard Worker
otPlatAlarmMicroStartAt(otInstance *,uint32_t aT0,uint32_t aDt)80*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMicroStartAt(otInstance *, uint32_t aT0, uint32_t aDt)
81*cfb92d14SAndroid Build Coastguard Worker {
82*cfb92d14SAndroid Build Coastguard Worker sTimerOn = true;
83*cfb92d14SAndroid Build Coastguard Worker sCallCount[kCallCountIndexAlarmStart]++;
84*cfb92d14SAndroid Build Coastguard Worker sPlatT0 = aT0;
85*cfb92d14SAndroid Build Coastguard Worker sPlatDt = aDt;
86*cfb92d14SAndroid Build Coastguard Worker }
87*cfb92d14SAndroid Build Coastguard Worker
otPlatAlarmMicroGetNow(void)88*cfb92d14SAndroid Build Coastguard Worker uint32_t otPlatAlarmMicroGetNow(void) { return sNow; }
89*cfb92d14SAndroid Build Coastguard Worker #endif
90*cfb92d14SAndroid Build Coastguard Worker
91*cfb92d14SAndroid Build Coastguard Worker } // extern "C"
92*cfb92d14SAndroid Build Coastguard Worker
InitCounters(void)93*cfb92d14SAndroid Build Coastguard Worker void InitCounters(void) { memset(sCallCount, 0, sizeof(sCallCount)); }
94*cfb92d14SAndroid Build Coastguard Worker
95*cfb92d14SAndroid Build Coastguard Worker /**
96*cfb92d14SAndroid Build Coastguard Worker * `TestTimer` sub-classes `TimerMilli` and provides a handler and a counter to keep track of number of times timer
97*cfb92d14SAndroid Build Coastguard Worker * gets fired.
98*cfb92d14SAndroid Build Coastguard Worker */
99*cfb92d14SAndroid Build Coastguard Worker template <typename TimerType> class TestTimer : public TimerType
100*cfb92d14SAndroid Build Coastguard Worker {
101*cfb92d14SAndroid Build Coastguard Worker public:
TestTimer(Instance & aInstance)102*cfb92d14SAndroid Build Coastguard Worker explicit TestTimer(Instance &aInstance)
103*cfb92d14SAndroid Build Coastguard Worker : TimerType(aInstance, TestTimer::HandleTimerFired)
104*cfb92d14SAndroid Build Coastguard Worker , mFiredCounter(0)
105*cfb92d14SAndroid Build Coastguard Worker {
106*cfb92d14SAndroid Build Coastguard Worker }
107*cfb92d14SAndroid Build Coastguard Worker
HandleTimerFired(Timer & aTimer)108*cfb92d14SAndroid Build Coastguard Worker static void HandleTimerFired(Timer &aTimer) { static_cast<TestTimer &>(aTimer).HandleTimerFired(); }
109*cfb92d14SAndroid Build Coastguard Worker
HandleTimerFired(void)110*cfb92d14SAndroid Build Coastguard Worker void HandleTimerFired(void)
111*cfb92d14SAndroid Build Coastguard Worker {
112*cfb92d14SAndroid Build Coastguard Worker sCallCount[kCallCountIndexTimerHandler]++;
113*cfb92d14SAndroid Build Coastguard Worker mFiredCounter++;
114*cfb92d14SAndroid Build Coastguard Worker }
115*cfb92d14SAndroid Build Coastguard Worker
GetFiredCounter(void)116*cfb92d14SAndroid Build Coastguard Worker uint32_t GetFiredCounter(void) { return mFiredCounter; }
117*cfb92d14SAndroid Build Coastguard Worker
ResetFiredCounter(void)118*cfb92d14SAndroid Build Coastguard Worker void ResetFiredCounter(void) { mFiredCounter = 0; }
119*cfb92d14SAndroid Build Coastguard Worker
RemoveAll(Instance & aInstance)120*cfb92d14SAndroid Build Coastguard Worker static void RemoveAll(Instance &aInstance) { TimerType::RemoveAll(aInstance); }
121*cfb92d14SAndroid Build Coastguard Worker
122*cfb92d14SAndroid Build Coastguard Worker private:
123*cfb92d14SAndroid Build Coastguard Worker uint32_t mFiredCounter; //< Number of times timer has been fired so far
124*cfb92d14SAndroid Build Coastguard Worker };
125*cfb92d14SAndroid Build Coastguard Worker
126*cfb92d14SAndroid Build Coastguard Worker template <typename TimerType> void AlarmFired(otInstance *aInstance);
127*cfb92d14SAndroid Build Coastguard Worker
AlarmFired(otInstance * aInstance)128*cfb92d14SAndroid Build Coastguard Worker template <> void AlarmFired<TimerMilli>(otInstance *aInstance) { otPlatAlarmMilliFired(aInstance); }
129*cfb92d14SAndroid Build Coastguard Worker
130*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
AlarmFired(otInstance * aInstance)131*cfb92d14SAndroid Build Coastguard Worker template <> void AlarmFired<TimerMicro>(otInstance *aInstance) { otPlatAlarmMicroFired(aInstance); }
132*cfb92d14SAndroid Build Coastguard Worker #endif
133*cfb92d14SAndroid Build Coastguard Worker
134*cfb92d14SAndroid Build Coastguard Worker /**
135*cfb92d14SAndroid Build Coastguard Worker * Test the TimerScheduler's behavior of one timer started and fired.
136*cfb92d14SAndroid Build Coastguard Worker */
TestOneTimer(void)137*cfb92d14SAndroid Build Coastguard Worker template <typename TimerType> int TestOneTimer(void)
138*cfb92d14SAndroid Build Coastguard Worker {
139*cfb92d14SAndroid Build Coastguard Worker const uint32_t kTimeT0 = 1000;
140*cfb92d14SAndroid Build Coastguard Worker const uint32_t kTimerInterval = 10;
141*cfb92d14SAndroid Build Coastguard Worker Instance *instance = testInitInstance();
142*cfb92d14SAndroid Build Coastguard Worker TestTimer<TimerType> timer(*instance);
143*cfb92d14SAndroid Build Coastguard Worker
144*cfb92d14SAndroid Build Coastguard Worker // Test one Timer basic operation.
145*cfb92d14SAndroid Build Coastguard Worker
146*cfb92d14SAndroid Build Coastguard Worker TestTimer<TimerType>::RemoveAll(*instance);
147*cfb92d14SAndroid Build Coastguard Worker InitCounters();
148*cfb92d14SAndroid Build Coastguard Worker
149*cfb92d14SAndroid Build Coastguard Worker printf("TestOneTimer() ");
150*cfb92d14SAndroid Build Coastguard Worker
151*cfb92d14SAndroid Build Coastguard Worker sNow = kTimeT0;
152*cfb92d14SAndroid Build Coastguard Worker timer.Start(kTimerInterval);
153*cfb92d14SAndroid Build Coastguard Worker
154*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStart] == 1, "Start CallCount Failed.");
155*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 0, "Stop CallCount Failed.");
156*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 0, "Handler CallCount Failed.");
157*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sPlatT0 == 1000 && sPlatDt == 10, "Start params Failed.");
158*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer.IsRunning(), "Timer running Failed.");
159*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn, "Platform Timer State Failed.");
160*cfb92d14SAndroid Build Coastguard Worker
161*cfb92d14SAndroid Build Coastguard Worker sNow += kTimerInterval;
162*cfb92d14SAndroid Build Coastguard Worker
163*cfb92d14SAndroid Build Coastguard Worker AlarmFired<TimerType>(instance);
164*cfb92d14SAndroid Build Coastguard Worker
165*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStart] == 1, "Start CallCount Failed.");
166*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 1, "Stop CallCount Failed.");
167*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 1, "Handler CallCount Failed.");
168*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer.IsRunning() == false, "Timer running Failed.");
169*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn == false, "Platform Timer State Failed.");
170*cfb92d14SAndroid Build Coastguard Worker
171*cfb92d14SAndroid Build Coastguard Worker // Test one Timer that spans the 32-bit wrap.
172*cfb92d14SAndroid Build Coastguard Worker
173*cfb92d14SAndroid Build Coastguard Worker InitCounters();
174*cfb92d14SAndroid Build Coastguard Worker
175*cfb92d14SAndroid Build Coastguard Worker sNow = 0 - (kTimerInterval - 2);
176*cfb92d14SAndroid Build Coastguard Worker timer.Start(kTimerInterval);
177*cfb92d14SAndroid Build Coastguard Worker
178*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStart] == 1, "Start CallCount Failed.");
179*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 0, "Stop CallCount Failed.");
180*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 0, "Handler CallCount Failed.");
181*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sPlatT0 == 0 - (kTimerInterval - 2) && sPlatDt == 10, "Start params Failed.");
182*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer.IsRunning(), "Timer running Failed.");
183*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn, "Platform Timer State Failed.");
184*cfb92d14SAndroid Build Coastguard Worker
185*cfb92d14SAndroid Build Coastguard Worker sNow += kTimerInterval;
186*cfb92d14SAndroid Build Coastguard Worker
187*cfb92d14SAndroid Build Coastguard Worker AlarmFired<TimerType>(instance);
188*cfb92d14SAndroid Build Coastguard Worker
189*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStart] == 1, "Start CallCount Failed.");
190*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 1, "Stop CallCount Failed.");
191*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 1, "Handler CallCount Failed.");
192*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer.IsRunning() == false, "Timer running Failed.");
193*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn == false, "Platform Timer State Failed.");
194*cfb92d14SAndroid Build Coastguard Worker
195*cfb92d14SAndroid Build Coastguard Worker // Test one Timer that is late by several msec
196*cfb92d14SAndroid Build Coastguard Worker
197*cfb92d14SAndroid Build Coastguard Worker InitCounters();
198*cfb92d14SAndroid Build Coastguard Worker
199*cfb92d14SAndroid Build Coastguard Worker sNow = kTimeT0;
200*cfb92d14SAndroid Build Coastguard Worker timer.Start(kTimerInterval);
201*cfb92d14SAndroid Build Coastguard Worker
202*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStart] == 1, "Start CallCount Failed.");
203*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 0, "Stop CallCount Failed.");
204*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 0, "Handler CallCount Failed.");
205*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sPlatT0 == 1000 && sPlatDt == 10, "Start params Failed.");
206*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer.IsRunning(), "Timer running Failed.");
207*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn, "Platform Timer State Failed.");
208*cfb92d14SAndroid Build Coastguard Worker
209*cfb92d14SAndroid Build Coastguard Worker sNow += kTimerInterval + 5;
210*cfb92d14SAndroid Build Coastguard Worker
211*cfb92d14SAndroid Build Coastguard Worker AlarmFired<TimerType>(instance);
212*cfb92d14SAndroid Build Coastguard Worker
213*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStart] == 1, "Start CallCount Failed.");
214*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 1, "Stop CallCount Failed.");
215*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 1, "Handler CallCount Failed.");
216*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer.IsRunning() == false, "Timer running Failed.");
217*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn == false, "Platform Timer State Failed.");
218*cfb92d14SAndroid Build Coastguard Worker
219*cfb92d14SAndroid Build Coastguard Worker // Test one Timer that is early by several msec
220*cfb92d14SAndroid Build Coastguard Worker
221*cfb92d14SAndroid Build Coastguard Worker InitCounters();
222*cfb92d14SAndroid Build Coastguard Worker
223*cfb92d14SAndroid Build Coastguard Worker sNow = kTimeT0;
224*cfb92d14SAndroid Build Coastguard Worker timer.Start(kTimerInterval);
225*cfb92d14SAndroid Build Coastguard Worker
226*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStart] == 1, "Start CallCount Failed.");
227*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 0, "Stop CallCount Failed.");
228*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 0, "Handler CallCount Failed.");
229*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sPlatT0 == 1000 && sPlatDt == 10, "Start params Failed.");
230*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer.IsRunning(), "Timer running Failed.");
231*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn, "Platform Timer State Failed.");
232*cfb92d14SAndroid Build Coastguard Worker
233*cfb92d14SAndroid Build Coastguard Worker sNow += kTimerInterval - 2;
234*cfb92d14SAndroid Build Coastguard Worker
235*cfb92d14SAndroid Build Coastguard Worker AlarmFired<TimerType>(instance);
236*cfb92d14SAndroid Build Coastguard Worker
237*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStart] == 2, "Start CallCount Failed.");
238*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 0, "Stop CallCount Failed.");
239*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 0, "Handler CallCount Failed.");
240*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer.IsRunning() == true, "Timer running Failed.");
241*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn == true, "Platform Timer State Failed.");
242*cfb92d14SAndroid Build Coastguard Worker
243*cfb92d14SAndroid Build Coastguard Worker sNow += kTimerInterval;
244*cfb92d14SAndroid Build Coastguard Worker
245*cfb92d14SAndroid Build Coastguard Worker AlarmFired<TimerType>(instance);
246*cfb92d14SAndroid Build Coastguard Worker
247*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStart] == 2, "Start CallCount Failed.");
248*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 1, "Stop CallCount Failed.");
249*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 1, "Handler CallCount Failed.");
250*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer.IsRunning() == false, "Timer running Failed.");
251*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn == false, "Platform Timer State Failed.");
252*cfb92d14SAndroid Build Coastguard Worker
253*cfb92d14SAndroid Build Coastguard Worker printf(" --> PASSED\n");
254*cfb92d14SAndroid Build Coastguard Worker
255*cfb92d14SAndroid Build Coastguard Worker testFreeInstance(instance);
256*cfb92d14SAndroid Build Coastguard Worker
257*cfb92d14SAndroid Build Coastguard Worker return 0;
258*cfb92d14SAndroid Build Coastguard Worker }
259*cfb92d14SAndroid Build Coastguard Worker
260*cfb92d14SAndroid Build Coastguard Worker /**
261*cfb92d14SAndroid Build Coastguard Worker * Test the TimerScheduler's behavior of two timers started and fired.
262*cfb92d14SAndroid Build Coastguard Worker */
TestTwoTimers(void)263*cfb92d14SAndroid Build Coastguard Worker template <typename TimerType> int TestTwoTimers(void)
264*cfb92d14SAndroid Build Coastguard Worker {
265*cfb92d14SAndroid Build Coastguard Worker const uint32_t kTimeT0 = 1000;
266*cfb92d14SAndroid Build Coastguard Worker const uint32_t kTimerInterval = 10;
267*cfb92d14SAndroid Build Coastguard Worker Instance *instance = testInitInstance();
268*cfb92d14SAndroid Build Coastguard Worker TestTimer<TimerType> timer1(*instance);
269*cfb92d14SAndroid Build Coastguard Worker TestTimer<TimerType> timer2(*instance);
270*cfb92d14SAndroid Build Coastguard Worker
271*cfb92d14SAndroid Build Coastguard Worker TestTimer<TimerType>::RemoveAll(*instance);
272*cfb92d14SAndroid Build Coastguard Worker printf("TestTwoTimers() ");
273*cfb92d14SAndroid Build Coastguard Worker
274*cfb92d14SAndroid Build Coastguard Worker // Test when second timer stars at the fire time of first timer (before alarm callback).
275*cfb92d14SAndroid Build Coastguard Worker
276*cfb92d14SAndroid Build Coastguard Worker InitCounters();
277*cfb92d14SAndroid Build Coastguard Worker
278*cfb92d14SAndroid Build Coastguard Worker sNow = kTimeT0;
279*cfb92d14SAndroid Build Coastguard Worker timer1.Start(kTimerInterval);
280*cfb92d14SAndroid Build Coastguard Worker
281*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStart] == 1, "Start CallCount Failed.");
282*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 0, "Stop CallCount Failed.");
283*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 0, "Handler CallCount Failed.");
284*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sPlatT0 == kTimeT0 && sPlatDt == kTimerInterval, "Start params Failed.");
285*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer1.IsRunning(), "Timer running Failed.");
286*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer2.IsRunning() == false, "Timer running Failed.");
287*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn, "Platform Timer State Failed.");
288*cfb92d14SAndroid Build Coastguard Worker
289*cfb92d14SAndroid Build Coastguard Worker sNow += kTimerInterval;
290*cfb92d14SAndroid Build Coastguard Worker
291*cfb92d14SAndroid Build Coastguard Worker timer2.Start(kTimerInterval);
292*cfb92d14SAndroid Build Coastguard Worker
293*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStart] == 1, "Start CallCount Failed.");
294*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 0, "Stop CallCount Failed.");
295*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 0, "Handler CallCount Failed.");
296*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sPlatT0 == kTimeT0 && sPlatDt == kTimerInterval, "Start params Failed.");
297*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer1.IsRunning() == true, "Timer running Failed.");
298*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer2.IsRunning() == true, "Timer running Failed.");
299*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn, "Platform Timer State Failed.");
300*cfb92d14SAndroid Build Coastguard Worker
301*cfb92d14SAndroid Build Coastguard Worker AlarmFired<TimerType>(instance);
302*cfb92d14SAndroid Build Coastguard Worker
303*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStart] == 2, "Start CallCount Failed.");
304*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 0, "Stop CallCount Failed.");
305*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 1, "Handler CallCount Failed.");
306*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer1.GetFiredCounter() == 1, "Fire Counter failed.");
307*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sPlatT0 == sNow && sPlatDt == kTimerInterval, "Start params Failed.");
308*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer1.IsRunning() == false, "Timer running Failed.");
309*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer2.IsRunning() == true, "Timer running Failed.");
310*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn == true, "Platform Timer State Failed.");
311*cfb92d14SAndroid Build Coastguard Worker
312*cfb92d14SAndroid Build Coastguard Worker sNow += kTimerInterval;
313*cfb92d14SAndroid Build Coastguard Worker AlarmFired<TimerType>(instance);
314*cfb92d14SAndroid Build Coastguard Worker
315*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStart] == 2, "Start CallCount Failed.");
316*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 1, "Stop CallCount Failed.");
317*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 2, "Handler CallCount Failed.");
318*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer2.GetFiredCounter() == 1, "Fire Counter failed.");
319*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer1.IsRunning() == false, "Timer running Failed.");
320*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer2.IsRunning() == false, "Timer running Failed.");
321*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn == false, "Platform Timer State Failed.");
322*cfb92d14SAndroid Build Coastguard Worker
323*cfb92d14SAndroid Build Coastguard Worker // Test when second timer starts at the fire time of first timer (before AlarmFired<TimerType>()) and its fire time
324*cfb92d14SAndroid Build Coastguard Worker // is before the first timer. Ensure that the second timer handler is invoked before the first one.
325*cfb92d14SAndroid Build Coastguard Worker
326*cfb92d14SAndroid Build Coastguard Worker InitCounters();
327*cfb92d14SAndroid Build Coastguard Worker timer1.ResetFiredCounter();
328*cfb92d14SAndroid Build Coastguard Worker timer2.ResetFiredCounter();
329*cfb92d14SAndroid Build Coastguard Worker
330*cfb92d14SAndroid Build Coastguard Worker sNow = kTimeT0;
331*cfb92d14SAndroid Build Coastguard Worker timer1.Start(kTimerInterval);
332*cfb92d14SAndroid Build Coastguard Worker
333*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStart] == 1, "Start CallCount Failed.");
334*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 0, "Stop CallCount Failed.");
335*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 0, "Handler CallCount Failed.");
336*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sPlatT0 == kTimeT0 && sPlatDt == kTimerInterval, "Start params Failed.");
337*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer1.IsRunning(), "Timer running Failed.");
338*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer2.IsRunning() == false, "Timer running Failed.");
339*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn, "Platform Timer State Failed.");
340*cfb92d14SAndroid Build Coastguard Worker
341*cfb92d14SAndroid Build Coastguard Worker sNow += kTimerInterval;
342*cfb92d14SAndroid Build Coastguard Worker
343*cfb92d14SAndroid Build Coastguard Worker timer2.StartAt(TimeMilli(kTimeT0), kTimerInterval - 2); // Timer 2 is even before timer 1
344*cfb92d14SAndroid Build Coastguard Worker
345*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 0, "Handler CallCount Failed.");
346*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer1.IsRunning() == true, "Timer running Failed.");
347*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer2.IsRunning() == true, "Timer running Failed.");
348*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn, "Platform Timer State Failed.");
349*cfb92d14SAndroid Build Coastguard Worker
350*cfb92d14SAndroid Build Coastguard Worker AlarmFired<TimerType>(instance);
351*cfb92d14SAndroid Build Coastguard Worker
352*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 0, "Stop CallCount Failed.");
353*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 1, "Handler CallCount Failed.");
354*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer2.GetFiredCounter() == 1, "Fire Counter failed.");
355*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sPlatT0 == sNow && sPlatDt == 0, "Start params Failed.");
356*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer1.IsRunning() == true, "Timer running Failed.");
357*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer2.IsRunning() == false, "Timer running Failed.");
358*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn == true, "Platform Timer State Failed.");
359*cfb92d14SAndroid Build Coastguard Worker
360*cfb92d14SAndroid Build Coastguard Worker AlarmFired<TimerType>(instance);
361*cfb92d14SAndroid Build Coastguard Worker
362*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 1, "Stop CallCount Failed.");
363*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 2, "Handler CallCount Failed.");
364*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer1.GetFiredCounter() == 1, "Fire Counter failed.");
365*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer1.IsRunning() == false, "Timer running Failed.");
366*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer2.IsRunning() == false, "Timer running Failed.");
367*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn == false, "Platform Timer State Failed.");
368*cfb92d14SAndroid Build Coastguard Worker
369*cfb92d14SAndroid Build Coastguard Worker // Timer 1 fire callback is late by some ticks/ms, and second timer is scheduled (before call to
370*cfb92d14SAndroid Build Coastguard Worker // AlarmFired) with a maximum interval. This is to test (corner-case) scenario where the fire time of two
371*cfb92d14SAndroid Build Coastguard Worker // timers spanning over the maximum interval.
372*cfb92d14SAndroid Build Coastguard Worker
373*cfb92d14SAndroid Build Coastguard Worker InitCounters();
374*cfb92d14SAndroid Build Coastguard Worker timer1.ResetFiredCounter();
375*cfb92d14SAndroid Build Coastguard Worker timer2.ResetFiredCounter();
376*cfb92d14SAndroid Build Coastguard Worker
377*cfb92d14SAndroid Build Coastguard Worker sNow = kTimeT0;
378*cfb92d14SAndroid Build Coastguard Worker timer1.Start(kTimerInterval);
379*cfb92d14SAndroid Build Coastguard Worker
380*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStart] == 1, "Start CallCount Failed.");
381*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 0, "Stop CallCount Failed.");
382*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 0, "Handler CallCount Failed.");
383*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sPlatT0 == kTimeT0 && sPlatDt == kTimerInterval, "Start params Failed.");
384*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer1.IsRunning(), "Timer running Failed.");
385*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer2.IsRunning() == false, "Timer running Failed.");
386*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn, "Platform Timer State Failed.");
387*cfb92d14SAndroid Build Coastguard Worker
388*cfb92d14SAndroid Build Coastguard Worker sNow += kTimerInterval + 5;
389*cfb92d14SAndroid Build Coastguard Worker
390*cfb92d14SAndroid Build Coastguard Worker timer2.Start(Timer::kMaxDelay);
391*cfb92d14SAndroid Build Coastguard Worker
392*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStart] == 1, "Start CallCount Failed.");
393*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 0, "Stop CallCount Failed.");
394*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 0, "Handler CallCount Failed.");
395*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer1.IsRunning() == true, "Timer running Failed.");
396*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer2.IsRunning() == true, "Timer running Failed.");
397*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn, "Platform Timer State Failed.");
398*cfb92d14SAndroid Build Coastguard Worker
399*cfb92d14SAndroid Build Coastguard Worker AlarmFired<TimerType>(instance);
400*cfb92d14SAndroid Build Coastguard Worker
401*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStart] == 2, "Start CallCount Failed.");
402*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 0, "Stop CallCount Failed.");
403*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 1, "Handler CallCount Failed.");
404*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer1.GetFiredCounter() == 1, "Fire Counter failed.");
405*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sPlatT0 == sNow, "Start params Failed.");
406*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sPlatDt == Timer::kMaxDelay, "Start params Failed.");
407*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer1.IsRunning() == false, "Timer running Failed.");
408*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer2.IsRunning() == true, "Timer running Failed.");
409*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn == true, "Platform Timer State Failed.");
410*cfb92d14SAndroid Build Coastguard Worker
411*cfb92d14SAndroid Build Coastguard Worker sNow += Timer::kMaxDelay;
412*cfb92d14SAndroid Build Coastguard Worker AlarmFired<TimerType>(instance);
413*cfb92d14SAndroid Build Coastguard Worker
414*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStart] == 2, "Start CallCount Failed.");
415*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 1, "Stop CallCount Failed.");
416*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 2, "Handler CallCount Failed.");
417*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer2.GetFiredCounter() == 1, "Fire Counter failed.");
418*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer1.IsRunning() == false, "Timer running Failed.");
419*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timer2.IsRunning() == false, "Timer running Failed.");
420*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn == false, "Platform Timer State Failed.");
421*cfb92d14SAndroid Build Coastguard Worker
422*cfb92d14SAndroid Build Coastguard Worker printf(" --> PASSED\n");
423*cfb92d14SAndroid Build Coastguard Worker
424*cfb92d14SAndroid Build Coastguard Worker testFreeInstance(instance);
425*cfb92d14SAndroid Build Coastguard Worker
426*cfb92d14SAndroid Build Coastguard Worker return 0;
427*cfb92d14SAndroid Build Coastguard Worker }
428*cfb92d14SAndroid Build Coastguard Worker
429*cfb92d14SAndroid Build Coastguard Worker /**
430*cfb92d14SAndroid Build Coastguard Worker * Test the TimerScheduler's behavior of ten timers started and fired.
431*cfb92d14SAndroid Build Coastguard Worker *
432*cfb92d14SAndroid Build Coastguard Worker * `aTimeShift` is added to the t0 and trigger times for all timers. It can be used to check the ten timer behavior
433*cfb92d14SAndroid Build Coastguard Worker * at different start time (e.g., around a 32-bit wrap).
434*cfb92d14SAndroid Build Coastguard Worker */
TenTimers(uint32_t aTimeShift)435*cfb92d14SAndroid Build Coastguard Worker template <typename TimerType> static void TenTimers(uint32_t aTimeShift)
436*cfb92d14SAndroid Build Coastguard Worker {
437*cfb92d14SAndroid Build Coastguard Worker const uint32_t kNumTimers = 10;
438*cfb92d14SAndroid Build Coastguard Worker const uint32_t kNumTriggers = 7;
439*cfb92d14SAndroid Build Coastguard Worker const uint32_t kTimeT0[kNumTimers] = {1000, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008};
440*cfb92d14SAndroid Build Coastguard Worker const uint32_t kTimerInterval[kNumTimers] = {
441*cfb92d14SAndroid Build Coastguard Worker 20, 100, (Timer::kMaxDelay - kTimeT0[2]), 100000, 1000000, 10, Timer::kMaxDelay, 200, 200, 200};
442*cfb92d14SAndroid Build Coastguard Worker // Expected timer fire order
443*cfb92d14SAndroid Build Coastguard Worker // timer # Trigger time
444*cfb92d14SAndroid Build Coastguard Worker // 5 1014
445*cfb92d14SAndroid Build Coastguard Worker // 0 1020
446*cfb92d14SAndroid Build Coastguard Worker // 1 1100
447*cfb92d14SAndroid Build Coastguard Worker // 7 1206
448*cfb92d14SAndroid Build Coastguard Worker // 8 1207
449*cfb92d14SAndroid Build Coastguard Worker // 9 1208
450*cfb92d14SAndroid Build Coastguard Worker // 3 101002
451*cfb92d14SAndroid Build Coastguard Worker // 4 1001003
452*cfb92d14SAndroid Build Coastguard Worker // 2 kMaxDuration
453*cfb92d14SAndroid Build Coastguard Worker // 6 kMaxDuration + 1005
454*cfb92d14SAndroid Build Coastguard Worker const uint32_t kTriggerTimes[kNumTriggers] = {
455*cfb92d14SAndroid Build Coastguard Worker 1014, 1020, 1100, 1207, 101004, Timer::kMaxDelay, Timer::kMaxDelay + kTimeT0[6]};
456*cfb92d14SAndroid Build Coastguard Worker // Expected timers fired by each kTriggerTimes[] value
457*cfb92d14SAndroid Build Coastguard Worker // Trigger # Timers Fired
458*cfb92d14SAndroid Build Coastguard Worker // 0 5
459*cfb92d14SAndroid Build Coastguard Worker // 1 0
460*cfb92d14SAndroid Build Coastguard Worker // 2 1
461*cfb92d14SAndroid Build Coastguard Worker // 3 7, 8
462*cfb92d14SAndroid Build Coastguard Worker // 4 9, 3
463*cfb92d14SAndroid Build Coastguard Worker // 5 4, 2
464*cfb92d14SAndroid Build Coastguard Worker // 6 6
465*cfb92d14SAndroid Build Coastguard Worker const bool kTimerStateAfterTrigger[kNumTriggers][kNumTimers] = {
466*cfb92d14SAndroid Build Coastguard Worker {true, true, true, true, true, false, true, true, true, true}, // 5
467*cfb92d14SAndroid Build Coastguard Worker {false, true, true, true, true, false, true, true, true, true}, // 0
468*cfb92d14SAndroid Build Coastguard Worker {false, false, true, true, true, false, true, true, true, true}, // 1
469*cfb92d14SAndroid Build Coastguard Worker {false, false, true, true, true, false, true, false, false, true}, // 7, 8
470*cfb92d14SAndroid Build Coastguard Worker {false, false, true, false, true, false, true, false, false, false}, // 9, 3
471*cfb92d14SAndroid Build Coastguard Worker {false, false, false, false, false, false, true, false, false, false}, // 4, 2
472*cfb92d14SAndroid Build Coastguard Worker {false, false, false, false, false, false, false, false, false, false} // 6
473*cfb92d14SAndroid Build Coastguard Worker };
474*cfb92d14SAndroid Build Coastguard Worker
475*cfb92d14SAndroid Build Coastguard Worker const bool kSchedulerStateAfterTrigger[kNumTriggers] = {true, true, true, true, true, true, false};
476*cfb92d14SAndroid Build Coastguard Worker
477*cfb92d14SAndroid Build Coastguard Worker const uint32_t kTimerHandlerCountAfterTrigger[kNumTriggers] = {1, 2, 3, 5, 7, 9, 10};
478*cfb92d14SAndroid Build Coastguard Worker
479*cfb92d14SAndroid Build Coastguard Worker const uint32_t kTimerStopCountAfterTrigger[kNumTriggers] = {0, 0, 0, 0, 0, 0, 1};
480*cfb92d14SAndroid Build Coastguard Worker
481*cfb92d14SAndroid Build Coastguard Worker const uint32_t kTimerStartCountAfterTrigger[kNumTriggers] = {3, 4, 5, 7, 9, 11, 11};
482*cfb92d14SAndroid Build Coastguard Worker
483*cfb92d14SAndroid Build Coastguard Worker Instance *instance = testInitInstance();
484*cfb92d14SAndroid Build Coastguard Worker
485*cfb92d14SAndroid Build Coastguard Worker TestTimer<TimerType> timer0(*instance);
486*cfb92d14SAndroid Build Coastguard Worker TestTimer<TimerType> timer1(*instance);
487*cfb92d14SAndroid Build Coastguard Worker TestTimer<TimerType> timer2(*instance);
488*cfb92d14SAndroid Build Coastguard Worker TestTimer<TimerType> timer3(*instance);
489*cfb92d14SAndroid Build Coastguard Worker TestTimer<TimerType> timer4(*instance);
490*cfb92d14SAndroid Build Coastguard Worker TestTimer<TimerType> timer5(*instance);
491*cfb92d14SAndroid Build Coastguard Worker TestTimer<TimerType> timer6(*instance);
492*cfb92d14SAndroid Build Coastguard Worker TestTimer<TimerType> timer7(*instance);
493*cfb92d14SAndroid Build Coastguard Worker TestTimer<TimerType> timer8(*instance);
494*cfb92d14SAndroid Build Coastguard Worker TestTimer<TimerType> timer9(*instance);
495*cfb92d14SAndroid Build Coastguard Worker TestTimer<TimerType> *timers[kNumTimers] = {&timer0, &timer1, &timer2, &timer3, &timer4,
496*cfb92d14SAndroid Build Coastguard Worker &timer5, &timer6, &timer7, &timer8, &timer9};
497*cfb92d14SAndroid Build Coastguard Worker size_t i;
498*cfb92d14SAndroid Build Coastguard Worker
499*cfb92d14SAndroid Build Coastguard Worker printf("TestTenTimer() with aTimeShift=%-10u ", aTimeShift);
500*cfb92d14SAndroid Build Coastguard Worker
501*cfb92d14SAndroid Build Coastguard Worker // Start the Ten timers.
502*cfb92d14SAndroid Build Coastguard Worker
503*cfb92d14SAndroid Build Coastguard Worker TestTimer<TimerType>::RemoveAll(*instance);
504*cfb92d14SAndroid Build Coastguard Worker InitCounters();
505*cfb92d14SAndroid Build Coastguard Worker
506*cfb92d14SAndroid Build Coastguard Worker for (i = 0; i < kNumTimers; i++)
507*cfb92d14SAndroid Build Coastguard Worker {
508*cfb92d14SAndroid Build Coastguard Worker sNow = kTimeT0[i] + aTimeShift;
509*cfb92d14SAndroid Build Coastguard Worker timers[i]->Start(kTimerInterval[i]);
510*cfb92d14SAndroid Build Coastguard Worker }
511*cfb92d14SAndroid Build Coastguard Worker
512*cfb92d14SAndroid Build Coastguard Worker // given the order in which timers are started, the TimerScheduler should call otPlatAlarmMilliStartAt 2 times.
513*cfb92d14SAndroid Build Coastguard Worker // one for timer[0] and one for timer[5] which will supersede timer[0].
514*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStart] == 2, "TestTenTimer: Start CallCount Failed.");
515*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == 0, "TestTenTimer: Stop CallCount Failed.");
516*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == 0, "TestTenTimer: Handler CallCount Failed.");
517*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sPlatT0 == kTimeT0[5] + aTimeShift, "TestTenTimer: Start params Failed.");
518*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sPlatDt == kTimerInterval[5], "TestTenTimer: Start params Failed.");
519*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn, "TestTenTimer: Platform Timer State Failed.");
520*cfb92d14SAndroid Build Coastguard Worker
521*cfb92d14SAndroid Build Coastguard Worker for (i = 0; i < kNumTimers; i++)
522*cfb92d14SAndroid Build Coastguard Worker {
523*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timers[i]->IsRunning(), "TestTenTimer: Timer running Failed.");
524*cfb92d14SAndroid Build Coastguard Worker }
525*cfb92d14SAndroid Build Coastguard Worker
526*cfb92d14SAndroid Build Coastguard Worker // Issue the triggers and test the State after each trigger.
527*cfb92d14SAndroid Build Coastguard Worker
528*cfb92d14SAndroid Build Coastguard Worker for (size_t trigger = 0; trigger < kNumTriggers; trigger++)
529*cfb92d14SAndroid Build Coastguard Worker {
530*cfb92d14SAndroid Build Coastguard Worker sNow = kTriggerTimes[trigger] + aTimeShift;
531*cfb92d14SAndroid Build Coastguard Worker
532*cfb92d14SAndroid Build Coastguard Worker do
533*cfb92d14SAndroid Build Coastguard Worker {
534*cfb92d14SAndroid Build Coastguard Worker // By design, each call to AlarmFired<TimerType>() can result in 0 or 1 calls to a timer handler.
535*cfb92d14SAndroid Build Coastguard Worker // For some combinations of sNow and Timers queued, it is necessary to call AlarmFired<TimerType>()
536*cfb92d14SAndroid Build Coastguard Worker // multiple times in order to handle all the expired timers. It can be determined that another
537*cfb92d14SAndroid Build Coastguard Worker // timer is ready to be triggered by examining the aDt arg passed into otPlatAlarmMilliStartAt(). If
538*cfb92d14SAndroid Build Coastguard Worker // that value is 0, then AlarmFired should be fired immediately. This loop calls
539*cfb92d14SAndroid Build Coastguard Worker // AlarmFired<TimerType>() the requisite number of times based on the aDt argument.
540*cfb92d14SAndroid Build Coastguard Worker AlarmFired<TimerType>(instance);
541*cfb92d14SAndroid Build Coastguard Worker } while (sPlatDt == 0);
542*cfb92d14SAndroid Build Coastguard Worker
543*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStart] == kTimerStartCountAfterTrigger[trigger],
544*cfb92d14SAndroid Build Coastguard Worker "TestTenTimer: Start CallCount Failed.");
545*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexAlarmStop] == kTimerStopCountAfterTrigger[trigger],
546*cfb92d14SAndroid Build Coastguard Worker "TestTenTimer: Stop CallCount Failed.");
547*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sCallCount[kCallCountIndexTimerHandler] == kTimerHandlerCountAfterTrigger[trigger],
548*cfb92d14SAndroid Build Coastguard Worker "TestTenTimer: Handler CallCount Failed.");
549*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(sTimerOn == kSchedulerStateAfterTrigger[trigger], "TestTenTimer: Platform Timer State Failed.");
550*cfb92d14SAndroid Build Coastguard Worker
551*cfb92d14SAndroid Build Coastguard Worker for (i = 0; i < kNumTimers; i++)
552*cfb92d14SAndroid Build Coastguard Worker {
553*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timers[i]->IsRunning() == kTimerStateAfterTrigger[trigger][i],
554*cfb92d14SAndroid Build Coastguard Worker "TestTenTimer: Timer running Failed.");
555*cfb92d14SAndroid Build Coastguard Worker }
556*cfb92d14SAndroid Build Coastguard Worker }
557*cfb92d14SAndroid Build Coastguard Worker
558*cfb92d14SAndroid Build Coastguard Worker for (i = 0; i < kNumTimers; i++)
559*cfb92d14SAndroid Build Coastguard Worker {
560*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(timers[i]->GetFiredCounter() == 1, "TestTenTimer: Timer fired counter Failed.");
561*cfb92d14SAndroid Build Coastguard Worker }
562*cfb92d14SAndroid Build Coastguard Worker
563*cfb92d14SAndroid Build Coastguard Worker printf("--> PASSED\n");
564*cfb92d14SAndroid Build Coastguard Worker
565*cfb92d14SAndroid Build Coastguard Worker testFreeInstance(instance);
566*cfb92d14SAndroid Build Coastguard Worker }
567*cfb92d14SAndroid Build Coastguard Worker
TestTenTimers(void)568*cfb92d14SAndroid Build Coastguard Worker template <typename TimerType> int TestTenTimers(void)
569*cfb92d14SAndroid Build Coastguard Worker {
570*cfb92d14SAndroid Build Coastguard Worker // Time shift to change the start/fire time of ten timers.
571*cfb92d14SAndroid Build Coastguard Worker const uint32_t kTimeShift[] = {
572*cfb92d14SAndroid Build Coastguard Worker 0, 100000U, 0U - 1U, 0U - 1100U, Timer::kMaxDelay, Timer::kMaxDelay + 1020U,
573*cfb92d14SAndroid Build Coastguard Worker };
574*cfb92d14SAndroid Build Coastguard Worker
575*cfb92d14SAndroid Build Coastguard Worker size_t i;
576*cfb92d14SAndroid Build Coastguard Worker
577*cfb92d14SAndroid Build Coastguard Worker for (i = 0; i < GetArrayLength(kTimeShift); i++)
578*cfb92d14SAndroid Build Coastguard Worker {
579*cfb92d14SAndroid Build Coastguard Worker TenTimers<TimerType>(kTimeShift[i]);
580*cfb92d14SAndroid Build Coastguard Worker }
581*cfb92d14SAndroid Build Coastguard Worker
582*cfb92d14SAndroid Build Coastguard Worker return 0;
583*cfb92d14SAndroid Build Coastguard Worker }
584*cfb92d14SAndroid Build Coastguard Worker
585*cfb92d14SAndroid Build Coastguard Worker /**
586*cfb92d14SAndroid Build Coastguard Worker * Test the `Timer::Time` class.
587*cfb92d14SAndroid Build Coastguard Worker */
TestTimerTime(void)588*cfb92d14SAndroid Build Coastguard Worker int TestTimerTime(void)
589*cfb92d14SAndroid Build Coastguard Worker {
590*cfb92d14SAndroid Build Coastguard Worker const uint32_t kMaxTime = 0xffffffff;
591*cfb92d14SAndroid Build Coastguard Worker const uint32_t kStartTimes[] = {0, 100, kMaxTime / 2, kMaxTime - 100, kMaxTime};
592*cfb92d14SAndroid Build Coastguard Worker const uint32_t kDurations[] = {1, 100, Timer::kMaxDelay - 1, Timer::kMaxDelay};
593*cfb92d14SAndroid Build Coastguard Worker
594*cfb92d14SAndroid Build Coastguard Worker Time t1;
595*cfb92d14SAndroid Build Coastguard Worker Time t2;
596*cfb92d14SAndroid Build Coastguard Worker
597*cfb92d14SAndroid Build Coastguard Worker for (uint32_t startTime : kStartTimes)
598*cfb92d14SAndroid Build Coastguard Worker {
599*cfb92d14SAndroid Build Coastguard Worker for (uint32_t duration : kDurations)
600*cfb92d14SAndroid Build Coastguard Worker {
601*cfb92d14SAndroid Build Coastguard Worker printf("TestTimerTime() start=%-10x duration=%-10x ", startTime, duration);
602*cfb92d14SAndroid Build Coastguard Worker
603*cfb92d14SAndroid Build Coastguard Worker t1.SetValue(startTime);
604*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(t1.GetValue() == startTime, "Time::SetValue() failed.");
605*cfb92d14SAndroid Build Coastguard Worker
606*cfb92d14SAndroid Build Coastguard Worker t2 = t1;
607*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(t1.GetValue() == startTime, "Time assignment failed.");
608*cfb92d14SAndroid Build Coastguard Worker
609*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(t1 == t2, "Time == failed.");
610*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!(t1 != t2), "Time != failed.");
611*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!(t1 < t2), "Time < failed.");
612*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit((t1 <= t2), "Time <= failed.");
613*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!(t1 > t2), "Time > failed.");
614*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit((t1 >= t2), "Time >= failed.");
615*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(t2 - t1 == 0, "Time difference failed");
616*cfb92d14SAndroid Build Coastguard Worker
617*cfb92d14SAndroid Build Coastguard Worker t2 = t1 + duration;
618*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!(t1 == t2), "Time == failed.");
619*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit((t1 != t2), "Time != failed.");
620*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit((t1 < t2), "Time < failed.");
621*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit((t1 <= t2), "Time <= failed.");
622*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!(t1 > t2), "Time > failed.");
623*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!(t1 >= t2), "Time >= failed.");
624*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(t2 - t1 == duration, "Time difference failed");
625*cfb92d14SAndroid Build Coastguard Worker
626*cfb92d14SAndroid Build Coastguard Worker t2 = t1;
627*cfb92d14SAndroid Build Coastguard Worker t2 += duration;
628*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!(t1 == t2), "Time == failed.");
629*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit((t1 != t2), "Time != failed.");
630*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit((t1 < t2), "Time < failed.");
631*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit((t1 <= t2), "Time <= failed.");
632*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!(t1 > t2), "Time > failed.");
633*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!(t1 >= t2), "Time >= failed.");
634*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(t2 - t1 == duration, "Time difference failed");
635*cfb92d14SAndroid Build Coastguard Worker
636*cfb92d14SAndroid Build Coastguard Worker t2 = t1 - duration;
637*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!(t1 == t2), "Time == failed.");
638*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit((t1 != t2), "Time != failed.");
639*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!(t1 < t2), "Time < failed.");
640*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!(t1 <= t2), "Time <= failed.");
641*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit((t1 > t2), "Time > failed.");
642*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit((t1 >= t2), "Time >= failed.");
643*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(t1 - t2 == duration, "Time difference failed");
644*cfb92d14SAndroid Build Coastguard Worker
645*cfb92d14SAndroid Build Coastguard Worker t2 = t1;
646*cfb92d14SAndroid Build Coastguard Worker t2 -= duration;
647*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!(t1 == t2), "Time == failed.");
648*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit((t1 != t2), "Time != failed.");
649*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!(t1 < t2), "Time < failed.");
650*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!(t1 <= t2), "Time <= failed.");
651*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit((t1 > t2), "Time > failed.");
652*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit((t1 >= t2), "Time >= failed.");
653*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(t1 - t2 == duration, "Time difference failed");
654*cfb92d14SAndroid Build Coastguard Worker
655*cfb92d14SAndroid Build Coastguard Worker t2 = t1.GetDistantFuture();
656*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit((t1 < t2) && !(t1 > t2), "GetDistanceFuture() failed");
657*cfb92d14SAndroid Build Coastguard Worker t2 += 1;
658*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!(t1 < t2) || (t1 > t2), "GetDistanceFuture() failed");
659*cfb92d14SAndroid Build Coastguard Worker
660*cfb92d14SAndroid Build Coastguard Worker t2 = t1.GetDistantPast();
661*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit((t1 > t2) && !(t1 < t2), "GetDistantPast() failed");
662*cfb92d14SAndroid Build Coastguard Worker t2 -= 1;
663*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!(t1 > t2) || (t1 < t2), "GetDistantPast() failed");
664*cfb92d14SAndroid Build Coastguard Worker
665*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(Min(t1, t1.GetDistantFuture()) == t1);
666*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(Min(t1.GetDistantFuture(), t1) == t1);
667*cfb92d14SAndroid Build Coastguard Worker
668*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(Max(t1, t1.GetDistantPast()) == t1);
669*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(Max(t1.GetDistantPast(), t1) == t1);
670*cfb92d14SAndroid Build Coastguard Worker
671*cfb92d14SAndroid Build Coastguard Worker printf("--> PASSED\n");
672*cfb92d14SAndroid Build Coastguard Worker }
673*cfb92d14SAndroid Build Coastguard Worker }
674*cfb92d14SAndroid Build Coastguard Worker
675*cfb92d14SAndroid Build Coastguard Worker return 0;
676*cfb92d14SAndroid Build Coastguard Worker }
677*cfb92d14SAndroid Build Coastguard Worker
RunTimerTests(void)678*cfb92d14SAndroid Build Coastguard Worker template <typename TimerType> void RunTimerTests(void)
679*cfb92d14SAndroid Build Coastguard Worker {
680*cfb92d14SAndroid Build Coastguard Worker TestOneTimer<TimerType>();
681*cfb92d14SAndroid Build Coastguard Worker TestTwoTimers<TimerType>();
682*cfb92d14SAndroid Build Coastguard Worker TestTenTimers<TimerType>();
683*cfb92d14SAndroid Build Coastguard Worker }
684*cfb92d14SAndroid Build Coastguard Worker
685*cfb92d14SAndroid Build Coastguard Worker } // namespace ot
686*cfb92d14SAndroid Build Coastguard Worker
main(void)687*cfb92d14SAndroid Build Coastguard Worker int main(void)
688*cfb92d14SAndroid Build Coastguard Worker {
689*cfb92d14SAndroid Build Coastguard Worker ot::RunTimerTests<ot::TimerMilli>();
690*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
691*cfb92d14SAndroid Build Coastguard Worker ot::RunTimerTests<ot::TimerMicro>();
692*cfb92d14SAndroid Build Coastguard Worker #endif
693*cfb92d14SAndroid Build Coastguard Worker ot::TestTimerTime();
694*cfb92d14SAndroid Build Coastguard Worker printf("All tests passed\n");
695*cfb92d14SAndroid Build Coastguard Worker return 0;
696*cfb92d14SAndroid Build Coastguard Worker }
697