test/multipath-forwarding.tcl
changeset 0 2b3e5ec03512
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/multipath-forwarding.tcl	Thu Apr 21 14:57:45 2011 +0100
@@ -0,0 +1,183 @@
+#
+#    Copyright 2006 Intel Corporation
+# 
+#    Licensed under the Apache License, Version 2.0 (the "License");
+#    you may not use this file except in compliance with the License.
+#    You may obtain a copy of the License at
+# 
+#        http://www.apache.org/licenses/LICENSE-2.0
+# 
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+
+test::name multipath-forwarding
+net::num_nodes 4
+
+dtn::config
+
+set clayer   tcp
+
+foreach {var val} $opt(opts) {
+    if {$var == "-cl" || $var == "cl"} {
+	set clayer $val
+    } else {
+	testlog error "ERROR: unrecognized test option '$var'"
+	exit 1
+    }
+}
+
+testlog "Configuring $clayer interfaces / links"
+dtn::config_interface $clayer
+dtn::config_diamond_topology ALWAYSON $clayer true
+
+test::script {
+    testlog "Running dtnds"
+    dtn::run_dtnd *
+
+    testlog "Waiting for dtnds to start up"
+    dtn::wait_for_dtnd *
+
+    dtn::tell_dtnd 3 tcl_registration dtn://host-3/test
+    
+    testlog "Waiting for links to open"
+    dtn::wait_for_link_state 0 tcp-link:0-1 OPEN
+    dtn::wait_for_link_state 0 tcp-link:0-2 OPEN
+
+    testlog "adding write delay to node 0 links"
+    tell_dtnd 0 link reconfigure tcp-link:0-1 \
+	    test_write_delay=500 sendbuf_len=1024
+    tell_dtnd 0 link reconfigure tcp-link:0-2 \
+	    test_write_delay=500 sendbuf_len=1024
+
+    testlog "*"
+    testlog "* Test 1: equal size bundles, equal priority routes"
+    testlog "*"
+
+    testlog "sending 20 bundles"
+    for {set i 0} {$i < 20} {incr i} {
+	tell_dtnd 0 sendbundle dtn://host-0/test dtn://host-3/test length=2048
+    }
+
+    testlog "waiting for all to be transmitted"
+    dtn::wait_for_bundle_stats 0 {0 pending 20 transmitted} 60
+    
+    testlog "checking they were load balanced"
+    dtn::check_link_stats 0 tcp-link:0-1 10 bundles_transmitted
+    dtn::check_link_stats 0 tcp-link:0-2 10 bundles_transmitted
+
+    testlog "waiting for delivery"
+    dtn::wait_for_bundle_stats 1 {0 pending 10 received 10 transmitted}
+    dtn::wait_for_bundle_stats 2 {0 pending 10 received 10 transmitted}
+    dtn::wait_for_bundle_stats 3 {0 pending 20 delivered 0 duplicate}
+    
+    dtn::tell_dtnd * bundle reset_stats
+    
+    testlog "*"
+    testlog "* Test 2: equal size bundles, different priority routes"
+    testlog "*"
+
+    # XXX/demmer fixme
+    if {1} {
+        testlog "WARNING: priority-based forwarding no longer works"
+    } else {
+        
+    testlog "swapping routes on node 0"
+    tell_dtnd 0 route del dtn://host-3/*
+    tell_dtnd 0 route add dtn://host-3/* tcp-link:0-1 route_priority=100
+    tell_dtnd 0 route add dtn://host-3/* tcp-link:0-2 route_priority=0
+    
+    testlog "sending 20 bundles"
+    for {set i 0} {$i < 20} {incr i} {
+	tell_dtnd 0 sendbundle dtn://host-0/test dtn://host-3/test length=2048
+    }
+
+    testlog "waiting for all to be transmitted"
+    dtn::wait_for_bundle_stats 0 {0 pending 20 transmitted} 60
+    
+    testlog "checking they all went on one link"
+    dtn::wait_for_link_stats 0 tcp-link:0-1 {20 bundles_transmitted}
+    dtn::wait_for_link_stats 0 tcp-link:0-2 {0  bundles_transmitted}
+
+    testlog "waiting for delivery"
+    dtn::wait_for_bundle_stats 1 {0 pending 20 received 20 transmitted}
+    dtn::wait_for_bundle_stats 2 {0 pending 0 received 0 transmitted}
+    dtn::wait_for_bundle_stats 3 {0 pending 20 delivered 0 duplicate}
+
+    testlog "swapping back routes on node 0"
+    tell_dtnd 0 route del dtn://host-3/*
+    tell_dtnd 0 route add dtn://host-3/* tcp-link:0-1
+    tell_dtnd 0 route add dtn://host-3/* tcp-link:0-2
+    
+    dtn::tell_dtnd * bundle reset_stats
+    }
+    
+    testlog "*"
+    testlog "* Test 3: copy routes"
+    testlog "*"
+
+    testlog "swapping routes on node 0"
+    tell_dtnd 0 route del dtn://host-3/*
+    tell_dtnd 0 route add dtn://host-3/* tcp-link:0-1 route_priority=100 
+    tell_dtnd 0 route add dtn://host-3/* tcp-link:0-2 \
+	    route_priority=0 action=copy
+
+    testlog "sending 20 bundles (to different destination)"
+    for {set i 0} {$i < 20} {incr i} {
+	tell_dtnd 0 sendbundle dtn://host-0/test dtn://host-3/test2 length=2048
+    }
+
+    testlog "waiting for all to be transmitted"
+    dtn::wait_for_bundle_stats 0 {0 pending 40 transmitted} 60
+    
+    testlog "checking they all went on both links"
+    dtn::wait_for_link_stats 0 tcp-link:0-1 {20 bundles_transmitted}
+    dtn::wait_for_link_stats 0 tcp-link:0-2 {20 bundles_transmitted}
+
+    testlog "waiting for arrival"
+    dtn::wait_for_bundle_stats 1 {0 pending 20 received 20 transmitted 0 duplicate}
+    dtn::wait_for_bundle_stats 2 {0 pending 20 received 20 transmitted 0 duplicate}
+    dtn::wait_for_bundle_stats 3 {20 pending 0 delivered 20 duplicate}
+
+    testlog "adding registration, waiting for delivery"
+    dtn::tell_dtnd 3 tcl_registration dtn://host-3/test2
+    dtn::wait_for_bundle_stats 3 {0 pending 20 delivered 20 duplicate}
+    
+    dtn::tell_dtnd * bundle reset_stats
+    
+    testlog "*"
+    testlog "* Test 4: wildcard destination"
+    testlog "*"
+
+    testlog "adding different priority routes on node 0"
+    tell_dtnd 0 route del dtn://host-3/*
+    tell_dtnd 0 route add dtn://host-3/* tcp-link:0-1 route_priority=100 
+    tell_dtnd 0 route add dtn://host-3/* tcp-link:0-2 route_priority=0
+
+    testlog "sending 20 bundles to dummy wildcard destination"
+    for {set i 0} {$i < 20} {incr i} {
+	tell_dtnd 0 sendbundle dtn://host-0/test dtn://*/nowhere length=2048
+    }
+
+    # XXX/demmer it would be better to have a registration that these
+    # are going to, but the problem is that we don't keep track of all
+    # duplicates in the core bundle daemon, so it's non-deterministic
+    # how many will actually get delivered
+
+    testlog "waiting for all to be transmitted on both links"
+    dtn::wait_for_bundle_stats 0 {0 pending 0 delivered 40 transmitted} 60
+    dtn::wait_for_link_stats 0 tcp-link:0-1 {20 bundles_transmitted}
+    dtn::wait_for_link_stats 0 tcp-link:0-2 {20 bundles_transmitted}
+
+    dtn::tell_dtnd * bundle reset_stats
+    
+    testlog "Test success!"
+}
+
+test::exit_script {
+    testlog "Stopping all dtnds"
+    dtn::stop_dtnd *
+}