From b64af88c848204f2193cf0f18b94d12731e5bd2f Mon Sep 17 00:00:00 2001 From: Edd Barrett Date: Sun, 18 Aug 2019 13:39:31 +0100 Subject: [PATCH 1/6] CI/OpenBSD: run functional tests Adapt some tests for OpenBSD: - scrollback_spec: - seq(1) is not available on OpenBSD: we'd use jot(1). - Instead use a (hopefully) portable awk(1) snippet. - channels_spec - job_spec - tui_spec --- .builds/openbsd.yml | 9 ++++++--- test/functional/core/channels_spec.lua | 4 ++-- test/functional/core/job_spec.lua | 4 ++-- test/functional/terminal/scrollback_spec.lua | 6 +++--- test/functional/terminal/tui_spec.lua | 4 +++- 5 files changed, 16 insertions(+), 11 deletions(-) diff --git a/.builds/openbsd.yml b/.builds/openbsd.yml index 1ac830e6ad..a8f6992e3f 100644 --- a/.builds/openbsd.yml +++ b/.builds/openbsd.yml @@ -28,11 +28,14 @@ tasks: cd .. mkdir build cd build - cmake -G Ninja .. + cmake -G Ninja -DMIN_LOG_LEVEL=3 .. cmake --build . --config Debug ./bin/nvim --version - test: | export LC_CTYPE=en_US.UTF-8 - cd neovim + # functional tests + cd neovim/build + # cmake --build . --config Debug --target functionaltest # oldtests - gmake -C src/nvim/testdir NVIM_PRG=`pwd`/build/bin/nvim + cd .. + gmake oldtest diff --git a/test/functional/core/channels_spec.lua b/test/functional/core/channels_spec.lua index ddaed1c448..30dcb6d7b4 100644 --- a/test/functional/core/channels_spec.lua +++ b/test/functional/core/channels_spec.lua @@ -139,8 +139,8 @@ describe('channels', function() command("call chansend(id, 'incomplet\004')") - local is_freebsd = (string.lower(uname()) == 'freebsd') - local bsdlike = is_freebsd or (os_name() == "osx") + local is_bsd = not not string.find(string.lower(uname()), 'bsd') + local bsdlike = is_bsd or (os_name() == "osx") local extra = bsdlike and "^D\008\008" or "" expect_twoline(id, "stdout", "incomplet"..extra, "[1, ['incomplet'], 'stdin']", true) diff --git a/test/functional/core/job_spec.lua b/test/functional/core/job_spec.lua index 2531b45521..73b0a0009d 100644 --- a/test/functional/core/job_spec.lua +++ b/test/functional/core/job_spec.lua @@ -429,7 +429,7 @@ describe('jobs', function() if has('win32') let cmd = 'for /L %I in (1,1,5) do @(echo %I& ping -n 2 127.0.0.1 > nul)' else - let cmd = ['sh', '-c', 'for i in $(seq 1 5); do echo $i; sleep 0.1; done'] + let cmd = ['sh', '-c', 'for i in 1 2 3 4 5; do echo $i; sleep 0.1; done'] endif let g:id = jobstart(cmd, d) sleep 1500m @@ -472,7 +472,7 @@ describe('jobs', function() if has('win32') let cmd = 'for /L %I in (1,1,5) do @(echo %I& ping -n 2 127.0.0.1 > nul)' else - let cmd = ['sh', '-c', 'for i in $(seq 1 5); do echo $i; sleep 0.1; done'] + let cmd = ['sh', '-c', 'for i in 1 2 3 4 5; do echo $i; sleep 0.1; done'] endif let g:id = jobstart(cmd, d) sleep 1500m diff --git a/test/functional/terminal/scrollback_spec.lua b/test/functional/terminal/scrollback_spec.lua index 544325e746..065cb98e69 100644 --- a/test/functional/terminal/scrollback_spec.lua +++ b/test/functional/terminal/scrollback_spec.lua @@ -406,7 +406,7 @@ describe("'scrollback' option", function() if iswin() then feed_data('for /L %I in (1,1,30) do @(echo line%I)\r') else - feed_data('for i in $(seq 1 30); do echo "line$i"; done\n') + feed_data('awk "BEGIN{for(n=1;n<=30;n++) print \\\"line\\\" n}"\n') end screen:expect{any='line30 '} retry(nil, nil, function() expect_lines(7) end) @@ -431,7 +431,7 @@ describe("'scrollback' option", function() if iswin() then feed_data('for /L %I in (1,1,30) do @(echo line%I)\r') else - feed_data('for i in $(seq 1 30); do echo "line$i"; done\n') + feed_data('awk "BEGIN{for(n=1;n<=30;n++) print \\\"line\\\" n}"\n') end screen:expect{any='line30 '} @@ -448,7 +448,7 @@ describe("'scrollback' option", function() if iswin() then feed_data('for /L %I in (1,1,40) do @(echo line%I)\r') else - feed_data('for i in $(seq 1 40); do echo "line$i"; done\n') + feed_data('awk "BEGIN{for(n=1;n<=40;n++) print \\\"line\\\" n}"\n') end screen:expect{any='line40 '} diff --git a/test/functional/terminal/tui_spec.lua b/test/functional/terminal/tui_spec.lua index 312e060a70..01e13ce4d4 100644 --- a/test/functional/terminal/tui_spec.lua +++ b/test/functional/terminal/tui_spec.lua @@ -1203,7 +1203,9 @@ describe("TUI 'term' option", function() end) it('gets system-provided term if $TERM is valid', function() - if is_bsd then -- BSD lacks terminfo, builtin is always used. + if string.lower(uname()) == "openbsd" then + assert_term("xterm", "xterm") + elseif is_bsd then -- BSD lacks terminfo, builtin is always used. assert_term("xterm", "builtin_xterm") elseif is_macos then local status, _ = pcall(assert_term, "xterm", "xterm") From c062149d5bee8ae12d1bb3280e8ad01b1c6e9461 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Sun, 1 Sep 2019 15:37:38 -0700 Subject: [PATCH 2/6] test: "can have two timers": retry() ref #10768 --- test/functional/eval/timer_spec.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/functional/eval/timer_spec.lua b/test/functional/eval/timer_spec.lua index 48d10e46a9..2ccb9cfbac 100644 --- a/test/functional/eval/timer_spec.lua +++ b/test/functional/eval/timer_spec.lua @@ -192,9 +192,10 @@ describe('timers', function() ]]) command("call timer_start(2, 'MyHandler', {'repeat': 3})") command("call timer_start(4, 'MyHandler2', {'repeat': 2})") - run(nil, nil, nil, load_adjust(30)) - eq(3,eval("g:val")) - eq(2,eval("g:val2")) + retry(nil, nil, function() + eq(3, eval("g:val")) + eq(2, eval("g:val2")) + end) end) it('do not crash when processing events in the handler', function() From 78ec7981c8e931fe72998b0cbe144304d6506803 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Sun, 1 Sep 2019 15:51:02 -0700 Subject: [PATCH 3/6] screen.lua: dump payload on handler failure For debugging failures like: test/functional/helpers.lua:240: test/functional/ui/screen.lua:898: bad argument #1 to 'unpack' (table expected, got number) test/functional/helpers.lua:240: test/functional/ui/screen.lua:708: attempt to index local 'item' (a number value) ref #10804 --- test/functional/helpers.lua | 4 ++-- test/functional/ui/screen.lua | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/test/functional/helpers.lua b/test/functional/helpers.lua index 73f3c4c917..c718a37021 100644 --- a/test/functional/helpers.lua +++ b/test/functional/helpers.lua @@ -304,7 +304,7 @@ local function nvim_feed(input) local written = module.request('nvim_input', input) if written == nil then module.assert_alive() - error('nvim_input returned nil (Nvim process terminated?)') + error('crash? (nvim_input returned nil)') end input = input:sub(written + 1) end @@ -592,7 +592,7 @@ end -- Checks that the Nvim session did not terminate. function module.assert_alive() - eq(2, module.eval('1+1')) + assert(2 == module.eval('1+1'), 'crash? request failed') end local function do_rmdir(path) diff --git a/test/functional/ui/screen.lua b/test/functional/ui/screen.lua index 02be714e0d..0e3b903398 100644 --- a/test/functional/ui/screen.lua +++ b/test/functional/ui/screen.lua @@ -615,7 +615,12 @@ function Screen:_redraw(updates) local handler_name = '_handle_'..method local handler = self[handler_name] if handler ~= nil then - handler(self, unpack(update[i])) + local status, res = pcall(handler, self, unpack(update[i])) + if not status then + error(handler_name..' failed' + ..'\n payload: '..inspect(update) + ..'\n error: '..tostring(res)) + end else assert(self._on_event, "Add Screen:"..handler_name.." or call Screen:set_on_event_handler") From 605f05f635e7300f73e45b770b95f8e5d74e250f Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Sun, 1 Sep 2019 16:52:21 -0700 Subject: [PATCH 4/6] test: shell-test.c: flush all streams --- test/functional/fixtures/shell-test.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/functional/fixtures/shell-test.c b/test/functional/fixtures/shell-test.c index a221a31bde..b95e563932 100644 --- a/test/functional/fixtures/shell-test.c +++ b/test/functional/fixtures/shell-test.c @@ -13,7 +13,7 @@ static void flush_wait(void) { - fflush(stdout); + fflush(NULL); usleep(10*1000); // Wait 10 ms. } @@ -78,10 +78,10 @@ int main(int argc, char **argv) } for (int i = 0; i < count; i++) { printf("%d: %s\n", i, argv[3]); - fflush(stdout); if (i % 100 == 0) { usleep(1000); // Wait 1 ms (simulate typical output). } + fflush(NULL); } } else if (strcmp(argv[1], "UTF-8") == 0) { // test split-up UTF-8 sequence @@ -126,7 +126,7 @@ int main(int argc, char **argv) fprintf(stderr, "Unknown first argument: %s\n", argv[1]); return 3; } - fflush(stdout); + fflush(NULL); return 0; } else if (argc == 1) { fprintf(stderr, "ready $ "); From 7d2090772488e9d57532c2f3d72438370027d3b9 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Sun, 1 Sep 2019 18:07:00 -0700 Subject: [PATCH 5/6] test/OpenBSD: skip some tests Temporary workaround to unblock CI for OpenBSD. --- test/functional/ui/cmdline_spec.lua | 4 ++++ test/functional/ui/embed_spec.lua | 4 ++++ test/functional/ui/output_spec.lua | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/test/functional/ui/cmdline_spec.lua b/test/functional/ui/cmdline_spec.lua index 1c4d5a5c6b..ea68d9a431 100644 --- a/test/functional/ui/cmdline_spec.lua +++ b/test/functional/ui/cmdline_spec.lua @@ -828,6 +828,10 @@ describe('cmdline redraw', function() end) it('with ', function() + if 'openbsd' == string.lower(helpers.uname()) then + pending('FIXME #10804', function() end) + return + end command('cmap a call sin(0)') -- no-op feed(':012345678901234567890123456789') screen:expect{grid=[[ diff --git a/test/functional/ui/embed_spec.lua b/test/functional/ui/embed_spec.lua index 0f50baa73f..6b2ad7c72b 100644 --- a/test/functional/ui/embed_spec.lua +++ b/test/functional/ui/embed_spec.lua @@ -49,6 +49,10 @@ local function test_embed(ext_linegrid) end) it("doesn't erase output when setting color scheme", function() + if 'openbsd' == string.lower(helpers.uname()) then + pending('FIXME #10804', function() end) + return + end startup('--cmd', 'echoerr "foo"', '--cmd', 'color default', '--cmd', 'echoerr "bar"') screen:expect([[ | diff --git a/test/functional/ui/output_spec.lua b/test/functional/ui/output_spec.lua index 139ef5964e..4088cb77fa 100644 --- a/test/functional/ui/output_spec.lua +++ b/test/functional/ui/output_spec.lua @@ -50,6 +50,10 @@ describe("shell command :!", function() end) it("throttles shell-command output greater than ~10KB", function() + if 'openbsd' == string.lower(helpers.uname()) then + pending('FIXME #10804', function() end) + return + end child_session.feed_data(":!"..nvim_dir.."/shell-test REP 30001 foo\n") -- If we observe any line starting with a dot, then throttling occurred. From ead39d6ce6d1c5e5b6130c6823d071889c207bde Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Sun, 1 Sep 2019 21:21:26 -0700 Subject: [PATCH 6/6] test/uname(): always lowercase --- test/functional/core/channels_spec.lua | 2 +- test/functional/helpers.lua | 14 +++++--------- test/functional/terminal/tui_spec.lua | 8 ++++---- test/functional/ui/cmdline_spec.lua | 2 +- test/functional/ui/embed_spec.lua | 2 +- test/functional/ui/output_spec.lua | 2 +- test/helpers.lua | 20 +++++++++++++------- 7 files changed, 26 insertions(+), 24 deletions(-) diff --git a/test/functional/core/channels_spec.lua b/test/functional/core/channels_spec.lua index 30dcb6d7b4..852d9808f5 100644 --- a/test/functional/core/channels_spec.lua +++ b/test/functional/core/channels_spec.lua @@ -139,7 +139,7 @@ describe('channels', function() command("call chansend(id, 'incomplet\004')") - local is_bsd = not not string.find(string.lower(uname()), 'bsd') + local is_bsd = not not string.find(uname(), 'bsd') local bsdlike = is_bsd or (os_name() == "osx") local extra = bsdlike and "^D\008\008" or "" expect_twoline(id, "stdout", diff --git a/test/functional/helpers.lua b/test/functional/helpers.lua index c718a37021..c34849b439 100644 --- a/test/functional/helpers.lua +++ b/test/functional/helpers.lua @@ -48,7 +48,7 @@ if module.nvim_dir == module.nvim_prog then end local tmpname = global_helpers.tmpname -local uname = global_helpers.uname +local iswin = global_helpers.iswin local prepend_argv if os.getenv('VALGRIND') then @@ -287,10 +287,6 @@ module.os_name = (function() end) end)() -function module.iswin() - return package.config:sub(1,1) == '\\' -end - -- Executes a VimL function. -- Fails on VimL error, but does not update v:errmsg. function module.call(name, ...) @@ -672,7 +668,7 @@ end -- Helper to skip tests. Returns true in Windows systems. -- pending_fn is pending() from busted function module.pending_win32(pending_fn) - if uname() == 'Windows' then + if iswin() then if pending_fn ~= nil then pending_fn('FIXME: Windows', function() end) end @@ -734,12 +730,12 @@ function module.redir_exec(cmd) end function module.get_pathsep() - return module.iswin() and '\\' or '/' + return iswin() and '\\' or '/' end function module.pathroot() local pathsep = package.config:sub(1,1) - return module.iswin() and (module.nvim_dir:sub(1,2)..pathsep) or '/' + return iswin() and (module.nvim_dir:sub(1,2)..pathsep) or '/' end -- Returns a valid, platform-independent $NVIM_LISTEN_ADDRESS. @@ -765,7 +761,7 @@ function module.missing_provider(provider) end function module.alter_slashes(obj) - if not module.iswin() then + if not iswin() then return obj end if type(obj) == 'string' then diff --git a/test/functional/terminal/tui_spec.lua b/test/functional/terminal/tui_spec.lua index 01e13ce4d4..99b25cbf48 100644 --- a/test/functional/terminal/tui_spec.lua +++ b/test/functional/terminal/tui_spec.lua @@ -902,7 +902,7 @@ end) -- does not initialize the TUI. describe("TUI 't_Co' (terminal colors)", function() local screen - local is_freebsd = (string.lower(uname()) == 'freebsd') + local is_freebsd = (uname() == 'freebsd') local function assert_term_colors(term, colorterm, maxcolors) helpers.clear({env={TERM=term}, args={}}) @@ -1176,8 +1176,8 @@ end) -- does not initialize the TUI. describe("TUI 'term' option", function() local screen - local is_bsd = not not string.find(string.lower(uname()), 'bsd') - local is_macos = not not string.find(string.lower(uname()), 'darwin') + local is_bsd = not not string.find(uname(), 'bsd') + local is_macos = not not string.find(uname(), 'darwin') local function assert_term(term_envvar, term_expected) clear() @@ -1203,7 +1203,7 @@ describe("TUI 'term' option", function() end) it('gets system-provided term if $TERM is valid', function() - if string.lower(uname()) == "openbsd" then + if uname() == "openbsd" then assert_term("xterm", "xterm") elseif is_bsd then -- BSD lacks terminfo, builtin is always used. assert_term("xterm", "builtin_xterm") diff --git a/test/functional/ui/cmdline_spec.lua b/test/functional/ui/cmdline_spec.lua index ea68d9a431..f9769c706f 100644 --- a/test/functional/ui/cmdline_spec.lua +++ b/test/functional/ui/cmdline_spec.lua @@ -828,7 +828,7 @@ describe('cmdline redraw', function() end) it('with ', function() - if 'openbsd' == string.lower(helpers.uname()) then + if 'openbsd' == helpers.uname() then pending('FIXME #10804', function() end) return end diff --git a/test/functional/ui/embed_spec.lua b/test/functional/ui/embed_spec.lua index 6b2ad7c72b..5e09dc4289 100644 --- a/test/functional/ui/embed_spec.lua +++ b/test/functional/ui/embed_spec.lua @@ -49,7 +49,7 @@ local function test_embed(ext_linegrid) end) it("doesn't erase output when setting color scheme", function() - if 'openbsd' == string.lower(helpers.uname()) then + if 'openbsd' == helpers.uname() then pending('FIXME #10804', function() end) return end diff --git a/test/functional/ui/output_spec.lua b/test/functional/ui/output_spec.lua index 4088cb77fa..c028f44b44 100644 --- a/test/functional/ui/output_spec.lua +++ b/test/functional/ui/output_spec.lua @@ -50,7 +50,7 @@ describe("shell command :!", function() end) it("throttles shell-command output greater than ~10KB", function() - if 'openbsd' == string.lower(helpers.uname()) then + if 'openbsd' == helpers.uname() then pending('FIXME #10804', function() end) return end diff --git a/test/helpers.lua b/test/helpers.lua index 08a7822b19..25fff55596 100644 --- a/test/helpers.lua +++ b/test/helpers.lua @@ -158,7 +158,11 @@ function module.check_logs() table.concat(runtime_errors, ', '))) end --- Tries to get platform name from $SYSTEM_NAME, uname; fallback is "Windows". +function module.iswin() + return package.config:sub(1,1) == '\\' +end + +-- Gets (lowercase) OS name from CMake, uname, or "win" if iswin(). module.uname = (function() local platform = nil return (function() @@ -166,17 +170,19 @@ module.uname = (function() return platform end - platform = os.getenv("SYSTEM_NAME") - if platform then + if os.getenv("SYSTEM_NAME") then -- From CMAKE_SYSTEM_NAME. + platform = string.lower(os.getenv("SYSTEM_NAME")) return platform end local status, f = pcall(module.popen_r, 'uname', '-s') if status then - platform = f:read("*l") + platform = string.lower(f:read("*l")) f:close() + elseif module.iswin() then + platform = 'windows' else - platform = 'Windows' + error('unknown platform') end return platform end) @@ -203,11 +209,11 @@ module.tmpname = (function() return fname else local fname = os.tmpname() - if module.uname() == 'Windows' and fname:sub(1, 2) == '\\s' then + if module.uname() == 'windows' and fname:sub(1, 2) == '\\s' then -- In Windows tmpname() returns a filename starting with -- special sequence \s, prepend $TEMP path return tmpdir..fname - elseif fname:match('^/tmp') and module.uname() == 'Darwin' then + elseif fname:match('^/tmp') and module.uname() == 'darwin' then -- In OS X /tmp links to /private/tmp return '/private'..fname else