diff options
author | Thiago de Arruda <tpadilha84@gmail.com> | 2014-10-23 10:30:27 -0300 |
---|---|---|
committer | Thiago de Arruda <tpadilha84@gmail.com> | 2014-10-23 21:19:08 -0300 |
commit | d561ba223d799f02033a22fbc5f49d10ea3d50e5 (patch) | |
tree | bce5f844330e7f2a4c28e8848fc055335c4fd240 /test/functional/shell/viml_system_spec.lua | |
parent | 9abcd9a4a095ea1c96efb3a63890e8b919b20d22 (diff) | |
download | rneovim-d561ba223d799f02033a22fbc5f49d10ea3d50e5.tar.gz rneovim-d561ba223d799f02033a22fbc5f49d10ea3d50e5.tar.bz2 rneovim-d561ba223d799f02033a22fbc5f49d10ea3d50e5.zip |
job: Refactor to ensure that all callbacks will be invoked
It's possible that a child process won't close it's standard streams, even after
it exits. This can be evidenced with the "xclip" program:
:call system('xclip -i -selection clipboard', 'DATA')
Before this commit, the above command wouldn't return, even though the xclip
program had exited. That is because `xclip` wasn't closing it's stdout/stderr
streams, which would block pending_refs from ever reaching 0.
Now the job.c module was refactored to ensure all streams are closed when the
uv_process_t handle is closed.
Diffstat (limited to 'test/functional/shell/viml_system_spec.lua')
-rw-r--r-- | test/functional/shell/viml_system_spec.lua | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/test/functional/shell/viml_system_spec.lua b/test/functional/shell/viml_system_spec.lua index 6dde2ef538..9ed1016f73 100644 --- a/test/functional/shell/viml_system_spec.lua +++ b/test/functional/shell/viml_system_spec.lua @@ -19,6 +19,15 @@ local function delete_file(name) end end +-- Some tests require the xclip program and a x server. +local xclip = nil +do + if os.getenv('DISPLAY') then + local proc = io.popen('which xclip') + xclip = proc:read() + proc:close() + end +end describe('system()', function() before_each(clear) @@ -85,6 +94,15 @@ describe('system()', function() end) end) end) + + if xclip then + describe("with a program that doesn't close stdout", function() + it('will exit properly after passing input', function() + eq(nil, eval([[system('xclip -i -selection clipboard', 'clip-data')]])) + eq('clip-data', eval([[system('xclip -o -selection clipboard')]])) + end) + end) + end end) describe('systemlist()', function() @@ -140,4 +158,15 @@ describe('systemlist()', function() end) end) end) + + if xclip then + describe("with a program that doesn't close stdout", function() + it('will exit properly after passing input', function() + eq(nil, eval( + "systemlist('xclip -i -selection clipboard', ['clip', 'data'])")) + eq({'clip', 'data'}, eval( + "systemlist('xclip -o -selection clipboard')")) + end) + end) + end end) |