test/multiple-registrations.tcl
changeset 0 2b3e5ec03512
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/multiple-registrations.tcl	Thu Apr 21 14:57:45 2011 +0100
@@ -0,0 +1,136 @@
+#
+#    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 multiple-registrations
+net::num_nodes 2
+
+manifest::file apps/dtntest/dtntest dtntest
+manifest::file Rules.make test-payload.dat
+
+dtn::config
+dtn::config_interface tcp
+dtn::config_linear_topology ALWAYSON tcp true
+
+test::script {
+    testlog "Running dtnd and dtntest"
+    dtn::run_dtnd *
+    dtn::run_dtntest *
+
+    testlog "Waiting for dtnd and dtntest to start up"
+    dtn::wait_for_dtnd *
+    dtn::wait_for_dtntest *
+
+    testlog "Creating a handle on each node"
+    set h0 [dtn::tell_dtntest 0 dtn_open]
+    set h1 [dtn::tell_dtntest 1 dtn_open]
+
+    testlog "Creating two passive registrations on node 0"
+    set reg1 [dtn::tell_dtntest 0 dtn_register $h0 \
+            endpoint=dtn://host-0/test1 expiration=3600 init_passive=true \
+            failure_action=defer]
+    set reg2 [dtn::tell_dtntest 0 dtn_register $h0 \
+            endpoint=dtn://host-0/test2 expiration=3600 init_passive=true \
+            failure_action=defer]
+
+    testlog "Binding to the two registrations"
+    dtn::tell_dtntest 0 dtn_bind $h0 $reg1
+    dtn::tell_dtntest 0 dtn_bind $h0 $reg2
+
+    testlog "Sending a bundle to each registration"
+    dtn::tell_dtntest 1 dtn_send $h1 \
+            source=dtn://host-1/test \
+            dest=dtn://host-0/test1 \
+            payload_data="test"
+
+    dtn::tell_dtntest 1 dtn_send $h1 \
+            source=dtn://host-1/test \
+            dest=dtn://host-0/test2 \
+            payload_data="test"
+
+    testlog "Waiting for the bundles to arrive"
+    dtn::wait_for_bundle_stats 0 "2 received"
+    
+    testlog "Receiving both bundles"
+    set b1_spec [dtn::tell_dtntest 0 dtn_recv $h0 payload_mem=true timeout=5000]
+    set b2_spec [dtn::tell_dtntest 0 dtn_recv $h0 payload_mem=true timeout=5000]
+
+    testlog "Trying to receive something else, checking that it times out"
+    catch "dtn::tell_dtntest 0 dtn_recv $h0 payload_mem=true timeout=2000" recv_err
+    dtn::check_equal $recv_err "error: error in dtn_recv: operation timed out"
+
+    testlog "Unbinding from one of the registrations"
+    dtn::tell_dtntest 0 dtn_unbind $h0 $reg1
+
+    testlog "Sending another bundle to both registrations"
+    dtn::tell_dtntest 1 dtn_send $h1 \
+            source=dtn://host-1/test \
+            dest=dtn://host-0/test1 \
+            payload_data="test"
+
+    dtn::tell_dtntest 1 dtn_send $h1 \
+            source=dtn://host-1/test \
+            dest=dtn://host-0/test2 \
+            payload_data="test"
+    
+    testlog "Waiting for the bundles to arrive"
+    dtn::wait_for_bundle_stats 0 "4 received"
+
+    testlog "Receiving a bundle"
+    set spec [dtn::tell_dtntest 0 dtn_recv $h0 payload_mem=true timeout=5000]
+
+    testlog "Checking that the right one was delivered"
+    foreach {var val} $spec {set bundle_data($var) $val}
+    dtn::check_equal $bundle_data(dest) dtn://host-0/test2
+
+    testlog "Checking that dtn_recv correctly times out"
+    catch "dtn::tell_dtntest 0 dtn_recv $h0 payload_mem=true timeout=2000" recv_err
+
+    testlog "Re-binding to the right registration"
+    dtn::tell_dtntest 0 dtn_bind $h0 $reg1
+
+    testlog "Checking that the bundle is now received properly"
+    set spec [dtn::tell_dtntest 0 dtn_recv $h0 payload_mem=true timeout=5000]
+    foreach {var val} $spec {set bundle_data($var) $val}
+    dtn::check_equal $bundle_data(dest) dtn://host-0/test1
+
+    testlog "Checking that many registrations works too"
+    for {set i 2} {$i < 100} {incr i} {
+        dtn::tell_dtntest 0 \
+                dtn_register $h0 endpoint=dtn://host-0/test$i expiration=3600
+    }
+
+    for {set i 0} {$i < 100} {incr i} {
+        dtn::tell_dtntest 1 dtn_send $h1 \
+                source=dtn://host-1/test \
+                dest=dtn://host-0/test$i \
+                payload_data="test"
+    }
+
+    for {set i 0} {$i < 100} {incr i} {
+        dtn::tell_dtntest 0 dtn_recv $h0 payload_mem=true timeout=30000
+    }
+
+    testlog "Checking final bundle stats"
+    dtn::wait_for_bundle_stats 0 "104 delivered"
+}
+
+test::exit_script {
+    testlog "Stopping dtnd and dtntest"
+    dtn::tell_dtntest 0 dtn_close $h0
+    dtn::tell_dtntest 1 dtn_close $h1
+    dtn::stop_dtntest *
+    dtn::stop_dtnd *
+}