xref: /aosp_15_r20/external/openthread/tests/unit/test_timer.cpp (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
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