diff -r 000000000000 -r 2b3e5ec03512 test/bidirectional.tcl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/bidirectional.tcl Thu Apr 21 14:57:45 2011 +0100 @@ -0,0 +1,235 @@ +# +# Copyright 2005-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 bidirectional +net::num_nodes 3 + +set cl tcp +set count 200 +set storage_type filesysdb + +foreach {var val} $opt(opts) { + if {$var == "-cl" || $var == "cl"} { + set cl $val + } elseif {$var == "-count" || $var == "count"} { + set count $val + } elseif {$var == "-storage_type" } { + set storage_type $val + } else { + testlog error "ERROR: unrecognized test option '$var'" + exit 1 + } +} + +dtn::config --no_null_link --storage_type $storage_type + +dtn::config_interface $cl +dtn::config_app_manifest 1 +dtn::config_linear_topology ALWAYSON $cl true + +conf::add dtnd * "param set early_deletion false" + +# XXX/demmer do this test with bigger bundles... + +test::script { + set N [net::num_nodes] + set last [expr $N - 1] + + set eid1 dtn://host-0/test + set eid2 dtn://host-$last/test + + set sleep 100 + + # ---------------------------------------------------------------------- + testlog " " + testlog " Test phase 1: continuous connectivity" + testlog " " + + testlog " Running dtnds" + dtn::run_dtnd * + + testlog " Waiting for dtnds to start up" + dtn::wait_for_dtnd * + + testlog " Running senders / receivers for $count bundles, sleep $sleep" + set rcvpid1 [dtn::run_app 0 dtnrecv "-q -n $count $eid1"] + set rcvpid2 [dtn::run_app $last dtnrecv "-q -n $count $eid2"] + set sndpid1 [dtn::run_app 0 dtnsend "-s $eid1 -d $eid2 -t d -z $sleep -n $count"] + set sndpid2 [dtn::run_app $last dtnsend "-s $eid2 -d $eid1 -t d -z $sleep -n $count"] + + testlog " Waiting for senders / receivers to complete (up to 5 mins)" + run::wait_for_pid_exit 0 $sndpid1 [expr 5 * 60] + run::wait_for_pid_exit $last $sndpid2 [expr 5 * 60] + run::wait_for_pid_exit 0 $rcvpid1 [expr 5 * 60] + run::wait_for_pid_exit $last $rcvpid2 [expr 5 * 60] + + testlog " Waiting for all events to be processed" + dtn::wait_for_daemon_stats 0 {0 pending_events} + dtn::wait_for_daemon_stats 1 {0 pending_events} + dtn::wait_for_daemon_stats 2 {0 pending_events} + + foreach node [list 0 $last] { + testlog " Checking bundle stats on node $node" + dtn::check_bundle_stats $node \ + $count "delivered" \ + [expr $count * 2] "received" + } + + for {set i 0} {$i < $N} {incr i} { + testlog "Node $i: [dtn::tell_dtnd $i bundle stats]" + } + + testlog " Checking link stats" + dtn::check_link_stats 0 $cl-link:0-1 1 contacts $count bundles_transmitted + dtn::check_link_stats 1 $cl-link:1-0 1 contacts + + testlog " Stopping dtnds" + dtn::stop_dtnd * + + # ---------------------------------------------------------------------- + testlog " " + testlog " Test phase 2: interrupted links" + testlog " " + + testlog " Running dtnds" + dtn::run_dtnd * + + testlog " Waiting for dtnds to start up" + dtn::wait_for_dtnd * + + testlog " Running senders / receivers for $count bundles, sleep $sleep" + set rcvpid1 [dtn::run_app 0 dtnrecv "-q -n $count $eid1"] + set rcvpid2 [dtn::run_app $last dtnrecv "-q -n $count $eid2"] + set sndpid1 [dtn::run_app 0 dtnsend "-s $eid1 -d $eid2 -t d -z $sleep -n $count"] + set sndpid2 [dtn::run_app $last dtnsend "-s $eid2 -d $eid1 -t d -z $sleep -n $count"] + + for {set i 0} {$i < 100} {incr i} { + after [expr int(10000 * rand())] + + testlog " Closing links to/from node 1 ([test::elapsed] seconds elapsed)" + tell_dtnd 0 link close $cl-link:0-1 + tell_dtnd 1 link close $cl-link:1-2 + + dtn::dump_stats + + after [expr int(5000 * rand())] + testlog " Opening links to/from node 1 ([test::elapsed] seconds elapsed)" + tell_dtnd 0 link open $cl-link:0-1 + tell_dtnd 1 link open $cl-link:1-2 + + # if it finishes early, break out of the loop + if {[dtn::get_bundle_stats 0 delivered] == $count} { break } + } + + testlog " Done will link closing loop, stats:" + for {set i 0} {$i < $N} {incr i} { + testlog "Node $i: [dtn::tell_dtnd $i bundle stats]" + } + + testlog " Waiting for senders / receivers to complete (up to 5 mins)" + run::wait_for_pid_exit 0 $sndpid1 [expr 5 * 60] + run::wait_for_pid_exit $last $sndpid2 [expr 5 * 60] + run::wait_for_pid_exit 0 $rcvpid1 [expr 5 * 60] + run::wait_for_pid_exit $last $rcvpid2 [expr 5 * 60] + + foreach node [list 0 $last] { + testlog " Checking bundle stats on node $node" + dtn::check_bundle_stats $node \ + [expr $count * 2] "pending" \ + $count "transmitted" \ + $count "delivered" + } + + for {set i 0} {$i < $N} {incr i} { + testlog "Node $i: [dtn::tell_dtnd $i bundle stats]" + } + + testlog " Stopping dtnds" + dtn::stop_dtnd * + + # ---------------------------------------------------------------------- + + testlog " " + testlog " Test phase 3: killing node" + testlog " " + + testlog " Running dtnds" + for {set i 0} {$i < [net::num_nodes]} {incr i} { + set pids($i) [dtn::run_dtnd $i] + } + + testlog " Waiting for dtnds to start up" + dtn::wait_for_dtnd * + + testlog " Running senders / receivers for $count bundles, sleep $sleep" + set rcvpid1 [dtn::run_app 0 dtnrecv "-q $eid1"] + set rcvpid2 [dtn::run_app $last dtnrecv "-q $eid2"] + set sndpid1 [dtn::run_app 0 dtnsend "-s $eid1 -d $eid2 -t d -z $sleep -n $count"] + set sndpid2 [dtn::run_app $last dtnsend "-s $eid2 -d $eid1 -t d -z $sleep -n $count"] + + for {set i 0} {$i < 20} {incr i} { + + if {[dtn::test_bundle_stats 0 [list $count "delivered"]] && \ + [dtn::test_bundle_stats 1 [list $count "delivered"]]} { + break; # all done + } + + set sleep [expr int(5000 * rand())] + testlog " Sleeping for $sleep msecs" + after $sleep + + testlog " Killing node 1" + run::kill_pid 1 $pids(1) KILL + tell::wait_for_close $net::host(1) [dtn::get_port console 1] + + set sleep [expr int(5000 * rand())] + testlog " Sleeping for $sleep msecs" + after $sleep + + testlog " Starting node 1" + set pids(1) [dtn::run_dtnd 1 dtnd ""] + dtn::wait_for_dtnd 1 + } + + testlog " Done with killing loop.. stats:" + for {set i 0} {$i < $N} {incr i} { + testlog "Node $i: [tell_dtnd $i bundle stats]" + } + + testlog " Waiting for senders to complete" + run::wait_for_pid_exit 0 $sndpid1 + run::wait_for_pid_exit $last $sndpid2 + + testlog " Killing receivers" + run::kill_pid 0 $rcvpid1 TERM + run::kill_pid $last $rcvpid2 TERM + + # all we can really check for is that they all got transmitted, + # since some might end up getting lost when the node gets killed, + # but after the ack was sent + foreach node [list 0 $last] { + testlog " Checking bundle stats on node $node" + dtn::check_bundle_stats $node $count "transmitted" + } + + testlog " Test success!" +} + +test::exit_script { + testlog " Stopping all dtnds" + dtn::stop_dtnd * + +}