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