Navigation Menu

Skip to content

Commit

Permalink
patch 7.4.1298
Browse files Browse the repository at this point in the history
Problem:    When the channel test fails in an unexpected way the server keeps
            running.
Solution:   Use try/catch. (Ozaki Kiichi)
  • Loading branch information
brammool committed Feb 10, 2016
1 parent a483326 commit d6a8d48
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 44 deletions.
114 changes: 70 additions & 44 deletions src/testdir/test_channel.vim
Expand Up @@ -19,55 +19,63 @@ elseif has('win32')
finish
endif
else
" Can't run this test.
finish
endif

let s:port = -1
let s:chopt = has('macunix') ? {'waittime' : 1} : {}

func s:start_server()
" Run "testfunc" after sarting the server and stop the server afterwards.
func s:run_server(testfunc)
" The Python program writes the port number in Xportnr.
call delete("Xportnr")

if has('job')
let s:job = job_start("python test_channel.py")
elseif has('win32')
silent !start cmd /c start "test_channel" py test_channel.py
else
silent !python test_channel.py&
endif
try
if has('job')
let s:job = job_start("python test_channel.py")
elseif has('win32')
silent !start cmd /c start "test_channel" py test_channel.py
else
silent !python test_channel.py&
endif

" Wait for up to 2 seconds for the port number to be there.
let cnt = 20
let l = []
while cnt > 0
try
let l = readfile("Xportnr")
catch
endtry
if len(l) >= 1
break
" Wait for up to 2 seconds for the port number to be there.
let cnt = 20
let l = []
while cnt > 0
try
let l = readfile("Xportnr")
catch
endtry
if len(l) >= 1
break
endif
sleep 100m
let cnt -= 1
endwhile
call delete("Xportnr")

if len(l) == 0
" Can't make the connection, give up.
call assert_false(1, "Can't start test_channel.py")
return -1
endif
sleep 100m
let cnt -= 1
endwhile
call delete("Xportnr")
let port = l[0]

if len(l) == 0
" Can't make the connection, give up.
call call(function(a:testfunc), [port])
catch
call assert_false(1, "Caught exception: " . v:exception)
finally
call s:kill_server()
call assert_false(1, "Can't start test_channel.py")
return -1
endif
let s:port = l[0]

let handle = ch_open('localhost:' . s:port, s:chopt)
return handle
endtry
endfunc

func s:kill_server()
if has('job')
call job_stop(s:job)
if exists('s:job')
call job_stop(s:job)
unlet s:job
endif
elseif has('win32')
call system('taskkill /IM py.exe /T /F /FI "WINDOWTITLE eq test_channel"')
else
Expand All @@ -82,9 +90,10 @@ func s:RequestHandler(handle, msg)
let s:responseMsg = a:msg
endfunc

func Test_communicate()
let handle = s:start_server()
func s:communicate(port)
let handle = ch_open('localhost:' . a:port, s:chopt)
if handle < 0
call assert_false(1, "Can't open channel")
return
endif

Expand Down Expand Up @@ -144,39 +153,55 @@ func Test_communicate()

" make the server quit, can't check if this works, should not hang.
call ch_sendexpr(handle, '!quit!', 0)
endfunc

call s:kill_server()
func Test_communicate()
call s:run_server('s:communicate')
endfunc

" Test that we can open two channels.
func Test_two_channels()
let handle = s:start_server()
func s:two_channels(port)
let handle = ch_open('localhost:' . a:port)
if handle < 0
call assert_false(1, "Can't open channel")
return
endif

call assert_equal('got it', ch_sendexpr(handle, 'hello!'))

let newhandle = ch_open('localhost:' . s:port, s:chopt)
let newhandle = ch_open('localhost:' . a:port, s:chopt)
if newhandle < 0
call assert_false(1, "Can't open second channel")
return
endif
call assert_equal('got it', ch_sendexpr(newhandle, 'hello!'))
call assert_equal('got it', ch_sendexpr(handle, 'hello!'))

call ch_close(handle)
call assert_equal('got it', ch_sendexpr(newhandle, 'hello!'))

call s:kill_server()
call ch_close(newhandle)
endfunc

func Test_two_channels()
call s:run_server('s:two_channels')
endfunc

" Test that a server crash is handled gracefully.
func Test_server_crash()
let handle = s:start_server()
func s:server_crash(port)
let handle = ch_open('localhost:' . a:port, s:chopt)
if handle < 0
call assert_false(1, "Can't open channel")
return
endif

call ch_sendexpr(handle, '!crash!')

" kill the server in case if failed to crash
sleep 10m
call s:kill_server()
endfunc

func Test_server_crash()
call s:run_server('s:server_crash')
endfunc

" Test that trying to connect to a non-existing port fails quickly.
Expand All @@ -198,6 +223,7 @@ func Test_connect_waittime()
call ch_close(handle)
else
" 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))
endif
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -747,6 +747,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1298,
/**/
1297,
/**/
Expand Down

0 comments on commit d6a8d48

Please sign in to comment.