diff options
author | Bram Moolenaar <Bram@vim.org> | 2016-02-03 22:20:29 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2016-02-03 22:20:29 +0100 |
commit | e7bed627c89ed80bc4b2d96f542819029adf6e76 (patch) | |
tree | 871244042180b0033a0e256e4c782449ac8118fa /src/testdir/test_channel.py | |
parent | bf087cead956513bcd8d40d70322875c479a1984 (diff) | |
download | vim-e7bed627c89ed80bc4b2d96f542819029adf6e76.zip |
patch 7.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.py | 111 |
1 files changed, 62 insertions, 49 deletions
diff --git a/src/testdir/test_channel.py b/src/testdir/test_channel.py index 64546c020..486ff4d7c 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 |