aboutsummaryrefslogtreecommitdiff
path: root/test/functional/api/server_notifications_spec.lua
diff options
context:
space:
mode:
authorZyX <kp-pav@yandex.ru>2016-06-11 21:59:01 +0300
committerZyX <kp-pav@yandex.ru>2016-06-24 16:53:26 +0300
commit0d56118d862f0a366da57c82a6e995f1a51b0fc7 (patch)
tree2d471532a260598076a5a2cb51254f4bf6591639 /test/functional/api/server_notifications_spec.lua
parent2968dc7bddbe56719bbb918f712de866fa6c230e (diff)
downloadrneovim-0d56118d862f0a366da57c82a6e995f1a51b0fc7.tar.gz
rneovim-0d56118d862f0a366da57c82a6e995f1a51b0fc7.tar.bz2
rneovim-0d56118d862f0a366da57c82a6e995f1a51b0fc7.zip
msgpack_rpc: Fix crash in log_server_msg
It appears that used msgpack library is not able to parse back message created by msgpack_rpc_from_object() if nesting level is too high, so log_server_msg now cares about msgpack_unpack_next() return value. Also error message from server_notifications_spec.lua is not readable if something is wrong (though at least now it does not crash when parsing deeply nested structures). log_server_msg() in the test reports [msgpack-rpc] nvim -> client(1) [error] "parse error"
Diffstat (limited to 'test/functional/api/server_notifications_spec.lua')
-rw-r--r--test/functional/api/server_notifications_spec.lua28
1 files changed, 22 insertions, 6 deletions
diff --git a/test/functional/api/server_notifications_spec.lua b/test/functional/api/server_notifications_spec.lua
index 23f16ea1f5..88e8c60560 100644
--- a/test/functional/api/server_notifications_spec.lua
+++ b/test/functional/api/server_notifications_spec.lua
@@ -41,13 +41,29 @@ describe('notify', function()
it('does not crash for deeply nested variable', function()
meths.set_var('l', {})
local nest_level = 1000
- meths.command(('call map(range(%u), "extend(g:, {\'l\': [g:l]})")'):format(nest_level))
- local ret = {}
- for i = 1, nest_level do
- ret = {ret}
- end
+ meths.command(('call map(range(%u), "extend(g:, {\'l\': [g:l]})")'):format(nest_level - 1))
eval('rpcnotify('..channel..', "event", g:l)')
- -- eq({'notification', 'event', ret}, next_message())
+ local msg = next_message()
+ eq('notification', msg[1])
+ eq('event', msg[2])
+ local act_ret = msg[3]
+ local act_nest_level = 0
+ while act_ret do
+ if type(act_ret) == 'table' then
+ local cur_act_ret = nil
+ for k, v in pairs(act_ret) do
+ eq(1, k)
+ cur_act_ret = v
+ end
+ if cur_act_ret then
+ act_nest_level = act_nest_level + 1
+ end
+ act_ret = cur_act_ret
+ else
+ eq(nil, act_ret)
+ end
+ end
+ eq(nest_level, act_nest_level)
end)
end)
end)