summaryrefslogtreecommitdiffstats
path: root/src/testdir/test_channel.py
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-02-03 22:20:29 +0100
committerBram Moolenaar <Bram@vim.org>2016-02-03 22:20:29 +0100
commite7bed627c89ed80bc4b2d96f542819029adf6e76 (patch)
tree871244042180b0033a0e256e4c782449ac8118fa /src/testdir/test_channel.py
parentbf087cead956513bcd8d40d70322875c479a1984 (diff)
patch 7.4.1252v7.4.1252
Problem: The channel test server may receive two messages concatenated. Solution: Split the messages.
Diffstat (limited to 'src/testdir/test_channel.py')
-rw-r--r--src/testdir/test_channel.py111
1 files changed, 62 insertions, 49 deletions
diff --git a/src/testdir/test_channel.py b/src/testdir/test_channel.py
index 64546c0205..486ff4d7c6 100644
--- a/src/testdir/test_channel.py
+++ b/src/testdir/test_channel.py
@@ -45,56 +45,69 @@ class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
print("=== socket closed ===")
break
print("received: {}".format(data))
- try:
- decoded = json.loads(data)
- except ValueError:
- print("json decoding failed")
- decoded = [-1, '']
-
- # Send a response if the sequence number is positive.
- if decoded[0] >= 0:
- if decoded[1] == 'hello!':
- # simply send back a string
- response = "got it"
- elif decoded[1] == 'make change':
- # Send two ex commands at the same time, before replying to
- # the request.
- cmd = '["ex","call append(\\"$\\",\\"added1\\")"]'
- cmd += '["ex","call append(\\"$\\",\\"added2\\")"]'
- print("sending: {}".format(cmd))
- thesocket.sendall(cmd.encode('utf-8'))
- response = "ok"
- elif decoded[1] == 'eval-works':
- # Send an eval request. We ignore the response.
- cmd = '["eval","\\"foo\\" . 123", -1]'
- print("sending: {}".format(cmd))
- thesocket.sendall(cmd.encode('utf-8'))
- response = "ok"
- elif decoded[1] == 'eval-fails':
- # Send an eval request that will fail.
- cmd = '["eval","xxx", -2]'
- print("sending: {}".format(cmd))
- thesocket.sendall(cmd.encode('utf-8'))
- response = "ok"
- elif decoded[1] == 'eval-result':
- # Send back the last received eval result.
- response = last_eval
- elif decoded[1] == '!quit!':
- # we're done
- sys.exit(0)
- elif decoded[1] == '!crash!':
- # Crash!
- 42 / 0
- else:
- response = "what?"
- encoded = json.dumps([decoded[0], response])
- print("sending: {}".format(encoded))
- thesocket.sendall(encoded.encode('utf-8'))
-
- # Negative numbers are used for "eval" responses.
- elif decoded[0] < 0:
- last_eval = decoded
+ # We may receive two messages at once. Take the part up to the
+ # matching "]" (recognized by finding "][").
+ while data != '':
+ splitidx = data.find('][')
+ if splitidx < 0:
+ todo = data
+ data = ''
+ else:
+ todo = data[:splitidx + 1]
+ data = data[splitidx + 1:]
+ print("using: {}".format(todo))
+
+ try:
+ decoded = json.loads(todo)
+ except ValueError:
+ print("json decoding failed")
+ decoded = [-1, '']
+
+ # Send a response if the sequence number is positive.
+ if decoded[0] >= 0:
+ if decoded[1] == 'hello!':
+ # simply send back a string
+ response = "got it"
+ elif decoded[1] == 'make change':
+ # Send two ex commands at the same time, before replying to
+ # the request.
+ cmd = '["ex","call append(\\"$\\",\\"added1\\")"]'
+ cmd += '["ex","call append(\\"$\\",\\"added2\\")"]'
+ print("sending: {}".format(cmd))
+ thesocket.sendall(cmd.encode('utf-8'))
+ response = "ok"
+ elif decoded[1] == 'eval-works':
+ # Send an eval request. We ignore the response.
+ cmd = '["eval","\\"foo\\" . 123", -1]'
+ print("sending: {}".format(cmd))
+ thesocket.sendall(cmd.encode('utf-8'))
+ response = "ok"
+ elif decoded[1] == 'eval-fails':
+ # Send an eval request that will fail.
+ cmd = '["eval","xxx", -2]'
+ print("sending: {}".format(cmd))
+ thesocket.sendall(cmd.encode('utf-8'))
+ response = "ok"
+ elif decoded[1] == 'eval-result':
+ # Send back the last received eval result.
+ response = last_eval
+ elif decoded[1] == '!quit!':
+ # we're done
+ sys.exit(0)
+ elif decoded[1] == '!crash!':
+ # Crash!
+ 42 / 0
+ else:
+ response = "what?"
+
+ encoded = json.dumps([decoded[0], response])
+ print("sending: {}".format(encoded))
+ thesocket.sendall(encoded.encode('utf-8'))
+
+ # Negative numbers are used for "eval" responses.
+ elif decoded[0] < 0:
+ last_eval = decoded
thesocket = None