aboutsummaryrefslogtreecommitdiff
path: root/test/functional/shell/viml_system_spec.lua
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2014-10-23 10:30:27 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2014-10-23 21:19:08 -0300
commitd561ba223d799f02033a22fbc5f49d10ea3d50e5 (patch)
treebce5f844330e7f2a4c28e8848fc055335c4fd240 /test/functional/shell/viml_system_spec.lua
parent9abcd9a4a095ea1c96efb3a63890e8b919b20d22 (diff)
downloadrneovim-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.lua29
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)