diff options
author | ZyX <kp-pav@yandex.ru> | 2016-06-11 21:59:01 +0300 |
---|---|---|
committer | ZyX <kp-pav@yandex.ru> | 2016-06-24 16:53:26 +0300 |
commit | 0d56118d862f0a366da57c82a6e995f1a51b0fc7 (patch) | |
tree | 2d471532a260598076a5a2cb51254f4bf6591639 /test/functional/api/server_notifications_spec.lua | |
parent | 2968dc7bddbe56719bbb918f712de866fa6c230e (diff) | |
download | rneovim-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.lua | 28 |
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) |