| Ticket UUID: | f4efd0f591b6bbdcfaadf98179e282665bc60b9b | |||
| Title: | websocket testsuite is broken | |||
| Type: | Bug | Version: | 1.5 | |
| Submitter: | aku | Created on: | 2023-01-30 13:32:40 | |
| Subsystem: | websocket | Assigned To: | emmanuel | |
| Priority: | 7 High | Severity: | Severe | |
| Status: | Open | Last Modified: | 2023-07-17 10:02:34 | |
| Resolution: | None | Closed By: | nobody | |
| Closed on: | ||||
| Description: |
The websocket testsuite is broken. Three tests fails (1.3, 1.4, and 2.1). Investigation into the failure of 1.3 shows a mismatch of expectations somewhere (package implementation, or package tests). It is suspected that the other tests suffer from similar issues, maybe even the very same. The package uses the __-keepalive__ option to ensure that the HTTP socket is kept open for it to take over. This option however also instructs the underlying __http__ package that an any earlier open socket to the same destination can/should be reused. The failing test assumes that such a reuse will not happen, and thus fails, because reuse does happen. The mismatch can be in the test, with its assumption of non-reuse. It can also be seen in the implementation, which on the one hand asks for socket reuse, as a means of taking the socket over after initial communication, yet also not wanting reuse of such sockets after it has taken them over. The issue there is that the __http__ package is never informed of __websocket__ taking ownership for the socket from it. To `http` the connection still belongs to it, and is a valid target for reuse by future __geturl__ requests. | |||
| User Comments: |
pointsman added on 2023-07-17 10:02:34:
I see the something as aku (thoug not exactly the same) under linux. More specific, if I run
tclsh8.6 sak.tcl test run -v websocket
the tests 1.3 and 1.4 fail:
==== example-1.3 Open second websocket - require different socket FAILED
==== Contents of test case:
wsExpectHandler $expectNum
set ws2 [::websocket::open $wsUrl wsOutputHandler]
if {$ws1 eq $ws2} {
set res "Both sockets are $ws1"
} else {
set res "Sockets differ: $ws1 and $ws2"
}
---- Result was:
Both sockets are sock564c2ae56eb0
---- Result should have been (glob matching):
Sockets differ: *
==== example-1.3 FAILED
---- example-1.4 start
==== example-1.4 Open second websocket - usual server return FAILED
==== Contents of test case:
wsExpectHandler $expectNum
set ws2 [::websocket::open $wsUrl wsOutputHandler]
if {$ws1 eq $ws2} {
return -code error "Both sockets are $ws1"
}
wsSleep
wsResetSleep
wsSleep 1000
string map [list $ws2 SOCKET] $wsOutput
---- Result was:
Both sockets are sock564c2ae3d7d0
---- Result should have been (glob matching):
SOCKET connect {}
SOCKET text {Request served by *}
==== example-1.4 FAILED
The test 2.1 passes for me.
With Tcl 8.5.19 and with Tcl 9 (almost recent trunk) all tests passes.
kjnash added on 2023-02-17 12:41:07: (1) Using sak.tcl to run the tests Which platform and Tcl version has the bug? I cannot reproduce the bug. Building Tcl on Linux x86_64, and using sak.tcl to run the tests, all the tests pass. Testing Tcllib db549a5ec8. [tcllib]$ [tcllib]$ tclsh sak.tcl test shell add /usr/local/Tcl-8.6.13/bin/tclsh8.6 # official release 8.6.13 [tcllib]$ tclsh sak.tcl test shell add /usr/local/Tcl-8.6/bin/tclsh8.6 # core-8-6-branch 04cf08d26a [tcllib]$ tclsh sak.tcl test shell add /usr/local/Tcl-8.7/bin/tclsh8.7 # core-8-branch 6349e0c2e1 [tcllib]$ [tcllib]$ tclsh sak.tcl test run websocket [ ] Starting ...l/Tcl-8.7/bin/tclsh8.7 [* ] [8.6.13] websocket (2) Sourcing the test file in a Tcl interpreter. The websocket module loads other Tcllib modules. The sak.tcl script allows this by setting ::auto_path to include the modules directory of the Tcllib that is being tested. If the websocket.test script is modified to add the modules directory to ::auto_path, the tests also pass when sourcing the test file in a Tcl interpreter. I will commit this revision to websocket.test. However, I expect that this is not the cause of your test failures because it causes all tests to fail - the test script fails when loading package websocket, before individual tests are executed. | |||
Home
Blog
Docs
Downloads
Tickets
Timeline
Branches
Tags
Wiki