summaryrefslogtreecommitdiffstats
path: root/src/testdir
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-02-18 22:23:34 +0100
committerBram Moolenaar <Bram@vim.org>2016-02-18 22:23:34 +0100
commit81661fb86801e6d6e5194b43dfd27d73fcc016ec (patch)
tree7aa3fcc1a790e4b97c17a2515950ac4fdd1e436d /src/testdir
parentec70bdd68a531762a62728747ab529d7a6dfc842 (diff)
patch 7.4.1351v7.4.1351
Problem: When the port isn't opened yet when ch_open() is called it may fail instead of waiting for the specified time. Solution: Loop when select() succeeds but when connect() failed. Also use channel logging for jobs. Add ch_log().
Diffstat (limited to 'src/testdir')
-rw-r--r--src/testdir/test_channel.py22
-rw-r--r--src/testdir/test_channel.vim52
2 files changed, 63 insertions, 11 deletions
diff --git a/src/testdir/test_channel.py b/src/testdir/test_channel.py
index ce6d5c16d4..ec231e8c89 100644
--- a/src/testdir/test_channel.py
+++ b/src/testdir/test_channel.py
@@ -9,6 +9,7 @@ from __future__ import print_function
import json
import socket
import sys
+import time
import threading
try:
@@ -158,9 +159,25 @@ class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
pass
+def writePortInFile(port):
+ # Write the port number in Xportnr, so that the test knows it.
+ f = open("Xportnr", "w")
+ f.write("{}".format(port))
+ f.close()
+
if __name__ == "__main__":
HOST, PORT = "localhost", 0
+ # Wait half a second before opening the port to test waittime in ch_open().
+ # We do want to get the port number, get that first. We cannot open the
+ # socket, guess a port is free.
+ if len(sys.argv) >= 2 and sys.argv[1] == 'delay':
+ PORT = 13684
+ writePortInFile(PORT)
+
+ print("Wait for it...")
+ time.sleep(0.5)
+
server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
ip, port = server.server_address
@@ -169,10 +186,7 @@ if __name__ == "__main__":
server_thread = threading.Thread(target=server.serve_forever)
server_thread.start()
- # Write the port number in Xportnr, so that the test knows it.
- f = open("Xportnr", "w")
- f.write("{}".format(port))
- f.close()
+ writePortInFile(port)
print("Listening on port {}".format(port))
diff --git a/src/testdir/test_channel.vim b/src/testdir/test_channel.vim
index 85a257ac2e..f6ec36b35d 100644
--- a/src/testdir/test_channel.vim
+++ b/src/testdir/test_channel.vim
@@ -31,17 +31,24 @@ endif
let s:chopt = {}
" Run "testfunc" after sarting the server and stop the server afterwards.
-func s:run_server(testfunc)
+func s:run_server(testfunc, ...)
" The Python program writes the port number in Xportnr.
call delete("Xportnr")
+ if a:0 == 1
+ let arg = ' ' . a:1
+ else
+ let arg = ''
+ endif
+ let cmd = s:python . " test_channel.py" . arg
+
try
if has('job')
- let s:job = job_start(s:python . " test_channel.py")
+ let s:job = job_start(cmd)
elseif has('win32')
- exe 'silent !start cmd /c start "test_channel" ' . s:python . ' test_channel.py'
+ exe 'silent !start cmd /c start "test_channel" ' . cmd
else
- exe 'silent !' . s:python . ' test_channel.py&'
+ exe 'silent !' . cmd . '&'
endif
" Wait for up to 2 seconds for the port number to be there.
@@ -175,6 +182,7 @@ func s:communicate(port)
endfunc
func Test_communicate()
+ call ch_log('Test_communicate()')
call s:run_server('s:communicate')
endfunc
@@ -203,6 +211,7 @@ func s:two_channels(port)
endfunc
func Test_two_channels()
+ call ch_log('Test_two_channels()')
call s:run_server('s:two_channels')
endfunc
@@ -220,6 +229,7 @@ func s:server_crash(port)
endfunc
func Test_server_crash()
+ call ch_log('Test_server_crash()')
call s:run_server('s:server_crash')
endfunc
@@ -248,6 +258,7 @@ func s:channel_handler(port)
endfunc
func Test_channel_handler()
+ call ch_log('Test_channel_handler()')
let s:chopt.callback = 's:Handler'
call s:run_server('s:channel_handler')
let s:chopt.callback = function('s:Handler')
@@ -261,9 +272,10 @@ func Test_connect_waittime()
" TODO: Make this work again for MS-Windows.
return
endif
+ call ch_log('Test_connect_waittime()')
let start = reltime()
let handle = ch_open('localhost:9876', s:chopt)
- if ch_status(handle) == "fail"
+ if ch_status(handle) != "fail"
" Oops, port does exists.
call ch_close(handle)
else
@@ -272,7 +284,7 @@ func Test_connect_waittime()
endif
let start = reltime()
- let handle = ch_open('localhost:9867', {'waittime': 2000})
+ let handle = ch_open('localhost:9867', {'waittime': 500})
if ch_status(handle) != "fail"
" Oops, port does exists.
call ch_close(handle)
@@ -280,7 +292,7 @@ func Test_connect_waittime()
" Failed connection doesn't wait the full time on Unix.
" TODO: why is MS-Windows different?
let elapsed = reltime(start)
- call assert_true(reltimefloat(elapsed) < (has('unix') ? 1.0 : 3.0))
+ call assert_true(reltimefloat(elapsed) < 1.0)
endif
endfunc
@@ -288,6 +300,7 @@ func Test_raw_pipe()
if !has('job')
return
endif
+ call ch_log('Test_raw_pipe()')
let job = job_start(s:python . " test_channel_pipe.py", {'mode': 'raw'})
call assert_equal("run", job_status(job))
try
@@ -311,6 +324,7 @@ func Test_nl_pipe()
if !has('job')
return
endif
+ call ch_log('Test_nl_pipe()')
let job = job_start(s:python . " test_channel_pipe.py")
call assert_equal("run", job_status(job))
try
@@ -346,6 +360,7 @@ func s:unlet_handle(port)
endfunc
func Test_unlet_handle()
+ call ch_log('Test_unlet_handle()')
call s:run_server('s:unlet_handle')
endfunc
@@ -366,13 +381,36 @@ func s:close_handle(port)
endfunc
func Test_close_handle()
+ call ch_log('Test_close_handle()')
call s:run_server('s:close_handle')
endfunc
""""""""""
func Test_open_fail()
+ call ch_log('Test_open_fail()')
silent! let ch = ch_open("noserver")
echo ch
let d = ch
endfunc
+
+""""""""""
+
+func s:open_delay(port)
+ " Wait up to a second for the port to open.
+ let s:chopt.waittime = 1000
+ let channel = ch_open('localhost:' . a:port, s:chopt)
+ unlet s:chopt.waittime
+ if ch_status(channel) == "fail"
+ call assert_false(1, "Can't open channel")
+ return
+ endif
+ call assert_equal('got it', ch_sendexpr(channel, 'hello!'))
+ call ch_close(channel)
+endfunc
+
+func Test_open_delay()
+ call ch_log('Test_open_delay()')
+ " The server will wait half a second before creating the port.
+ call s:run_server('s:open_delay', 'delay')
+endfunc