summaryrefslogtreecommitdiffstats
path: root/tests/socket.test
diff options
context:
space:
mode:
Diffstat (limited to 'tests/socket.test')
-rw-r--r--tests/socket.test1727
1 files changed, 619 insertions, 1108 deletions
diff --git a/tests/socket.test b/tests/socket.test
index 61660cd..a3d4b4b 100644
--- a/tests/socket.test
+++ b/tests/socket.test
@@ -1,14 +1,14 @@
# Commands tested in this file: socket.
#
-# This file contains a collection of tests for one or more of the Tcl built-in
-# commands. Sourcing this file into Tcl runs the tests and generates output
-# for errors. No output means no errors were found.
+# This file contains a collection of tests for one or more of the Tcl
+# built-in commands. Sourcing this file into Tcl runs the tests and
+# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1994-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-2000 Ajuba Solutions.
#
-# See the file "license.terms" for information on usage and redistribution of
-# this file, and for a DISCLAIMER OF ALL WARRANTIES.
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# Running socket tests with a remote server:
# ------------------------------------------
@@ -41,8 +41,8 @@
#
# When the server starts, it prints out a detailed message containing its
# configuration information, and it will block until killed with a Ctrl-C.
-# Once the remote server exists, you can run the tests in socket.test with the
-# server by setting two Tcl variables:
+# Once the remote server exists, you can run the tests in socket.test with
+# the server by setting two Tcl variables:
#
# % set remoteServerIP <name or address of machine on which server runs>
# % set remoteServerPort 2048
@@ -63,47 +63,16 @@
package require tcltest 2
namespace import -force ::tcltest::*
-# Some tests require the Thread package or exec command
-testConstraint thread [expr {0 == [catch {package require Thread 2.7-}]}]
+# Some tests require the testthread and exec commands
+testConstraint testthread [llength [info commands testthread]]
testConstraint exec [llength [info commands exec]]
# Produce a random port number in the Dynamic/Private range
# from 49152 through 65535.
proc randport {} { expr {int(rand()*16383+49152)} }
-# Test the latency of tcp connections over the loopback interface. Some OSes
-# (e.g. NetBSD) seem to use the Nagle algorithm and delayed ACKs, so it takes
-# up to 200ms for a packet sent to localhost to arrive. We're measuring this
-# here, so that OSes that don't have this problem can run the tests at full
-# speed.
-set server [socket -server {apply {{s a p} {set ::s1 $s}}} 0]
-set s2 [socket localhost [lindex [fconfigure $server -sockname] 2]]
-vwait s1; close $server
-fconfigure $s1 -buffering line
-fconfigure $s2 -buffering line
-set t1 [clock milliseconds]
-puts $s2 test1; gets $s1
-puts $s2 test2; gets $s1
-close $s1; close $s2
-set t2 [clock milliseconds]
-set lat1 [expr {($t2-$t1)*2}]; # doubled as a safety margin
-
-# Test the latency of failed connection attempts over the loopback
-# interface. They can take more than a second under Windowos and requres
-# additional [after]s in some tests that are not needed on systems that fail
-# immediately.
-set t1 [clock milliseconds]
-catch {socket 127.0.0.1 [randport]}
-set t2 [clock milliseconds]
-set lat2 [expr {($t2-$t1)*3}]
-
-# Use the maximum of the two latency calculations, but at least 100ms
-set latency [expr {$lat1 > $lat2 ? $lat1 : $lat2}]
-set latency [expr {$latency > 100 ? $latency : 100}]
-unset t1 t2 s1 s2 lat1 lat2 server
-
-# If remoteServerIP or remoteServerPort are not set, check in the environment
-# variables for externally set values.
+# If remoteServerIP or remoteServerPort are not set, check in the
+# environment variables for externally set values.
#
if {![info exists remoteServerIP]} {
@@ -112,7 +81,7 @@ if {![info exists remoteServerIP]} {
}
}
if {![info exists remoteServerPort]} {
- if {[info exists env(remoteServerPort)]} {
+ if {[info exists env(remoteServerIP)]} {
set remoteServerPort $env(remoteServerPort)
} else {
if {[info exists remoteServerIP]} {
@@ -121,55 +90,24 @@ if {![info exists remoteServerPort]} {
}
}
-if 0 {
- # activate this to time the tests
- proc test {args} {
- set name [lindex $args 0]
- puts "[lindex [time {uplevel [linsert $args 0 tcltest::test]}] 0] @@@ $name"
- }
-}
-
-foreach {af localhost} {
- inet 127.0.0.1
- inet6 ::1
-} {
- # Check if the family is supported and set the constraint accordingly
- testConstraint supported_$af [expr {![catch {socket -server foo -myaddr $localhost 0} sock]}]
- catch {close $sock}
-}
-testConstraint supported_any [expr {[testConstraint supported_inet] || [testConstraint supported_inet6]}]
-
-set sock [socket -server foo -myaddr localhost 0]
-set sockname [fconfigure $sock -sockname]
-close $sock
-testConstraint localhost_v4 [expr {"127.0.0.1" in $sockname}]
-testConstraint localhost_v6 [expr {"::1" in $sockname}]
-
-
-foreach {af localhost} {
- any 127.0.0.1
- inet 127.0.0.1
- inet6 ::1
-} {
- set ::tcl::unsupported::socketAF $af
#
# Check if we're supposed to do tests against the remote server
#
set doTestsWithRemoteServer 1
if {![info exists remoteServerIP]} {
- set remoteServerIP $localhost
+ set remoteServerIP 127.0.0.1
}
if {($doTestsWithRemoteServer == 1) && (![info exists remoteServerPort])} {
- set remoteServerPort [randport]
+ set remoteServerPort 2048
}
-# Attempt to connect to a remote server if one is already running. If it is
-# not running or for some other reason the connect fails, attempt to start the
-# remote server on the local host listening on port 2048. This is only done on
-# platforms that support exec (i.e. not on the Mac). On platforms that do not
-# support exec, the remote server must be started by the user before running
-# the tests.
+# Attempt to connect to a remote server if one is already running. If it
+# is not running or for some other reason the connect fails, attempt to
+# start the remote server on the local host listening on port 2048. This
+# is only done on platforms that support exec (i.e. not on the Mac). On
+# platforms that do not support exec, the remote server must be started
+# by the user before running the tests.
set remoteProcChan ""
set commandSocket ""
@@ -183,7 +121,7 @@ if {$doTestsWithRemoteServer} {
set noRemoteTestReason "can't exec"
set doTestsWithRemoteServer 0
} else {
- set remoteServerIP $localhost
+ set remoteServerIP 127.0.0.1
# Be *extra* careful in case this file is sourced from
# a directory other than the current one...
set remoteFile [file join [pwd] [file dirname [info script]] \
@@ -193,7 +131,7 @@ if {$doTestsWithRemoteServer} {
[interpreter] $remoteFile -serverIsSilent \
-port $remoteServerPort -address $remoteServerIP]" w+]
} msg]} then {
- gets $remoteProcChan
+ after 1000
if {[catch {
set commandSocket [socket $remoteServerIP $remoteServerPort]
} msg] == 0} then {
@@ -220,7 +158,8 @@ if {!$doTestsWithRemoteServer} {
}
#
-# If we do the tests, define a command to send a command to the remote server.
+# If we do the tests, define a command to send a command to the
+# remote server.
#
if {[testConstraint doTestsWithRemoteServer]} {
@@ -237,73 +176,71 @@ if {[testConstraint doTestsWithRemoteServer]} {
error "remote server disappeared: $msg"
}
+ set resp ""
while {1} {
set line [gets $commandSocket]
if {[eof $commandSocket]} {
error "remote server disappaered"
}
- if {$line eq "--Marker--Marker--Marker--"} {
- lassign $result code info value
- return -code $code -errorinfo $info $value
+ if {[string compare $line "--Marker--Marker--Marker--"] == 0} {
+ if {[string compare [lindex $resp 0] error] == 0} {
+ error [lindex $resp 1]
+ } else {
+ return [lindex $resp 1]
+ }
+ } else {
+ append resp $line "\n"
}
- append result $line "\n"
}
}
}
-proc getPort sock {
- lindex [fconfigure $sock -sockname] 2
-}
-
-
-# ----------------------------------------------------------------------
-
-test socket_$af-1.1 {arg parsing for socket command} -constraints [list socket supported_$af] -body {
- socket -server
-} -returnCodes error -result {no argument given for -server option}
-test socket_$af-1.2 {arg parsing for socket command} -constraints [list socket supported_$af] -body {
- socket -server foo
-} -returnCodes error -result {wrong # args: should be "socket ?-myaddr addr? ?-myport myport? ?-async? host port" or "socket -server command ?-myaddr addr? port"}
-test socket_$af-1.3 {arg parsing for socket command} -constraints [list socket supported_$af] -body {
- socket -myaddr
-} -returnCodes error -result {no argument given for -myaddr option}
-test socket_$af-1.4 {arg parsing for socket command} -constraints [list socket supported_$af] -body {
- socket -myaddr $localhost
-} -returnCodes error -result {wrong # args: should be "socket ?-myaddr addr? ?-myport myport? ?-async? host port" or "socket -server command ?-myaddr addr? port"}
-test socket_$af-1.5 {arg parsing for socket command} -constraints [list socket supported_$af] -body {
- socket -myport
-} -returnCodes error -result {no argument given for -myport option}
-test socket_$af-1.6 {arg parsing for socket command} -constraints [list socket supported_$af] -body {
- socket -myport xxxx
-} -returnCodes error -result {expected integer but got "xxxx"}
-test socket_$af-1.7 {arg parsing for socket command} -constraints [list socket supported_$af] -body {
- socket -myport 2522
-} -returnCodes error -result {wrong # args: should be "socket ?-myaddr addr? ?-myport myport? ?-async? host port" or "socket -server command ?-myaddr addr? port"}
-test socket_$af-1.8 {arg parsing for socket command} -constraints [list socket supported_$af] -body {
- socket -froboz
-} -returnCodes error -result {bad option "-froboz": must be -async, -myaddr, -myport, or -server}
-test socket_$af-1.9 {arg parsing for socket command} -constraints [list socket supported_$af] -body {
- socket -server foo -myport 2521 3333
-} -returnCodes error -result {option -myport is not valid for servers}
-test socket_$af-1.10 {arg parsing for socket command} -constraints [list socket supported_$af] -body {
- socket host 2528 -junk
-} -returnCodes error -result {wrong # args: should be "socket ?-myaddr addr? ?-myport myport? ?-async? host port" or "socket -server command ?-myaddr addr? port"}
-test socket_$af-1.11 {arg parsing for socket command} -constraints [list socket supported_$af] -body {
- socket -server callback 2520 --
-} -returnCodes error -result {wrong # args: should be "socket ?-myaddr addr? ?-myport myport? ?-async? host port" or "socket -server command ?-myaddr addr? port"}
-test socket_$af-1.12 {arg parsing for socket command} -constraints [list socket supported_$af] -body {
- socket foo badport
-} -returnCodes error -result {expected integer but got "badport"}
-test socket_$af-1.13 {arg parsing for socket command} -constraints [list socket supported_$af] -body {
- socket -async -server
-} -returnCodes error -result {cannot set -async option for server sockets}
-test socket_$af-1.14 {arg parsing for socket command} -constraints [list socket supported_$af] -body {
- socket -server foo -async
-} -returnCodes error -result {cannot set -async option for server sockets}
+test socket-1.1 {arg parsing for socket command} {socket} {
+ list [catch {socket -server} msg] $msg
+} {1 {no argument given for -server option}}
+test socket-1.2 {arg parsing for socket command} {socket} {
+ list [catch {socket -server foo} msg] $msg
+} {1 {wrong # args: should be "socket ?-myaddr addr? ?-myport myport? ?-async? host port" or "socket -server command ?-myaddr addr? port"}}
+test socket-1.3 {arg parsing for socket command} {socket} {
+ list [catch {socket -myaddr} msg] $msg
+} {1 {no argument given for -myaddr option}}
+test socket-1.4 {arg parsing for socket command} {socket} {
+ list [catch {socket -myaddr 127.0.0.1} msg] $msg
+} {1 {wrong # args: should be "socket ?-myaddr addr? ?-myport myport? ?-async? host port" or "socket -server command ?-myaddr addr? port"}}
+test socket-1.5 {arg parsing for socket command} {socket} {
+ list [catch {socket -myport} msg] $msg
+} {1 {no argument given for -myport option}}
+test socket-1.6 {arg parsing for socket command} {socket} {
+ list [catch {socket -myport xxxx} msg] $msg
+} {1 {expected integer but got "xxxx"}}
+test socket-1.7 {arg parsing for socket command} {socket} {
+ list [catch {socket -myport 2522} msg] $msg
+} {1 {wrong # args: should be "socket ?-myaddr addr? ?-myport myport? ?-async? host port" or "socket -server command ?-myaddr addr? port"}}
+test socket-1.8 {arg parsing for socket command} {socket} {
+ list [catch {socket -froboz} msg] $msg
+} {1 {bad option "-froboz": must be -async, -myaddr, -myport, or -server}}
+test socket-1.9 {arg parsing for socket command} {socket} {
+ list [catch {socket -server foo -myport 2521 3333} msg] $msg
+} {1 {option -myport is not valid for servers}}
+test socket-1.10 {arg parsing for socket command} {socket} {
+ list [catch {socket host 2528 -junk} msg] $msg
+} {1 {wrong # args: should be "socket ?-myaddr addr? ?-myport myport? ?-async? host port" or "socket -server command ?-myaddr addr? port"}}
+test socket-1.11 {arg parsing for socket command} {socket} {
+ list [catch {socket -server callback 2520 --} msg] $msg
+} {1 {wrong # args: should be "socket ?-myaddr addr? ?-myport myport? ?-async? host port" or "socket -server command ?-myaddr addr? port"}}
+test socket-1.12 {arg parsing for socket command} {socket} {
+ list [catch {socket foo badport} msg] $msg
+} {1 {expected integer but got "badport"}}
+test socket-1.13 {arg parsing for socket command} {socket} {
+list [catch {socket -async -server} msg] $msg
+} {1 {cannot set -async option for server sockets}}
+test socket-1.14 {arg parsing for socket command} {socket} {
+list [catch {socket -server foo -async} msg] $msg
+} {1 {cannot set -async option for server sockets}}
set path(script) [makeFile {} script]
-test socket_$af-2.1 {tcp connection} -constraints [list socket supported_$af stdio] -setup {
+test socket-2.1 {tcp connection} {socket stdio} {
file delete $path(script)
set f [open $path(script) w]
puts $f {
@@ -325,17 +262,23 @@ test socket_$af-2.1 {tcp connection} -constraints [list socket supported_$af std
set f [open "|[list [interpreter] $path(script)]" r]
gets $f x
gets $f listen
-} -body {
- # $x == "ready" at this point
- set sock [socket $localhost $listen]
- lappend x [gets $f]
- close $sock
+ if {[catch {socket 127.0.0.1 $listen} msg]} {
+ set x $msg
+ } else {
+ lappend x [gets $f]
+ close $msg
+ }
lappend x [gets $f]
-} -cleanup {
close $f
-} -result {ready done {}}
-test socket_$af-2.2 {tcp connection with client port specified} -setup {
- set port [randport]
+ set x
+} {ready done {}}
+
+if [info exists port] {
+ incr port
+} else {
+ set port [expr 2048 + [pid]%1024]
+}
+test socket-2.2 {tcp connection with client port specified} {socket stdio} {
file delete $path(script)
set f [open $path(script) w]
puts $f {
@@ -357,31 +300,32 @@ test socket_$af-2.2 {tcp connection with client port specified} -setup {
set f [open "|[list [interpreter] $path(script)]" r]
gets $f x
gets $f listen
-} -constraints [list socket supported_$af stdio] -body {
- # $x == "ready" at this point
- set sock [socket -myport $port $localhost $listen]
- puts $sock hello
- flush $sock
- lappend x [expr {[gets $f] eq "hello $port"}]
- close $sock
- return $x
-} -cleanup {
- catch {close [socket $localhost $listen]}
+ global port
+ if {[catch {socket -myport $port 127.0.0.1 $listen} sock]} {
+ set x $sock
+ close [socket 127.0.0.1 $listen]
+ puts stderr $sock
+ } else {
+ puts $sock hello
+ flush $sock
+ lappend x [gets $f]
+ close $sock
+ }
close $f
-} -result {ready 1}
-test socket_$af-2.3 {tcp connection with client interface specified} -setup {
+ set x
+} [list ready "hello $port"]
+test socket-2.3 {tcp connection with client interface specified} {socket stdio} {
file delete $path(script)
set f [open $path(script) w]
puts $f {
set timer [after 2000 "set x done"]
- set f [socket -server accept 0]
+ set f [socket -server accept 2830]
proc accept {file addr port} {
global x
puts "[gets $file] $addr"
close $file
set x done
}
- puts [lindex [fconfigure $f -sockname] 2]
puts ready
vwait x
after cancel $timer
@@ -389,26 +333,24 @@ test socket_$af-2.3 {tcp connection with client interface specified} -setup {
}
close $f
set f [open "|[list [interpreter] $path(script)]" r]
- gets $f listen
gets $f x
-} -constraints [list socket supported_$af stdio] -body {
- # $x == "ready" at this point
- set sock [socket -myaddr $localhost $localhost $listen]
- puts $sock hello
- flush $sock
- lappend x [gets $f]
- close $sock
- return $x
-} -cleanup {
+ if {[catch {socket -myaddr 127.0.0.1 127.0.0.1 2830} sock]} {
+ set x $sock
+ } else {
+ puts $sock hello
+ flush $sock
+ lappend x [gets $f]
+ close $sock
+ }
close $f
-} -result [list ready [list hello $localhost]]
-test socket_$af-2.4 {tcp connection with server interface specified} -setup {
+ set x
+} {ready {hello 127.0.0.1}}
+test socket-2.4 {tcp connection with server interface specified} {socket stdio} {
file delete $path(script)
set f [open $path(script) w]
- puts $f [list set localhost $localhost]
puts $f {
set timer [after 2000 "set x done"]
- set f [socket -server accept -myaddr $localhost 0]
+ set f [socket -server accept -myaddr 127.0.0.1 0]
proc accept {file addr port} {
global x
puts "[gets $file]"
@@ -425,18 +367,18 @@ test socket_$af-2.4 {tcp connection with server interface specified} -setup {
set f [open "|[list [interpreter] $path(script)]" r]
gets $f x
gets $f listen
-} -constraints [list socket supported_$af stdio] -body {
- # $x == "ready" at this point
- set sock [socket $localhost $listen]
- puts $sock hello
- flush $sock
- lappend x [gets $f]
- close $sock
- return $x
-} -cleanup {
+ if {[catch {socket 127.0.0.1 $listen} sock]} {
+ set x $sock
+ } else {
+ puts $sock hello
+ flush $sock
+ lappend x [gets $f]
+ close $sock
+ }
close $f
-} -result {ready hello}
-test socket_$af-2.5 {tcp connection with redundant server port} -setup {
+ set x
+} {ready hello}
+test socket-2.5 {tcp connection with redundant server port} {socket stdio} {
file delete $path(script)
set f [open $path(script) w]
puts $f {
@@ -458,28 +400,28 @@ test socket_$af-2.5 {tcp connection with redundant server port} -setup {
set f [open "|[list [interpreter] $path(script)]" r]
gets $f x
gets $f listen
-} -constraints [list socket supported_$af stdio] -body {
- # $x == "ready" at this point
- set sock [socket $localhost $listen]
- puts $sock hello
- flush $sock
- lappend x [gets $f]
- close $sock
- return $x
-} -cleanup {
+ if {[catch {socket 127.0.0.1 $listen} sock]} {
+ set x $sock
+ } else {
+ puts $sock hello
+ flush $sock
+ lappend x [gets $f]
+ close $sock
+ }
close $f
-} -result {ready hello}
-test socket_$af-2.6 {tcp connection} -constraints [list socket supported_$af] -body {
+ set x
+} {ready hello}
+test socket-2.6 {tcp connection} {socket} {
set status ok
- if {![catch {set sock [socket $localhost [randport]]}]} {
+ if {![catch {set sock [socket 127.0.0.1 2833]}]} {
if {![catch {gets $sock}]} {
set status broken
}
close $sock
}
set status
-} -result ok
-test socket_$af-2.7 {echo server, one line} -constraints [list socket supported_$af stdio] -setup {
+} ok
+test socket-2.7 {echo server, one line} {socket stdio} {
file delete $path(script)
set f [open $path(script) w]
puts $f {
@@ -510,18 +452,18 @@ test socket_$af-2.7 {echo server, one line} -constraints [list socket supported_
set f [open "|[list [interpreter] $path(script)]" r]
gets $f
gets $f listen
-} -body {
- set s [socket $localhost $listen]
+ set s [socket 127.0.0.1 $listen]
fconfigure $s -buffering line -translation lf
puts $s "hello abcdefghijklmnop"
+ after 1000
set x [gets $s]
close $s
- list $x [gets $f]
-} -cleanup {
+ set y [gets $f]
close $f
-} -result {{hello abcdefghijklmnop} done}
+ list $x $y
+} {{hello abcdefghijklmnop} done}
removeFile script
-test socket_$af-2.8 {echo server, loop 50 times, single connection} -setup {
+test socket-2.8 {echo server, loop 50 times, single connection} -constraints {socket stdio} -setup {
set path(script) [makeFile {
set f [socket -server accept 0]
proc accept {s a p} {
@@ -549,11 +491,11 @@ test socket_$af-2.8 {echo server, loop 50 times, single connection} -setup {
close $f
puts "done $i"
} script]
+} -body {
set f [open "|[list [interpreter] $path(script)]" r]
gets $f
gets $f listen
-} -constraints [list socket supported_$af stdio] -body {
- set s [socket $localhost $listen]
+ set s [socket 127.0.0.1 $listen]
fconfigure $s -buffering line
catch {
for {set x 0} {$x < 50} {incr x} {
@@ -563,30 +505,30 @@ test socket_$af-2.8 {echo server, loop 50 times, single connection} -setup {
}
close $s
catch {set x [gets $f]}
- return $x
-} -cleanup {
close $f
+ set x
+} -cleanup {
removeFile script
} -result {done 50}
set path(script) [makeFile {} script]
-test socket_$af-2.9 {socket conflict} -constraints [list socket supported_$af stdio] -body {
+test socket-2.9 {socket conflict} {socket stdio} {
set s [socket -server accept 0]
file delete $path(script)
set f [open $path(script) w]
- puts $f [list set ::tcl::unsupported::socketAF $::tcl::unsupported::socketAF]
- puts $f "socket -server accept [lindex [fconfigure $s -sockname] 2]"
+ puts -nonewline $f "socket -server accept [lindex [fconfigure $s -sockname] 2]"
close $f
set f [open "|[list [interpreter] $path(script)]" r]
gets $f
after 100
- close $f
-} -returnCodes error -cleanup {
+ set x [list [catch {close $f} msg]]
+ regsub "\n.*$" $msg {} msg ; # cut part of the error message containing the port number
+ lappend x $msg
close $s
-} -match glob -result {couldn't open socket: address already in use*}
-test socket_$af-2.10 {close on accept, accepted socket lives} -setup {
+ set x
+} {1 {couldn't open socket: address already in use}}
+test socket-2.10 {close on accept, accepted socket lives} {socket} {
set done 0
set timer [after 20000 "set done timed_out"]
-} -constraints [list socket supported_$af] -body {
set ss [socket -server accept 0]
proc accept {s a p} {
global ss
@@ -600,51 +542,48 @@ test socket_$af-2.10 {close on accept, accepted socket lives} -setup {
close $s
set done 1
}
- set cs [socket $localhost [lindex [fconfigure $ss -sockname] 2]]
+ set cs [socket [info hostname] [lindex [fconfigure $ss -sockname] 2]]
puts $cs hello
close $cs
vwait done
- return $done
-} -cleanup {
after cancel $timer
-} -result 1
-test socket_$af-2.11 {detecting new data} -constraints [list socket supported_$af] -setup {
+ set done
+} 1
+test socket-2.11 {detecting new data} {socket} {
proc accept {s a p} {
global sock
set sock $s
}
+
set s [socket -server accept 0]
set sock ""
-} -body {
- set s2 [socket $localhost [lindex [fconfigure $s -sockname] 2]]
+ set s2 [socket 127.0.0.1 [lindex [fconfigure $s -sockname] 2]]
vwait sock
puts $s2 one
flush $s2
- after idle {set x 1}
- vwait x
+ after 500
fconfigure $sock -blocking 0
set result a:[gets $sock]
lappend result b:[gets $sock]
fconfigure $sock -blocking 1
puts $s2 two
flush $s2
- after $latency {set x 1}; # NetBSD fails here if we do [after idle]
- vwait x
+ after 500
fconfigure $sock -blocking 0
lappend result c:[gets $sock]
-} -cleanup {
fconfigure $sock -blocking 1
close $s2
close $s
close $sock
-} -result {a:one b: c:two}
+ set result
+} {a:one b: c:two}
+
-test socket_$af-3.1 {socket conflict} -constraints [list socket supported_$af stdio] -setup {
+test socket-3.1 {socket conflict} {socket stdio} {
file delete $path(script)
set f [open $path(script) w]
- puts $f [list set localhost $localhost]
puts $f {
- set f [socket -server accept -myaddr $localhost 0]
+ set f [socket -server accept -myaddr 127.0.0.1 0]
puts ready
puts [lindex [fconfigure $f -sockname] 2]
gets stdin
@@ -654,22 +593,21 @@ test socket_$af-3.1 {socket conflict} -constraints [list socket supported_$af st
set f [open "|[list [interpreter] $path(script)]" r+]
gets $f
gets $f listen
-} -body {
- socket -server accept -myaddr $localhost $listen
-} -cleanup {
+ set x [list [catch {socket -server accept -myaddr 127.0.0.1 $listen} msg] \
+ $msg]
puts $f bye
close $f
-} -returnCodes error -result {couldn't open socket: address already in use}
-test socket_$af-3.2 {server with several clients} -setup {
+ set x
+} {1 {couldn't open socket: address already in use}}
+test socket-3.2 {server with several clients} {socket stdio} {
file delete $path(script)
set f [open $path(script) w]
- puts $f [list set localhost $localhost]
puts $f {
set t1 [after 30000 "set x timed_out"]
set t2 [after 31000 "set x timed_out"]
set t3 [after 32000 "set x timed_out"]
set counter 0
- set s [socket -server accept -myaddr $localhost 0]
+ set s [socket -server accept -myaddr 127.0.0.1 0]
proc accept {s a p} {
fileevent $s readable [list echo $s]
fconfigure $s -buffering line
@@ -699,13 +637,11 @@ test socket_$af-3.2 {server with several clients} -setup {
set f [open "|[list [interpreter] $path(script)]" r+]
set x [gets $f]
gets $f listen
-} -constraints [list socket supported_$af stdio] -body {
- # $x == "ready" here
- set s1 [socket $localhost $listen]
+ set s1 [socket 127.0.0.1 $listen]
fconfigure $s1 -buffering line
- set s2 [socket $localhost $listen]
+ set s2 [socket 127.0.0.1 $listen]
fconfigure $s2 -buffering line
- set s3 [socket $localhost $listen]
+ set s3 [socket 127.0.0.1 $listen]
fconfigure $s3 -buffering line
for {set i 0} {$i < 100} {incr i} {
puts $s1 hello,s1
@@ -719,17 +655,16 @@ test socket_$af-3.2 {server with several clients} -setup {
close $s2
close $s3
lappend x [gets $f]
-} -cleanup {
close $f
-} -result {ready done}
+ set x
+} {ready done}
-test socket_$af-4.1 {server with several clients} -setup {
+test socket-4.1 {server with several clients} {socket stdio} {
file delete $path(script)
set f [open $path(script) w]
- puts $f [list set localhost $localhost]
puts $f {
set port [gets stdin]
- set s [socket $localhost $port]
+ set s [socket 127.0.0.1 $port]
fconfigure $s -buffering line
for {set i 0} {$i < 100} {incr i} {
puts $s hello
@@ -746,7 +681,6 @@ test socket_$af-4.1 {server with several clients} -setup {
fconfigure $p2 -buffering line
set p3 [open "|[list [interpreter] $path(script)]" r+]
fconfigure $p3 -buffering line
-} -constraints [list socket supported_$af stdio] -body {
proc accept {s a p} {
fconfigure $s -buffering line
fileevent $s readable [list echo $s]
@@ -764,7 +698,7 @@ test socket_$af-4.1 {server with several clients} -setup {
set t1 [after 30000 "set x timed_out"]
set t2 [after 31000 "set x timed_out"]
set t3 [after 32000 "set x timed_out"]
- set s [socket -server accept -myaddr $localhost 0]
+ set s [socket -server accept -myaddr 127.0.0.1 0]
set listen [lindex [fconfigure $s -sockname] 2]
puts $p1 $listen
puts $p2 $listen
@@ -780,42 +714,52 @@ test socket_$af-4.1 {server with several clients} -setup {
lappend l [list p1 [gets $p1] $x]
lappend l [list p2 [gets $p2] $x]
lappend l [list p3 [gets $p3] $x]
-} -cleanup {
puts $p1 bye
puts $p2 bye
puts $p3 bye
close $p1
close $p2
close $p3
-} -result {{p1 bye done} {p2 bye done} {p3 bye done}}
-test socket_$af-4.2 {byte order problems, socket numbers, htons} -body {
- close [socket -server dodo -myaddr $localhost 0x3000]
- return ok
-} -constraints [list socket supported_$af] -result ok
+ set l
+} {{p1 bye done} {p2 bye done} {p3 bye done}}
+test socket-4.2 {byte order problems, socket numbers, htons} {socket} {
+ set x ok
+ if {[catch {socket -server dodo -myaddr 127.0.0.1 0x3000} msg]} {
+ set x $msg
+ } else {
+ close $msg
+ }
+ set x
+} ok
-test socket_$af-5.1 {byte order problems, socket numbers, htons} -body {
+test socket-5.1 {byte order problems, socket numbers, htons} \
+ {socket unix notRoot} {
+ set x {couldn't open socket: not owner}
if {![catch {socket -server dodo 0x1} msg]} {
+ set x {htons problem, should be disallowed, are you running as SU?}
close $msg
- return {htons problem, should be disallowed, are you running as SU?}
}
- return {couldn't open socket: not owner}
-} -constraints [list socket supported_$af unix notRoot] -result {couldn't open socket: not owner}
-test socket_$af-5.2 {byte order problems, socket numbers, htons} -body {
+ set x
+} {couldn't open socket: not owner}
+test socket-5.2 {byte order problems, socket numbers, htons} {socket} {
+ set x {couldn't open socket: port number too high}
if {![catch {socket -server dodo 0x10000} msg]} {
+ set x {port resolution problem, should be disallowed}
close $msg
- return {port resolution problem, should be disallowed}
}
- return {couldn't open socket: port number too high}
-} -constraints [list socket supported_$af] -result {couldn't open socket: port number too high}
-test socket_$af-5.3 {byte order problems, socket numbers, htons} -body {
+ set x
+} {couldn't open socket: port number too high}
+test socket-5.3 {byte order problems, socket numbers, htons} \
+ {socket unix notRoot} {
+ set x {couldn't open socket: not owner}
if {![catch {socket -server dodo 21} msg]} {
+ set x {htons problem, should be disallowed, are you running as SU?}
close $msg
- return {htons problem, should be disallowed, are you running as SU?}
}
- return {couldn't open socket: not owner}
-} -constraints [list socket supported_$af unix notRoot] -result {couldn't open socket: not owner}
+ set x
+} {couldn't open socket: not owner}
-test socket_$af-6.1 {accept callback error} -constraints [list socket supported_$af stdio] -setup {
+test socket-6.1 {accept callback error} -constraints {socket stdio} -setup {
proc myHandler {msg options} {
variable x $msg
}
@@ -824,45 +768,26 @@ test socket_$af-6.1 {accept callback error} -constraints [list socket supported_
file delete $path(script)
} -body {
set f [open $path(script) w]
- puts $f [list set localhost $localhost]
puts $f {
gets stdin port
- socket $localhost $port
+ socket 127.0.0.1 $port
}
close $f
set f [open "|[list [interpreter] $path(script)]" r+]
proc accept {s a p} {expr 10 / 0}
- set s [socket -server accept -myaddr $localhost 0]
+ set s [socket -server accept -myaddr 127.0.0.1 0]
puts $f [lindex [fconfigure $s -sockname] 2]
close $f
set timer [after 10000 "set x timed_out"]
vwait x
after cancel $timer
close $s
- return $x
+ set x
} -cleanup {
interp bgerror {} $handler
} -result {divide by zero}
-test socket_$af-6.2 {
- readable fileevent on server socket
-} -setup {
- set sock [socket -server dummy 0]
-} -constraints [list socket supported_$af] -body {
- fileevent $sock readable dummy
-} -cleanup {
- close $sock
-} -returnCodes 1 -result "channel is not readable"
-
-test socket_$af-6.3 {writable fileevent on server socket} -setup {
- set sock [socket -server dummy 0]
-} -constraints [list socket supported_$af] -body {
- fileevent $sock writable dummy
-} -cleanup {
- close $sock
-} -returnCodes 1 -result "channel is not writable"
-
-test socket_$af-7.1 {testing socket specific options} -setup {
+test socket-7.1 {testing socket specific options} {socket stdio} {
file delete $path(script)
set f [open $path(script) w]
puts $f {
@@ -881,23 +806,20 @@ test socket_$af-7.1 {testing socket specific options} -setup {
set f [open "|[list [interpreter] $path(script)]" r]
gets $f
gets $f listen
- set l ""
-} -constraints [list socket supported_$af stdio] -body {
- set s [socket $localhost $listen]
+ set s [socket 127.0.0.1 $listen]
set p [fconfigure $s -peername]
close $s
- lappend l [string compare [lindex $p 0] $localhost]
+ close $f
+ set l ""
+ lappend l [string compare [lindex $p 0] 127.0.0.1]
lappend l [string compare [lindex $p 2] $listen]
lappend l [llength $p]
-} -cleanup {
- close $f
-} -result {0 0 3}
-test socket_$af-7.2 {testing socket specific options} -setup {
+} {0 0 3}
+test socket-7.2 {testing socket specific options} {socket stdio} {
file delete $path(script)
set f [open $path(script) w]
- puts $f [list set ::tcl::unsupported::socketAF $::tcl::unsupported::socketAF]
puts $f {
- set ss [socket -server accept 0]
+ set ss [socket -server accept 2821]
proc accept args {
global x
set x done
@@ -912,46 +834,39 @@ test socket_$af-7.2 {testing socket specific options} -setup {
set f [open "|[list [interpreter] $path(script)]" r]
gets $f
gets $f listen
-} -constraints [list socket supported_$af stdio] -body {
- set s [socket $localhost $listen]
+ set s [socket 127.0.0.1 $listen]
set p [fconfigure $s -sockname]
close $s
+ close $f
list [llength $p] \
- [regexp {^(127\.0\.0\.1|0\.0\.0\.0|::1)$} [lindex $p 0]] \
+ [regexp {^(127\.0\.0\.1|0\.0\.0\.0)$} [lindex $p 0]] \
[expr {[lindex $p 2] == $listen}]
-} -cleanup {
- close $f
-} -result {3 1 0}
-test socket_$af-7.3 {testing socket specific options} -constraints [list socket supported_$af] -body {
- set s [socket -server accept -myaddr $localhost 0]
+} {3 1 0}
+test socket-7.3 {testing socket specific options} {socket} {
+ set s [socket -server accept -myaddr 127.0.0.1 0]
set l [fconfigure $s]
close $s
update
llength $l
-} -result 14
-test socket_$af-7.4 {testing socket specific options} -constraints [list socket supported_$af] -setup {
- set timer [after 10000 "set x timed_out"]
- set l ""
-} -body {
- set s [socket -server accept -myaddr $localhost 0]
+} 14
+test socket-7.4 {testing socket specific options} {socket} {
+ set s [socket -server accept -myaddr 127.0.0.1 0]
proc accept {s a p} {
global x
set x [fconfigure $s -sockname]
close $s
}
set listen [lindex [fconfigure $s -sockname] 2]
- set s1 [socket $localhost $listen]
+ set s1 [socket 127.0.0.1 $listen]
+ set timer [after 10000 "set x timed_out"]
vwait x
- lappend l [expr {[lindex $x 2] == $listen}] [llength $x]
-} -cleanup {
after cancel $timer
close $s
close $s1
-} -result {1 3}
-test socket_$af-7.5 {testing socket specific options} -setup {
- set timer [after 10000 "set x timed_out"]
set l ""
-} -constraints [list socket supported_$af unixOrPc] -body {
+ lappend l [expr {[lindex $x 2] == $listen}] [llength $x]
+} {1 3}
+test socket-7.5 {testing socket specific options} {socket unixOrPc} {
set s [socket -server accept 0]
proc accept {s a p} {
global x
@@ -959,18 +874,19 @@ test socket_$af-7.5 {testing socket specific options} -setup {
close $s
}
set listen [lindex [fconfigure $s -sockname] 2]
- set s1 [socket $localhost $listen]
+ set s1 [socket 127.0.0.1 $listen]
+ set timer [after 10000 "set x timed_out"]
vwait x
- lappend l [lindex $x 0] [expr {[lindex $x 2] == $listen}] [llength $x]
-} -cleanup {
after cancel $timer
close $s
close $s1
-} -result [list $localhost 1 3]
+ set l ""
+ lappend l [lindex $x 0] [expr {[lindex $x 2] == $listen}] [llength $x]
+} {127.0.0.1 1 3}
-test socket_$af-8.1 {testing -async flag on sockets} -constraints [list socket supported_$af] -body {
- # NOTE: This test may fail on some Solaris 2.4 systems. If it does, check
- # that you have these patches installed (using showrev -p):
+test socket-8.1 {testing -async flag on sockets} {socket} {
+ # NOTE: This test may fail on some Solaris 2.4 systems. If it does,
+ # check that you have these patches installed (using showrev -p):
#
# 101907-05, 101925-02, 101945-14, 101959-03, 101969-05, 101973-03,
# 101977-03, 101981-02, 101985-01, 102001-03, 102003-01, 102007-01,
@@ -979,31 +895,58 @@ test socket_$af-8.1 {testing -async flag on sockets} -constraints [list socket s
# 101878-03, 101879-01, 101880-03, 101933-01, 101950-01, 102030-01,
# 102057-08, 102140-01, 101920-02, 101921-09, 101922-07, 101923-03
#
- # If after installing these patches you are still experiencing a problem,
- # please email jyl@eng.sun.com. We have not observed this failure on
- # Solaris 2.5, so another option (instead of installing these patches) is
- # to upgrade to Solaris 2.5.
- set s [socket -server accept -myaddr $localhost 0]
+ # If after installing these patches you are still experiencing a
+ # problem, please email jyl@eng.sun.com. We have not observed this
+ # failure on Solaris 2.5, so another option (instead of installing
+ # these patches) is to upgrade to Solaris 2.5.
+ set s [socket -server accept -myaddr 127.0.0.1 0]
proc accept {s a p} {
global x
puts $s bye
close $s
set x done
}
- set s1 [socket -async $localhost [lindex [fconfigure $s -sockname] 2]]
+ set s1 [socket -async 127.0.0.1 [lindex [fconfigure $s -sockname] 2]]
vwait x
- gets $s1
-} -cleanup {
+ set z [gets $s1]
close $s
close $s1
-} -result bye
+ set z
+} bye
+
+test socket-8.2 {testing writable event when quick failure} {socket win} {
+ # Test for bug 336441ed59 where a quick background fail was ignored
+
+ # Test only for windows as socket -async 255.255.255.255 fails directly
+ # on unix
+
+ # The following connect should fail very quickly
+ set a1 [after 2000 {set x timeout}]
+ set s [socket -async 255.255.255.255 43434]
+ fileevent $s writable {set x writable}
+ vwait x
+ catch {close $s}
+ after cancel $a1
+ set x
+} writable
+
+test socket-8.3 {testing fileevent readable on failed async socket connect} {socket} {
+ # Test for bug 581937ab1e
+
+ set a1 [after 5000 {set x timeout}]
+ # This connect should fail
+ set s [socket -async localhost [randport]]
+ fileevent $s readable {set x readable}
+ vwait x
+ catch {close $s}
+ after cancel $a1
+ set x
+} readable
-test socket_$af-9.1 {testing spurious events} -constraints [list socket supported_$af] -setup {
+test socket-9.1 {testing spurious events} {socket} {
set len 0
set spurious 0
set done 0
- set timer [after 10000 "set done timed_out"]
-} -body {
proc readlittle {s} {
global spurious done len
set l [read $s 1]
@@ -1022,25 +965,24 @@ test socket_$af-9.1 {testing spurious events} -constraints [list socket supporte
fconfigure $s -buffering none -blocking off
fileevent $s readable [list readlittle $s]
}
- set s [socket -server accept -myaddr $localhost 0]
- set c [socket $localhost [lindex [fconfigure $s -sockname] 2]]
+ set s [socket -server accept -myaddr 127.0.0.1 0]
+ set c [socket 127.0.0.1 [lindex [fconfigure $s -sockname] 2]]
puts -nonewline $c 01234567890123456789012345678901234567890123456789
close $c
+ set timer [after 10000 "set done timed_out"]
vwait done
+ after cancel $timer
close $s
list $spurious $len
-} -cleanup {
- after cancel $timer
-} -result {0 50}
-test socket_$af-9.2 {testing async write, fileevents, flush on close} -constraints [list socket supported_$af] -setup {
+} {0 50}
+test socket-9.2 {testing async write, fileevents, flush on close} {socket} {
set firstblock ""
for {set i 0} {$i < 5} {incr i} {set firstblock "a$firstblock$firstblock"}
set secondblock ""
for {set i 0} {$i < 16} {incr i} {
set secondblock "b$secondblock$secondblock"
}
- set timer [after 10000 "set done timed_out"]
- set l [socket -server accept -myaddr $localhost 0]
+ set l [socket -server accept -myaddr 127.0.0.1 0]
proc accept {s a p} {
fconfigure $s -blocking 0 -translation lf -buffersize 16384 \
-buffering line
@@ -1049,20 +991,19 @@ test socket_$af-9.2 {testing async write, fileevents, flush on close} -constrain
proc readable {s} {
set l [gets $s]
fileevent $s readable {}
- after idle respond $s
+ after 1000 respond $s
}
proc respond {s} {
global firstblock
puts -nonewline $s $firstblock
- after idle writedata $s
+ after 1000 writedata $s
}
proc writedata {s} {
global secondblock
puts -nonewline $s $secondblock
close $s
}
-} -body {
- set s [socket $localhost [lindex [fconfigure $l -sockname] 2]]
+ set s [socket 127.0.0.1 [lindex [fconfigure $l -sockname] 2]]
fconfigure $s -blocking 0 -trans lf -buffering line
set count 0
puts $s hello
@@ -1076,27 +1017,15 @@ test socket_$af-9.2 {testing async write, fileevents, flush on close} -constrain
}
}
fileevent $s readable "readit $s"
+ set timer [after 10000 "set done timed_out"]
vwait done
- return $count
-} -cleanup {
- close $l
after cancel $timer
-} -result 65566
-test socket_$af-9.3 {testing EOF stickyness} -constraints [list socket supported_$af] -setup {
- set count 0
- set done false
- proc write_then_close {s} {
- puts $s bye
- close $s
- }
- proc accept {s a p} {
- fconfigure $s -buffering line -translation lf
- fileevent $s writable "write_then_close $s"
- }
- set s [socket -server accept -myaddr $localhost 0]
-} -body {
+ close $l
+ set count
+} 65566
+test socket-9.3 {testing EOF stickyness} {socket} {
proc count_to_eof {s} {
- global count done
+ global count done timer
set l [gets $s]
if {[eof $s]} {
incr count
@@ -1104,30 +1033,41 @@ test socket_$af-9.3 {testing EOF stickyness} -constraints [list socket supported
close $s
set done true
set count {eof is sticky}
+ after cancel $timer
}
}
}
- proc timerproc {s} {
- global done count
+ proc timerproc {} {
+ global done count c
set done true
set count {timer went off, eof is not sticky}
+ close $c
+ }
+ set count 0
+ set done false
+ proc write_then_close {s} {
+ puts $s bye
close $s
}
- set c [socket $localhost [lindex [fconfigure $s -sockname] 2]]
+ proc accept {s a p} {
+ fconfigure $s -buffering line -translation lf
+ fileevent $s writable "write_then_close $s"
+ }
+ set s [socket -server accept -myaddr 127.0.0.1 0]
+ set c [socket 127.0.0.1 [lindex [fconfigure $s -sockname] 2]]
fconfigure $c -blocking off -buffering line -translation lf
fileevent $c readable "count_to_eof $c"
- set timer [after 1000 timerproc $c]
+ set timer [after 1000 timerproc]
vwait done
- return $count
-} -cleanup {
close $s
- after cancel $timer
-} -result {eof is sticky}
+ set count
+} {eof is sticky}
removeFile script
-test socket_$af-10.1 {testing socket accept callback error handling} \
- -constraints [list socket supported_$af] -setup {
+test socket-10.1 {testing socket accept callback error handling} -constraints {
+ socket
+} -setup {
variable goterror 0
proc myHandler {msg options} {
variable goterror 1
@@ -1135,64 +1075,68 @@ test socket_$af-10.1 {testing socket accept callback error handling} \
set handler [interp bgerror {}]
interp bgerror {} [namespace which myHandler]
} -body {
- set s [socket -server accept -myaddr $localhost 0]
+ set s [socket -server accept -myaddr 127.0.0.1 0]
proc accept {s a p} {close $s; error}
- set c [socket $localhost [lindex [fconfigure $s -sockname] 2]]
+ set c [socket 127.0.0.1 [lindex [fconfigure $s -sockname] 2]]
vwait goterror
close $s
close $c
- return $goterror
+ set goterror
} -cleanup {
interp bgerror {} $handler
} -result 1
-test socket_$af-11.1 {tcp connection} -setup {
- set port [sendCommand {
- set server [socket -server accept 0]
+test socket-11.1 {tcp connection} {socket doTestsWithRemoteServer} {
+ sendCommand {
+ set socket9_1_test_server [socket -server accept 2834]
proc accept {s a p} {
puts $s done
close $s
}
- getPort $server
- }]
-} -constraints [list socket supported_$af doTestsWithRemoteServer] -body {
- set s [socket $remoteServerIP $port]
- gets $s
-} -cleanup {
+ }
+ set s [socket $remoteServerIP 2834]
+ set r [gets $s]
close $s
- sendCommand {close $server}
-} -result done
-test socket_$af-11.2 {client specifies its port} -setup {
- set lport [randport]
- set rport [sendCommand {
- set server [socket -server accept 0]
+ sendCommand {close $socket9_1_test_server}
+ set r
+} done
+test socket-11.2 {client specifies its port} {socket doTestsWithRemoteServer} {
+ if {[info exists port]} {
+ incr port
+ } else {
+ set port [expr 2048 + [pid]%1024]
+ }
+ sendCommand {
+ set socket9_2_test_server [socket -server accept 2835]
proc accept {s a p} {
puts $s $p
close $s
}
- getPort $server
- }]
-} -constraints [list socket supported_$af doTestsWithRemoteServer] -body {
- set s [socket -myport $lport $remoteServerIP $rport]
+ }
+ set s [socket -myport $port $remoteServerIP 2835]
set r [gets $s]
- expr {$r==$lport ? "ok" : "broken: $r != $port"}
-} -cleanup {
close $s
- sendCommand {close $server}
-} -result ok
-test socket_$af-11.3 {trying to connect, no server} -body {
+ sendCommand {close $socket9_2_test_server}
+ if {$r == $port} {
+ set result ok
+ } else {
+ set result broken
+ }
+ set result
+} ok
+test socket-11.3 {trying to connect, no server} {socket doTestsWithRemoteServer} {
set status ok
- if {![catch {set s [socket $remoteServerIp [randport]]}]} {
+ if {![catch {set s [socket $remoteServerIp 2836]}]} {
if {![catch {gets $s}]} {
set status broken
}
close $s
}
- return $status
-} -constraints [list socket supported_$af doTestsWithRemoteServer] -result ok
-test socket_$af-11.4 {remote echo, one line} -setup {
- set port [sendCommand {
- set server [socket -server accept 0]
+ set status
+} ok
+test socket-11.4 {remote echo, one line} {socket doTestsWithRemoteServer} {
+ sendCommand {
+ set socket10_6_test_server [socket -server accept 2836]
proc accept {s a p} {
fileevent $s readable [list echo $s]
fconfigure $s -buffering line -translation crlf
@@ -1205,20 +1149,18 @@ test socket_$af-11.4 {remote echo, one line} -setup {
puts $s $l
}
}
- getPort $server
- }]
-} -constraints [list socket supported_$af doTestsWithRemoteServer] -body {
- set f [socket $remoteServerIP $port]
+ }
+ set f [socket $remoteServerIP 2836]
fconfigure $f -translation crlf -buffering line
puts $f hello
- gets $f
-} -cleanup {
- catch {close $f}
- sendCommand {close $server}
-} -result hello
-test socket_$af-11.5 {remote echo, 50 lines} -setup {
- set port [sendCommand {
- set server [socket -server accept 0]
+ set r [gets $f]
+ close $f
+ sendCommand {close $socket10_6_test_server}
+ set r
+} hello
+test socket-11.5 {remote echo, 50 lines} {socket doTestsWithRemoteServer} {
+ sendCommand {
+ set socket10_7_test_server [socket -server accept 2836]
proc accept {s a p} {
fileevent $s readable [list echo $s]
fconfigure $s -buffering line -translation crlf
@@ -1231,33 +1173,33 @@ test socket_$af-11.5 {remote echo, 50 lines} -setup {
puts $s $l
}
}
- getPort $server
- }]
-} -constraints [list socket supported_$af doTestsWithRemoteServer] -body {
- set f [socket $remoteServerIP $port]
+ }
+ set f [socket $remoteServerIP 2836]
fconfigure $f -translation crlf -buffering line
for {set cnt 0} {$cnt < 50} {incr cnt} {
puts $f "hello, $cnt"
- if {[gets $f] != "hello, $cnt"} {
+ if {[string compare [gets $f] "hello, $cnt"] != 0} {
break
}
}
- return $cnt
-} -cleanup {
close $f
- sendCommand {close $server}
-} -result 50
-test socket_$af-11.6 {socket conflict} -setup {
- set s1 [socket -server accept -myaddr $localhost 0]
-} -constraints [list socket supported_$af doTestsWithRemoteServer] -body {
- set s2 [socket -server accept -myaddr $localhost [getPort $s1]]
- list [getPort $s2] [close $s2]
-} -cleanup {
+ sendCommand {close $socket10_7_test_server}
+ set cnt
+} 50
+test socket-11.6 {socket conflict} {socket doTestsWithRemoteServer} {
+ set s1 [socket -server accept -myaddr 127.0.0.1 2836]
+ if {[catch {set s2 [socket -server accept -myaddr 127.0.0.1 2836]} msg]} {
+ set result [list 1 $msg]
+ } else {
+ set result [list 0 [lindex [fconfigure $s2 -sockname] 2]]
+ close $s2
+ }
close $s1
-} -returnCodes error -result {couldn't open socket: address already in use}
-test socket_$af-11.7 {server with several clients} -setup {
- set port [sendCommand {
- set server [socket -server accept 0]
+ set result
+} {1 {couldn't open socket: address already in use}}
+test socket-11.7 {server with several clients} {socket doTestsWithRemoteServer} {
+ sendCommand {
+ set socket10_9_test_server [socket -server accept 2836]
proc accept {s a p} {
fconfigure $s -buffering line
fileevent $s readable [list echo $s]
@@ -1270,14 +1212,12 @@ test socket_$af-11.7 {server with several clients} -setup {
puts $s $l
}
}
- getPort $server
- }]
-} -constraints [list socket supported_$af doTestsWithRemoteServer] -body {
- set s1 [socket $remoteServerIP $port]
+ }
+ set s1 [socket $remoteServerIP 2836]
fconfigure $s1 -buffering line
- set s2 [socket $remoteServerIP $port]
+ set s2 [socket $remoteServerIP 2836]
fconfigure $s2 -buffering line
- set s3 [socket $remoteServerIP $port]
+ set s3 [socket $remoteServerIP 2836]
fconfigure $s3 -buffering line
for {set i 0} {$i < 100} {incr i} {
puts $s1 hello,s1
@@ -1287,31 +1227,28 @@ test socket_$af-11.7 {server with several clients} -setup {
puts $s3 hello,s3
gets $s3
}
- return $i
-} -cleanup {
close $s1
close $s2
close $s3
- sendCommand {close $server}
-} -result 100
-test socket_$af-11.8 {client with several servers} -setup {
- lassign [sendCommand {
- set s1 [socket -server "accept server1" 0]
- set s2 [socket -server "accept server2" 0]
- set s3 [socket -server "accept server3" 0]
+ sendCommand {close $socket10_9_test_server}
+ set i
+} 100
+test socket-11.8 {client with several servers} {socket doTestsWithRemoteServer} {
+ sendCommand {
+ set s1 [socket -server "accept 4003" 4003]
+ set s2 [socket -server "accept 4004" 4004]
+ set s3 [socket -server "accept 4005" 4005]
proc accept {mp s a p} {
puts $s $mp
close $s
}
- list [getPort $s1] [getPort $s2] [getPort $s3]
- }] p1 p2 p3
-} -constraints [list socket supported_$af doTestsWithRemoteServer] -body {
- set s1 [socket $remoteServerIP $p1]
- set s2 [socket $remoteServerIP $p2]
- set s3 [socket $remoteServerIP $p3]
- list [gets $s1] [gets $s1] [eof $s1] [gets $s2] [gets $s2] [eof $s2] \
+ }
+ set s1 [socket $remoteServerIP 4003]
+ set s2 [socket $remoteServerIP 4004]
+ set s3 [socket $remoteServerIP 4005]
+ set l ""
+ lappend l [gets $s1] [gets $s1] [eof $s1] [gets $s2] [gets $s2] [eof $s2] \
[gets $s3] [gets $s3] [eof $s3]
-} -cleanup {
close $s1
close $s2
close $s3
@@ -1320,56 +1257,55 @@ test socket_$af-11.8 {client with several servers} -setup {
close $s2
close $s3
}
-} -result {server1 {} 1 server2 {} 1 server3 {} 1}
-test socket_$af-11.9 {accept callback error} -constraints [list socket supported_$af doTestsWithRemoteServer] -setup {
+ set l
+} {4003 {} 1 4004 {} 1 4005 {} 1}
+test socket-11.9 {accept callback error} -constraints {
+ socket doTestsWithRemoteServer
+} -setup {
proc myHandler {msg options} {
variable x $msg
}
set handler [interp bgerror {}]
interp bgerror {} [namespace which myHandler]
- set timer [after 10000 "set x timed_out"]
} -body {
- set s [socket -server accept 0]
- proc accept {s a p} {expr {10 / 0}}
- sendCommand "set port [getPort $s]"
- if {[catch {
- sendCommand {
+ set s [socket -server accept 2836]
+ proc accept {s a p} {expr 10 / 0}
+ if {[catch {sendCommand {
set peername [fconfigure $callerSocket -peername]
- set s [socket [lindex $peername 0] $port]
+ set s [socket [lindex $peername 0] 2836]
close $s
- }
- } msg]} then {
+ }} msg]} {
close $s
error $msg
}
+ set timer [after 10000 "set x timed_out"]
vwait x
- return $x
-} -cleanup {
- close $s
after cancel $timer
+ close $s
+ set x
+} -cleanup {
interp bgerror {} $handler
} -result {divide by zero}
-test socket_$af-11.10 {testing socket specific options} -setup {
- set port [sendCommand {
- set server [socket -server accept 0]
+test socket-11.10 {testing socket specific options} {socket doTestsWithRemoteServer} {
+ sendCommand {
+ set socket10_12_test_server [socket -server accept 2836]
proc accept {s a p} {close $s}
- getPort $server
- }]
-} -constraints [list socket supported_$af doTestsWithRemoteServer] -body {
- set s [socket $remoteServerIP $port]
+ }
+ set s [socket $remoteServerIP 2836]
set p [fconfigure $s -peername]
set n [fconfigure $s -sockname]
- list [expr {[lindex $p 2] == $port}] [llength $p] [llength $n]
-} -cleanup {
+ set l ""
+ lappend l [lindex $p 2] [llength $p] [llength $p]
close $s
- sendCommand {close $server}
-} -result {1 3 3}
-test socket_$af-11.11 {testing spurious events} -setup {
- set port [sendCommand {
- set server [socket -server accept 0]
+ sendCommand {close $socket10_12_test_server}
+ set l
+} {2836 3 3}
+test socket-11.11 {testing spurious events} {socket doTestsWithRemoteServer} {
+ sendCommand {
+ set socket10_13_test_server [socket -server accept 2836]
proc accept {s a p} {
fconfigure $s -translation "auto lf"
- after idle writesome $s
+ after 100 writesome $s
}
proc writesome {s} {
for {set i 0} {$i < 100} {incr i} {
@@ -1377,13 +1313,10 @@ test socket_$af-11.11 {testing spurious events} -setup {
}
close $s
}
- getPort $server
- }]
+ }
set len 0
set spurious 0
set done 0
- set timer [after 40000 "set done timed_out"]
-} -constraints [list socket supported_$af doTestsWithRemoteServer] -body {
proc readlittle {s} {
global spurious done len
set l [read $s 1]
@@ -1398,52 +1331,59 @@ test socket_$af-11.11 {testing spurious events} -setup {
incr len [string length $l]
}
}
- set c [socket $remoteServerIP $port]
+ set c [socket $remoteServerIP 2836]
fileevent $c readable "readlittle $c"
+ set timer [after 40000 "set done timed_out"]
vwait done
- list $spurious $len $done
-} -cleanup {
after cancel $timer
- sendCommand {close $server}
-} -result {0 2690 1}
-test socket_$af-11.12 {testing EOF stickyness} -constraints [list socket supported_$af doTestsWithRemoteServer] -setup {
+ sendCommand {close $socket10_13_test_server}
+ list $spurious $len $done
+} {0 2690 1}
+test socket-11.12 {testing EOF stickyness} {socket doTestsWithRemoteServer} {
set counter 0
set done 0
- set port [sendCommand {
- set server [socket -server accept 0]
- proc accept {s a p} {
- after idle close $s
- }
- getPort $server
- }]
- proc timed_out {} {
- global c done
- set done {timed_out, EOF is not sticky}
- close $c
- }
- set after_id [after 1000 timed_out]
-} -body {
proc count_up {s} {
- global counter done
+ global counter done after_id
set l [gets $s]
if {[eof $s]} {
incr counter
if {$counter > 9} {
set done {EOF is sticky}
+ after cancel $after_id
close $s
}
}
}
- set c [socket $remoteServerIP $port]
+ proc timed_out {} {
+ global c done
+ set done {timed_out, EOF is not sticky}
+ close $c
+ }
+ sendCommand {
+ set socket10_14_test_server [socket -server accept 2836]
+ proc accept {s a p} {
+ after 100 close $s
+ }
+ }
+ set c [socket $remoteServerIP 2836]
fileevent $c readable [list count_up $c]
+ set after_id [after 1000 timed_out]
vwait done
- return $done
-} -cleanup {
- after cancel $after_id
- sendCommand {close $server}
-} -result {EOF is sticky}
-test socket_$af-11.13 {testing async write, async flush, async close} -setup {
- set port [sendCommand {
+ sendCommand {close $socket10_14_test_server}
+ set done
+} {EOF is sticky}
+test socket-11.13 {testing async write, async flush, async close} \
+ {socket doTestsWithRemoteServer} {
+ proc readit {s} {
+ global count done
+ set l [read $s]
+ incr count [string length $l]
+ if {[eof $s]} {
+ close $s
+ set done 1
+ }
+ }
+ sendCommand {
set firstblock ""
for {set i 0} {$i < 5} {incr i} {
set firstblock "a$firstblock$firstblock"
@@ -1452,7 +1392,7 @@ test socket_$af-11.13 {testing async write, async flush, async close} -setup {
for {set i 0} {$i < 16} {incr i} {
set secondblock "b$secondblock$secondblock"
}
- set l [socket -server accept 0]
+ set l [socket -server accept 2845]
proc accept {s a p} {
fconfigure $s -blocking 0 -translation lf -buffersize 16384 \
-buffering line
@@ -1461,138 +1401,143 @@ test socket_$af-11.13 {testing async write, async flush, async close} -setup {
proc readable {s} {
set l [gets $s]
fileevent $s readable {}
- after idle respond $s
+ after 1000 respond $s
}
proc respond {s} {
global firstblock
puts -nonewline $s $firstblock
- after idle writedata $s
+ after 1000 writedata $s
}
proc writedata {s} {
global secondblock
puts -nonewline $s $secondblock
close $s
}
- getPort $l
- }]
- set timer [after 10000 "set done timed_out"]
-} -constraints [list socket supported_$af doTestsWithRemoteServer] -body {
- proc readit {s} {
- global count done
- set l [read $s]
- incr count [string length $l]
- if {[eof $s]} {
- close $s
- set done 1
- }
}
- set s [socket $remoteServerIP $port]
+ set s [socket $remoteServerIP 2845]
fconfigure $s -blocking 0 -trans lf -buffering line
set count 0
puts $s hello
fileevent $s readable "readit $s"
+ set timer [after 10000 "set done timed_out"]
vwait done
- return $count
-} -cleanup {
after cancel $timer
sendCommand {close $l}
-} -result 65566
+ set count
+} 65566
set path(script1) [makeFile {} script1]
set path(script2) [makeFile {} script2]
-test socket_$af-12.1 {testing inheritance of server sockets} -setup {
+test socket-12.1 {testing inheritance of server sockets} {socket stdio exec} {
file delete $path(script1)
file delete $path(script2)
- # Script1 is just a 10 second delay. If the server socket is inherited, it
- # will be held open for 10 seconds
+
+ # Script1 is just a 10 second delay. If the server socket
+ # is inherited, it will be held open for 10 seconds
+
set f [open $path(script1) w]
puts $f {
- fileevent stdin readable exit
after 10000 exit
vwait forever
}
close $f
- # Script2 creates the server socket, launches script1, and exits.
- # The server socket will now be closed unless script1 inherited it.
+
+ # Script2 creates the server socket, launches script1,
+ # waits a second, and exits. The server socket will now
+ # be closed unless script1 inherited it.
+
set f [open $path(script2) w]
puts $f [list set tcltest [interpreter]]
- puts $f [list set delay $path(script1)]
- puts $f [list set localhost $localhost]
- puts $f {
- set f [socket -server accept -myaddr $localhost 0]
+ puts -nonewline $f {
+ set f [socket -server accept -myaddr 127.0.0.1 0]
+ puts [lindex [fconfigure $f -sockname] 2]
proc accept { file addr port } {
close $file
}
- exec $tcltest $delay &
- puts [lindex [fconfigure $f -sockname] 2]
+ exec $tcltest }
+ puts $f [list $path(script1) &]
+ puts $f {
close $f
- exit
+ after 1000 exit
+ vwait forever
}
close $f
-} -constraints [list socket supported_$af stdio exec] -body {
+
# Launch script2 and wait 5 seconds
+
### exec [interpreter] script2 &
set p [open "|[list [interpreter] $path(script2)]" r]
+ gets $p listen
+
+ after 5000 { set ok_to_proceed 1 }
+ vwait ok_to_proceed
+
# If we can still connect to the server, the socket got inherited.
- if {[catch {close [socket $localhost $listen]}]} {
- return {server socket was not inherited}
+
+ if {[catch {socket 127.0.0.1 $listen} msg]} {
+ set x {server socket was not inherited}
} else {
- return {server socket was inherited}
+ close $msg
+ set x {server socket was inherited}
}
-} -cleanup {
- catch {close $p}
-} -result {server socket was not inherited}
-test socket_$af-12.2 {testing inheritance of client sockets} -setup {
+
+ close $p
+ set x
+} {server socket was not inherited}
+test socket-12.2 {testing inheritance of client sockets} {socket stdio exec} {
file delete $path(script1)
file delete $path(script2)
- # Script1 is just a 20 second delay. If the server socket is inherited, it
- # will be held open for 20 seconds
+
+ # Script1 is just a 20 second delay. If the server socket
+ # is inherited, it will be held open for 10 seconds
+
set f [open $path(script1) w]
puts $f {
- fileevent stdin readable exit
after 20000 exit
vwait forever
}
close $f
- # Script2 opens the client socket and writes to it. It then launches
- # script1 and exits. If the child process inherited the client socket, the
- # socket will still be open.
+
+ # Script2 opens the client socket and writes to it. It then
+ # launches script1 and exits. If the child process inherited the
+ # client socket, the socket will still be open.
+
set f [open $path(script2) w]
puts $f [list set tcltest [interpreter]]
- puts $f [list set delay $path(script1)]
- puts $f [list set localhost $localhost]
- puts $f {
+ puts -nonewline $f {
gets stdin port
- set f [socket $localhost $port]
- exec $tcltest $delay &
+ set f [socket 127.0.0.1 $port]
+ exec $tcltest }
+ puts $f [list $path(script1) &]
+ puts $f {
puts $f testing
flush $f
- exit
+ after 1000 exit
+ vwait forever
}
close $f
- # If the socket doesn't hit end-of-file in 10 seconds, the script1 process
- # must have inherited the client.
- set failed 0
- set after [after 10000 [list set failed 1]]
-} -constraints [list socket supported_$af stdio exec] -body {
+
# Create the server socket
- set server [socket -server accept -myaddr $localhost 0]
+
+ set server [socket -server accept -myaddr 127.0.0.1 0]
proc accept { file host port } {
# When the client connects, establish the read handler
global server
close $server
fileevent $file readable [list getdata $file]
fconfigure $file -buffering line -blocking 0
+ return
}
proc getdata { file } {
# Read handler on the accepted socket.
- global x failed
+ global x
+ global failed
set status [catch {read $file} data]
if {$status != 0} {
set x {read failed, error was $data}
catch { close $file }
- } elseif {$data ne ""} {
+ } elseif {[string compare {} $data]} {
} elseif {[fblocked $file]} {
} elseif {[eof $file]} {
if {$failed} {
@@ -1605,56 +1550,80 @@ test socket_$af-12.2 {testing inheritance of client sockets} -setup {
set x {impossible case}
catch { close $file }
}
+ return
}
+
+ # If the socket doesn't hit end-of-file in 10 seconds, the
+ # script1 process must have inherited the client.
+
+ set failed 0
+ after 10000 [list set failed 1]
+
# Launch the script2 process
### exec [interpreter] script2 &
+
set p [open "|[list [interpreter] $path(script2)]" w]
puts $p [lindex [fconfigure $server -sockname] 2] ; flush $p
+
vwait x
- return $x
-} -cleanup {
- after cancel $after
+ if {!$failed} {
+ vwait failed
+ }
close $p
-} -result {client socket was not inherited}
-test socket_$af-12.3 {testing inheritance of accepted sockets} -setup {
+ set x
+} {client socket was not inherited}
+test socket-12.3 {testing inheritance of accepted sockets} {socket stdio exec} {
file delete $path(script1)
file delete $path(script2)
+
set f [open $path(script1) w]
puts $f {
- fileevent stdin readable exit
after 10000 exit
vwait forever
}
close $f
+
set f [open $path(script2) w]
puts $f [list set tcltest [interpreter]]
- puts $f [list set delay $path(script1)]
- puts $f [list set localhost $localhost]
- puts $f {
- set server [socket -server accept -myaddr $localhost 0]
- proc accept { file host port } {
- global tcltest delay
+ puts -nonewline $f {
+ set server [socket -server accept -myaddr 127.0.0.1 0]
+ puts stdout [lindex [fconfigure $server -sockname] 2]
+ proc accept { file host port } }
+ puts $f \{
+ puts -nonewline $f {
+ global tcltest
puts $file {test data on socket}
- exec $tcltest $delay &
- after idle exit
+ exec $tcltest }
+ puts $f [list $path(script1) &]
+ puts $f {
+ after 1000 exit
}
- puts stdout [lindex [fconfigure $server -sockname] 2]
+ puts $f \}
+ puts $f {
vwait forever
}
close $f
-} -constraints [list socket supported_$af stdio exec] -body {
- # Launch the script2 process and connect to it. See how long the socket
- # stays open
+
+ # Launch the script2 process and connect to it. See how long
+ # the socket stays open
+
## exec [interpreter] script2 &
set p [open "|[list [interpreter] $path(script2)]" r]
gets $p listen
- set f [socket $localhost $listen]
+
+ after 1000 set ok_to_proceed 1
+ vwait ok_to_proceed
+
+ set f [socket 127.0.0.1 $listen]
fconfigure $f -buffering full -blocking 0
fileevent $f readable [list getdata $f]
- # If the socket is still open after 5 seconds, the script1 process must
- # have inherited the accepted socket.
+
+ # If the socket is still open after 5 seconds, the script1 process
+ # must have inherited the accepted socket.
+
set failed 0
- set after [after 5000 [list set failed 1]]
+ after 5000 set failed 1
+
proc getdata { file } {
# Read handler on the client socket.
global x
@@ -1678,17 +1647,18 @@ test socket_$af-12.3 {testing inheritance of accepted sockets} -setup {
}
return
}
+
vwait x
- return $x
-} -cleanup {
- after cancel $after
- catch {close $p}
-} -result {accepted socket was not inherited}
-test socket_$af-13.1 {Testing use of shared socket between two threads} -body {
- # create a thread
- set serverthread [thread::create -preserved [string map [list @localhost@ $localhost] {
- set f [socket -server accept -myaddr @localhost@ 0]
+ close $p
+ set x
+} {accepted socket was not inherited}
+
+test socket-13.1 {Testing use of shared socket between two threads} \
+ -constraints {socket testthread} -setup {
+ threadReap
+ set path(script) [makeFile {
+ set f [socket -server accept -myaddr 127.0.0.1 0]
set listen [lindex [fconfigure $f -sockname] 2]
proc accept {s a p} {
fileevent $s readable [list echo $s]
@@ -1709,502 +1679,43 @@ test socket_$af-13.1 {Testing use of shared socket between two threads} -body {
set i 0
vwait x
close $f
- thread::wait
- }]]
- set port [thread::send $serverthread {set listen}]
- set s [socket $localhost $port]
+ # thread cleans itself up.
+ testthread exit
+ } script]
+} -body {
+ # create a thread
+ set serverthread [testthread create [list source $path(script) ] ]
+ update
+ set port [testthread send $serverthread {set listen}]
+ update
+
+ after 1000
+ set s [socket 127.0.0.1 $port]
fconfigure $s -buffering line
+
catch {
puts $s "hello"
gets $s result
}
close $s
- thread::release $serverthread
- append result " " [llength [thread::names]]
-} -result {hello 1} -constraints [list socket supported_$af thread]
-
-# ----------------------------------------------------------------------
+ update
+
+ after 2000
+ lappend result [threadReap]
+} -cleanup {
+ removeFile script
+} -result {hello 1}
removeFile script1
removeFile script2
# cleanup
-if {$remoteProcChan ne ""} {
- catch {sendCommand exit}
+if {[string match sock* $commandSocket] == 1} {
+ puts $commandSocket exit
+ flush $commandSocket
}
catch {close $commandSocket}
catch {close $remoteProcChan}
-}
-unset ::tcl::unsupported::socketAF
-test socket-14.0.0 {[socket -async] when server only listens on IPv4} \
- -constraints [list socket supported_any localhost_v4] \
- -setup {
- proc accept {s a p} {
- global x
- puts $s bye
- close $s
- set x ok
- }
- set server [socket -server accept -myaddr 127.0.0.1 0]
- set port [lindex [fconfigure $server -sockname] 2]
- } -body {
- set client [socket -async localhost $port]
- set after [after $latency {set x [fconfigure $client -error]}]
- vwait x
- set x
- } -cleanup {
- after cancel $after
- close $server
- close $client
- unset x
- } -result ok
-test socket-14.0.1 {[socket -async] when server only listens on IPv6} \
- -constraints [list socket supported_any localhost_v6] \
- -setup {
- proc accept {s a p} {
- global x
- puts $s bye
- close $s
- set x ok
- }
- set server [socket -server accept -myaddr ::1 0]
- set port [lindex [fconfigure $server -sockname] 2]
- } -body {
- set client [socket -async localhost $port]
- set after [after $latency {set x [fconfigure $client -error]}]
- vwait x
- set x
- } -cleanup {
- after cancel $after
- close $server
- close $client
- unset x
- } -result ok
-test socket-14.1 {[socket -async] fileevent while still connecting} \
- -constraints [list socket supported_any] \
- -setup {
- proc accept {s a p} {
- global x
- puts $s bye
- close $s
- lappend x ok
- }
- set server [socket -server accept -myaddr localhost 0]
- set port [lindex [fconfigure $server -sockname] 2]
- set x ""
- } -body {
- set client [socket -async localhost $port]
- fileevent $client writable {
- lappend x [fconfigure $client -error]
- fileevent $client writable {}
- }
- set after [after $latency {lappend x timeout}]
- while {[llength $x] < 2 && "timeout" ni $x} {
- vwait x
- }
- lsort $x; # we only want to see both events, the order doesn't matter
- } -cleanup {
- after cancel $after
- close $server
- close $client
- unset x
- } -result {{} ok}
-test socket-14.2 {[socket -async] fileevent connection refused} \
- -constraints [list socket supported_any] \
- -body {
- set client [socket -async localhost [randport]]
- fileevent $client writable {set x ok}
- set after [after $latency {set x timeout}]
- vwait x
- after cancel $after
- lappend x [fconfigure $client -error]
- } -cleanup {
- after cancel $after
- close $client
- unset x after client
- } -result {ok {connection refused}}
-test socket-14.3 {[socket -async] when server only listens on IPv6} \
- -constraints [list socket supported_any localhost_v6] \
- -setup {
- proc accept {s a p} {
- global x
- puts $s bye
- close $s
- set x ok
- }
- set server [socket -server accept -myaddr ::1 0]
- set port [lindex [fconfigure $server -sockname] 2]
- } -body {
- set client [socket -async localhost $port]
- set after [after $latency {set x [fconfigure $client -error]}]
- vwait x
- set x
- } -cleanup {
- after cancel $after
- close $server
- close $client
- unset x
- } -result ok
-test socket-14.4 {[socket -async] and both, readdable and writable fileevents} \
- -constraints [list socket supported_any] \
- -setup {
- proc accept {s a p} {
- puts $s bye
- close $s
- }
- set server [socket -server accept -myaddr localhost 0]
- set port [lindex [fconfigure $server -sockname] 2]
- set x ""
- } -body {
- set client [socket -async localhost $port]
- fileevent $client writable {
- lappend x [fconfigure $client -error]
- fileevent $client writable {}
- }
- fileevent $client readable {lappend x [gets $client]}
- set after [after $latency {lappend x timeout}]
- while {[llength $x] < 2 && "timeout" ni $x} {
- vwait x
- }
- lsort $x
- } -cleanup {
- after cancel $after
- close $client
- close $server
- unset x
- } -result {{} bye}
-test socket-14.5 {[socket -async] which fails before any connect() can be made} \
- -constraints [list socket supported_any] \
- -body {
- # address from rfc5737
- socket -async -myaddr 192.0.2.42 127.0.0.1 [randport]
- } \
- -returnCodes 1 \
- -result {couldn't open socket: cannot assign requested address}
-test socket-14.6.0 {[socket -async] with no event loop and server listening on IPv4} \
- -constraints [list socket supported_inet supported_inet6] \
- -setup {
- proc accept {s a p} {
- global x
- puts $s bye
- close $s
- set x ok
- }
- set server [socket -server accept -myaddr 127.0.0.1 0]
- set port [lindex [fconfigure $server -sockname] 2]
- set x ""
- } \
- -body {
- set client [socket -async localhost $port]
- for {set i 0} {$i < 50} {incr i } {
- update
- if {$x ne ""} {
- lappend x [gets $client]
- break
- }
- after 100
- }
- set x
- } \
- -cleanup {
- close $server
- close $client
- unset x
- } \
- -result {ok bye}
-test socket-14.6.1 {[socket -async] with no event loop and server listening on IPv6} \
- -constraints [list socket supported_inet supported_inet6] \
- -setup {
- proc accept {s a p} {
- global x
- puts $s bye
- close $s
- set x ok
- }
- set server [socket -server accept -myaddr ::1 0]
- set port [lindex [fconfigure $server -sockname] 2]
- set x ""
- } \
- -body {
- set client [socket -async localhost $port]
- for {set i 0} {$i < 50} {incr i } {
- update
- if {$x ne ""} {
- lappend x [gets $client]
- break
- }
- after 100
- }
- set x
- } \
- -cleanup {
- close $server
- close $client
- unset x
- } \
- -result {ok bye}
-test socket-14.7.0 {pending [socket -async] and blocking [gets], server is IPv4} \
- -constraints {socket supported_inet supported_inet6} \
- -setup {
- makeFile {
- set server [socket -server accept -myaddr 127.0.0.1 0]
- proc accept {s h p} {puts $s ok; close $s; set ::x 1}
- puts [lindex [fconfigure $server -sockname] 2]
- flush stdout
- vwait x
- } script
- set fd [open |[list [interpreter] script] RDWR]
- set port [gets $fd]
- } -body {
- set sock [socket -async localhost $port]
- list [fconfigure $sock -error] [gets $sock] [fconfigure $sock -error]
- } -cleanup {
- # make sure the server exits
- catch {socket 127.0.0.1 $port}
- close $sock
- close $fd
- } -result {{} ok {}}
-test socket-14.7.1 {pending [socket -async] and blocking [gets], server is IPv6} \
- -constraints {socket supported_inet supported_inet6} \
- -setup {
- makeFile {
- set server [socket -server accept -myaddr ::1 0]
- proc accept {s h p} {puts $s ok; close $s; set ::x 1}
- puts [lindex [fconfigure $server -sockname] 2]
- flush stdout
- vwait x
- } script
- set fd [open |[list [interpreter] script] RDWR]
- set port [gets $fd]
- } -body {
- set sock [socket -async localhost $port]
- list [fconfigure $sock -error] [gets $sock] [fconfigure $sock -error]
- } -cleanup {
- # make sure the server exits
- catch {socket ::1 $port}
- close $sock
- close $fd
- } -result {{} ok {}}
-test socket-14.7.2 {pending [socket -async] and blocking [gets], no listener} \
- -constraints {socket supported_inet supported_inet6} \
- -body {
- set sock [socket -async localhost [randport]]
- catch {gets $sock} x
- list $x [fconfigure $sock -error]
- } -cleanup {
- close $sock
- } -match glob -result {{error reading "sock*": socket is not connected} {connection refused}}
-test socket-14.8.0 {pending [socket -async] and nonblocking [gets], server is IPv4} \
- -constraints {socket supported_inet supported_inet6} \
- -setup {
- makeFile {
- set server [socket -server accept -myaddr 127.0.0.1 0]
- proc accept {s h p} {puts $s ok; close $s; set ::x 1}
- puts [lindex [fconfigure $server -sockname] 2]
- flush stdout
- vwait x
- } script
- set fd [open |[list [interpreter] script] RDWR]
- set port [gets $fd]
- } -body {
- set sock [socket -async localhost $port]
- fconfigure $sock -blocking 0
- for {set i 0} {$i < 50} {incr i } {
- if {[catch {gets $sock} x] || $x ne "" || ![fblocked $sock]} break
- after 200
- }
- set x
- } -cleanup {
- # make sure the server exits
- catch {socket 127.0.0.1 $port}
- close $sock
- close $fd
- } -result {ok}
-test socket-14.8.1 {pending [socket -async] and nonblocking [gets], server is IPv6} \
- -constraints {socket supported_inet supported_inet6} \
- -setup {
- makeFile {
- set server [socket -server accept -myaddr ::1 0]
- proc accept {s h p} {puts $s ok; close $s; set ::x 1}
- puts [lindex [fconfigure $server -sockname] 2]
- flush stdout
- vwait x
- } script
- set fd [open |[list [interpreter] script] RDWR]
- set port [gets $fd]
- } -body {
- set sock [socket -async localhost $port]
- fconfigure $sock -blocking 0
- for {set i 0} {$i < 50} {incr i } {
- if {[catch {gets $sock} x] || $x ne "" || ![fblocked $sock]} break
- after 200
- }
- set x
- } -cleanup {
- # make sure the server exits
- catch {socket ::1 $port}
- close $sock
- close $fd
- } -result {ok}
-test socket-14.8.2 {pending [socket -async] and nonblocking [gets], no listener} \
- -constraints {socket supported_inet supported_inet6} \
- -body {
- set sock [socket -async localhost [randport]]
- fconfigure $sock -blocking 0
- for {set i 0} {$i < 50} {incr i } {
- if {[catch {gets $sock} x] || $x ne "" || ![fblocked $sock]} break
- after 200
- }
- fconfigure $sock -error
- } -cleanup {
- close $sock
- } -match glob -result {connection refused}
-test socket-14.9.0 {pending [socket -async] and blocking [puts], server is IPv4} \
- -constraints {socket supported_inet supported_inet6} \
- -setup {
- makeFile {
- set server [socket -server accept -myaddr 127.0.0.1 0]
- proc accept {s h p} {set ::x $s}
- puts [lindex [fconfigure $server -sockname] 2]
- flush stdout
- vwait x
- puts [gets $x]
- } script
- set fd [open |[list [interpreter] script] RDWR]
- set port [gets $fd]
- } -body {
- set sock [socket -async localhost $port]
- puts $sock ok
- flush $sock
- list [fconfigure $sock -error] [gets $fd]
- } -cleanup {
- # make sure the server exits
- catch {socket 127.0.0.1 $port}
- close $sock
- close $fd
- } -result {{} ok}
-test socket-14.9.1 {pending [socket -async] and blocking [puts], server is IPv6} \
- -constraints {socket supported_inet supported_inet6} \
- -setup {
- makeFile {
- set server [socket -server accept -myaddr ::1 0]
- proc accept {s h p} {set ::x $s}
- puts [lindex [fconfigure $server -sockname] 2]
- flush stdout
- vwait x
- puts [gets $x]
- } script
- set fd [open |[list [interpreter] script] RDWR]
- set port [gets $fd]
- } -body {
- set sock [socket -async localhost $port]
- puts $sock ok
- flush $sock
- list [fconfigure $sock -error] [gets $fd]
- } -cleanup {
- # make sure the server exits
- catch {socket ::1 $port}
- close $sock
- close $fd
- } -result {{} ok}
-test socket-14.10.0 {pending [socket -async] and blocking [puts], server is IPv4} \
- -constraints {socket supported_inet supported_inet6} \
- -setup {
- makeFile {
- set server [socket -server accept -myaddr 127.0.0.1 0]
- proc accept {s h p} {set ::x $s}
- puts [lindex [fconfigure $server -sockname] 2]
- flush stdout
- vwait x
- puts [gets $x]
- } script
- set fd [open |[list [interpreter] script] RDWR]
- set port [gets $fd]
- } -body {
- set sock [socket -async localhost $port]
- fconfigure $sock -blocking 0
- puts $sock ok
- flush $sock
- fileevent $fd readable {set x 1}
- vwait x
- list [fconfigure $sock -error] [gets $fd]
- } -cleanup {
- # make sure the server exits
- catch {socket 127.0.0.1 $port}
- close $sock
- close $fd
- } -result {{} ok}
-test socket-14.10.1 {pending [socket -async] and blocking [puts], server is IPv6} \
- -constraints {socket supported_inet supported_inet6} \
- -setup {
- makeFile {
- set server [socket -server accept -myaddr ::1 0]
- proc accept {s h p} {set ::x $s}
- puts [lindex [fconfigure $server -sockname] 2]
- flush stdout
- vwait x
- puts [gets $x]
- } script
- set fd [open |[list [interpreter] script] RDWR]
- set port [gets $fd]
- } -body {
- set sock [socket -async localhost $port]
- fconfigure $sock -blocking 0
- puts $sock ok
- flush $sock
- fileevent $fd readable {set x 1}
- vwait x
- list [fconfigure $sock -error] [gets $fd]
- } -cleanup {
- # make sure the server exits
- catch {socket ::1 $port}
- close $sock
- close $fd
- } -result {{} ok}
-test socket-14.11.0 {pending [socket -async] and blocking [puts], no listener, no flush} \
- -constraints {socket supported_inet supported_inet6} \
- -body {
- set sock [socket -async localhost [randport]]
- fconfigure $sock -blocking 0
- puts $sock ok
- fileevent $sock writable {set x 1}
- vwait x
- close $sock
- } -cleanup {
- } -result {broken pipe} -returnCodes 1
-test socket-14.11.1 {pending [socket -async] and blocking [puts], no listener, flush} \
- -constraints {socket supported_inet supported_inet6} \
- -body {
- set sock [socket -async localhost [randport]]
- fconfigure $sock -blocking 0
- puts $sock ok
- flush $sock
- fileevent $sock writable {set x 1}
- vwait x
- close $sock
- } -cleanup {
- unset x
- } -result {broken pipe} -returnCodes 1
-test socket-14.12 {[socket -async] background progress triggered by [fconfigure -error]} \
- -constraints {socket supported_inet supported_inet6} \
- -body {
- set s [socket -async localhost [randport]]
- for {set i 0} {$i < 50} {incr i} {
- set x [fconfigure $s -error]
- if {$x != ""} break
- after 200
- }
- set x
- } -cleanup {
- close $s
- unset x s
- } -result {connection refused}
-
::tcltest::cleanupTests
flush stdout
return
-
-# Local Variables:
-# mode: tcl
-# fill-column: 78
-# End: