changeset 8009:b2cfa3416ba0 v7.4.1299

commit https://github.com/vim/vim/commit/f6157284de71d8881f3b89fbd79d1ecbf842929f Author: Bram Moolenaar <Bram@vim.org> Date: Wed Feb 10 21:07:14 2016 +0100 patch 7.4.1299 Problem: When the server sends a message with ID zero the channel handler is not invoked. (Christian J. Robinson) Solution: Recognize zero value for the request ID. Add a test for invoking the channel handler.
author Christian Brabandt <cb@256bit.org>
date Wed, 10 Feb 2016 21:15:04 +0100
parents 3adaa0992538
children cbfb5ac5f9c5
files src/channel.c src/testdir/test_channel.py src/testdir/test_channel.vim src/version.c
diffstat 4 files changed, 48 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/channel.c
+++ b/src/channel.c
@@ -786,6 +786,7 @@ channel_get_json(int ch_idx, int id, typ
 
 	if ((id > 0 && tv->v_type == VAR_NUMBER && tv->vval.v_number == id)
 	      || (id <= 0 && (tv->v_type != VAR_NUMBER
+			       || tv->vval.v_number == 0
 			       || tv->vval.v_number != channel->ch_block_id)))
 	{
 	    *rettv = item->value;
--- a/src/testdir/test_channel.py
+++ b/src/testdir/test_channel.py
@@ -130,6 +130,16 @@ class ThreadedTCPRequestHandler(socketse
                     elif decoded[1] == 'eval-result':
                         # Send back the last received eval result.
                         response = last_eval
+                    elif decoded[1] == 'call me':
+                        cmd = '[0,"we called you"]'
+                        print("sending: {}".format(cmd))
+                        self.request.sendall(cmd.encode('utf-8'))
+                        response = "ok"
+                    elif decoded[1] == 'call me again':
+                        cmd = '[0,"we did call you"]'
+                        print("sending: {}".format(cmd))
+                        self.request.sendall(cmd.encode('utf-8'))
+                        response = ""
                     elif decoded[1] == '!quit!':
                         # we're done
                         self.server.shutdown()
@@ -140,9 +150,12 @@ class ThreadedTCPRequestHandler(socketse
                     else:
                         response = "what?"
 
-                    encoded = json.dumps([decoded[0], response])
-                    print("sending: {}".format(encoded))
-                    self.request.sendall(encoded.encode('utf-8'))
+                    if response == "":
+                        print("no response")
+                    else:
+                        encoded = json.dumps([decoded[0], response])
+                        print("sending: {}".format(encoded))
+                        self.request.sendall(encoded.encode('utf-8'))
 
                 # Negative numbers are used for "eval" responses.
                 elif decoded[0] < 0:
--- a/src/testdir/test_channel.vim
+++ b/src/testdir/test_channel.vim
@@ -204,6 +204,35 @@ func Test_server_crash()
   call s:run_server('s:server_crash')
 endfunc
 
+let s:reply = ""
+func s:Handler(chan, msg)
+  let s:reply = a:msg
+endfunc
+
+func s:channel_handler(port)
+  let chopt = copy(s:chopt)
+  let chopt['callback'] = 's:Handler'
+  let handle = ch_open('localhost:' . a:port, chopt)
+  if handle < 0
+    call assert_false(1, "Can't open channel")
+    return
+  endif
+
+  " Test that it works while waiting on a numbered message.
+  call assert_equal('ok', ch_sendexpr(handle, 'call me'))
+  sleep 10m
+  call assert_equal('we called you', s:reply)
+
+  " Test that it works while not waiting on a numbered message.
+  call ch_sendexpr(handle, 'call me again', 0)
+  sleep 10m
+  call assert_equal('we did call you', s:reply)
+endfunc
+
+func Test_channel_handler()
+  call s:run_server('s:channel_handler')
+endfunc
+
 " Test that trying to connect to a non-existing port fails quickly.
 func Test_connect_waittime()
   let start = reltime()
--- 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 */
 /**/
+    1299,
+/**/
     1298,
 /**/
     1297,