os/persistentdata/persistentstorage/sqlite3api/TEST/TCL/tcldistribution/tests/socket.test
Update contrib.
1 # Commands tested in this file: socket.
3 # This file contains a collection of tests for one or more of the Tcl
4 # built-in commands. Sourcing this file into Tcl runs the tests and
5 # generates output for errors. No output means no errors were found.
7 # Copyright (c) 1994-1996 Sun Microsystems, Inc.
8 # Copyright (c) 1998-2000 Ajuba Solutions.
10 # See the file "license.terms" for information on usage and redistribution
11 # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
13 # RCS: @(#) $Id: socket.test,v 1.26.2.6 2006/03/16 00:35:59 andreas_kupries Exp $
15 # Running socket tests with a remote server:
16 # ------------------------------------------
18 # Some tests in socket.test depend on the existence of a remote server to
19 # which they connect. The remote server must be an instance of tcltest and it
20 # must run the script found in the file "remote.tcl" in this directory. You
21 # can start the remote server on any machine reachable from the machine on
22 # which you want to run the socket tests, by issuing:
24 # tcltest remote.tcl -port 2048 # Or choose another port number.
26 # If the machine you are running the remote server on has several IP
27 # interfaces, you can choose which interface the server listens on for
28 # connections by specifying the -address command line flag, so:
30 # tcltest remote.tcl -address your.machine.com
32 # These options can also be set by environment variables. On Unix, you can
33 # type these commands to the shell from which the remote server is started:
35 # shell% setenv serverPort 2048
36 # shell% setenv serverAddress your.machine.com
38 # and subsequently you can start the remote server with:
42 # to have it listen on port 2048 on the interface your.machine.com.
44 # When the server starts, it prints out a detailed message containing its
45 # configuration information, and it will block until killed with a Ctrl-C.
46 # Once the remote server exists, you can run the tests in socket.test with
47 # the server by setting two Tcl variables:
49 # % set remoteServerIP <name or address of machine on which server runs>
50 # % set remoteServerPort 2048
52 # These variables are also settable from the environment. On Unix, you can:
54 # shell% setenv remoteServerIP machine.where.server.runs
55 # shell% senetv remoteServerPort 2048
57 # The preamble of the socket.test file checks to see if the variables are set
58 # either in Tcl or in the environment; if they are, it attempts to connect to
59 # the server. If the connection is successful, the tests using the remote
60 # server will be performed; otherwise, it will attempt to start the remote
61 # server (via exec) on platforms that support this, on the local host,
62 # listening at port 2048. If all fails, a message is printed and the tests
63 # using the remote server are not performed.
65 package require tcltest 2
66 namespace import -force ::tcltest::*
68 # Some tests require the testthread and exec commands
69 testConstraint testthread [llength [info commands testthread]]
70 testConstraint exec [llength [info commands exec]]
72 # If remoteServerIP or remoteServerPort are not set, check in the
73 # environment variables for externally set values.
76 if {![info exists remoteServerIP]} {
77 if {[info exists env(remoteServerIP)]} {
78 set remoteServerIP $env(remoteServerIP)
81 if {![info exists remoteServerPort]} {
82 if {[info exists env(remoteServerIP)]} {
83 set remoteServerPort $env(remoteServerPort)
85 if {[info exists remoteServerIP]} {
86 set remoteServerPort 2048
92 # Check if we're supposed to do tests against the remote server
95 set doTestsWithRemoteServer 1
96 if {![info exists remoteServerIP] && ($tcl_platform(platform) != "macintosh")} {
97 set remoteServerIP 127.0.0.1
99 if {($doTestsWithRemoteServer == 1) && (![info exists remoteServerPort])} {
100 set remoteServerPort 2048
103 # Attempt to connect to a remote server if one is already running. If it
104 # is not running or for some other reason the connect fails, attempt to
105 # start the remote server on the local host listening on port 2048. This
106 # is only done on platforms that support exec (i.e. not on the Mac). On
107 # platforms that do not support exec, the remote server must be started
108 # by the user before running the tests.
110 set remoteProcChan ""
112 if {$doTestsWithRemoteServer} {
113 catch {close $commandSocket}
114 if {[catch {set commandSocket [socket $remoteServerIP \
115 $remoteServerPort]}] != 0} {
116 if {[info commands exec] == ""} {
117 set noRemoteTestReason "can't exec"
118 set doTestsWithRemoteServer 0
120 set remoteServerIP 127.0.0.1
121 # Be *extra* careful in case this file is sourced from
122 # a directory other than the current one...
123 set remoteFile [file join [pwd] [file dirname [info script]] \
125 if {[catch {set remoteProcChan \
126 [open "|[list [interpreter] $remoteFile \
128 -port $remoteServerPort \
129 -address $remoteServerIP]" \
133 if {[catch {set commandSocket [socket $remoteServerIP \
134 $remoteServerPort]} msg] == 0} {
135 fconfigure $commandSocket -translation crlf -buffering line
137 set noRemoteTestReason $msg
138 set doTestsWithRemoteServer 0
141 set noRemoteTestReason "$msg [interpreter]"
142 set doTestsWithRemoteServer 0
146 fconfigure $commandSocket -translation crlf -buffering line
150 # Some tests are run only if we are doing testing against a remote server.
151 set ::tcltest::testConstraints(doTestsWithRemoteServer) $doTestsWithRemoteServer
152 if {$doTestsWithRemoteServer == 0} {
153 if {[string first s $::tcltest::verbose] != -1} {
154 puts "Skipping tests with remote server. See tests/socket.test for"
155 puts "information on how to run remote server."
156 puts "Reason for not doing remote tests: $noRemoteTestReason"
161 # If we do the tests, define a command to send a command to the
165 if {$doTestsWithRemoteServer == 1} {
166 proc sendCommand {c} {
169 if {[eof $commandSocket]} {
170 error "remote server disappeared"
173 if {[catch {puts $commandSocket $c} msg]} {
174 error "remote server disappaered: $msg"
176 if {[catch {puts $commandSocket "--Marker--Marker--Marker--"} msg]} {
177 error "remote server disappeared: $msg"
182 set line [gets $commandSocket]
183 if {[eof $commandSocket]} {
184 error "remote server disappaered"
186 if {[string compare $line "--Marker--Marker--Marker--"] == 0} {
187 if {[string compare [lindex $resp 0] error] == 0} {
188 error [lindex $resp 1]
190 return [lindex $resp 1]
193 append resp $line "\n"
199 test socket-1.1 {arg parsing for socket command} {socket} {
200 list [catch {socket -server} msg] $msg
201 } {1 {no argument given for -server option}}
202 test socket-1.2 {arg parsing for socket command} {socket} {
203 list [catch {socket -server foo} msg] $msg
204 } {1 {wrong # args: should be either:
205 socket ?-myaddr addr? ?-myport myport? ?-async? host port
206 socket -server command ?-myaddr addr? port}}
207 test socket-1.3 {arg parsing for socket command} {socket} {
208 list [catch {socket -myaddr} msg] $msg
209 } {1 {no argument given for -myaddr option}}
210 test socket-1.4 {arg parsing for socket command} {socket} {
211 list [catch {socket -myaddr 127.0.0.1} msg] $msg
212 } {1 {wrong # args: should be either:
213 socket ?-myaddr addr? ?-myport myport? ?-async? host port
214 socket -server command ?-myaddr addr? port}}
215 test socket-1.5 {arg parsing for socket command} {socket} {
216 list [catch {socket -myport} msg] $msg
217 } {1 {no argument given for -myport option}}
218 test socket-1.6 {arg parsing for socket command} {socket} {
219 list [catch {socket -myport xxxx} msg] $msg
220 } {1 {expected integer but got "xxxx"}}
221 test socket-1.7 {arg parsing for socket command} {socket} {
222 list [catch {socket -myport 2522} msg] $msg
223 } {1 {wrong # args: should be either:
224 socket ?-myaddr addr? ?-myport myport? ?-async? host port
225 socket -server command ?-myaddr addr? port}}
226 test socket-1.8 {arg parsing for socket command} {socket} {
227 list [catch {socket -froboz} msg] $msg
228 } {1 {bad option "-froboz": must be -async, -myaddr, -myport, or -server}}
229 test socket-1.9 {arg parsing for socket command} {socket} {
230 list [catch {socket -server foo -myport 2521 3333} msg] $msg
231 } {1 {Option -myport is not valid for servers}}
232 test socket-1.10 {arg parsing for socket command} {socket} {
233 list [catch {socket host 2528 -junk} msg] $msg
234 } {1 {wrong # args: should be either:
235 socket ?-myaddr addr? ?-myport myport? ?-async? host port
236 socket -server command ?-myaddr addr? port}}
237 test socket-1.11 {arg parsing for socket command} {socket} {
238 list [catch {socket -server callback 2520 --} msg] $msg
239 } {1 {wrong # args: should be either:
240 socket ?-myaddr addr? ?-myport myport? ?-async? host port
241 socket -server command ?-myaddr addr? port}}
242 test socket-1.12 {arg parsing for socket command} {socket} {
243 list [catch {socket foo badport} msg] $msg
244 } {1 {expected integer but got "badport"}}
245 test socket-1.13 {arg parsing for socket command} {socket} {
246 list [catch {socket -async -server} msg] $msg
247 } {1 {cannot set -async option for server sockets}}
248 test socket-1.14 {arg parsing for socket command} {socket} {
249 list [catch {socket -server foo -async} msg] $msg
250 } {1 {cannot set -async option for server sockets}}
252 set path(script) [makeFile {} script]
254 test socket-2.1 {tcp connection} {socket stdio} {
255 file delete $path(script)
256 set f [open $path(script) w]
258 set timer [after 10000 "set x timed_out"]
259 set f [socket -server accept 0]
260 proc accept {file addr port} {
266 puts [lindex [fconfigure $f -sockname] 2]
273 set f [open "|[list [interpreter] $path(script)]" r]
276 if {[catch {socket 127.0.0.1 $listen} msg]} {
287 if [info exists port] {
290 set port [expr 2048 + [pid]%1024]
292 test socket-2.2 {tcp connection with client port specified} {socket stdio} {
293 file delete $path(script)
294 set f [open $path(script) w]
296 set timer [after 10000 "set x timeout"]
297 set f [socket -server accept 0]
298 proc accept {file addr port} {
300 puts "[gets $file] $port"
305 puts [lindex [fconfigure $f -sockname] 2]
311 set f [open "|[list [interpreter] $path(script)]" r]
315 if {[catch {socket -myport $port 127.0.0.1 $listen} sock]} {
317 close [socket 127.0.0.1 $listen]
327 } [list ready "hello $port"]
328 test socket-2.3 {tcp connection with client interface specified} {socket stdio} {
329 file delete $path(script)
330 set f [open $path(script) w]
332 set timer [after 2000 "set x done"]
333 set f [socket -server accept 2830]
334 proc accept {file addr port} {
336 puts "[gets $file] $addr"
346 set f [open "|[list [interpreter] $path(script)]" r]
348 if {[catch {socket -myaddr 127.0.0.1 127.0.0.1 2830} sock]} {
358 } {ready {hello 127.0.0.1}}
359 test socket-2.4 {tcp connection with server interface specified} {socket stdio} {
360 file delete $path(script)
361 set f [open $path(script) w]
363 set timer [after 2000 "set x done"]
364 set f [socket -server accept -myaddr 127.0.0.1 0]
365 proc accept {file addr port} {
372 puts [lindex [fconfigure $f -sockname] 2]
378 set f [open "|[list [interpreter] $path(script)]" r]
381 if {[catch {socket 127.0.0.1 $listen} sock]} {
392 test socket-2.5 {tcp connection with redundant server port} {socket stdio} {
393 file delete $path(script)
394 set f [open $path(script) w]
396 set timer [after 10000 "set x timeout"]
397 set f [socket -server accept 0]
398 proc accept {file addr port} {
405 puts [lindex [fconfigure $f -sockname] 2]
411 set f [open "|[list [interpreter] $path(script)]" r]
414 if {[catch {socket 127.0.0.1 $listen} sock]} {
425 test socket-2.6 {tcp connection} {socket} {
427 if {![catch {set sock [socket 127.0.0.1 2833]}]} {
428 if {![catch {gets $sock}]} {
435 test socket-2.7 {echo server, one line} {socket stdio} {
436 file delete $path(script)
437 set f [open $path(script) w]
439 set timer [after 10000 "set x timeout"]
440 set f [socket -server accept 0]
441 proc accept {s a p} {
442 fileevent $s readable [list echo $s]
443 fconfigure $s -translation lf -buffering line
456 puts [lindex [fconfigure $f -sockname] 2]
463 set f [open "|[list [interpreter] $path(script)]" r]
466 set s [socket 127.0.0.1 $listen]
467 fconfigure $s -buffering line -translation lf
468 puts $s "hello abcdefghijklmnop"
475 } {{hello abcdefghijklmnop} done}
477 test socket-2.8 {echo server, loop 50 times, single connection} -constraints {socket stdio} -setup {
478 set path(script) [makeFile {
479 set f [socket -server accept 0]
480 proc accept {s a p} {
481 fileevent $s readable [list echo $s]
482 fconfigure $s -buffering line
498 puts [lindex [fconfigure $f -sockname] 2]
499 set timer [after 20000 "set x done"]
506 set f [open "|[list [interpreter] $path(script)]" r]
509 set s [socket 127.0.0.1 $listen]
510 fconfigure $s -buffering line
512 for {set x 0} {$x < 50} {incr x} {
513 puts $s "hello abcdefghijklmnop"
518 catch {set x [gets $f]}
524 set path(script) [makeFile {} script]
525 test socket-2.9 {socket conflict} {socket stdio} {
526 set s [socket -server accept 0]
527 file delete $path(script)
528 set f [open $path(script) w]
529 puts -nonewline $f "socket -server accept [lindex [fconfigure $s -sockname] 2]"
531 set f [open "|[list [interpreter] $path(script)]" r]
534 set x [list [catch {close $f} msg]]
535 regsub "\n.*$" $msg {} msg ; # cut part of the error message containing the port number
539 } {1 {couldn't open socket: address already in use}}
540 test socket-2.10 {close on accept, accepted socket lives} {socket} {
542 set timer [after 20000 "set done timed_out"]
543 set ss [socket -server accept 0]
544 proc accept {s a p} {
547 fileevent $s readable "readit $s"
548 fconfigure $s -trans lf
556 set cs [socket [info hostname] [lindex [fconfigure $ss -sockname] 2]]
563 test socket-2.11 {detecting new data} {socket} {
564 proc accept {s a p} {
569 set s [socket -server accept 0]
571 set s2 [socket 127.0.0.1 [lindex [fconfigure $s -sockname] 2]]
576 fconfigure $sock -blocking 0
577 set result a:[gets $sock]
578 lappend result b:[gets $sock]
579 fconfigure $sock -blocking 1
582 fconfigure $sock -blocking 0
583 lappend result c:[gets $sock]
584 fconfigure $sock -blocking 1
592 test socket-3.1 {socket conflict} {socket stdio} {
593 file delete $path(script)
594 set f [open $path(script) w]
596 set f [socket -server accept 0]
598 puts [lindex [fconfigure $f -sockname] 2]
603 set f [open "|[list [interpreter] $path(script)]" r+]
606 set x [list [catch {socket -server accept $listen} msg] \
611 } {1 {couldn't open socket: address already in use}}
612 test socket-3.2 {server with several clients} {socket stdio} {
613 file delete $path(script)
614 set f [open $path(script) w]
616 set t1 [after 30000 "set x timed_out"]
617 set t2 [after 31000 "set x timed_out"]
618 set t3 [after 32000 "set x timed_out"]
620 set s [socket -server accept 0]
621 proc accept {s a p} {
622 fileevent $s readable [list echo $s]
623 fconfigure $s -buffering line
636 puts [lindex [fconfigure $s -sockname] 2]
647 set f [open "|[list [interpreter] $path(script)]" r+]
650 set s1 [socket 127.0.0.1 $listen]
651 fconfigure $s1 -buffering line
652 set s2 [socket 127.0.0.1 $listen]
653 fconfigure $s2 -buffering line
654 set s3 [socket 127.0.0.1 $listen]
655 fconfigure $s3 -buffering line
656 for {set i 0} {$i < 100} {incr i} {
672 test socket-4.1 {server with several clients} {socket stdio} {
673 file delete $path(script)
674 set f [open $path(script) w]
676 set port [gets stdin]
677 set s [socket 127.0.0.1 $port]
678 fconfigure $s -buffering line
679 for {set i 0} {$i < 100} {incr i} {
688 set p1 [open "|[list [interpreter] $path(script)]" r+]
689 fconfigure $p1 -buffering line
690 set p2 [open "|[list [interpreter] $path(script)]" r+]
691 fconfigure $p2 -buffering line
692 set p3 [open "|[list [interpreter] $path(script)]" r+]
693 fconfigure $p3 -buffering line
694 proc accept {s a p} {
695 fconfigure $s -buffering line
696 fileevent $s readable [list echo $s]
708 set t1 [after 30000 "set x timed_out"]
709 set t2 [after 31000 "set x timed_out"]
710 set t3 [after 32000 "set x timed_out"]
711 set s [socket -server accept 0]
712 set listen [lindex [fconfigure $s -sockname] 2]
724 lappend l [list p1 [gets $p1] $x]
725 lappend l [list p2 [gets $p2] $x]
726 lappend l [list p3 [gets $p3] $x]
734 } {{p1 bye done} {p2 bye done} {p3 bye done}}
735 test socket-4.2 {byte order problems, socket numbers, htons} {socket} {
737 if {[catch {socket -server dodo 0x3000} msg]} {
745 test socket-5.1 {byte order problems, socket numbers, htons} \
746 {socket unixOnly notRoot} {
747 set x {couldn't open socket: not owner}
748 if {![catch {socket -server dodo 0x1} msg]} {
749 set x {htons problem, should be disallowed, are you running as SU?}
753 } {couldn't open socket: not owner}
754 test socket-5.2 {byte order problems, socket numbers, htons} {socket} {
755 set x {couldn't open socket: port number too high}
756 if {![catch {socket -server dodo 0x10000} msg]} {
757 set x {port resolution problem, should be disallowed}
761 } {couldn't open socket: port number too high}
762 test socket-5.3 {byte order problems, socket numbers, htons} \
763 {socket unixOnly notRoot} {
764 set x {couldn't open socket: not owner}
765 if {![catch {socket -server dodo 21} msg]} {
766 set x {htons problem, should be disallowed, are you running as SU?}
770 } {couldn't open socket: not owner}
772 test socket-6.1 {accept callback error} {socket stdio} {
773 file delete $path(script)
774 set f [open $path(script) w]
777 socket 127.0.0.1 $port
780 set f [open "|[list [interpreter] $path(script)]" r+]
785 proc accept {s a p} {expr 10 / 0}
786 set s [socket -server accept 0]
787 puts $f [lindex [fconfigure $s -sockname] 2]
789 set timer [after 10000 "set x timed_out"]
797 test socket-7.1 {testing socket specific options} {socket stdio} {
798 file delete $path(script)
799 set f [open $path(script) w]
801 set ss [socket -server accept 0]
807 puts [lindex [fconfigure $ss -sockname] 2]
808 set timer [after 10000 "set x timed_out"]
813 set f [open "|[list [interpreter] $path(script)]" r]
816 set s [socket 127.0.0.1 $listen]
817 set p [fconfigure $s -peername]
821 lappend l [string compare [lindex $p 0] 127.0.0.1]
822 lappend l [string compare [lindex $p 2] $listen]
823 lappend l [llength $p]
825 test socket-7.2 {testing socket specific options} {socket stdio} {
826 file delete $path(script)
827 set f [open $path(script) w]
829 set ss [socket -server accept 2821]
835 puts [lindex [fconfigure $ss -sockname] 2]
836 set timer [after 10000 "set x timed_out"]
841 set f [open "|[list [interpreter] $path(script)]" r]
844 set s [socket 127.0.0.1 $listen]
845 set p [fconfigure $s -sockname]
849 [regexp {^(127\.0\.0\.1|0\.0\.0\.0)$} [lindex $p 0]] \
850 [expr {[lindex $p 2] == $listen}]
852 test socket-7.3 {testing socket specific options} {socket} {
853 set s [socket -server accept 0]
854 set l [fconfigure $s]
859 test socket-7.4 {testing socket specific options} {socket} {
860 set s [socket -server accept 0]
861 proc accept {s a p} {
863 set x [fconfigure $s -sockname]
866 set listen [lindex [fconfigure $s -sockname] 2]
867 set s1 [socket [info hostname] $listen]
868 set timer [after 10000 "set x timed_out"]
874 lappend l [expr {[lindex $x 2] == $listen}] [llength $x]
876 test socket-7.5 {testing socket specific options} {socket unixOrPc} {
877 set s [socket -server accept 0]
878 proc accept {s a p} {
880 set x [fconfigure $s -sockname]
883 set listen [lindex [fconfigure $s -sockname] 2]
884 set s1 [socket 127.0.0.1 $listen]
885 set timer [after 10000 "set x timed_out"]
891 lappend l [lindex $x 0] [expr {[lindex $x 2] == $listen}] [llength $x]
894 test socket-8.1 {testing -async flag on sockets} {socket} {
895 # NOTE: This test may fail on some Solaris 2.4 systems. If it does,
896 # check that you have these patches installed (using showrev -p):
898 # 101907-05, 101925-02, 101945-14, 101959-03, 101969-05, 101973-03,
899 # 101977-03, 101981-02, 101985-01, 102001-03, 102003-01, 102007-01,
900 # 102011-02, 102024-01, 102039-01, 102044-01, 102048-01, 102062-03,
901 # 102066-04, 102070-01, 102105-01, 102153-03, 102216-01, 102232-01,
902 # 101878-03, 101879-01, 101880-03, 101933-01, 101950-01, 102030-01,
903 # 102057-08, 102140-01, 101920-02, 101921-09, 101922-07, 101923-03
905 # If after installing these patches you are still experiencing a
906 # problem, please email jyl@eng.sun.com. We have not observed this
907 # failure on Solaris 2.5, so another option (instead of installing
908 # these patches) is to upgrade to Solaris 2.5.
909 set s [socket -server accept 0]
910 proc accept {s a p} {
916 set s1 [socket -async [info hostname] [lindex [fconfigure $s -sockname] 2]]
924 test socket-9.1 {testing spurious events} {socket} {
928 proc readlittle {s} {
929 global spurious done len
931 if {[string length $l] == 0} {
939 incr len [string length $l]
942 proc accept {s a p} {
943 fconfigure $s -buffering none -blocking off
944 fileevent $s readable [list readlittle $s]
946 set s [socket -server accept 0]
947 set c [socket [info hostname] [lindex [fconfigure $s -sockname] 2]]
948 puts -nonewline $c 01234567890123456789012345678901234567890123456789
950 set timer [after 10000 "set done timed_out"]
956 test socket-9.2 {testing async write, fileevents, flush on close} {socket} {
958 for {set i 0} {$i < 5} {incr i} {set firstblock "a$firstblock$firstblock"}
960 for {set i 0} {$i < 16} {incr i} {
961 set secondblock "b$secondblock$secondblock"
963 set l [socket -server accept 0]
964 proc accept {s a p} {
965 fconfigure $s -blocking 0 -translation lf -buffersize 16384 \
967 fileevent $s readable "readable $s"
971 fileevent $s readable {}
972 after 1000 respond $s
976 puts -nonewline $s $firstblock
977 after 1000 writedata $s
981 puts -nonewline $s $secondblock
984 set s [socket [info hostname] [lindex [fconfigure $l -sockname] 2]]
985 fconfigure $s -blocking 0 -trans lf -buffering line
991 incr count [string length $l]
997 fileevent $s readable "readit $s"
998 set timer [after 10000 "set done timed_out"]
1004 test socket-9.3 {testing EOF stickyness} {socket} {
1005 proc count_to_eof {s} {
1006 global count done timer
1013 set count {eof is sticky}
1021 set count {timer went off, eof is not sticky}
1026 proc write_then_close {s} {
1030 proc accept {s a p} {
1031 fconfigure $s -buffering line -translation lf
1032 fileevent $s writable "write_then_close $s"
1034 set s [socket -server accept 0]
1035 set c [socket [info hostname] [lindex [fconfigure $s -sockname] 2]]
1036 fconfigure $c -blocking off -buffering line -translation lf
1037 fileevent $c readable "count_to_eof $c"
1038 set timer [after 1000 timerproc]
1046 test socket-10.1 {testing socket accept callback error handling} {socket} {
1048 proc bgerror args {global goterror; set goterror 1}
1049 set s [socket -server accept 0]
1050 proc accept {s a p} {close $s; error}
1051 set c [socket 127.0.0.1 [lindex [fconfigure $s -sockname] 2]]
1058 test socket-11.1 {tcp connection} {socket doTestsWithRemoteServer} {
1060 set socket9_1_test_server [socket -server accept 2834]
1061 proc accept {s a p} {
1066 set s [socket $remoteServerIP 2834]
1069 sendCommand {close $socket9_1_test_server}
1072 test socket-11.2 {client specifies its port} {socket doTestsWithRemoteServer} {
1073 if {[info exists port]} {
1076 set port [expr 2048 + [pid]%1024]
1079 set socket9_2_test_server [socket -server accept 2835]
1080 proc accept {s a p} {
1085 set s [socket -myport $port $remoteServerIP 2835]
1088 sendCommand {close $socket9_2_test_server}
1096 test socket-11.3 {trying to connect, no server} {socket doTestsWithRemoteServer} {
1098 if {![catch {set s [socket $remoteServerIp 2836]}]} {
1099 if {![catch {gets $s}]} {
1106 test socket-11.4 {remote echo, one line} {socket doTestsWithRemoteServer} {
1108 set socket10_6_test_server [socket -server accept 2836]
1109 proc accept {s a p} {
1110 fileevent $s readable [list echo $s]
1111 fconfigure $s -buffering line -translation crlf
1122 set f [socket $remoteServerIP 2836]
1123 fconfigure $f -translation crlf -buffering line
1127 sendCommand {close $socket10_6_test_server}
1130 test socket-11.5 {remote echo, 50 lines} {socket doTestsWithRemoteServer} {
1132 set socket10_7_test_server [socket -server accept 2836]
1133 proc accept {s a p} {
1134 fileevent $s readable [list echo $s]
1135 fconfigure $s -buffering line -translation crlf
1146 set f [socket $remoteServerIP 2836]
1147 fconfigure $f -translation crlf -buffering line
1148 for {set cnt 0} {$cnt < 50} {incr cnt} {
1149 puts $f "hello, $cnt"
1150 if {[string compare [gets $f] "hello, $cnt"] != 0} {
1155 sendCommand {close $socket10_7_test_server}
1158 # Macintosh sockets can have more than one server per port
1159 if {$tcl_platform(platform) == "macintosh"} {
1160 set conflictResult {0 2836}
1162 set conflictResult {1 {couldn't open socket: address already in use}}
1164 test socket-11.6 {socket conflict} {socket doTestsWithRemoteServer} {
1165 set s1 [socket -server accept 2836]
1166 if {[catch {set s2 [socket -server accept 2836]} msg]} {
1167 set result [list 1 $msg]
1169 set result [list 0 [lindex [fconfigure $s2 -sockname] 2]]
1175 test socket-11.7 {server with several clients} {socket doTestsWithRemoteServer} {
1177 set socket10_9_test_server [socket -server accept 2836]
1178 proc accept {s a p} {
1179 fconfigure $s -buffering line
1180 fileevent $s readable [list echo $s]
1191 set s1 [socket $remoteServerIP 2836]
1192 fconfigure $s1 -buffering line
1193 set s2 [socket $remoteServerIP 2836]
1194 fconfigure $s2 -buffering line
1195 set s3 [socket $remoteServerIP 2836]
1196 fconfigure $s3 -buffering line
1197 for {set i 0} {$i < 100} {incr i} {
1208 sendCommand {close $socket10_9_test_server}
1211 test socket-11.8 {client with several servers} {socket doTestsWithRemoteServer} {
1213 set s1 [socket -server "accept 4003" 4003]
1214 set s2 [socket -server "accept 4004" 4004]
1215 set s3 [socket -server "accept 4005" 4005]
1216 proc accept {mp s a p} {
1221 set s1 [socket $remoteServerIP 4003]
1222 set s2 [socket $remoteServerIP 4004]
1223 set s3 [socket $remoteServerIP 4005]
1225 lappend l [gets $s1] [gets $s1] [eof $s1] [gets $s2] [gets $s2] [eof $s2] \
1226 [gets $s3] [gets $s3] [eof $s3]
1236 } {4003 {} 1 4004 {} 1 4005 {} 1}
1237 test socket-11.9 {accept callback error} {socket doTestsWithRemoteServer} {
1238 set s [socket -server accept 2836]
1239 proc accept {s a p} {expr 10 / 0}
1244 if {[catch {sendCommand {
1245 set peername [fconfigure $callerSocket -peername]
1246 set s [socket [lindex $peername 0] 2836]
1252 set timer [after 10000 "set x timed_out"]
1258 } {{divide by zero}}
1259 test socket-11.10 {testing socket specific options} {socket doTestsWithRemoteServer} {
1261 set socket10_12_test_server [socket -server accept 2836]
1262 proc accept {s a p} {close $s}
1264 set s [socket $remoteServerIP 2836]
1265 set p [fconfigure $s -peername]
1266 set n [fconfigure $s -sockname]
1268 lappend l [lindex $p 2] [llength $p] [llength $p]
1270 sendCommand {close $socket10_12_test_server}
1273 test socket-11.11 {testing spurious events} {socket doTestsWithRemoteServer} {
1275 set socket10_13_test_server [socket -server accept 2836]
1276 proc accept {s a p} {
1277 fconfigure $s -translation "auto lf"
1278 after 100 writesome $s
1280 proc writesome {s} {
1281 for {set i 0} {$i < 100} {incr i} {
1282 puts $s "line $i from remote server"
1290 proc readlittle {s} {
1291 global spurious done len
1293 if {[string length $l] == 0} {
1301 incr len [string length $l]
1304 set c [socket $remoteServerIP 2836]
1305 fileevent $c readable "readlittle $c"
1306 set timer [after 40000 "set done timed_out"]
1309 sendCommand {close $socket10_13_test_server}
1310 list $spurious $len $done
1313 test socket-11.12 {testing EOF stickyness} {socket doTestsWithRemoteServer} {
1317 global counter done after_id
1322 set done {EOF is sticky}
1323 after cancel $after_id
1330 set done {timed_out, EOF is not sticky}
1334 set socket10_14_test_server [socket -server accept 2836]
1335 proc accept {s a p} {
1339 set c [socket $remoteServerIP 2836]
1340 fileevent $c readable [list count_up $c]
1341 set after_id [after 1000 timed_out]
1343 sendCommand {close $socket10_14_test_server}
1347 test socket-11.13 {testing async write, async flush, async close} \
1348 {socket doTestsWithRemoteServer} {
1352 incr count [string length $l]
1360 for {set i 0} {$i < 5} {incr i} {
1361 set firstblock "a$firstblock$firstblock"
1364 for {set i 0} {$i < 16} {incr i} {
1365 set secondblock "b$secondblock$secondblock"
1367 set l [socket -server accept 2845]
1368 proc accept {s a p} {
1369 fconfigure $s -blocking 0 -translation lf -buffersize 16384 \
1371 fileevent $s readable "readable $s"
1375 fileevent $s readable {}
1376 after 1000 respond $s
1380 puts -nonewline $s $firstblock
1381 after 1000 writedata $s
1383 proc writedata {s} {
1385 puts -nonewline $s $secondblock
1389 set s [socket $remoteServerIP 2845]
1390 fconfigure $s -blocking 0 -trans lf -buffering line
1393 fileevent $s readable "readit $s"
1394 set timer [after 10000 "set done timed_out"]
1397 sendCommand {close $l}
1401 set path(script1) [makeFile {} script1]
1402 set path(script2) [makeFile {} script2]
1404 test socket-12.1 {testing inheritance of server sockets} {socket stdio exec} {
1405 file delete $path(script1)
1406 file delete $path(script2)
1408 # Script1 is just a 10 second delay. If the server socket
1409 # is inherited, it will be held open for 10 seconds
1411 set f [open $path(script1) w]
1418 # Script2 creates the server socket, launches script1,
1419 # waits a second, and exits. The server socket will now
1420 # be closed unless script1 inherited it.
1422 set f [open $path(script2) w]
1423 puts $f [list set tcltest [interpreter]]
1424 puts -nonewline $f {
1425 set f [socket -server accept 0]
1426 puts [lindex [fconfigure $f -sockname] 2]
1427 proc accept { file addr port } {
1431 puts $f [list $path(script1) &]
1439 # Launch script2 and wait 5 seconds
1441 ### exec [interpreter] script2 &
1442 set p [open "|[list [interpreter] $path(script2)]" r]
1445 after 5000 { set ok_to_proceed 1 }
1448 # If we can still connect to the server, the socket got inherited.
1450 if {[catch {socket 127.0.0.1 $listen} msg]} {
1451 set x {server socket was not inherited}
1454 set x {server socket was inherited}
1459 } {server socket was not inherited}
1460 test socket-12.2 {testing inheritance of client sockets} {socket stdio exec} {
1461 file delete $path(script1)
1462 file delete $path(script2)
1464 # Script1 is just a 20 second delay. If the server socket
1465 # is inherited, it will be held open for 10 seconds
1467 set f [open $path(script1) w]
1474 # Script2 opens the client socket and writes to it. It then
1475 # launches script1 and exits. If the child process inherited the
1476 # client socket, the socket will still be open.
1478 set f [open $path(script2) w]
1479 puts $f [list set tcltest [interpreter]]
1480 puts -nonewline $f {
1482 set f [socket 127.0.0.1 $port]
1484 puts $f [list $path(script1) &]
1493 # Create the server socket
1495 set server [socket -server accept 0]
1496 proc accept { file host port } {
1497 # When the client connects, establish the read handler
1500 fileevent $file readable [list getdata $file]
1501 fconfigure $file -buffering line -blocking 0
1504 proc getdata { file } {
1505 # Read handler on the accepted socket.
1508 set status [catch {read $file} data]
1510 set x {read failed, error was $data}
1511 catch { close $file }
1512 } elseif {[string compare {} $data]} {
1513 } elseif {[fblocked $file]} {
1514 } elseif {[eof $file]} {
1516 set x {client socket was inherited}
1518 set x {client socket was not inherited}
1520 catch { close $file }
1522 set x {impossible case}
1523 catch { close $file }
1528 # If the socket doesn't hit end-of-file in 10 seconds, the
1529 # script1 process must have inherited the client.
1532 after 10000 [list set failed 1]
1534 # Launch the script2 process
1535 ### exec [interpreter] script2 &
1537 set p [open "|[list [interpreter] $path(script2)]" w]
1538 puts $p [lindex [fconfigure $server -sockname] 2] ; flush $p
1546 } {client socket was not inherited}
1547 test socket-12.3 {testing inheritance of accepted sockets} {socket stdio exec} {
1548 file delete $path(script1)
1549 file delete $path(script2)
1551 set f [open $path(script1) w]
1558 set f [open $path(script2) w]
1559 puts $f [list set tcltest [interpreter]]
1560 puts -nonewline $f {
1561 set server [socket -server accept 0]
1562 puts stdout [lindex [fconfigure $server -sockname] 2]
1563 proc accept { file host port } }
1565 puts -nonewline $f {
1567 puts $file {test data on socket}
1569 puts $f [list $path(script1) &]
1579 # Launch the script2 process and connect to it. See how long
1580 # the socket stays open
1582 ## exec [interpreter] script2 &
1583 set p [open "|[list [interpreter] $path(script2)]" r]
1586 after 1000 set ok_to_proceed 1
1589 set f [socket 127.0.0.1 $listen]
1590 fconfigure $f -buffering full -blocking 0
1591 fileevent $f readable [list getdata $f]
1593 # If the socket is still open after 5 seconds, the script1 process
1594 # must have inherited the accepted socket.
1597 after 5000 set failed 1
1599 proc getdata { file } {
1600 # Read handler on the client socket.
1603 set status [catch {read $file} data]
1605 set x {read failed, error was $data}
1606 catch { close $file }
1607 } elseif {[string compare {} $data]} {
1608 } elseif {[fblocked $file]} {
1609 } elseif {[eof $file]} {
1611 set x {accepted socket was inherited}
1613 set x {accepted socket was not inherited}
1615 catch { close $file }
1617 set x {impossible case}
1618 catch { close $file }
1627 } {accepted socket was not inherited}
1629 test socket-13.1 {Testing use of shared socket between two threads} \
1630 -constraints {socket testthread} -setup {
1634 set path(script) [makeFile {
1635 set f [socket -server accept 0]
1636 set listen [lindex [fconfigure $f -sockname] 2]
1637 proc accept {s a p} {
1638 fileevent $s readable [list echo $s]
1639 fconfigure $s -buffering line
1657 # thread cleans itself up.
1663 set serverthread [testthread create [list source $path(script) ] ]
1665 set port [testthread send $serverthread {set listen}]
1669 set s [socket 127.0.0.1 $port]
1670 fconfigure $s -buffering line
1680 lappend result [threadReap]
1689 if {[string match sock* $commandSocket] == 1} {
1690 puts $commandSocket exit
1691 flush $commandSocket
1693 catch {close $commandSocket}
1694 catch {close $remoteProcChan}
1695 ::tcltest::cleanupTests