| 1 | # This file contains tests for tclUnixNotfy.c. | 
|---|
| 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) 1997 by 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: unixNotfy.test,v 1.19 2005/11/01 16:41:20 dgp Exp $ | 
|---|
| 14 |  | 
|---|
| 15 | # The tests should not be run if you have a notifier which is unable to | 
|---|
| 16 | # detect infinite vwaits, as the tests below will hang. The presence of | 
|---|
| 17 | # the "testthread" command indicates that this is the case. | 
|---|
| 18 |  | 
|---|
| 19 | if {[lsearch [namespace children] ::tcltest] == -1} { | 
|---|
| 20 |     package require tcltest 2 | 
|---|
| 21 |     namespace import -force ::tcltest::* | 
|---|
| 22 | } | 
|---|
| 23 |  | 
|---|
| 24 | # When run in a Tk shell, these tests hang. | 
|---|
| 25 | testConstraint noTk       [expr {![info exists tk_version]}] | 
|---|
| 26 | testConstraint testthread [expr {[info commands testthread] != {}}] | 
|---|
| 27 | # Darwin always uses a threaded notifier | 
|---|
| 28 | testConstraint unthreaded [expr { | 
|---|
| 29 |     (![info exist tcl_platform(threaded)] || !$tcl_platform(threaded)) | 
|---|
| 30 |     && $tcl_platform(os) ne "Darwin" | 
|---|
| 31 | }] | 
|---|
| 32 |  | 
|---|
| 33 | # The next two tests will hang if threads are enabled because the notifier | 
|---|
| 34 | # will not necessarily wait for ever in this case, so it does not generate | 
|---|
| 35 | # an error. | 
|---|
| 36 | test unixNotfy-1.1 {Tcl_DeleteFileHandler} -constraints {noTk unix unthreaded} -body { | 
|---|
| 37 |     catch {vwait x} | 
|---|
| 38 |     set f [open [makeFile "" foo] w] | 
|---|
| 39 |     fileevent $f writable {set x 1} | 
|---|
| 40 |     vwait x | 
|---|
| 41 |     close $f | 
|---|
| 42 |     list [catch {vwait x} msg] $msg | 
|---|
| 43 | } -result {1 {can't wait for variable "x": would wait forever}} -cleanup {  | 
|---|
| 44 |     catch { close $f } | 
|---|
| 45 |     catch { removeFile foo } | 
|---|
| 46 | } | 
|---|
| 47 | test unixNotfy-1.2 {Tcl_DeleteFileHandler} -constraints {noTk unix unthreaded} -body { | 
|---|
| 48 |     catch {vwait x} | 
|---|
| 49 |     set f1 [open [makeFile "" foo] w] | 
|---|
| 50 |     set f2 [open [makeFile "" foo2] w] | 
|---|
| 51 |     fileevent $f1 writable {set x 1} | 
|---|
| 52 |     fileevent $f2 writable {set y 1} | 
|---|
| 53 |     vwait x | 
|---|
| 54 |     close $f1 | 
|---|
| 55 |     vwait y | 
|---|
| 56 |     close $f2 | 
|---|
| 57 |     list [catch {vwait x} msg] $msg | 
|---|
| 58 | } -result {1 {can't wait for variable "x": would wait forever}} -cleanup { | 
|---|
| 59 |     catch { close $f1 } | 
|---|
| 60 |     catch { close $f2 } | 
|---|
| 61 |     catch { removeFile foo } | 
|---|
| 62 |     catch { removeFile foo2 } | 
|---|
| 63 | } | 
|---|
| 64 |  | 
|---|
| 65 | test unixNotfy-2.1 {Tcl_DeleteFileHandler} \ | 
|---|
| 66 |     -constraints {noTk unix testthread} \ | 
|---|
| 67 |     -body { | 
|---|
| 68 |         update | 
|---|
| 69 |         set f [open [makeFile "" foo] w] | 
|---|
| 70 |         fileevent $f writable {set x 1} | 
|---|
| 71 |         vwait x | 
|---|
| 72 |         close $f | 
|---|
| 73 |         testthread create "testthread send [testthread id] {set x ok}" | 
|---|
| 74 |         vwait x | 
|---|
| 75 |         threadReap | 
|---|
| 76 |         set x | 
|---|
| 77 |     } \ | 
|---|
| 78 |     -result {ok} \ | 
|---|
| 79 |     -cleanup { | 
|---|
| 80 |         catch { close $f } | 
|---|
| 81 |         catch { removeFile foo } | 
|---|
| 82 |     } | 
|---|
| 83 | test unixNotfy-2.2 {Tcl_DeleteFileHandler} \ | 
|---|
| 84 |     -constraints {noTk unix testthread} \ | 
|---|
| 85 |     -body { | 
|---|
| 86 |         update | 
|---|
| 87 |         set f1 [open [makeFile "" foo] w] | 
|---|
| 88 |         set f2 [open [makeFile "" foo2] w] | 
|---|
| 89 |         fileevent $f1 writable {set x 1} | 
|---|
| 90 |         fileevent $f2 writable {set y 1} | 
|---|
| 91 |         vwait x | 
|---|
| 92 |         close $f1 | 
|---|
| 93 |         vwait y | 
|---|
| 94 |         close $f2 | 
|---|
| 95 |         testthread create "testthread send [testthread id] {set x ok}" | 
|---|
| 96 |         vwait x | 
|---|
| 97 |         threadReap | 
|---|
| 98 |         set x | 
|---|
| 99 |     } \ | 
|---|
| 100 |     -result {ok} \ | 
|---|
| 101 |     -cleanup {  | 
|---|
| 102 |         catch { close $f1 } | 
|---|
| 103 |         catch { close $f2 } | 
|---|
| 104 |         catch { removeFile foo } | 
|---|
| 105 |         catch { removeFile foo2 } | 
|---|
| 106 |     } | 
|---|
| 107 |  | 
|---|
| 108 | # cleanup | 
|---|
| 109 | ::tcltest::cleanupTests | 
|---|
| 110 | return | 
|---|