os/persistentdata/persistentstorage/sqlite3api/TEST/TCL/tcldistribution/tests/event.test
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 # This file contains a collection of tests for the procedures in the file
     2 # tclEvent.c, which includes the "update", and "vwait" Tcl
     3 # commands.  Sourcing this file into Tcl runs the tests and generates
     4 # output for errors.  No output means no errors were found.
     5 #
     6 # Copyright (c) 1995-1997 Sun Microsystems, Inc.
     7 # Copyright (c) 1998-1999 by Scriptics Corporation.
     8 #
     9 # See the file "license.terms" for information on usage and redistribution
    10 # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
    11 #
    12 # RCS: @(#) $Id: event.test,v 1.20.2.1 2006/11/28 16:29:47 kennykb Exp $
    13 
    14 package require tcltest 2
    15 namespace import -force ::tcltest::*
    16 
    17 testConstraint testfilehandler [llength [info commands testfilehandler]]
    18 testConstraint testexithandler [llength [info commands testexithandler]]
    19 testConstraint testfilewait [llength [info commands testfilewait]]
    20 
    21 test event-1.1 {Tcl_CreateFileHandler, reading} {testfilehandler} {
    22     testfilehandler close
    23     testfilehandler create 0 readable off
    24     testfilehandler clear 0
    25     testfilehandler oneevent
    26     set result ""
    27     lappend result [testfilehandler counts 0]
    28     testfilehandler fillpartial 0
    29     testfilehandler oneevent
    30     lappend result [testfilehandler counts 0]
    31     testfilehandler oneevent
    32     lappend result [testfilehandler counts 0]
    33     testfilehandler close
    34     set result
    35 } {{0 0} {1 0} {2 0}}
    36 test event-1.2 {Tcl_CreateFileHandler, writing} {testfilehandler nonPortable} {
    37     # This test is non-portable because on some systems (e.g.
    38     # SunOS 4.1.3) pipes seem to be writable always.
    39     testfilehandler close
    40     testfilehandler create 0 off writable
    41     testfilehandler clear 0
    42     testfilehandler oneevent
    43     set result ""
    44     lappend result [testfilehandler counts 0]
    45     testfilehandler fillpartial 0
    46     testfilehandler oneevent
    47     lappend result [testfilehandler counts 0]
    48     testfilehandler fill 0
    49     testfilehandler oneevent
    50     lappend result [testfilehandler counts 0]
    51     testfilehandler close
    52     set result
    53 } {{0 1} {0 2} {0 2}}
    54 test event-1.3 {Tcl_DeleteFileHandler} {testfilehandler nonPortable} {
    55     testfilehandler close
    56     testfilehandler create 2 disabled disabled
    57     testfilehandler create 1 readable writable
    58     testfilehandler create 0 disabled disabled
    59     testfilehandler fillpartial 1
    60     set result ""
    61     testfilehandler oneevent
    62     lappend result [testfilehandler counts 1]
    63     testfilehandler oneevent
    64     lappend result [testfilehandler counts 1]
    65     testfilehandler oneevent
    66     lappend result [testfilehandler counts 1]
    67     testfilehandler create 1 off off
    68     testfilehandler oneevent
    69     lappend result [testfilehandler counts 1]
    70     testfilehandler close
    71     set result
    72 } {{0 1} {1 1} {1 2} {0 0}}
    73 
    74 test event-2.1 {Tcl_DeleteFileHandler} {testfilehandler nonPortable} {
    75     testfilehandler close
    76     testfilehandler create 2 disabled disabled
    77     testfilehandler create 1 readable writable
    78     testfilehandler fillpartial 1
    79     set result ""
    80     testfilehandler oneevent
    81     lappend result [testfilehandler counts 1]
    82     testfilehandler oneevent
    83     lappend result [testfilehandler counts 1]
    84     testfilehandler oneevent
    85     lappend result [testfilehandler counts 1]
    86     testfilehandler create 1 off off
    87     testfilehandler oneevent
    88     lappend result [testfilehandler counts 1]
    89     testfilehandler close
    90     set result
    91 } {{0 1} {1 1} {1 2} {0 0}}
    92 test event-2.2 {Tcl_DeleteFileHandler, fd reused & events still pending} \
    93 	{testfilehandler nonPortable} {
    94     testfilehandler close
    95     testfilehandler create 0 readable writable
    96     testfilehandler fillpartial 0
    97     set result ""
    98     testfilehandler oneevent
    99     lappend result [testfilehandler counts 0]
   100     testfilehandler close
   101     testfilehandler create 0 readable writable
   102     testfilehandler oneevent
   103     lappend result [testfilehandler counts 0]
   104     testfilehandler close
   105     set result
   106 } {{0 1} {0 0}}
   107 
   108 test event-3.1 {FileHandlerCheckProc, TCL_FILE_EVENTS off } {testfilehandler} {
   109     testfilehandler close
   110     testfilehandler create 1 readable writable
   111     testfilehandler fillpartial 1
   112     testfilehandler windowevent
   113     set result [testfilehandler counts 1]
   114     testfilehandler close
   115     set result
   116 } {0 0}
   117 
   118 test event-4.1 {FileHandlerEventProc, race between event and disabling} \
   119 	{testfilehandler nonPortable} {
   120     update
   121     testfilehandler close
   122     testfilehandler create 2 disabled disabled
   123     testfilehandler create 1 readable writable
   124     testfilehandler fillpartial 1
   125     set result ""
   126     testfilehandler oneevent
   127     lappend result [testfilehandler counts 1]
   128     testfilehandler oneevent
   129     lappend result [testfilehandler counts 1]
   130     testfilehandler oneevent
   131     lappend result [testfilehandler counts 1]
   132     testfilehandler create 1 disabled disabled
   133     testfilehandler oneevent
   134     lappend result [testfilehandler counts 1]
   135     testfilehandler close
   136     set result
   137 } {{0 1} {1 1} {1 2} {0 0}}
   138 test event-4.2 {FileHandlerEventProc, TCL_FILE_EVENTS off} \
   139 	{testfilehandler nonPortable} {
   140     update
   141     testfilehandler close
   142     testfilehandler create 1 readable writable
   143     testfilehandler create 2 readable writable
   144     testfilehandler fillpartial 1
   145     testfilehandler fillpartial 2
   146     testfilehandler oneevent
   147     set result ""
   148     lappend result [testfilehandler counts 1] [testfilehandler counts 2]
   149     testfilehandler windowevent
   150     lappend result [testfilehandler counts 1] [testfilehandler counts 2]
   151     testfilehandler close
   152     set result
   153 } {{0 0} {0 1} {0 0} {0 1}}
   154 update
   155 
   156 test event-5.1 {Tcl_BackgroundError, HandleBgErrors procedures} {
   157     catch {rename bgerror {}}
   158     proc bgerror msg {
   159 	global errorInfo errorCode x
   160 	lappend x [list $msg $errorInfo $errorCode]
   161     }
   162     after idle {error "a simple error"}
   163     after idle {open non_existent}
   164     after idle {set errorInfo foobar; set errorCode xyzzy}
   165     set x {}
   166     update idletasks
   167     rename bgerror {}
   168     regsub -all [file join {} non_existent] $x "non_existent" x
   169     set x
   170 } {{{a simple error} {a simple error
   171     while executing
   172 "error "a simple error""
   173     ("after" script)} NONE} {{couldn't open "non_existent": no such file or directory} {couldn't open "non_existent": no such file or directory
   174     while executing
   175 "open non_existent"
   176     ("after" script)} {POSIX ENOENT {no such file or directory}}}}
   177 test event-5.2 {Tcl_BackgroundError, HandleBgErrors procedures} {
   178     catch {rename bgerror {}}
   179     proc bgerror msg {
   180 	global x
   181 	lappend x $msg
   182 	return -code break
   183     }
   184     after idle {error "a simple error"}
   185     after idle {open non_existent}
   186     set x {}
   187     update idletasks
   188     rename bgerror {}
   189     set x
   190 } {{a simple error}}
   191 
   192 test event-6.1 {BgErrorDeleteProc procedure} {
   193     catch {interp delete foo}
   194     interp create foo
   195     set erroutfile [makeFile Unmodified err.out]
   196     foo eval [list set erroutfile $erroutfile]
   197     foo eval {
   198 	proc bgerror args {
   199 	    global errorInfo erroutfile
   200 	    set f [open $erroutfile r+]
   201 	    seek $f 0 end
   202 	    puts $f "$args $errorInfo"
   203 	    close $f
   204 	}
   205 	after 100 {error "first error"}
   206 	after 100 {error "second error"}
   207     }
   208     after 100 {interp delete foo}
   209     after 200
   210     update
   211     set f [open $erroutfile r]
   212     set result [read $f]
   213     close $f
   214     removeFile $erroutfile
   215     set result
   216 } {Unmodified
   217 }
   218 
   219 test event-7.1 {bgerror / regular} {
   220     set errRes {}
   221     proc bgerror {err} {
   222 	global errRes;
   223 	set errRes $err;
   224     }
   225     after 0 {error err1}
   226     vwait errRes;
   227     set errRes;
   228 } err1
   229 
   230 test event-7.2 {bgerror / accumulation} {
   231     set errRes {}
   232     proc bgerror {err} {
   233 	global errRes;
   234 	lappend errRes $err;
   235     }
   236     after 0 {error err1}
   237     after 0 {error err2}
   238     after 0 {error err3}
   239     update
   240     set errRes;
   241 } {err1 err2 err3}
   242 
   243 test event-7.3 {bgerror / accumulation / break} {
   244     set errRes {}
   245     proc bgerror {err} {
   246 	global errRes;
   247 	lappend errRes $err;
   248 	return -code break "skip!";
   249     }
   250     after 0 {error err1}
   251     after 0 {error err2}
   252     after 0 {error err3}
   253     update
   254     set errRes;
   255 } err1
   256 
   257 test event-7.4 {tkerror is nothing special anymore to tcl} {
   258     set errRes {}
   259     # we don't just rename bgerror to empty because it could then
   260     # be autoloaded...
   261     proc bgerror {err} {
   262 	global errRes;
   263 	lappend errRes "bg:$err";
   264     }
   265     proc tkerror {err} {
   266 	global errRes;
   267 	lappend errRes "tk:$err";
   268     }
   269     after 0 {error err1}
   270     update
   271     rename tkerror {}
   272     set errRes
   273 } bg:err1
   274 
   275 testConstraint exec [llength [info commands exec]]
   276 
   277 test event-7.5 {correct behaviour when there is no bgerror [Bug 219142]} {exec} {
   278     set script {
   279 	after 1000 error hello
   280 	after 2000 set a 0
   281 	vwait a
   282     }
   283 
   284     list [catch {exec [interpreter] << $script} errMsg] $errMsg
   285 } {1 {hello
   286     while executing
   287 "error hello"
   288     ("after" script)}}
   289 
   290 
   291 # someday : add a test checking that 
   292 # when there is no bgerror, an error msg goes to stderr
   293 # ideally one would use sub interp and transfer a fake stderr
   294 # to it, unfortunatly the current interp tcl API does not allow
   295 # that. the other option would be to use fork a test but it
   296 # then becomes more a file/exec test than a bgerror test.
   297 
   298 # end of bgerror tests
   299 catch {rename bgerror {}}
   300 
   301 
   302 test event-8.1 {Tcl_CreateExitHandler procedure} {stdio testexithandler} {
   303     set child [open |[list [interpreter]] r+]
   304     puts $child "testexithandler create 41; testexithandler create 4"
   305     puts $child "testexithandler create 6; exit"
   306     flush $child
   307     set result [read $child]
   308     close $child
   309     set result
   310 } {even 6
   311 even 4
   312 odd 41
   313 }
   314 
   315 test event-9.1 {Tcl_DeleteExitHandler procedure} {stdio testexithandler} {
   316     set child [open |[list [interpreter]] r+]
   317     puts $child "testexithandler create 41; testexithandler create 4"
   318     puts $child "testexithandler create 6; testexithandler delete 41"
   319     puts $child "testexithandler create 16; exit"
   320     flush $child
   321     set result [read $child]
   322     close $child
   323     set result
   324 } {even 16
   325 even 6
   326 even 4
   327 }
   328 test event-9.2 {Tcl_DeleteExitHandler procedure} {stdio testexithandler} {
   329     set child [open |[list [interpreter]] r+]
   330     puts $child "testexithandler create 41; testexithandler create 4"
   331     puts $child "testexithandler create 6; testexithandler delete 4"
   332     puts $child "testexithandler create 16; exit"
   333     flush $child
   334     set result [read $child]
   335     close $child
   336     set result
   337     } {even 16
   338 even 6
   339 odd 41
   340 }
   341 test event-9.3 {Tcl_DeleteExitHandler procedure} {stdio testexithandler} {
   342     set child [open |[list [interpreter]] r+]
   343     puts $child "testexithandler create 41; testexithandler create 4"
   344     puts $child "testexithandler create 6; testexithandler delete 6"
   345     puts $child "testexithandler create 16; exit"
   346     flush $child
   347     set result [read $child]
   348     close $child
   349     set result
   350 } {even 16
   351 even 4
   352 odd 41
   353 }
   354 test event-9.4 {Tcl_DeleteExitHandler procedure} {stdio testexithandler} {
   355     set child [open |[list [interpreter]] r+]
   356     puts $child "testexithandler create 41; testexithandler delete 41"
   357     puts $child "testexithandler create 16; exit"
   358     flush $child
   359     set result [read $child]
   360     close $child
   361     set result
   362 } {even 16
   363 }
   364 
   365 test event-10.1 {Tcl_Exit procedure} {stdio} {
   366     set child [open |[list [interpreter]] r+]
   367     puts $child "exit 3"
   368     list [catch {close $child} msg] $msg [lindex $errorCode 0] \
   369         [lindex $errorCode 2]
   370 } {1 {child process exited abnormally} CHILDSTATUS 3}
   371 
   372 test event-11.1 {Tcl_VwaitCmd procedure} {
   373     list [catch {vwait} msg] $msg
   374 } {1 {wrong # args: should be "vwait name"}}
   375 test event-11.2 {Tcl_VwaitCmd procedure} {
   376     list [catch {vwait a b} msg] $msg
   377 } {1 {wrong # args: should be "vwait name"}}
   378 test event-11.3 {Tcl_VwaitCmd procedure} {
   379     catch {unset x}
   380     set x 1
   381     list [catch {vwait x(1)} msg] $msg
   382 } {1 {can't trace "x(1)": variable isn't array}}
   383 test event-11.4 {Tcl_VwaitCmd procedure} {} {
   384     foreach i [after info] {
   385 	after cancel $i
   386     }
   387     after 10; update; # On Mac make sure update won't take long
   388     after 100 {set x x-done}
   389     after 200 {set y y-done}
   390     after 300 {set z z-done}
   391     after idle {set q q-done}
   392     set x before
   393     set y before
   394     set z before
   395     set q before
   396     list [vwait y] $x $y $z $q
   397 } {{} x-done y-done before q-done}
   398 
   399 foreach i [after info] {
   400     after cancel $i
   401 }
   402 
   403 test event-11.5 {Tcl_VwaitCmd procedure: round robin scheduling, 2 sources} {socket} {
   404     set test1file [makeFile "" test1]
   405     set f1 [open $test1file w]
   406     proc accept {s args} {
   407 	puts $s foobar
   408 	close $s
   409     }
   410     catch {set s1 [socket -server accept 0]}
   411     after 1000
   412     catch {set s2 [socket 127.0.0.1 [lindex [fconfigure $s1 -sockname] 2]]}
   413     close $s1
   414     set x 0
   415     set y 0
   416     set z 0
   417     fileevent $s2 readable {incr z}
   418     vwait z
   419     fileevent $f1 writable {incr x; if {$y == 3} {set z done}}
   420     fileevent $s2 readable {incr y; if {$x == 3} {set z done}}
   421     vwait z
   422     close $f1
   423     close $s2
   424     removeFile $test1file
   425     list $x $y $z
   426 } {3 3 done}
   427 test event-11.6 {Tcl_VwaitCmd procedure: round robin scheduling, same source} {
   428     set test1file [makeFile "" test1]
   429     set test2file [makeFile "" test2]
   430     set f1 [open $test1file w]
   431     set f2 [open $test2file w]
   432     set x 0
   433     set y 0
   434     set z 0
   435     update
   436     fileevent $f1 writable {incr x; if {$y == 3} {set z done}}
   437     fileevent $f2 writable {incr y; if {$x == 3} {set z done}}
   438     vwait z
   439     close $f1
   440     close $f2
   441     removeFile $test1file
   442     removeFile $test2file
   443     list $x $y $z
   444 } {3 3 done}
   445 
   446 
   447 test event-12.1 {Tcl_UpdateCmd procedure} {
   448     list [catch {update a b} msg] $msg
   449 } {1 {wrong # args: should be "update ?idletasks?"}}
   450 test event-12.2 {Tcl_UpdateCmd procedure} {
   451     list [catch {update bogus} msg] $msg
   452 } {1 {bad option "bogus": must be idletasks}}
   453 test event-12.3 {Tcl_UpdateCmd procedure} {
   454     foreach i [after info] {
   455 	after cancel $i
   456     }
   457     after 500 {set x after}
   458     after idle {set y after}
   459     after idle {set z "after, y = $y"}
   460     set x before
   461     set y before
   462     set z before
   463     update idletasks
   464     list $x $y $z
   465 } {before after {after, y = after}}
   466 test event-12.4 {Tcl_UpdateCmd procedure} {
   467     foreach i [after info] {
   468 	after cancel $i
   469     }
   470     after 10; update; # On Mac make sure update won't take long
   471     after 200 {set x x-done}
   472     after 600 {set y y-done}
   473     after idle {set z z-done}
   474     set x before
   475     set y before
   476     set z before
   477     after 300
   478     update
   479     list $x $y $z
   480 } {x-done before z-done}
   481 
   482 test event-13.1 {Tcl_WaitForFile procedure, readable} {testfilehandler} {
   483     foreach i [after info] {
   484 	after cancel $i
   485     }
   486     after 100 set x timeout
   487     testfilehandler close
   488     testfilehandler create 1 off off
   489     set x "no timeout"
   490     set result [testfilehandler wait 1 readable 0]
   491     update
   492     testfilehandler close
   493     list $result $x
   494 } {{} {no timeout}}
   495 test event-13.2 {Tcl_WaitForFile procedure, readable} testfilehandler {
   496     foreach i [after info] {
   497 	after cancel $i
   498     }
   499     after 100 set x timeout
   500     testfilehandler close
   501     testfilehandler create 1 off off
   502     set x "no timeout"
   503     set result [testfilehandler wait 1 readable 100]
   504     update
   505     testfilehandler close
   506     list $result $x
   507 } {{} timeout}
   508 test event-13.3 {Tcl_WaitForFile procedure, readable} testfilehandler {
   509     foreach i [after info] {
   510 	after cancel $i
   511     }
   512     after 100 set x timeout
   513     testfilehandler close
   514     testfilehandler create 1 off off
   515     testfilehandler fillpartial 1
   516     set x "no timeout"
   517     set result [testfilehandler wait 1 readable 100]
   518     update
   519     testfilehandler close
   520     list $result $x
   521 } {readable {no timeout}}
   522 test event-13.4 {Tcl_WaitForFile procedure, writable} \
   523 	{testfilehandler nonPortable} {
   524     foreach i [after info] {
   525 	after cancel $i
   526     }
   527     after 100 set x timeout
   528     testfilehandler close
   529     testfilehandler create 1 off off
   530     testfilehandler fill 1
   531     set x "no timeout"
   532     set result [testfilehandler wait 1 writable 0]
   533     update
   534     testfilehandler close
   535     list $result $x
   536 } {{} {no timeout}}
   537 test event-13.5 {Tcl_WaitForFile procedure, writable} \
   538 	{testfilehandler nonPortable} {
   539     foreach i [after info] {
   540 	after cancel $i
   541     }
   542     after 100 set x timeout
   543     testfilehandler close
   544     testfilehandler create 1 off off
   545     testfilehandler fill 1
   546     set x "no timeout"
   547     set result [testfilehandler wait 1 writable 100]
   548     update
   549     testfilehandler close
   550     list $result $x
   551 } {{} timeout}
   552 test event-13.6 {Tcl_WaitForFile procedure, writable} testfilehandler {
   553     foreach i [after info] {
   554 	after cancel $i
   555     }
   556     after 100 set x timeout
   557     testfilehandler close
   558     testfilehandler create 1 off off
   559     set x "no timeout"
   560     set result [testfilehandler wait 1 writable 100]
   561     update
   562     testfilehandler close
   563     list $result $x
   564 } {writable {no timeout}}
   565 test event-13.7 {Tcl_WaitForFile procedure, don't call other event handlers} testfilehandler {
   566     foreach i [after info] {
   567 	after cancel $i
   568     }
   569     after 100 lappend x timeout
   570     after idle lappend x idle
   571     testfilehandler close
   572     testfilehandler create 1 off off
   573     set x ""
   574     set result [list [testfilehandler wait 1 readable 200] $x]
   575     update
   576     testfilehandler close
   577     lappend result $x
   578 } {{} {} {timeout idle}}
   579 
   580 test event-13.8 {Tcl_WaitForFile procedure, waiting indefinitely} testfilewait {
   581     set f [open "|sleep 2" r]
   582     set result ""
   583     lappend result [testfilewait $f readable 100]
   584     lappend result [testfilewait $f readable -1]
   585     close $f
   586     set result
   587 } {{} readable}
   588 
   589 
   590 test event-14.1 {Tcl_WaitForFile procedure, readable, big fd} \
   591     -constraints {testfilehandler unix} \
   592     -setup {
   593 	set chanList {}
   594 	for {set i 0} {$i < 32} {incr i} {
   595 	    lappend chanList [open /dev/null r]
   596 	}
   597     } \
   598     -body {
   599 	foreach i [after info] {
   600 	    after cancel $i
   601 	}
   602 	after 100 set x timeout
   603 	testfilehandler close
   604 	testfilehandler create 1 off off
   605 	set x "no timeout"
   606 	set result [testfilehandler wait 1 readable 0]
   607 	update
   608 	testfilehandler close
   609 	list $result $x
   610     } \
   611     -result {{} {no timeout}} \
   612     -cleanup {
   613 	foreach chan $chanList {close $chan}
   614     }
   615 
   616 test event-14.2 {Tcl_WaitForFile procedure, readable, big fd} \
   617     -constraints {testfilehandler unix} \
   618     -setup {
   619 	set chanList {}
   620 	for {set i 0} {$i < 32} {incr i} {
   621 	    lappend chanList [open /dev/null r]
   622 	}
   623     } \
   624     -body {
   625 	foreach i [after info] {
   626 	    after cancel $i
   627 	}
   628 	after 100 set x timeout
   629 	testfilehandler close
   630 	testfilehandler create 1 off off
   631 	set x "no timeout"
   632 	set result [testfilehandler wait 1 readable 100]
   633 	update
   634 	testfilehandler close
   635 	list $result $x
   636     } \
   637     -result {{} timeout} \
   638     -cleanup {
   639 	foreach chan $chanList {close $chan}
   640     }
   641 
   642 test event-14.3 {Tcl_WaitForFile procedure, readable, big fd} \
   643     -constraints {testfilehandler unix} \
   644     -setup {
   645 	set chanList {}
   646 	for {set i 0} {$i < 32} {incr i} {
   647 	    lappend chanList [open /dev/null r]
   648 	}
   649     } \
   650     -body {
   651 	foreach i [after info] {
   652 	    after cancel $i
   653 	}
   654 	after 100 set x timeout
   655 	testfilehandler close
   656 	testfilehandler create 1 off off
   657 	testfilehandler fillpartial 1
   658 	set x "no timeout"
   659 	set result [testfilehandler wait 1 readable 100]
   660 	update
   661 	testfilehandler close
   662 	list $result $x
   663     } \
   664     -result {readable {no timeout}} \
   665     -cleanup {
   666 	foreach chan $chanList {close $chan}
   667     }
   668 
   669 test event-14.4 {Tcl_WaitForFile procedure, writable, big fd} \
   670     -constraints {testfilehandler unix nonPortable} \
   671     -setup {
   672 	set chanList {}
   673 	for {set i 0} {$i < 32} {incr i} {
   674 	    lappend chanList [open /dev/null r]
   675 	}
   676     } \
   677     -body {
   678 	foreach i [after info] {
   679 	    after cancel $i
   680 	}
   681 	after 100 set x timeout
   682 	testfilehandler close
   683 	testfilehandler create 1 off off
   684 	testfilehandler fill 1
   685 	set x "no timeout"
   686 	set result [testfilehandler wait 1 writable 0]
   687 	update
   688 	testfilehandler close
   689 	list $result $
   690     } \
   691     -result {{} {no timeout}} \
   692     -cleanup {
   693 	foreach chan $chanList {close $chan}
   694     }
   695 
   696 test event-14.5 {Tcl_WaitForFile procedure, writable, big fd} \
   697     -constraints {testfilehandler unix nonPortable} \
   698     -setup {
   699 	set chanList {}
   700 	for {set i 0} {$i < 32} {incr i} {
   701 	    lappend chanList [open /dev/null r]
   702 	}
   703     } \
   704     -body {
   705 	foreach i [after info] {
   706 	    after cancel $i
   707 	}
   708 	after 100 set x timeout
   709 	testfilehandler close
   710 	testfilehandler create 1 off off
   711 	testfilehandler fill 1
   712 	set x "no timeout"
   713 	set result [testfilehandler wait 1 writable 100]
   714 	update
   715 	testfilehandler close
   716 	list $result $x
   717     } \
   718     -result {{} timeout} \
   719     -cleanup {
   720 	foreach chan $chanList {close $chan}
   721     }
   722 
   723 test event-14.6 {Tcl_WaitForFile procedure, writable, big fd} \
   724     -constraints {testfilehandler unix} \
   725     -setup {
   726 	set chanList {}
   727 	for {set i 0} {$i < 32} {incr i} {
   728 	    lappend chanList [open /dev/null r]
   729 	}
   730     } \
   731     -body {
   732 	foreach i [after info] {
   733 	    after cancel $i
   734 	}
   735 	after 100 set x timeout
   736 	testfilehandler close
   737 	testfilehandler create 1 off off
   738 	set x "no timeout"
   739 	set result [testfilehandler wait 1 writable 100]
   740 	update
   741 	testfilehandler close
   742 	list $result $x
   743     } \
   744     -result {writable {no timeout}} \
   745     -cleanup {
   746 	foreach chan $chanList {close $chan}
   747     }
   748 
   749 test event-14.7 {Tcl_WaitForFile, don't call other event handlers, big fd} \
   750     -constraints {testfilehandler unix} \
   751     -setup {
   752 	set chanList {}
   753 	for {set i 0} {$i < 32} {incr i} {
   754 	    lappend chanList [open /dev/null r]
   755 	}
   756     } \
   757     -body {
   758 	foreach i [after info] {
   759 	    after cancel $i
   760 	}
   761 	after 100 lappend x timeout
   762 	after idle lappend x idle
   763 	testfilehandler close
   764 	testfilehandler create 1 off off
   765 	set x ""
   766 	set result [list [testfilehandler wait 1 readable 200] $x]
   767 	update
   768 	testfilehandler close
   769 	lappend result $x
   770     } \
   771     -result {{} {} {timeout idle}} \
   772     -cleanup {
   773 	foreach chan $chanList {close $chan}
   774     }
   775 
   776 
   777 test event-14.8 {Tcl_WaitForFile procedure, waiting indefinitely, big fd} \
   778     -constraints {testfilewait unix} \
   779     -body {
   780 	set f [open "|sleep 2" r]
   781 	set result ""
   782 	lappend result [testfilewait $f readable 100]
   783 	lappend result [testfilewait $f readable -1]
   784 	close $f
   785 	set result
   786     } \
   787     -setup {
   788 	set chanList {}
   789 	for {set i 0} {$i < 32} {incr i} {
   790 	    lappend chanList [open /dev/null r]
   791 	}
   792     } \
   793     -result {{} readable} \
   794     -cleanup {
   795 	foreach chan $chanList {close $chan}
   796     }
   797 
   798 # cleanup
   799 foreach i [after info] {
   800     after cancel $i
   801 }
   802 ::tcltest::cleanupTests
   803 return