changeset 8007:ac78cba9e72b v7.4.1298

commit https://github.com/vim/vim/commit/d6a8d48587b2ff43c343fa365898576cc1e235ea Author: Bram Moolenaar <Bram@vim.org> Date: Wed Feb 10 20:32:20 2016 +0100 patch 7.4.1298 Problem: When the channel test fails in an unexpected way the server keeps running. Solution: Use try/catch. (Ozaki Kiichi)
author Christian Brabandt <cb@256bit.org>
date Wed, 10 Feb 2016 20:45:05 +0100
parents cc2321846969
children 3adaa0992538
files src/testdir/test_channel.vim src/version.c
diffstat 2 files changed, 72 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_channel.vim
+++ b/src/testdir/test_channel.vim
@@ -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
@@ -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
 
@@ -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.
@@ -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
--- a/src/version.c
+++ b/src/version.c
@@ -748,6 +748,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1298,
+/**/
     1297,
 /**/
     1296,