diff options
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | test/functional/core/job_spec.lua | 8 | ||||
-rw-r--r-- | test/functional/eval/system_spec.lua | 37 | ||||
-rw-r--r-- | test/functional/fixtures/CMakeLists.txt | 3 | ||||
-rw-r--r-- | test/functional/fixtures/streams-test.c | 33 | ||||
-rw-r--r-- | test/functional/helpers.lua | 7 |
6 files changed, 54 insertions, 36 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 5fc589cc5f..b92b5473b2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -560,7 +560,7 @@ if(BUSTED_PRG) endif() set(UNITTEST_PREREQS nvim-test unittest-headers) - set(FUNCTIONALTEST_PREREQS nvim printargs-test shell-test ${GENERATED_HELP_TAGS}) + set(FUNCTIONALTEST_PREREQS nvim printargs-test shell-test streams-test ${GENERATED_HELP_TAGS}) if(NOT WIN32) list(APPEND FUNCTIONALTEST_PREREQS tty-test) endif() diff --git a/test/functional/core/job_spec.lua b/test/functional/core/job_spec.lua index b745eb67ef..9c37e55f42 100644 --- a/test/functional/core/job_spec.lua +++ b/test/functional/core/job_spec.lua @@ -7,6 +7,7 @@ local clear, eq, eval, exc_exec, feed_command, feed, insert, neq, next_msg, nvim helpers.write_file, helpers.mkdir, helpers.rmdir local command = helpers.command local funcs = helpers.funcs +local os_kill = helpers.os_kill local retry = helpers.retry local meths = helpers.meths local NIL = helpers.NIL @@ -20,13 +21,6 @@ local expect_msg_seq = helpers.expect_msg_seq local pcall_err = helpers.pcall_err local Screen = require('test.functional.ui.screen') --- Kill process with given pid -local function os_kill(pid) - return os.execute((iswin() - and 'taskkill /f /t /pid '..pid..' > nul' - or 'kill -9 '..pid..' > /dev/null')) -end - describe('jobs', function() local channel diff --git a/test/functional/eval/system_spec.lua b/test/functional/eval/system_spec.lua index 13134bc6e7..0a478fd05c 100644 --- a/test/functional/eval/system_spec.lua +++ b/test/functional/eval/system_spec.lua @@ -7,6 +7,7 @@ local eq, call, clear, eval, feed_command, feed, nvim = local command = helpers.command local exc_exec = helpers.exc_exec local iswin = helpers.iswin +local os_kill = helpers.os_kill local Screen = require('test.functional.ui.screen') @@ -23,14 +24,6 @@ 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 - xclip = (os.execute('command -v xclip > /dev/null 2>&1') == 0) - end -end - describe('system()', function() before_each(clear) @@ -378,15 +371,10 @@ describe('system()', function() end) end) - describe("with a program that doesn't close stdout", function() - if not xclip then - pending('missing `xclip`', function() end) - else - it('will exit properly after passing input', function() - eq('', eval([[system('xclip -i -loops 1 -selection clipboard', 'clip-data')]])) - eq('clip-data', eval([[system('xclip -o -selection clipboard')]])) - end) - end + it("with a program that doesn't close stdout will exit properly after passing input", function() + local out = eval(string.format("system('%s', 'clip-data')", nvim_dir..'/streams-test')) + assert(out:sub(0, 5) == 'pid: ', out) + os_kill(out:match("%d+")) end) end) @@ -562,16 +550,9 @@ describe('systemlist()', function() end) end) - describe("with a program that doesn't close stdout", function() - if not xclip then - pending('missing `xclip`', function() end) - else - it('will exit properly after passing input', function() - eq({}, eval( - "systemlist('xclip -i -loops 1 -selection clipboard', ['clip', 'data'])")) - eq({'clip', 'data'}, eval( - "systemlist('xclip -o -selection clipboard')")) - end) - end + it("with a program that doesn't close stdout will exit properly after passing input", function() + local out = eval(string.format("systemlist('%s', 'clip-data')", nvim_dir..'/streams-test')) + assert(out[1]:sub(0, 5) == 'pid: ', out) + os_kill(out[1]:match("%d+")) end) end) diff --git a/test/functional/fixtures/CMakeLists.txt b/test/functional/fixtures/CMakeLists.txt index a7cd214b6b..dbcb157956 100644 --- a/test/functional/fixtures/CMakeLists.txt +++ b/test/functional/fixtures/CMakeLists.txt @@ -7,3 +7,6 @@ add_executable(printenv-test printenv-test.c) if(WIN32) set_target_properties(printenv-test PROPERTIES LINK_FLAGS -municode) endif() + +add_executable(streams-test streams-test.c) +target_link_libraries(streams-test ${LIBUV_LIBRARIES}) diff --git a/test/functional/fixtures/streams-test.c b/test/functional/fixtures/streams-test.c new file mode 100644 index 0000000000..56d475d7dc --- /dev/null +++ b/test/functional/fixtures/streams-test.c @@ -0,0 +1,33 @@ +/// Helper program to exit and keep stdout open (like "xclip -i -loops 1"). +#include <stdio.h> + +#include <uv.h> + +uv_loop_t *loop; +uv_process_t child_req; +uv_process_options_t options; + +int main(int argc, char **argv) +{ + loop = uv_default_loop(); + + char * args[3]; + args[0] = "sleep"; + args[1] = "10"; + args[2] = NULL; + + options.exit_cb = NULL; + options.file = "sleep"; + options.args = args; + options.flags = UV_PROCESS_DETACHED; + + int r; + if ((r = uv_spawn(loop, &child_req, &options))) { + fprintf(stderr, "%s\n", uv_strerror(r)); + return 1; + } + fprintf(stderr, "pid: %d\n", child_req.pid); + uv_unref((uv_handle_t *)&child_req); + + return uv_run(loop, UV_RUN_DEFAULT); +} diff --git a/test/functional/helpers.lua b/test/functional/helpers.lua index 131ce7ed0b..2cf81ed4d0 100644 --- a/test/functional/helpers.lua +++ b/test/functional/helpers.lua @@ -796,6 +796,13 @@ function module.add_builddir_to_rtp() module.command(string.format([[set rtp+=%s/runtime]], module.test_build_dir)) end +-- Kill process with given pid +function module.os_kill(pid) + return os.execute((iswin() + and 'taskkill /f /t /pid '..pid..' > nul' + or 'kill -9 '..pid..' > /dev/null')) +end + module = global_helpers.tbl_extend('error', module, global_helpers) return function(after_each) |