aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2014-11-10 19:01:53 -0500
committerJustin M. Keyes <justinkz@gmail.com>2014-11-10 19:01:53 -0500
commit3080672650b1a6583684edfdafef7e07c0c7cf56 (patch)
tree888527c926d8117c21d291311e34f271614cf66f
parentb0cd397a43ae18942e12b1c76f838aac135b18cf (diff)
parent3e8ef31ada1f2ae0b0cd58bb25d5516d19eee82d (diff)
downloadrneovim-3080672650b1a6583684edfdafef7e07c0c7cf56.tar.gz
rneovim-3080672650b1a6583684edfdafef7e07c0c7cf56.tar.bz2
rneovim-3080672650b1a6583684edfdafef7e07c0c7cf56.zip
Merge pull request #1448 from tarruda/shell-systemlist-test-fixes
Fixes to shell.c, systemlist and functional tests
-rw-r--r--src/nvim/eval.c5
-rw-r--r--src/nvim/os/shell.c9
-rw-r--r--test/functional/helpers.lua10
-rw-r--r--test/functional/shell/viml_system_spec.lua32
4 files changed, 51 insertions, 5 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 59363a3608..fc61fed529 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -14492,6 +14492,11 @@ static void get_system_output_as_rettv(typval_T *argvars, typval_T *rettv,
set_vim_var_nr(VV_SHELL_ERROR, (long) status);
if (res == NULL) {
+ if (retlist) {
+ // return an empty list when there's no output
+ rettv->v_type = VAR_LIST;
+ rettv->vval.v_list = list_alloc();
+ }
return;
}
diff --git a/src/nvim/os/shell.c b/src/nvim/os/shell.c
index 7449ac637c..1b279f18f5 100644
--- a/src/nvim/os/shell.c
+++ b/src/nvim/os/shell.c
@@ -244,6 +244,9 @@ static int shell(const char *cmd,
job_stop(job);
return -1;
}
+ // close the input stream after everything is written
+ job_write_cb(job, shell_write_cb);
+ } else {
// close the input stream, let the process know that no more input is
// coming
job_close_in(job);
@@ -447,3 +450,9 @@ static void write_output(char *output, size_t remaining)
curbuf->b_no_eol_lnum = 0;
}
}
+
+static void shell_write_cb(WStream *wstream, void *data, int status)
+{
+ Job *job = data;
+ job_close_in(job);
+}
diff --git a/test/functional/helpers.lua b/test/functional/helpers.lua
index bf6e3dd38a..6c3f5190c9 100644
--- a/test/functional/helpers.lua
+++ b/test/functional/helpers.lua
@@ -25,7 +25,7 @@ if os.getenv('VALGRIND') then
nvim_argv = valgrind_argv
end
-local session, loop_running, last_error
+local session, loop_running, loop_stopped, last_error
local function request(method, ...)
local status, rv = session:request(method, ...)
@@ -39,7 +39,11 @@ local function request(method, ...)
end
-- Make sure this will only return after all buffered characters have been
-- processed
- session:request('vim_eval', '1')
+ if not loop_stopped then
+ -- Except when the loop has been stopped by a notification triggered
+ -- by the initial request, for example.
+ session:request('vim_eval', '1')
+ end
return rv
end
@@ -71,6 +75,7 @@ local function run(request_cb, notification_cb, setup_cb)
call_and_stop_on_error(setup_cb)
end
+ loop_stopped = false
loop_running = true
session:run(on_request, on_notification, on_setup)
loop_running = false
@@ -82,6 +87,7 @@ local function run(request_cb, notification_cb, setup_cb)
end
local function stop()
+ loop_stopped = true
session:stop()
end
diff --git a/test/functional/shell/viml_system_spec.lua b/test/functional/shell/viml_system_spec.lua
index a8bab8e26e..91e115aedf 100644
--- a/test/functional/shell/viml_system_spec.lua
+++ b/test/functional/shell/viml_system_spec.lua
@@ -3,8 +3,8 @@
-- - `systemlist()`
local helpers = require('test.functional.helpers')
-local eq, clear, eval, feed =
- helpers.eq, helpers.clear, helpers.eval, helpers.feed
+local eq, clear, eval, feed, nvim =
+ helpers.eq, helpers.clear, helpers.eval, helpers.feed, helpers.nvim
local function create_file_with_nuls(name)
@@ -55,6 +55,21 @@ describe('system()', function()
end)
end)
+ describe('passing a lot of input', function()
+ it('returns the program output', function()
+ local input = {}
+ -- write more than 1mb of data, which should be enough to overcome
+ -- the os buffer limit and force multiple event loop iterations to write
+ -- everything
+ for i = 1, 0xffff do
+ input[#input + 1] = '01234567890ABCDEFabcdef'
+ end
+ input = table.concat(input, '\n')
+ nvim('set_var', 'input', input)
+ eq(input, eval('system("cat -", g:input)'))
+ end)
+ end)
+
describe('passing number as input', function()
it('stringifies the input', function()
eq('1', eval('system("cat", 1)'))
@@ -129,6 +144,17 @@ describe('systemlist()', function()
end)
end)
+ describe('passing a lot of input', function()
+ it('returns the program output', function()
+ local input = {}
+ for i = 1, 0xffff do
+ input[#input + 1] = '01234567890ABCDEFabcdef'
+ end
+ nvim('set_var', 'input', input)
+ eq(input, eval('systemlist("cat -", g:input)'))
+ end)
+ end)
+
describe('with output containing NULs', function()
local fname = 'Xtest'
@@ -166,7 +192,7 @@ describe('systemlist()', function()
if xclip then
describe("with a program that doesn't close stdout", function()
it('will exit properly after passing input', function()
- eq(nil, eval(
+ eq({}, eval(
"systemlist('xclip -i -selection clipboard', ['clip', 'data'])"))
eq({'clip', 'data'}, eval(
"systemlist('xclip -o -selection clipboard')"))