#!/usr/bin/expect -f
#
#  Copyright (c) 2020, The OpenThread Authors.
#  All rights reserved.
#
#  Redistribution and use in source and binary forms, with or without
#  modification, are permitted provided that the following conditions are met:
#  1. Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
#  2. Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#  3. Neither the name of the copyright holder nor the
#     names of its contributors may be used to endorse or promote products
#     derived from this software without specific prior written permission.
#
#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
#  POSSIBILITY OF SUCH DAMAGE.
#

source "tests/scripts/expect/_common.exp"
source "tests/scripts/expect/_multinode.exp"


# The expect on macOS doesn't support `try` or `file tempfile`.
skip_on_macos

file tempfile socat_out
set socat_pid [exec socat -d -d pty,raw,echo=0 pty,raw,echo=0 >/dev/null 2>$socat_out &]
while {true} {
    if {[exec head -n2 $socat_out | wc -l] == 2} {
        set radio_pty [exec head -n1 $socat_out | grep -o {/dev/.\+}]
        set host_pty [exec head -n2 $socat_out | tail -n1 | grep -o {/dev/.\+}]
        break
    }
    sleep 1
}

puts "Radio PTY: $radio_pty"
puts "Host PTY: $host_pty"

set rcp_pid [exec $::env(OT_SIMULATION_APPS)/ncp/ot-rcp 1 < $radio_pty > $radio_pty &]
puts "RCP PID: $rcp_pid"

