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