xref: /aosp_15_r20/external/openthread/tests/unit/test_srp_server.cpp (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker  *  Copyright (c) 2022, 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 <openthread/config.h>
30*cfb92d14SAndroid Build Coastguard Worker 
31*cfb92d14SAndroid Build Coastguard Worker #include "test_platform.h"
32*cfb92d14SAndroid Build Coastguard Worker #include "test_util.hpp"
33*cfb92d14SAndroid Build Coastguard Worker 
34*cfb92d14SAndroid Build Coastguard Worker #include <openthread/dataset_ftd.h>
35*cfb92d14SAndroid Build Coastguard Worker #include <openthread/srp_client.h>
36*cfb92d14SAndroid Build Coastguard Worker #include <openthread/srp_server.h>
37*cfb92d14SAndroid Build Coastguard Worker #include <openthread/thread.h>
38*cfb92d14SAndroid Build Coastguard Worker 
39*cfb92d14SAndroid Build Coastguard Worker #include "common/arg_macros.hpp"
40*cfb92d14SAndroid Build Coastguard Worker #include "common/array.hpp"
41*cfb92d14SAndroid Build Coastguard Worker #include "common/string.hpp"
42*cfb92d14SAndroid Build Coastguard Worker #include "common/time.hpp"
43*cfb92d14SAndroid Build Coastguard Worker #include "instance/instance.hpp"
44*cfb92d14SAndroid Build Coastguard Worker 
45*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_SRP_SERVER_ENABLE && OPENTHREAD_CONFIG_SRP_CLIENT_ENABLE && \
46*cfb92d14SAndroid Build Coastguard Worker     !OPENTHREAD_CONFIG_TIME_SYNC_ENABLE && !OPENTHREAD_PLATFORM_POSIX
47*cfb92d14SAndroid Build Coastguard Worker #define ENABLE_SRP_TEST 1
48*cfb92d14SAndroid Build Coastguard Worker #else
49*cfb92d14SAndroid Build Coastguard Worker #define ENABLE_SRP_TEST 0
50*cfb92d14SAndroid Build Coastguard Worker #endif
51*cfb92d14SAndroid Build Coastguard Worker 
52*cfb92d14SAndroid Build Coastguard Worker namespace ot {
53*cfb92d14SAndroid Build Coastguard Worker 
54*cfb92d14SAndroid Build Coastguard Worker #if ENABLE_SRP_TEST
55*cfb92d14SAndroid Build Coastguard Worker 
56*cfb92d14SAndroid Build Coastguard Worker // Logs a message and adds current time (sNow) as "<hours>:<min>:<secs>.<msec>"
57*cfb92d14SAndroid Build Coastguard Worker #define Log(...)                                                                                          \
58*cfb92d14SAndroid Build Coastguard Worker     printf("%02u:%02u:%02u.%03u " OT_FIRST_ARG(__VA_ARGS__) "\n", (sNow / 36000000), (sNow / 60000) % 60, \
59*cfb92d14SAndroid Build Coastguard Worker            (sNow / 1000) % 60, sNow % 1000 OT_REST_ARGS(__VA_ARGS__))
60*cfb92d14SAndroid Build Coastguard Worker 
61*cfb92d14SAndroid Build Coastguard Worker static constexpr uint16_t kMaxRaSize = 800;
62*cfb92d14SAndroid Build Coastguard Worker 
63*cfb92d14SAndroid Build Coastguard Worker static Instance *sInstance;
64*cfb92d14SAndroid Build Coastguard Worker 
65*cfb92d14SAndroid Build Coastguard Worker static uint32_t sNow = 0;
66*cfb92d14SAndroid Build Coastguard Worker static uint32_t sAlarmTime;
67*cfb92d14SAndroid Build Coastguard Worker static bool     sAlarmOn = false;
68*cfb92d14SAndroid Build Coastguard Worker 
69*cfb92d14SAndroid Build Coastguard Worker static otRadioFrame sRadioTxFrame;
70*cfb92d14SAndroid Build Coastguard Worker static uint8_t      sRadioTxFramePsdu[OT_RADIO_FRAME_MAX_SIZE];
71*cfb92d14SAndroid Build Coastguard Worker static bool         sRadioTxOngoing = false;
72*cfb92d14SAndroid Build Coastguard Worker 
73*cfb92d14SAndroid Build Coastguard Worker //----------------------------------------------------------------------------------------------------------------------
74*cfb92d14SAndroid Build Coastguard Worker // Function prototypes
75*cfb92d14SAndroid Build Coastguard Worker 
76*cfb92d14SAndroid Build Coastguard Worker void ProcessRadioTxAndTasklets(void);
77*cfb92d14SAndroid Build Coastguard Worker void AdvanceTime(uint32_t aDuration);
78*cfb92d14SAndroid Build Coastguard Worker 
79*cfb92d14SAndroid Build Coastguard Worker //----------------------------------------------------------------------------------------------------------------------
80*cfb92d14SAndroid Build Coastguard Worker // `otPlatRadio`
81*cfb92d14SAndroid Build Coastguard Worker 
82*cfb92d14SAndroid Build Coastguard Worker extern "C" {
83*cfb92d14SAndroid Build Coastguard Worker 
otPlatRadioGetCaps(otInstance *)84*cfb92d14SAndroid Build Coastguard Worker otRadioCaps otPlatRadioGetCaps(otInstance *) { return OT_RADIO_CAPS_ACK_TIMEOUT | OT_RADIO_CAPS_CSMA_BACKOFF; }
85*cfb92d14SAndroid Build Coastguard Worker 
otPlatRadioTransmit(otInstance *,otRadioFrame *)86*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioTransmit(otInstance *, otRadioFrame *)
87*cfb92d14SAndroid Build Coastguard Worker {
88*cfb92d14SAndroid Build Coastguard Worker     sRadioTxOngoing = true;
89*cfb92d14SAndroid Build Coastguard Worker 
90*cfb92d14SAndroid Build Coastguard Worker     return OT_ERROR_NONE;
91*cfb92d14SAndroid Build Coastguard Worker }
92*cfb92d14SAndroid Build Coastguard Worker 
otPlatRadioGetTransmitBuffer(otInstance *)93*cfb92d14SAndroid Build Coastguard Worker otRadioFrame *otPlatRadioGetTransmitBuffer(otInstance *) { return &sRadioTxFrame; }
94*cfb92d14SAndroid Build Coastguard Worker 
95*cfb92d14SAndroid Build Coastguard Worker //----------------------------------------------------------------------------------------------------------------------
96*cfb92d14SAndroid Build Coastguard Worker // `otPlatAlaram`
97*cfb92d14SAndroid Build Coastguard Worker 
otPlatAlarmMilliStop(otInstance *)98*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMilliStop(otInstance *) { sAlarmOn = false; }
99*cfb92d14SAndroid Build Coastguard Worker 
otPlatAlarmMilliStartAt(otInstance *,uint32_t aT0,uint32_t aDt)100*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMilliStartAt(otInstance *, uint32_t aT0, uint32_t aDt)
101*cfb92d14SAndroid Build Coastguard Worker {
102*cfb92d14SAndroid Build Coastguard Worker     sAlarmOn   = true;
103*cfb92d14SAndroid Build Coastguard Worker     sAlarmTime = aT0 + aDt;
104*cfb92d14SAndroid Build Coastguard Worker }
105*cfb92d14SAndroid Build Coastguard Worker 
otPlatAlarmMilliGetNow(void)106*cfb92d14SAndroid Build Coastguard Worker uint32_t otPlatAlarmMilliGetNow(void) { return sNow; }
107*cfb92d14SAndroid Build Coastguard Worker 
108*cfb92d14SAndroid Build Coastguard Worker //----------------------------------------------------------------------------------------------------------------------
109*cfb92d14SAndroid Build Coastguard Worker 
110*cfb92d14SAndroid Build Coastguard Worker Array<void *, 500> sHeapAllocatedPtrs;
111*cfb92d14SAndroid Build Coastguard Worker 
112*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_HEAP_EXTERNAL_ENABLE
otPlatCAlloc(size_t aNum,size_t aSize)113*cfb92d14SAndroid Build Coastguard Worker void *otPlatCAlloc(size_t aNum, size_t aSize)
114*cfb92d14SAndroid Build Coastguard Worker {
115*cfb92d14SAndroid Build Coastguard Worker     void *ptr = calloc(aNum, aSize);
116*cfb92d14SAndroid Build Coastguard Worker 
117*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(sHeapAllocatedPtrs.PushBack(ptr));
118*cfb92d14SAndroid Build Coastguard Worker 
119*cfb92d14SAndroid Build Coastguard Worker     return ptr;
120*cfb92d14SAndroid Build Coastguard Worker }
121*cfb92d14SAndroid Build Coastguard Worker 
otPlatFree(void * aPtr)122*cfb92d14SAndroid Build Coastguard Worker void otPlatFree(void *aPtr)
123*cfb92d14SAndroid Build Coastguard Worker {
124*cfb92d14SAndroid Build Coastguard Worker     if (aPtr != nullptr)
125*cfb92d14SAndroid Build Coastguard Worker     {
126*cfb92d14SAndroid Build Coastguard Worker         void **entry = sHeapAllocatedPtrs.Find(aPtr);
127*cfb92d14SAndroid Build Coastguard Worker 
128*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(entry != nullptr, "A heap allocated item is freed twice");
129*cfb92d14SAndroid Build Coastguard Worker         sHeapAllocatedPtrs.Remove(*entry);
130*cfb92d14SAndroid Build Coastguard Worker     }
131*cfb92d14SAndroid Build Coastguard Worker 
132*cfb92d14SAndroid Build Coastguard Worker     free(aPtr);
133*cfb92d14SAndroid Build Coastguard Worker }
134*cfb92d14SAndroid Build Coastguard Worker #endif
135*cfb92d14SAndroid Build Coastguard Worker 
136*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_LOG_OUTPUT == OPENTHREAD_CONFIG_LOG_OUTPUT_PLATFORM_DEFINED
otPlatLog(otLogLevel aLogLevel,otLogRegion aLogRegion,const char * aFormat,...)137*cfb92d14SAndroid Build Coastguard Worker void otPlatLog(otLogLevel aLogLevel, otLogRegion aLogRegion, const char *aFormat, ...)
138*cfb92d14SAndroid Build Coastguard Worker {
139*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aLogLevel);
140*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aLogRegion);
141*cfb92d14SAndroid Build Coastguard Worker 
142*cfb92d14SAndroid Build Coastguard Worker     va_list args;
143*cfb92d14SAndroid Build Coastguard Worker 
144*cfb92d14SAndroid Build Coastguard Worker     printf("   ");
145*cfb92d14SAndroid Build Coastguard Worker     va_start(args, aFormat);
146*cfb92d14SAndroid Build Coastguard Worker     vprintf(aFormat, args);
147*cfb92d14SAndroid Build Coastguard Worker     va_end(args);
148*cfb92d14SAndroid Build Coastguard Worker     printf("\n");
149*cfb92d14SAndroid Build Coastguard Worker }
150*cfb92d14SAndroid Build Coastguard Worker #endif
151*cfb92d14SAndroid Build Coastguard Worker 
152*cfb92d14SAndroid Build Coastguard Worker } // extern "C"
153*cfb92d14SAndroid Build Coastguard Worker 
154*cfb92d14SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------
155*cfb92d14SAndroid Build Coastguard Worker 
ProcessRadioTxAndTasklets(void)156*cfb92d14SAndroid Build Coastguard Worker void ProcessRadioTxAndTasklets(void)
157*cfb92d14SAndroid Build Coastguard Worker {
158*cfb92d14SAndroid Build Coastguard Worker     do
159*cfb92d14SAndroid Build Coastguard Worker     {
160*cfb92d14SAndroid Build Coastguard Worker         if (sRadioTxOngoing)
161*cfb92d14SAndroid Build Coastguard Worker         {
162*cfb92d14SAndroid Build Coastguard Worker             sRadioTxOngoing = false;
163*cfb92d14SAndroid Build Coastguard Worker             otPlatRadioTxStarted(sInstance, &sRadioTxFrame);
164*cfb92d14SAndroid Build Coastguard Worker             otPlatRadioTxDone(sInstance, &sRadioTxFrame, nullptr, OT_ERROR_NONE);
165*cfb92d14SAndroid Build Coastguard Worker         }
166*cfb92d14SAndroid Build Coastguard Worker 
167*cfb92d14SAndroid Build Coastguard Worker         otTaskletsProcess(sInstance);
168*cfb92d14SAndroid Build Coastguard Worker     } while (otTaskletsArePending(sInstance));
169*cfb92d14SAndroid Build Coastguard Worker }
170*cfb92d14SAndroid Build Coastguard Worker 
AdvanceTime(uint32_t aDuration)171*cfb92d14SAndroid Build Coastguard Worker void AdvanceTime(uint32_t aDuration)
172*cfb92d14SAndroid Build Coastguard Worker {
173*cfb92d14SAndroid Build Coastguard Worker     uint32_t time = sNow + aDuration;
174*cfb92d14SAndroid Build Coastguard Worker 
175*cfb92d14SAndroid Build Coastguard Worker     Log("AdvanceTime for %u.%03u", aDuration / 1000, aDuration % 1000);
176*cfb92d14SAndroid Build Coastguard Worker 
177*cfb92d14SAndroid Build Coastguard Worker     while (TimeMilli(sAlarmTime) <= TimeMilli(time))
178*cfb92d14SAndroid Build Coastguard Worker     {
179*cfb92d14SAndroid Build Coastguard Worker         ProcessRadioTxAndTasklets();
180*cfb92d14SAndroid Build Coastguard Worker         sNow = sAlarmTime;
181*cfb92d14SAndroid Build Coastguard Worker         otPlatAlarmMilliFired(sInstance);
182*cfb92d14SAndroid Build Coastguard Worker     }
183*cfb92d14SAndroid Build Coastguard Worker 
184*cfb92d14SAndroid Build Coastguard Worker     ProcessRadioTxAndTasklets();
185*cfb92d14SAndroid Build Coastguard Worker     sNow = time;
186*cfb92d14SAndroid Build Coastguard Worker }
187*cfb92d14SAndroid Build Coastguard Worker 
InitTest(void)188*cfb92d14SAndroid Build Coastguard Worker void InitTest(void)
189*cfb92d14SAndroid Build Coastguard Worker {
190*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
191*cfb92d14SAndroid Build Coastguard Worker     // Initialize OT instance.
192*cfb92d14SAndroid Build Coastguard Worker 
193*cfb92d14SAndroid Build Coastguard Worker     sNow      = 0;
194*cfb92d14SAndroid Build Coastguard Worker     sAlarmOn  = false;
195*cfb92d14SAndroid Build Coastguard Worker     sInstance = static_cast<Instance *>(testInitInstance());
196*cfb92d14SAndroid Build Coastguard Worker 
197*cfb92d14SAndroid Build Coastguard Worker     memset(&sRadioTxFrame, 0, sizeof(sRadioTxFrame));
198*cfb92d14SAndroid Build Coastguard Worker     sRadioTxFrame.mPsdu = sRadioTxFramePsdu;
199*cfb92d14SAndroid Build Coastguard Worker     sRadioTxOngoing     = false;
200*cfb92d14SAndroid Build Coastguard Worker 
201*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
202*cfb92d14SAndroid Build Coastguard Worker     // Initialize Border Router and start Thread operation.
203*cfb92d14SAndroid Build Coastguard Worker 
204*cfb92d14SAndroid Build Coastguard Worker     otOperationalDataset     dataset;
205*cfb92d14SAndroid Build Coastguard Worker     otOperationalDatasetTlvs datasetTlvs;
206*cfb92d14SAndroid Build Coastguard Worker 
207*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(otDatasetCreateNewNetwork(sInstance, &dataset));
208*cfb92d14SAndroid Build Coastguard Worker     otDatasetConvertToTlvs(&dataset, &datasetTlvs);
209*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(otDatasetSetActiveTlvs(sInstance, &datasetTlvs));
210*cfb92d14SAndroid Build Coastguard Worker 
211*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(otIp6SetEnabled(sInstance, true));
212*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(otThreadSetEnabled(sInstance, true));
213*cfb92d14SAndroid Build Coastguard Worker 
214*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
215*cfb92d14SAndroid Build Coastguard Worker     // Ensure device starts as leader.
216*cfb92d14SAndroid Build Coastguard Worker 
217*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(10000);
218*cfb92d14SAndroid Build Coastguard Worker 
219*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(otThreadGetDeviceRole(sInstance) == OT_DEVICE_ROLE_LEADER);
220*cfb92d14SAndroid Build Coastguard Worker }
221*cfb92d14SAndroid Build Coastguard Worker 
FinalizeTest(void)222*cfb92d14SAndroid Build Coastguard Worker void FinalizeTest(void)
223*cfb92d14SAndroid Build Coastguard Worker {
224*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(otIp6SetEnabled(sInstance, false));
225*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(otThreadSetEnabled(sInstance, false));
226*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(otInstanceErasePersistentInfo(sInstance));
227*cfb92d14SAndroid Build Coastguard Worker     testFreeInstance(sInstance);
228*cfb92d14SAndroid Build Coastguard Worker }
229*cfb92d14SAndroid Build Coastguard Worker 
230*cfb92d14SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------
231*cfb92d14SAndroid Build Coastguard Worker 
232*cfb92d14SAndroid Build Coastguard Worker enum UpdateHandlerMode
233*cfb92d14SAndroid Build Coastguard Worker {
234*cfb92d14SAndroid Build Coastguard Worker     kAccept, // Accept all updates.
235*cfb92d14SAndroid Build Coastguard Worker     kReject, // Reject all updates.
236*cfb92d14SAndroid Build Coastguard Worker     kIgnore  // Ignore all updates (do not call `otSrpServerHandleServiceUpdateResult()`).
237*cfb92d14SAndroid Build Coastguard Worker };
238*cfb92d14SAndroid Build Coastguard Worker 
239*cfb92d14SAndroid Build Coastguard Worker static UpdateHandlerMode    sUpdateHandlerMode       = kAccept;
240*cfb92d14SAndroid Build Coastguard Worker static bool                 sProcessedUpdateCallback = false;
241*cfb92d14SAndroid Build Coastguard Worker static otSrpServerLeaseInfo sUpdateHostLeaseInfo;
242*cfb92d14SAndroid Build Coastguard Worker static uint32_t             sUpdateHostKeyLease;
243*cfb92d14SAndroid Build Coastguard Worker 
HandleSrpServerUpdate(otSrpServerServiceUpdateId aId,const otSrpServerHost * aHost,uint32_t aTimeout,void * aContext)244*cfb92d14SAndroid Build Coastguard Worker void HandleSrpServerUpdate(otSrpServerServiceUpdateId aId,
245*cfb92d14SAndroid Build Coastguard Worker                            const otSrpServerHost     *aHost,
246*cfb92d14SAndroid Build Coastguard Worker                            uint32_t                   aTimeout,
247*cfb92d14SAndroid Build Coastguard Worker                            void                      *aContext)
248*cfb92d14SAndroid Build Coastguard Worker {
249*cfb92d14SAndroid Build Coastguard Worker     Log("HandleSrpServerUpdate() called with %u, timeout:%u", aId, aTimeout);
250*cfb92d14SAndroid Build Coastguard Worker 
251*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(aHost != nullptr);
252*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(aContext == sInstance);
253*cfb92d14SAndroid Build Coastguard Worker 
254*cfb92d14SAndroid Build Coastguard Worker     sProcessedUpdateCallback = true;
255*cfb92d14SAndroid Build Coastguard Worker 
256*cfb92d14SAndroid Build Coastguard Worker     otSrpServerHostGetLeaseInfo(aHost, &sUpdateHostLeaseInfo);
257*cfb92d14SAndroid Build Coastguard Worker 
258*cfb92d14SAndroid Build Coastguard Worker     switch (sUpdateHandlerMode)
259*cfb92d14SAndroid Build Coastguard Worker     {
260*cfb92d14SAndroid Build Coastguard Worker     case kAccept:
261*cfb92d14SAndroid Build Coastguard Worker         otSrpServerHandleServiceUpdateResult(sInstance, aId, kErrorNone);
262*cfb92d14SAndroid Build Coastguard Worker         break;
263*cfb92d14SAndroid Build Coastguard Worker     case kReject:
264*cfb92d14SAndroid Build Coastguard Worker         otSrpServerHandleServiceUpdateResult(sInstance, aId, kErrorFailed);
265*cfb92d14SAndroid Build Coastguard Worker         break;
266*cfb92d14SAndroid Build Coastguard Worker     case kIgnore:
267*cfb92d14SAndroid Build Coastguard Worker         break;
268*cfb92d14SAndroid Build Coastguard Worker     }
269*cfb92d14SAndroid Build Coastguard Worker }
270*cfb92d14SAndroid Build Coastguard Worker 
271*cfb92d14SAndroid Build Coastguard Worker static bool  sProcessedClientCallback = false;
272*cfb92d14SAndroid Build Coastguard Worker static Error sLastClientCallbackError = kErrorNone;
273*cfb92d14SAndroid Build Coastguard Worker 
HandleSrpClientCallback(otError aError,const otSrpClientHostInfo * aHostInfo,const otSrpClientService * aServices,const otSrpClientService * aRemovedServices,void * aContext)274*cfb92d14SAndroid Build Coastguard Worker void HandleSrpClientCallback(otError                    aError,
275*cfb92d14SAndroid Build Coastguard Worker                              const otSrpClientHostInfo *aHostInfo,
276*cfb92d14SAndroid Build Coastguard Worker                              const otSrpClientService  *aServices,
277*cfb92d14SAndroid Build Coastguard Worker                              const otSrpClientService  *aRemovedServices,
278*cfb92d14SAndroid Build Coastguard Worker                              void                      *aContext)
279*cfb92d14SAndroid Build Coastguard Worker {
280*cfb92d14SAndroid Build Coastguard Worker     Log("HandleSrpClientCallback() called with error %s", ErrorToString(aError));
281*cfb92d14SAndroid Build Coastguard Worker 
282*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(aContext == sInstance);
283*cfb92d14SAndroid Build Coastguard Worker 
284*cfb92d14SAndroid Build Coastguard Worker     sProcessedClientCallback = true;
285*cfb92d14SAndroid Build Coastguard Worker     sLastClientCallbackError = aError;
286*cfb92d14SAndroid Build Coastguard Worker 
287*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aHostInfo);
288*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aServices);
289*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aRemovedServices);
290*cfb92d14SAndroid Build Coastguard Worker }
291*cfb92d14SAndroid Build Coastguard Worker 
292*cfb92d14SAndroid Build Coastguard Worker static const char kHostName[] = "myhost";
293*cfb92d14SAndroid Build Coastguard Worker 
PrepareService1(Srp::Client::Service & aService)294*cfb92d14SAndroid Build Coastguard Worker void PrepareService1(Srp::Client::Service &aService)
295*cfb92d14SAndroid Build Coastguard Worker {
296*cfb92d14SAndroid Build Coastguard Worker     static const char          kServiceName[]   = "_srv._udp";
297*cfb92d14SAndroid Build Coastguard Worker     static const char          kInstanceLabel[] = "srv.instance";
298*cfb92d14SAndroid Build Coastguard Worker     static const char          kSub1[]          = "_sub1";
299*cfb92d14SAndroid Build Coastguard Worker     static const char          kSub2[]          = "_V1234567";
300*cfb92d14SAndroid Build Coastguard Worker     static const char          kSub3[]          = "_XYZWS";
301*cfb92d14SAndroid Build Coastguard Worker     static const char         *kSubLabels[]     = {kSub1, kSub2, kSub3, nullptr};
302*cfb92d14SAndroid Build Coastguard Worker     static const char          kTxtKey1[]       = "ABCD";
303*cfb92d14SAndroid Build Coastguard Worker     static const uint8_t       kTxtValue1[]     = {'a', '0'};
304*cfb92d14SAndroid Build Coastguard Worker     static const char          kTxtKey2[]       = "Z0";
305*cfb92d14SAndroid Build Coastguard Worker     static const uint8_t       kTxtValue2[]     = {'1', '2', '3'};
306*cfb92d14SAndroid Build Coastguard Worker     static const char          kTxtKey3[]       = "D";
307*cfb92d14SAndroid Build Coastguard Worker     static const uint8_t       kTxtValue3[]     = {0};
308*cfb92d14SAndroid Build Coastguard Worker     static const otDnsTxtEntry kTxtEntries[]    = {
309*cfb92d14SAndroid Build Coastguard Worker            {kTxtKey1, kTxtValue1, sizeof(kTxtValue1)},
310*cfb92d14SAndroid Build Coastguard Worker            {kTxtKey2, kTxtValue2, sizeof(kTxtValue2)},
311*cfb92d14SAndroid Build Coastguard Worker            {kTxtKey3, kTxtValue3, sizeof(kTxtValue3)},
312*cfb92d14SAndroid Build Coastguard Worker     };
313*cfb92d14SAndroid Build Coastguard Worker 
314*cfb92d14SAndroid Build Coastguard Worker     memset(&aService, 0, sizeof(aService));
315*cfb92d14SAndroid Build Coastguard Worker     aService.mName          = kServiceName;
316*cfb92d14SAndroid Build Coastguard Worker     aService.mInstanceName  = kInstanceLabel;
317*cfb92d14SAndroid Build Coastguard Worker     aService.mSubTypeLabels = kSubLabels;
318*cfb92d14SAndroid Build Coastguard Worker     aService.mTxtEntries    = kTxtEntries;
319*cfb92d14SAndroid Build Coastguard Worker     aService.mNumTxtEntries = 3;
320*cfb92d14SAndroid Build Coastguard Worker     aService.mPort          = 777;
321*cfb92d14SAndroid Build Coastguard Worker     aService.mWeight        = 1;
322*cfb92d14SAndroid Build Coastguard Worker     aService.mPriority      = 2;
323*cfb92d14SAndroid Build Coastguard Worker }
324*cfb92d14SAndroid Build Coastguard Worker 
PrepareService2(Srp::Client::Service & aService)325*cfb92d14SAndroid Build Coastguard Worker void PrepareService2(Srp::Client::Service &aService)
326*cfb92d14SAndroid Build Coastguard Worker {
327*cfb92d14SAndroid Build Coastguard Worker     static const char  kService2Name[]   = "_00112233667882554._matter._udp";
328*cfb92d14SAndroid Build Coastguard Worker     static const char  kInstance2Label[] = "ABCDEFGHI";
329*cfb92d14SAndroid Build Coastguard Worker     static const char  kSub4[]           = "_44444444";
330*cfb92d14SAndroid Build Coastguard Worker     static const char *kSubLabels2[]     = {kSub4, nullptr};
331*cfb92d14SAndroid Build Coastguard Worker 
332*cfb92d14SAndroid Build Coastguard Worker     memset(&aService, 0, sizeof(aService));
333*cfb92d14SAndroid Build Coastguard Worker     aService.mName          = kService2Name;
334*cfb92d14SAndroid Build Coastguard Worker     aService.mInstanceName  = kInstance2Label;
335*cfb92d14SAndroid Build Coastguard Worker     aService.mSubTypeLabels = kSubLabels2;
336*cfb92d14SAndroid Build Coastguard Worker     aService.mTxtEntries    = nullptr;
337*cfb92d14SAndroid Build Coastguard Worker     aService.mNumTxtEntries = 0;
338*cfb92d14SAndroid Build Coastguard Worker     aService.mPort          = 555;
339*cfb92d14SAndroid Build Coastguard Worker     aService.mWeight        = 0;
340*cfb92d14SAndroid Build Coastguard Worker     aService.mPriority      = 3;
341*cfb92d14SAndroid Build Coastguard Worker }
342*cfb92d14SAndroid Build Coastguard Worker 
ValidateHost(Srp::Server & aServer,const char * aHostName)343*cfb92d14SAndroid Build Coastguard Worker void ValidateHost(Srp::Server &aServer, const char *aHostName)
344*cfb92d14SAndroid Build Coastguard Worker {
345*cfb92d14SAndroid Build Coastguard Worker     // Validate that only a host with `aHostName` is
346*cfb92d14SAndroid Build Coastguard Worker     // registered on SRP server.
347*cfb92d14SAndroid Build Coastguard Worker 
348*cfb92d14SAndroid Build Coastguard Worker     const Srp::Server::Host *host;
349*cfb92d14SAndroid Build Coastguard Worker     const char              *name;
350*cfb92d14SAndroid Build Coastguard Worker 
351*cfb92d14SAndroid Build Coastguard Worker     Log("ValidateHost()");
352*cfb92d14SAndroid Build Coastguard Worker 
353*cfb92d14SAndroid Build Coastguard Worker     host = aServer.GetNextHost(nullptr);
354*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(host != nullptr);
355*cfb92d14SAndroid Build Coastguard Worker 
356*cfb92d14SAndroid Build Coastguard Worker     name = host->GetFullName();
357*cfb92d14SAndroid Build Coastguard Worker     Log("Hostname: %s", name);
358*cfb92d14SAndroid Build Coastguard Worker 
359*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringStartsWith(name, aHostName, kStringCaseInsensitiveMatch));
360*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(name[strlen(aHostName)] == '.');
361*cfb92d14SAndroid Build Coastguard Worker 
362*cfb92d14SAndroid Build Coastguard Worker     // Only one host on server
363*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(aServer.GetNextHost(host) == nullptr);
364*cfb92d14SAndroid Build Coastguard Worker }
365*cfb92d14SAndroid Build Coastguard Worker 
366*cfb92d14SAndroid Build Coastguard Worker //----------------------------------------------------------------------------------------------------------------------
367*cfb92d14SAndroid Build Coastguard Worker 
TestSrpServerBase(void)368*cfb92d14SAndroid Build Coastguard Worker void TestSrpServerBase(void)
369*cfb92d14SAndroid Build Coastguard Worker {
370*cfb92d14SAndroid Build Coastguard Worker     Srp::Server         *srpServer;
371*cfb92d14SAndroid Build Coastguard Worker     Srp::Client         *srpClient;
372*cfb92d14SAndroid Build Coastguard Worker     Srp::Client::Service service1;
373*cfb92d14SAndroid Build Coastguard Worker     Srp::Client::Service service2;
374*cfb92d14SAndroid Build Coastguard Worker     uint16_t             heapAllocations;
375*cfb92d14SAndroid Build Coastguard Worker 
376*cfb92d14SAndroid Build Coastguard Worker     Log("--------------------------------------------------------------------------------------------");
377*cfb92d14SAndroid Build Coastguard Worker     Log("TestSrpServerBase");
378*cfb92d14SAndroid Build Coastguard Worker 
379*cfb92d14SAndroid Build Coastguard Worker     InitTest();
380*cfb92d14SAndroid Build Coastguard Worker 
381*cfb92d14SAndroid Build Coastguard Worker     srpServer = &sInstance->Get<Srp::Server>();
382*cfb92d14SAndroid Build Coastguard Worker     srpClient = &sInstance->Get<Srp::Client>();
383*cfb92d14SAndroid Build Coastguard Worker 
384*cfb92d14SAndroid Build Coastguard Worker     heapAllocations = sHeapAllocatedPtrs.GetLength();
385*cfb92d14SAndroid Build Coastguard Worker 
386*cfb92d14SAndroid Build Coastguard Worker     PrepareService1(service1);
387*cfb92d14SAndroid Build Coastguard Worker     PrepareService2(service2);
388*cfb92d14SAndroid Build Coastguard Worker 
389*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
390*cfb92d14SAndroid Build Coastguard Worker     // Start SRP server.
391*cfb92d14SAndroid Build Coastguard Worker 
392*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpServer->SetAddressMode(Srp::Server::kAddressModeUnicast));
393*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetAddressMode() == Srp::Server::kAddressModeUnicast);
394*cfb92d14SAndroid Build Coastguard Worker 
395*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetState() == Srp::Server::kStateDisabled);
396*cfb92d14SAndroid Build Coastguard Worker 
397*cfb92d14SAndroid Build Coastguard Worker     srpServer->SetServiceHandler(HandleSrpServerUpdate, sInstance);
398*cfb92d14SAndroid Build Coastguard Worker 
399*cfb92d14SAndroid Build Coastguard Worker     srpServer->SetEnabled(true);
400*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetState() != Srp::Server::kStateDisabled);
401*cfb92d14SAndroid Build Coastguard Worker 
402*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(10000);
403*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetState() == Srp::Server::kStateRunning);
404*cfb92d14SAndroid Build Coastguard Worker 
405*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
406*cfb92d14SAndroid Build Coastguard Worker     // Start SRP client.
407*cfb92d14SAndroid Build Coastguard Worker 
408*cfb92d14SAndroid Build Coastguard Worker     srpClient->SetCallback(HandleSrpClientCallback, sInstance);
409*cfb92d14SAndroid Build Coastguard Worker 
410*cfb92d14SAndroid Build Coastguard Worker     srpClient->EnableAutoStartMode(nullptr, nullptr);
411*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpClient->IsAutoStartModeEnabled());
412*cfb92d14SAndroid Build Coastguard Worker 
413*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(2000);
414*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpClient->IsRunning());
415*cfb92d14SAndroid Build Coastguard Worker 
416*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->SetHostName(kHostName));
417*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->EnableAutoHostAddress());
418*cfb92d14SAndroid Build Coastguard Worker 
419*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
420*cfb92d14SAndroid Build Coastguard Worker     // Register a service, validate that update handler is called.
421*cfb92d14SAndroid Build Coastguard Worker 
422*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->AddService(service1));
423*cfb92d14SAndroid Build Coastguard Worker 
424*cfb92d14SAndroid Build Coastguard Worker     sUpdateHandlerMode       = kAccept;
425*cfb92d14SAndroid Build Coastguard Worker     sProcessedUpdateCallback = false;
426*cfb92d14SAndroid Build Coastguard Worker     sProcessedClientCallback = false;
427*cfb92d14SAndroid Build Coastguard Worker 
428*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(2 * 1000);
429*cfb92d14SAndroid Build Coastguard Worker 
430*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedUpdateCallback);
431*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedClientCallback);
432*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sLastClientCallbackError == kErrorNone);
433*cfb92d14SAndroid Build Coastguard Worker 
434*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service1.GetState() == Srp::Client::kRegistered);
435*cfb92d14SAndroid Build Coastguard Worker     ValidateHost(*srpServer, kHostName);
436*cfb92d14SAndroid Build Coastguard Worker 
437*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
438*cfb92d14SAndroid Build Coastguard Worker     // Register a second service, validate that update handler is called.
439*cfb92d14SAndroid Build Coastguard Worker 
440*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->AddService(service2));
441*cfb92d14SAndroid Build Coastguard Worker 
442*cfb92d14SAndroid Build Coastguard Worker     sProcessedUpdateCallback = false;
443*cfb92d14SAndroid Build Coastguard Worker     sProcessedClientCallback = false;
444*cfb92d14SAndroid Build Coastguard Worker 
445*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(2 * 1000);
446*cfb92d14SAndroid Build Coastguard Worker 
447*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedUpdateCallback);
448*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedClientCallback);
449*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sLastClientCallbackError == kErrorNone);
450*cfb92d14SAndroid Build Coastguard Worker 
451*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service1.GetState() == Srp::Client::kRegistered);
452*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service2.GetState() == Srp::Client::kRegistered);
453*cfb92d14SAndroid Build Coastguard Worker 
454*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
455*cfb92d14SAndroid Build Coastguard Worker     // Unregister first service, validate that update handler is called.
456*cfb92d14SAndroid Build Coastguard Worker 
457*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->RemoveService(service1));
458*cfb92d14SAndroid Build Coastguard Worker 
459*cfb92d14SAndroid Build Coastguard Worker     sProcessedUpdateCallback = false;
460*cfb92d14SAndroid Build Coastguard Worker     sProcessedClientCallback = false;
461*cfb92d14SAndroid Build Coastguard Worker 
462*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(2 * 1000);
463*cfb92d14SAndroid Build Coastguard Worker 
464*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedUpdateCallback);
465*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedClientCallback);
466*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sLastClientCallbackError == kErrorNone);
467*cfb92d14SAndroid Build Coastguard Worker 
468*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service1.GetState() == Srp::Client::kRemoved);
469*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service2.GetState() == Srp::Client::kRegistered);
470*cfb92d14SAndroid Build Coastguard Worker 
471*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
472*cfb92d14SAndroid Build Coastguard Worker     // Disable SRP server, verify that all heap allocations by SRP server
473*cfb92d14SAndroid Build Coastguard Worker     // are freed.
474*cfb92d14SAndroid Build Coastguard Worker 
475*cfb92d14SAndroid Build Coastguard Worker     Log("Disabling SRP server");
476*cfb92d14SAndroid Build Coastguard Worker 
477*cfb92d14SAndroid Build Coastguard Worker     srpServer->SetEnabled(false);
478*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(100);
479*cfb92d14SAndroid Build Coastguard Worker 
480*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(heapAllocations == sHeapAllocatedPtrs.GetLength());
481*cfb92d14SAndroid Build Coastguard Worker 
482*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
483*cfb92d14SAndroid Build Coastguard Worker     // Finalize OT instance and validate all heap allocations are freed.
484*cfb92d14SAndroid Build Coastguard Worker 
485*cfb92d14SAndroid Build Coastguard Worker     Log("Finalizing OT instance");
486*cfb92d14SAndroid Build Coastguard Worker     FinalizeTest();
487*cfb92d14SAndroid Build Coastguard Worker 
488*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sHeapAllocatedPtrs.IsEmpty());
489*cfb92d14SAndroid Build Coastguard Worker 
490*cfb92d14SAndroid Build Coastguard Worker     Log("End of TestSrpServerBase");
491*cfb92d14SAndroid Build Coastguard Worker }
492*cfb92d14SAndroid Build Coastguard Worker 
TestSrpServerReject(void)493*cfb92d14SAndroid Build Coastguard Worker void TestSrpServerReject(void)
494*cfb92d14SAndroid Build Coastguard Worker {
495*cfb92d14SAndroid Build Coastguard Worker     Srp::Server         *srpServer;
496*cfb92d14SAndroid Build Coastguard Worker     Srp::Client         *srpClient;
497*cfb92d14SAndroid Build Coastguard Worker     Srp::Client::Service service1;
498*cfb92d14SAndroid Build Coastguard Worker     Srp::Client::Service service2;
499*cfb92d14SAndroid Build Coastguard Worker     uint16_t             heapAllocations;
500*cfb92d14SAndroid Build Coastguard Worker 
501*cfb92d14SAndroid Build Coastguard Worker     Log("--------------------------------------------------------------------------------------------");
502*cfb92d14SAndroid Build Coastguard Worker     Log("TestSrpServerReject");
503*cfb92d14SAndroid Build Coastguard Worker 
504*cfb92d14SAndroid Build Coastguard Worker     InitTest();
505*cfb92d14SAndroid Build Coastguard Worker 
506*cfb92d14SAndroid Build Coastguard Worker     srpServer = &sInstance->Get<Srp::Server>();
507*cfb92d14SAndroid Build Coastguard Worker     srpClient = &sInstance->Get<Srp::Client>();
508*cfb92d14SAndroid Build Coastguard Worker 
509*cfb92d14SAndroid Build Coastguard Worker     heapAllocations = sHeapAllocatedPtrs.GetLength();
510*cfb92d14SAndroid Build Coastguard Worker 
511*cfb92d14SAndroid Build Coastguard Worker     PrepareService1(service1);
512*cfb92d14SAndroid Build Coastguard Worker     PrepareService2(service2);
513*cfb92d14SAndroid Build Coastguard Worker 
514*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
515*cfb92d14SAndroid Build Coastguard Worker     // Start SRP server.
516*cfb92d14SAndroid Build Coastguard Worker 
517*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpServer->SetAddressMode(Srp::Server::kAddressModeUnicast));
518*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetState() == Srp::Server::kStateDisabled);
519*cfb92d14SAndroid Build Coastguard Worker 
520*cfb92d14SAndroid Build Coastguard Worker     srpServer->SetServiceHandler(HandleSrpServerUpdate, sInstance);
521*cfb92d14SAndroid Build Coastguard Worker 
522*cfb92d14SAndroid Build Coastguard Worker     srpServer->SetEnabled(true);
523*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetState() != Srp::Server::kStateDisabled);
524*cfb92d14SAndroid Build Coastguard Worker 
525*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(10000);
526*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetState() == Srp::Server::kStateRunning);
527*cfb92d14SAndroid Build Coastguard Worker 
528*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
529*cfb92d14SAndroid Build Coastguard Worker     // Start SRP client.
530*cfb92d14SAndroid Build Coastguard Worker 
531*cfb92d14SAndroid Build Coastguard Worker     srpClient->SetCallback(HandleSrpClientCallback, sInstance);
532*cfb92d14SAndroid Build Coastguard Worker 
533*cfb92d14SAndroid Build Coastguard Worker     srpClient->EnableAutoStartMode(nullptr, nullptr);
534*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpClient->IsAutoStartModeEnabled());
535*cfb92d14SAndroid Build Coastguard Worker 
536*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(15 * 1000);
537*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpClient->IsRunning());
538*cfb92d14SAndroid Build Coastguard Worker 
539*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->SetHostName(kHostName));
540*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->EnableAutoHostAddress());
541*cfb92d14SAndroid Build Coastguard Worker 
542*cfb92d14SAndroid Build Coastguard Worker     sUpdateHandlerMode = kReject;
543*cfb92d14SAndroid Build Coastguard Worker 
544*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
545*cfb92d14SAndroid Build Coastguard Worker     // Register a service, validate that update handler is called
546*cfb92d14SAndroid Build Coastguard Worker     // and rejected and no service is registered.
547*cfb92d14SAndroid Build Coastguard Worker 
548*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->AddService(service1));
549*cfb92d14SAndroid Build Coastguard Worker 
550*cfb92d14SAndroid Build Coastguard Worker     sProcessedUpdateCallback = false;
551*cfb92d14SAndroid Build Coastguard Worker     sProcessedClientCallback = false;
552*cfb92d14SAndroid Build Coastguard Worker 
553*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(2 * 1000);
554*cfb92d14SAndroid Build Coastguard Worker 
555*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedUpdateCallback);
556*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedClientCallback);
557*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sLastClientCallbackError != kErrorNone);
558*cfb92d14SAndroid Build Coastguard Worker 
559*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service1.GetState() != Srp::Client::kRegistered);
560*cfb92d14SAndroid Build Coastguard Worker 
561*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetNextHost(nullptr) == nullptr);
562*cfb92d14SAndroid Build Coastguard Worker 
563*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
564*cfb92d14SAndroid Build Coastguard Worker     // Register a second service, validate that update handler is
565*cfb92d14SAndroid Build Coastguard Worker     // again called and update is rejected.
566*cfb92d14SAndroid Build Coastguard Worker 
567*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->AddService(service2));
568*cfb92d14SAndroid Build Coastguard Worker 
569*cfb92d14SAndroid Build Coastguard Worker     sProcessedUpdateCallback = false;
570*cfb92d14SAndroid Build Coastguard Worker     sProcessedClientCallback = false;
571*cfb92d14SAndroid Build Coastguard Worker 
572*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(2 * 1000);
573*cfb92d14SAndroid Build Coastguard Worker 
574*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedUpdateCallback);
575*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedClientCallback);
576*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sLastClientCallbackError != kErrorNone);
577*cfb92d14SAndroid Build Coastguard Worker 
578*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service1.GetState() != Srp::Client::kRegistered);
579*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service2.GetState() != Srp::Client::kRegistered);
580*cfb92d14SAndroid Build Coastguard Worker 
581*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetNextHost(nullptr) == nullptr);
582*cfb92d14SAndroid Build Coastguard Worker 
583*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
584*cfb92d14SAndroid Build Coastguard Worker     // Disable SRP server, verify that all heap allocations by SRP server
585*cfb92d14SAndroid Build Coastguard Worker     // are freed.
586*cfb92d14SAndroid Build Coastguard Worker 
587*cfb92d14SAndroid Build Coastguard Worker     Log("Disabling SRP server");
588*cfb92d14SAndroid Build Coastguard Worker 
589*cfb92d14SAndroid Build Coastguard Worker     srpServer->SetEnabled(false);
590*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(100);
591*cfb92d14SAndroid Build Coastguard Worker 
592*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(heapAllocations == sHeapAllocatedPtrs.GetLength());
593*cfb92d14SAndroid Build Coastguard Worker 
594*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
595*cfb92d14SAndroid Build Coastguard Worker     // Finalize OT instance and validate all heap allocations are freed.
596*cfb92d14SAndroid Build Coastguard Worker 
597*cfb92d14SAndroid Build Coastguard Worker     Log("Finalizing OT instance");
598*cfb92d14SAndroid Build Coastguard Worker     FinalizeTest();
599*cfb92d14SAndroid Build Coastguard Worker 
600*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sHeapAllocatedPtrs.IsEmpty());
601*cfb92d14SAndroid Build Coastguard Worker 
602*cfb92d14SAndroid Build Coastguard Worker     Log("End of TestSrpServerReject");
603*cfb92d14SAndroid Build Coastguard Worker }
604*cfb92d14SAndroid Build Coastguard Worker 
TestSrpServerIgnore(void)605*cfb92d14SAndroid Build Coastguard Worker void TestSrpServerIgnore(void)
606*cfb92d14SAndroid Build Coastguard Worker {
607*cfb92d14SAndroid Build Coastguard Worker     Srp::Server         *srpServer;
608*cfb92d14SAndroid Build Coastguard Worker     Srp::Client         *srpClient;
609*cfb92d14SAndroid Build Coastguard Worker     Srp::Client::Service service1;
610*cfb92d14SAndroid Build Coastguard Worker     Srp::Client::Service service2;
611*cfb92d14SAndroid Build Coastguard Worker     uint16_t             heapAllocations;
612*cfb92d14SAndroid Build Coastguard Worker 
613*cfb92d14SAndroid Build Coastguard Worker     Log("--------------------------------------------------------------------------------------------");
614*cfb92d14SAndroid Build Coastguard Worker     Log("TestSrpServerIgnore");
615*cfb92d14SAndroid Build Coastguard Worker 
616*cfb92d14SAndroid Build Coastguard Worker     InitTest();
617*cfb92d14SAndroid Build Coastguard Worker 
618*cfb92d14SAndroid Build Coastguard Worker     srpServer = &sInstance->Get<Srp::Server>();
619*cfb92d14SAndroid Build Coastguard Worker     srpClient = &sInstance->Get<Srp::Client>();
620*cfb92d14SAndroid Build Coastguard Worker 
621*cfb92d14SAndroid Build Coastguard Worker     heapAllocations = sHeapAllocatedPtrs.GetLength();
622*cfb92d14SAndroid Build Coastguard Worker 
623*cfb92d14SAndroid Build Coastguard Worker     PrepareService1(service1);
624*cfb92d14SAndroid Build Coastguard Worker     PrepareService2(service2);
625*cfb92d14SAndroid Build Coastguard Worker 
626*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
627*cfb92d14SAndroid Build Coastguard Worker     // Start SRP server.
628*cfb92d14SAndroid Build Coastguard Worker 
629*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpServer->SetAddressMode(Srp::Server::kAddressModeUnicast));
630*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetState() == Srp::Server::kStateDisabled);
631*cfb92d14SAndroid Build Coastguard Worker 
632*cfb92d14SAndroid Build Coastguard Worker     srpServer->SetServiceHandler(HandleSrpServerUpdate, sInstance);
633*cfb92d14SAndroid Build Coastguard Worker 
634*cfb92d14SAndroid Build Coastguard Worker     srpServer->SetEnabled(true);
635*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetState() != Srp::Server::kStateDisabled);
636*cfb92d14SAndroid Build Coastguard Worker 
637*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(10000);
638*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetState() == Srp::Server::kStateRunning);
639*cfb92d14SAndroid Build Coastguard Worker 
640*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
641*cfb92d14SAndroid Build Coastguard Worker     // Start SRP client.
642*cfb92d14SAndroid Build Coastguard Worker 
643*cfb92d14SAndroid Build Coastguard Worker     srpClient->SetCallback(HandleSrpClientCallback, sInstance);
644*cfb92d14SAndroid Build Coastguard Worker 
645*cfb92d14SAndroid Build Coastguard Worker     srpClient->EnableAutoStartMode(nullptr, nullptr);
646*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpClient->IsAutoStartModeEnabled());
647*cfb92d14SAndroid Build Coastguard Worker 
648*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(15 * 1000);
649*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpClient->IsRunning());
650*cfb92d14SAndroid Build Coastguard Worker 
651*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->SetHostName(kHostName));
652*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->EnableAutoHostAddress());
653*cfb92d14SAndroid Build Coastguard Worker 
654*cfb92d14SAndroid Build Coastguard Worker     sUpdateHandlerMode = kIgnore;
655*cfb92d14SAndroid Build Coastguard Worker 
656*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
657*cfb92d14SAndroid Build Coastguard Worker     // Register a service, validate that update handler is called
658*cfb92d14SAndroid Build Coastguard Worker     // and ignored the update and no service is registered.
659*cfb92d14SAndroid Build Coastguard Worker 
660*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->AddService(service1));
661*cfb92d14SAndroid Build Coastguard Worker 
662*cfb92d14SAndroid Build Coastguard Worker     sProcessedUpdateCallback = false;
663*cfb92d14SAndroid Build Coastguard Worker     sProcessedClientCallback = false;
664*cfb92d14SAndroid Build Coastguard Worker 
665*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(2 * 1000);
666*cfb92d14SAndroid Build Coastguard Worker 
667*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedUpdateCallback);
668*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedClientCallback);
669*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sLastClientCallbackError != kErrorNone);
670*cfb92d14SAndroid Build Coastguard Worker 
671*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service1.GetState() != Srp::Client::kRegistered);
672*cfb92d14SAndroid Build Coastguard Worker 
673*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetNextHost(nullptr) == nullptr);
674*cfb92d14SAndroid Build Coastguard Worker 
675*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
676*cfb92d14SAndroid Build Coastguard Worker     // Register a second service, validate that update handler is
677*cfb92d14SAndroid Build Coastguard Worker     // again called and update is still ignored.
678*cfb92d14SAndroid Build Coastguard Worker 
679*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->AddService(service2));
680*cfb92d14SAndroid Build Coastguard Worker 
681*cfb92d14SAndroid Build Coastguard Worker     sProcessedUpdateCallback = false;
682*cfb92d14SAndroid Build Coastguard Worker     sProcessedClientCallback = false;
683*cfb92d14SAndroid Build Coastguard Worker 
684*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(2 * 1000);
685*cfb92d14SAndroid Build Coastguard Worker 
686*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedUpdateCallback);
687*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedClientCallback);
688*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sLastClientCallbackError != kErrorNone);
689*cfb92d14SAndroid Build Coastguard Worker 
690*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service1.GetState() != Srp::Client::kRegistered);
691*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service2.GetState() != Srp::Client::kRegistered);
692*cfb92d14SAndroid Build Coastguard Worker 
693*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetNextHost(nullptr) == nullptr);
694*cfb92d14SAndroid Build Coastguard Worker 
695*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
696*cfb92d14SAndroid Build Coastguard Worker     // Disable SRP server, verify that all heap allocations by SRP server
697*cfb92d14SAndroid Build Coastguard Worker     // are freed.
698*cfb92d14SAndroid Build Coastguard Worker 
699*cfb92d14SAndroid Build Coastguard Worker     Log("Disabling SRP server");
700*cfb92d14SAndroid Build Coastguard Worker 
701*cfb92d14SAndroid Build Coastguard Worker     srpServer->SetEnabled(false);
702*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(100);
703*cfb92d14SAndroid Build Coastguard Worker 
704*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(heapAllocations == sHeapAllocatedPtrs.GetLength());
705*cfb92d14SAndroid Build Coastguard Worker 
706*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
707*cfb92d14SAndroid Build Coastguard Worker     // Finalize OT instance and validate all heap allocations are freed.
708*cfb92d14SAndroid Build Coastguard Worker 
709*cfb92d14SAndroid Build Coastguard Worker     Log("Finalizing OT instance");
710*cfb92d14SAndroid Build Coastguard Worker     FinalizeTest();
711*cfb92d14SAndroid Build Coastguard Worker 
712*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sHeapAllocatedPtrs.IsEmpty());
713*cfb92d14SAndroid Build Coastguard Worker 
714*cfb92d14SAndroid Build Coastguard Worker     Log("End of TestSrpServerIgnore");
715*cfb92d14SAndroid Build Coastguard Worker }
716*cfb92d14SAndroid Build Coastguard Worker 
TestSrpServerClientRemove(bool aShouldRemoveKeyLease)717*cfb92d14SAndroid Build Coastguard Worker void TestSrpServerClientRemove(bool aShouldRemoveKeyLease)
718*cfb92d14SAndroid Build Coastguard Worker {
719*cfb92d14SAndroid Build Coastguard Worker     Srp::Server         *srpServer;
720*cfb92d14SAndroid Build Coastguard Worker     Srp::Client         *srpClient;
721*cfb92d14SAndroid Build Coastguard Worker     Srp::Client::Service service1;
722*cfb92d14SAndroid Build Coastguard Worker     Srp::Client::Service service2;
723*cfb92d14SAndroid Build Coastguard Worker     uint16_t             heapAllocations;
724*cfb92d14SAndroid Build Coastguard Worker 
725*cfb92d14SAndroid Build Coastguard Worker     Log("--------------------------------------------------------------------------------------------");
726*cfb92d14SAndroid Build Coastguard Worker     Log("TestSrpServerClientRemove(aShouldRemoveKeyLease:%u)", aShouldRemoveKeyLease);
727*cfb92d14SAndroid Build Coastguard Worker 
728*cfb92d14SAndroid Build Coastguard Worker     InitTest();
729*cfb92d14SAndroid Build Coastguard Worker 
730*cfb92d14SAndroid Build Coastguard Worker     srpServer = &sInstance->Get<Srp::Server>();
731*cfb92d14SAndroid Build Coastguard Worker     srpClient = &sInstance->Get<Srp::Client>();
732*cfb92d14SAndroid Build Coastguard Worker 
733*cfb92d14SAndroid Build Coastguard Worker     heapAllocations = sHeapAllocatedPtrs.GetLength();
734*cfb92d14SAndroid Build Coastguard Worker 
735*cfb92d14SAndroid Build Coastguard Worker     PrepareService1(service1);
736*cfb92d14SAndroid Build Coastguard Worker     PrepareService2(service2);
737*cfb92d14SAndroid Build Coastguard Worker 
738*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
739*cfb92d14SAndroid Build Coastguard Worker     // Start SRP server.
740*cfb92d14SAndroid Build Coastguard Worker 
741*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpServer->SetAddressMode(Srp::Server::kAddressModeUnicast));
742*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetAddressMode() == Srp::Server::kAddressModeUnicast);
743*cfb92d14SAndroid Build Coastguard Worker 
744*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetState() == Srp::Server::kStateDisabled);
745*cfb92d14SAndroid Build Coastguard Worker 
746*cfb92d14SAndroid Build Coastguard Worker     srpServer->SetServiceHandler(HandleSrpServerUpdate, sInstance);
747*cfb92d14SAndroid Build Coastguard Worker 
748*cfb92d14SAndroid Build Coastguard Worker     srpServer->SetEnabled(true);
749*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetState() != Srp::Server::kStateDisabled);
750*cfb92d14SAndroid Build Coastguard Worker 
751*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(10000);
752*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetState() == Srp::Server::kStateRunning);
753*cfb92d14SAndroid Build Coastguard Worker 
754*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
755*cfb92d14SAndroid Build Coastguard Worker     // Start SRP client.
756*cfb92d14SAndroid Build Coastguard Worker 
757*cfb92d14SAndroid Build Coastguard Worker     srpClient->SetCallback(HandleSrpClientCallback, sInstance);
758*cfb92d14SAndroid Build Coastguard Worker 
759*cfb92d14SAndroid Build Coastguard Worker     srpClient->EnableAutoStartMode(nullptr, nullptr);
760*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpClient->IsAutoStartModeEnabled());
761*cfb92d14SAndroid Build Coastguard Worker 
762*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(15 * 1000);
763*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpClient->IsRunning());
764*cfb92d14SAndroid Build Coastguard Worker 
765*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->SetHostName(kHostName));
766*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->EnableAutoHostAddress());
767*cfb92d14SAndroid Build Coastguard Worker 
768*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
769*cfb92d14SAndroid Build Coastguard Worker     // Register two services, validate that update handler is called.
770*cfb92d14SAndroid Build Coastguard Worker 
771*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->AddService(service1));
772*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->AddService(service2));
773*cfb92d14SAndroid Build Coastguard Worker 
774*cfb92d14SAndroid Build Coastguard Worker     sUpdateHandlerMode       = kAccept;
775*cfb92d14SAndroid Build Coastguard Worker     sProcessedUpdateCallback = false;
776*cfb92d14SAndroid Build Coastguard Worker     sProcessedClientCallback = false;
777*cfb92d14SAndroid Build Coastguard Worker 
778*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(2 * 1000);
779*cfb92d14SAndroid Build Coastguard Worker 
780*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedUpdateCallback);
781*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedClientCallback);
782*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sLastClientCallbackError == kErrorNone);
783*cfb92d14SAndroid Build Coastguard Worker 
784*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service1.GetState() == Srp::Client::kRegistered);
785*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service2.GetState() == Srp::Client::kRegistered);
786*cfb92d14SAndroid Build Coastguard Worker     ValidateHost(*srpServer, kHostName);
787*cfb92d14SAndroid Build Coastguard Worker 
788*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
789*cfb92d14SAndroid Build Coastguard Worker     // Remove two services and clear key-lease, validate that update handler is called.
790*cfb92d14SAndroid Build Coastguard Worker 
791*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->RemoveHostAndServices(aShouldRemoveKeyLease));
792*cfb92d14SAndroid Build Coastguard Worker 
793*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(2 * 1000);
794*cfb92d14SAndroid Build Coastguard Worker 
795*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedUpdateCallback);
796*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedClientCallback);
797*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sLastClientCallbackError == kErrorNone);
798*cfb92d14SAndroid Build Coastguard Worker 
799*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service1.GetState() == Srp::Client::kRemoved);
800*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service2.GetState() == Srp::Client::kRemoved);
801*cfb92d14SAndroid Build Coastguard Worker 
802*cfb92d14SAndroid Build Coastguard Worker     if (aShouldRemoveKeyLease)
803*cfb92d14SAndroid Build Coastguard Worker     {
804*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(srpServer->GetNextHost(nullptr) == nullptr);
805*cfb92d14SAndroid Build Coastguard Worker     }
806*cfb92d14SAndroid Build Coastguard Worker     else
807*cfb92d14SAndroid Build Coastguard Worker     {
808*cfb92d14SAndroid Build Coastguard Worker         ValidateHost(*srpServer, kHostName);
809*cfb92d14SAndroid Build Coastguard Worker     }
810*cfb92d14SAndroid Build Coastguard Worker 
811*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
812*cfb92d14SAndroid Build Coastguard Worker     // Disable SRP server, verify that all heap allocations by SRP server
813*cfb92d14SAndroid Build Coastguard Worker     // are freed.
814*cfb92d14SAndroid Build Coastguard Worker 
815*cfb92d14SAndroid Build Coastguard Worker     Log("Disabling SRP server");
816*cfb92d14SAndroid Build Coastguard Worker 
817*cfb92d14SAndroid Build Coastguard Worker     srpServer->SetEnabled(false);
818*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(100);
819*cfb92d14SAndroid Build Coastguard Worker 
820*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(heapAllocations == sHeapAllocatedPtrs.GetLength());
821*cfb92d14SAndroid Build Coastguard Worker 
822*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
823*cfb92d14SAndroid Build Coastguard Worker     // Finalize OT instance and validate all heap allocations are freed.
824*cfb92d14SAndroid Build Coastguard Worker 
825*cfb92d14SAndroid Build Coastguard Worker     Log("Finalizing OT instance");
826*cfb92d14SAndroid Build Coastguard Worker     FinalizeTest();
827*cfb92d14SAndroid Build Coastguard Worker 
828*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sHeapAllocatedPtrs.IsEmpty());
829*cfb92d14SAndroid Build Coastguard Worker 
830*cfb92d14SAndroid Build Coastguard Worker     Log("End of TestSrpServerClientRemove");
831*cfb92d14SAndroid Build Coastguard Worker }
832*cfb92d14SAndroid Build Coastguard Worker 
833*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
TestUpdateLeaseShortVariant(void)834*cfb92d14SAndroid Build Coastguard Worker void TestUpdateLeaseShortVariant(void)
835*cfb92d14SAndroid Build Coastguard Worker {
836*cfb92d14SAndroid Build Coastguard Worker     // Test behavior of SRP client and server when short variant of
837*cfb92d14SAndroid Build Coastguard Worker     // Update Lease Option is used (which only include lease interval).
838*cfb92d14SAndroid Build Coastguard Worker     // This test uses `SetUseShortLeaseOption()` method of `Srp::Client`
839*cfb92d14SAndroid Build Coastguard Worker     // which changes the default behavior and is available under the
840*cfb92d14SAndroid Build Coastguard Worker     // `REFERENCE_DEVICE` config.
841*cfb92d14SAndroid Build Coastguard Worker 
842*cfb92d14SAndroid Build Coastguard Worker     Srp::Server                *srpServer;
843*cfb92d14SAndroid Build Coastguard Worker     Srp::Server::LeaseConfig    leaseConfig;
844*cfb92d14SAndroid Build Coastguard Worker     const Srp::Server::Service *service;
845*cfb92d14SAndroid Build Coastguard Worker     Srp::Client                *srpClient;
846*cfb92d14SAndroid Build Coastguard Worker     Srp::Client::Service        service1;
847*cfb92d14SAndroid Build Coastguard Worker     uint16_t                    heapAllocations;
848*cfb92d14SAndroid Build Coastguard Worker 
849*cfb92d14SAndroid Build Coastguard Worker     Log("--------------------------------------------------------------------------------------------");
850*cfb92d14SAndroid Build Coastguard Worker     Log("TestUpdateLeaseShortVariant");
851*cfb92d14SAndroid Build Coastguard Worker 
852*cfb92d14SAndroid Build Coastguard Worker     InitTest();
853*cfb92d14SAndroid Build Coastguard Worker 
854*cfb92d14SAndroid Build Coastguard Worker     srpServer = &sInstance->Get<Srp::Server>();
855*cfb92d14SAndroid Build Coastguard Worker     srpClient = &sInstance->Get<Srp::Client>();
856*cfb92d14SAndroid Build Coastguard Worker 
857*cfb92d14SAndroid Build Coastguard Worker     heapAllocations = sHeapAllocatedPtrs.GetLength();
858*cfb92d14SAndroid Build Coastguard Worker 
859*cfb92d14SAndroid Build Coastguard Worker     PrepareService1(service1);
860*cfb92d14SAndroid Build Coastguard Worker 
861*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
862*cfb92d14SAndroid Build Coastguard Worker     // Start SRP server.
863*cfb92d14SAndroid Build Coastguard Worker 
864*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpServer->SetAddressMode(Srp::Server::kAddressModeUnicast));
865*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetState() == Srp::Server::kStateDisabled);
866*cfb92d14SAndroid Build Coastguard Worker 
867*cfb92d14SAndroid Build Coastguard Worker     srpServer->SetServiceHandler(HandleSrpServerUpdate, sInstance);
868*cfb92d14SAndroid Build Coastguard Worker 
869*cfb92d14SAndroid Build Coastguard Worker     srpServer->SetEnabled(true);
870*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetState() != Srp::Server::kStateDisabled);
871*cfb92d14SAndroid Build Coastguard Worker 
872*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(10000);
873*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpServer->GetState() == Srp::Server::kStateRunning);
874*cfb92d14SAndroid Build Coastguard Worker 
875*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
876*cfb92d14SAndroid Build Coastguard Worker     // Check the default Lease Config on SRP server.
877*cfb92d14SAndroid Build Coastguard Worker     // Server to accept lease in [30 sec, 27 hours] and
878*cfb92d14SAndroid Build Coastguard Worker     // key-lease in [30 sec, 189 hours].
879*cfb92d14SAndroid Build Coastguard Worker 
880*cfb92d14SAndroid Build Coastguard Worker     srpServer->GetLeaseConfig(leaseConfig);
881*cfb92d14SAndroid Build Coastguard Worker 
882*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(leaseConfig.mMinLease == 30);             // 30 seconds
883*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(leaseConfig.mMaxLease == 27u * 3600);     // 27 hours
884*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(leaseConfig.mMinKeyLease == 30);          // 30 seconds
885*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(leaseConfig.mMaxKeyLease == 189u * 3600); // 189 hours
886*cfb92d14SAndroid Build Coastguard Worker 
887*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
888*cfb92d14SAndroid Build Coastguard Worker     // Start SRP client.
889*cfb92d14SAndroid Build Coastguard Worker 
890*cfb92d14SAndroid Build Coastguard Worker     srpClient->SetCallback(HandleSrpClientCallback, sInstance);
891*cfb92d14SAndroid Build Coastguard Worker 
892*cfb92d14SAndroid Build Coastguard Worker     srpClient->EnableAutoStartMode(nullptr, nullptr);
893*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpClient->IsAutoStartModeEnabled());
894*cfb92d14SAndroid Build Coastguard Worker 
895*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(15 * 1000);
896*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(srpClient->IsRunning());
897*cfb92d14SAndroid Build Coastguard Worker 
898*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->SetHostName(kHostName));
899*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->EnableAutoHostAddress());
900*cfb92d14SAndroid Build Coastguard Worker 
901*cfb92d14SAndroid Build Coastguard Worker     sUpdateHandlerMode = kAccept;
902*cfb92d14SAndroid Build Coastguard Worker 
903*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
904*cfb92d14SAndroid Build Coastguard Worker     // Change default lease intervals on SRP client and enable
905*cfb92d14SAndroid Build Coastguard Worker     // "use short Update Lease Option" mode.
906*cfb92d14SAndroid Build Coastguard Worker 
907*cfb92d14SAndroid Build Coastguard Worker     srpClient->SetLeaseInterval(15u * 3600);
908*cfb92d14SAndroid Build Coastguard Worker     srpClient->SetKeyLeaseInterval(40u * 3600);
909*cfb92d14SAndroid Build Coastguard Worker 
910*cfb92d14SAndroid Build Coastguard Worker     srpClient->SetUseShortLeaseOption(true);
911*cfb92d14SAndroid Build Coastguard Worker 
912*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
913*cfb92d14SAndroid Build Coastguard Worker     // Register a service, validate that update handler is called
914*cfb92d14SAndroid Build Coastguard Worker     // and service is successfully registered.
915*cfb92d14SAndroid Build Coastguard Worker 
916*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->AddService(service1));
917*cfb92d14SAndroid Build Coastguard Worker 
918*cfb92d14SAndroid Build Coastguard Worker     sProcessedUpdateCallback = false;
919*cfb92d14SAndroid Build Coastguard Worker     sProcessedClientCallback = false;
920*cfb92d14SAndroid Build Coastguard Worker 
921*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(2 * 1000);
922*cfb92d14SAndroid Build Coastguard Worker 
923*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedUpdateCallback);
924*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedClientCallback);
925*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sLastClientCallbackError == kErrorNone);
926*cfb92d14SAndroid Build Coastguard Worker 
927*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service1.GetState() == Srp::Client::kRegistered);
928*cfb92d14SAndroid Build Coastguard Worker 
929*cfb92d14SAndroid Build Coastguard Worker     ValidateHost(*srpServer, kHostName);
930*cfb92d14SAndroid Build Coastguard Worker 
931*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
932*cfb92d14SAndroid Build Coastguard Worker     // Validate the lease info for service on SRP server. The client
933*cfb92d14SAndroid Build Coastguard Worker     // is set up to use "short Update Lease Option format, so it only
934*cfb92d14SAndroid Build Coastguard Worker     // include the lease interval as 15 hours in its request
935*cfb92d14SAndroid Build Coastguard Worker     // message. Server should then see 15 hours for both lease and
936*cfb92d14SAndroid Build Coastguard Worker     // key lease
937*cfb92d14SAndroid Build Coastguard Worker 
938*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sUpdateHostLeaseInfo.mLease == 15u * 3600 * 1000);
939*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sUpdateHostLeaseInfo.mKeyLease == 15u * 3600 * 1000);
940*cfb92d14SAndroid Build Coastguard Worker 
941*cfb92d14SAndroid Build Coastguard Worker     // Check that SRP server granted 15 hours for both lease and
942*cfb92d14SAndroid Build Coastguard Worker     // key lease.
943*cfb92d14SAndroid Build Coastguard Worker 
944*cfb92d14SAndroid Build Coastguard Worker     service = srpServer->GetNextHost(nullptr)->GetServices().GetHead();
945*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service != nullptr);
946*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service->GetLease() == 15u * 3600);
947*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service->GetKeyLease() == 15u * 3600);
948*cfb92d14SAndroid Build Coastguard Worker 
949*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
950*cfb92d14SAndroid Build Coastguard Worker     // Remove the service.
951*cfb92d14SAndroid Build Coastguard Worker 
952*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->RemoveService(service1));
953*cfb92d14SAndroid Build Coastguard Worker 
954*cfb92d14SAndroid Build Coastguard Worker     sProcessedUpdateCallback = false;
955*cfb92d14SAndroid Build Coastguard Worker     sProcessedClientCallback = false;
956*cfb92d14SAndroid Build Coastguard Worker 
957*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(2 * 1000);
958*cfb92d14SAndroid Build Coastguard Worker 
959*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedUpdateCallback);
960*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedClientCallback);
961*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sLastClientCallbackError == kErrorNone);
962*cfb92d14SAndroid Build Coastguard Worker 
963*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service1.GetState() == Srp::Client::kRemoved);
964*cfb92d14SAndroid Build Coastguard Worker 
965*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
966*cfb92d14SAndroid Build Coastguard Worker     // Register the service again, but this time change it to request
967*cfb92d14SAndroid Build Coastguard Worker     // a lease time that is larger than the `LeaseConfig.mMinLease` of
968*cfb92d14SAndroid Build Coastguard Worker     // 27 hours. This ensures that server needs to include the Lease
969*cfb92d14SAndroid Build Coastguard Worker     // Option in its response (since it need to grant a different
970*cfb92d14SAndroid Build Coastguard Worker     // lease interval).
971*cfb92d14SAndroid Build Coastguard Worker 
972*cfb92d14SAndroid Build Coastguard Worker     service1.mLease    = 100u * 3600; // 100 hours >= 27 hours.
973*cfb92d14SAndroid Build Coastguard Worker     service1.mKeyLease = 110u * 3600;
974*cfb92d14SAndroid Build Coastguard Worker 
975*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(srpClient->AddService(service1));
976*cfb92d14SAndroid Build Coastguard Worker 
977*cfb92d14SAndroid Build Coastguard Worker     sProcessedUpdateCallback = false;
978*cfb92d14SAndroid Build Coastguard Worker     sProcessedClientCallback = false;
979*cfb92d14SAndroid Build Coastguard Worker 
980*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(2 * 1000);
981*cfb92d14SAndroid Build Coastguard Worker 
982*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedUpdateCallback);
983*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sProcessedClientCallback);
984*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sLastClientCallbackError == kErrorNone);
985*cfb92d14SAndroid Build Coastguard Worker 
986*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service1.GetState() == Srp::Client::kRegistered);
987*cfb92d14SAndroid Build Coastguard Worker 
988*cfb92d14SAndroid Build Coastguard Worker     ValidateHost(*srpServer, kHostName);
989*cfb92d14SAndroid Build Coastguard Worker 
990*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
991*cfb92d14SAndroid Build Coastguard Worker     // Validate the lease info for service on SRP server.
992*cfb92d14SAndroid Build Coastguard Worker 
993*cfb92d14SAndroid Build Coastguard Worker     // We should see the 100 hours in request from client
994*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sUpdateHostLeaseInfo.mLease == 100u * 3600 * 1000);
995*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sUpdateHostLeaseInfo.mKeyLease == 100u * 3600 * 1000);
996*cfb92d14SAndroid Build Coastguard Worker 
997*cfb92d14SAndroid Build Coastguard Worker     // Check that SRP server granted  27 hours for both lease and
998*cfb92d14SAndroid Build Coastguard Worker     // key lease.
999*cfb92d14SAndroid Build Coastguard Worker 
1000*cfb92d14SAndroid Build Coastguard Worker     service = srpServer->GetNextHost(nullptr)->GetServices().GetHead();
1001*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service != nullptr);
1002*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service->GetLease() == 27u * 3600);
1003*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(service->GetKeyLease() == 27u * 3600);
1004*cfb92d14SAndroid Build Coastguard Worker 
1005*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1006*cfb92d14SAndroid Build Coastguard Worker     // Disable SRP server, verify that all heap allocations by SRP server
1007*cfb92d14SAndroid Build Coastguard Worker     // are freed.
1008*cfb92d14SAndroid Build Coastguard Worker 
1009*cfb92d14SAndroid Build Coastguard Worker     Log("Disabling SRP server");
1010*cfb92d14SAndroid Build Coastguard Worker 
1011*cfb92d14SAndroid Build Coastguard Worker     srpServer->SetEnabled(false);
1012*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(100);
1013*cfb92d14SAndroid Build Coastguard Worker 
1014*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(heapAllocations == sHeapAllocatedPtrs.GetLength());
1015*cfb92d14SAndroid Build Coastguard Worker 
1016*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1017*cfb92d14SAndroid Build Coastguard Worker     // Finalize OT instance and validate all heap allocations are freed.
1018*cfb92d14SAndroid Build Coastguard Worker 
1019*cfb92d14SAndroid Build Coastguard Worker     Log("Finalizing OT instance");
1020*cfb92d14SAndroid Build Coastguard Worker     FinalizeTest();
1021*cfb92d14SAndroid Build Coastguard Worker 
1022*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sHeapAllocatedPtrs.IsEmpty());
1023*cfb92d14SAndroid Build Coastguard Worker 
1024*cfb92d14SAndroid Build Coastguard Worker     Log("End of TestUpdateLeaseShortVariant");
1025*cfb92d14SAndroid Build Coastguard Worker }
1026*cfb92d14SAndroid Build Coastguard Worker 
1027*cfb92d14SAndroid Build Coastguard Worker static uint16_t         sServerRxCount;
1028*cfb92d14SAndroid Build Coastguard Worker static Ip6::MessageInfo sServerMsgInfo;
1029*cfb92d14SAndroid Build Coastguard Worker static uint16_t         sServerLastMsgId;
1030*cfb92d14SAndroid Build Coastguard Worker 
HandleServerUdpReceive(void * aContext,otMessage * aMessage,const otMessageInfo * aMessageInfo)1031*cfb92d14SAndroid Build Coastguard Worker void HandleServerUdpReceive(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo)
1032*cfb92d14SAndroid Build Coastguard Worker {
1033*cfb92d14SAndroid Build Coastguard Worker     Dns::Header header;
1034*cfb92d14SAndroid Build Coastguard Worker 
1035*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(aContext == nullptr);
1036*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(aMessage != nullptr);
1037*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(aMessageInfo != nullptr);
1038*cfb92d14SAndroid Build Coastguard Worker 
1039*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(AsCoreType(aMessage).Read(0, header));
1040*cfb92d14SAndroid Build Coastguard Worker 
1041*cfb92d14SAndroid Build Coastguard Worker     sServerMsgInfo   = AsCoreType(aMessageInfo);
1042*cfb92d14SAndroid Build Coastguard Worker     sServerLastMsgId = header.GetMessageId();
1043*cfb92d14SAndroid Build Coastguard Worker     sServerRxCount++;
1044*cfb92d14SAndroid Build Coastguard Worker 
1045*cfb92d14SAndroid Build Coastguard Worker     Log("HandleServerUdpReceive(), message-id: 0x%x", header.GetMessageId());
1046*cfb92d14SAndroid Build Coastguard Worker }
1047*cfb92d14SAndroid Build Coastguard Worker 
TestSrpClientDelayedResponse(void)1048*cfb92d14SAndroid Build Coastguard Worker void TestSrpClientDelayedResponse(void)
1049*cfb92d14SAndroid Build Coastguard Worker {
1050*cfb92d14SAndroid Build Coastguard Worker     static constexpr uint16_t kServerPort = 53535;
1051*cfb92d14SAndroid Build Coastguard Worker 
1052*cfb92d14SAndroid Build Coastguard Worker     Srp::Client         *srpClient;
1053*cfb92d14SAndroid Build Coastguard Worker     Srp::Client::Service service1;
1054*cfb92d14SAndroid Build Coastguard Worker     Srp::Client::Service service2;
1055*cfb92d14SAndroid Build Coastguard Worker 
1056*cfb92d14SAndroid Build Coastguard Worker     Log("--------------------------------------------------------------------------------------------");
1057*cfb92d14SAndroid Build Coastguard Worker     Log("TestSrpClientDelayedResponse");
1058*cfb92d14SAndroid Build Coastguard Worker 
1059*cfb92d14SAndroid Build Coastguard Worker     InitTest();
1060*cfb92d14SAndroid Build Coastguard Worker 
1061*cfb92d14SAndroid Build Coastguard Worker     srpClient = &sInstance->Get<Srp::Client>();
1062*cfb92d14SAndroid Build Coastguard Worker 
1063*cfb92d14SAndroid Build Coastguard Worker     for (uint8_t testIter = 0; testIter < 3; testIter++)
1064*cfb92d14SAndroid Build Coastguard Worker     {
1065*cfb92d14SAndroid Build Coastguard Worker         Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
1066*cfb92d14SAndroid Build Coastguard Worker         Log("testIter = %u", testIter);
1067*cfb92d14SAndroid Build Coastguard Worker 
1068*cfb92d14SAndroid Build Coastguard Worker         //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1069*cfb92d14SAndroid Build Coastguard Worker         // Prepare a socket to act as SRP server.
1070*cfb92d14SAndroid Build Coastguard Worker 
1071*cfb92d14SAndroid Build Coastguard Worker         Ip6::Udp::Socket  udpSocket(*sInstance, HandleServerUdpReceive, nullptr);
1072*cfb92d14SAndroid Build Coastguard Worker         Ip6::SockAddr     serverSockAddr;
1073*cfb92d14SAndroid Build Coastguard Worker         uint16_t          firstMsgId;
1074*cfb92d14SAndroid Build Coastguard Worker         Message          *response;
1075*cfb92d14SAndroid Build Coastguard Worker         Dns::UpdateHeader header;
1076*cfb92d14SAndroid Build Coastguard Worker 
1077*cfb92d14SAndroid Build Coastguard Worker         sServerRxCount = 0;
1078*cfb92d14SAndroid Build Coastguard Worker 
1079*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(udpSocket.Open());
1080*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(udpSocket.Bind(kServerPort, Ip6::kNetifThread));
1081*cfb92d14SAndroid Build Coastguard Worker 
1082*cfb92d14SAndroid Build Coastguard Worker         //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1083*cfb92d14SAndroid Build Coastguard Worker         // Manually start the client with a message ID based on `testIter`
1084*cfb92d14SAndroid Build Coastguard Worker         // We use zero in the first iteration, `0xffff` in the second
1085*cfb92d14SAndroid Build Coastguard Worker         // iteration to test wrapping of 16-bit message ID.
1086*cfb92d14SAndroid Build Coastguard Worker 
1087*cfb92d14SAndroid Build Coastguard Worker         switch (testIter)
1088*cfb92d14SAndroid Build Coastguard Worker         {
1089*cfb92d14SAndroid Build Coastguard Worker         case 0:
1090*cfb92d14SAndroid Build Coastguard Worker             srpClient->SetNextMessageId(0);
1091*cfb92d14SAndroid Build Coastguard Worker             break;
1092*cfb92d14SAndroid Build Coastguard Worker         case 1:
1093*cfb92d14SAndroid Build Coastguard Worker             srpClient->SetNextMessageId(0xffff);
1094*cfb92d14SAndroid Build Coastguard Worker             break;
1095*cfb92d14SAndroid Build Coastguard Worker         case 2:
1096*cfb92d14SAndroid Build Coastguard Worker             srpClient->SetNextMessageId(0xaaaa);
1097*cfb92d14SAndroid Build Coastguard Worker             break;
1098*cfb92d14SAndroid Build Coastguard Worker         }
1099*cfb92d14SAndroid Build Coastguard Worker 
1100*cfb92d14SAndroid Build Coastguard Worker         serverSockAddr.SetAddress(sInstance->Get<Mle::Mle>().GetMeshLocalRloc());
1101*cfb92d14SAndroid Build Coastguard Worker         serverSockAddr.SetPort(kServerPort);
1102*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(srpClient->Start(serverSockAddr));
1103*cfb92d14SAndroid Build Coastguard Worker 
1104*cfb92d14SAndroid Build Coastguard Worker         //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1105*cfb92d14SAndroid Build Coastguard Worker         // Register a service
1106*cfb92d14SAndroid Build Coastguard Worker 
1107*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(srpClient->SetHostName(kHostName));
1108*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(srpClient->EnableAutoHostAddress());
1109*cfb92d14SAndroid Build Coastguard Worker 
1110*cfb92d14SAndroid Build Coastguard Worker         PrepareService1(service1);
1111*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(srpClient->AddService(service1));
1112*cfb92d14SAndroid Build Coastguard Worker 
1113*cfb92d14SAndroid Build Coastguard Worker         //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1114*cfb92d14SAndroid Build Coastguard Worker         // Wait for short time and make sure server receives an SRP
1115*cfb92d14SAndroid Build Coastguard Worker         // update message from client.
1116*cfb92d14SAndroid Build Coastguard Worker 
1117*cfb92d14SAndroid Build Coastguard Worker         AdvanceTime(1 * 1000);
1118*cfb92d14SAndroid Build Coastguard Worker 
1119*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(sServerRxCount == 1);
1120*cfb92d14SAndroid Build Coastguard Worker         firstMsgId = sServerLastMsgId;
1121*cfb92d14SAndroid Build Coastguard Worker 
1122*cfb92d14SAndroid Build Coastguard Worker         switch (testIter)
1123*cfb92d14SAndroid Build Coastguard Worker         {
1124*cfb92d14SAndroid Build Coastguard Worker         case 0:
1125*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(firstMsgId == 0);
1126*cfb92d14SAndroid Build Coastguard Worker             break;
1127*cfb92d14SAndroid Build Coastguard Worker         case 1:
1128*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(firstMsgId == 0xffff);
1129*cfb92d14SAndroid Build Coastguard Worker             break;
1130*cfb92d14SAndroid Build Coastguard Worker         case 2:
1131*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(firstMsgId == 0xaaaa);
1132*cfb92d14SAndroid Build Coastguard Worker             break;
1133*cfb92d14SAndroid Build Coastguard Worker         }
1134*cfb92d14SAndroid Build Coastguard Worker 
1135*cfb92d14SAndroid Build Coastguard Worker         if (testIter == 2)
1136*cfb92d14SAndroid Build Coastguard Worker         {
1137*cfb92d14SAndroid Build Coastguard Worker             AdvanceTime(2 * 1000);
1138*cfb92d14SAndroid Build Coastguard Worker 
1139*cfb92d14SAndroid Build Coastguard Worker             PrepareService2(service2);
1140*cfb92d14SAndroid Build Coastguard Worker             SuccessOrQuit(srpClient->AddService(service2));
1141*cfb92d14SAndroid Build Coastguard Worker         }
1142*cfb92d14SAndroid Build Coastguard Worker 
1143*cfb92d14SAndroid Build Coastguard Worker         //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1144*cfb92d14SAndroid Build Coastguard Worker         // Wait for longer to allow client to retry a bunch of times
1145*cfb92d14SAndroid Build Coastguard Worker 
1146*cfb92d14SAndroid Build Coastguard Worker         AdvanceTime(20 * 1000);
1147*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(sServerRxCount > 1);
1148*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(sServerLastMsgId != firstMsgId);
1149*cfb92d14SAndroid Build Coastguard Worker 
1150*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(srpClient->GetHostInfo().GetState() != Srp::Client::kRegistered);
1151*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(service1.GetState() != Srp::Client::kRegistered);
1152*cfb92d14SAndroid Build Coastguard Worker 
1153*cfb92d14SAndroid Build Coastguard Worker         //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1154*cfb92d14SAndroid Build Coastguard Worker         // Now send a delayed response from server using the first
1155*cfb92d14SAndroid Build Coastguard Worker         // message ID.
1156*cfb92d14SAndroid Build Coastguard Worker 
1157*cfb92d14SAndroid Build Coastguard Worker         response = udpSocket.NewMessage();
1158*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(response != nullptr);
1159*cfb92d14SAndroid Build Coastguard Worker 
1160*cfb92d14SAndroid Build Coastguard Worker         Log("Sending response with msg-id: 0x%x", firstMsgId);
1161*cfb92d14SAndroid Build Coastguard Worker 
1162*cfb92d14SAndroid Build Coastguard Worker         header.SetMessageId(firstMsgId);
1163*cfb92d14SAndroid Build Coastguard Worker         header.SetType(Dns::UpdateHeader::kTypeResponse);
1164*cfb92d14SAndroid Build Coastguard Worker         header.SetResponseCode(Dns::UpdateHeader::kResponseSuccess);
1165*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(response->Append(header));
1166*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(udpSocket.SendTo(*response, sServerMsgInfo));
1167*cfb92d14SAndroid Build Coastguard Worker 
1168*cfb92d14SAndroid Build Coastguard Worker         AdvanceTime(10);
1169*cfb92d14SAndroid Build Coastguard Worker 
1170*cfb92d14SAndroid Build Coastguard Worker         //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1171*cfb92d14SAndroid Build Coastguard Worker         // In the first two iterations, we ensure that client
1172*cfb92d14SAndroid Build Coastguard Worker         // did successfully accept the response with older message ID.
1173*cfb92d14SAndroid Build Coastguard Worker         // This should not be the case in the third iteration due to
1174*cfb92d14SAndroid Build Coastguard Worker         // changes to client services after first UPdate message was
1175*cfb92d14SAndroid Build Coastguard Worker         // sent by client.
1176*cfb92d14SAndroid Build Coastguard Worker 
1177*cfb92d14SAndroid Build Coastguard Worker         switch (testIter)
1178*cfb92d14SAndroid Build Coastguard Worker         {
1179*cfb92d14SAndroid Build Coastguard Worker         case 0:
1180*cfb92d14SAndroid Build Coastguard Worker         case 1:
1181*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(srpClient->GetHostInfo().GetState() == Srp::Client::kRegistered);
1182*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(service1.GetState() == Srp::Client::kRegistered);
1183*cfb92d14SAndroid Build Coastguard Worker             break;
1184*cfb92d14SAndroid Build Coastguard Worker         case 2:
1185*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(srpClient->GetHostInfo().GetState() != Srp::Client::kRegistered);
1186*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(service1.GetState() != Srp::Client::kRegistered);
1187*cfb92d14SAndroid Build Coastguard Worker             break;
1188*cfb92d14SAndroid Build Coastguard Worker         }
1189*cfb92d14SAndroid Build Coastguard Worker 
1190*cfb92d14SAndroid Build Coastguard Worker         //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1191*cfb92d14SAndroid Build Coastguard Worker         // Remove service and close socket.
1192*cfb92d14SAndroid Build Coastguard Worker 
1193*cfb92d14SAndroid Build Coastguard Worker         srpClient->ClearHostAndServices();
1194*cfb92d14SAndroid Build Coastguard Worker         srpClient->Stop();
1195*cfb92d14SAndroid Build Coastguard Worker 
1196*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(udpSocket.Close());
1197*cfb92d14SAndroid Build Coastguard Worker     }
1198*cfb92d14SAndroid Build Coastguard Worker 
1199*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1200*cfb92d14SAndroid Build Coastguard Worker     // Finalize OT instance
1201*cfb92d14SAndroid Build Coastguard Worker 
1202*cfb92d14SAndroid Build Coastguard Worker     Log("Finalizing OT instance");
1203*cfb92d14SAndroid Build Coastguard Worker     FinalizeTest();
1204*cfb92d14SAndroid Build Coastguard Worker 
1205*cfb92d14SAndroid Build Coastguard Worker     Log("End of TestSrpClientDelayedResponse");
1206*cfb92d14SAndroid Build Coastguard Worker }
1207*cfb92d14SAndroid Build Coastguard Worker 
1208*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
1209*cfb92d14SAndroid Build Coastguard Worker 
1210*cfb92d14SAndroid Build Coastguard Worker #endif // ENABLE_SRP_TEST
1211*cfb92d14SAndroid Build Coastguard Worker 
1212*cfb92d14SAndroid Build Coastguard Worker } // namespace ot
1213*cfb92d14SAndroid Build Coastguard Worker 
main(void)1214*cfb92d14SAndroid Build Coastguard Worker int main(void)
1215*cfb92d14SAndroid Build Coastguard Worker {
1216*cfb92d14SAndroid Build Coastguard Worker #if ENABLE_SRP_TEST
1217*cfb92d14SAndroid Build Coastguard Worker     ot::TestSrpServerBase();
1218*cfb92d14SAndroid Build Coastguard Worker     ot::TestSrpServerReject();
1219*cfb92d14SAndroid Build Coastguard Worker     ot::TestSrpServerIgnore();
1220*cfb92d14SAndroid Build Coastguard Worker     ot::TestSrpServerClientRemove(/* aShouldRemoveKeyLease */ true);
1221*cfb92d14SAndroid Build Coastguard Worker     ot::TestSrpServerClientRemove(/* aShouldRemoveKeyLease */ false);
1222*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
1223*cfb92d14SAndroid Build Coastguard Worker     ot::TestUpdateLeaseShortVariant();
1224*cfb92d14SAndroid Build Coastguard Worker     ot::TestSrpClientDelayedResponse();
1225*cfb92d14SAndroid Build Coastguard Worker #endif
1226*cfb92d14SAndroid Build Coastguard Worker 
1227*cfb92d14SAndroid Build Coastguard Worker     printf("All tests passed\n");
1228*cfb92d14SAndroid Build Coastguard Worker #else
1229*cfb92d14SAndroid Build Coastguard Worker     printf("SRP_SERVER or SRP_CLIENT feature is not enabled\n");
1230*cfb92d14SAndroid Build Coastguard Worker #endif
1231*cfb92d14SAndroid Build Coastguard Worker 
1232*cfb92d14SAndroid Build Coastguard Worker     return 0;
1233*cfb92d14SAndroid Build Coastguard Worker }
1234