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

通讯编程

开发平台:

Visual C++

  1. # Commands covered:  (test)thread
  2. #
  3. # This file contains a collection of tests for one or more of the Tcl
  4. # built-in commands.  Sourcing this file into Tcl runs the tests and
  5. # generates output for errors.  No output means no errors were found.
  6. #
  7. # Copyright (c) 1996 Sun Microsystems, Inc.
  8. # Copyright (c) 1998-1999 by Scriptics Corporation.
  9. #
  10. # See the file "license.terms" for information on usage and redistribution
  11. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  12. #
  13. # RCS: @(#) $Id: thread.test,v 1.10 2000/05/02 22:02:36 kupries Exp $
  14. if {[lsearch [namespace children] ::tcltest] == -1} {
  15.     package require tcltest
  16.     namespace import -force ::tcltest::*
  17. }
  18. # Some tests require the testthread command
  19. set ::tcltest::testConstraints(testthread) 
  20. [expr {[info commands testthread] != {}}]
  21. if {$::tcltest::testConstraints(testthread)} {
  22.     testthread errorproc ThreadError
  23.     proc ThreadError {id info} {
  24. global threadError
  25. set threadError $info
  26.     }
  27.     proc ThreadNullError {id info} {
  28. # ignore
  29.     }
  30. }
  31. test thread-1.1 {Tcl_ThreadObjCmd: no args} {testthread} {
  32.     list [catch {testthread} msg] $msg
  33. } {1 {wrong # args: should be "testthread option ?args?"}}
  34. test thread-1.2 {Tcl_ThreadObjCmd: bad option} {testthread} {
  35.     list [catch {testthread foo} msg] $msg
  36. } {1 {bad option "foo": must be create, exit, id, join, names, send, wait, or errorproc}}
  37. test thread-1.3 {Tcl_ThreadObjCmd: initial thread list} {testthread} {
  38.     list [threadReap] [llength [testthread names]]
  39. } {1 1}
  40. test thread-1.4 {Tcl_ThreadObjCmd: thread create } {testthread} {
  41.     threadReap
  42.     set serverthread [testthread create]
  43.     update
  44.     set numthreads [llength [testthread names]]
  45.     threadReap
  46.     set numthreads
  47. } {2}
  48. test thread-1.5 {Tcl_ThreadObjCmd: thread create one shot} {testthread} {
  49.     threadReap
  50.     testthread create {set x 5}
  51.     foreach try {0 1 2 4 5 6} {
  52. # Try various ways to yield
  53. update
  54. after 10
  55. set l [llength [testthread names]]
  56. if {$l == 1} {
  57.     break
  58. }
  59.     }
  60.     threadReap
  61.     set l
  62. } {1}
  63. test thread-1.6 {Tcl_ThreadObjCmd: thread exit} {testthread} {
  64.     threadReap
  65.     testthread create {testthread exit}
  66.     update
  67.     after 10
  68.     set result [llength [testthread names]]
  69.     threadReap
  70.     set result
  71. } {1}
  72. test thread-1.7 {Tcl_ThreadObjCmd: thread id args} {testthread} {
  73.     set x [catch {testthread id x} msg]
  74.     list $x $msg
  75. } {1 {wrong # args: should be "testthread id"}}
  76. test thread-1.8 {Tcl_ThreadObjCmd: thread id} {testthread} {
  77.     string compare [testthread id] $::tcltest::mainThread
  78. } {0}
  79. test thread-1.9 {Tcl_ThreadObjCmd: thread names args} {testthread} {
  80.     set x [catch {testthread names x} msg]
  81.     list $x $msg
  82. } {1 {wrong # args: should be "testthread names"}}
  83. test thread-1.10 {Tcl_ThreadObjCmd: thread id} {testthread} {
  84.     string compare [testthread names] $::tcltest::mainThread
  85. } {0}
  86. test thread-1.11 {Tcl_ThreadObjCmd: send args} {testthread} {
  87.     set x [catch {testthread send} msg]
  88.     list $x $msg
  89. } {1 {wrong # args: should be "testthread send ?-async? id script"}}
  90. test thread-1.12 {Tcl_ThreadObjCmd: send nonint} {testthread} {
  91.     set x [catch {testthread send abc command} msg]
  92.     list $x $msg
  93. } {1 {expected integer but got "abc"}}
  94. test thread-1.13 {Tcl_ThreadObjCmd: send args} {testthread} {
  95.     threadReap
  96.     set serverthread [testthread create]
  97.     set five [testthread send $serverthread {set x 5}]
  98.     threadReap
  99.     set five
  100. } 5
  101. test thread-1.14 {Tcl_ThreadObjCmd: send bad id} {testthread} {
  102.     set tid [expr $::tcltest::mainThread + 10]
  103.     set x [catch {testthread send $tid {set x 5}} msg]
  104.     list $x $msg
  105. } {1 {invalid thread id}}
  106. test thread-1.15 {Tcl_ThreadObjCmd: wait} {testthread} {
  107.     threadReap
  108.     set serverthread [testthread create {set z 5 ; testthread wait}]
  109.     set five [testthread send $serverthread {set z}]
  110.     threadReap
  111.     set five
  112. } 5
  113. test thread-1.16 {Tcl_ThreadObjCmd: errorproc args} {testthread} {
  114.     set x [catch {testthread errorproc foo bar} msg]
  115.     list $x $msg
  116. } {1 {wrong # args: should be "testthread errorproc proc"}}
  117. test thread-1.17 {Tcl_ThreadObjCmd: errorproc change} {testthread} {
  118.     testthread errorproc foo
  119.     testthread errorproc ThreadError
  120. } {}
  121. # The tests above also cover:
  122. # TclCreateThread, except when pthread_create fails
  123. # NewThread, safe and regular
  124. # ThreadErrorProc, except for printing to standard error
  125. test thread-2.1 {ListUpdateInner and ListRemove} {testthread} {
  126.     threadReap
  127.     catch {unset tid}
  128.     foreach t {0 1 2} {
  129. upvar #0 t$t tid
  130. set tid [testthread create]
  131.     }
  132.     threadReap
  133. } 1
  134. test thread-3.1 {TclThreadList} {testthread} {
  135.     threadReap
  136.     catch {unset tid}
  137.     set len [llength [testthread names]]
  138.     set l1  {}
  139.     foreach t {0 1 2} {
  140. lappend l1 [testthread create]
  141.     }
  142.     set l2 [testthread names]
  143.     list $l1 $l2
  144.     set c [string compare 
  145.     [lsort -integer [concat $::tcltest::mainThread $l1]] 
  146.     [lsort -integer $l2]]
  147.     threadReap
  148.     list $len $c
  149. } {1 0}
  150. test thread-4.1 {TclThreadSend to self} {testthread} {
  151.     catch {unset x}
  152.     testthread send [testthread id] {
  153. set x 4
  154.     }
  155.     set x
  156. } {4}
  157. test thread-4.2 {TclThreadSend -async} {testthread} {
  158.     threadReap
  159.     set len [llength [testthread names]]
  160.     set serverthread [testthread create]
  161.     testthread send -async $serverthread {
  162. after 1000
  163. testthread exit
  164.     }
  165.     set two [llength [testthread names]]
  166.     after 1500 {set done 1}
  167.     vwait done
  168.     threadReap
  169.     list $len [llength [testthread names]] $two
  170. } {1 1 2}
  171. test thread-4.3 {TclThreadSend preserve errorInfo} {testthread} {
  172.     threadReap
  173.     set len [llength [testthread names]]
  174.     set serverthread [testthread create]
  175.     set x [catch {testthread send $serverthread {set undef}} msg]
  176.     threadReap
  177.     list $len $x $msg $errorInfo
  178. } {1 1 {can't read "undef": no such variable} {can't read "undef": no such variable
  179.     while executing
  180. "set undef"
  181.     invoked from within
  182. "testthread send $serverthread {set undef}"}}
  183. test thread-4.4 {TclThreadSend preserve code} {testthread} {
  184.     threadReap
  185.     set len [llength [testthread names]]
  186.     set serverthread [testthread create]
  187.     set x [catch {testthread send $serverthread {break}} msg]
  188.     threadReap
  189.     list $len $x $msg $errorInfo
  190. } {1 3 {} {}}
  191. test thread-4.5 {TclThreadSend preserve errorCode} {testthread} {
  192.     threadReap
  193.     set ::tcltest::mainThread [testthread names]
  194.     set serverthread [testthread create]
  195.     set x [catch {testthread send $serverthread {error ERR INFO CODE}} msg]
  196.     threadReap
  197.     list $x $msg $errorCode
  198. } {1 ERR CODE}
  199. test thread-5.0 {Joining threads} {testthread} {
  200.     threadReap
  201.     set serverthread [testthread create -joinable]
  202.     testthread send -async $serverthread {after 1000 ; testthread exit}
  203.     set res [testthread join $serverthread]
  204.     threadReap
  205.     set res
  206. } {0}
  207. test thread-5.1 {Joining threads after the fact} {testthread} {
  208.     threadReap
  209.     set serverthread [testthread create -joinable]
  210.     testthread send -async $serverthread {testthread exit}
  211.     after 2000
  212.     set res [testthread join $serverthread]
  213.     threadReap
  214.     set res
  215. } {0}
  216. test thread-5.2 {Try to join a detached thread} {testthread} {
  217.     threadReap
  218.     set serverthread [testthread create]
  219.     testthread send -async $serverthread {after 1000 ; testthread exit}
  220.     catch {set res [testthread join $serverthread]} msg
  221.     threadReap
  222.     lrange $msg 0 2
  223. } {cannot join thread}
  224. # cleanup
  225. ::tcltest::cleanupTests
  226. return