test-suite-simultaneous.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:3k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # This test suite is for validating scheduler simultaneous event ordering in ns
  2. #
  3. # To run all tests:  test-all-scheduler
  4. #
  5. # To run individual tests:
  6. # ns test-suite-scheduler.tcl List
  7. # ns test-suite-scheduler.tcl Calendar
  8. # ns test-suite scheduler.tcl Heap
  9. #
  10. # To view a list of available tests to run with this script:
  11. # ns test-suite-scheduler.tcl
  12. #
  13. remove-all-packet-headers       ; # removes all except common
  14. add-packet-header Flags IP TCP  ; # hdrs reqd for validation test
  15.  
  16. # FOR UPDATING GLOBAL DEFAULTS:
  17. # What does this simple test do?
  18. #   - it schedules $TIMES batches of events.  Each batch contains $SIMUL events, 
  19. #     all of which will occur at the same time.  All events are permuted and
  20. #     scheduled in a random order.  The output should be a list of integers 
  21. #     from 1 to ($TIMES*$SIMUL) in increasing order.
  22. #   - if the output differs it exits with status 1, otherwise it exits with status 0.
  23. proc comp {a b} {
  24. set a1 [lindex $a 0]
  25. set b1 [lindex $b 0]
  26. if {$a1 > $b1} {
  27. return 1
  28. }
  29. return 0
  30. }
  31. Class TestSuite
  32. TestSuite instproc init { quiet } {
  33. $self instvar ns_ rng_ N_ quiet_
  34. set ns_ [new Simulator]
  35. set rng_ [new RNG]
  36. set N_ 0
  37. set quiet_ $quiet
  38. }
  39. TestSuite instproc run { scheduler } {
  40. $self instvar ns_ rng_ N_
  41. if { [catch "$ns_ use-scheduler $scheduler"] } {
  42. puts "*** WARNING: scheduler Scheduler/$scheduler is not supported, test was not run"
  43. exit 0
  44. }
  45. set TIMES 20  ;# $TIMES different times for events
  46. set SIMUL 50  ;# each occurs $SIMUL times
  47. set TIMEMIN 0 ;# random events are taken from [TIMEMIN, TIMEMAX]
  48. set TIMEMAX 5
  49. # generate random event timings and put them in increasing order by time to occur
  50. for {set i 0 } { $i < $TIMES } { incr i } {
  51. lappend timings [list [$rng_ uniform $TIMEMIN $TIMEMAX] $i $SIMUL]
  52. }
  53. set stimings [lsort -command "comp" $timings]
  54. for {set i 0 } { $i < $TIMES } { incr i } {
  55. set e [lindex $stimings $i]
  56. set idx [lsearch $timings $e]
  57. set timings [lreplace $timings $idx $idx [lappend e $i]]
  58. }
  59. while 1 {
  60. # pull out timings in random order
  61. set i [expr int([$rng_ uniform 0 [llength $timings]])]
  62. set e [lindex $timings $i]
  63. set order [lindex $e 3]
  64. set left  [lindex $e 2]
  65. set label [expr $SIMUL - $left + 1 + $order*$SIMUL]
  66. $ns_ at [lindex $e 0] "$self assert $label"
  67. incr left -1
  68. if {$left==0} {
  69. set timings [lreplace $timings $i $i]
  70. if {$timings == ""} break
  71. } else {
  72. set e [lreplace $e 2 2 $left]
  73. set timings [lreplace $timings $i $i $e]
  74. }
  75. }
  76. $ns_ run
  77. exit 0
  78. }
  79. TestSuite instproc assert { n } {
  80. $self instvar N_ quiet_
  81. if { $quiet_ != "QUIET" } {
  82. puts $n
  83. }
  84. if [expr $n != $N_ + 1 ] {
  85. exit 1
  86. }
  87. set N_ $n
  88. }
  89. TestSuite proc usage {} {
  90. global argv0
  91. puts stderr "usage: ns $argv0 <scheduler> [quiet]"
  92. exit 1
  93. }
  94. global argc argv
  95. set quiet ""
  96. if { $argc == 2 } {
  97. set quiet [lindex $argv 1]
  98. if { $quiet != "QUIET" && $quiet != "quiet" } {
  99. TestSuite usage
  100. }
  101. set quiet "QUIET"
  102. }
  103. if { $argc > 0 && $argc < 3 } {
  104. set scheduler [lindex $argv 0]
  105. } else {
  106. TestSuite usage
  107. }
  108. set test [new TestSuite $quiet]
  109. $test run $scheduler