#!/bin/bash
#
#  Copyright (c) 2018, 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.
#

set -e
set -x

die()
{
    echo " *** ERROR: " "$*"
    exit 1
}

at_exit()
{
    EXIT_CODE=$?

    sudo killall expect || true
    killall ot-ctl || true
    killall ot-daemon || true
    killall socat || true

    exit $EXIT_CODE
}

build()
{
    make -f examples/Makefile-simulation
    make -f src/posix/Makefile-posix PLATFORM_NETIF=1 PLATFORM_UDP=1 UDP_FORWARD=0 MAX_POWER_TABLE=1
}

check()
{
    trap at_exit INT TERM EXIT

    SOCAT_OUTPUT=/tmp/ot-socat
    OT_OUTPUT=/tmp/ot-output
    socat -d -d pty,raw,echo=0 pty,raw,echo=0 >/dev/null 2>$SOCAT_OUTPUT &
    while true; do
        if test "$(head -n2 $SOCAT_OUTPUT | wc -l)" = 2; then
            RADIO_PTY=$(head -n1 $SOCAT_OUTPUT | grep -o '/dev/.\+')
            CORE_PTY=$(head -n2 $SOCAT_OUTPUT | tail -n1 | grep -o '/dev/.\+')
            break
        fi
        echo 'Waiting for socat ready...'
        sleep 1
    done
    echo 'RADIO_PTY' "$RADIO_PTY"
    echo 'CORE_PTY' "$CORE_PTY"

    RADIO_NCP_PATH="$(pwd)/$(ls output/*linux*/bin/ot-rcp)"

    # shellcheck disable=SC2094
    $RADIO_NCP_PATH 1 >"$RADIO_PTY" <"$RADIO_PTY" &

    # Cover setting a valid network interface name.
    readonly VALID_NETIF_NAME="wan$(date +%H%M%S)"

    RADIO_URL="spinel+hdlc+uart://${CORE_PTY}?max-power-table=11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26"

    if [[ ${DAEMON} == 1 ]]; then
        sudo "$(pwd)/$(ls output/posix/*linux*/bin/ot-daemon)" -I "${VALID_NETIF_NAME}" "${RADIO_URL}" &
        sleep 1
        OT_CLI_CMD="$(pwd)/$(ls output/posix/*linux*/bin/ot-ctl)"
        sudo "${OT_CLI_CMD}" panid 0xface | grep 'Done' || die 'failed to set panid with ot-ctl'

        # verify this reset and factoryreset end immediately
        sudo "${OT_CLI_CMD}" reset
        # sleep a while for daemon ready
        sleep 2
        sudo "${OT_CLI_CMD}" factoryreset
    else
        OT_CLI="$(pwd)/$(ls output/posix/*linux*/bin/ot-cli)"
        sudo "${OT_CLI}" -I "${VALID_NETIF_NAME}" -n "${RADIO_URL}"

        # Cover setting a too long(max is 15 characters) network interface name.
        # Expect exit code to be 2(OT_EXIT_INVALID_ARGUMENTS).
        readonly INVALID_NETIF_NAME="wan0123456789123"
        sudo "${OT_CLI}" -I "${INVALID_NETIF_NAME}" -n "${RADIO_URL}" || test $? = 2

        OT_CLI_CMD="$(pwd)/$(ls output/posix/*linux*/bin/ot-cli) ${RADIO_URL}"
    fi

    sudo expect <<EOF | tee "${OT_OUTPUT}" &
spawn ${OT_CLI_CMD}
send "panid 0xface\r\n"
expect "Done"
send "ifconfig up\r\n"
expect "Done"
send "thread start\r\n"
expect "Done"
sleep 5
send "state\r\n"
expect "leader"
expect "Done"
send "extaddr\r\n"
expect "Done"
send "ipaddr\r\n"
expect "Done"
send "coex\r\n"
expect "Done"
wait
EOF

    # wait until the node becomes leader
    while true; do
        sleep 5
        if grep -q leader $OT_OUTPUT; then
            break
        else
            echo 'Still waiting for leader'
        fi
    done

    netstat -an | grep -q 61631 || die 'TMF port is not available!'

    extaddr=$(awk '/extaddr/{getline; print}' $OT_OUTPUT | tr -d '\r\n')
    echo "Extended address is: ${extaddr}"

    if [[ ${DAEMON} == 1 ]]; then
        sudo killall -9 expect || true
        sudo killall -9 ot-ctl || true
        NETIF_INDEX=$(ip link show "${VALID_NETIF_NAME}" | cut -f 1 -d ":" | head -n 1)
        sudo PATH="$(dirname "${OT_CLI_CMD}"):${PATH}" \
            python3 "$PWD/tests/scripts/misc/test_multicast_join.py" "${NETIF_INDEX}" \
            || die 'multicast group join failed'
    fi

    LEADER_ALOC=fdde:ad00:beef::ff:fe00:fc00
    # Retrievie extended address through network diagnostic get
    coap_response=$(echo -n '120100' | xxd -r -p | coap-client -m POST coap://[${LEADER_ALOC}]:61631/d/dg -f- | xxd -p | grep 0008)
    echo "CoAP response is: ${coap_response}"

    # Verify CoAP response contains the extended address
    if [[ ${coap_response} == *${extaddr}* ]]; then
        echo 'Success'
    else
        die 'Failed to get extended address'
    fi
}

main()
{
    case $1 in
        build)
            build
            ;;
        check)
            check
            ;;
        *)
            build
            check
            ;;
    esac
}

main "$@"