try {
    puts "Before enabling"

    spawn_node 1 "rcp" "spinel+hdlc_uart://$host_pty"

    exec kill $rcp_pid
    puts "Killed $rcp_pid"
    sleep 1
    set rcp_pid [exec $::env(OT_SIMULATION_APPS)/ncp/ot-rcp 1 < $radio_pty > $radio_pty &]
    puts "RCP PID: $rcp_pid"

    expect eof


    puts "Queued parent-to-child packets, as parent"

    spawn_node 1 "rcp" "spinel+hdlc_uart://$host_pty"
    spawn_node 2

    setup_two_nodes "-" false

    switch_node 2
    set addr_2 [get_ipaddr mleid]
    send "udp open\n"
    expect_line "Done"
    send "udp bind :: 11003\n"
    expect_line "Done"
    send "pollperiod 100000\n"
    expect_line "Done"

    sleep 1

    switch_node 1
    set addr_1 [get_ipaddr mleid]
    send "udp open\n"
    expect_line "Done"
    send "udp bind :: 11004\n"
    expect_line "Done"
    send "udp connect $addr_2 11003\n"
    expect_line "Done"
    send "udp send hello\n"
    expect_line "Done"
    send "udp send there\n"
    expect_line "Done"

    sleep 1

    exec kill $rcp_pid
    puts "Killed $rcp_pid"
    sleep 1
    set rcp_pid [exec $::env(OT_SIMULATION_APPS)/ncp/ot-rcp 1 < $radio_pty > $radio_pty &]
    puts "RCP PID: $rcp_pid"

    sleep 1

    switch_node 2
    send "pollperiod 1000\n"
    expect_line "Done"
    expect "5 bytes from $addr_1 11004 hello"
    expect "5 bytes from $addr_1 11004 there"

    dispose_all


    puts "Queued parent-to-child packets, as child"

    exec kill $rcp_pid
    puts "Killed $rcp_pid"
    sleep 1
    set rcp_pid [exec $::env(OT_SIMULATION_APPS)/ncp/ot-rcp 2 < $radio_pty > $radio_pty &]
    puts "RCP PID: $rcp_pid"

    spawn_node 1
    spawn_node 2 "rcp" "spinel+hdlc_uart://$host_pty"

    setup_two_nodes "-" false

    switch_node 2
    set addr_2 [get_ipaddr mleid]
    send "udp open\n"
    expect_line "Done"
    send "udp bind :: 11003\n"
    expect_line "Done"
    send "pollperiod 100000\n"
    expect_line "Done"

    sleep 1

    switch_node 1
    set addr_1 [get_ipaddr mleid]
    send "udp open\n"
    expect_line "Done"
    send "udp bind :: 11004\n"
    expect_line "Done"
    send "udp connect $addr_2 11003\n"
    expect_line "Done"
    send "udp send hello\n"
    expect_line "Done"

    sleep 1

    exec kill $rcp_pid
    puts "Killed $rcp_pid"
    sleep 1
    set rcp_pid [exec $::env(OT_SIMULATION_APPS)/ncp/ot-rcp 2 < $radio_pty > $radio_pty &]
    puts "RCP PID: $rcp_pid"

    sleep 1

    switch_node 2
    send "pollperiod 1000\n"
    expect_line "Done"
    expect "5 bytes from $addr_1 11004 hello"

    dispose_all

    exec kill $rcp_pid
    puts "Killed $rcp_pid"
    sleep 1
    set rcp_pid [exec $::env(OT_SIMULATION_APPS)/ncp/ot-rcp 1 < $radio_pty > $radio_pty &]
    puts "RCP PID: $rcp_pid"


    puts "Many children, queued child-to-child packets"

    spawn_node 1 "rcp" "spinel+hdlc_uart://$host_pty"
    setup_leader
    set addr(1) [get_ipaddr mleid]
    send "udp open\n"
    expect_line "Done"
    send "udp bind :: 11004\n"
    expect_line "Done"

    set max_children 10
    for {set i 2} {$i <= $max_children + 1} {incr i} {
        spawn_node $i
        setup_node $i "-"
        switch_node $i
        set addr($i) [get_ipaddr mleid]
        send "udp open\n"
        expect_line "Done"
        send "udp bind :: 11003\n"
        expect_line "Done"
        send "pollperiod 100000\n"
        expect_line "Done"
    }

    sleep 1

    switch_node 1
    for {set i 2} {$i <= $max_children + 1} {incr i} {
        send "udp send $addr($i) 11003 hello\n"
        expect_line "Done"
    }

    sleep 1

    exec kill $rcp_pid
    puts "Killed $rcp_pid"
    sleep 1
    set rcp_pid [exec $::env(OT_SIMULATION_APPS)/ncp/ot-rcp 1 < $radio_pty > $radio_pty &]
    puts "RCP PID: $rcp_pid"

    sleep 1

    for {set i 7} {$i <= 9} {incr i} {
        switch_node $i
        send "pollperiod 1000\n"
        expect_line "Done"
        expect "5 bytes from $addr(1) 11004 hello"
    }

    switch_node 4
    send "udp send $addr(5) 11003 hello_from_node_4\n"
    expect_line "Done"
    if {$::env(THREAD_VERSION) != "1.1"} {
        expect "5 bytes from $addr(1) 11004 hello"
    }

    sleep 1

    exec kill $rcp_pid
    puts "Killed $rcp_pid"
    sleep 1
    set rcp_pid [exec $::env(OT_SIMULATION_APPS)/ncp/ot-rcp 1 < $radio_pty > $radio_pty &]
    puts "RCP PID: $rcp_pid"

    sleep 1

    switch_node 5
    send "pollperiod 1000\n"
    expect_line "Done"
    expect "17 bytes from $addr(4) 11003 hello_from_node_4"

    dispose_all


    puts "While energy scanning"

    spawn_node 1 "rcp" "spinel+hdlc_uart://$host_pty"
    send "ifconfig up\n"
    expect_line "Done"
    send "thread start\n"
    expect_line "Done"
    wait_for "state" "leader"
    expect_line "Done"

    send "scan energy 100\n"
    expect "| Ch | RSSI |"
    expect "+----+------+"

    sleep 1

    exec kill $rcp_pid
    puts "Killed $rcp_pid"
    sleep 1
    set rcp_pid [exec $::env(OT_SIMULATION_APPS)/ncp/ot-rcp 1 < $radio_pty > $radio_pty &]
    puts "RCP PID: $rcp_pid"

    sleep 1

    for {set i 11} {$i <= 26} {incr i} {
        expect -re "\\| +$i \\| +-?\\d+ \\|"
    }
    expect_line "Done"

    dispose_all
} finally {
    exec kill $rcp_pid
    exec kill $socat_pid
}
