blob: 0f53f502e5a8b8b2664c7c6580b1a119ff580d55 [file] [log] [blame]
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -05001#!/usr/bin/env bash
2source ../multi-host.conf
3workDir=$(pwd)
4logDir=$workDir/logs
5testLogA=$logDir/nack-scenario-A.log
6testLogB=$logDir/nack-scenario-B.log
7testLogC=$logDir/nack-scenario-C.log
8testLogD=$logDir/nack-scenario-D.log
9mkdir -p $workDir/logs
10
11clean_up() {
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -050012 echo "killing nfd on B, C and D..."
Eric Newberry9b705202017-06-24 21:12:02 -070013 ssh $CTRL_B "sudo killall nfd >> $testLogB 2>&1"
14 if [[ $# -ge 1 ]]; then
15 local dataB=$1
16 ssh $CTRL_B "sudo tc qdisc del dev $dataB root"
17 fi
18 ssh $CTRL_C "sudo killall nfd >> $testLogC 2>&1"
19 if [[ $# -ge 2 ]]; then
20 local dataC=$2
21 ssh $CTRL_C "sudo tc qdisc del dev $dataC root"
22 fi
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -050023 ssh $CTRL_D "sudo killall nfd >> $testLogD 2>&1"
24
25 sudo killall nfd 2>&1
26 sleep 2
27}
28
29echo "Starting nfd on host A" > $testLogA
30
31# start nfd on localhost (A) and set best-route strategy
32nfd-start &> $logDir/nfdA.log
33sleep 2
Eric Newberry9b705202017-06-24 21:12:02 -070034nfdc strategy set / /localhost/nfd/strategy/best-route >> $testLogA
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -050035
36echo "Configure host B..."
37# start nfd on hostB and set best-route-v1
38ssh $CTRL_B "mkdir -p $logDir ; nfd-start &> $logDir/nfdB.log &\
39 sleep 2 ; echo 'Starting nfd on host B' > $testLogB &\
Eric Newberry9b705202017-06-24 21:12:02 -070040 nfdc strategy set / /localhost/nfd/strategy/best-route/%FD%01 >> $testLogB"
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -050041
42echo "Configure host C..."
43# start nfd on hostC and set best-route strategy
44ssh $CTRL_C "mkdir -p $logDir ; nfd-start &> $logDir/nfdC.log &\
45 sleep 2 ; echo 'Starting nfd on host C' > $testLogC &\
Eric Newberry9b705202017-06-24 21:12:02 -070046 nfdc strategy set / /localhost/nfd/strategy/best-route >> $testLogC"
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -050047
48echo "Configure host D..."
49# start nfd on hostD and set best-route strategy
50ssh $CTRL_D "mkdir -p $logDir ; nfd-start &> $logDir/nfdD.log &\
51 sleep 2 ; echo 'Starting nfd on host D' > $testLogD &\
Eric Newberry9b705202017-06-24 21:12:02 -070052 nfdc strategy set / /localhost/nfd/strategy/best-route >> $testLogD"
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -050053
Eric Newberry9b705202017-06-24 21:12:02 -070054# A: create faces and routes for prefix /P toward B and C,
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -050055# where the cost toward B (10) is lower than the cost toward C(20)
Eric Newberry9b705202017-06-24 21:12:02 -070056nfdc face create udp4://$IP4_B1:6363 >> $testLogA
57nfdc face create udp4://$IP4_C1:6363 >> $testLogA
58nfdc route add /P udp4://$IP4_B1:6363 cost 10 >> $testLogA
59nfdc route add /P udp4://$IP4_C1:6363 cost 20 >> $testLogA
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -050060
Eric Newberry9b705202017-06-24 21:12:02 -070061# D: create a face to A and a route for prefix /P toward A
62ssh $CTRL_D "echo 'creating a route toward A and a route for namespace /P toward A' >> $testLogD &\
63 nfdc face create udp4://$IP4_A2:6363 >> $testLogD &&\
64 nfdc route add /P udp4://$IP4_A2:6363 cost 20 >> $testLogD"
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -050065
66echo "Start test 1..."
Eric Newberry9b705202017-06-24 21:12:02 -070067# D: express an Interest for /P/1, no retransmissions, wait 8000ms
68ssh $CTRL_D "echo 'express an Interest for /P/1' >> $testLogD &\
69 test-nack-consumer -p /P/1 -w 8000 > $logDir/test1.log"
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -050070
71scp $CTRL_D:$logDir/test1.log $logDir/test1.log
72
73echo "Analyzing result of test 1..."
74received=$(tail -n 1 $logDir/test1.log | awk '{print $1}')
Eric Newberry9b705202017-06-24 21:12:02 -070075if [[ "$received" == "NACK" ]]; then
76 echo "FAIL: A returned an unexpected Nack. This test does not retransmit the Interest,"
77 echo "and therefore A did not try all possible nexthops. Check $logDir/test1.log for more details."
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -050078 clean_up
Eric Newberry9b705202017-06-24 21:12:02 -070079 exit 1
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -050080fi
81
82echo "Start test 2..."
Eric Newberry9b705202017-06-24 21:12:02 -070083# D: express an Interest for /P/2, retransmit with new nonce, wait 8000ms
84ssh $CTRL_D "echo 'express an Interest for /P/2' >> $testLogD &\
85 test-nack-consumer -p /P/2 -r 2000 -w 8000 > $logDir/test2.log"
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -050086
87scp $CTRL_D:$logDir/test2.log $logDir/test2.log
88
89echo "Analyzing result of test 2..."
90received=$(tail -n 1 $logDir/test2.log | awk '{print $1}')
Eric Newberry9b705202017-06-24 21:12:02 -070091if [[ "$received" == "NACK" ]]; then
92 echo "FAIL: A returned an unexpected Nack. A Nack is not expected when one or more upstreams"
93 echo "time out, even if some upstreams return Nacks. Check $logDir/test2.log for more details."
94 clean_up
95 exit 1
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -050096fi
97
98echo "Setup test 3..."
99# get data interface of host B
100dataB=$(ssh $CTRL_B "netstat -ie | grep -B1 $IP4_B1 | head -n1" | awk '{print $1}')
101
102# B: configure best-route strategy and get the set link delay to 500 ms
Eric Newberry9b705202017-06-24 21:12:02 -0700103ssh $CTRL_B "nfdc strategy set / /localhost/nfd/strategy/best-route >> $testLogB &\
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -0500104 sudo /sbin/tc qdisc add dev $dataB root netem delay 500ms >> $testLogB "
105
106# get data interface of host C
107dataC=$(ssh $CTRL_C "netstat -ie | grep -B1 $IP4_C1 | head -n1" | awk '{print $1}')
108
109# B: configure link delay to 500 ms
110ssh $CTRL_C "sudo /sbin/tc qdisc add dev $dataC root netem delay 500ms >> $testLogC"
111
Eric Newberry9b705202017-06-24 21:12:02 -0700112# get data interface of host D
113dataD=$(ssh $CTRL_D "netstat -ie | grep -B1 $IP4_D1 | head -n1" | awk '{print $1}')
114
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -0500115echo "Start test 3..."
Eric Newberry9b705202017-06-24 21:12:02 -0700116# D: start ndndump for interface to R, express an Interest for /P/3, retransmit with new nonce after
117# 200ms, wait 3000ms
118ssh $CTRL_D "sudo ndndump -i $dataD > $logDir/ndndump-3.out & sleep 1"
119ssh $CTRL_D "echo 'express an Interest for /P/3' >> $testLogD &\
120 test-nack-consumer -p /P/3 -r 200 -w 3000 > $logDir/test3.log"
121ssh $CTRL_D "sleep 1; sudo killall ndndump"
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -0500122
123scp $CTRL_D:$logDir/test3.log $logDir/test3.log
Eric Newberry9b705202017-06-24 21:12:02 -0700124scp $CTRL_D:$logDir/ndndump-3.out $logDir/ndndump-3.out
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -0500125
126echo "Analyzing result of test 3..."
Eric Newberry9b705202017-06-24 21:12:02 -0700127NACK_count=$(grep "NACK" $logDir/ndndump-3.out | wc -l)
128reason=$(grep -Po "NACK: \K[^,]*" $logDir/ndndump-3.out)
129nonce2=$(grep "Sending Interest 2:" $logDir/test3.log | awk '{print $NF}')
130NACK_nonce=$(grep -Po "NACK:.*?.*ndn\.Nonce=\K[0-9]*" $logDir/ndndump-3.out)
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -0500131
Eric Newberry9b705202017-06-24 21:12:02 -0700132if [[ $NACK_count -ne 1 || "$reason" != NoRoute || "$NACK_nonce" -ne "$nonce2" ]]; then
133 echo "FAIL: A should return exactly one Nack after both upstreams have returned Nack."
134 echo "Reason should be 'NoRoute' and Nonce should match the second Interest ($nonce2)."
135 echo "Test returned $NACK_count Nacks, with reason $reason for Nonce $NACK_nonce."
136 echo "Check $logDir/test3.log and $logDir/ndndump-3.out for more details."
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -0500137 clean_up $dataB $dataC
138 exit 1
139fi
140
141echo "Setup test 4..."
142
143# B: configure link delay to 1000 ms
Eric Newberry9b705202017-06-24 21:12:02 -0700144ssh $CTRL_B "nfdc strategy set / /localhost/nfd/strategy/best-route >> $testLogB&\
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -0500145 sudo /sbin/tc qdisc change dev $dataB root netem delay 1000ms >> $testLogB"
146
Eric Newberry9b705202017-06-24 21:12:02 -0700147# D: start ndndump for interface to R, express an Interest for /P/4, retransmit with new nonce after
148# 200ms, wait 3000ms
149ssh $CTRL_D "sudo ndndump -i $dataD > $logDir/ndndump-4.out & sleep 1"
150ssh $CTRL_D "echo 'express an Interest for /P/4' >> $testLogD &\
151 test-nack-consumer -p /P/4 -r 200 -w 3000 > $logDir/test4.log"
152ssh $CTRL_D "sleep 1; sudo killall ndndump"
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -0500153
154scp $CTRL_D:$logDir/test4.log $logDir/test4.log
Eric Newberry9b705202017-06-24 21:12:02 -0700155scp $CTRL_D:$logDir/ndndump-4.out $logDir/ndndump-4.out
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -0500156
157echo "Analyzing result of test 4"
Eric Newberry9b705202017-06-24 21:12:02 -0700158NACK_count=$(grep "NACK" $logDir/ndndump-4.out | wc -l)
159reason=$(grep -Po "NACK: \K[^,]*" $logDir/ndndump-4.out)
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -0500160nonce2=$(grep "Sending Interest 2:" $logDir/test4.log | awk '{print $NF}')
Eric Newberry9b705202017-06-24 21:12:02 -0700161NACK_nonce=$(grep -Po "NACK:.*?.*ndn\.Nonce=\K[0-9]*" $logDir/ndndump-4.out)
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -0500162
Eric Newberry9b705202017-06-24 21:12:02 -0700163if [[ $NACK_count -ne 1 || "$reason" != NoRoute || "$NACK_nonce" -ne "$nonce2" ]]; then
164 echo "FAIL: A should return exactly one Nack carrying the latest incoming Nonce from"
165 echo "downstream ($nonce2). The reason should be 'NoRoute'. The test returned $NACK_count Nacks,"
166 echo "with nonce $NACK_nonce and reason $reason. Check $logDir/test4.log and"
167 echo "$logDir/ndndump-4.out for more details."
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -0500168 clean_up $dataB $dataC
Eric Newberry9b705202017-06-24 21:12:02 -0700169 exit 1
Hila Ben Abrahame8c22e92016-10-20 14:30:32 -0500170fi
171
172# cleanup
173clean_up $dataB $dataC
Eric Newberry9b705202017-06-24 21:12:02 -0700174echo "Test passed"
175exit 0