#!/usr/bin/env bash
source ../multi-host.conf
workDir=$(pwd)
logDir=$workDir/logs
hubIP=$CTRL_B
testLog=$logDir/auto-prefix-propagate.log
hostSh=A.sh
hubSh=B.sh

[[ -d $logDir ]] || mkdir -p $logDir
echo "TEST AUTOMATIC PREFIX PROPAGATE START" > $testLog

LOG () {
    echo $1; echo $1 >>$testLog
}

run_hub_cmd () {
    ssh $hubIP "$1" 2>&1
}

run_scp_to_hub () {
    scp $1 $hubIP:$workDir/$1 2>&1
}

set_hub_trust_anchor () {
    LOG "set the trust anchor to $1 on the hub."
    certFile=$(sh $hostSh -a $1)
    run_scp_to_hub $certFile
}

run_host_ping_server() {
    ndnpingserver $1 >>$testLog 2>&1 &
}

end_test() {
    scp $hubIP:$workDir/hub.nfd.log hub.nfd.log 2>&1
    scp $hubIP:$workDir/hub.test.log hub.test.log 2>&1
    cat host.nfd.log hub.nfd.log > nfd.log
    cat host.test.log hub.test.log > test.log
    cat nfd.log test.log >> $testLog

    bash $hostSh -c && run_hub_cmd "cd $workDir && bash $hubSh -c"
    rm *.log

    [[ $# -gt 0 ]] && LOG "$1" && exit 1 || exit 0
}

inspect_hub_rib_exist() {
    record=$(run_hub_cmd "nfdc route list" | grep "prefix=$1 ")
    if [[ -z "$record" ]]; then
        end_test "Fail test $2"
    fi
}

inspect_hub_rib_none() {
    record=$(run_hub_cmd "nfdc route list" | grep "prefix=$1 ")
    if [[ ! -z "$record" ]]; then
        end_test "Fail test $2. the matched record: $record"
    fi
}

run_test() {
    faceUri=udp4://$hubIP:6363
    nfdc face create $faceUri >> $testLog

    defer_time=5

    LOG "run test case: 1"
    run_host_ping_server ndn:/Z/A/G && p1=$! && sleep $defer_time
    inspect_hub_rib_none /Z/A "1: route of /Z/A exists, but propagation should not be active \
as the /localhop/nfd prefix has not been registered to the local RIB now."

    LOG "run test case: 2"
    nfdc route add /localhop/nfd $faceUri >> $testLog && sleep $defer_time
    inspect_hub_rib_exist /Z/A "2: route of /Z/A does not exist, but it should exist because \
automatic prefix propagation is active (/localhop/nfd prefix has been registered), Z/A/G is \
present in local RIB and /Z/A has been configured as an identity in NFD's keychain."
    inspect_hub_rib_none /Z/A/G "2: route of /Z/A/G exists, but it should not exist because \
/Z/A is shorter and should be adopted for propagation."

    LOG "run test case: 3"
    run_host_ping_server ndn:/Z/A/H && p2=$! && sleep $defer_time
    inspect_hub_rib_exist /Z/A "3: route of /Z/A does not exist, but it should exist because \
/Z/A has already been propagated."
    inspect_hub_rib_none /Z/A/H "3: route of /Z/A/H exists, but it should not exist because \
/Z/A is shorter and should be adopted for propagation."

    LOG "run test case: 4"
    sudo kill $p1 1>> $testLog 2>&1 && sleep $defer_time
    inspect_hub_rib_exist /Z/A "4: route of /Z/A was unregistered, it should be kept for \
local RIB entry /Z/A/H."

    LOG "run test case: 5"
    sudo kill $p2 1>> $testLog 2>&1 && sleep $defer_time
    inspect_hub_rib_none /Z/A "5: route of /Z/A still exists, but it should have been \
automatically unregistered, because all /Z/H/* prefixes have been unregistered locally."

    LOG "run test case: 6"
    run_host_ping_server ndn:/Z/A/B/C/D && p3=$! && sleep $defer_time
    inspect_hub_rib_none /Z/A/B/C "6: route of /Z/A/B/C exist, but it should not be \
propagated because /Z/A is a better choice."
    inspect_hub_rib_exist /Z/A "6: route of /Z/A does not exist, but it should have \
been propagated."

    LOG "run test case: 7"
    sleep 80
    inspect_hub_rib_exist /Z/A "7: route of /Z/A/ does not exist, it should have been \
refreshed periodically."

    LOG "run test case: 8"
    run_host_ping_server ndn:/Z/F/I && sleep $defer_time
    inspect_hub_rib_none /Z/F "8: route of /Z/F exist, but automatic prefix propagation \
should not be active becuase there are no configured keys for the covering namespace."
}

LOG "set environment in the host."
bash $hostSh -c -p

LOG "set environment in the hub."
run_hub_cmd "[[ -d $workDir ]] || mkdir -p $workDir"
run_scp_to_hub $hubSh
set_hub_trust_anchor ndn:/Z/A
run_hub_cmd "cd $workDir && bash $hubSh -c -p"

LOG "run test"
run_test && end_test
