test/extension-block.tcl
changeset 0 2b3e5ec03512
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/extension-block.tcl	Thu Apr 21 14:57:45 2011 +0100
@@ -0,0 +1,184 @@
+#
+#    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 extension_block
+net::num_nodes 3
+
+dtn::config
+
+dtn::config_interface tcp
+dtn::config_linear_topology ALWAYSON tcp true
+
+manifest::file apps/dtntest/dtntest dtntest
+
+set block_content "some_long_text_thats_more_than_64_bytes_long_and_therefore_would_trigger_a_buffer_overflow_error_if_the_code_didnt_correctly_handle_the_fact_that_extension_blocks_might_be_more_than_64_bytes_long"
+
+test::script {
+    testlog "running dtnds"
+    dtn::run_dtnd *
+
+    testlog "running dtntest"
+    dtn::run_dtntest 0
+
+    testlog "waiting for dtnds and dtntest to start up"
+    dtn::wait_for_dtnd *
+    dtn::wait_for_dtntest 0
+
+    set src_eid dtn://host-0
+    set mid_eid dtn://host-1
+    set dst_eid dtn://host-2
+    set src dtn://host-0/test
+    set mid dtn://host-1/test
+    set dst dtn://host-2/test
+
+    dtn::tell_dtnd 0 tcl_registration $src
+    dtn::tell_dtnd 1 tcl_registration $mid
+    dtn::tell_dtnd 2 tcl_registration $dst
+
+    set sr_dst dtn://host-0/sr
+    dtn::tell_dtnd 0 tcl_registration $sr_dst
+
+    testlog "dtn_open"
+    set handle [dtn::tell_dtntest 0 dtn_open]
+
+    
+    testlog "*"
+    testlog "Test 1: Forward Unprocessed Block"
+
+    ## Node 1 sends a bundle that includes an extension block to node 3
+    ## via the API. The intermediary node 2 classifies the block as unknown,
+    ## and because the block contains no set flags, marks the block's
+    ## "forwarded unprocessed" flag prior to forwarding the bundle (block
+    ## included) to node 3.
+
+    testlog "sending bundle"
+    set id [dtn::tell_dtntest 0 dtn_send $handle source=$src dest=$dst        \
+                                                 replyto=$sr_dst              \
+                                                 payload_data=this_is_a_test! \
+                                                 block_type=16 block_flags=0  \
+                                                 block_content=$block_content]
+
+    testlog "waiting to receive bundle at destination"
+    dtn::wait_for_bundle 2 $id
+    dtn::check_bundle_data 2 $id recv_blocks 3 block,0x10,flags 0x20
+
+    testlog "checking that each node received/transmitted bundle"
+    dtn::wait_for_bundle_stats 0 {1 received 1 transmitted}
+    dtn::wait_for_bundle_stats 1 {1 received 1 transmitted}
+    dtn::wait_for_bundle_stats 2 {1 received 0 transmitted}
+
+    testlog "*"
+    testlog "Test 2: Report Unknown Block"
+
+    ## Node 1 sends a bundle that includes an extension block to node 3
+    ## via the API. The intermediary node 2 classifies the block as unknown,
+    ## and because the block contains the REPORT_ONERROR block flag, sends
+    ## a status report to the bundle's reply-to endpoint (i.e., node1).
+    ## Node 2 then marks the block's "forwarded unprocessed" flag prior
+    ## to forwarding the bundle (block included) to node 3, which also
+    ## sends a status report to the bundle's reply-to endpoint (.e., node 1).
+
+    testlog "sending bundle"
+    set id [dtn::tell_dtntest 0 dtn_send $handle source=$src dest=$dst        \
+                                                 replyto=$sr_dst              \
+                                                 payload_data=this_is_a_test! \
+                                                 block_type=16 block_flags=2  \
+                                                 block_content=$block_content]
+
+    testlog "waiting to receive bundle at destination"
+    dtn::wait_for_bundle 2 $id
+    dtn::check_bundle_data 2 $id recv_blocks 3
+    dtn::check_bundle_data 2 $id recv_blocks 3 block,0x10,flags 0x22
+
+    testlog "waiting for status reports"
+    set sr_guid "$id,$mid_eid"
+    dtn::wait_for_sr 0 $sr_guid
+    dtn::check_sr_fields 0 $sr_guid sr_received_time
+    set sr_guid "$id,$dst_eid"
+    dtn::wait_for_sr 0 $sr_guid
+    dtn::check_sr_fields 0 $sr_guid sr_received_time
+
+    testlog "checking that each node received/transmitted bundle"
+    dtn::wait_for_bundle_stats 0 {4 received 2 transmitted}
+    dtn::wait_for_bundle_stats 1 {3 received 4 transmitted}
+    dtn::wait_for_bundle_stats 2 {2 received 1 transmitted}
+
+    testlog "*"
+    testlog "Test 3: Delete Bundle"
+
+    ## Node 1 sends a bundle that includes an extension block to node 3
+    ## via the API. The intermediary node 2 classifies the block as unknown,
+    ## and because the block contains the DELETE_BUNDLE_ONERROR block flag,
+    ## deletes the bundle. Node 2 also sends a status report that notifies
+    ## the bundle's reply-to endpoint (i.e. node 1) of the bundle deletion.
+    ## because the bundle includes a request for such notifications.
+
+    testlog "sending bundle"
+    set id [dtn::tell_dtntest 0 dtn_send $handle source=$src dest=$dst        \
+                                                 replyto=$sr_dst              \
+                                                 payload_data=this_is_a_test! \
+                                                 deletion_rcpt=true           \
+                                                 block_type=16 block_flags=4  \
+                                                 block_content=$block_content]
+
+    testlog "waiting for status reports"
+    set sr_guid "$id,$mid_eid"
+    dtn::wait_for_sr 0 $sr_guid
+    dtn::check_sr_fields 0 $sr_guid sr_deleted_time
+
+    testlog "checking that each node received/transmitted bundle"
+    dtn::wait_for_bundle_stats 0 {6 received 3 transmitted}
+    dtn::wait_for_bundle_stats 1 {4 received 5 transmitted}
+    dtn::wait_for_bundle_stats 2 {2 received 1 transmitted}
+
+    testlog "*"
+    testlog "Test 4: Discard Block"
+
+    ## Node 1 sends a bundle that includes an extension block to node 3
+    ## via the API. The intermediary node 2 classifies the block as unknown,
+    ## and because the block contains the DISCARD_BLOCK_ONERROR block flag,
+    ## forwards the bundle to node 3 after removing the block from the bundle.
+
+    testlog "sending bundle"
+    set id [dtn::tell_dtntest 0 dtn_send $handle source=$src dest=$dst        \
+                                                 replyto=$sr_dst              \
+                                                 payload_data=this_is_a_test! \
+                                                 block_type=16 block_flags=16 \
+                                                 block_content=$block_content]
+
+    testlog "waiting to receive bundle at destination"
+    dtn::wait_for_bundle 2 $id
+    dtn::check_bundle_data 2 $id recv_blocks 2
+
+    testlog "checking that each node received/transmitted bundle"
+    dtn::wait_for_bundle_stats 0 {7 received 4 transmitted}
+    dtn::wait_for_bundle_stats 1 {5 received 6 transmitted}
+    dtn::wait_for_bundle_stats 2 {3 received 1 transmitted}
+
+
+    testlog "*"
+    testlog "test success!"
+    testlog "*"
+
+    testlog "dtn_close"
+    dtn::tell_dtntest 0 dtn_close $handle
+}
+
+test::exit_script {
+    testlog "stopping all dtnds and dtntest"
+    dtn::stop_dtntest 0
+    dtn::stop_dtnd *
+}