xref: /aosp_15_r20/external/openthread/tools/otci/tests/test_otci.py (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
1*cfb92d14SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*cfb92d14SAndroid Build Coastguard Worker#
3*cfb92d14SAndroid Build Coastguard Worker#  Copyright (c) 2020, The OpenThread Authors.
4*cfb92d14SAndroid Build Coastguard Worker#  All rights reserved.
5*cfb92d14SAndroid Build Coastguard Worker#
6*cfb92d14SAndroid Build Coastguard Worker#  Redistribution and use in source and binary forms, with or without
7*cfb92d14SAndroid Build Coastguard Worker#  modification, are permitted provided that the following conditions are met:
8*cfb92d14SAndroid Build Coastguard Worker#  1. Redistributions of source code must retain the above copyright
9*cfb92d14SAndroid Build Coastguard Worker#     notice, this list of conditions and the following disclaimer.
10*cfb92d14SAndroid Build Coastguard Worker#  2. Redistributions in binary form must reproduce the above copyright
11*cfb92d14SAndroid Build Coastguard Worker#     notice, this list of conditions and the following disclaimer in the
12*cfb92d14SAndroid Build Coastguard Worker#     documentation and/or other materials provided with the distribution.
13*cfb92d14SAndroid Build Coastguard Worker#  3. Neither the name of the copyright holder nor the
14*cfb92d14SAndroid Build Coastguard Worker#     names of its contributors may be used to endorse or promote products
15*cfb92d14SAndroid Build Coastguard Worker#     derived from this software without specific prior written permission.
16*cfb92d14SAndroid Build Coastguard Worker#
17*cfb92d14SAndroid Build Coastguard Worker#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18*cfb92d14SAndroid Build Coastguard Worker#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19*cfb92d14SAndroid Build Coastguard Worker#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20*cfb92d14SAndroid Build Coastguard Worker#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21*cfb92d14SAndroid Build Coastguard Worker#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22*cfb92d14SAndroid Build Coastguard Worker#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23*cfb92d14SAndroid Build Coastguard Worker#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*cfb92d14SAndroid Build Coastguard Worker#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25*cfb92d14SAndroid Build Coastguard Worker#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26*cfb92d14SAndroid Build Coastguard Worker#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27*cfb92d14SAndroid Build Coastguard Worker#  POSSIBILITY OF SUCH DAMAGE.
28*cfb92d14SAndroid Build Coastguard Worker#
29*cfb92d14SAndroid Build Coastguard Workerimport ipaddress
30*cfb92d14SAndroid Build Coastguard Workerimport json
31*cfb92d14SAndroid Build Coastguard Workerimport logging
32*cfb92d14SAndroid Build Coastguard Workerimport os
33*cfb92d14SAndroid Build Coastguard Workerimport subprocess
34*cfb92d14SAndroid Build Coastguard Workerimport unittest
35*cfb92d14SAndroid Build Coastguard Worker
36*cfb92d14SAndroid Build Coastguard Workerimport otci
37*cfb92d14SAndroid Build Coastguard Workerfrom otci import OTCI
38*cfb92d14SAndroid Build Coastguard Workerfrom otci.errors import CommandError
39*cfb92d14SAndroid Build Coastguard Workerfrom otci import NetifIdentifier
40*cfb92d14SAndroid Build Coastguard Worker
41*cfb92d14SAndroid Build Coastguard Workerlogging.basicConfig(level=logging.DEBUG)
42*cfb92d14SAndroid Build Coastguard Worker
43*cfb92d14SAndroid Build Coastguard WorkerTEST_CHANNEL = 22
44*cfb92d14SAndroid Build Coastguard WorkerTEST_CHANNEL_MASK = 0x07fff800
45*cfb92d14SAndroid Build Coastguard WorkerTEST_EXTENDED_PANID = '000db80000000000'
46*cfb92d14SAndroid Build Coastguard WorkerTEST_MESH_LOCAL_PREFIX = 'fd00:db8::'
47*cfb92d14SAndroid Build Coastguard WorkerTEST_NETWORK_KEY = 'ffeeddccbbaa99887766554433221100'
48*cfb92d14SAndroid Build Coastguard WorkerTEST_NETWORK_NAME = 'OT CI'
49*cfb92d14SAndroid Build Coastguard WorkerTEST_PANID = 0xeeee
50*cfb92d14SAndroid Build Coastguard WorkerTEST_PSKC = 'c23a76e98f1a6483639b1ac1271e2e27'
51*cfb92d14SAndroid Build Coastguard WorkerTEST_SECURITY_POLICY = (672, 'onrc')
52*cfb92d14SAndroid Build Coastguard Worker
53*cfb92d14SAndroid Build Coastguard WorkerREAL_DEVICE = int(os.getenv('REAL_DEVICE', '0'))
54*cfb92d14SAndroid Build Coastguard Worker
55*cfb92d14SAndroid Build Coastguard Worker
56*cfb92d14SAndroid Build Coastguard Workerclass TestOTCI(unittest.TestCase):
57*cfb92d14SAndroid Build Coastguard Worker
58*cfb92d14SAndroid Build Coastguard Worker    def testCliRealDevice(self):
59*cfb92d14SAndroid Build Coastguard Worker        if not REAL_DEVICE:
60*cfb92d14SAndroid Build Coastguard Worker            self.skipTest('not for virtual device')
61*cfb92d14SAndroid Build Coastguard Worker
62*cfb92d14SAndroid Build Coastguard Worker        if os.getenv('OTBR_SSH'):
63*cfb92d14SAndroid Build Coastguard Worker            node = otci.connect_otbr_ssh(os.getenv('OTBR_SSH'))
64*cfb92d14SAndroid Build Coastguard Worker        elif os.getenv('OT_CLI_SERIAL'):
65*cfb92d14SAndroid Build Coastguard Worker            node = otci.connect_cli_serial(os.getenv('OT_CLI_SERIAL'))
66*cfb92d14SAndroid Build Coastguard Worker        else:
67*cfb92d14SAndroid Build Coastguard Worker            self.fail("Please set OT_CLI_SERIAL or OTBR_SSH to test the real device.")
68*cfb92d14SAndroid Build Coastguard Worker
69*cfb92d14SAndroid Build Coastguard Worker        node.factory_reset()
70*cfb92d14SAndroid Build Coastguard Worker
71*cfb92d14SAndroid Build Coastguard Worker        self._test_otci_single_node(node)
72*cfb92d14SAndroid Build Coastguard Worker
73*cfb92d14SAndroid Build Coastguard Worker    def testCliSimRealTime(self):
74*cfb92d14SAndroid Build Coastguard Worker        if REAL_DEVICE:
75*cfb92d14SAndroid Build Coastguard Worker            self.skipTest('not for real device')
76*cfb92d14SAndroid Build Coastguard Worker
77*cfb92d14SAndroid Build Coastguard Worker        subprocess.check_call('rm -rf tmp/', shell=True)
78*cfb92d14SAndroid Build Coastguard Worker        VIRTUAL_TIME = int(os.getenv('VIRTUAL_TIME', "1"))
79*cfb92d14SAndroid Build Coastguard Worker
80*cfb92d14SAndroid Build Coastguard Worker        import simulator
81*cfb92d14SAndroid Build Coastguard Worker
82*cfb92d14SAndroid Build Coastguard Worker        if VIRTUAL_TIME:
83*cfb92d14SAndroid Build Coastguard Worker            sim = simulator.VirtualTime(use_message_factory=False)
84*cfb92d14SAndroid Build Coastguard Worker        else:
85*cfb92d14SAndroid Build Coastguard Worker            sim = None
86*cfb92d14SAndroid Build Coastguard Worker
87*cfb92d14SAndroid Build Coastguard Worker        if os.getenv('OT_CLI'):
88*cfb92d14SAndroid Build Coastguard Worker            executable = os.getenv('OT_CLI')
89*cfb92d14SAndroid Build Coastguard Worker            connector = otci.connect_cli_sim
90*cfb92d14SAndroid Build Coastguard Worker        elif os.getenv('OT_NCP'):
91*cfb92d14SAndroid Build Coastguard Worker            executable = os.getenv('OT_NCP')
92*cfb92d14SAndroid Build Coastguard Worker            connector = otci.connect_ncp_sim
93*cfb92d14SAndroid Build Coastguard Worker        else:
94*cfb92d14SAndroid Build Coastguard Worker            self.fail("Please set OT_CLI to test virtual device")
95*cfb92d14SAndroid Build Coastguard Worker
96*cfb92d14SAndroid Build Coastguard Worker        node1 = connector(executable, 1, simulator=sim)
97*cfb92d14SAndroid Build Coastguard Worker        self._test_otci_single_node(node1)
98*cfb92d14SAndroid Build Coastguard Worker
99*cfb92d14SAndroid Build Coastguard Worker        node1.factory_reset()
100*cfb92d14SAndroid Build Coastguard Worker
101*cfb92d14SAndroid Build Coastguard Worker        node2 = connector(executable, 2, simulator=sim)
102*cfb92d14SAndroid Build Coastguard Worker        node3 = connector(executable, 3, simulator=sim)
103*cfb92d14SAndroid Build Coastguard Worker        node4 = connector(executable, 4, simulator=sim)
104*cfb92d14SAndroid Build Coastguard Worker
105*cfb92d14SAndroid Build Coastguard Worker        self._test_otci_example(node1, node2)
106*cfb92d14SAndroid Build Coastguard Worker
107*cfb92d14SAndroid Build Coastguard Worker        node1.factory_reset()
108*cfb92d14SAndroid Build Coastguard Worker        node2.factory_reset()
109*cfb92d14SAndroid Build Coastguard Worker
110*cfb92d14SAndroid Build Coastguard Worker        self._test_otci_multi_nodes(node1, node2, node3, node4)
111*cfb92d14SAndroid Build Coastguard Worker
112*cfb92d14SAndroid Build Coastguard Worker    def _test_otci_single_node(self, leader):
113*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader version: %r', leader.version)
114*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader thread version: %r', leader.thread_version)
115*cfb92d14SAndroid Build Coastguard Worker        logging.info('API version: %r', leader.api_version)
116*cfb92d14SAndroid Build Coastguard Worker        logging.info('log level: %r', leader.get_log_level())
117*cfb92d14SAndroid Build Coastguard Worker
118*cfb92d14SAndroid Build Coastguard Worker        leader.enable_promiscuous()
119*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(leader.get_promiscuous())
120*cfb92d14SAndroid Build Coastguard Worker        leader.disable_promiscuous()
121*cfb92d14SAndroid Build Coastguard Worker        self.assertFalse(leader.get_promiscuous())
122*cfb92d14SAndroid Build Coastguard Worker        try:
123*cfb92d14SAndroid Build Coastguard Worker            logging.info("RCP version: %r", leader.get_rcp_version())
124*cfb92d14SAndroid Build Coastguard Worker        except CommandError:
125*cfb92d14SAndroid Build Coastguard Worker            pass
126*cfb92d14SAndroid Build Coastguard Worker
127*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(leader.get_router_eligible())
128*cfb92d14SAndroid Build Coastguard Worker        leader.disable_router_eligible()
129*cfb92d14SAndroid Build Coastguard Worker        self.assertFalse(leader.get_router_eligible())
130*cfb92d14SAndroid Build Coastguard Worker        leader.enable_router_eligible()
131*cfb92d14SAndroid Build Coastguard Worker
132*cfb92d14SAndroid Build Coastguard Worker        self.assertFalse(leader.get_ifconfig_state())
133*cfb92d14SAndroid Build Coastguard Worker        # ifconfig up
134*cfb92d14SAndroid Build Coastguard Worker        leader.ifconfig_up()
135*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(leader.get_ifconfig_state())
136*cfb92d14SAndroid Build Coastguard Worker
137*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader eui64 = %r', leader.get_eui64())
138*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader extpanid = %r', leader.get_extpanid())
139*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader networkkey = %r', leader.get_network_key())
140*cfb92d14SAndroid Build Coastguard Worker
141*cfb92d14SAndroid Build Coastguard Worker        extaddr = leader.get_extaddr()
142*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(16, len(extaddr))
143*cfb92d14SAndroid Build Coastguard Worker        int(extaddr, 16)
144*cfb92d14SAndroid Build Coastguard Worker        new_extaddr = 'aabbccddeeff0011'
145*cfb92d14SAndroid Build Coastguard Worker        leader.set_extaddr(new_extaddr)
146*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(new_extaddr, leader.get_extaddr())
147*cfb92d14SAndroid Build Coastguard Worker
148*cfb92d14SAndroid Build Coastguard Worker        leader.set_network_name(TEST_NETWORK_NAME)
149*cfb92d14SAndroid Build Coastguard Worker
150*cfb92d14SAndroid Build Coastguard Worker        leader.set_network_key(TEST_NETWORK_KEY)
151*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(TEST_NETWORK_KEY, leader.get_network_key())
152*cfb92d14SAndroid Build Coastguard Worker
153*cfb92d14SAndroid Build Coastguard Worker        leader.set_panid(TEST_PANID)
154*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(TEST_PANID, leader.get_panid())
155*cfb92d14SAndroid Build Coastguard Worker
156*cfb92d14SAndroid Build Coastguard Worker        leader.set_channel(TEST_CHANNEL)
157*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(TEST_CHANNEL, leader.get_channel())
158*cfb92d14SAndroid Build Coastguard Worker
159*cfb92d14SAndroid Build Coastguard Worker        leader.set_network_name(TEST_NETWORK_NAME)
160*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(TEST_NETWORK_NAME, leader.get_network_name())
161*cfb92d14SAndroid Build Coastguard Worker
162*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('rdn', leader.get_mode())
163*cfb92d14SAndroid Build Coastguard Worker        leader.set_mode('-')
164*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('-', leader.get_mode())
165*cfb92d14SAndroid Build Coastguard Worker        leader.set_mode('rdn')
166*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('rdn', leader.get_mode())
167*cfb92d14SAndroid Build Coastguard Worker
168*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader weight: %d', leader.get_leader_weight())
169*cfb92d14SAndroid Build Coastguard Worker        leader.set_leader_weight(72)
170*cfb92d14SAndroid Build Coastguard Worker
171*cfb92d14SAndroid Build Coastguard Worker        logging.info('domain name: %r', leader.get_domain_name())
172*cfb92d14SAndroid Build Coastguard Worker        leader.set_domain_name("DefaultDomain2")
173*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual("DefaultDomain2", leader.get_domain_name())
174*cfb92d14SAndroid Build Coastguard Worker
175*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(leader.get_preferred_partition_id(), 0)
176*cfb92d14SAndroid Build Coastguard Worker        leader.set_preferred_partition_id(0xabcddead)
177*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(leader.get_preferred_partition_id(), 0xabcddead)
178*cfb92d14SAndroid Build Coastguard Worker
179*cfb92d14SAndroid Build Coastguard Worker        _setup_default_network(leader)
180*cfb92d14SAndroid Build Coastguard Worker        leader.thread_start()
181*cfb92d14SAndroid Build Coastguard Worker        leader.wait(10)
182*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('leader', leader.get_state())
183*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(0xabcddead, leader.get_leader_data()['partition_id'])
184*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader key sequence counter = %d', leader.get_key_sequence_counter())
185*cfb92d14SAndroid Build Coastguard Worker
186*cfb92d14SAndroid Build Coastguard Worker        rloc16 = leader.get_rloc16()
187*cfb92d14SAndroid Build Coastguard Worker        leader_id = leader.get_router_id()
188*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(rloc16, leader_id << 10)
189*cfb92d14SAndroid Build Coastguard Worker
190*cfb92d14SAndroid Build Coastguard Worker        self.assertFalse(leader.get_child_list())
191*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual({}, leader.get_child_table())
192*cfb92d14SAndroid Build Coastguard Worker
193*cfb92d14SAndroid Build Coastguard Worker        leader.enable_allowlist()
194*cfb92d14SAndroid Build Coastguard Worker        leader.add_allowlist(leader.get_extaddr())
195*cfb92d14SAndroid Build Coastguard Worker        leader.remove_allowlist(leader.get_extaddr())
196*cfb92d14SAndroid Build Coastguard Worker        leader.set_allowlist([leader.get_extaddr()])
197*cfb92d14SAndroid Build Coastguard Worker        leader.disable_allowlist()
198*cfb92d14SAndroid Build Coastguard Worker
199*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual([], leader.backbone_router_get_multicast_listeners())
200*cfb92d14SAndroid Build Coastguard Worker
201*cfb92d14SAndroid Build Coastguard Worker        leader.add_ipmaddr('ff04::1')
202*cfb92d14SAndroid Build Coastguard Worker        leader.del_ipmaddr('ff04::1')
203*cfb92d14SAndroid Build Coastguard Worker        leader.add_ipmaddr('ff04::2')
204*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader ipmaddrs: %r', leader.get_ipmaddrs())
205*cfb92d14SAndroid Build Coastguard Worker        self.assertFalse(leader.has_ipmaddr('ff04::1'))
206*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(leader.has_ipmaddr('ff04::2'))
207*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(leader.get_ipaddr_rloc())
208*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(leader.get_ipaddr_linklocal())
209*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(leader.get_ipaddr_mleid())
210*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(leader.get_ipmaddr_llatn())
211*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(leader.get_ipmaddr_rlatn())
212*cfb92d14SAndroid Build Coastguard Worker
213*cfb92d14SAndroid Build Coastguard Worker        leader.add_ipaddr('2001::1')
214*cfb92d14SAndroid Build Coastguard Worker        leader.del_ipaddr('2001::1')
215*cfb92d14SAndroid Build Coastguard Worker        leader.add_ipaddr('2001::2')
216*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader ipaddrs: %r', leader.get_ipaddrs())
217*cfb92d14SAndroid Build Coastguard Worker        self.assertFalse(leader.has_ipaddr('2001::1'))
218*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(leader.has_ipaddr('2001::2'))
219*cfb92d14SAndroid Build Coastguard Worker
220*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader bbr state: %r', leader.get_backbone_router_state())
221*cfb92d14SAndroid Build Coastguard Worker        bbr_config = leader.get_backbone_router_config()
222*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader bbr config: %r', bbr_config)
223*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader PBBR: %r', leader.get_primary_backbone_router_info())
224*cfb92d14SAndroid Build Coastguard Worker
225*cfb92d14SAndroid Build Coastguard Worker        new_bbr_seqno = (bbr_config['seqno'] + 1) % 256
226*cfb92d14SAndroid Build Coastguard Worker        leader.set_backbone_router_config(seqno=new_bbr_seqno, delay=10, timeout=301)
227*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual({'seqno': new_bbr_seqno, 'delay': 10, 'timeout': 301}, leader.get_backbone_router_config())
228*cfb92d14SAndroid Build Coastguard Worker
229*cfb92d14SAndroid Build Coastguard Worker        leader.enable_backbone_router()
230*cfb92d14SAndroid Build Coastguard Worker        leader.wait(3)
231*cfb92d14SAndroid Build Coastguard Worker
232*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader bbr state: %r', leader.get_backbone_router_state())
233*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader bbr config: %r', leader.get_backbone_router_config())
234*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader PBBR: %r', leader.get_primary_backbone_router_info())
235*cfb92d14SAndroid Build Coastguard Worker
236*cfb92d14SAndroid Build Coastguard Worker        leader.wait(10)
237*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(1, len(leader.backbone_router_get_multicast_listeners()))
238*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('ff04::2', leader.backbone_router_get_multicast_listeners()[0][0])
239*cfb92d14SAndroid Build Coastguard Worker
240*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader bufferinfo: %r', leader.get_message_buffer_info())
241*cfb92d14SAndroid Build Coastguard Worker
242*cfb92d14SAndroid Build Coastguard Worker        logging.info('child ipaddrs: %r', leader.get_child_ipaddrs())
243*cfb92d14SAndroid Build Coastguard Worker        logging.info('child ipmax: %r', leader.get_child_ip_max())
244*cfb92d14SAndroid Build Coastguard Worker        leader.set_child_ip_max(2)
245*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(2, leader.get_child_ip_max())
246*cfb92d14SAndroid Build Coastguard Worker        logging.info('childmax: %r', leader.get_max_children())
247*cfb92d14SAndroid Build Coastguard Worker
248*cfb92d14SAndroid Build Coastguard Worker        logging.info('counter names: %r', leader.counter_names)
249*cfb92d14SAndroid Build Coastguard Worker        for counter_name in leader.counter_names:
250*cfb92d14SAndroid Build Coastguard Worker            logging.info('counter %s: %r', counter_name, leader.get_counter(counter_name))
251*cfb92d14SAndroid Build Coastguard Worker            leader.reset_counter(counter_name)
252*cfb92d14SAndroid Build Coastguard Worker            self.assertTrue(all(x == 0 for name, x in leader.get_counter(counter_name).items() if "Time" not in name))
253*cfb92d14SAndroid Build Coastguard Worker
254*cfb92d14SAndroid Build Coastguard Worker        logging.info("CSL config: %r", leader.get_csl_config())
255*cfb92d14SAndroid Build Coastguard Worker        leader.config_csl(channel=13, period=16000, timeout=200)
256*cfb92d14SAndroid Build Coastguard Worker        logging.info("CSL config: %r", leader.get_csl_config())
257*cfb92d14SAndroid Build Coastguard Worker
258*cfb92d14SAndroid Build Coastguard Worker        logging.info("EID-to-RLOC cache: %r", leader.get_eidcache())
259*cfb92d14SAndroid Build Coastguard Worker
260*cfb92d14SAndroid Build Coastguard Worker        logging.info("leader data: %r", leader.get_leader_data())
261*cfb92d14SAndroid Build Coastguard Worker        logging.info("leader neighbor list: %r", leader.get_neighbor_list())
262*cfb92d14SAndroid Build Coastguard Worker        logging.info("leader neighbor table: %r", leader.get_neighbor_table())
263*cfb92d14SAndroid Build Coastguard Worker        logging.info("Leader external routes: %r", leader.get_local_routes())
264*cfb92d14SAndroid Build Coastguard Worker        leader.add_route('2002::/64')
265*cfb92d14SAndroid Build Coastguard Worker        leader.register_network_data()
266*cfb92d14SAndroid Build Coastguard Worker        logging.info("Leader external routes: %r", leader.get_local_routes())
267*cfb92d14SAndroid Build Coastguard Worker
268*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(1, len(leader.get_router_list()))
269*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(1, len(leader.get_router_table()))
270*cfb92d14SAndroid Build Coastguard Worker        logging.info("Leader router table: %r", leader.get_router_table())
271*cfb92d14SAndroid Build Coastguard Worker        self.assertFalse(list(leader.get_router_table().values())[0].is_link_established)
272*cfb92d14SAndroid Build Coastguard Worker
273*cfb92d14SAndroid Build Coastguard Worker        logging.info('discover: %r', leader.discover())
274*cfb92d14SAndroid Build Coastguard Worker        logging.info('scan: %r', leader.scan())
275*cfb92d14SAndroid Build Coastguard Worker        logging.info('scan energy: %r', leader.scan_energy())
276*cfb92d14SAndroid Build Coastguard Worker
277*cfb92d14SAndroid Build Coastguard Worker        leader.add_service(44970, '112233', 'aabbcc')
278*cfb92d14SAndroid Build Coastguard Worker        leader.register_network_data()
279*cfb92d14SAndroid Build Coastguard Worker        leader.add_service(44971, b'\x11\x22\x33', b'\xaa\xbb\xcc\xdd')
280*cfb92d14SAndroid Build Coastguard Worker
281*cfb92d14SAndroid Build Coastguard Worker        leader.add_prefix("2001::/64")
282*cfb92d14SAndroid Build Coastguard Worker
283*cfb92d14SAndroid Build Coastguard Worker        logging.info("network data: %r", leader.get_network_data())
284*cfb92d14SAndroid Build Coastguard Worker        logging.info("network data raw: %r", leader.get_network_data_bytes())
285*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(leader.get_network_data()['prefixes'], leader.get_prefixes())
286*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(leader.get_network_data()['routes'], leader.get_routes())
287*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(leader.get_network_data()['services'], leader.get_services())
288*cfb92d14SAndroid Build Coastguard Worker
289*cfb92d14SAndroid Build Coastguard Worker        logging.info("local prefixes: %r", leader.get_local_prefixes())
290*cfb92d14SAndroid Build Coastguard Worker        logging.info("local routes: %r", leader.get_local_routes())
291*cfb92d14SAndroid Build Coastguard Worker
292*cfb92d14SAndroid Build Coastguard Worker        logging.info('txpower %r', leader.get_txpower())
293*cfb92d14SAndroid Build Coastguard Worker        leader.set_txpower(-10)
294*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(-10, leader.get_txpower())
295*cfb92d14SAndroid Build Coastguard Worker
296*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(leader.is_singleton())
297*cfb92d14SAndroid Build Coastguard Worker
298*cfb92d14SAndroid Build Coastguard Worker        leader.coap_start()
299*cfb92d14SAndroid Build Coastguard Worker        leader.coap_set_test_resource_path('test')
300*cfb92d14SAndroid Build Coastguard Worker        leader.coap_test_set_resource_content('helloworld')
301*cfb92d14SAndroid Build Coastguard Worker        leader.coap_get(leader.get_ipaddr_rloc(), 'test')
302*cfb92d14SAndroid Build Coastguard Worker        leader.coap_put(leader.get_ipaddr_rloc(), 'test', 'con', 'xxx')
303*cfb92d14SAndroid Build Coastguard Worker        leader.coap_post(leader.get_ipaddr_rloc(), 'test', 'con', 'xxx')
304*cfb92d14SAndroid Build Coastguard Worker        leader.coap_delete(leader.get_ipaddr_rloc(), 'test', 'con', 'xxx')
305*cfb92d14SAndroid Build Coastguard Worker        leader.wait(1)
306*cfb92d14SAndroid Build Coastguard Worker        leader.coap_stop()
307*cfb92d14SAndroid Build Coastguard Worker
308*cfb92d14SAndroid Build Coastguard Worker        for netif in (NetifIdentifier.THERAD, NetifIdentifier.UNSPECIFIED, NetifIdentifier.BACKBONE):
309*cfb92d14SAndroid Build Coastguard Worker            leader.udp_open()
310*cfb92d14SAndroid Build Coastguard Worker            leader.udp_bind("::", 1234, netif=netif)
311*cfb92d14SAndroid Build Coastguard Worker            leader.udp_send(leader.get_ipaddr_rloc(), 1234, text='hello')
312*cfb92d14SAndroid Build Coastguard Worker            leader.udp_send(leader.get_ipaddr_rloc(), 1234, random_bytes=3)
313*cfb92d14SAndroid Build Coastguard Worker            leader.udp_send(leader.get_ipaddr_rloc(), 1234, hex='112233')
314*cfb92d14SAndroid Build Coastguard Worker            leader.wait(1)
315*cfb92d14SAndroid Build Coastguard Worker            leader.udp_close()
316*cfb92d14SAndroid Build Coastguard Worker
317*cfb92d14SAndroid Build Coastguard Worker        logging.info('dataset: %r', leader.get_dataset())
318*cfb92d14SAndroid Build Coastguard Worker        logging.info('dataset active: %r', leader.get_dataset('active'))
319*cfb92d14SAndroid Build Coastguard Worker
320*cfb92d14SAndroid Build Coastguard Worker        leader.dataset_init_buffer()
321*cfb92d14SAndroid Build Coastguard Worker        leader.dataset_commit_buffer('pending')
322*cfb92d14SAndroid Build Coastguard Worker        leader.dataset_init_buffer(get_active_dataset=True)
323*cfb92d14SAndroid Build Coastguard Worker        leader.dataset_init_buffer(get_pending_dataset=True)
324*cfb92d14SAndroid Build Coastguard Worker
325*cfb92d14SAndroid Build Coastguard Worker        logging.info('dataset: %r', leader.get_dataset())
326*cfb92d14SAndroid Build Coastguard Worker        logging.info('dataset active: %r', leader.get_dataset('active'))
327*cfb92d14SAndroid Build Coastguard Worker        logging.info('dataset pending: %r', leader.get_dataset('pending'))
328*cfb92d14SAndroid Build Coastguard Worker
329*cfb92d14SAndroid Build Coastguard Worker        logging.info('dataset active -x: %r', leader.get_dataset_bytes('active'))
330*cfb92d14SAndroid Build Coastguard Worker        logging.info('dataset pending -x: %r', leader.get_dataset_bytes('pending'))
331*cfb92d14SAndroid Build Coastguard Worker
332*cfb92d14SAndroid Build Coastguard Worker        # Test SRP server & client
333*cfb92d14SAndroid Build Coastguard Worker        self._test_otci_srp(leader, leader)
334*cfb92d14SAndroid Build Coastguard Worker
335*cfb92d14SAndroid Build Coastguard Worker        # Test DNS client and server
336*cfb92d14SAndroid Build Coastguard Worker        self._test_otci_dns(leader, leader)
337*cfb92d14SAndroid Build Coastguard Worker
338*cfb92d14SAndroid Build Coastguard Worker        self._test_otci_srp_remove(leader, leader)
339*cfb92d14SAndroid Build Coastguard Worker
340*cfb92d14SAndroid Build Coastguard Worker    def _test_otci_dns(self, client: OTCI, server: OTCI):
341*cfb92d14SAndroid Build Coastguard Worker        dns_cfg = client.dns_get_config()
342*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(dns_cfg['server'])
343*cfb92d14SAndroid Build Coastguard Worker        self.assertIn('response_timeout', dns_cfg)
344*cfb92d14SAndroid Build Coastguard Worker        self.assertIn('max_tx_attempts', dns_cfg)
345*cfb92d14SAndroid Build Coastguard Worker        self.assertIn('recursion_desired', dns_cfg)
346*cfb92d14SAndroid Build Coastguard Worker
347*cfb92d14SAndroid Build Coastguard Worker        client.dns_set_config(server=(server.get_ipaddr_rloc(), 53),
348*cfb92d14SAndroid Build Coastguard Worker                              response_timeout=10000,
349*cfb92d14SAndroid Build Coastguard Worker                              max_tx_attempts=4,
350*cfb92d14SAndroid Build Coastguard Worker                              recursion_desired=False)
351*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(
352*cfb92d14SAndroid Build Coastguard Worker            {
353*cfb92d14SAndroid Build Coastguard Worker                'server': (server.get_ipaddr_rloc(), 53),
354*cfb92d14SAndroid Build Coastguard Worker                'response_timeout': 10000,
355*cfb92d14SAndroid Build Coastguard Worker                'max_tx_attempts': 4,
356*cfb92d14SAndroid Build Coastguard Worker                'recursion_desired': False
357*cfb92d14SAndroid Build Coastguard Worker            }, client.dns_get_config())
358*cfb92d14SAndroid Build Coastguard Worker
359*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(client.dns_get_compression())
360*cfb92d14SAndroid Build Coastguard Worker        client.dns_disable_compression()
361*cfb92d14SAndroid Build Coastguard Worker        self.assertFalse(client.dns_get_compression())
362*cfb92d14SAndroid Build Coastguard Worker        client.dns_enable_compression()
363*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(client.dns_get_compression())
364*cfb92d14SAndroid Build Coastguard Worker
365*cfb92d14SAndroid Build Coastguard Worker        logging.info('dns browse: %r', client.dns_browse('_ipps._tcp.default.service.arpa.'))
366*cfb92d14SAndroid Build Coastguard Worker        logging.info('dns browse: %r', client.dns_browse('_meshcop._udp.default.service.arpa.'))
367*cfb92d14SAndroid Build Coastguard Worker        logging.info('dns resolve: %r', client.dns_resolve_service('ins1', '_ipps._tcp.default.service.arpa.'))
368*cfb92d14SAndroid Build Coastguard Worker        logging.info('dns resolve: %r', client.dns_resolve('host1.default.service.arpa.'))
369*cfb92d14SAndroid Build Coastguard Worker
370*cfb92d14SAndroid Build Coastguard Worker    def _test_otci_srp(self, client: OTCI, server: OTCI):
371*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('disabled', server.srp_server_get_state())
372*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('default.service.arpa.', server.srp_server_get_domain())
373*cfb92d14SAndroid Build Coastguard Worker        server.srp_server_set_domain('example1.com')
374*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('example1.com.', server.srp_server_get_domain())
375*cfb92d14SAndroid Build Coastguard Worker        server.srp_server_set_domain('example2.com.')
376*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('example2.com.', server.srp_server_get_domain())
377*cfb92d14SAndroid Build Coastguard Worker        server.srp_server_set_domain('default.service.arpa.')
378*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('default.service.arpa.', server.srp_server_get_domain())
379*cfb92d14SAndroid Build Coastguard Worker
380*cfb92d14SAndroid Build Coastguard Worker        default_leases = server.srp_server_get_lease()
381*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(default_leases, (30, 97200, 30, 680400))
382*cfb92d14SAndroid Build Coastguard Worker        server.srp_server_set_lease(1801, 7201, 86401, 1209601)
383*cfb92d14SAndroid Build Coastguard Worker        leases = server.srp_server_get_lease()
384*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(leases, (1801, 7201, 86401, 1209601))
385*cfb92d14SAndroid Build Coastguard Worker
386*cfb92d14SAndroid Build Coastguard Worker        self.assertFalse(client.srp_client_get_state())
387*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('Removed', client.srp_client_get_host_state())
388*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(('::', 0), client.srp_client_get_server())
389*cfb92d14SAndroid Build Coastguard Worker
390*cfb92d14SAndroid Build Coastguard Worker        self.assertFalse(client.srp_client_get_service_key())
391*cfb92d14SAndroid Build Coastguard Worker        client.srp_client_enable_service_key()
392*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(client.srp_client_get_service_key())
393*cfb92d14SAndroid Build Coastguard Worker        client.srp_client_disable_service_key()
394*cfb92d14SAndroid Build Coastguard Worker        self.assertFalse(client.srp_client_get_service_key())
395*cfb92d14SAndroid Build Coastguard Worker
396*cfb92d14SAndroid Build Coastguard Worker        server.srp_server_disable()
397*cfb92d14SAndroid Build Coastguard Worker        client.wait(3)
398*cfb92d14SAndroid Build Coastguard Worker        server.srp_server_enable()
399*cfb92d14SAndroid Build Coastguard Worker        client.wait(10)
400*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual([], server.srp_server_get_hosts())
401*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('running', server.srp_server_get_state())
402*cfb92d14SAndroid Build Coastguard Worker
403*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(client.srp_client_get_autostart())
404*cfb92d14SAndroid Build Coastguard Worker        client.wait(3)
405*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(client.srp_client_get_state())
406*cfb92d14SAndroid Build Coastguard Worker        self.assertNotEqual(('::', 0), client.srp_client_get_server())
407*cfb92d14SAndroid Build Coastguard Worker
408*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('', client.srp_client_get_host_name())
409*cfb92d14SAndroid Build Coastguard Worker        client.srp_client_set_host_name('host1')
410*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('host1', client.srp_client_get_host_name())
411*cfb92d14SAndroid Build Coastguard Worker
412*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual([], client.srp_client_get_host_addresses())
413*cfb92d14SAndroid Build Coastguard Worker        client.srp_client_set_host_addresses('2001::1')
414*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(['2001::1'], client.srp_client_get_host_addresses())
415*cfb92d14SAndroid Build Coastguard Worker        client.srp_client_set_host_addresses('2001::1', '2001::2')
416*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(['2001::1', '2001::2'], client.srp_client_get_host_addresses())
417*cfb92d14SAndroid Build Coastguard Worker        srp_client_host = client.srp_client_get_host()
418*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('host1', srp_client_host['host'])
419*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('ToAdd', srp_client_host['state'])
420*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(
421*cfb92d14SAndroid Build Coastguard Worker            {ipaddress.IPv6Address('2001::1'), ipaddress.IPv6Address('2001::2')}, set(srp_client_host['addresses']))
422*cfb92d14SAndroid Build Coastguard Worker
423*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual([], client.srp_client_get_services())
424*cfb92d14SAndroid Build Coastguard Worker        client.srp_client_add_service('ins1',
425*cfb92d14SAndroid Build Coastguard Worker                                      '_ipps._tcp',
426*cfb92d14SAndroid Build Coastguard Worker                                      1000,
427*cfb92d14SAndroid Build Coastguard Worker                                      1,
428*cfb92d14SAndroid Build Coastguard Worker                                      1,
429*cfb92d14SAndroid Build Coastguard Worker                                      txt={
430*cfb92d14SAndroid Build Coastguard Worker                                          'txt11': 'val11',
431*cfb92d14SAndroid Build Coastguard Worker                                          'txt12': b'val12',
432*cfb92d14SAndroid Build Coastguard Worker                                          'txt13': True
433*cfb92d14SAndroid Build Coastguard Worker                                      })
434*cfb92d14SAndroid Build Coastguard Worker        client.srp_client_add_service('ins2',
435*cfb92d14SAndroid Build Coastguard Worker                                      '_meshcop._udp',
436*cfb92d14SAndroid Build Coastguard Worker                                      2000,
437*cfb92d14SAndroid Build Coastguard Worker                                      2,
438*cfb92d14SAndroid Build Coastguard Worker                                      2,
439*cfb92d14SAndroid Build Coastguard Worker                                      txt={
440*cfb92d14SAndroid Build Coastguard Worker                                          'txt21': 'val21',
441*cfb92d14SAndroid Build Coastguard Worker                                          'txt22': b'val22',
442*cfb92d14SAndroid Build Coastguard Worker                                          'txt23': True
443*cfb92d14SAndroid Build Coastguard Worker                                      })
444*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(2, len(client.srp_client_get_services()))
445*cfb92d14SAndroid Build Coastguard Worker        self.assertIn(
446*cfb92d14SAndroid Build Coastguard Worker            {
447*cfb92d14SAndroid Build Coastguard Worker                'instance': 'ins1',
448*cfb92d14SAndroid Build Coastguard Worker                'service': '_ipps._tcp',
449*cfb92d14SAndroid Build Coastguard Worker                'state': 'ToAdd',
450*cfb92d14SAndroid Build Coastguard Worker                'port': 1000,
451*cfb92d14SAndroid Build Coastguard Worker                'priority': 1,
452*cfb92d14SAndroid Build Coastguard Worker                'weight': 1,
453*cfb92d14SAndroid Build Coastguard Worker            }, client.srp_client_get_services())
454*cfb92d14SAndroid Build Coastguard Worker        self.assertIn(
455*cfb92d14SAndroid Build Coastguard Worker            {
456*cfb92d14SAndroid Build Coastguard Worker                'instance': 'ins2',
457*cfb92d14SAndroid Build Coastguard Worker                'service': '_meshcop._udp',
458*cfb92d14SAndroid Build Coastguard Worker                'state': 'ToAdd',
459*cfb92d14SAndroid Build Coastguard Worker                'port': 2000,
460*cfb92d14SAndroid Build Coastguard Worker                'priority': 2,
461*cfb92d14SAndroid Build Coastguard Worker                'weight': 2,
462*cfb92d14SAndroid Build Coastguard Worker            }, client.srp_client_get_services())
463*cfb92d14SAndroid Build Coastguard Worker
464*cfb92d14SAndroid Build Coastguard Worker        client.wait(3)
465*cfb92d14SAndroid Build Coastguard Worker
466*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('Registered', client.srp_client_get_host()['state'])
467*cfb92d14SAndroid Build Coastguard Worker
468*cfb92d14SAndroid Build Coastguard Worker        srp_server_hosts = server.srp_server_get_hosts()
469*cfb92d14SAndroid Build Coastguard Worker        logging.info('srp_server_hosts %r', srp_server_hosts)
470*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(1, len(srp_server_hosts))
471*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('host1.default.service.arpa.', srp_server_hosts[0]['host'])
472*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(False, srp_server_hosts[0]['deleted'])
473*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(
474*cfb92d14SAndroid Build Coastguard Worker            {ipaddress.IPv6Address('2001::1'), ipaddress.IPv6Address('2001::2')},
475*cfb92d14SAndroid Build Coastguard Worker            set(srp_server_hosts[0]['addresses']))
476*cfb92d14SAndroid Build Coastguard Worker
477*cfb92d14SAndroid Build Coastguard Worker        srp_server_services = server.srp_server_get_services()
478*cfb92d14SAndroid Build Coastguard Worker        logging.info('srp_server_services %r', srp_server_services)
479*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(2, len(srp_server_services))
480*cfb92d14SAndroid Build Coastguard Worker        for service in srp_server_services:
481*cfb92d14SAndroid Build Coastguard Worker            if service['instance'] == 'ins1._ipps._tcp.default.service.arpa.':
482*cfb92d14SAndroid Build Coastguard Worker                self.assertEqual(False, service['deleted'])
483*cfb92d14SAndroid Build Coastguard Worker                self.assertEqual(1000, service['port'])
484*cfb92d14SAndroid Build Coastguard Worker                self.assertEqual(1, service['priority'])
485*cfb92d14SAndroid Build Coastguard Worker                self.assertEqual(1, service['weight'])
486*cfb92d14SAndroid Build Coastguard Worker                self.assertEqual('host1.default.service.arpa.', service['host'])
487*cfb92d14SAndroid Build Coastguard Worker                self.assertEqual({ipaddress.IPv6Address('2001::1'),
488*cfb92d14SAndroid Build Coastguard Worker                                  ipaddress.IPv6Address('2001::2')}, set(service['addresses']))
489*cfb92d14SAndroid Build Coastguard Worker                self.assertEqual({'txt11': b'val11', 'txt12': b'val12', 'txt13': True}, service['txt'])
490*cfb92d14SAndroid Build Coastguard Worker            elif service['instance'] == 'ins2._meshcop._udp.default.service.arpa.':
491*cfb92d14SAndroid Build Coastguard Worker                self.assertEqual(False, service['deleted'])
492*cfb92d14SAndroid Build Coastguard Worker                self.assertEqual(2000, service['port'])
493*cfb92d14SAndroid Build Coastguard Worker                self.assertEqual(2, service['priority'])
494*cfb92d14SAndroid Build Coastguard Worker                self.assertEqual(2, service['weight'])
495*cfb92d14SAndroid Build Coastguard Worker                self.assertEqual('host1.default.service.arpa.', service['host'])
496*cfb92d14SAndroid Build Coastguard Worker                self.assertEqual({ipaddress.IPv6Address('2001::1'),
497*cfb92d14SAndroid Build Coastguard Worker                                  ipaddress.IPv6Address('2001::2')}, set(service['addresses']))
498*cfb92d14SAndroid Build Coastguard Worker                self.assertEqual({'txt21': b'val21', 'txt22': b'val22', 'txt23': True}, service['txt'])
499*cfb92d14SAndroid Build Coastguard Worker            else:
500*cfb92d14SAndroid Build Coastguard Worker                self.fail(service)
501*cfb92d14SAndroid Build Coastguard Worker
502*cfb92d14SAndroid Build Coastguard Worker    def _test_otci_srp_remove(self, client: OTCI, server: OTCI):
503*cfb92d14SAndroid Build Coastguard Worker        client.srp_client_remove_host(remove_key_lease=True)
504*cfb92d14SAndroid Build Coastguard Worker        client.wait(3)
505*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual([], client.srp_client_get_services())
506*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('Removed', client.srp_client_get_host()['state'])
507*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual([], server.srp_server_get_hosts())
508*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual([], server.srp_server_get_services())
509*cfb92d14SAndroid Build Coastguard Worker
510*cfb92d14SAndroid Build Coastguard Worker    def _test_otci_example(self, node1, node2):
511*cfb92d14SAndroid Build Coastguard Worker        node1.dataset_init_buffer()
512*cfb92d14SAndroid Build Coastguard Worker        node1.dataset_set_buffer(network_name='test',
513*cfb92d14SAndroid Build Coastguard Worker                                 network_key='00112233445566778899aabbccddeeff',
514*cfb92d14SAndroid Build Coastguard Worker                                 panid=0xface,
515*cfb92d14SAndroid Build Coastguard Worker                                 channel=11)
516*cfb92d14SAndroid Build Coastguard Worker        node1.dataset_commit_buffer('active')
517*cfb92d14SAndroid Build Coastguard Worker
518*cfb92d14SAndroid Build Coastguard Worker        node1.ifconfig_up()
519*cfb92d14SAndroid Build Coastguard Worker        node1.thread_start()
520*cfb92d14SAndroid Build Coastguard Worker        node1.wait(10)
521*cfb92d14SAndroid Build Coastguard Worker        assert node1.get_state() == "leader"
522*cfb92d14SAndroid Build Coastguard Worker
523*cfb92d14SAndroid Build Coastguard Worker        node1.commissioner_start()
524*cfb92d14SAndroid Build Coastguard Worker        node1.wait(3)
525*cfb92d14SAndroid Build Coastguard Worker
526*cfb92d14SAndroid Build Coastguard Worker        node1.commissioner_add_joiner("TEST123", eui64='*')
527*cfb92d14SAndroid Build Coastguard Worker
528*cfb92d14SAndroid Build Coastguard Worker        node2.ifconfig_up()
529*cfb92d14SAndroid Build Coastguard Worker        node2.set_router_selection_jitter(1)
530*cfb92d14SAndroid Build Coastguard Worker
531*cfb92d14SAndroid Build Coastguard Worker        node2.joiner_start("TEST123")
532*cfb92d14SAndroid Build Coastguard Worker        node2.wait(10, expect_line="Join success")
533*cfb92d14SAndroid Build Coastguard Worker        node2.thread_start()
534*cfb92d14SAndroid Build Coastguard Worker        node2.wait(10)
535*cfb92d14SAndroid Build Coastguard Worker        assert node2.get_state() == "router"
536*cfb92d14SAndroid Build Coastguard Worker
537*cfb92d14SAndroid Build Coastguard Worker    def _test_otci_multi_nodes(self, leader, commissioner, child1, child2):
538*cfb92d14SAndroid Build Coastguard Worker        self.assertFalse(leader.get_ifconfig_state())
539*cfb92d14SAndroid Build Coastguard Worker
540*cfb92d14SAndroid Build Coastguard Worker        # ifconfig up
541*cfb92d14SAndroid Build Coastguard Worker        leader.ifconfig_up()
542*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(leader.get_ifconfig_state())
543*cfb92d14SAndroid Build Coastguard Worker
544*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader eui64 = %r', leader.get_eui64())
545*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader extpanid = %r', leader.get_extpanid())
546*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader networkkey = %r', leader.get_network_key())
547*cfb92d14SAndroid Build Coastguard Worker
548*cfb92d14SAndroid Build Coastguard Worker        extaddr = leader.get_extaddr()
549*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(16, len(extaddr))
550*cfb92d14SAndroid Build Coastguard Worker        int(extaddr, 16)
551*cfb92d14SAndroid Build Coastguard Worker        new_extaddr = 'aabbccddeeff0011'
552*cfb92d14SAndroid Build Coastguard Worker        leader.set_extaddr(new_extaddr)
553*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(new_extaddr, leader.get_extaddr())
554*cfb92d14SAndroid Build Coastguard Worker
555*cfb92d14SAndroid Build Coastguard Worker        _setup_default_network(leader)
556*cfb92d14SAndroid Build Coastguard Worker
557*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(TEST_CHANNEL, leader.get_channel())
558*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(TEST_NETWORK_KEY, leader.get_network_key())
559*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(TEST_NETWORK_NAME, leader.get_network_name())
560*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(TEST_PANID, leader.get_panid())
561*cfb92d14SAndroid Build Coastguard Worker
562*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('rdn', leader.get_mode())
563*cfb92d14SAndroid Build Coastguard Worker
564*cfb92d14SAndroid Build Coastguard Worker        leader.thread_start()
565*cfb92d14SAndroid Build Coastguard Worker        leader.wait(10)
566*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('leader', leader.get_state())
567*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader key sequence counter = %d', leader.get_key_sequence_counter())
568*cfb92d14SAndroid Build Coastguard Worker
569*cfb92d14SAndroid Build Coastguard Worker        rloc16 = leader.get_rloc16()
570*cfb92d14SAndroid Build Coastguard Worker        leader_id = leader.get_router_id()
571*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(rloc16, leader_id << 10)
572*cfb92d14SAndroid Build Coastguard Worker
573*cfb92d14SAndroid Build Coastguard Worker        commissioner.dataset_clear_buffer()
574*cfb92d14SAndroid Build Coastguard Worker        commissioner.dataset_set_buffer(
575*cfb92d14SAndroid Build Coastguard Worker            channel=TEST_CHANNEL,
576*cfb92d14SAndroid Build Coastguard Worker            network_key=TEST_NETWORK_KEY,
577*cfb92d14SAndroid Build Coastguard Worker            panid=TEST_PANID,
578*cfb92d14SAndroid Build Coastguard Worker        )
579*cfb92d14SAndroid Build Coastguard Worker        commissioner.dataset_commit_buffer('active')
580*cfb92d14SAndroid Build Coastguard Worker        commissioner.set_router_selection_jitter(1)
581*cfb92d14SAndroid Build Coastguard Worker        commissioner.ifconfig_up()
582*cfb92d14SAndroid Build Coastguard Worker        commissioner.thread_start()
583*cfb92d14SAndroid Build Coastguard Worker
584*cfb92d14SAndroid Build Coastguard Worker        commissioner.wait(10)
585*cfb92d14SAndroid Build Coastguard Worker
586*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('router', commissioner.get_state())
587*cfb92d14SAndroid Build Coastguard Worker
588*cfb92d14SAndroid Build Coastguard Worker        for dst_ip in leader.get_ipaddrs():
589*cfb92d14SAndroid Build Coastguard Worker            statistics = commissioner.ping(dst_ip, size=10, count=10, interval=2, hoplimit=3)
590*cfb92d14SAndroid Build Coastguard Worker            self.assertEqual(statistics['transmitted_packets'], 10)
591*cfb92d14SAndroid Build Coastguard Worker            self.assertEqual(statistics['received_packets'], 10)
592*cfb92d14SAndroid Build Coastguard Worker            self.assertAlmostEqual(statistics['packet_loss'], 0.0, delta=1e-9)
593*cfb92d14SAndroid Build Coastguard Worker            rtt = statistics['round_trip_time']
594*cfb92d14SAndroid Build Coastguard Worker            self.assertTrue(rtt['min'] - 1e-9 <= rtt['avg'] <= rtt['max'] + 1e-9)
595*cfb92d14SAndroid Build Coastguard Worker            commissioner.wait(1)
596*cfb92d14SAndroid Build Coastguard Worker
597*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('disabled', commissioner.get_commissioiner_state())
598*cfb92d14SAndroid Build Coastguard Worker        commissioner.commissioner_start()
599*cfb92d14SAndroid Build Coastguard Worker        commissioner.wait(5)
600*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('active', commissioner.get_commissioiner_state())
601*cfb92d14SAndroid Build Coastguard Worker
602*cfb92d14SAndroid Build Coastguard Worker        logging.info('commissioner.get_network_id_timeout() = %d', commissioner.get_network_id_timeout())
603*cfb92d14SAndroid Build Coastguard Worker        commissioner.set_network_id_timeout(60)
604*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(60, commissioner.get_network_id_timeout())
605*cfb92d14SAndroid Build Coastguard Worker
606*cfb92d14SAndroid Build Coastguard Worker        commissioner.commissioner_add_joiner('TEST123', eui64='*')
607*cfb92d14SAndroid Build Coastguard Worker        commissioner.wait(3)
608*cfb92d14SAndroid Build Coastguard Worker
609*cfb92d14SAndroid Build Coastguard Worker        child1.ifconfig_up()
610*cfb92d14SAndroid Build Coastguard Worker
611*cfb92d14SAndroid Build Coastguard Worker        logging.info("child1 discover: %r", child1.discover())
612*cfb92d14SAndroid Build Coastguard Worker        logging.info("child1 scan: %r", child1.scan())
613*cfb92d14SAndroid Build Coastguard Worker        logging.info("child1 scan energy: %r", child1.scan_energy())
614*cfb92d14SAndroid Build Coastguard Worker
615*cfb92d14SAndroid Build Coastguard Worker        child1.set_mode('rn')
616*cfb92d14SAndroid Build Coastguard Worker        child1.set_router_selection_jitter(1)
617*cfb92d14SAndroid Build Coastguard Worker
618*cfb92d14SAndroid Build Coastguard Worker        child1.joiner_start('TEST123')
619*cfb92d14SAndroid Build Coastguard Worker        logging.info('joiner id = %r', child1.get_joiner_id())
620*cfb92d14SAndroid Build Coastguard Worker        child1.wait(10, expect_line="Join success")
621*cfb92d14SAndroid Build Coastguard Worker
622*cfb92d14SAndroid Build Coastguard Worker        child1.enable_allowlist()
623*cfb92d14SAndroid Build Coastguard Worker        child1.disable_allowlist()
624*cfb92d14SAndroid Build Coastguard Worker        child1.add_allowlist(commissioner.get_extaddr())
625*cfb92d14SAndroid Build Coastguard Worker        child1.remove_allowlist(commissioner.get_extaddr())
626*cfb92d14SAndroid Build Coastguard Worker        child1.set_allowlist([commissioner.get_extaddr()])
627*cfb92d14SAndroid Build Coastguard Worker
628*cfb92d14SAndroid Build Coastguard Worker        child1.thread_start()
629*cfb92d14SAndroid Build Coastguard Worker        child1.wait(3)
630*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('child', child1.get_state())
631*cfb92d14SAndroid Build Coastguard Worker
632*cfb92d14SAndroid Build Coastguard Worker        child1.thread_stop()
633*cfb92d14SAndroid Build Coastguard Worker
634*cfb92d14SAndroid Build Coastguard Worker        child1.set_mode('n')
635*cfb92d14SAndroid Build Coastguard Worker        child1.set_poll_period(1000)
636*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(1000, child1.get_poll_period())
637*cfb92d14SAndroid Build Coastguard Worker
638*cfb92d14SAndroid Build Coastguard Worker        child1.thread_start()
639*cfb92d14SAndroid Build Coastguard Worker        child1.wait(3)
640*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('child', child1.get_state())
641*cfb92d14SAndroid Build Coastguard Worker
642*cfb92d14SAndroid Build Coastguard Worker        child2.ifconfig_up()
643*cfb92d14SAndroid Build Coastguard Worker        child2.set_mode('rn')
644*cfb92d14SAndroid Build Coastguard Worker        child2.set_router_selection_jitter(1)
645*cfb92d14SAndroid Build Coastguard Worker
646*cfb92d14SAndroid Build Coastguard Worker        child2.joiner_start('TEST123')
647*cfb92d14SAndroid Build Coastguard Worker        logging.info('joiner id = %r', child2.get_joiner_id())
648*cfb92d14SAndroid Build Coastguard Worker        child2.wait(10, expect_line="Join success")
649*cfb92d14SAndroid Build Coastguard Worker
650*cfb92d14SAndroid Build Coastguard Worker        child2.enable_allowlist()
651*cfb92d14SAndroid Build Coastguard Worker        child2.disable_allowlist()
652*cfb92d14SAndroid Build Coastguard Worker        child2.add_allowlist(commissioner.get_extaddr())
653*cfb92d14SAndroid Build Coastguard Worker        child2.remove_allowlist(commissioner.get_extaddr())
654*cfb92d14SAndroid Build Coastguard Worker        child2.set_allowlist([commissioner.get_extaddr()])
655*cfb92d14SAndroid Build Coastguard Worker
656*cfb92d14SAndroid Build Coastguard Worker        child2.thread_start()
657*cfb92d14SAndroid Build Coastguard Worker        child2.wait(3)
658*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual('child', child2.get_state())
659*cfb92d14SAndroid Build Coastguard Worker
660*cfb92d14SAndroid Build Coastguard Worker        child_table = commissioner.get_child_table()
661*cfb92d14SAndroid Build Coastguard Worker        logging.info('commissioiner child table: \n%s\n', json.dumps(child_table, indent=True))
662*cfb92d14SAndroid Build Coastguard Worker        child_list = commissioner.get_child_list()
663*cfb92d14SAndroid Build Coastguard Worker        logging.info('commissioiner child list: %r', child_list)
664*cfb92d14SAndroid Build Coastguard Worker        for child_id in child_list:
665*cfb92d14SAndroid Build Coastguard Worker            logging.info('child %s info: %r', child_id, commissioner.get_child_info(child_id))
666*cfb92d14SAndroid Build Coastguard Worker
667*cfb92d14SAndroid Build Coastguard Worker        logging.info('child1 info: %r', commissioner.get_child_info(child1.get_rloc16()))
668*cfb92d14SAndroid Build Coastguard Worker        logging.info('child2 info: %r', commissioner.get_child_info(child2.get_rloc16()))
669*cfb92d14SAndroid Build Coastguard Worker
670*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(set(commissioner.get_child_list()), set(commissioner.get_child_table().keys()))
671*cfb92d14SAndroid Build Coastguard Worker
672*cfb92d14SAndroid Build Coastguard Worker        child1.add_ipmaddr('ff04::1')
673*cfb92d14SAndroid Build Coastguard Worker        child1.del_ipmaddr('ff04::1')
674*cfb92d14SAndroid Build Coastguard Worker        child1.add_ipmaddr('ff04::2')
675*cfb92d14SAndroid Build Coastguard Worker        logging.info('child1 ipmaddrs: %r', child1.get_ipmaddrs())
676*cfb92d14SAndroid Build Coastguard Worker        self.assertFalse(child1.has_ipmaddr('ff04::1'))
677*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(child1.has_ipmaddr('ff04::2'))
678*cfb92d14SAndroid Build Coastguard Worker
679*cfb92d14SAndroid Build Coastguard Worker        child1.add_ipaddr('2001::1')
680*cfb92d14SAndroid Build Coastguard Worker        child1.del_ipaddr('2001::1')
681*cfb92d14SAndroid Build Coastguard Worker        child1.add_ipaddr('2001::2')
682*cfb92d14SAndroid Build Coastguard Worker        logging.info('child1 ipaddrs: %r', child1.get_ipaddrs())
683*cfb92d14SAndroid Build Coastguard Worker        self.assertFalse(child1.has_ipaddr('2001::1'))
684*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(child1.has_ipaddr('2001::2'))
685*cfb92d14SAndroid Build Coastguard Worker
686*cfb92d14SAndroid Build Coastguard Worker        logging.info('child ipaddrs: %r', commissioner.get_child_ipaddrs())
687*cfb92d14SAndroid Build Coastguard Worker
688*cfb92d14SAndroid Build Coastguard Worker        logging.info("EID-to-RLOC cache: %r", leader.get_eidcache())
689*cfb92d14SAndroid Build Coastguard Worker
690*cfb92d14SAndroid Build Coastguard Worker        logging.info("leader neighbor list: %r", leader.get_neighbor_list())
691*cfb92d14SAndroid Build Coastguard Worker        logging.info("leader neighbor table: %r", leader.get_neighbor_table())
692*cfb92d14SAndroid Build Coastguard Worker        logging.info("prefixes: %r", commissioner.get_local_prefixes())
693*cfb92d14SAndroid Build Coastguard Worker        commissioner.add_prefix('2001::/64')
694*cfb92d14SAndroid Build Coastguard Worker        commissioner.register_network_data()
695*cfb92d14SAndroid Build Coastguard Worker        commissioner.wait(1)
696*cfb92d14SAndroid Build Coastguard Worker        logging.info("prefixes: %r", commissioner.get_local_prefixes())
697*cfb92d14SAndroid Build Coastguard Worker
698*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(2, len(leader.get_router_list()))
699*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(2, len(leader.get_router_table()))
700*cfb92d14SAndroid Build Coastguard Worker        logging.info('leader router table: %r', leader.get_router_table())
701*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual({False, True},
702*cfb92d14SAndroid Build Coastguard Worker                         set(router.is_link_established for router in leader.get_router_table().values()))
703*cfb92d14SAndroid Build Coastguard Worker
704*cfb92d14SAndroid Build Coastguard Worker        self.assertFalse(leader.is_singleton())
705*cfb92d14SAndroid Build Coastguard Worker
706*cfb92d14SAndroid Build Coastguard Worker        statistics = commissioner.ping("ff02::1", size=1, count=10, interval=1, hoplimit=255)
707*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(statistics['transmitted_packets'], 10)
708*cfb92d14SAndroid Build Coastguard Worker        self.assertEqual(statistics['received_packets'], 20)
709*cfb92d14SAndroid Build Coastguard Worker        rtt = statistics['round_trip_time']
710*cfb92d14SAndroid Build Coastguard Worker        self.assertTrue(rtt['min'] - 1e-9 <= rtt['avg'] <= rtt['max'] + 1e-9)
711*cfb92d14SAndroid Build Coastguard Worker
712*cfb92d14SAndroid Build Coastguard Worker        # Shutdown
713*cfb92d14SAndroid Build Coastguard Worker        leader.thread_stop()
714*cfb92d14SAndroid Build Coastguard Worker        logging.info("node state: %s", leader.get_state())
715*cfb92d14SAndroid Build Coastguard Worker        leader.ifconfig_down()
716*cfb92d14SAndroid Build Coastguard Worker        self.assertFalse(leader.get_ifconfig_state())
717*cfb92d14SAndroid Build Coastguard Worker
718*cfb92d14SAndroid Build Coastguard Worker        leader.close()
719*cfb92d14SAndroid Build Coastguard Worker
720*cfb92d14SAndroid Build Coastguard Worker
721*cfb92d14SAndroid Build Coastguard Workerdef _setup_default_network(node):
722*cfb92d14SAndroid Build Coastguard Worker    node.dataset_clear_buffer()
723*cfb92d14SAndroid Build Coastguard Worker    node.dataset_set_buffer(
724*cfb92d14SAndroid Build Coastguard Worker        active_timestamp=1,
725*cfb92d14SAndroid Build Coastguard Worker        channel=TEST_CHANNEL,
726*cfb92d14SAndroid Build Coastguard Worker        channel_mask=TEST_CHANNEL_MASK,
727*cfb92d14SAndroid Build Coastguard Worker        extpanid=TEST_EXTENDED_PANID,
728*cfb92d14SAndroid Build Coastguard Worker        mesh_local_prefix=TEST_MESH_LOCAL_PREFIX,
729*cfb92d14SAndroid Build Coastguard Worker        network_key=TEST_NETWORK_KEY,
730*cfb92d14SAndroid Build Coastguard Worker        network_name=TEST_NETWORK_NAME,
731*cfb92d14SAndroid Build Coastguard Worker        panid=TEST_PANID,
732*cfb92d14SAndroid Build Coastguard Worker        pskc=TEST_PSKC,
733*cfb92d14SAndroid Build Coastguard Worker        security_policy=TEST_SECURITY_POLICY,
734*cfb92d14SAndroid Build Coastguard Worker    )
735*cfb92d14SAndroid Build Coastguard Worker    node.dataset_commit_buffer('active')
736*cfb92d14SAndroid Build Coastguard Worker
737*cfb92d14SAndroid Build Coastguard Worker
738*cfb92d14SAndroid Build Coastguard Workerif __name__ == '__main__':
739*cfb92d14SAndroid Build Coastguard Worker    unittest.main()
740