diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/functional/core/channels_spec.lua | 21 | ||||
-rw-r--r-- | test/functional/terminal/channel_spec.lua | 87 |
2 files changed, 89 insertions, 19 deletions
diff --git a/test/functional/core/channels_spec.lua b/test/functional/core/channels_spec.lua index c28300f0f4..ca52404d3b 100644 --- a/test/functional/core/channels_spec.lua +++ b/test/functional/core/channels_spec.lua @@ -10,6 +10,8 @@ local nvim_prog = helpers.nvim_prog local is_os = helpers.is_os local retry = helpers.retry local expect_twostreams = helpers.expect_twostreams +local assert_alive = helpers.assert_alive +local pcall_err = helpers.pcall_err describe('channels', function() local init = [[ @@ -314,3 +316,22 @@ describe('channels', function() eq({"notification", "exit", {id, 1, {''}}}, next_msg()) end) end) + +describe('loopback', function() + before_each(function() + clear() + command("let chan = sockconnect('pipe', v:servername, {'rpc': v:true})") + end) + + it('does not crash when sending raw data', function() + eq("Vim(call):Can't send raw data to rpc channel", + pcall_err(command, "call chansend(chan, 'test')")) + assert_alive() + end) + + it('are released when closed', function() + local chans = eval('len(nvim_list_chans())') + command('call chanclose(chan)') + eq(chans - 1, eval('len(nvim_list_chans())')) + end) +end) diff --git a/test/functional/terminal/channel_spec.lua b/test/functional/terminal/channel_spec.lua index 7223f5ba61..9059441fd9 100644 --- a/test/functional/terminal/channel_spec.lua +++ b/test/functional/terminal/channel_spec.lua @@ -1,45 +1,94 @@ local helpers = require('test.functional.helpers')(after_each) +local Screen = require('test.functional.ui.screen') local clear = helpers.clear local eq = helpers.eq +local eval = helpers.eval local command = helpers.command local pcall_err = helpers.pcall_err local feed = helpers.feed -local sleep = helpers.sleep local poke_eventloop = helpers.poke_eventloop -describe('associated channel is closed and later freed for terminal', function() - before_each(clear) +describe('terminal channel is closed and later released if', function() + local screen + + before_each(function() + clear() + screen = Screen.new() + screen:attach() + end) it('opened by nvim_open_term() and deleted by :bdelete!', function() command([[let id = nvim_open_term(0, {})]]) - -- channel hasn't been freed yet - eq("Vim(call):Can't send data to closed stream", pcall_err(command, [[bdelete! | call chansend(id, 'test')]])) - -- channel has been freed after one main loop iteration - eq("Vim(call):E900: Invalid channel id", pcall_err(command, [[call chansend(id, 'test')]])) + local chans = eval('len(nvim_list_chans())') + -- channel hasn't been released yet + eq("Vim(call):Can't send data to closed stream", + pcall_err(command, [[bdelete! | call chansend(id, 'test')]])) + -- channel has been released after one main loop iteration + eq(chans - 1, eval('len(nvim_list_chans())')) + end) + + it('opened by nvim_open_term(), closed by chanclose(), and deleted by pressing a key', function() + command('let id = nvim_open_term(0, {})') + local chans = eval('len(nvim_list_chans())') + -- channel has been closed but not released + eq("Vim(call):Can't send data to closed stream", + pcall_err(command, [[call chanclose(id) | call chansend(id, 'test')]])) + screen:expect({any='%[Terminal closed]'}) + eq(chans, eval('len(nvim_list_chans())')) + -- delete terminal + feed('i<CR>') + -- need to first process input + poke_eventloop() + -- channel has been released after another main loop iteration + eq(chans - 1, eval('len(nvim_list_chans())')) + end) + + it('opened by nvim_open_term(), closed by chanclose(), and deleted by :bdelete', function() + command('let id = nvim_open_term(0, {})') + local chans = eval('len(nvim_list_chans())') + -- channel has been closed but not released + eq("Vim(call):Can't send data to closed stream", + pcall_err(command, [[call chanclose(id) | call chansend(id, 'test')]])) + screen:expect({any='%[Terminal closed]'}) + eq(chans, eval('len(nvim_list_chans())')) + -- channel still hasn't been released yet + eq("Vim(call):Can't send data to closed stream", + pcall_err(command, [[bdelete | call chansend(id, 'test')]])) + -- channel has been released after one main loop iteration + eq(chans - 1, eval('len(nvim_list_chans())')) end) it('opened by termopen(), exited, and deleted by pressing a key', function() command([[let id = termopen('echo')]]) - sleep(500) - -- process has exited - eq("Vim(call):Can't send data to closed stream", pcall_err(command, [[call chansend(id, 'test')]])) + local chans = eval('len(nvim_list_chans())') + -- wait for process to exit + screen:expect({any='%[Process exited 0%]'}) + -- process has exited but channel has't been released + eq("Vim(call):Can't send data to closed stream", + pcall_err(command, [[call chansend(id, 'test')]])) + eq(chans, eval('len(nvim_list_chans())')) -- delete terminal feed('i<CR>') -- need to first process input poke_eventloop() - -- channel has been freed after another main loop iteration - eq("Vim(call):E900: Invalid channel id", pcall_err(command, [[call chansend(id, 'test')]])) + -- channel has been released after another main loop iteration + eq(chans - 1, eval('len(nvim_list_chans())')) end) -- This indirectly covers #16264 it('opened by termopen(), exited, and deleted by :bdelete', function() command([[let id = termopen('echo')]]) - sleep(500) - -- process has exited - eq("Vim(call):Can't send data to closed stream", pcall_err(command, [[call chansend(id, 'test')]])) - -- channel hasn't been freed yet - eq("Vim(call):Can't send data to closed stream", pcall_err(command, [[bdelete | call chansend(id, 'test')]])) - -- channel has been freed after one main loop iteration - eq("Vim(call):E900: Invalid channel id", pcall_err(command, [[call chansend(id, 'test')]])) + local chans = eval('len(nvim_list_chans())') + -- wait for process to exit + screen:expect({any='%[Process exited 0%]'}) + -- process has exited but channel hasn't been released + eq("Vim(call):Can't send data to closed stream", + pcall_err(command, [[call chansend(id, 'test')]])) + eq(chans, eval('len(nvim_list_chans())')) + -- channel still hasn't been released yet + eq("Vim(call):Can't send data to closed stream", + pcall_err(command, [[bdelete | call chansend(id, 'test')]])) + -- channel has been released after one main loop iteration + eq(chans - 1, eval('len(nvim_list_chans())')) end) end) |