diff options
Diffstat (limited to 'tests/socket.test')
-rw-r--r-- | tests/socket.test | 1352 |
1 files changed, 590 insertions, 762 deletions
diff --git a/tests/socket.test b/tests/socket.test index 5542c09..0ae5abd 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,34 +63,12 @@ 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 latency [expr {($t2-$t1)*2}]; # doubled as a safety margin -unset t1 t2 s1 s2 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]} { @@ -99,7 +77,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]} { @@ -108,55 +86,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 "" @@ -170,7 +117,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]] \ @@ -180,7 +127,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 { @@ -207,7 +154,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]} { @@ -224,73 +172,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 { @@ -312,17 +258,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 { @@ -344,31 +296,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 @@ -376,26 +329,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]" @@ -412,18 +363,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 { @@ -445,28 +396,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 { @@ -497,18 +448,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} { @@ -536,11 +487,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} { @@ -550,30 +501,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 @@ -587,51 +538,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 @@ -641,22 +589,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 @@ -686,13 +633,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 @@ -706,17 +651,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 @@ -733,7 +677,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] @@ -751,7 +694,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 @@ -767,42 +710,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 } @@ -811,45 +764,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 { @@ -868,23 +802,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 @@ -899,46 +830,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 @@ -946,18 +870,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, @@ -966,31 +891,29 @@ 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_$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] @@ -1009,25 +932,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 @@ -1036,20 +958,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 @@ -1063,27 +984,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 @@ -1091,30 +1000,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 @@ -1122,64 +1042,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 @@ -1192,20 +1116,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 @@ -1218,33 +1140,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] @@ -1257,14 +1179,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 @@ -1274,31 +1194,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 @@ -1307,56 +1224,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} { @@ -1364,13 +1280,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] @@ -1385,52 +1298,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" @@ -1439,7 +1359,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 @@ -1448,138 +1368,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} { @@ -1592,56 +1517,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 @@ -1665,17 +1614,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] @@ -1696,165 +1646,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 {[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 1000 {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 1000 {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 { - if {[catch {socket -async localhost [randport]} client]} { - regexp {[^:]*: (.*)} $client -> x - } else { - fileevent $client writable {set x [fconfigure $client -error]} - set after [after 1000 {set x timeout}] - vwait x - after cancel $after - if {$x eq "timeout"} { - append x ": [fconfigure $client -error]" - } - close $client - } - set x - } -cleanup { - unset x - } -result "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 1000 {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 1000 {lappend x timeout}] - while {[llength $x] < 2 && "timeout" ni $x} { - vwait x - } - lsort $x - } -cleanup { - after cancel $after - close $client - close $server - } -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} ::tcltest::cleanupTests flush stdout return - -# Local Variables: -# mode: tcl -# fill-column: 78 -# End: |