1*cfb92d14SAndroid Build Coastguard Worker#!/usr/bin/expect -f 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 Worker 30*cfb92d14SAndroid Build Coastguard Workersource "tests/scripts/expect/_common.exp" 31*cfb92d14SAndroid Build Coastguard Workersource "tests/scripts/expect/_multinode.exp" 32*cfb92d14SAndroid Build Coastguard Worker 33*cfb92d14SAndroid Build Coastguard Worker 34*cfb92d14SAndroid Build Coastguard Worker# The expect on macOS doesn't support `try` or `file tempfile`. 35*cfb92d14SAndroid Build Coastguard Workerskip_on_macos 36*cfb92d14SAndroid Build Coastguard Worker 37*cfb92d14SAndroid Build Coastguard Workerfile tempfile socat_out 38*cfb92d14SAndroid Build Coastguard Workerset socat_pid [exec socat -d -d pty,raw,echo=0 pty,raw,echo=0 >/dev/null 2>$socat_out &] 39*cfb92d14SAndroid Build Coastguard Workerwhile {true} { 40*cfb92d14SAndroid Build Coastguard Worker if {[exec head -n2 $socat_out | wc -l] == 2} { 41*cfb92d14SAndroid Build Coastguard Worker set radio_pty [exec head -n1 $socat_out | grep -o {/dev/.\+}] 42*cfb92d14SAndroid Build Coastguard Worker set host_pty [exec head -n2 $socat_out | tail -n1 | grep -o {/dev/.\+}] 43*cfb92d14SAndroid Build Coastguard Worker break 44*cfb92d14SAndroid Build Coastguard Worker } 45*cfb92d14SAndroid Build Coastguard Worker sleep 1 46*cfb92d14SAndroid Build Coastguard Worker} 47*cfb92d14SAndroid Build Coastguard Worker 48*cfb92d14SAndroid Build Coastguard Workerputs "Radio PTY: $radio_pty" 49*cfb92d14SAndroid Build Coastguard Workerputs "Host PTY: $host_pty" 50*cfb92d14SAndroid Build Coastguard Worker 51*cfb92d14SAndroid Build Coastguard Workerset rcp_pid [exec $::env(OT_SIMULATION_APPS)/ncp/ot-rcp 1 < $radio_pty > $radio_pty &] 52*cfb92d14SAndroid Build Coastguard Workerputs "RCP PID: $rcp_pid" 53*cfb92d14SAndroid Build Coastguard Worker 54*cfb92d14SAndroid Build Coastguard Workertry { 55*cfb92d14SAndroid Build Coastguard Worker puts "Before enabling" 56*cfb92d14SAndroid Build Coastguard Worker 57*cfb92d14SAndroid Build Coastguard Worker puts "Queued parent-to-child packets, as parent" 58*cfb92d14SAndroid Build Coastguard Worker 59*cfb92d14SAndroid Build Coastguard Worker spawn_node 1 "rcp" "spinel+hdlc_uart://$host_pty" 60*cfb92d14SAndroid Build Coastguard Worker spawn_node 2 61*cfb92d14SAndroid Build Coastguard Worker 62*cfb92d14SAndroid Build Coastguard Worker setup_two_nodes "-" false 63*cfb92d14SAndroid Build Coastguard Worker 64*cfb92d14SAndroid Build Coastguard Worker switch_node 2 65*cfb92d14SAndroid Build Coastguard Worker set addr_2 [get_ipaddr mleid] 66*cfb92d14SAndroid Build Coastguard Worker send "udp open\n" 67*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 68*cfb92d14SAndroid Build Coastguard Worker send "udp bind :: 11003\n" 69*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 70*cfb92d14SAndroid Build Coastguard Worker send "pollperiod 100000\n" 71*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 72*cfb92d14SAndroid Build Coastguard Worker 73*cfb92d14SAndroid Build Coastguard Worker sleep 1 74*cfb92d14SAndroid Build Coastguard Worker 75*cfb92d14SAndroid Build Coastguard Worker switch_node 1 76*cfb92d14SAndroid Build Coastguard Worker set addr_1 [get_ipaddr mleid] 77*cfb92d14SAndroid Build Coastguard Worker send "udp open\n" 78*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 79*cfb92d14SAndroid Build Coastguard Worker send "udp bind :: 11004\n" 80*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 81*cfb92d14SAndroid Build Coastguard Worker send "udp connect $addr_2 11003\n" 82*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 83*cfb92d14SAndroid Build Coastguard Worker send "udp send hello\n" 84*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 85*cfb92d14SAndroid Build Coastguard Worker send "udp send there\n" 86*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 87*cfb92d14SAndroid Build Coastguard Worker 88*cfb92d14SAndroid Build Coastguard Worker sleep 1 89*cfb92d14SAndroid Build Coastguard Worker 90*cfb92d14SAndroid Build Coastguard Worker exec kill $rcp_pid 91*cfb92d14SAndroid Build Coastguard Worker puts "Killed $rcp_pid" 92*cfb92d14SAndroid Build Coastguard Worker sleep 1 93*cfb92d14SAndroid Build Coastguard Worker set rcp_pid [exec $::env(OT_SIMULATION_APPS)/ncp/ot-rcp 1 < $radio_pty > $radio_pty &] 94*cfb92d14SAndroid Build Coastguard Worker puts "RCP PID: $rcp_pid" 95*cfb92d14SAndroid Build Coastguard Worker 96*cfb92d14SAndroid Build Coastguard Worker sleep 1 97*cfb92d14SAndroid Build Coastguard Worker 98*cfb92d14SAndroid Build Coastguard Worker switch_node 2 99*cfb92d14SAndroid Build Coastguard Worker send "pollperiod 1000\n" 100*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 101*cfb92d14SAndroid Build Coastguard Worker expect "5 bytes from $addr_1 11004 hello" 102*cfb92d14SAndroid Build Coastguard Worker expect "5 bytes from $addr_1 11004 there" 103*cfb92d14SAndroid Build Coastguard Worker 104*cfb92d14SAndroid Build Coastguard Worker dispose_all 105*cfb92d14SAndroid Build Coastguard Worker 106*cfb92d14SAndroid Build Coastguard Worker 107*cfb92d14SAndroid Build Coastguard Worker puts "Queued parent-to-child packets, as child" 108*cfb92d14SAndroid Build Coastguard Worker 109*cfb92d14SAndroid Build Coastguard Worker exec kill $rcp_pid 110*cfb92d14SAndroid Build Coastguard Worker puts "Killed $rcp_pid" 111*cfb92d14SAndroid Build Coastguard Worker sleep 1 112*cfb92d14SAndroid Build Coastguard Worker set rcp_pid [exec $::env(OT_SIMULATION_APPS)/ncp/ot-rcp 2 < $radio_pty > $radio_pty &] 113*cfb92d14SAndroid Build Coastguard Worker puts "RCP PID: $rcp_pid" 114*cfb92d14SAndroid Build Coastguard Worker 115*cfb92d14SAndroid Build Coastguard Worker spawn_node 1 116*cfb92d14SAndroid Build Coastguard Worker spawn_node 2 "rcp" "spinel+hdlc_uart://$host_pty" 117*cfb92d14SAndroid Build Coastguard Worker 118*cfb92d14SAndroid Build Coastguard Worker setup_two_nodes "-" false 119*cfb92d14SAndroid Build Coastguard Worker 120*cfb92d14SAndroid Build Coastguard Worker switch_node 2 121*cfb92d14SAndroid Build Coastguard Worker set addr_2 [get_ipaddr mleid] 122*cfb92d14SAndroid Build Coastguard Worker send "udp open\n" 123*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 124*cfb92d14SAndroid Build Coastguard Worker send "udp bind :: 11003\n" 125*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 126*cfb92d14SAndroid Build Coastguard Worker send "pollperiod 100000\n" 127*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 128*cfb92d14SAndroid Build Coastguard Worker 129*cfb92d14SAndroid Build Coastguard Worker sleep 1 130*cfb92d14SAndroid Build Coastguard Worker 131*cfb92d14SAndroid Build Coastguard Worker switch_node 1 132*cfb92d14SAndroid Build Coastguard Worker set addr_1 [get_ipaddr mleid] 133*cfb92d14SAndroid Build Coastguard Worker send "udp open\n" 134*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 135*cfb92d14SAndroid Build Coastguard Worker send "udp bind :: 11004\n" 136*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 137*cfb92d14SAndroid Build Coastguard Worker send "udp connect $addr_2 11003\n" 138*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 139*cfb92d14SAndroid Build Coastguard Worker send "udp send hello\n" 140*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 141*cfb92d14SAndroid Build Coastguard Worker 142*cfb92d14SAndroid Build Coastguard Worker sleep 1 143*cfb92d14SAndroid Build Coastguard Worker 144*cfb92d14SAndroid Build Coastguard Worker exec kill $rcp_pid 145*cfb92d14SAndroid Build Coastguard Worker puts "Killed $rcp_pid" 146*cfb92d14SAndroid Build Coastguard Worker sleep 1 147*cfb92d14SAndroid Build Coastguard Worker set rcp_pid [exec $::env(OT_SIMULATION_APPS)/ncp/ot-rcp 2 < $radio_pty > $radio_pty &] 148*cfb92d14SAndroid Build Coastguard Worker puts "RCP PID: $rcp_pid" 149*cfb92d14SAndroid Build Coastguard Worker 150*cfb92d14SAndroid Build Coastguard Worker sleep 1 151*cfb92d14SAndroid Build Coastguard Worker 152*cfb92d14SAndroid Build Coastguard Worker switch_node 2 153*cfb92d14SAndroid Build Coastguard Worker send "pollperiod 1000\n" 154*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 155*cfb92d14SAndroid Build Coastguard Worker expect "5 bytes from $addr_1 11004 hello" 156*cfb92d14SAndroid Build Coastguard Worker 157*cfb92d14SAndroid Build Coastguard Worker dispose_all 158*cfb92d14SAndroid Build Coastguard Worker 159*cfb92d14SAndroid Build Coastguard Worker exec kill $rcp_pid 160*cfb92d14SAndroid Build Coastguard Worker puts "Killed $rcp_pid" 161*cfb92d14SAndroid Build Coastguard Worker sleep 1 162*cfb92d14SAndroid Build Coastguard Worker set rcp_pid [exec $::env(OT_SIMULATION_APPS)/ncp/ot-rcp 1 < $radio_pty > $radio_pty &] 163*cfb92d14SAndroid Build Coastguard Worker puts "RCP PID: $rcp_pid" 164*cfb92d14SAndroid Build Coastguard Worker 165*cfb92d14SAndroid Build Coastguard Worker 166*cfb92d14SAndroid Build Coastguard Worker puts "Many children, queued child-to-child packets" 167*cfb92d14SAndroid Build Coastguard Worker 168*cfb92d14SAndroid Build Coastguard Worker spawn_node 1 "rcp" "spinel+hdlc_uart://$host_pty" 169*cfb92d14SAndroid Build Coastguard Worker setup_leader 170*cfb92d14SAndroid Build Coastguard Worker set addr(1) [get_ipaddr mleid] 171*cfb92d14SAndroid Build Coastguard Worker send "udp open\n" 172*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 173*cfb92d14SAndroid Build Coastguard Worker send "udp bind :: 11004\n" 174*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 175*cfb92d14SAndroid Build Coastguard Worker 176*cfb92d14SAndroid Build Coastguard Worker set max_children 10 177*cfb92d14SAndroid Build Coastguard Worker for {set i 2} {$i <= $max_children + 1} {incr i} { 178*cfb92d14SAndroid Build Coastguard Worker spawn_node $i 179*cfb92d14SAndroid Build Coastguard Worker setup_node $i "-" 180*cfb92d14SAndroid Build Coastguard Worker switch_node $i 181*cfb92d14SAndroid Build Coastguard Worker set addr($i) [get_ipaddr mleid] 182*cfb92d14SAndroid Build Coastguard Worker send "udp open\n" 183*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 184*cfb92d14SAndroid Build Coastguard Worker send "udp bind :: 11003\n" 185*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 186*cfb92d14SAndroid Build Coastguard Worker send "pollperiod 100000\n" 187*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 188*cfb92d14SAndroid Build Coastguard Worker } 189*cfb92d14SAndroid Build Coastguard Worker 190*cfb92d14SAndroid Build Coastguard Worker sleep 1 191*cfb92d14SAndroid Build Coastguard Worker 192*cfb92d14SAndroid Build Coastguard Worker switch_node 1 193*cfb92d14SAndroid Build Coastguard Worker for {set i 2} {$i <= $max_children + 1} {incr i} { 194*cfb92d14SAndroid Build Coastguard Worker send "udp send $addr($i) 11003 hello\n" 195*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 196*cfb92d14SAndroid Build Coastguard Worker } 197*cfb92d14SAndroid Build Coastguard Worker 198*cfb92d14SAndroid Build Coastguard Worker sleep 1 199*cfb92d14SAndroid Build Coastguard Worker 200*cfb92d14SAndroid Build Coastguard Worker exec kill $rcp_pid 201*cfb92d14SAndroid Build Coastguard Worker puts "Killed $rcp_pid" 202*cfb92d14SAndroid Build Coastguard Worker sleep 1 203*cfb92d14SAndroid Build Coastguard Worker set rcp_pid [exec $::env(OT_SIMULATION_APPS)/ncp/ot-rcp 1 < $radio_pty > $radio_pty &] 204*cfb92d14SAndroid Build Coastguard Worker puts "RCP PID: $rcp_pid" 205*cfb92d14SAndroid Build Coastguard Worker 206*cfb92d14SAndroid Build Coastguard Worker sleep 1 207*cfb92d14SAndroid Build Coastguard Worker 208*cfb92d14SAndroid Build Coastguard Worker for {set i 7} {$i <= 9} {incr i} { 209*cfb92d14SAndroid Build Coastguard Worker switch_node $i 210*cfb92d14SAndroid Build Coastguard Worker send "pollperiod 1000\n" 211*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 212*cfb92d14SAndroid Build Coastguard Worker expect "5 bytes from $addr(1) 11004 hello" 213*cfb92d14SAndroid Build Coastguard Worker } 214*cfb92d14SAndroid Build Coastguard Worker 215*cfb92d14SAndroid Build Coastguard Worker switch_node 4 216*cfb92d14SAndroid Build Coastguard Worker send "udp send $addr(5) 11003 hello_from_node_4\n" 217*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 218*cfb92d14SAndroid Build Coastguard Worker if {$::env(THREAD_VERSION) != "1.1"} { 219*cfb92d14SAndroid Build Coastguard Worker expect "5 bytes from $addr(1) 11004 hello" 220*cfb92d14SAndroid Build Coastguard Worker } 221*cfb92d14SAndroid Build Coastguard Worker 222*cfb92d14SAndroid Build Coastguard Worker sleep 1 223*cfb92d14SAndroid Build Coastguard Worker 224*cfb92d14SAndroid Build Coastguard Worker exec kill $rcp_pid 225*cfb92d14SAndroid Build Coastguard Worker puts "Killed $rcp_pid" 226*cfb92d14SAndroid Build Coastguard Worker sleep 1 227*cfb92d14SAndroid Build Coastguard Worker set rcp_pid [exec $::env(OT_SIMULATION_APPS)/ncp/ot-rcp 1 < $radio_pty > $radio_pty &] 228*cfb92d14SAndroid Build Coastguard Worker puts "RCP PID: $rcp_pid" 229*cfb92d14SAndroid Build Coastguard Worker 230*cfb92d14SAndroid Build Coastguard Worker sleep 1 231*cfb92d14SAndroid Build Coastguard Worker 232*cfb92d14SAndroid Build Coastguard Worker switch_node 5 233*cfb92d14SAndroid Build Coastguard Worker send "pollperiod 1000\n" 234*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 235*cfb92d14SAndroid Build Coastguard Worker expect "17 bytes from $addr(4) 11003 hello_from_node_4" 236*cfb92d14SAndroid Build Coastguard Worker 237*cfb92d14SAndroid Build Coastguard Worker dispose_all 238*cfb92d14SAndroid Build Coastguard Worker 239*cfb92d14SAndroid Build Coastguard Worker 240*cfb92d14SAndroid Build Coastguard Worker puts "While energy scanning" 241*cfb92d14SAndroid Build Coastguard Worker 242*cfb92d14SAndroid Build Coastguard Worker spawn_node 1 "rcp" "spinel+hdlc_uart://$host_pty" 243*cfb92d14SAndroid Build Coastguard Worker setup_default_network 244*cfb92d14SAndroid Build Coastguard Worker attach 245*cfb92d14SAndroid Build Coastguard Worker 246*cfb92d14SAndroid Build Coastguard Worker send "scan energy 100\n" 247*cfb92d14SAndroid Build Coastguard Worker expect "| Ch | RSSI |" 248*cfb92d14SAndroid Build Coastguard Worker expect "+----+------+" 249*cfb92d14SAndroid Build Coastguard Worker 250*cfb92d14SAndroid Build Coastguard Worker sleep 1 251*cfb92d14SAndroid Build Coastguard Worker 252*cfb92d14SAndroid Build Coastguard Worker exec kill $rcp_pid 253*cfb92d14SAndroid Build Coastguard Worker puts "Killed $rcp_pid" 254*cfb92d14SAndroid Build Coastguard Worker sleep 1 255*cfb92d14SAndroid Build Coastguard Worker set rcp_pid [exec $::env(OT_SIMULATION_APPS)/ncp/ot-rcp 1 < $radio_pty > $radio_pty &] 256*cfb92d14SAndroid Build Coastguard Worker puts "RCP PID: $rcp_pid" 257*cfb92d14SAndroid Build Coastguard Worker 258*cfb92d14SAndroid Build Coastguard Worker sleep 1 259*cfb92d14SAndroid Build Coastguard Worker 260*cfb92d14SAndroid Build Coastguard Worker for {set i 11} {$i <= 26} {incr i} { 261*cfb92d14SAndroid Build Coastguard Worker expect -re "\\| +$i \\| +-?\\d+ \\|" 262*cfb92d14SAndroid Build Coastguard Worker } 263*cfb92d14SAndroid Build Coastguard Worker expect_line "Done" 264*cfb92d14SAndroid Build Coastguard Worker 265*cfb92d14SAndroid Build Coastguard Worker dispose_all 266*cfb92d14SAndroid Build Coastguard Worker} finally { 267*cfb92d14SAndroid Build Coastguard Worker exec kill $rcp_pid 268*cfb92d14SAndroid Build Coastguard Worker exec kill $socat_pid 269*cfb92d14SAndroid Build Coastguard Worker} 270