| #!/usr/bin/env bash |
| source ../multi-host.conf |
| workDir=$(pwd) |
| logDir=$workDir/logs |
| testLogA=$logDir/nack-scenario-A.log |
| testLogB=$logDir/nack-scenario-B.log |
| testLogC=$logDir/nack-scenario-C.log |
| testLogD=$logDir/nack-scenario-D.log |
| mkdir -p $workDir/logs |
| |
| clean_up() { |
| |
| dataB=$1 |
| dataC=$2 |
| echo "killing nfd on B, C and D..." |
| ssh $CTRL_B "sudo killall nfd >> $testLogB 2>&1 &\ |
| sudo /sbin/tc qdisc del dev $dataB root" |
| ssh $CTRL_C "sudo killall nfd >> $testLogC 2>&1 &\ |
| sudo /sbin/tc qdisc del dev $dataC root" |
| ssh $CTRL_D "sudo killall nfd >> $testLogD 2>&1" |
| |
| sudo killall nfd 2>&1 |
| sleep 2 |
| } |
| |
| echo "Starting nfd on host A" > $testLogA |
| |
| # start nfd on localhost (A) and set best-route strategy |
| nfd-start &> $logDir/nfdA.log |
| sleep 2 |
| nfdc set-strategy / /localhost/nfd/strategy/best-route >> $testLogA |
| |
| echo "Configure host B..." |
| # start nfd on hostB and set best-route-v1 |
| ssh $CTRL_B "mkdir -p $logDir ; nfd-start &> $logDir/nfdB.log &\ |
| sleep 2 ; echo 'Starting nfd on host B' > $testLogB &\ |
| nfdc set-strategy / /localhost/nfd/strategy/best-route/%FD%01 >> $testLogB" |
| |
| echo "Configure host C..." |
| # start nfd on hostC and set best-route strategy |
| ssh $CTRL_C "mkdir -p $logDir ; nfd-start &> $logDir/nfdC.log &\ |
| sleep 2 ; echo 'Starting nfd on host C' > $testLogC &\ |
| nfdc set-strategy / /localhost/nfd/strategy/best-route >> $testLogC" |
| |
| echo "Configure host D..." |
| # start nfd on hostD and set best-route strategy |
| ssh $CTRL_D "mkdir -p $logDir ; nfd-start &> $logDir/nfdD.log &\ |
| sleep 2 ; echo 'Starting nfd on host D' > $testLogD &\ |
| nfdc set-strategy / /localhost/nfd/strategy/best-route >> $testLogD" |
| |
| # A: create a route for prefix ndn:/P toward B and C, |
| # where the cost toward B (10) is lower than the cost toward C(20) |
| nfdc register -c 10 ndn:/P udp4://$IP4_B1:6363 >> $testLogA |
| nfdc register -c 20 ndn:/P udp4://$IP4_C1:6363 >> $testLogA |
| |
| # D: create a route for prefix ndn:/P toward A |
| ssh $CTRL_D "echo 'creating a route for namespace ndn:/P toward A' >> $testLogD &\ |
| nfdc register -c 20 ndn:/P udp4://$IP4_A2:6363 >> $testLogD &" |
| |
| echo "Start test 1..." |
| # D: express an Interest for ndn:/P/1, no retransmissions, wait 8000ms |
| ssh $CTRL_D "echo 'express an Interest for ndn:/P/1' >> $testLogD &\ |
| test-nack-consumer -p ndn:/P/1 -w 8000 > $logDir/test1.log" |
| |
| scp $CTRL_D:$logDir/test1.log $logDir/test1.log |
| |
| echo "Analyzing result of test 1..." |
| received=$(tail -n 1 $logDir/test1.log | awk '{print $1}') |
| if [[ "$received" == "NACK" ]] |
| then |
| echo "FAIL: A returned unexpected Nack while Nack is not expected if not all &\ |
| upstreams return Nack. The test doesn't retransmit the Interest, and &\ |
| therefore A didn't try all possible upstreams to return Nack from all. &\ |
| Check test1 log for details." |
| clean_up |
| exit 1 |
| fi |
| |
| echo "Start test 2..." |
| # D: express an Interest for ndn:/P/2, retransmit with new nonce, wait 8000ms |
| ssh $CTRL_D "echo 'express an Interest for ndn:/P/2' >> $testLogD &\ |
| test-nack-consumer -p ndn:/P/2 -r 2000 -w 8000 > $logDir/test2.log" |
| |
| scp $CTRL_D:$logDir/test2.log $logDir/test2.log |
| |
| echo "Analyzing result of test 2..." |
| received=$(tail -n 1 $logDir/test2.log | awk '{print $1}') |
| if [[ "$received" == "NACK" ]] |
| then |
| echo "FAIL: A returned unexpected Nack. Nack is not expected when one or &\ |
| upstreams time out, even if some upstreams return Nack. &\ |
| Check test2 log for details." |
| clean_up |
| exit 1 |
| fi |
| |
| echo "Setup test 3..." |
| # get data interface of host B |
| dataB=$(ssh $CTRL_B "netstat -ie | grep -B1 $IP4_B1 | head -n1" | awk '{print $1}') |
| |
| # B: configure best-route strategy and get the set link delay to 500 ms |
| ssh $CTRL_B "nfdc set-strategy / /localhost/nfd/strategy/best-route >> $testLogB &\ |
| sudo /sbin/tc qdisc add dev $dataB root netem delay 500ms >> $testLogB " |
| |
| # get data interface of host C |
| dataC=$(ssh $CTRL_C "netstat -ie | grep -B1 $IP4_C1 | head -n1" | awk '{print $1}') |
| |
| # B: configure link delay to 500 ms |
| ssh $CTRL_C "sudo /sbin/tc qdisc add dev $dataC root netem delay 500ms >> $testLogC" |
| |
| echo "Start test 3..." |
| # D: express an Interest for ndn:/P/3, retransmit with new nonce after 200ms, wait 3000ms |
| ssh $CTRL_D "echo 'express an Interest for ndn:/P/3' >> $testLogD &\ |
| test-nack-consumer -p ndn:/P/3 -r 200 -w 3000 > $logDir/test3.log" |
| |
| scp $CTRL_D:$logDir/test3.log $logDir/test3.log |
| |
| echo "Analyzing result of test 3..." |
| reason=$(grep NACK $logDir/test3.log | awk '{print $NF}') |
| NACK_count=$(grep NACK $logDir/test3.log | wc -l) |
| |
| if [ $NACK_count -ne 1 ] || [[ "$reason" != "NoRoute" ]] |
| then |
| echo "FAIL: A should return exactly one Nack after both upstreams have returned Nack. &\ |
| Reason should be 'NoRoute'. Test returned $NACK_count Nacks, with reason $reason. &\ |
| Check test3 log for more details." |
| clean_up $dataB $dataC |
| exit 1 |
| fi |
| |
| echo "Setup test 4..." |
| |
| # B: configure link delay to 1000 ms |
| ssh $CTRL_B "nfdc set-strategy / /localhost/nfd/strategy/best-route >> $testLogB&\ |
| sudo /sbin/tc qdisc change dev $dataB root netem delay 1000ms >> $testLogB" |
| |
| # D: express an Interest for ndn:/P/4, retransmit with new nonce after 200ms, wait 3000ms |
| ssh $CTRL_D "echo 'express an Interest for ndn:/P/4' >> $testLogD &\ |
| test-nack-consumer -p ndn:/P/4 -r 200 -w 3000 > $logDir/test4.log" |
| |
| scp $CTRL_D:$logDir/test4.log $logDir/test4.log |
| |
| echo "Analyzing result of test 4" |
| reason=$(grep NACK $logDir/test4.log | awk '{print $NF}') |
| NACK_count=$(grep NACK $logDir/test4.log | wc -l) |
| nonce2=$(grep "Sending Interest 2:" $logDir/test4.log | awk '{print $NF}') |
| NACK_nonce=$(grep NACK $logDir/test4.log | awk '{for(i=1;i<=NF;i++){if($i~/^Nonce/){print $(i+1)}}}' |
| ) |
| |
| if [ $NACK_count -ne 1 ] || [[ "$reason" != "NoRoute" ]] || [ "$NACK_nonce" -ne "$nonce2" ] |
| then |
| echo "FAIL: A should return exactly one Nack that should carry the latest incoming Nonce \ |
| from downstream. Reason should be 'NoRoute'. Test returned $NACK_count Nacks, with nonce &\ |
| $NACK_nonce and reason $reason. Check test4 log for test details." |
| clean_up $dataB $dataC |
| exit 1 |
| fi |
| |
| # cleanup |
| clean_up $dataB $dataC |
| echo "Test passed successfully" |
| exit 0 |