1*4a64e381SAndroid Build Coastguard Worker /*
2*4a64e381SAndroid Build Coastguard Worker * Copyright (c) 2020, The OpenThread Authors.
3*4a64e381SAndroid Build Coastguard Worker * All rights reserved.
4*4a64e381SAndroid Build Coastguard Worker *
5*4a64e381SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
6*4a64e381SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met:
7*4a64e381SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
8*4a64e381SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
9*4a64e381SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
10*4a64e381SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
11*4a64e381SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
12*4a64e381SAndroid Build Coastguard Worker * 3. Neither the name of the copyright holder nor the
13*4a64e381SAndroid Build Coastguard Worker * names of its contributors may be used to endorse or promote products
14*4a64e381SAndroid Build Coastguard Worker * derived from this software without specific prior written permission.
15*4a64e381SAndroid Build Coastguard Worker *
16*4a64e381SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*4a64e381SAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*4a64e381SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*4a64e381SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20*4a64e381SAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*4a64e381SAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*4a64e381SAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*4a64e381SAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*4a64e381SAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*4a64e381SAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*4a64e381SAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE.
27*4a64e381SAndroid Build Coastguard Worker */
28*4a64e381SAndroid Build Coastguard Worker
29*4a64e381SAndroid Build Coastguard Worker #include <assert.h>
30*4a64e381SAndroid Build Coastguard Worker #include <stdio.h>
31*4a64e381SAndroid Build Coastguard Worker #include <stdlib.h>
32*4a64e381SAndroid Build Coastguard Worker #include <string.h>
33*4a64e381SAndroid Build Coastguard Worker
34*4a64e381SAndroid Build Coastguard Worker #include <memory>
35*4a64e381SAndroid Build Coastguard Worker
36*4a64e381SAndroid Build Coastguard Worker #include <dbus/dbus.h>
37*4a64e381SAndroid Build Coastguard Worker #include <unistd.h>
38*4a64e381SAndroid Build Coastguard Worker
39*4a64e381SAndroid Build Coastguard Worker #include "common/code_utils.hpp"
40*4a64e381SAndroid Build Coastguard Worker #include "dbus/client/thread_api_dbus.hpp"
41*4a64e381SAndroid Build Coastguard Worker #include "dbus/common/constants.hpp"
42*4a64e381SAndroid Build Coastguard Worker #if OTBR_ENABLE_TELEMETRY_DATA_API
43*4a64e381SAndroid Build Coastguard Worker #include "proto/thread_telemetry.pb.h"
44*4a64e381SAndroid Build Coastguard Worker #endif
45*4a64e381SAndroid Build Coastguard Worker #include "proto/capabilities.pb.h"
46*4a64e381SAndroid Build Coastguard Worker
47*4a64e381SAndroid Build Coastguard Worker using otbr::DBus::ActiveScanResult;
48*4a64e381SAndroid Build Coastguard Worker using otbr::DBus::ClientError;
49*4a64e381SAndroid Build Coastguard Worker using otbr::DBus::DeviceRole;
50*4a64e381SAndroid Build Coastguard Worker using otbr::DBus::EnergyScanResult;
51*4a64e381SAndroid Build Coastguard Worker using otbr::DBus::ExternalRoute;
52*4a64e381SAndroid Build Coastguard Worker using otbr::DBus::Ip6Prefix;
53*4a64e381SAndroid Build Coastguard Worker using otbr::DBus::LinkModeConfig;
54*4a64e381SAndroid Build Coastguard Worker using otbr::DBus::OnMeshPrefix;
55*4a64e381SAndroid Build Coastguard Worker using otbr::DBus::SrpServerInfo;
56*4a64e381SAndroid Build Coastguard Worker using otbr::DBus::ThreadApiDBus;
57*4a64e381SAndroid Build Coastguard Worker using otbr::DBus::TxtEntry;
58*4a64e381SAndroid Build Coastguard Worker
59*4a64e381SAndroid Build Coastguard Worker #if OTBR_ENABLE_DNSSD_DISCOVERY_PROXY
60*4a64e381SAndroid Build Coastguard Worker using otbr::DBus::DnssdCounters;
61*4a64e381SAndroid Build Coastguard Worker #endif
62*4a64e381SAndroid Build Coastguard Worker
63*4a64e381SAndroid Build Coastguard Worker #if OTBR_ENABLE_NAT64
64*4a64e381SAndroid Build Coastguard Worker using otbr::DBus::Nat64AddressMapping;
65*4a64e381SAndroid Build Coastguard Worker using otbr::DBus::Nat64ComponentState;
66*4a64e381SAndroid Build Coastguard Worker using otbr::DBus::Nat64ErrorCounters;
67*4a64e381SAndroid Build Coastguard Worker using otbr::DBus::Nat64ProtocolCounters;
68*4a64e381SAndroid Build Coastguard Worker #endif
69*4a64e381SAndroid Build Coastguard Worker
70*4a64e381SAndroid Build Coastguard Worker #define TEST_ASSERT(x) \
71*4a64e381SAndroid Build Coastguard Worker do \
72*4a64e381SAndroid Build Coastguard Worker { \
73*4a64e381SAndroid Build Coastguard Worker if (!(x)) \
74*4a64e381SAndroid Build Coastguard Worker { \
75*4a64e381SAndroid Build Coastguard Worker printf("Assert failed at %s:%d\n", __FILE__, __LINE__); \
76*4a64e381SAndroid Build Coastguard Worker exit(EXIT_FAILURE); \
77*4a64e381SAndroid Build Coastguard Worker } \
78*4a64e381SAndroid Build Coastguard Worker } while (false)
79*4a64e381SAndroid Build Coastguard Worker
80*4a64e381SAndroid Build Coastguard Worker struct DBusConnectionDeleter
81*4a64e381SAndroid Build Coastguard Worker {
operator ()DBusConnectionDeleter82*4a64e381SAndroid Build Coastguard Worker void operator()(DBusConnection *aConnection) { dbus_connection_unref(aConnection); }
83*4a64e381SAndroid Build Coastguard Worker };
84*4a64e381SAndroid Build Coastguard Worker
85*4a64e381SAndroid Build Coastguard Worker using UniqueDBusConnection = std::unique_ptr<DBusConnection, DBusConnectionDeleter>;
86*4a64e381SAndroid Build Coastguard Worker
operator ==(const otbr::DBus::Ip6Prefix & aLhs,const otbr::DBus::Ip6Prefix & aRhs)87*4a64e381SAndroid Build Coastguard Worker static bool operator==(const otbr::DBus::Ip6Prefix &aLhs, const otbr::DBus::Ip6Prefix &aRhs)
88*4a64e381SAndroid Build Coastguard Worker {
89*4a64e381SAndroid Build Coastguard Worker bool prefixDataEquality = (aLhs.mPrefix.size() == aRhs.mPrefix.size()) &&
90*4a64e381SAndroid Build Coastguard Worker (memcmp(&aLhs.mPrefix[0], &aRhs.mPrefix[0], aLhs.mPrefix.size()) == 0);
91*4a64e381SAndroid Build Coastguard Worker
92*4a64e381SAndroid Build Coastguard Worker return prefixDataEquality && aLhs.mLength == aRhs.mLength;
93*4a64e381SAndroid Build Coastguard Worker }
94*4a64e381SAndroid Build Coastguard Worker
CheckExternalRoute(ThreadApiDBus * aApi,const Ip6Prefix & aPrefix)95*4a64e381SAndroid Build Coastguard Worker static void CheckExternalRoute(ThreadApiDBus *aApi, const Ip6Prefix &aPrefix)
96*4a64e381SAndroid Build Coastguard Worker {
97*4a64e381SAndroid Build Coastguard Worker ExternalRoute route = {};
98*4a64e381SAndroid Build Coastguard Worker std::vector<ExternalRoute> externalRouteTable;
99*4a64e381SAndroid Build Coastguard Worker
100*4a64e381SAndroid Build Coastguard Worker route.mPrefix = aPrefix;
101*4a64e381SAndroid Build Coastguard Worker route.mStable = true;
102*4a64e381SAndroid Build Coastguard Worker route.mPreference = 0;
103*4a64e381SAndroid Build Coastguard Worker
104*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->AddExternalRoute(route) == OTBR_ERROR_NONE);
105*4a64e381SAndroid Build Coastguard Worker sleep(10);
106*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->GetExternalRoutes(externalRouteTable) == OTBR_ERROR_NONE);
107*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(externalRouteTable.size() == 1);
108*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(externalRouteTable[0].mPrefix == aPrefix);
109*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(externalRouteTable[0].mPreference == 0);
110*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(externalRouteTable[0].mStable);
111*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(externalRouteTable[0].mNextHopIsThisDevice);
112*4a64e381SAndroid Build Coastguard Worker
113*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->RemoveExternalRoute(aPrefix) == OTBR_ERROR_NONE);
114*4a64e381SAndroid Build Coastguard Worker sleep(10);
115*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->GetExternalRoutes(externalRouteTable) == OTBR_ERROR_NONE);
116*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(externalRouteTable.empty());
117*4a64e381SAndroid Build Coastguard Worker }
118*4a64e381SAndroid Build Coastguard Worker
CheckOnMeshPrefix(ThreadApiDBus * aApi)119*4a64e381SAndroid Build Coastguard Worker static void CheckOnMeshPrefix(ThreadApiDBus *aApi)
120*4a64e381SAndroid Build Coastguard Worker {
121*4a64e381SAndroid Build Coastguard Worker OnMeshPrefix prefix = {};
122*4a64e381SAndroid Build Coastguard Worker std::vector<OnMeshPrefix> onMeshPrefixes;
123*4a64e381SAndroid Build Coastguard Worker
124*4a64e381SAndroid Build Coastguard Worker prefix.mPrefix.mPrefix = {0xfd, 0xee, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
125*4a64e381SAndroid Build Coastguard Worker prefix.mPrefix.mLength = 64;
126*4a64e381SAndroid Build Coastguard Worker
127*4a64e381SAndroid Build Coastguard Worker prefix.mPreference = 0;
128*4a64e381SAndroid Build Coastguard Worker prefix.mStable = true;
129*4a64e381SAndroid Build Coastguard Worker
130*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->AddOnMeshPrefix(prefix) == OTBR_ERROR_NONE);
131*4a64e381SAndroid Build Coastguard Worker sleep(10);
132*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->GetOnMeshPrefixes(onMeshPrefixes) == OTBR_ERROR_NONE);
133*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(onMeshPrefixes.size() == 1);
134*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(onMeshPrefixes[0].mPrefix == prefix.mPrefix);
135*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(onMeshPrefixes[0].mPreference == 0);
136*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(onMeshPrefixes[0].mStable);
137*4a64e381SAndroid Build Coastguard Worker
138*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->RemoveOnMeshPrefix(prefix.mPrefix) == OTBR_ERROR_NONE);
139*4a64e381SAndroid Build Coastguard Worker sleep(10);
140*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->GetOnMeshPrefixes(onMeshPrefixes) == OTBR_ERROR_NONE);
141*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(onMeshPrefixes.empty());
142*4a64e381SAndroid Build Coastguard Worker }
143*4a64e381SAndroid Build Coastguard Worker
CheckFeatureFlagUpdate(ThreadApiDBus * aApi)144*4a64e381SAndroid Build Coastguard Worker static void CheckFeatureFlagUpdate(ThreadApiDBus *aApi)
145*4a64e381SAndroid Build Coastguard Worker {
146*4a64e381SAndroid Build Coastguard Worker OTBR_UNUSED_VARIABLE(aApi);
147*4a64e381SAndroid Build Coastguard Worker #if OTBR_ENABLE_FEATURE_FLAGS
148*4a64e381SAndroid Build Coastguard Worker std::vector<uint8_t> responseFeatureFlagBytes;
149*4a64e381SAndroid Build Coastguard Worker // Serialized bytes of feature_flag proto, with enable_nat64=true.
150*4a64e381SAndroid Build Coastguard Worker uint8_t requestRawBytes[] = {0x08, 0x01};
151*4a64e381SAndroid Build Coastguard Worker unsigned byteArraySize = sizeof(requestRawBytes) / sizeof(uint8_t);
152*4a64e381SAndroid Build Coastguard Worker std::vector<uint8_t> requestFeatureFlagBytes(&requestRawBytes[0], &requestRawBytes[byteArraySize]);
153*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->SetFeatureFlagListData(requestFeatureFlagBytes) == OTBR_ERROR_NONE);
154*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->GetFeatureFlagListData(responseFeatureFlagBytes) == OTBR_ERROR_NONE);
155*4a64e381SAndroid Build Coastguard Worker #endif
156*4a64e381SAndroid Build Coastguard Worker }
157*4a64e381SAndroid Build Coastguard Worker
CheckSrpServerInfo(ThreadApiDBus * aApi)158*4a64e381SAndroid Build Coastguard Worker void CheckSrpServerInfo(ThreadApiDBus *aApi)
159*4a64e381SAndroid Build Coastguard Worker {
160*4a64e381SAndroid Build Coastguard Worker SrpServerInfo srpServerInfo;
161*4a64e381SAndroid Build Coastguard Worker
162*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->GetSrpServerInfo(srpServerInfo) == OTBR_ERROR_NONE);
163*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(srpServerInfo.mState == otbr::DBus::OTBR_SRP_SERVER_STATE_RUNNING);
164*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(srpServerInfo.mPort != 0);
165*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(srpServerInfo.mHosts.mFreshCount == 0);
166*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(srpServerInfo.mHosts.mDeletedCount == 0);
167*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(srpServerInfo.mHosts.mLeaseTimeTotal == 0);
168*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(srpServerInfo.mHosts.mKeyLeaseTimeTotal == 0);
169*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(srpServerInfo.mHosts.mRemainingLeaseTimeTotal == 0);
170*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(srpServerInfo.mHosts.mRemainingKeyLeaseTimeTotal == 0);
171*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(srpServerInfo.mServices.mFreshCount == 0);
172*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(srpServerInfo.mServices.mDeletedCount == 0);
173*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(srpServerInfo.mServices.mLeaseTimeTotal == 0);
174*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(srpServerInfo.mServices.mKeyLeaseTimeTotal == 0);
175*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(srpServerInfo.mServices.mRemainingLeaseTimeTotal == 0);
176*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(srpServerInfo.mServices.mRemainingKeyLeaseTimeTotal == 0);
177*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(srpServerInfo.mResponseCounters.mSuccess == 0);
178*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(srpServerInfo.mResponseCounters.mServerFailure == 0);
179*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(srpServerInfo.mResponseCounters.mFormatError == 0);
180*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(srpServerInfo.mResponseCounters.mNameExists == 0);
181*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(srpServerInfo.mResponseCounters.mRefused == 0);
182*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(srpServerInfo.mResponseCounters.mOther == 0);
183*4a64e381SAndroid Build Coastguard Worker }
184*4a64e381SAndroid Build Coastguard Worker
CheckTrelInfo(ThreadApiDBus * aApi)185*4a64e381SAndroid Build Coastguard Worker void CheckTrelInfo(ThreadApiDBus *aApi)
186*4a64e381SAndroid Build Coastguard Worker {
187*4a64e381SAndroid Build Coastguard Worker OTBR_UNUSED_VARIABLE(aApi);
188*4a64e381SAndroid Build Coastguard Worker
189*4a64e381SAndroid Build Coastguard Worker #if OTBR_ENABLE_TREL
190*4a64e381SAndroid Build Coastguard Worker otbr::DBus::TrelInfo trelInfo;
191*4a64e381SAndroid Build Coastguard Worker
192*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->GetTrelInfo(trelInfo) == OTBR_ERROR_NONE);
193*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(trelInfo.mEnabled);
194*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(trelInfo.mNumTrelPeers == 0);
195*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(trelInfo.mTrelCounters.mTxPackets == 0);
196*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(trelInfo.mTrelCounters.mTxBytes == 0);
197*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(trelInfo.mTrelCounters.mTxFailure == 0);
198*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(trelInfo.mTrelCounters.mRxPackets == 0);
199*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(trelInfo.mTrelCounters.mRxBytes == 0);
200*4a64e381SAndroid Build Coastguard Worker #endif
201*4a64e381SAndroid Build Coastguard Worker }
202*4a64e381SAndroid Build Coastguard Worker
CheckDnssdCounters(ThreadApiDBus * aApi)203*4a64e381SAndroid Build Coastguard Worker void CheckDnssdCounters(ThreadApiDBus *aApi)
204*4a64e381SAndroid Build Coastguard Worker {
205*4a64e381SAndroid Build Coastguard Worker OTBR_UNUSED_VARIABLE(aApi);
206*4a64e381SAndroid Build Coastguard Worker #if OTBR_ENABLE_DNSSD_DISCOVERY_PROXY
207*4a64e381SAndroid Build Coastguard Worker otbr::DBus::DnssdCounters dnssdCounters;
208*4a64e381SAndroid Build Coastguard Worker
209*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->GetDnssdCounters(dnssdCounters) == OTBR_ERROR_NONE);
210*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(dnssdCounters.mSuccessResponse == 0);
211*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(dnssdCounters.mServerFailureResponse == 0);
212*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(dnssdCounters.mFormatErrorResponse == 0);
213*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(dnssdCounters.mNameErrorResponse == 0);
214*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(dnssdCounters.mNotImplementedResponse == 0);
215*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(dnssdCounters.mOtherResponse == 0);
216*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(dnssdCounters.mResolvedBySrp == 0);
217*4a64e381SAndroid Build Coastguard Worker #endif
218*4a64e381SAndroid Build Coastguard Worker }
219*4a64e381SAndroid Build Coastguard Worker
CheckMdnsInfo(ThreadApiDBus * aApi)220*4a64e381SAndroid Build Coastguard Worker void CheckMdnsInfo(ThreadApiDBus *aApi)
221*4a64e381SAndroid Build Coastguard Worker {
222*4a64e381SAndroid Build Coastguard Worker otbr::MdnsTelemetryInfo mdnsInfo;
223*4a64e381SAndroid Build Coastguard Worker
224*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->GetMdnsTelemetryInfo(mdnsInfo) == OTBR_ERROR_NONE);
225*4a64e381SAndroid Build Coastguard Worker
226*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(mdnsInfo.mServiceRegistrations.mSuccess > 0);
227*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(mdnsInfo.mServiceRegistrationEmaLatency > 0);
228*4a64e381SAndroid Build Coastguard Worker }
229*4a64e381SAndroid Build Coastguard Worker
CheckNat64(ThreadApiDBus * aApi)230*4a64e381SAndroid Build Coastguard Worker void CheckNat64(ThreadApiDBus *aApi)
231*4a64e381SAndroid Build Coastguard Worker {
232*4a64e381SAndroid Build Coastguard Worker OTBR_UNUSED_VARIABLE(aApi);
233*4a64e381SAndroid Build Coastguard Worker #if OTBR_ENABLE_NAT64
234*4a64e381SAndroid Build Coastguard Worker {
235*4a64e381SAndroid Build Coastguard Worker Nat64ComponentState aState;
236*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->SetNat64Enabled(false) == OTBR_ERROR_NONE);
237*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->GetNat64State(aState) == OTBR_ERROR_NONE);
238*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aState.mPrefixManagerState == OTBR_NAT64_STATE_NAME_DISABLED);
239*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aState.mTranslatorState == OTBR_NAT64_STATE_NAME_DISABLED);
240*4a64e381SAndroid Build Coastguard Worker
241*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->SetNat64Enabled(true) == OTBR_ERROR_NONE);
242*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->GetNat64State(aState) == OTBR_ERROR_NONE);
243*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aState.mPrefixManagerState != OTBR_NAT64_STATE_NAME_DISABLED);
244*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aState.mTranslatorState != OTBR_NAT64_STATE_NAME_DISABLED);
245*4a64e381SAndroid Build Coastguard Worker }
246*4a64e381SAndroid Build Coastguard Worker
247*4a64e381SAndroid Build Coastguard Worker {
248*4a64e381SAndroid Build Coastguard Worker std::vector<Nat64AddressMapping> aMappings;
249*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->GetNat64Mappings(aMappings) == OTBR_ERROR_NONE);
250*4a64e381SAndroid Build Coastguard Worker }
251*4a64e381SAndroid Build Coastguard Worker
252*4a64e381SAndroid Build Coastguard Worker {
253*4a64e381SAndroid Build Coastguard Worker Nat64ProtocolCounters aCounters;
254*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->GetNat64ProtocolCounters(aCounters) == OTBR_ERROR_NONE);
255*4a64e381SAndroid Build Coastguard Worker }
256*4a64e381SAndroid Build Coastguard Worker
257*4a64e381SAndroid Build Coastguard Worker {
258*4a64e381SAndroid Build Coastguard Worker Nat64ErrorCounters aCounters;
259*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->GetNat64ErrorCounters(aCounters) == OTBR_ERROR_NONE);
260*4a64e381SAndroid Build Coastguard Worker }
261*4a64e381SAndroid Build Coastguard Worker #endif
262*4a64e381SAndroid Build Coastguard Worker }
263*4a64e381SAndroid Build Coastguard Worker
CheckEphemeralKey(ThreadApiDBus * aApi)264*4a64e381SAndroid Build Coastguard Worker void CheckEphemeralKey(ThreadApiDBus *aApi)
265*4a64e381SAndroid Build Coastguard Worker {
266*4a64e381SAndroid Build Coastguard Worker bool enabled;
267*4a64e381SAndroid Build Coastguard Worker
268*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->SetEphemeralKeyEnabled(false) == OTBR_ERROR_NONE);
269*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->GetEphemeralKeyEnabled(enabled) == OTBR_ERROR_NONE);
270*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(enabled == false);
271*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->SetEphemeralKeyEnabled(true) == OTBR_ERROR_NONE);
272*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->GetEphemeralKeyEnabled(enabled) == OTBR_ERROR_NONE);
273*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(enabled == true);
274*4a64e381SAndroid Build Coastguard Worker }
275*4a64e381SAndroid Build Coastguard Worker
CheckBorderAgentInfo(const threadnetwork::TelemetryData_BorderAgentInfo & aBorderAgentInfo)276*4a64e381SAndroid Build Coastguard Worker void CheckBorderAgentInfo(const threadnetwork::TelemetryData_BorderAgentInfo &aBorderAgentInfo)
277*4a64e381SAndroid Build Coastguard Worker {
278*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aBorderAgentInfo.border_agent_counters().epskc_activations() == 0);
279*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aBorderAgentInfo.border_agent_counters().epskc_deactivation_clears() == 0);
280*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aBorderAgentInfo.border_agent_counters().epskc_deactivation_timeouts() == 0);
281*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aBorderAgentInfo.border_agent_counters().epskc_deactivation_max_attempts() == 0);
282*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aBorderAgentInfo.border_agent_counters().epskc_deactivation_disconnects() == 0);
283*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aBorderAgentInfo.border_agent_counters().epskc_invalid_ba_state_errors() == 0);
284*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aBorderAgentInfo.border_agent_counters().epskc_invalid_args_errors() == 0);
285*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aBorderAgentInfo.border_agent_counters().epskc_start_secure_session_errors() == 0);
286*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aBorderAgentInfo.border_agent_counters().epskc_secure_session_successes() == 0);
287*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aBorderAgentInfo.border_agent_counters().epskc_secure_session_failures() == 0);
288*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aBorderAgentInfo.border_agent_counters().epskc_commissioner_petitions() == 0);
289*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aBorderAgentInfo.border_agent_counters().pskc_secure_session_successes() == 0);
290*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aBorderAgentInfo.border_agent_counters().pskc_secure_session_failures() == 0);
291*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aBorderAgentInfo.border_agent_counters().pskc_commissioner_petitions() == 0);
292*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aBorderAgentInfo.border_agent_counters().mgmt_active_get_reqs() == 0);
293*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aBorderAgentInfo.border_agent_counters().mgmt_pending_get_reqs() == 0);
294*4a64e381SAndroid Build Coastguard Worker }
295*4a64e381SAndroid Build Coastguard Worker
296*4a64e381SAndroid Build Coastguard Worker #if OTBR_ENABLE_TELEMETRY_DATA_API
CheckTelemetryData(ThreadApiDBus * aApi)297*4a64e381SAndroid Build Coastguard Worker void CheckTelemetryData(ThreadApiDBus *aApi)
298*4a64e381SAndroid Build Coastguard Worker {
299*4a64e381SAndroid Build Coastguard Worker std::vector<uint8_t> responseTelemetryDataBytes;
300*4a64e381SAndroid Build Coastguard Worker threadnetwork::TelemetryData telemetryData;
301*4a64e381SAndroid Build Coastguard Worker
302*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->GetTelemetryData(responseTelemetryDataBytes) == OTBR_ERROR_NONE);
303*4a64e381SAndroid Build Coastguard Worker // Print TelemetryData proto in hex format.
304*4a64e381SAndroid Build Coastguard Worker printf("TelemetryData bytes in hex: ");
305*4a64e381SAndroid Build Coastguard Worker for (uint8_t byte : responseTelemetryDataBytes)
306*4a64e381SAndroid Build Coastguard Worker {
307*4a64e381SAndroid Build Coastguard Worker printf("%02x ", byte);
308*4a64e381SAndroid Build Coastguard Worker }
309*4a64e381SAndroid Build Coastguard Worker printf("\n");
310*4a64e381SAndroid Build Coastguard Worker
311*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.ParseFromString(
312*4a64e381SAndroid Build Coastguard Worker std::string(responseTelemetryDataBytes.begin(), responseTelemetryDataBytes.end())));
313*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_stats().node_type() == threadnetwork::TelemetryData::NODE_TYPE_LEADER);
314*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_stats().channel() == 11);
315*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_stats().radio_tx_power() == 0);
316*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_stats().mac_cca_fail_rate() < 1e-6);
317*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_stats().phy_tx() > 0);
318*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_stats().phy_rx() > 0);
319*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_stats().ip_tx_success() > 0);
320*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_topo_full().rloc16() < 0xffff);
321*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_topo_full().network_data().size() > 0);
322*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_topo_full().partition_id() > 0);
323*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_topo_full().extended_pan_id() > 0);
324*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_topo_full().peer_br_count() == 0);
325*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.topo_entries_size() == 1);
326*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.topo_entries(0).rloc16() < 0xffff);
327*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().border_routing_counters().rs_tx_failure() == 0);
328*4a64e381SAndroid Build Coastguard Worker #if OTBR_ENABLE_SRP_ADVERTISING_PROXY
329*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().srp_server().state() ==
330*4a64e381SAndroid Build Coastguard Worker threadnetwork::TelemetryData::SRP_SERVER_STATE_RUNNING);
331*4a64e381SAndroid Build Coastguard Worker #endif
332*4a64e381SAndroid Build Coastguard Worker #if OTBR_ENABLE_DNSSD_DISCOVERY_PROXY
333*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().dns_server().response_counters().server_failure_count() == 0);
334*4a64e381SAndroid Build Coastguard Worker #endif
335*4a64e381SAndroid Build Coastguard Worker #if OTBR_ENABLE_TREL
336*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().trel_info().is_trel_enabled());
337*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().trel_info().has_counters());
338*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().trel_info().counters().trel_tx_packets() == 0);
339*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().trel_info().counters().trel_tx_bytes() == 0);
340*4a64e381SAndroid Build Coastguard Worker #endif
341*4a64e381SAndroid Build Coastguard Worker #if OTBR_ENABLE_BORDER_ROUTING
342*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().infra_link_info().name() == "lo");
343*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().infra_link_info().is_up());
344*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().infra_link_info().is_running());
345*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(!telemetryData.wpan_border_router().infra_link_info().is_multicast());
346*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().infra_link_info().link_local_address_count() == 0);
347*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().infra_link_info().unique_local_address_count() == 0);
348*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().infra_link_info().global_unicast_address_count() == 0);
349*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().infra_link_info().peer_br_count() == 0);
350*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().external_route_info().has_default_route_added() == false);
351*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().external_route_info().has_ula_route_added() == false);
352*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().external_route_info().has_others_route_added() == false);
353*4a64e381SAndroid Build Coastguard Worker #endif
354*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().mdns().service_registration_responses().success_count() > 0);
355*4a64e381SAndroid Build Coastguard Worker #if OTBR_ENABLE_NAT64
356*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().nat64_state().prefix_manager_state() ==
357*4a64e381SAndroid Build Coastguard Worker threadnetwork::TelemetryData::NAT64_STATE_NOT_RUNNING);
358*4a64e381SAndroid Build Coastguard Worker #endif
359*4a64e381SAndroid Build Coastguard Worker #if OTBR_ENABLE_DHCP6_PD
360*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().dhcp6_pd_state() ==
361*4a64e381SAndroid Build Coastguard Worker threadnetwork::TelemetryData::DHCP6_PD_STATE_DISABLED);
362*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().hashed_pd_prefix().empty());
363*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().pd_processed_ra_info().num_platform_ra_received() == 0);
364*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().pd_processed_ra_info().num_platform_pio_processed() == 0);
365*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_border_router().pd_processed_ra_info().last_platform_ra_msec() == 0);
366*4a64e381SAndroid Build Coastguard Worker #endif
367*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.wpan_rcp().rcp_interface_statistics().transferred_frames_count() > 0);
368*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.coex_metrics().count_tx_request() > 0);
369*4a64e381SAndroid Build Coastguard Worker #if OTBR_ENABLE_LINK_METRICS_TELEMETRY
370*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(telemetryData.low_power_metrics().link_metrics_entries_size() >= 0);
371*4a64e381SAndroid Build Coastguard Worker #endif
372*4a64e381SAndroid Build Coastguard Worker #if OTBR_ENABLE_BORDER_AGENT
373*4a64e381SAndroid Build Coastguard Worker CheckBorderAgentInfo(telemetryData.wpan_border_router().border_agent_info());
374*4a64e381SAndroid Build Coastguard Worker #endif
375*4a64e381SAndroid Build Coastguard Worker }
376*4a64e381SAndroid Build Coastguard Worker #endif
377*4a64e381SAndroid Build Coastguard Worker
CheckCapabilities(ThreadApiDBus * aApi)378*4a64e381SAndroid Build Coastguard Worker void CheckCapabilities(ThreadApiDBus *aApi)
379*4a64e381SAndroid Build Coastguard Worker {
380*4a64e381SAndroid Build Coastguard Worker std::vector<uint8_t> responseCapabilitiesBytes;
381*4a64e381SAndroid Build Coastguard Worker otbr::Capabilities capabilities;
382*4a64e381SAndroid Build Coastguard Worker
383*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aApi->GetCapabilities(responseCapabilitiesBytes) == OTBR_ERROR_NONE);
384*4a64e381SAndroid Build Coastguard Worker // Print TelemetryData proto in hex format.
385*4a64e381SAndroid Build Coastguard Worker printf("TelemetryData bytes in hex: ");
386*4a64e381SAndroid Build Coastguard Worker for (uint8_t byte : responseCapabilitiesBytes)
387*4a64e381SAndroid Build Coastguard Worker {
388*4a64e381SAndroid Build Coastguard Worker printf("%02x ", byte);
389*4a64e381SAndroid Build Coastguard Worker }
390*4a64e381SAndroid Build Coastguard Worker printf("\n");
391*4a64e381SAndroid Build Coastguard Worker
392*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(
393*4a64e381SAndroid Build Coastguard Worker capabilities.ParseFromString(std::string(responseCapabilitiesBytes.begin(), responseCapabilitiesBytes.end())));
394*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(capabilities.nat64() == OTBR_ENABLE_NAT64);
395*4a64e381SAndroid Build Coastguard Worker }
396*4a64e381SAndroid Build Coastguard Worker
main()397*4a64e381SAndroid Build Coastguard Worker int main()
398*4a64e381SAndroid Build Coastguard Worker {
399*4a64e381SAndroid Build Coastguard Worker DBusError error;
400*4a64e381SAndroid Build Coastguard Worker UniqueDBusConnection connection;
401*4a64e381SAndroid Build Coastguard Worker std::unique_ptr<ThreadApiDBus> api;
402*4a64e381SAndroid Build Coastguard Worker uint64_t extpanid = 0xdead00beaf00cafe;
403*4a64e381SAndroid Build Coastguard Worker std::string region;
404*4a64e381SAndroid Build Coastguard Worker uint32_t scanDuration = 1000; // 1s for each channel
405*4a64e381SAndroid Build Coastguard Worker bool stepDone = false;
406*4a64e381SAndroid Build Coastguard Worker uint32_t preferredChannelMask = 0;
407*4a64e381SAndroid Build Coastguard Worker
408*4a64e381SAndroid Build Coastguard Worker dbus_error_init(&error);
409*4a64e381SAndroid Build Coastguard Worker connection = UniqueDBusConnection(dbus_bus_get(DBUS_BUS_SYSTEM, &error));
410*4a64e381SAndroid Build Coastguard Worker
411*4a64e381SAndroid Build Coastguard Worker VerifyOrExit(connection != nullptr);
412*4a64e381SAndroid Build Coastguard Worker
413*4a64e381SAndroid Build Coastguard Worker VerifyOrExit(dbus_bus_register(connection.get(), &error) == true);
414*4a64e381SAndroid Build Coastguard Worker
415*4a64e381SAndroid Build Coastguard Worker api = std::unique_ptr<ThreadApiDBus>(new ThreadApiDBus(connection.get()));
416*4a64e381SAndroid Build Coastguard Worker
417*4a64e381SAndroid Build Coastguard Worker api->AddDeviceRoleHandler(
418*4a64e381SAndroid Build Coastguard Worker [](DeviceRole aRole) { printf("Device role changed to %d\n", static_cast<uint8_t>(aRole)); });
419*4a64e381SAndroid Build Coastguard Worker
420*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->SetRadioRegion("US") == ClientError::ERROR_NONE);
421*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetRadioRegion(region) == ClientError::ERROR_NONE);
422*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(region == "US");
423*4a64e381SAndroid Build Coastguard Worker
424*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetPreferredChannelMask(preferredChannelMask) == ClientError::ERROR_NONE);
425*4a64e381SAndroid Build Coastguard Worker
426*4a64e381SAndroid Build Coastguard Worker api->EnergyScan(scanDuration, [&stepDone](const std::vector<EnergyScanResult> &aResult) {
427*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(!aResult.empty());
428*4a64e381SAndroid Build Coastguard Worker printf("Energy Scan:\n");
429*4a64e381SAndroid Build Coastguard Worker for (auto &result : aResult)
430*4a64e381SAndroid Build Coastguard Worker {
431*4a64e381SAndroid Build Coastguard Worker printf("channel %d rssi %d\n", result.mChannel, result.mMaxRssi);
432*4a64e381SAndroid Build Coastguard Worker }
433*4a64e381SAndroid Build Coastguard Worker
434*4a64e381SAndroid Build Coastguard Worker stepDone = true;
435*4a64e381SAndroid Build Coastguard Worker });
436*4a64e381SAndroid Build Coastguard Worker
437*4a64e381SAndroid Build Coastguard Worker CheckFeatureFlagUpdate(api.get());
438*4a64e381SAndroid Build Coastguard Worker
439*4a64e381SAndroid Build Coastguard Worker while (!stepDone)
440*4a64e381SAndroid Build Coastguard Worker {
441*4a64e381SAndroid Build Coastguard Worker dbus_connection_read_write_dispatch(connection.get(), 0);
442*4a64e381SAndroid Build Coastguard Worker }
443*4a64e381SAndroid Build Coastguard Worker
444*4a64e381SAndroid Build Coastguard Worker stepDone = false;
445*4a64e381SAndroid Build Coastguard Worker
446*4a64e381SAndroid Build Coastguard Worker api->Scan([&api, extpanid, &stepDone](const std::vector<ActiveScanResult> &aResult) {
447*4a64e381SAndroid Build Coastguard Worker LinkModeConfig cfg = {true, false, true};
448*4a64e381SAndroid Build Coastguard Worker std::vector<uint8_t> networkKey = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
449*4a64e381SAndroid Build Coastguard Worker 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff};
450*4a64e381SAndroid Build Coastguard Worker uint16_t channel = 11;
451*4a64e381SAndroid Build Coastguard Worker
452*4a64e381SAndroid Build Coastguard Worker for (auto &&result : aResult)
453*4a64e381SAndroid Build Coastguard Worker {
454*4a64e381SAndroid Build Coastguard Worker printf("channel %d rssi %d\n", result.mChannel, result.mRssi);
455*4a64e381SAndroid Build Coastguard Worker }
456*4a64e381SAndroid Build Coastguard Worker
457*4a64e381SAndroid Build Coastguard Worker api->SetLinkMode(cfg);
458*4a64e381SAndroid Build Coastguard Worker api->GetLinkMode(cfg);
459*4a64e381SAndroid Build Coastguard Worker printf("LinkMode %d %d %d\n", cfg.mRxOnWhenIdle, cfg.mDeviceType, cfg.mNetworkData);
460*4a64e381SAndroid Build Coastguard Worker
461*4a64e381SAndroid Build Coastguard Worker cfg.mDeviceType = true;
462*4a64e381SAndroid Build Coastguard Worker api->SetLinkMode(cfg);
463*4a64e381SAndroid Build Coastguard Worker
464*4a64e381SAndroid Build Coastguard Worker api->Attach("Test", 0x3456, extpanid, networkKey, {}, 1 << channel,
465*4a64e381SAndroid Build Coastguard Worker [&api, channel, extpanid, &stepDone](ClientError aError) {
466*4a64e381SAndroid Build Coastguard Worker printf("Attach result %d\n", static_cast<int>(aError));
467*4a64e381SAndroid Build Coastguard Worker sleep(20);
468*4a64e381SAndroid Build Coastguard Worker uint64_t extpanidCheck;
469*4a64e381SAndroid Build Coastguard Worker std::vector<uint8_t> activeDataset;
470*4a64e381SAndroid Build Coastguard Worker
471*4a64e381SAndroid Build Coastguard Worker if (aError == OTBR_ERROR_NONE)
472*4a64e381SAndroid Build Coastguard Worker {
473*4a64e381SAndroid Build Coastguard Worker std::string name;
474*4a64e381SAndroid Build Coastguard Worker uint64_t extAddress = 0;
475*4a64e381SAndroid Build Coastguard Worker uint16_t rloc16 = 0xffff;
476*4a64e381SAndroid Build Coastguard Worker std::vector<uint8_t> networkData;
477*4a64e381SAndroid Build Coastguard Worker std::vector<uint8_t> stableNetworkData;
478*4a64e381SAndroid Build Coastguard Worker int8_t rssi;
479*4a64e381SAndroid Build Coastguard Worker int8_t txPower;
480*4a64e381SAndroid Build Coastguard Worker std::vector<otbr::DBus::ChildInfo> childTable;
481*4a64e381SAndroid Build Coastguard Worker std::vector<otbr::DBus::NeighborInfo> neighborTable;
482*4a64e381SAndroid Build Coastguard Worker uint32_t partitionId;
483*4a64e381SAndroid Build Coastguard Worker uint16_t channelResult;
484*4a64e381SAndroid Build Coastguard Worker
485*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetChannel(channelResult) == OTBR_ERROR_NONE);
486*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(channelResult == channel);
487*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetNetworkName(name) == OTBR_ERROR_NONE);
488*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetExtPanId(extpanidCheck) == OTBR_ERROR_NONE);
489*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetRloc16(rloc16) == OTBR_ERROR_NONE);
490*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetExtendedAddress(extAddress) == OTBR_ERROR_NONE);
491*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetNetworkData(networkData) == OTBR_ERROR_NONE);
492*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetStableNetworkData(stableNetworkData) == OTBR_ERROR_NONE);
493*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetChildTable(childTable) == OTBR_ERROR_NONE);
494*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetNeighborTable(neighborTable) == OTBR_ERROR_NONE);
495*4a64e381SAndroid Build Coastguard Worker printf("neighborTable size %zu\n", neighborTable.size());
496*4a64e381SAndroid Build Coastguard Worker printf("childTable size %zu\n", childTable.size());
497*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(neighborTable.size() == 1);
498*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(childTable.size() == 1);
499*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetPartitionId(partitionId) == OTBR_ERROR_NONE);
500*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetInstantRssi(rssi) == OTBR_ERROR_NONE);
501*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetRadioTxPower(txPower) == OTBR_ERROR_NONE);
502*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetActiveDatasetTlvs(activeDataset) == OTBR_ERROR_NONE);
503*4a64e381SAndroid Build Coastguard Worker CheckSrpServerInfo(api.get());
504*4a64e381SAndroid Build Coastguard Worker CheckTrelInfo(api.get());
505*4a64e381SAndroid Build Coastguard Worker CheckMdnsInfo(api.get());
506*4a64e381SAndroid Build Coastguard Worker CheckDnssdCounters(api.get());
507*4a64e381SAndroid Build Coastguard Worker CheckNat64(api.get());
508*4a64e381SAndroid Build Coastguard Worker CheckEphemeralKey(api.get());
509*4a64e381SAndroid Build Coastguard Worker #if OTBR_ENABLE_TELEMETRY_DATA_API
510*4a64e381SAndroid Build Coastguard Worker CheckTelemetryData(api.get());
511*4a64e381SAndroid Build Coastguard Worker #endif
512*4a64e381SAndroid Build Coastguard Worker CheckCapabilities(api.get());
513*4a64e381SAndroid Build Coastguard Worker api->FactoryReset(nullptr);
514*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetNetworkName(name) == OTBR_ERROR_NONE);
515*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(rloc16 != 0xffff);
516*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(extAddress != 0);
517*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(!networkData.empty());
518*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetNeighborTable(neighborTable) == OTBR_ERROR_NONE);
519*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(neighborTable.empty());
520*4a64e381SAndroid Build Coastguard Worker }
521*4a64e381SAndroid Build Coastguard Worker if (aError != OTBR_ERROR_NONE || extpanidCheck != extpanid)
522*4a64e381SAndroid Build Coastguard Worker {
523*4a64e381SAndroid Build Coastguard Worker exit(-1);
524*4a64e381SAndroid Build Coastguard Worker }
525*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->SetActiveDatasetTlvs(activeDataset) == OTBR_ERROR_NONE);
526*4a64e381SAndroid Build Coastguard Worker api->Attach([&api, channel, extpanid, &stepDone](ClientError aErr) {
527*4a64e381SAndroid Build Coastguard Worker uint8_t routerId;
528*4a64e381SAndroid Build Coastguard Worker otbr::DBus::LeaderData leaderData;
529*4a64e381SAndroid Build Coastguard Worker uint8_t leaderWeight;
530*4a64e381SAndroid Build Coastguard Worker uint16_t channelResult;
531*4a64e381SAndroid Build Coastguard Worker uint64_t extpanidCheck;
532*4a64e381SAndroid Build Coastguard Worker Ip6Prefix prefix;
533*4a64e381SAndroid Build Coastguard Worker std::vector<TxtEntry> updatedTxtEntries{TxtEntry{"B", {97, 98, 99}}};
534*4a64e381SAndroid Build Coastguard Worker
535*4a64e381SAndroid Build Coastguard Worker prefix.mPrefix = {0xfd, 0xcd, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
536*4a64e381SAndroid Build Coastguard Worker prefix.mLength = 64;
537*4a64e381SAndroid Build Coastguard Worker
538*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aErr == ClientError::ERROR_NONE);
539*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetChannel(channelResult) == OTBR_ERROR_NONE);
540*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(channelResult == channel);
541*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetExtPanId(extpanidCheck) == OTBR_ERROR_NONE);
542*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(extpanidCheck == extpanid);
543*4a64e381SAndroid Build Coastguard Worker
544*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetLocalLeaderWeight(leaderWeight) == OTBR_ERROR_NONE);
545*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetLeaderData(leaderData) == OTBR_ERROR_NONE);
546*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->GetRouterId(routerId) == OTBR_ERROR_NONE);
547*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(routerId == leaderData.mLeaderRouterId);
548*4a64e381SAndroid Build Coastguard Worker
549*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->UpdateVendorMeshCopTxtEntries(updatedTxtEntries) == OTBR_ERROR_NONE);
550*4a64e381SAndroid Build Coastguard Worker
551*4a64e381SAndroid Build Coastguard Worker CheckExternalRoute(api.get(), prefix);
552*4a64e381SAndroid Build Coastguard Worker CheckOnMeshPrefix(api.get());
553*4a64e381SAndroid Build Coastguard Worker
554*4a64e381SAndroid Build Coastguard Worker api->FactoryReset(nullptr);
555*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->JoinerStart("ABCDEF", "", "", "", "", "", nullptr) ==
556*4a64e381SAndroid Build Coastguard Worker ClientError::OT_ERROR_NOT_FOUND);
557*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(api->JoinerStart(
558*4a64e381SAndroid Build Coastguard Worker "ABCDEF", "", "", "", "", "", [&api, &stepDone](ClientError aJoinError) {
559*4a64e381SAndroid Build Coastguard Worker DeviceRole deviceRole;
560*4a64e381SAndroid Build Coastguard Worker
561*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(aJoinError == ClientError::OT_ERROR_NOT_FOUND);
562*4a64e381SAndroid Build Coastguard Worker
563*4a64e381SAndroid Build Coastguard Worker api->FactoryReset(nullptr);
564*4a64e381SAndroid Build Coastguard Worker api->GetDeviceRole(deviceRole);
565*4a64e381SAndroid Build Coastguard Worker TEST_ASSERT(deviceRole == otbr::DBus::OTBR_DEVICE_ROLE_DISABLED);
566*4a64e381SAndroid Build Coastguard Worker
567*4a64e381SAndroid Build Coastguard Worker stepDone = true;
568*4a64e381SAndroid Build Coastguard Worker }) == ClientError::ERROR_NONE);
569*4a64e381SAndroid Build Coastguard Worker });
570*4a64e381SAndroid Build Coastguard Worker });
571*4a64e381SAndroid Build Coastguard Worker });
572*4a64e381SAndroid Build Coastguard Worker
573*4a64e381SAndroid Build Coastguard Worker while (!stepDone)
574*4a64e381SAndroid Build Coastguard Worker {
575*4a64e381SAndroid Build Coastguard Worker dbus_connection_read_write_dispatch(connection.get(), 0);
576*4a64e381SAndroid Build Coastguard Worker }
577*4a64e381SAndroid Build Coastguard Worker
578*4a64e381SAndroid Build Coastguard Worker exit:
579*4a64e381SAndroid Build Coastguard Worker dbus_error_free(&error);
580*4a64e381SAndroid Build Coastguard Worker return 0;
581*4a64e381SAndroid Build Coastguard Worker };
582