xref: /aosp_15_r20/external/openthread/tests/unit/test_dso.cpp (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker  *  Copyright (c) 2021, 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 "common/arg_macros.hpp"
35*cfb92d14SAndroid Build Coastguard Worker #include "common/array.hpp"
36*cfb92d14SAndroid Build Coastguard Worker #include "common/as_core_type.hpp"
37*cfb92d14SAndroid Build Coastguard Worker #include "common/time.hpp"
38*cfb92d14SAndroid Build Coastguard Worker #include "instance/instance.hpp"
39*cfb92d14SAndroid Build Coastguard Worker #include "net/dns_dso.hpp"
40*cfb92d14SAndroid Build Coastguard Worker 
41*cfb92d14SAndroid Build Coastguard Worker namespace ot {
42*cfb92d14SAndroid Build Coastguard Worker 
43*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DNS_DSO_ENABLE
44*cfb92d14SAndroid Build Coastguard Worker 
45*cfb92d14SAndroid Build Coastguard Worker extern "C" {
46*cfb92d14SAndroid Build Coastguard Worker 
47*cfb92d14SAndroid Build Coastguard Worker static uint32_t    sNow = 0;
48*cfb92d14SAndroid Build Coastguard Worker static uint32_t    sAlarmTime;
49*cfb92d14SAndroid Build Coastguard Worker static bool        sAlarmOn = false;
50*cfb92d14SAndroid Build Coastguard Worker static otInstance *sInstance;
51*cfb92d14SAndroid Build Coastguard Worker 
52*cfb92d14SAndroid Build Coastguard Worker // Logs a message and adds current time (sNow) as "<hours>:<min>:<secs>.<msec>"
53*cfb92d14SAndroid Build Coastguard Worker #define Log(...)                                                                                          \
54*cfb92d14SAndroid Build Coastguard Worker     printf("%02u:%02u:%02u.%03u " OT_FIRST_ARG(__VA_ARGS__) "\n", (sNow / 36000000), (sNow / 60000) % 60, \
55*cfb92d14SAndroid Build Coastguard Worker            (sNow / 1000) % 60, sNow % 1000 OT_REST_ARGS(__VA_ARGS__))
56*cfb92d14SAndroid Build Coastguard Worker 
otPlatAlarmMilliStop(otInstance *)57*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMilliStop(otInstance *) { sAlarmOn = false; }
58*cfb92d14SAndroid Build Coastguard Worker 
otPlatAlarmMilliStartAt(otInstance *,uint32_t aT0,uint32_t aDt)59*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMilliStartAt(otInstance *, uint32_t aT0, uint32_t aDt)
60*cfb92d14SAndroid Build Coastguard Worker {
61*cfb92d14SAndroid Build Coastguard Worker     sAlarmOn   = true;
62*cfb92d14SAndroid Build Coastguard Worker     sAlarmTime = aT0 + aDt;
63*cfb92d14SAndroid Build Coastguard Worker 
64*cfb92d14SAndroid Build Coastguard Worker     Log(" otPlatAlarmMilliStartAt(time:%u.%03u, dt:%u.%03u)", sAlarmTime / 1000, sAlarmTime % 1000,
65*cfb92d14SAndroid Build Coastguard Worker         (sAlarmTime - sNow) / 1000, (sAlarmTime - sNow) % 1000);
66*cfb92d14SAndroid Build Coastguard Worker }
67*cfb92d14SAndroid Build Coastguard Worker 
otPlatAlarmMilliGetNow(void)68*cfb92d14SAndroid Build Coastguard Worker uint32_t otPlatAlarmMilliGetNow(void) { return sNow; }
69*cfb92d14SAndroid Build Coastguard Worker 
70*cfb92d14SAndroid Build Coastguard Worker } // extern "C"
71*cfb92d14SAndroid Build Coastguard Worker 
AdvanceTime(uint32_t aDuration)72*cfb92d14SAndroid Build Coastguard Worker void AdvanceTime(uint32_t aDuration)
73*cfb92d14SAndroid Build Coastguard Worker {
74*cfb92d14SAndroid Build Coastguard Worker     uint32_t time = sNow + aDuration;
75*cfb92d14SAndroid Build Coastguard Worker 
76*cfb92d14SAndroid Build Coastguard Worker     Log(" AdvanceTime for %u.%03u", aDuration / 1000, aDuration % 1000);
77*cfb92d14SAndroid Build Coastguard Worker 
78*cfb92d14SAndroid Build Coastguard Worker     while (TimeMilli(sAlarmTime) <= TimeMilli(time))
79*cfb92d14SAndroid Build Coastguard Worker     {
80*cfb92d14SAndroid Build Coastguard Worker         sNow = sAlarmTime;
81*cfb92d14SAndroid Build Coastguard Worker         otPlatAlarmMilliFired(sInstance);
82*cfb92d14SAndroid Build Coastguard Worker     }
83*cfb92d14SAndroid Build Coastguard Worker 
84*cfb92d14SAndroid Build Coastguard Worker     sNow = time;
85*cfb92d14SAndroid Build Coastguard Worker }
86*cfb92d14SAndroid Build Coastguard Worker 
87*cfb92d14SAndroid Build Coastguard Worker namespace Dns {
88*cfb92d14SAndroid Build Coastguard Worker 
89*cfb92d14SAndroid Build Coastguard Worker OT_TOOL_PACKED_BEGIN
90*cfb92d14SAndroid Build Coastguard Worker class TestTlv : public Dso::Tlv
91*cfb92d14SAndroid Build Coastguard Worker {
92*cfb92d14SAndroid Build Coastguard Worker public:
93*cfb92d14SAndroid Build Coastguard Worker     static constexpr Type kType = 0xf800;
94*cfb92d14SAndroid Build Coastguard Worker 
Init(uint8_t aValue)95*cfb92d14SAndroid Build Coastguard Worker     void Init(uint8_t aValue)
96*cfb92d14SAndroid Build Coastguard Worker     {
97*cfb92d14SAndroid Build Coastguard Worker         Tlv::Init(kType, sizeof(*this) - sizeof(Tlv));
98*cfb92d14SAndroid Build Coastguard Worker         mValue = aValue;
99*cfb92d14SAndroid Build Coastguard Worker     }
100*cfb92d14SAndroid Build Coastguard Worker 
IsValid(void) const101*cfb92d14SAndroid Build Coastguard Worker     bool    IsValid(void) const { return GetSize() >= sizeof(*this); }
GetValue(void) const102*cfb92d14SAndroid Build Coastguard Worker     uint8_t GetValue(void) const { return mValue; }
103*cfb92d14SAndroid Build Coastguard Worker 
104*cfb92d14SAndroid Build Coastguard Worker private:
105*cfb92d14SAndroid Build Coastguard Worker     uint8_t mValue;
106*cfb92d14SAndroid Build Coastguard Worker 
107*cfb92d14SAndroid Build Coastguard Worker } OT_TOOL_PACKED_END;
108*cfb92d14SAndroid Build Coastguard Worker 
109*cfb92d14SAndroid Build Coastguard Worker extern "C" void otPlatDsoSend(otPlatDsoConnection *aConnection, otMessage *aMessage);
110*cfb92d14SAndroid Build Coastguard Worker 
111*cfb92d14SAndroid Build Coastguard Worker class Connection : public Dso::Connection
112*cfb92d14SAndroid Build Coastguard Worker {
113*cfb92d14SAndroid Build Coastguard Worker     friend void otPlatDsoSend(otPlatDsoConnection *aConnection, otMessage *aMessage);
114*cfb92d14SAndroid Build Coastguard Worker 
115*cfb92d14SAndroid Build Coastguard Worker public:
Connection(Instance & aInstance,const char * aName,const Ip6::SockAddr & aLocalSockAddr,const Ip6::SockAddr & aPeerSockAddr)116*cfb92d14SAndroid Build Coastguard Worker     explicit Connection(Instance            &aInstance,
117*cfb92d14SAndroid Build Coastguard Worker                         const char          *aName,
118*cfb92d14SAndroid Build Coastguard Worker                         const Ip6::SockAddr &aLocalSockAddr,
119*cfb92d14SAndroid Build Coastguard Worker                         const Ip6::SockAddr &aPeerSockAddr)
120*cfb92d14SAndroid Build Coastguard Worker         : Dso::Connection(aInstance, aPeerSockAddr, sCallbacks)
121*cfb92d14SAndroid Build Coastguard Worker         , mName(aName)
122*cfb92d14SAndroid Build Coastguard Worker         , mLocalSockAddr(aLocalSockAddr)
123*cfb92d14SAndroid Build Coastguard Worker     {
124*cfb92d14SAndroid Build Coastguard Worker         ClearTestFlags();
125*cfb92d14SAndroid Build Coastguard Worker     }
126*cfb92d14SAndroid Build Coastguard Worker 
GetName(void) const127*cfb92d14SAndroid Build Coastguard Worker     const char          *GetName(void) const { return mName; }
GetLocalSockAddr(void) const128*cfb92d14SAndroid Build Coastguard Worker     const Ip6::SockAddr &GetLocalSockAddr(void) const { return mLocalSockAddr; }
129*cfb92d14SAndroid Build Coastguard Worker 
ClearTestFlags(void)130*cfb92d14SAndroid Build Coastguard Worker     void ClearTestFlags(void)
131*cfb92d14SAndroid Build Coastguard Worker     {
132*cfb92d14SAndroid Build Coastguard Worker         mDidGetConnectedSignal          = false;
133*cfb92d14SAndroid Build Coastguard Worker         mDidGetSessionEstablishedSignal = false;
134*cfb92d14SAndroid Build Coastguard Worker         mDidGetDisconnectSignal         = false;
135*cfb92d14SAndroid Build Coastguard Worker         mDidSendMessage                 = false;
136*cfb92d14SAndroid Build Coastguard Worker         mDidReceiveMessage              = false;
137*cfb92d14SAndroid Build Coastguard Worker         mDidProcessRequest              = false;
138*cfb92d14SAndroid Build Coastguard Worker         mDidProcessUnidirectional       = false;
139*cfb92d14SAndroid Build Coastguard Worker         mDidProcessResponse             = false;
140*cfb92d14SAndroid Build Coastguard Worker     }
141*cfb92d14SAndroid Build Coastguard Worker 
DidGetConnectedSignal(void) const142*cfb92d14SAndroid Build Coastguard Worker     bool DidGetConnectedSignal(void) const { return mDidGetConnectedSignal; }
DidGetSessionEstablishedSignal(void) const143*cfb92d14SAndroid Build Coastguard Worker     bool DidGetSessionEstablishedSignal(void) const { return mDidGetSessionEstablishedSignal; }
DidGetDisconnectSignal(void) const144*cfb92d14SAndroid Build Coastguard Worker     bool DidGetDisconnectSignal(void) const { return mDidGetDisconnectSignal; }
DidSendMessage(void) const145*cfb92d14SAndroid Build Coastguard Worker     bool DidSendMessage(void) const { return mDidSendMessage; }
DidReceiveMessage(void) const146*cfb92d14SAndroid Build Coastguard Worker     bool DidReceiveMessage(void) const { return mDidReceiveMessage; }
DidProcessRequest(void) const147*cfb92d14SAndroid Build Coastguard Worker     bool DidProcessRequest(void) const { return mDidProcessRequest; }
DidProcessUnidirectional(void) const148*cfb92d14SAndroid Build Coastguard Worker     bool DidProcessUnidirectional(void) const { return mDidProcessUnidirectional; }
DidProcessResponse(void) const149*cfb92d14SAndroid Build Coastguard Worker     bool DidProcessResponse(void) const { return mDidProcessResponse; }
150*cfb92d14SAndroid Build Coastguard Worker 
GetLastRxTestTlvValue(void) const151*cfb92d14SAndroid Build Coastguard Worker     uint8_t               GetLastRxTestTlvValue(void) const { return mLastRxTestTlvValue; }
GetLastRxResponseCode(void) const152*cfb92d14SAndroid Build Coastguard Worker     Dns::Header::Response GetLastRxResponseCode(void) const { return mLastRxResponseCode; }
153*cfb92d14SAndroid Build Coastguard Worker 
SendTestRequestMessage(uint8_t aValue=0,uint32_t aResponseTimeout=Dso::kResponseTimeout)154*cfb92d14SAndroid Build Coastguard Worker     void SendTestRequestMessage(uint8_t aValue = 0, uint32_t aResponseTimeout = Dso::kResponseTimeout)
155*cfb92d14SAndroid Build Coastguard Worker     {
156*cfb92d14SAndroid Build Coastguard Worker         MessageId messageId;
157*cfb92d14SAndroid Build Coastguard Worker 
158*cfb92d14SAndroid Build Coastguard Worker         mLastTxTestTlvValue = aValue;
159*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(SendRequestMessage(PrepareTestMessage(aValue), messageId, aResponseTimeout));
160*cfb92d14SAndroid Build Coastguard Worker     }
161*cfb92d14SAndroid Build Coastguard Worker 
SendTestUnidirectionalMessage(uint8_t aValue=0)162*cfb92d14SAndroid Build Coastguard Worker     void SendTestUnidirectionalMessage(uint8_t aValue = 0)
163*cfb92d14SAndroid Build Coastguard Worker     {
164*cfb92d14SAndroid Build Coastguard Worker         mLastTxTestTlvValue = aValue;
165*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(SendUnidirectionalMessage(PrepareTestMessage(aValue)));
166*cfb92d14SAndroid Build Coastguard Worker     }
167*cfb92d14SAndroid Build Coastguard Worker 
168*cfb92d14SAndroid Build Coastguard Worker private:
PrepareTestMessage(uint8_t aValue)169*cfb92d14SAndroid Build Coastguard Worker     Message &PrepareTestMessage(uint8_t aValue)
170*cfb92d14SAndroid Build Coastguard Worker     {
171*cfb92d14SAndroid Build Coastguard Worker         TestTlv  testTlv;
172*cfb92d14SAndroid Build Coastguard Worker         Message *message = NewMessage();
173*cfb92d14SAndroid Build Coastguard Worker 
174*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(message != nullptr);
175*cfb92d14SAndroid Build Coastguard Worker         testTlv.Init(aValue);
176*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(message->Append(testTlv));
177*cfb92d14SAndroid Build Coastguard Worker 
178*cfb92d14SAndroid Build Coastguard Worker         return *message;
179*cfb92d14SAndroid Build Coastguard Worker     }
180*cfb92d14SAndroid Build Coastguard Worker 
ParseTestMessage(const Message & aMessage)181*cfb92d14SAndroid Build Coastguard Worker     void ParseTestMessage(const Message &aMessage)
182*cfb92d14SAndroid Build Coastguard Worker     {
183*cfb92d14SAndroid Build Coastguard Worker         TestTlv  testTlv;
184*cfb92d14SAndroid Build Coastguard Worker         Dso::Tlv tlv;
185*cfb92d14SAndroid Build Coastguard Worker         uint16_t offset = aMessage.GetOffset();
186*cfb92d14SAndroid Build Coastguard Worker 
187*cfb92d14SAndroid Build Coastguard Worker         // Test message MUST only contain Test TLV and Encryption
188*cfb92d14SAndroid Build Coastguard Worker         // Padding TLV.
189*cfb92d14SAndroid Build Coastguard Worker 
190*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(aMessage.Read(offset, testTlv));
191*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(testTlv.GetType() == TestTlv::kType);
192*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(testTlv.IsValid());
193*cfb92d14SAndroid Build Coastguard Worker         offset += testTlv.GetSize();
194*cfb92d14SAndroid Build Coastguard Worker         mLastRxTestTlvValue = testTlv.GetValue();
195*cfb92d14SAndroid Build Coastguard Worker 
196*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(aMessage.Read(offset, tlv));
197*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(tlv.GetType() == Dso::Tlv::kEncryptionPaddingType);
198*cfb92d14SAndroid Build Coastguard Worker         offset += tlv.GetSize();
199*cfb92d14SAndroid Build Coastguard Worker 
200*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(offset == aMessage.GetLength());
201*cfb92d14SAndroid Build Coastguard Worker     }
202*cfb92d14SAndroid Build Coastguard Worker 
SendTestResponseMessage(MessageId aResponseId,uint8_t aValue)203*cfb92d14SAndroid Build Coastguard Worker     void SendTestResponseMessage(MessageId aResponseId, uint8_t aValue)
204*cfb92d14SAndroid Build Coastguard Worker     {
205*cfb92d14SAndroid Build Coastguard Worker         mLastTxTestTlvValue = aValue;
206*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(SendResponseMessage(PrepareTestMessage(aValue), aResponseId));
207*cfb92d14SAndroid Build Coastguard Worker     }
208*cfb92d14SAndroid Build Coastguard Worker 
209*cfb92d14SAndroid Build Coastguard Worker     //---------------------------------------------------------------------
210*cfb92d14SAndroid Build Coastguard Worker     // Callback methods
211*cfb92d14SAndroid Build Coastguard Worker 
HandleConnected(void)212*cfb92d14SAndroid Build Coastguard Worker     void HandleConnected(void) { mDidGetConnectedSignal = true; }
HandleSessionEstablished(void)213*cfb92d14SAndroid Build Coastguard Worker     void HandleSessionEstablished(void) { mDidGetSessionEstablishedSignal = true; }
HandleDisconnected(void)214*cfb92d14SAndroid Build Coastguard Worker     void HandleDisconnected(void) { mDidGetDisconnectSignal = true; }
215*cfb92d14SAndroid Build Coastguard Worker 
ProcessRequestMessage(MessageId aMessageId,const Message & aMessage,Dso::Tlv::Type aPrimaryTlvType)216*cfb92d14SAndroid Build Coastguard Worker     Error ProcessRequestMessage(MessageId aMessageId, const Message &aMessage, Dso::Tlv::Type aPrimaryTlvType)
217*cfb92d14SAndroid Build Coastguard Worker     {
218*cfb92d14SAndroid Build Coastguard Worker         Error error = kErrorNone;
219*cfb92d14SAndroid Build Coastguard Worker 
220*cfb92d14SAndroid Build Coastguard Worker         Log(" ProcessRequestMessage(primaryTlv:0x%04x) on %s", aPrimaryTlvType, mName);
221*cfb92d14SAndroid Build Coastguard Worker         mDidProcessRequest = true;
222*cfb92d14SAndroid Build Coastguard Worker 
223*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(aPrimaryTlvType == TestTlv::kType, error = kErrorNotFound);
224*cfb92d14SAndroid Build Coastguard Worker         ParseTestMessage(aMessage);
225*cfb92d14SAndroid Build Coastguard Worker         SendTestResponseMessage(aMessageId, mLastRxTestTlvValue);
226*cfb92d14SAndroid Build Coastguard Worker 
227*cfb92d14SAndroid Build Coastguard Worker     exit:
228*cfb92d14SAndroid Build Coastguard Worker         return error;
229*cfb92d14SAndroid Build Coastguard Worker     }
230*cfb92d14SAndroid Build Coastguard Worker 
ProcessUnidirectionalMessage(const Message & aMessage,Dso::Tlv::Type aPrimaryTlvType)231*cfb92d14SAndroid Build Coastguard Worker     Error ProcessUnidirectionalMessage(const Message &aMessage, Dso::Tlv::Type aPrimaryTlvType)
232*cfb92d14SAndroid Build Coastguard Worker     {
233*cfb92d14SAndroid Build Coastguard Worker         Log(" ProcessUnidirectionalMessage(primaryTlv:0x%04x) on %s", aPrimaryTlvType, mName);
234*cfb92d14SAndroid Build Coastguard Worker         mDidProcessUnidirectional = true;
235*cfb92d14SAndroid Build Coastguard Worker 
236*cfb92d14SAndroid Build Coastguard Worker         if (aPrimaryTlvType == TestTlv::kType)
237*cfb92d14SAndroid Build Coastguard Worker         {
238*cfb92d14SAndroid Build Coastguard Worker             ParseTestMessage(aMessage);
239*cfb92d14SAndroid Build Coastguard Worker         }
240*cfb92d14SAndroid Build Coastguard Worker 
241*cfb92d14SAndroid Build Coastguard Worker         return kErrorNone;
242*cfb92d14SAndroid Build Coastguard Worker     }
243*cfb92d14SAndroid Build Coastguard Worker 
ProcessResponseMessage(const Dns::Header & aHeader,const Message & aMessage,Dso::Tlv::Type aResponseTlvType,Dso::Tlv::Type aRequestTlvType)244*cfb92d14SAndroid Build Coastguard Worker     Error ProcessResponseMessage(const Dns::Header &aHeader,
245*cfb92d14SAndroid Build Coastguard Worker                                  const Message     &aMessage,
246*cfb92d14SAndroid Build Coastguard Worker                                  Dso::Tlv::Type     aResponseTlvType,
247*cfb92d14SAndroid Build Coastguard Worker                                  Dso::Tlv::Type     aRequestTlvType)
248*cfb92d14SAndroid Build Coastguard Worker     {
249*cfb92d14SAndroid Build Coastguard Worker         Error error = kErrorNone;
250*cfb92d14SAndroid Build Coastguard Worker 
251*cfb92d14SAndroid Build Coastguard Worker         mDidProcessResponse = true;
252*cfb92d14SAndroid Build Coastguard Worker         mLastRxResponseCode = aHeader.GetResponseCode();
253*cfb92d14SAndroid Build Coastguard Worker         Log(" ProcessResponseMessage(responseTlv:0x%04x) on %s (response-Code:%u) ", aResponseTlvType, mName,
254*cfb92d14SAndroid Build Coastguard Worker             mLastRxResponseCode);
255*cfb92d14SAndroid Build Coastguard Worker 
256*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(mLastRxResponseCode == Dns::Header::kResponseSuccess);
257*cfb92d14SAndroid Build Coastguard Worker 
258*cfb92d14SAndroid Build Coastguard Worker         // During test we only expect a Test TLV response with
259*cfb92d14SAndroid Build Coastguard Worker         // a matching TLV value to what was sent last.
260*cfb92d14SAndroid Build Coastguard Worker 
261*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(aResponseTlvType == TestTlv::kType);
262*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(aRequestTlvType == TestTlv::kType);
263*cfb92d14SAndroid Build Coastguard Worker         ParseTestMessage(aMessage);
264*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(mLastRxTestTlvValue == mLastTxTestTlvValue);
265*cfb92d14SAndroid Build Coastguard Worker 
266*cfb92d14SAndroid Build Coastguard Worker     exit:
267*cfb92d14SAndroid Build Coastguard Worker         return error;
268*cfb92d14SAndroid Build Coastguard Worker     }
269*cfb92d14SAndroid Build Coastguard Worker 
HandleConnected(Dso::Connection & aConnection)270*cfb92d14SAndroid Build Coastguard Worker     static void HandleConnected(Dso::Connection &aConnection)
271*cfb92d14SAndroid Build Coastguard Worker     {
272*cfb92d14SAndroid Build Coastguard Worker         static_cast<Connection &>(aConnection).HandleConnected();
273*cfb92d14SAndroid Build Coastguard Worker     }
274*cfb92d14SAndroid Build Coastguard Worker 
HandleSessionEstablished(Dso::Connection & aConnection)275*cfb92d14SAndroid Build Coastguard Worker     static void HandleSessionEstablished(Dso::Connection &aConnection)
276*cfb92d14SAndroid Build Coastguard Worker     {
277*cfb92d14SAndroid Build Coastguard Worker         static_cast<Connection &>(aConnection).HandleSessionEstablished();
278*cfb92d14SAndroid Build Coastguard Worker     }
279*cfb92d14SAndroid Build Coastguard Worker 
HandleDisconnected(Dso::Connection & aConnection)280*cfb92d14SAndroid Build Coastguard Worker     static void HandleDisconnected(Dso::Connection &aConnection)
281*cfb92d14SAndroid Build Coastguard Worker     {
282*cfb92d14SAndroid Build Coastguard Worker         static_cast<Connection &>(aConnection).HandleDisconnected();
283*cfb92d14SAndroid Build Coastguard Worker     }
284*cfb92d14SAndroid Build Coastguard Worker 
ProcessRequestMessage(Dso::Connection & aConnection,MessageId aMessageId,const Message & aMessage,Dso::Tlv::Type aPrimaryTlvType)285*cfb92d14SAndroid Build Coastguard Worker     static Error ProcessRequestMessage(Dso::Connection &aConnection,
286*cfb92d14SAndroid Build Coastguard Worker                                        MessageId        aMessageId,
287*cfb92d14SAndroid Build Coastguard Worker                                        const Message   &aMessage,
288*cfb92d14SAndroid Build Coastguard Worker                                        Dso::Tlv::Type   aPrimaryTlvType)
289*cfb92d14SAndroid Build Coastguard Worker     {
290*cfb92d14SAndroid Build Coastguard Worker         return static_cast<Connection &>(aConnection).ProcessRequestMessage(aMessageId, aMessage, aPrimaryTlvType);
291*cfb92d14SAndroid Build Coastguard Worker     }
292*cfb92d14SAndroid Build Coastguard Worker 
ProcessUnidirectionalMessage(Dso::Connection & aConnection,const Message & aMessage,Dso::Tlv::Type aPrimaryTlvType)293*cfb92d14SAndroid Build Coastguard Worker     static Error ProcessUnidirectionalMessage(Dso::Connection &aConnection,
294*cfb92d14SAndroid Build Coastguard Worker                                               const Message   &aMessage,
295*cfb92d14SAndroid Build Coastguard Worker                                               Dso::Tlv::Type   aPrimaryTlvType)
296*cfb92d14SAndroid Build Coastguard Worker     {
297*cfb92d14SAndroid Build Coastguard Worker         return static_cast<Connection &>(aConnection).ProcessUnidirectionalMessage(aMessage, aPrimaryTlvType);
298*cfb92d14SAndroid Build Coastguard Worker     }
299*cfb92d14SAndroid Build Coastguard Worker 
ProcessResponseMessage(Dso::Connection & aConnection,const Dns::Header & aHeader,const Message & aMessage,Dso::Tlv::Type aResponseTlvType,Dso::Tlv::Type aRequestTlvType)300*cfb92d14SAndroid Build Coastguard Worker     static Error ProcessResponseMessage(Dso::Connection   &aConnection,
301*cfb92d14SAndroid Build Coastguard Worker                                         const Dns::Header &aHeader,
302*cfb92d14SAndroid Build Coastguard Worker                                         const Message     &aMessage,
303*cfb92d14SAndroid Build Coastguard Worker                                         Dso::Tlv::Type     aResponseTlvType,
304*cfb92d14SAndroid Build Coastguard Worker                                         Dso::Tlv::Type     aRequestTlvType)
305*cfb92d14SAndroid Build Coastguard Worker     {
306*cfb92d14SAndroid Build Coastguard Worker         return static_cast<Connection &>(aConnection)
307*cfb92d14SAndroid Build Coastguard Worker             .ProcessResponseMessage(aHeader, aMessage, aResponseTlvType, aRequestTlvType);
308*cfb92d14SAndroid Build Coastguard Worker     }
309*cfb92d14SAndroid Build Coastguard Worker 
310*cfb92d14SAndroid Build Coastguard Worker     const char           *mName;
311*cfb92d14SAndroid Build Coastguard Worker     Ip6::SockAddr         mLocalSockAddr;
312*cfb92d14SAndroid Build Coastguard Worker     bool                  mDidGetConnectedSignal;
313*cfb92d14SAndroid Build Coastguard Worker     bool                  mDidGetSessionEstablishedSignal;
314*cfb92d14SAndroid Build Coastguard Worker     bool                  mDidGetDisconnectSignal;
315*cfb92d14SAndroid Build Coastguard Worker     bool                  mDidSendMessage;
316*cfb92d14SAndroid Build Coastguard Worker     bool                  mDidReceiveMessage;
317*cfb92d14SAndroid Build Coastguard Worker     bool                  mDidProcessRequest;
318*cfb92d14SAndroid Build Coastguard Worker     bool                  mDidProcessUnidirectional;
319*cfb92d14SAndroid Build Coastguard Worker     bool                  mDidProcessResponse;
320*cfb92d14SAndroid Build Coastguard Worker     uint8_t               mLastTxTestTlvValue;
321*cfb92d14SAndroid Build Coastguard Worker     uint8_t               mLastRxTestTlvValue;
322*cfb92d14SAndroid Build Coastguard Worker     Dns::Header::Response mLastRxResponseCode;
323*cfb92d14SAndroid Build Coastguard Worker 
324*cfb92d14SAndroid Build Coastguard Worker     static Callbacks sCallbacks;
325*cfb92d14SAndroid Build Coastguard Worker };
326*cfb92d14SAndroid Build Coastguard Worker 
327*cfb92d14SAndroid Build Coastguard Worker Dso::Connection::Callbacks Connection::sCallbacks(Connection::HandleConnected,
328*cfb92d14SAndroid Build Coastguard Worker                                                   Connection::HandleSessionEstablished,
329*cfb92d14SAndroid Build Coastguard Worker                                                   Connection::HandleDisconnected,
330*cfb92d14SAndroid Build Coastguard Worker                                                   Connection::ProcessRequestMessage,
331*cfb92d14SAndroid Build Coastguard Worker                                                   Connection::ProcessUnidirectionalMessage,
332*cfb92d14SAndroid Build Coastguard Worker                                                   Connection::ProcessResponseMessage);
333*cfb92d14SAndroid Build Coastguard Worker 
334*cfb92d14SAndroid Build Coastguard Worker static constexpr uint16_t kMaxConnections = 5;
335*cfb92d14SAndroid Build Coastguard Worker 
336*cfb92d14SAndroid Build Coastguard Worker static Array<Connection *, kMaxConnections> sConnections;
337*cfb92d14SAndroid Build Coastguard Worker 
FindPeerConnection(const Connection & aConnetion)338*cfb92d14SAndroid Build Coastguard Worker static Connection *FindPeerConnection(const Connection &aConnetion)
339*cfb92d14SAndroid Build Coastguard Worker {
340*cfb92d14SAndroid Build Coastguard Worker     Connection *peerConn = nullptr;
341*cfb92d14SAndroid Build Coastguard Worker 
342*cfb92d14SAndroid Build Coastguard Worker     for (Connection *conn : sConnections)
343*cfb92d14SAndroid Build Coastguard Worker     {
344*cfb92d14SAndroid Build Coastguard Worker         if (conn->GetLocalSockAddr() == aConnetion.GetPeerSockAddr())
345*cfb92d14SAndroid Build Coastguard Worker         {
346*cfb92d14SAndroid Build Coastguard Worker             peerConn = conn;
347*cfb92d14SAndroid Build Coastguard Worker             break;
348*cfb92d14SAndroid Build Coastguard Worker         }
349*cfb92d14SAndroid Build Coastguard Worker     }
350*cfb92d14SAndroid Build Coastguard Worker 
351*cfb92d14SAndroid Build Coastguard Worker     return peerConn;
352*cfb92d14SAndroid Build Coastguard Worker }
353*cfb92d14SAndroid Build Coastguard Worker 
354*cfb92d14SAndroid Build Coastguard Worker extern "C" {
355*cfb92d14SAndroid Build Coastguard Worker 
356*cfb92d14SAndroid Build Coastguard Worker static bool sDsoListening = false;
357*cfb92d14SAndroid Build Coastguard Worker 
358*cfb92d14SAndroid Build Coastguard Worker // This test flag indicates whether the `otPlatDso` API should
359*cfb92d14SAndroid Build Coastguard Worker // forward a sent message to the peer connection. It can be set to
360*cfb92d14SAndroid Build Coastguard Worker // `false` to drop the messages to test timeout behaviors on the
361*cfb92d14SAndroid Build Coastguard Worker // peer.
362*cfb92d14SAndroid Build Coastguard Worker static bool sTestDsoForwardMessageToPeer = true;
363*cfb92d14SAndroid Build Coastguard Worker 
364*cfb92d14SAndroid Build Coastguard Worker // This test flag indicate whether when disconnecting a connection
365*cfb92d14SAndroid Build Coastguard Worker // (using `otPlatDsoDisconnect()` to signal the peer connection about
366*cfb92d14SAndroid Build Coastguard Worker // the disconnect. Default behavior is set to `true`. It can be set
367*cfb92d14SAndroid Build Coastguard Worker // to `false` to test certain timeout behavior on peer side.
368*cfb92d14SAndroid Build Coastguard Worker static bool sTestDsoSignalDisconnectToPeer = true;
369*cfb92d14SAndroid Build Coastguard Worker 
otPlatDsoEnableListening(otInstance *,bool aEnable)370*cfb92d14SAndroid Build Coastguard Worker void otPlatDsoEnableListening(otInstance *, bool aEnable)
371*cfb92d14SAndroid Build Coastguard Worker {
372*cfb92d14SAndroid Build Coastguard Worker     Log(" otPlatDsoEnableListening(%s)", aEnable ? "true" : "false");
373*cfb92d14SAndroid Build Coastguard Worker     sDsoListening = aEnable;
374*cfb92d14SAndroid Build Coastguard Worker }
375*cfb92d14SAndroid Build Coastguard Worker 
otPlatDsoConnect(otPlatDsoConnection * aConnection,const otSockAddr * aPeerSockAddr)376*cfb92d14SAndroid Build Coastguard Worker void otPlatDsoConnect(otPlatDsoConnection *aConnection, const otSockAddr *aPeerSockAddr)
377*cfb92d14SAndroid Build Coastguard Worker {
378*cfb92d14SAndroid Build Coastguard Worker     Connection          &conn         = *static_cast<Connection *>(aConnection);
379*cfb92d14SAndroid Build Coastguard Worker     Connection          *peerConn     = nullptr;
380*cfb92d14SAndroid Build Coastguard Worker     const Ip6::SockAddr &peerSockAddr = AsCoreType(aPeerSockAddr);
381*cfb92d14SAndroid Build Coastguard Worker 
382*cfb92d14SAndroid Build Coastguard Worker     Log(" otPlatDsoConnect(%s, aPeer:0x%04x)", conn.GetName(), peerSockAddr.GetPort());
383*cfb92d14SAndroid Build Coastguard Worker 
384*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(conn.GetPeerSockAddr() == peerSockAddr);
385*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(conn.GetState() == Connection::kStateConnecting);
386*cfb92d14SAndroid Build Coastguard Worker 
387*cfb92d14SAndroid Build Coastguard Worker     if (!sDsoListening)
388*cfb92d14SAndroid Build Coastguard Worker     {
389*cfb92d14SAndroid Build Coastguard Worker         Log("   Server is not listening");
390*cfb92d14SAndroid Build Coastguard Worker         ExitNow();
391*cfb92d14SAndroid Build Coastguard Worker     }
392*cfb92d14SAndroid Build Coastguard Worker 
393*cfb92d14SAndroid Build Coastguard Worker     peerConn = static_cast<Connection *>(otPlatDsoAccept(otPlatDsoGetInstance(aConnection), aPeerSockAddr));
394*cfb92d14SAndroid Build Coastguard Worker 
395*cfb92d14SAndroid Build Coastguard Worker     if (peerConn == nullptr)
396*cfb92d14SAndroid Build Coastguard Worker     {
397*cfb92d14SAndroid Build Coastguard Worker         Log("   Request rejected");
398*cfb92d14SAndroid Build Coastguard Worker         ExitNow();
399*cfb92d14SAndroid Build Coastguard Worker     }
400*cfb92d14SAndroid Build Coastguard Worker 
401*cfb92d14SAndroid Build Coastguard Worker     Log("   Request accepted");
402*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(peerConn->GetState() == Connection::kStateConnecting);
403*cfb92d14SAndroid Build Coastguard Worker 
404*cfb92d14SAndroid Build Coastguard Worker     Log("   Signalling `Connected` on peer connection (%s)", peerConn->GetName());
405*cfb92d14SAndroid Build Coastguard Worker     otPlatDsoHandleConnected(peerConn);
406*cfb92d14SAndroid Build Coastguard Worker 
407*cfb92d14SAndroid Build Coastguard Worker     Log("   Signalling `Connected` on connection (%s)", conn.GetName());
408*cfb92d14SAndroid Build Coastguard Worker     otPlatDsoHandleConnected(aConnection);
409*cfb92d14SAndroid Build Coastguard Worker 
410*cfb92d14SAndroid Build Coastguard Worker exit:
411*cfb92d14SAndroid Build Coastguard Worker     return;
412*cfb92d14SAndroid Build Coastguard Worker }
413*cfb92d14SAndroid Build Coastguard Worker 
otPlatDsoSend(otPlatDsoConnection * aConnection,otMessage * aMessage)414*cfb92d14SAndroid Build Coastguard Worker void otPlatDsoSend(otPlatDsoConnection *aConnection, otMessage *aMessage)
415*cfb92d14SAndroid Build Coastguard Worker {
416*cfb92d14SAndroid Build Coastguard Worker     Connection &conn     = *static_cast<Connection *>(aConnection);
417*cfb92d14SAndroid Build Coastguard Worker     Connection *peerConn = nullptr;
418*cfb92d14SAndroid Build Coastguard Worker 
419*cfb92d14SAndroid Build Coastguard Worker     Log(" otPlatDsoSend(%s), message-len:%u", conn.GetName(), AsCoreType(aMessage).GetLength());
420*cfb92d14SAndroid Build Coastguard Worker 
421*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(conn.GetState() != Connection::kStateDisconnected);
422*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(conn.GetState() != Connection::kStateConnecting);
423*cfb92d14SAndroid Build Coastguard Worker     conn.mDidSendMessage = true;
424*cfb92d14SAndroid Build Coastguard Worker 
425*cfb92d14SAndroid Build Coastguard Worker     if (sTestDsoForwardMessageToPeer)
426*cfb92d14SAndroid Build Coastguard Worker     {
427*cfb92d14SAndroid Build Coastguard Worker         peerConn = FindPeerConnection(conn);
428*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(peerConn != nullptr);
429*cfb92d14SAndroid Build Coastguard Worker 
430*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(peerConn->GetState() != Connection::kStateDisconnected);
431*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(peerConn->GetState() != Connection::kStateConnecting);
432*cfb92d14SAndroid Build Coastguard Worker 
433*cfb92d14SAndroid Build Coastguard Worker         Log("   Sending the message to peer connection (%s)", peerConn->GetName());
434*cfb92d14SAndroid Build Coastguard Worker 
435*cfb92d14SAndroid Build Coastguard Worker         peerConn->mDidReceiveMessage = true;
436*cfb92d14SAndroid Build Coastguard Worker         otPlatDsoHandleReceive(peerConn, aMessage);
437*cfb92d14SAndroid Build Coastguard Worker     }
438*cfb92d14SAndroid Build Coastguard Worker     else
439*cfb92d14SAndroid Build Coastguard Worker     {
440*cfb92d14SAndroid Build Coastguard Worker         Log("   Dropping the message");
441*cfb92d14SAndroid Build Coastguard Worker     }
442*cfb92d14SAndroid Build Coastguard Worker }
443*cfb92d14SAndroid Build Coastguard Worker 
otPlatDsoDisconnect(otPlatDsoConnection * aConnection,otPlatDsoDisconnectMode aMode)444*cfb92d14SAndroid Build Coastguard Worker void otPlatDsoDisconnect(otPlatDsoConnection *aConnection, otPlatDsoDisconnectMode aMode)
445*cfb92d14SAndroid Build Coastguard Worker {
446*cfb92d14SAndroid Build Coastguard Worker     Connection &conn     = *static_cast<Connection *>(aConnection);
447*cfb92d14SAndroid Build Coastguard Worker     Connection *peerConn = nullptr;
448*cfb92d14SAndroid Build Coastguard Worker 
449*cfb92d14SAndroid Build Coastguard Worker     Log(" otPlatDsoDisconnect(%s, mode:%s)", conn.GetName(),
450*cfb92d14SAndroid Build Coastguard Worker         (aMode == OT_PLAT_DSO_DISCONNECT_MODE_GRACEFULLY_CLOSE) ? "close" : "abort");
451*cfb92d14SAndroid Build Coastguard Worker 
452*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(conn.GetState() == Connection::kStateDisconnected);
453*cfb92d14SAndroid Build Coastguard Worker 
454*cfb92d14SAndroid Build Coastguard Worker     if (sTestDsoSignalDisconnectToPeer)
455*cfb92d14SAndroid Build Coastguard Worker     {
456*cfb92d14SAndroid Build Coastguard Worker         peerConn = FindPeerConnection(conn);
457*cfb92d14SAndroid Build Coastguard Worker 
458*cfb92d14SAndroid Build Coastguard Worker         if (peerConn == nullptr)
459*cfb92d14SAndroid Build Coastguard Worker         {
460*cfb92d14SAndroid Build Coastguard Worker             Log("   No peer connection found");
461*cfb92d14SAndroid Build Coastguard Worker         }
462*cfb92d14SAndroid Build Coastguard Worker         else if (peerConn->GetState() == Connection::kStateDisconnected)
463*cfb92d14SAndroid Build Coastguard Worker         {
464*cfb92d14SAndroid Build Coastguard Worker             Log("   Peer connection (%s) already disconnected", peerConn->GetName());
465*cfb92d14SAndroid Build Coastguard Worker         }
466*cfb92d14SAndroid Build Coastguard Worker         else
467*cfb92d14SAndroid Build Coastguard Worker         {
468*cfb92d14SAndroid Build Coastguard Worker             Log("   Signaling `Disconnected` on peer connection (%s)", peerConn->GetName());
469*cfb92d14SAndroid Build Coastguard Worker             otPlatDsoHandleDisconnected(peerConn, aMode);
470*cfb92d14SAndroid Build Coastguard Worker         }
471*cfb92d14SAndroid Build Coastguard Worker     }
472*cfb92d14SAndroid Build Coastguard Worker }
473*cfb92d14SAndroid Build Coastguard Worker 
474*cfb92d14SAndroid Build Coastguard Worker } // extern "C"
475*cfb92d14SAndroid Build Coastguard Worker 
AcceptConnection(Instance & aInstance,const Ip6::SockAddr & aPeerSockAddr)476*cfb92d14SAndroid Build Coastguard Worker Dso::Connection *AcceptConnection(Instance &aInstance, const Ip6::SockAddr &aPeerSockAddr)
477*cfb92d14SAndroid Build Coastguard Worker {
478*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
479*cfb92d14SAndroid Build Coastguard Worker 
480*cfb92d14SAndroid Build Coastguard Worker     Connection *rval = nullptr;
481*cfb92d14SAndroid Build Coastguard Worker 
482*cfb92d14SAndroid Build Coastguard Worker     Log("  AcceptConnection(peer:0x%04x)", aPeerSockAddr.GetPort());
483*cfb92d14SAndroid Build Coastguard Worker 
484*cfb92d14SAndroid Build Coastguard Worker     for (Connection *conn : sConnections)
485*cfb92d14SAndroid Build Coastguard Worker     {
486*cfb92d14SAndroid Build Coastguard Worker         if (conn->GetLocalSockAddr() == aPeerSockAddr)
487*cfb92d14SAndroid Build Coastguard Worker         {
488*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(conn->GetState() == Connection::kStateDisconnected);
489*cfb92d14SAndroid Build Coastguard Worker             rval = conn;
490*cfb92d14SAndroid Build Coastguard Worker             break;
491*cfb92d14SAndroid Build Coastguard Worker         }
492*cfb92d14SAndroid Build Coastguard Worker     }
493*cfb92d14SAndroid Build Coastguard Worker 
494*cfb92d14SAndroid Build Coastguard Worker     if (rval != nullptr)
495*cfb92d14SAndroid Build Coastguard Worker     {
496*cfb92d14SAndroid Build Coastguard Worker         Log("   Accepting and returning connection %s", rval->GetName());
497*cfb92d14SAndroid Build Coastguard Worker     }
498*cfb92d14SAndroid Build Coastguard Worker     else
499*cfb92d14SAndroid Build Coastguard Worker     {
500*cfb92d14SAndroid Build Coastguard Worker         Log("   Rejecting");
501*cfb92d14SAndroid Build Coastguard Worker     }
502*cfb92d14SAndroid Build Coastguard Worker 
503*cfb92d14SAndroid Build Coastguard Worker     return rval;
504*cfb92d14SAndroid Build Coastguard Worker }
505*cfb92d14SAndroid Build Coastguard Worker 
506*cfb92d14SAndroid Build Coastguard Worker static constexpr uint8_t kKeepAliveTestIterations = 3;
507*cfb92d14SAndroid Build Coastguard Worker 
VerifyKeepAliveExchange(Connection & aClientConn,Connection & aServerConn,uint32_t aKeepAliveInterval,uint8_t aNumIterations=kKeepAliveTestIterations)508*cfb92d14SAndroid Build Coastguard Worker static void VerifyKeepAliveExchange(Connection &aClientConn,
509*cfb92d14SAndroid Build Coastguard Worker                                     Connection &aServerConn,
510*cfb92d14SAndroid Build Coastguard Worker                                     uint32_t    aKeepAliveInterval,
511*cfb92d14SAndroid Build Coastguard Worker                                     uint8_t     aNumIterations = kKeepAliveTestIterations)
512*cfb92d14SAndroid Build Coastguard Worker {
513*cfb92d14SAndroid Build Coastguard Worker     for (uint8_t n = 0; n < aNumIterations; n++)
514*cfb92d14SAndroid Build Coastguard Worker     {
515*cfb92d14SAndroid Build Coastguard Worker         Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
516*cfb92d14SAndroid Build Coastguard Worker         Log("Test Keep Alive message exchange, iter %d", n + 1);
517*cfb92d14SAndroid Build Coastguard Worker 
518*cfb92d14SAndroid Build Coastguard Worker         aClientConn.ClearTestFlags();
519*cfb92d14SAndroid Build Coastguard Worker         aServerConn.ClearTestFlags();
520*cfb92d14SAndroid Build Coastguard Worker 
521*cfb92d14SAndroid Build Coastguard Worker         AdvanceTime(aKeepAliveInterval - 1);
522*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(!aClientConn.DidSendMessage());
523*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(!aServerConn.DidReceiveMessage());
524*cfb92d14SAndroid Build Coastguard Worker         Log("No message before keep alive timeout");
525*cfb92d14SAndroid Build Coastguard Worker 
526*cfb92d14SAndroid Build Coastguard Worker         AdvanceTime(1);
527*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(aClientConn.DidSendMessage());
528*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(aServerConn.DidReceiveMessage());
529*cfb92d14SAndroid Build Coastguard Worker         Log("KeepAlive message exchanged after keep alive time elapses");
530*cfb92d14SAndroid Build Coastguard Worker     }
531*cfb92d14SAndroid Build Coastguard Worker }
532*cfb92d14SAndroid Build Coastguard Worker 
TestDso(void)533*cfb92d14SAndroid Build Coastguard Worker void TestDso(void)
534*cfb92d14SAndroid Build Coastguard Worker {
535*cfb92d14SAndroid Build Coastguard Worker     static constexpr uint16_t kPortA = 0xaaaa;
536*cfb92d14SAndroid Build Coastguard Worker     static constexpr uint16_t kPortB = 0xbbbb;
537*cfb92d14SAndroid Build Coastguard Worker 
538*cfb92d14SAndroid Build Coastguard Worker     static constexpr Dso::Tlv::Type kUnknownTlvType = 0xf801;
539*cfb92d14SAndroid Build Coastguard Worker 
540*cfb92d14SAndroid Build Coastguard Worker     static constexpr uint32_t kRetryDelayInterval  = TimeMilli::SecToMsec(3600);
541*cfb92d14SAndroid Build Coastguard Worker     static constexpr uint32_t kLongResponseTimeout = Dso::kResponseTimeout + TimeMilli::SecToMsec(17);
542*cfb92d14SAndroid Build Coastguard Worker 
543*cfb92d14SAndroid Build Coastguard Worker     Instance             &instance = *static_cast<Instance *>(testInitInstance());
544*cfb92d14SAndroid Build Coastguard Worker     Ip6::SockAddr         serverSockAddr(kPortA);
545*cfb92d14SAndroid Build Coastguard Worker     Ip6::SockAddr         clientSockAddr(kPortB);
546*cfb92d14SAndroid Build Coastguard Worker     Connection            serverConn(instance, "serverConn", serverSockAddr, clientSockAddr);
547*cfb92d14SAndroid Build Coastguard Worker     Connection            clientConn(instance, "clinetConn", clientSockAddr, serverSockAddr);
548*cfb92d14SAndroid Build Coastguard Worker     Message              *message;
549*cfb92d14SAndroid Build Coastguard Worker     Dso::Tlv              tlv;
550*cfb92d14SAndroid Build Coastguard Worker     Connection::MessageId messageId;
551*cfb92d14SAndroid Build Coastguard Worker 
552*cfb92d14SAndroid Build Coastguard Worker     sNow      = 0;
553*cfb92d14SAndroid Build Coastguard Worker     sInstance = &instance;
554*cfb92d14SAndroid Build Coastguard Worker 
555*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(sConnections.PushBack(&serverConn));
556*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(sConnections.PushBack(&clientConn));
557*cfb92d14SAndroid Build Coastguard Worker 
558*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetPeerSockAddr() == clientSockAddr);
559*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetPeerSockAddr() == serverSockAddr);
560*cfb92d14SAndroid Build Coastguard Worker 
561*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
562*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
563*cfb92d14SAndroid Build Coastguard Worker 
564*cfb92d14SAndroid Build Coastguard Worker     instance.Get<Dso>().StartListening(AcceptConnection);
565*cfb92d14SAndroid Build Coastguard Worker 
566*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(instance.Get<Dso>().FindClientConnection(clientSockAddr) == nullptr);
567*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(instance.Get<Dso>().FindServerConnection(clientSockAddr) == nullptr);
568*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(instance.Get<Dso>().FindClientConnection(serverSockAddr) == nullptr);
569*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(instance.Get<Dso>().FindServerConnection(serverSockAddr) == nullptr);
570*cfb92d14SAndroid Build Coastguard Worker 
571*cfb92d14SAndroid Build Coastguard Worker     Log("-------------------------------------------------------------------------------------------");
572*cfb92d14SAndroid Build Coastguard Worker     Log("Connect from client to server");
573*cfb92d14SAndroid Build Coastguard Worker 
574*cfb92d14SAndroid Build Coastguard Worker     clientConn.Connect();
575*cfb92d14SAndroid Build Coastguard Worker 
576*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateConnectedButSessionless);
577*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateConnectedButSessionless);
578*cfb92d14SAndroid Build Coastguard Worker 
579*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.IsClient());
580*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!clientConn.IsServer());
581*cfb92d14SAndroid Build Coastguard Worker 
582*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!serverConn.IsClient());
583*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.IsServer());
584*cfb92d14SAndroid Build Coastguard Worker 
585*cfb92d14SAndroid Build Coastguard Worker     // Note that we find connection with a peer address
586*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(instance.Get<Dso>().FindClientConnection(serverSockAddr) == &clientConn);
587*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(instance.Get<Dso>().FindServerConnection(serverSockAddr) == nullptr);
588*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(instance.Get<Dso>().FindClientConnection(clientSockAddr) == nullptr);
589*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(instance.Get<Dso>().FindServerConnection(clientSockAddr) == &serverConn);
590*cfb92d14SAndroid Build Coastguard Worker 
591*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.DidGetConnectedSignal());
592*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!clientConn.DidGetSessionEstablishedSignal());
593*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!clientConn.DidGetDisconnectSignal());
594*cfb92d14SAndroid Build Coastguard Worker 
595*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.DidGetConnectedSignal());
596*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!serverConn.DidGetSessionEstablishedSignal());
597*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!serverConn.DidGetDisconnectSignal());
598*cfb92d14SAndroid Build Coastguard Worker 
599*cfb92d14SAndroid Build Coastguard Worker     Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
600*cfb92d14SAndroid Build Coastguard Worker     Log("Send keep alive message to establish connection");
601*cfb92d14SAndroid Build Coastguard Worker 
602*cfb92d14SAndroid Build Coastguard Worker     clientConn.ClearTestFlags();
603*cfb92d14SAndroid Build Coastguard Worker     serverConn.ClearTestFlags();
604*cfb92d14SAndroid Build Coastguard Worker 
605*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(clientConn.SendKeepAliveMessage());
606*cfb92d14SAndroid Build Coastguard Worker 
607*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
608*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
609*cfb92d14SAndroid Build Coastguard Worker 
610*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!clientConn.DidGetConnectedSignal());
611*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.DidGetSessionEstablishedSignal());
612*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!clientConn.DidGetDisconnectSignal());
613*cfb92d14SAndroid Build Coastguard Worker 
614*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!serverConn.DidGetConnectedSignal());
615*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.DidGetSessionEstablishedSignal());
616*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!serverConn.DidGetDisconnectSignal());
617*cfb92d14SAndroid Build Coastguard Worker 
618*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetKeepAliveInterval() == Dso::kDefaultTimeout);
619*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetInactivityTimeout() == Dso::kDefaultTimeout);
620*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetKeepAliveInterval() == Dso::kDefaultTimeout);
621*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetInactivityTimeout() == Dso::kDefaultTimeout);
622*cfb92d14SAndroid Build Coastguard Worker 
623*cfb92d14SAndroid Build Coastguard Worker     Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
624*cfb92d14SAndroid Build Coastguard Worker     Log("Close connection");
625*cfb92d14SAndroid Build Coastguard Worker 
626*cfb92d14SAndroid Build Coastguard Worker     clientConn.ClearTestFlags();
627*cfb92d14SAndroid Build Coastguard Worker     serverConn.ClearTestFlags();
628*cfb92d14SAndroid Build Coastguard Worker 
629*cfb92d14SAndroid Build Coastguard Worker     clientConn.Disconnect(Connection::kGracefullyClose, Connection::kReasonInactivityTimeout);
630*cfb92d14SAndroid Build Coastguard Worker 
631*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
632*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
633*cfb92d14SAndroid Build Coastguard Worker 
634*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
635*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonPeerClosed);
636*cfb92d14SAndroid Build Coastguard Worker 
637*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!clientConn.DidGetConnectedSignal());
638*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!clientConn.DidGetSessionEstablishedSignal());
639*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!clientConn.DidGetDisconnectSignal());
640*cfb92d14SAndroid Build Coastguard Worker 
641*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!serverConn.DidGetConnectedSignal());
642*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!serverConn.DidGetSessionEstablishedSignal());
643*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.DidGetDisconnectSignal());
644*cfb92d14SAndroid Build Coastguard Worker 
645*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(instance.Get<Dso>().FindClientConnection(clientSockAddr) == nullptr);
646*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(instance.Get<Dso>().FindServerConnection(clientSockAddr) == nullptr);
647*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(instance.Get<Dso>().FindClientConnection(serverSockAddr) == nullptr);
648*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(instance.Get<Dso>().FindServerConnection(serverSockAddr) == nullptr);
649*cfb92d14SAndroid Build Coastguard Worker 
650*cfb92d14SAndroid Build Coastguard Worker     Log("-------------------------------------------------------------------------------------------");
651*cfb92d14SAndroid Build Coastguard Worker     Log("Connection timeout when server is not listening");
652*cfb92d14SAndroid Build Coastguard Worker 
653*cfb92d14SAndroid Build Coastguard Worker     instance.Get<Dso>().StopListening();
654*cfb92d14SAndroid Build Coastguard Worker 
655*cfb92d14SAndroid Build Coastguard Worker     clientConn.ClearTestFlags();
656*cfb92d14SAndroid Build Coastguard Worker 
657*cfb92d14SAndroid Build Coastguard Worker     clientConn.Connect();
658*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateConnecting);
659*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(instance.Get<Dso>().FindClientConnection(serverSockAddr) == &clientConn);
660*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(instance.Get<Dso>().FindServerConnection(serverSockAddr) == nullptr);
661*cfb92d14SAndroid Build Coastguard Worker 
662*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(Dso::kConnectingTimeout);
663*cfb92d14SAndroid Build Coastguard Worker 
664*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
665*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonFailedToConnect);
666*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(instance.Get<Dso>().FindClientConnection(serverSockAddr) == nullptr);
667*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(instance.Get<Dso>().FindServerConnection(serverSockAddr) == nullptr);
668*cfb92d14SAndroid Build Coastguard Worker 
669*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!clientConn.DidGetConnectedSignal());
670*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!clientConn.DidGetSessionEstablishedSignal());
671*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.DidGetDisconnectSignal());
672*cfb92d14SAndroid Build Coastguard Worker 
673*cfb92d14SAndroid Build Coastguard Worker     Log("-------------------------------------------------------------------------------------------");
674*cfb92d14SAndroid Build Coastguard Worker     Log("Keep Alive Timeout behavior");
675*cfb92d14SAndroid Build Coastguard Worker 
676*cfb92d14SAndroid Build Coastguard Worker     // Keep Alive timeout smaller than min value should be rejected.
677*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.SetTimeouts(Dso::kInfiniteTimeout, Dso::kMinKeepAliveInterval - 1) == kErrorInvalidArgs);
678*cfb92d14SAndroid Build Coastguard Worker 
679*cfb92d14SAndroid Build Coastguard Worker     instance.Get<Dso>().StartListening(AcceptConnection);
680*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SetTimeouts(Dso::kInfiniteTimeout, Dso::kMinKeepAliveInterval));
681*cfb92d14SAndroid Build Coastguard Worker 
682*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetKeepAliveInterval() == Dso::kMinKeepAliveInterval);
683*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetInactivityTimeout() == Dso::kInfiniteTimeout);
684*cfb92d14SAndroid Build Coastguard Worker 
685*cfb92d14SAndroid Build Coastguard Worker     clientConn.Connect();
686*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(clientConn.SendKeepAliveMessage());
687*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
688*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
689*cfb92d14SAndroid Build Coastguard Worker 
690*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetKeepAliveInterval() == Dso::kMinKeepAliveInterval);
691*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetInactivityTimeout() == Dso::kInfiniteTimeout);
692*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetKeepAliveInterval() == Dso::kMinKeepAliveInterval);
693*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetInactivityTimeout() == Dso::kInfiniteTimeout);
694*cfb92d14SAndroid Build Coastguard Worker 
695*cfb92d14SAndroid Build Coastguard Worker     VerifyKeepAliveExchange(clientConn, serverConn, Dso::kMinKeepAliveInterval);
696*cfb92d14SAndroid Build Coastguard Worker 
697*cfb92d14SAndroid Build Coastguard Worker     Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
698*cfb92d14SAndroid Build Coastguard Worker     Log("Change Keep Alive interval on server");
699*cfb92d14SAndroid Build Coastguard Worker 
700*cfb92d14SAndroid Build Coastguard Worker     clientConn.ClearTestFlags();
701*cfb92d14SAndroid Build Coastguard Worker     serverConn.ClearTestFlags();
702*cfb92d14SAndroid Build Coastguard Worker 
703*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SetTimeouts(Dso::kInfiniteTimeout, Dso::kDefaultTimeout));
704*cfb92d14SAndroid Build Coastguard Worker 
705*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.DidSendMessage());
706*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.DidReceiveMessage());
707*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!clientConn.DidSendMessage());
708*cfb92d14SAndroid Build Coastguard Worker 
709*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetKeepAliveInterval() == Dso::kDefaultTimeout);
710*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetInactivityTimeout() == Dso::kInfiniteTimeout);
711*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetKeepAliveInterval() == Dso::kDefaultTimeout);
712*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetInactivityTimeout() == Dso::kInfiniteTimeout);
713*cfb92d14SAndroid Build Coastguard Worker 
714*cfb92d14SAndroid Build Coastguard Worker     VerifyKeepAliveExchange(clientConn, serverConn, Dso::kDefaultTimeout);
715*cfb92d14SAndroid Build Coastguard Worker 
716*cfb92d14SAndroid Build Coastguard Worker     Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
717*cfb92d14SAndroid Build Coastguard Worker     Log("Keep Alive timer clear on message send or receive");
718*cfb92d14SAndroid Build Coastguard Worker 
719*cfb92d14SAndroid Build Coastguard Worker     clientConn.ClearTestFlags();
720*cfb92d14SAndroid Build Coastguard Worker     serverConn.ClearTestFlags();
721*cfb92d14SAndroid Build Coastguard Worker 
722*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(Dso::kDefaultTimeout / 2);
723*cfb92d14SAndroid Build Coastguard Worker 
724*cfb92d14SAndroid Build Coastguard Worker     clientConn.SendTestUnidirectionalMessage();
725*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.DidSendMessage());
726*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.DidReceiveMessage());
727*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!serverConn.DidSendMessage());
728*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
729*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
730*cfb92d14SAndroid Build Coastguard Worker     Log("Sent unidirectional message (client->server) at half the keep alive interval");
731*cfb92d14SAndroid Build Coastguard Worker     VerifyKeepAliveExchange(clientConn, serverConn, Dso::kDefaultTimeout, 1);
732*cfb92d14SAndroid Build Coastguard Worker 
733*cfb92d14SAndroid Build Coastguard Worker     clientConn.ClearTestFlags();
734*cfb92d14SAndroid Build Coastguard Worker     serverConn.ClearTestFlags();
735*cfb92d14SAndroid Build Coastguard Worker 
736*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(Dso::kDefaultTimeout / 2);
737*cfb92d14SAndroid Build Coastguard Worker 
738*cfb92d14SAndroid Build Coastguard Worker     serverConn.SendTestUnidirectionalMessage();
739*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.DidSendMessage());
740*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.DidReceiveMessage());
741*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!clientConn.DidSendMessage());
742*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
743*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
744*cfb92d14SAndroid Build Coastguard Worker     Log("Sent unidirectional message (server->client) at half the keep alive interval");
745*cfb92d14SAndroid Build Coastguard Worker     VerifyKeepAliveExchange(clientConn, serverConn, Dso::kDefaultTimeout, 1);
746*cfb92d14SAndroid Build Coastguard Worker 
747*cfb92d14SAndroid Build Coastguard Worker     Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
748*cfb92d14SAndroid Build Coastguard Worker     Log("Keep Alive timeout on server");
749*cfb92d14SAndroid Build Coastguard Worker 
750*cfb92d14SAndroid Build Coastguard Worker     clientConn.ClearTestFlags();
751*cfb92d14SAndroid Build Coastguard Worker     serverConn.ClearTestFlags();
752*cfb92d14SAndroid Build Coastguard Worker 
753*cfb92d14SAndroid Build Coastguard Worker     Log("Drop all sent message (drop Keep Alive msg from client->server)");
754*cfb92d14SAndroid Build Coastguard Worker     sTestDsoForwardMessageToPeer = false;
755*cfb92d14SAndroid Build Coastguard Worker 
756*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(Dso::kDefaultTimeout);
757*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.DidSendMessage());
758*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!serverConn.DidReceiveMessage());
759*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
760*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
761*cfb92d14SAndroid Build Coastguard Worker 
762*cfb92d14SAndroid Build Coastguard Worker     Log("Sever waits for twice the interval before Keep Alive timeout");
763*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(Dso::kDefaultTimeout);
764*cfb92d14SAndroid Build Coastguard Worker 
765*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
766*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonKeepAliveTimeout);
767*cfb92d14SAndroid Build Coastguard Worker 
768*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
769*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonPeerAborted);
770*cfb92d14SAndroid Build Coastguard Worker     Log("Server aborted connection on Keep Alive timeout");
771*cfb92d14SAndroid Build Coastguard Worker     sTestDsoForwardMessageToPeer = true;
772*cfb92d14SAndroid Build Coastguard Worker 
773*cfb92d14SAndroid Build Coastguard Worker     Log("-------------------------------------------------------------------------------------------");
774*cfb92d14SAndroid Build Coastguard Worker     Log("Inactivity Timeout behavior");
775*cfb92d14SAndroid Build Coastguard Worker 
776*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SetTimeouts(Dso::kDefaultTimeout, Dso::kMinKeepAliveInterval));
777*cfb92d14SAndroid Build Coastguard Worker 
778*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetKeepAliveInterval() == Dso::kMinKeepAliveInterval);
779*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetInactivityTimeout() == Dso::kDefaultTimeout);
780*cfb92d14SAndroid Build Coastguard Worker 
781*cfb92d14SAndroid Build Coastguard Worker     clientConn.Connect();
782*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(clientConn.SendKeepAliveMessage());
783*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
784*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
785*cfb92d14SAndroid Build Coastguard Worker 
786*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetKeepAliveInterval() == Dso::kMinKeepAliveInterval);
787*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetInactivityTimeout() == Dso::kDefaultTimeout);
788*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetKeepAliveInterval() == Dso::kMinKeepAliveInterval);
789*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetInactivityTimeout() == Dso::kDefaultTimeout);
790*cfb92d14SAndroid Build Coastguard Worker 
791*cfb92d14SAndroid Build Coastguard Worker     Log("Sending a unidirectional message should clear inactivity timer");
792*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(Dso::kDefaultTimeout / 2);
793*cfb92d14SAndroid Build Coastguard Worker     clientConn.SendTestUnidirectionalMessage();
794*cfb92d14SAndroid Build Coastguard Worker 
795*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(Dso::kDefaultTimeout - 1);
796*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
797*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
798*cfb92d14SAndroid Build Coastguard Worker     Log("Client keeps the connection up to the inactivity timeout");
799*cfb92d14SAndroid Build Coastguard Worker 
800*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(1);
801*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
802*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
803*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
804*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonPeerClosed);
805*cfb92d14SAndroid Build Coastguard Worker     Log("Client closes the connection gracefully on inactivity timeout");
806*cfb92d14SAndroid Build Coastguard Worker 
807*cfb92d14SAndroid Build Coastguard Worker     Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
808*cfb92d14SAndroid Build Coastguard Worker     Log("Increasing inactivity timeout in middle");
809*cfb92d14SAndroid Build Coastguard Worker 
810*cfb92d14SAndroid Build Coastguard Worker     clientConn.Connect();
811*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(clientConn.SendKeepAliveMessage());
812*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
813*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
814*cfb92d14SAndroid Build Coastguard Worker 
815*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(TimeMilli::SecToMsec(10));
816*cfb92d14SAndroid Build Coastguard Worker     Log("After 10 sec elapses, change the inactivity timeout from 15 to 20 sec");
817*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SetTimeouts(TimeMilli::SecToMsec(20), Dso::kMinKeepAliveInterval));
818*cfb92d14SAndroid Build Coastguard Worker 
819*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(TimeMilli::SecToMsec(10) - 1);
820*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
821*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
822*cfb92d14SAndroid Build Coastguard Worker     Log("Client keeps the connection up to new 20 sec inactivity timeout");
823*cfb92d14SAndroid Build Coastguard Worker 
824*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(1);
825*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
826*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
827*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
828*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonPeerClosed);
829*cfb92d14SAndroid Build Coastguard Worker     Log("Client closes the connection gracefully on inactivity timeout of 20 sec");
830*cfb92d14SAndroid Build Coastguard Worker 
831*cfb92d14SAndroid Build Coastguard Worker     Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
832*cfb92d14SAndroid Build Coastguard Worker     Log("Decreasing inactivity timeout in middle");
833*cfb92d14SAndroid Build Coastguard Worker 
834*cfb92d14SAndroid Build Coastguard Worker     clientConn.Connect();
835*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(clientConn.SendKeepAliveMessage());
836*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
837*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
838*cfb92d14SAndroid Build Coastguard Worker 
839*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(TimeMilli::SecToMsec(10));
840*cfb92d14SAndroid Build Coastguard Worker     Log("After 10 sec elapses, change the inactivity timeout from 15 to 10 sec");
841*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SetTimeouts(TimeMilli::SecToMsec(10), Dso::kMinKeepAliveInterval));
842*cfb92d14SAndroid Build Coastguard Worker 
843*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(0);
844*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
845*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
846*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
847*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonPeerClosed);
848*cfb92d14SAndroid Build Coastguard Worker     Log("Client closes the connection gracefully on new shorter inactivity timeout of 10 sec");
849*cfb92d14SAndroid Build Coastguard Worker 
850*cfb92d14SAndroid Build Coastguard Worker     Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
851*cfb92d14SAndroid Build Coastguard Worker     Log("Changing inactivity timeout from infinite to finite");
852*cfb92d14SAndroid Build Coastguard Worker 
853*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SetTimeouts(Dso::kDefaultTimeout, Dso::kInfiniteTimeout));
854*cfb92d14SAndroid Build Coastguard Worker     clientConn.Connect();
855*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(clientConn.SendKeepAliveMessage());
856*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
857*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
858*cfb92d14SAndroid Build Coastguard Worker 
859*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(TimeMilli::SecToMsec(6));
860*cfb92d14SAndroid Build Coastguard Worker     Log("After 6 sec, change the inactivity to infinite");
861*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SetTimeouts(Dso::kInfiniteTimeout, Dso::kInfiniteTimeout));
862*cfb92d14SAndroid Build Coastguard Worker 
863*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(TimeMilli::SecToMsec(4));
864*cfb92d14SAndroid Build Coastguard Worker     Log("After 4 sec, change the inactivity timeout from infinite to 20 sec");
865*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SetTimeouts(TimeMilli::SecToMsec(20), Dso::kInfiniteTimeout));
866*cfb92d14SAndroid Build Coastguard Worker 
867*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(TimeMilli::SecToMsec(10) - 1);
868*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
869*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
870*cfb92d14SAndroid Build Coastguard Worker 
871*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(1);
872*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
873*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
874*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
875*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonPeerClosed);
876*cfb92d14SAndroid Build Coastguard Worker     Log("Client closes the connection gracefully after 20 sec since last activity");
877*cfb92d14SAndroid Build Coastguard Worker 
878*cfb92d14SAndroid Build Coastguard Worker     Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
879*cfb92d14SAndroid Build Coastguard Worker     Log("Tracking activity while inactivity timeout is infinite");
880*cfb92d14SAndroid Build Coastguard Worker 
881*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SetTimeouts(Dso::kInfiniteTimeout, Dso::kInfiniteTimeout));
882*cfb92d14SAndroid Build Coastguard Worker     clientConn.Connect();
883*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(clientConn.SendKeepAliveMessage());
884*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
885*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
886*cfb92d14SAndroid Build Coastguard Worker 
887*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(TimeMilli::SecToMsec(7));
888*cfb92d14SAndroid Build Coastguard Worker     Log("After 7 sec, send a test message, this clears inactivity timer");
889*cfb92d14SAndroid Build Coastguard Worker     serverConn.SendTestUnidirectionalMessage();
890*cfb92d14SAndroid Build Coastguard Worker 
891*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(TimeMilli::SecToMsec(10));
892*cfb92d14SAndroid Build Coastguard Worker     Log("After 10 sec, change the inactivity timeout from infinite to 15 sec");
893*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SetTimeouts(TimeMilli::SecToMsec(15), Dso::kInfiniteTimeout));
894*cfb92d14SAndroid Build Coastguard Worker 
895*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(TimeMilli::SecToMsec(5) - 1);
896*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
897*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
898*cfb92d14SAndroid Build Coastguard Worker 
899*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(1);
900*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
901*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
902*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
903*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonPeerClosed);
904*cfb92d14SAndroid Build Coastguard Worker     Log("Client closes the connection gracefully after 15 sec since last activity");
905*cfb92d14SAndroid Build Coastguard Worker 
906*cfb92d14SAndroid Build Coastguard Worker     Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
907*cfb92d14SAndroid Build Coastguard Worker     Log("Inactivity timeout on server");
908*cfb92d14SAndroid Build Coastguard Worker 
909*cfb92d14SAndroid Build Coastguard Worker     clientConn.Connect();
910*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(clientConn.SendKeepAliveMessage());
911*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
912*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
913*cfb92d14SAndroid Build Coastguard Worker 
914*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SetTimeouts(Dso::kDefaultTimeout, Dso::kInfiniteTimeout));
915*cfb92d14SAndroid Build Coastguard Worker 
916*cfb92d14SAndroid Build Coastguard Worker     Log("Wait for inactivity timeout and ensure client disconnect");
917*cfb92d14SAndroid Build Coastguard Worker     Log("Configure test for client not to signal its disconnect to server");
918*cfb92d14SAndroid Build Coastguard Worker     sTestDsoSignalDisconnectToPeer = false;
919*cfb92d14SAndroid Build Coastguard Worker 
920*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(Dso::kDefaultTimeout);
921*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
922*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
923*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
924*cfb92d14SAndroid Build Coastguard Worker     sTestDsoSignalDisconnectToPeer = true;
925*cfb92d14SAndroid Build Coastguard Worker 
926*cfb92d14SAndroid Build Coastguard Worker     Log("Server should disconnect after twice the inactivity timeout");
927*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(Dso::kDefaultTimeout - 1);
928*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
929*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(1);
930*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
931*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
932*cfb92d14SAndroid Build Coastguard Worker 
933*cfb92d14SAndroid Build Coastguard Worker     Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
934*cfb92d14SAndroid Build Coastguard Worker     Log("Server reducing inactivity timeout to expired (on server)");
935*cfb92d14SAndroid Build Coastguard Worker 
936*cfb92d14SAndroid Build Coastguard Worker     clientConn.Connect();
937*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(clientConn.SendKeepAliveMessage());
938*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
939*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
940*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SetTimeouts(Dso::kDefaultTimeout, Dso::kInfiniteTimeout));
941*cfb92d14SAndroid Build Coastguard Worker 
942*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(TimeMilli::SecToMsec(10));
943*cfb92d14SAndroid Build Coastguard Worker     Log("After 11 sec elapses, change the inactivity timeout from 15 to 2 sec");
944*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SetTimeouts(TimeMilli::SecToMsec(2), Dso::kMinKeepAliveInterval));
945*cfb92d14SAndroid Build Coastguard Worker 
946*cfb92d14SAndroid Build Coastguard Worker     sTestDsoSignalDisconnectToPeer = false;
947*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(0);
948*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
949*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
950*cfb92d14SAndroid Build Coastguard Worker     sTestDsoSignalDisconnectToPeer = true;
951*cfb92d14SAndroid Build Coastguard Worker     Log("Client closes the connection gracefully on expired timeout");
952*cfb92d14SAndroid Build Coastguard Worker     Log("Configure test for client not to signal its disconnect to server");
953*cfb92d14SAndroid Build Coastguard Worker 
954*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(Dso::kMinServerInactivityWaitTime - 1);
955*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
956*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(1);
957*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
958*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
959*cfb92d14SAndroid Build Coastguard Worker     Log("Server wait for kMinServerInactivityWaitTime (5 sec) before closing on expired timeout");
960*cfb92d14SAndroid Build Coastguard Worker 
961*cfb92d14SAndroid Build Coastguard Worker     Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
962*cfb92d14SAndroid Build Coastguard Worker     Log("Long-lived operation");
963*cfb92d14SAndroid Build Coastguard Worker 
964*cfb92d14SAndroid Build Coastguard Worker     clientConn.Connect();
965*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(clientConn.SendKeepAliveMessage());
966*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
967*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
968*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SetTimeouts(Dso::kDefaultTimeout, Dso::kInfiniteTimeout));
969*cfb92d14SAndroid Build Coastguard Worker 
970*cfb92d14SAndroid Build Coastguard Worker     clientConn.SetLongLivedOperation(true);
971*cfb92d14SAndroid Build Coastguard Worker     serverConn.SetLongLivedOperation(true);
972*cfb92d14SAndroid Build Coastguard Worker 
973*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(2 * Dso::kDefaultTimeout);
974*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
975*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
976*cfb92d14SAndroid Build Coastguard Worker 
977*cfb92d14SAndroid Build Coastguard Worker     clientConn.SetLongLivedOperation(false);
978*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(0);
979*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
980*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
981*cfb92d14SAndroid Build Coastguard Worker 
982*cfb92d14SAndroid Build Coastguard Worker     Log("-------------------------------------------------------------------------------------------");
983*cfb92d14SAndroid Build Coastguard Worker     Log("Request, response, and unidirectional message exchange");
984*cfb92d14SAndroid Build Coastguard Worker 
985*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SetTimeouts(Dso::kDefaultTimeout, Dso::kDefaultTimeout));
986*cfb92d14SAndroid Build Coastguard Worker     clientConn.Connect();
987*cfb92d14SAndroid Build Coastguard Worker 
988*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateConnectedButSessionless);
989*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateConnectedButSessionless);
990*cfb92d14SAndroid Build Coastguard Worker 
991*cfb92d14SAndroid Build Coastguard Worker     clientConn.ClearTestFlags();
992*cfb92d14SAndroid Build Coastguard Worker     serverConn.ClearTestFlags();
993*cfb92d14SAndroid Build Coastguard Worker 
994*cfb92d14SAndroid Build Coastguard Worker     Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
995*cfb92d14SAndroid Build Coastguard Worker     Log("Establish connection using test message request/response");
996*cfb92d14SAndroid Build Coastguard Worker     clientConn.SendTestRequestMessage();
997*cfb92d14SAndroid Build Coastguard Worker 
998*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
999*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1000*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.DidProcessRequest());
1001*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.DidProcessResponse());
1002*cfb92d14SAndroid Build Coastguard Worker 
1003*cfb92d14SAndroid Build Coastguard Worker     Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
1004*cfb92d14SAndroid Build Coastguard Worker     Log("Send unidirectional test message");
1005*cfb92d14SAndroid Build Coastguard Worker 
1006*cfb92d14SAndroid Build Coastguard Worker     serverConn.ClearTestFlags();
1007*cfb92d14SAndroid Build Coastguard Worker     clientConn.SendTestUnidirectionalMessage(0x10);
1008*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.DidProcessUnidirectional());
1009*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetLastRxTestTlvValue() == 0x10);
1010*cfb92d14SAndroid Build Coastguard Worker 
1011*cfb92d14SAndroid Build Coastguard Worker     clientConn.ClearTestFlags();
1012*cfb92d14SAndroid Build Coastguard Worker     serverConn.SendTestUnidirectionalMessage(0x20);
1013*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.DidProcessUnidirectional());
1014*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetLastRxTestTlvValue() == 0x20);
1015*cfb92d14SAndroid Build Coastguard Worker 
1016*cfb92d14SAndroid Build Coastguard Worker     Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
1017*cfb92d14SAndroid Build Coastguard Worker     Log("Exchange request and response");
1018*cfb92d14SAndroid Build Coastguard Worker 
1019*cfb92d14SAndroid Build Coastguard Worker     clientConn.ClearTestFlags();
1020*cfb92d14SAndroid Build Coastguard Worker     serverConn.ClearTestFlags();
1021*cfb92d14SAndroid Build Coastguard Worker     serverConn.SendTestRequestMessage(0x30);
1022*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.DidProcessRequest());
1023*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!clientConn.DidProcessResponse());
1024*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!serverConn.DidProcessRequest());
1025*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.DidProcessResponse());
1026*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetLastRxTestTlvValue() == 0x30);
1027*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetLastRxTestTlvValue() == 0x30);
1028*cfb92d14SAndroid Build Coastguard Worker 
1029*cfb92d14SAndroid Build Coastguard Worker     clientConn.ClearTestFlags();
1030*cfb92d14SAndroid Build Coastguard Worker     serverConn.ClearTestFlags();
1031*cfb92d14SAndroid Build Coastguard Worker     clientConn.SendTestRequestMessage(0x40);
1032*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!clientConn.DidProcessRequest());
1033*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.DidProcessResponse());
1034*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.DidProcessRequest());
1035*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!serverConn.DidProcessResponse());
1036*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetLastRxTestTlvValue() == 0x40);
1037*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetLastRxTestTlvValue() == 0x40);
1038*cfb92d14SAndroid Build Coastguard Worker 
1039*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
1040*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1041*cfb92d14SAndroid Build Coastguard Worker 
1042*cfb92d14SAndroid Build Coastguard Worker     Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
1043*cfb92d14SAndroid Build Coastguard Worker     Log("Send unknown TLV request");
1044*cfb92d14SAndroid Build Coastguard Worker 
1045*cfb92d14SAndroid Build Coastguard Worker     clientConn.ClearTestFlags();
1046*cfb92d14SAndroid Build Coastguard Worker     serverConn.ClearTestFlags();
1047*cfb92d14SAndroid Build Coastguard Worker 
1048*cfb92d14SAndroid Build Coastguard Worker     message = clientConn.NewMessage();
1049*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(message != nullptr);
1050*cfb92d14SAndroid Build Coastguard Worker     tlv.Init(kUnknownTlvType, 0);
1051*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(message->Append(tlv));
1052*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(clientConn.SendRequestMessage(*message, messageId));
1053*cfb92d14SAndroid Build Coastguard Worker 
1054*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!clientConn.DidProcessRequest());
1055*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.DidProcessResponse());
1056*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.DidProcessRequest());
1057*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!serverConn.DidProcessResponse());
1058*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetLastRxResponseCode() == Dns::Header::kDsoTypeNotImplemented);
1059*cfb92d14SAndroid Build Coastguard Worker     Log("Received a response with DSO Type Unknown error code");
1060*cfb92d14SAndroid Build Coastguard Worker 
1061*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
1062*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1063*cfb92d14SAndroid Build Coastguard Worker 
1064*cfb92d14SAndroid Build Coastguard Worker     Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
1065*cfb92d14SAndroid Build Coastguard Worker     Log("Send unknown TLV unidirectional");
1066*cfb92d14SAndroid Build Coastguard Worker 
1067*cfb92d14SAndroid Build Coastguard Worker     clientConn.ClearTestFlags();
1068*cfb92d14SAndroid Build Coastguard Worker     serverConn.ClearTestFlags();
1069*cfb92d14SAndroid Build Coastguard Worker 
1070*cfb92d14SAndroid Build Coastguard Worker     message = clientConn.NewMessage();
1071*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(message != nullptr);
1072*cfb92d14SAndroid Build Coastguard Worker     tlv.Init(kUnknownTlvType, 0);
1073*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(message->Append(tlv));
1074*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(clientConn.SendUnidirectionalMessage(*message));
1075*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.DidProcessUnidirectional());
1076*cfb92d14SAndroid Build Coastguard Worker     Log("Unknown TLV unidirectional is correctly ignored");
1077*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
1078*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1079*cfb92d14SAndroid Build Coastguard Worker 
1080*cfb92d14SAndroid Build Coastguard Worker     Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
1081*cfb92d14SAndroid Build Coastguard Worker     Log("Send malformed/invalid request");
1082*cfb92d14SAndroid Build Coastguard Worker 
1083*cfb92d14SAndroid Build Coastguard Worker     clientConn.ClearTestFlags();
1084*cfb92d14SAndroid Build Coastguard Worker     serverConn.ClearTestFlags();
1085*cfb92d14SAndroid Build Coastguard Worker 
1086*cfb92d14SAndroid Build Coastguard Worker     message = clientConn.NewMessage();
1087*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(message != nullptr);
1088*cfb92d14SAndroid Build Coastguard Worker     tlv.Init(Dso::Tlv::kEncryptionPaddingType, 0);
1089*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(message->Append(tlv));
1090*cfb92d14SAndroid Build Coastguard Worker 
1091*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SendRequestMessage(*message, messageId));
1092*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
1093*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
1094*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonPeerMisbehavior);
1095*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonPeerAborted);
1096*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.DidGetDisconnectSignal());
1097*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.DidGetDisconnectSignal());
1098*cfb92d14SAndroid Build Coastguard Worker     Log("Client aborted on invalid request message");
1099*cfb92d14SAndroid Build Coastguard Worker 
1100*cfb92d14SAndroid Build Coastguard Worker     Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
1101*cfb92d14SAndroid Build Coastguard Worker     Log("Response timeout during session establishment");
1102*cfb92d14SAndroid Build Coastguard Worker 
1103*cfb92d14SAndroid Build Coastguard Worker     clientConn.ClearTestFlags();
1104*cfb92d14SAndroid Build Coastguard Worker     serverConn.ClearTestFlags();
1105*cfb92d14SAndroid Build Coastguard Worker 
1106*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SetTimeouts(Dso::kResponseTimeout, Dso::kInfiniteTimeout));
1107*cfb92d14SAndroid Build Coastguard Worker     clientConn.Connect();
1108*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateConnectedButSessionless);
1109*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateConnectedButSessionless);
1110*cfb92d14SAndroid Build Coastguard Worker 
1111*cfb92d14SAndroid Build Coastguard Worker     sTestDsoForwardMessageToPeer = false;
1112*cfb92d14SAndroid Build Coastguard Worker     clientConn.SendTestRequestMessage();
1113*cfb92d14SAndroid Build Coastguard Worker     sTestDsoForwardMessageToPeer = true;
1114*cfb92d14SAndroid Build Coastguard Worker 
1115*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateEstablishingSession);
1116*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateConnectedButSessionless);
1117*cfb92d14SAndroid Build Coastguard Worker 
1118*cfb92d14SAndroid Build Coastguard Worker     sTestDsoSignalDisconnectToPeer = false;
1119*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(Dso::kResponseTimeout);
1120*cfb92d14SAndroid Build Coastguard Worker     sTestDsoSignalDisconnectToPeer = true;
1121*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
1122*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonResponseTimeout);
1123*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.DidGetDisconnectSignal());
1124*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateConnectedButSessionless);
1125*cfb92d14SAndroid Build Coastguard Worker     Log("Client disconnected after response timeout");
1126*cfb92d14SAndroid Build Coastguard Worker 
1127*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(Dso::kResponseTimeout);
1128*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
1129*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
1130*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.DidGetDisconnectSignal());
1131*cfb92d14SAndroid Build Coastguard Worker     Log("Server disconnected after twice the inactivity timeout");
1132*cfb92d14SAndroid Build Coastguard Worker 
1133*cfb92d14SAndroid Build Coastguard Worker     Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
1134*cfb92d14SAndroid Build Coastguard Worker     Log("Response timeout after session establishment");
1135*cfb92d14SAndroid Build Coastguard Worker 
1136*cfb92d14SAndroid Build Coastguard Worker     clientConn.ClearTestFlags();
1137*cfb92d14SAndroid Build Coastguard Worker     serverConn.ClearTestFlags();
1138*cfb92d14SAndroid Build Coastguard Worker 
1139*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SetTimeouts(Dso::kInfiniteTimeout, Dso::kInfiniteTimeout));
1140*cfb92d14SAndroid Build Coastguard Worker     clientConn.Connect();
1141*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(clientConn.SendKeepAliveMessage());
1142*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
1143*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1144*cfb92d14SAndroid Build Coastguard Worker 
1145*cfb92d14SAndroid Build Coastguard Worker     sTestDsoForwardMessageToPeer = false;
1146*cfb92d14SAndroid Build Coastguard Worker     serverConn.SendTestRequestMessage();
1147*cfb92d14SAndroid Build Coastguard Worker     sTestDsoForwardMessageToPeer = true;
1148*cfb92d14SAndroid Build Coastguard Worker 
1149*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
1150*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1151*cfb92d14SAndroid Build Coastguard Worker 
1152*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(Dso::kResponseTimeout - 1);
1153*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
1154*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1155*cfb92d14SAndroid Build Coastguard Worker 
1156*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(1);
1157*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
1158*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
1159*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonResponseTimeout);
1160*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonPeerAborted);
1161*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.DidGetDisconnectSignal());
1162*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.DidGetDisconnectSignal());
1163*cfb92d14SAndroid Build Coastguard Worker 
1164*cfb92d14SAndroid Build Coastguard Worker     clientConn.ClearTestFlags();
1165*cfb92d14SAndroid Build Coastguard Worker     serverConn.ClearTestFlags();
1166*cfb92d14SAndroid Build Coastguard Worker 
1167*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SetTimeouts(Dso::kInfiniteTimeout, Dso::kInfiniteTimeout));
1168*cfb92d14SAndroid Build Coastguard Worker     clientConn.Connect();
1169*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(clientConn.SendKeepAliveMessage());
1170*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
1171*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1172*cfb92d14SAndroid Build Coastguard Worker 
1173*cfb92d14SAndroid Build Coastguard Worker     sTestDsoForwardMessageToPeer = false;
1174*cfb92d14SAndroid Build Coastguard Worker     serverConn.SendTestRequestMessage(0, kLongResponseTimeout);
1175*cfb92d14SAndroid Build Coastguard Worker     sTestDsoForwardMessageToPeer = true;
1176*cfb92d14SAndroid Build Coastguard Worker 
1177*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
1178*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1179*cfb92d14SAndroid Build Coastguard Worker 
1180*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(kLongResponseTimeout - 1);
1181*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
1182*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1183*cfb92d14SAndroid Build Coastguard Worker 
1184*cfb92d14SAndroid Build Coastguard Worker     AdvanceTime(1);
1185*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
1186*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
1187*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonResponseTimeout);
1188*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonPeerAborted);
1189*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.DidGetDisconnectSignal());
1190*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.DidGetDisconnectSignal());
1191*cfb92d14SAndroid Build Coastguard Worker 
1192*cfb92d14SAndroid Build Coastguard Worker     Log("-------------------------------------------------------------------------------------------");
1193*cfb92d14SAndroid Build Coastguard Worker     Log("Retry Delay message");
1194*cfb92d14SAndroid Build Coastguard Worker 
1195*cfb92d14SAndroid Build Coastguard Worker     clientConn.ClearTestFlags();
1196*cfb92d14SAndroid Build Coastguard Worker     serverConn.ClearTestFlags();
1197*cfb92d14SAndroid Build Coastguard Worker 
1198*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SetTimeouts(Dso::kInfiniteTimeout, Dso::kInfiniteTimeout));
1199*cfb92d14SAndroid Build Coastguard Worker     clientConn.Connect();
1200*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(clientConn.SendKeepAliveMessage());
1201*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
1202*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1203*cfb92d14SAndroid Build Coastguard Worker 
1204*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(serverConn.SendRetryDelayMessage(kRetryDelayInterval, Dns::Header::kResponseServerFailure));
1205*cfb92d14SAndroid Build Coastguard Worker 
1206*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
1207*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
1208*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.DidGetDisconnectSignal());
1209*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.DidGetDisconnectSignal());
1210*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonServerRetryDelayRequest);
1211*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonPeerClosed);
1212*cfb92d14SAndroid Build Coastguard Worker 
1213*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetRetryDelay() == kRetryDelayInterval);
1214*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(clientConn.GetRetryDelayErrorCode() == Dns::Header::kResponseServerFailure);
1215*cfb92d14SAndroid Build Coastguard Worker 
1216*cfb92d14SAndroid Build Coastguard Worker     Log("End of test");
1217*cfb92d14SAndroid Build Coastguard Worker 
1218*cfb92d14SAndroid Build Coastguard Worker     testFreeInstance(&instance);
1219*cfb92d14SAndroid Build Coastguard Worker }
1220*cfb92d14SAndroid Build Coastguard Worker 
1221*cfb92d14SAndroid Build Coastguard Worker } // namespace Dns
1222*cfb92d14SAndroid Build Coastguard Worker 
1223*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_DNS_DSO_ENABLE
1224*cfb92d14SAndroid Build Coastguard Worker 
1225*cfb92d14SAndroid Build Coastguard Worker } // namespace ot
1226*cfb92d14SAndroid Build Coastguard Worker 
main(void)1227*cfb92d14SAndroid Build Coastguard Worker int main(void)
1228*cfb92d14SAndroid Build Coastguard Worker {
1229*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DNS_DSO_ENABLE
1230*cfb92d14SAndroid Build Coastguard Worker     ot::Dns::TestDso();
1231*cfb92d14SAndroid Build Coastguard Worker     printf("All tests passed\n");
1232*cfb92d14SAndroid Build Coastguard Worker #else
1233*cfb92d14SAndroid Build Coastguard Worker     printf("DSO feature is not enabled\n");
1234*cfb92d14SAndroid Build Coastguard Worker #endif
1235*cfb92d14SAndroid Build Coastguard Worker 
1236*cfb92d14SAndroid Build Coastguard Worker     return 0;
1237*cfb92d14SAndroid Build Coastguard Worker }
1238