1*cfb92d14SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*cfb92d14SAndroid Build Coastguard Worker# 3*cfb92d14SAndroid Build Coastguard Worker# Copyright (c) 2018, 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 time 30*cfb92d14SAndroid Build Coastguard Workerimport wpan 31*cfb92d14SAndroid Build Coastguard Workerfrom wpan import verify 32*cfb92d14SAndroid Build Coastguard Worker 33*cfb92d14SAndroid Build Coastguard Worker# ----------------------------------------------------------------------------------------------------------------------- 34*cfb92d14SAndroid Build Coastguard Worker# Test description: Multicast traffic 35*cfb92d14SAndroid Build Coastguard Worker# 36*cfb92d14SAndroid Build Coastguard Worker# Network topology 37*cfb92d14SAndroid Build Coastguard Worker# 38*cfb92d14SAndroid Build Coastguard Worker# r1 ---- r2 ---- r3 ---- r4 39*cfb92d14SAndroid Build Coastguard Worker# | | 40*cfb92d14SAndroid Build Coastguard Worker# | | 41*cfb92d14SAndroid Build Coastguard Worker# fed sed 42*cfb92d14SAndroid Build Coastguard Worker# 43*cfb92d14SAndroid Build Coastguard Worker# Test covers the following multicast traffic: 44*cfb92d14SAndroid Build Coastguard Worker# 45*cfb92d14SAndroid Build Coastguard Worker# - r2 =>> link-local all-nodes. Expected to receive on [r1, r2, r3, fed]. 46*cfb92d14SAndroid Build Coastguard Worker# - r3 =>> mesh-local all-nodes. Expected to receive on [r1, r2, r3, r4, fed]. 47*cfb92d14SAndroid Build Coastguard Worker# - r3 =>> link-local all-routers. Expected to receive on [r2, r3, r4]. 48*cfb92d14SAndroid Build Coastguard Worker# - r3 =>> mesh-local all-routers. Expected to receive on all routers. 49*cfb92d14SAndroid Build Coastguard Worker# - r1 =>> link-local all-thread. Expected to receive on [r1, r2]. 50*cfb92d14SAndroid Build Coastguard Worker# - fed =>> mesh-local all-thread. Expected to receive on all nodes. 51*cfb92d14SAndroid Build Coastguard Worker# - r1 =>> specific address (on r2 and sed). Expected to receive on [r2, sed]. 52*cfb92d14SAndroid Build Coastguard Worker# - Check behavior with different multicast hop limit values (1-hop up to 4-hops). 53*cfb92d14SAndroid Build Coastguard Worker# 54*cfb92d14SAndroid Build Coastguard Worker 55*cfb92d14SAndroid Build Coastguard Workertest_name = __file__[:-3] if __file__.endswith('.py') else __file__ 56*cfb92d14SAndroid Build Coastguard Workerprint('-' * 120) 57*cfb92d14SAndroid Build Coastguard Workerprint('Starting \'{}\''.format(test_name)) 58*cfb92d14SAndroid Build Coastguard Worker 59*cfb92d14SAndroid Build Coastguard Worker# ----------------------------------------------------------------------------------------------------------------------- 60*cfb92d14SAndroid Build Coastguard Worker# Utility functions 61*cfb92d14SAndroid Build Coastguard Worker 62*cfb92d14SAndroid Build Coastguard Worker 63*cfb92d14SAndroid Build Coastguard Workerdef send_mcast( 64*cfb92d14SAndroid Build Coastguard Worker src_node, 65*cfb92d14SAndroid Build Coastguard Worker src_addr, 66*cfb92d14SAndroid Build Coastguard Worker mcast_addr, 67*cfb92d14SAndroid Build Coastguard Worker recving_nodes, 68*cfb92d14SAndroid Build Coastguard Worker non_recving_nodes=[], 69*cfb92d14SAndroid Build Coastguard Worker msg_len=30, 70*cfb92d14SAndroid Build Coastguard Worker mcast_hops=5, 71*cfb92d14SAndroid Build Coastguard Worker): 72*cfb92d14SAndroid Build Coastguard Worker """ 73*cfb92d14SAndroid Build Coastguard Worker Send a multicast message with given `len` from `src_node` using `src_addr` to the multicast address `mcast_addr`. 74*cfb92d14SAndroid Build Coastguard Worker Verify that the message is received on all nodes in `recving_nodes` list and that it is not received on all 75*cfb92d14SAndroid Build Coastguard Worker nodes in `non_recving_nodes` list. 76*cfb92d14SAndroid Build Coastguard Worker """ 77*cfb92d14SAndroid Build Coastguard Worker sender = src_node.prepare_tx(src_addr, mcast_addr, msg_len, mcast_hops=mcast_hops) 78*cfb92d14SAndroid Build Coastguard Worker recvers = [node.prepare_rx(sender) for node in recving_nodes] 79*cfb92d14SAndroid Build Coastguard Worker listeners = [node.prepare_listener(sender.dst_port, timeout=0.5) for node in non_recving_nodes] 80*cfb92d14SAndroid Build Coastguard Worker 81*cfb92d14SAndroid Build Coastguard Worker wpan.Node.perform_async_tx_rx() 82*cfb92d14SAndroid Build Coastguard Worker 83*cfb92d14SAndroid Build Coastguard Worker verify(sender.was_successful) 84*cfb92d14SAndroid Build Coastguard Worker for recvr in recvers: 85*cfb92d14SAndroid Build Coastguard Worker verify(recvr.was_successful) 86*cfb92d14SAndroid Build Coastguard Worker for lsnr in listeners: 87*cfb92d14SAndroid Build Coastguard Worker # `all_rx_msg` contains a list of (msg_content, (src_addr, src_port)). 88*cfb92d14SAndroid Build Coastguard Worker verify( 89*cfb92d14SAndroid Build Coastguard Worker len(lsnr.all_rx_msg) == 0 or 90*cfb92d14SAndroid Build Coastguard Worker all([msg[1][0] != sender.src_addr and msg[1][1] != sender.src_port for msg in lsnr.all_rx_msg])) 91*cfb92d14SAndroid Build Coastguard Worker 92*cfb92d14SAndroid Build Coastguard Worker 93*cfb92d14SAndroid Build Coastguard Worker# ----------------------------------------------------------------------------------------------------------------------- 94*cfb92d14SAndroid Build Coastguard Worker# Creating `wpan.Nodes` instances 95*cfb92d14SAndroid Build Coastguard Worker 96*cfb92d14SAndroid Build Coastguard Workerspeedup = 4 97*cfb92d14SAndroid Build Coastguard Workerwpan.Node.set_time_speedup_factor(speedup) 98*cfb92d14SAndroid Build Coastguard Worker 99*cfb92d14SAndroid Build Coastguard Workerr1 = wpan.Node() 100*cfb92d14SAndroid Build Coastguard Workerr2 = wpan.Node() 101*cfb92d14SAndroid Build Coastguard Workerr3 = wpan.Node() 102*cfb92d14SAndroid Build Coastguard Workerr4 = wpan.Node() 103*cfb92d14SAndroid Build Coastguard Workerfed = wpan.Node() 104*cfb92d14SAndroid Build Coastguard Workersed = wpan.Node() 105*cfb92d14SAndroid Build Coastguard Worker 106*cfb92d14SAndroid Build Coastguard Workerall_routers = [r1, r2, r3, r4] 107*cfb92d14SAndroid Build Coastguard Workerall_nodes = all_routers + [fed, sed] 108*cfb92d14SAndroid Build Coastguard Worker 109*cfb92d14SAndroid Build Coastguard Worker# ----------------------------------------------------------------------------------------------------------------------- 110*cfb92d14SAndroid Build Coastguard Worker# Init all nodes 111*cfb92d14SAndroid Build Coastguard Worker 112*cfb92d14SAndroid Build Coastguard Workerwpan.Node.init_all_nodes() 113*cfb92d14SAndroid Build Coastguard Worker 114*cfb92d14SAndroid Build Coastguard Worker# ----------------------------------------------------------------------------------------------------------------------- 115*cfb92d14SAndroid Build Coastguard Worker# Build network topology 116*cfb92d14SAndroid Build Coastguard Worker# 117*cfb92d14SAndroid Build Coastguard Worker# Test topology: 118*cfb92d14SAndroid Build Coastguard Worker# 119*cfb92d14SAndroid Build Coastguard Worker# r1 ---- r2 ---- r3 ---- r4 120*cfb92d14SAndroid Build Coastguard Worker# | | 121*cfb92d14SAndroid Build Coastguard Worker# | | 122*cfb92d14SAndroid Build Coastguard Worker# fed sed 123*cfb92d14SAndroid Build Coastguard Worker# 124*cfb92d14SAndroid Build Coastguard Worker 125*cfb92d14SAndroid Build Coastguard Workerr1.form("mcast-traffic") 126*cfb92d14SAndroid Build Coastguard Worker 127*cfb92d14SAndroid Build Coastguard Workerr1.allowlist_node(r2) 128*cfb92d14SAndroid Build Coastguard Workerr2.allowlist_node(r1) 129*cfb92d14SAndroid Build Coastguard Workerr2.join_node(r1, wpan.JOIN_TYPE_ROUTER) 130*cfb92d14SAndroid Build Coastguard Worker 131*cfb92d14SAndroid Build Coastguard Workerr2.allowlist_node(fed) 132*cfb92d14SAndroid Build Coastguard Workerfed.allowlist_node(r2) 133*cfb92d14SAndroid Build Coastguard Workerfed.join_node(r2, wpan.JOIN_TYPE_END_DEVICE) 134*cfb92d14SAndroid Build Coastguard Worker 135*cfb92d14SAndroid Build Coastguard Workerr2.allowlist_node(r3) 136*cfb92d14SAndroid Build Coastguard Workerr3.allowlist_node(r2) 137*cfb92d14SAndroid Build Coastguard Workerr3.join_node(r2, wpan.JOIN_TYPE_ROUTER) 138*cfb92d14SAndroid Build Coastguard Worker 139*cfb92d14SAndroid Build Coastguard Workerr3.allowlist_node(r4) 140*cfb92d14SAndroid Build Coastguard Workerr4.allowlist_node(r3) 141*cfb92d14SAndroid Build Coastguard Workerr4.join_node(r3, wpan.JOIN_TYPE_ROUTER) 142*cfb92d14SAndroid Build Coastguard Worker 143*cfb92d14SAndroid Build Coastguard Workerr4.allowlist_node(sed) 144*cfb92d14SAndroid Build Coastguard Workersed.allowlist_node(r4) 145*cfb92d14SAndroid Build Coastguard Workersed.join_node(r4, wpan.JOIN_TYPE_SLEEPY_END_DEVICE) 146*cfb92d14SAndroid Build Coastguard Workersed.set(wpan.WPAN_POLL_INTERVAL, '600') 147*cfb92d14SAndroid Build Coastguard Worker 148*cfb92d14SAndroid Build Coastguard Worker# ----------------------------------------------------------------------------------------------------------------------- 149*cfb92d14SAndroid Build Coastguard Worker# Test implementation 150*cfb92d14SAndroid Build Coastguard Worker 151*cfb92d14SAndroid Build Coastguard Workerml1 = r1.get(wpan.WPAN_IP6_MESH_LOCAL_ADDRESS)[1:-1] 152*cfb92d14SAndroid Build Coastguard Workerll1 = r1.get(wpan.WPAN_IP6_LINK_LOCAL_ADDRESS)[1:-1] 153*cfb92d14SAndroid Build Coastguard Worker 154*cfb92d14SAndroid Build Coastguard Workerml2 = r2.get(wpan.WPAN_IP6_MESH_LOCAL_ADDRESS)[1:-1] 155*cfb92d14SAndroid Build Coastguard Workerll2 = r2.get(wpan.WPAN_IP6_LINK_LOCAL_ADDRESS)[1:-1] 156*cfb92d14SAndroid Build Coastguard Worker 157*cfb92d14SAndroid Build Coastguard Workerml3 = r3.get(wpan.WPAN_IP6_MESH_LOCAL_ADDRESS)[1:-1] 158*cfb92d14SAndroid Build Coastguard Workerll3 = r3.get(wpan.WPAN_IP6_LINK_LOCAL_ADDRESS)[1:-1] 159*cfb92d14SAndroid Build Coastguard Worker 160*cfb92d14SAndroid Build Coastguard Workerml4 = r4.get(wpan.WPAN_IP6_MESH_LOCAL_ADDRESS)[1:-1] 161*cfb92d14SAndroid Build Coastguard Workerll4 = r4.get(wpan.WPAN_IP6_LINK_LOCAL_ADDRESS)[1:-1] 162*cfb92d14SAndroid Build Coastguard Worker 163*cfb92d14SAndroid Build Coastguard Workerml_fed = fed.get(wpan.WPAN_IP6_MESH_LOCAL_ADDRESS)[1:-1] 164*cfb92d14SAndroid Build Coastguard Workerll_fed = fed.get(wpan.WPAN_IP6_LINK_LOCAL_ADDRESS)[1:-1] 165*cfb92d14SAndroid Build Coastguard Worker 166*cfb92d14SAndroid Build Coastguard Worker# Multicast addresses 167*cfb92d14SAndroid Build Coastguard Worker 168*cfb92d14SAndroid Build Coastguard Workerll_all_nodes = "ff02::1" 169*cfb92d14SAndroid Build Coastguard Workerml_all_nodes = "ff03::1" 170*cfb92d14SAndroid Build Coastguard Workerml_all_mlp_fwder_nodes = "ff03::fc" 171*cfb92d14SAndroid Build Coastguard Worker 172*cfb92d14SAndroid Build Coastguard Workerll_all_routers = "ff02::2" 173*cfb92d14SAndroid Build Coastguard Workerml_all_routers = "ff03::2" 174*cfb92d14SAndroid Build Coastguard Worker 175*cfb92d14SAndroid Build Coastguard Workerml_prefix = r1.get(wpan.WPAN_IP6_MESH_LOCAL_PREFIX)[1:-1].split('/')[0] 176*cfb92d14SAndroid Build Coastguard Workerll_all_thread_nodes_addr = 'ff32:40:' + ml_prefix + '1' 177*cfb92d14SAndroid Build Coastguard Workerml_all_thread_nodes_addr = 'ff33:40:' + ml_prefix + '1' 178*cfb92d14SAndroid Build Coastguard Worker 179*cfb92d14SAndroid Build Coastguard Worker# 180*cfb92d14SAndroid Build Coastguard Worker# r1 ---- r2 ---- r3 ---- r4 181*cfb92d14SAndroid Build Coastguard Worker# | | 182*cfb92d14SAndroid Build Coastguard Worker# | | 183*cfb92d14SAndroid Build Coastguard Worker# fed sed 184*cfb92d14SAndroid Build Coastguard Worker# 185*cfb92d14SAndroid Build Coastguard Worker 186*cfb92d14SAndroid Build Coastguard Worker# r2 =>> link-local all-nodes. 187*cfb92d14SAndroid Build Coastguard Workersend_mcast(r2, ll2, ll_all_nodes, [r1, r2, r3, fed], [r4, sed]) 188*cfb92d14SAndroid Build Coastguard Worker 189*cfb92d14SAndroid Build Coastguard Worker# r3 =>> mesh-local all-nodes. 190*cfb92d14SAndroid Build Coastguard Workersend_mcast(r3, ml3, ml_all_nodes, [r1, r2, r3, r4, fed]) 191*cfb92d14SAndroid Build Coastguard Worker 192*cfb92d14SAndroid Build Coastguard Worker# r3 =>> link-local all-routers. 193*cfb92d14SAndroid Build Coastguard Workersend_mcast(r3, ml3, ll_all_routers, [r2, r3, r4], [r1, fed, sed]) 194*cfb92d14SAndroid Build Coastguard Worker 195*cfb92d14SAndroid Build Coastguard Worker# r3 =>> mesh-local all-routers. 196*cfb92d14SAndroid Build Coastguard Workersend_mcast(r3, ml3, ml_all_routers, all_routers, [sed]) 197*cfb92d14SAndroid Build Coastguard Worker 198*cfb92d14SAndroid Build Coastguard Worker# r1 =>> link-local all-thread. 199*cfb92d14SAndroid Build Coastguard Workersend_mcast(r1, ll1, ll_all_thread_nodes_addr, [r1, r2], [fed, r3, r4, sed]) 200*cfb92d14SAndroid Build Coastguard Worker 201*cfb92d14SAndroid Build Coastguard Worker# fed =>> mesh-local all-thread. 202*cfb92d14SAndroid Build Coastguard Workersend_mcast(fed, ml_fed, ml_all_thread_nodes_addr, all_nodes) 203*cfb92d14SAndroid Build Coastguard Worker 204*cfb92d14SAndroid Build Coastguard Worker# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 205*cfb92d14SAndroid Build Coastguard Worker# Send a large multicast message (requiring MAC level fragmentations) 206*cfb92d14SAndroid Build Coastguard Worker 207*cfb92d14SAndroid Build Coastguard Workersend_mcast(r3, ml3, ml_all_thread_nodes_addr, all_nodes, msg_len=400) 208*cfb92d14SAndroid Build Coastguard Worker 209*cfb92d14SAndroid Build Coastguard Worker# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 210*cfb92d14SAndroid Build Coastguard Worker# Check the hop limit behavior 211*cfb92d14SAndroid Build Coastguard Worker 212*cfb92d14SAndroid Build Coastguard Worker# r1 =>> mesh-local all-thread (one hop) 213*cfb92d14SAndroid Build Coastguard Workersend_mcast( 214*cfb92d14SAndroid Build Coastguard Worker r1, 215*cfb92d14SAndroid Build Coastguard Worker ml1, 216*cfb92d14SAndroid Build Coastguard Worker ml_all_thread_nodes_addr, 217*cfb92d14SAndroid Build Coastguard Worker [r1, r2], 218*cfb92d14SAndroid Build Coastguard Worker [fed, r3, r4, sed], 219*cfb92d14SAndroid Build Coastguard Worker mcast_hops=1, 220*cfb92d14SAndroid Build Coastguard Worker) 221*cfb92d14SAndroid Build Coastguard Worker 222*cfb92d14SAndroid Build Coastguard Worker# r1 =>> mesh-local all-thread (two hops) 223*cfb92d14SAndroid Build Coastguard Workersend_mcast( 224*cfb92d14SAndroid Build Coastguard Worker r1, 225*cfb92d14SAndroid Build Coastguard Worker ml1, 226*cfb92d14SAndroid Build Coastguard Worker ml_all_thread_nodes_addr, 227*cfb92d14SAndroid Build Coastguard Worker [r1, r2, fed, r3], 228*cfb92d14SAndroid Build Coastguard Worker [r4, sed], 229*cfb92d14SAndroid Build Coastguard Worker mcast_hops=2, 230*cfb92d14SAndroid Build Coastguard Worker) 231*cfb92d14SAndroid Build Coastguard Worker 232*cfb92d14SAndroid Build Coastguard Worker# r1 =>> mesh-local all-thread (three hops) 233*cfb92d14SAndroid Build Coastguard Workersend_mcast( 234*cfb92d14SAndroid Build Coastguard Worker r1, 235*cfb92d14SAndroid Build Coastguard Worker ml1, 236*cfb92d14SAndroid Build Coastguard Worker ml_all_thread_nodes_addr, 237*cfb92d14SAndroid Build Coastguard Worker [r1, r2, fed, r3, r4], 238*cfb92d14SAndroid Build Coastguard Worker [sed], 239*cfb92d14SAndroid Build Coastguard Worker mcast_hops=3, 240*cfb92d14SAndroid Build Coastguard Worker) 241*cfb92d14SAndroid Build Coastguard Worker 242*cfb92d14SAndroid Build Coastguard Worker# r1 =>> mesh-local all-thread (four hops) 243*cfb92d14SAndroid Build Coastguard Workersend_mcast(r1, ml1, ml_all_thread_nodes_addr, [r1, r2, fed, r3, r4, sed], mcast_hops=4) 244*cfb92d14SAndroid Build Coastguard Worker 245*cfb92d14SAndroid Build Coastguard Worker# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 246*cfb92d14SAndroid Build Coastguard Worker# Subscribe to a specific multicast address on r2 and sed 247*cfb92d14SAndroid Build Coastguard Worker 248*cfb92d14SAndroid Build Coastguard Workermcast_addr = "ff03::114" 249*cfb92d14SAndroid Build Coastguard Workerr2.add(wpan.WPAN_IP6_MULTICAST_ADDRESSES, mcast_addr) 250*cfb92d14SAndroid Build Coastguard Workersed.add(wpan.WPAN_IP6_MULTICAST_ADDRESSES, mcast_addr) 251*cfb92d14SAndroid Build Coastguard Workertime.sleep(1) 252*cfb92d14SAndroid Build Coastguard Worker 253*cfb92d14SAndroid Build Coastguard Worker# r1 =>> specific address 254*cfb92d14SAndroid Build Coastguard Workersend_mcast(r1, ml1, mcast_addr, [r2, sed], [r1, r3, r4, fed]) 255*cfb92d14SAndroid Build Coastguard Worker 256*cfb92d14SAndroid Build Coastguard Worker# ----------------------------------------------------------------------------------------------------------------------- 257*cfb92d14SAndroid Build Coastguard Worker# Test finished 258*cfb92d14SAndroid Build Coastguard Worker 259*cfb92d14SAndroid Build Coastguard Workerwpan.Node.finalize_all_nodes() 260*cfb92d14SAndroid Build Coastguard Worker 261*cfb92d14SAndroid Build Coastguard Workerprint('\'{}\' passed.'.format(test_name)) 262