aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2014-11-06 23:54:49 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2014-11-07 00:55:58 -0300
commit168a46fd316812ad0393101cf65eef1442d2605a (patch)
tree28162846bb315097b163127448ec87a33ebaef59
parent3e78fc9faf9c25233a17493f659a758ed21cd470 (diff)
downloadrneovim-168a46fd316812ad0393101cf65eef1442d2605a.tar.gz
rneovim-168a46fd316812ad0393101cf65eef1442d2605a.tar.bz2
rneovim-168a46fd316812ad0393101cf65eef1442d2605a.zip
test: Improve test environment setup and error handling/reporting
During test setup, we used to call a vimscript function(BeforeEachTest) that attempted to restore Nvim to it's initial state as much as possible in order to provide a clean environment for running new tests. This approach has proven to be unreliable, as some tests leave state that can affect other tests, eventually causing failures that are difficult to debug. This commit changes the 'clear' function so it will restart Nvim every time it is called, which is a slower, but more reliable solution that will simplify spotting bugs in the future. Some other improvements/fixes were also performed: - Whenever an error is detected in a handler passed to "run()", the event loop will be stopped and the error will be propagated to the main thread. - Errors and the "cleanup()" function will always send a quit command to the current Nvim instance. This should prevent memory starvation when running tests under valgrind(where each Nvim instance can consume a lot of memory). - Fixed a wrong assertion in server_requests_spec.lua. Previously the failure was undetected in a notification handler. - Fixed some tests to expect fully clean registers. The deleted cleanup function used to put an empty string in every register, but that resulted in a extra line being added.
-rw-r--r--test/functional/api/server_requests_spec.lua4
-rw-r--r--test/functional/helpers.lua119
-rw-r--r--test/functional/legacy/006_argument_list_spec.lua2
-rw-r--r--test/functional/legacy/007_ball_buffer_list_spec.lua2
-rw-r--r--test/functional/legacy/021_control_wi_spec.lua2
-rw-r--r--test/functional/legacy/023_edit_arguments_spec.lua4
-rw-r--r--test/functional/legacy/041_writing_and_reading_hundred_kbyte_spec.lua2
-rw-r--r--test/functional/legacy/options_spec.lua3
8 files changed, 49 insertions, 89 deletions
diff --git a/test/functional/api/server_requests_spec.lua b/test/functional/api/server_requests_spec.lua
index 916bdfd9f0..a37c41294b 100644
--- a/test/functional/api/server_requests_spec.lua
+++ b/test/functional/api/server_requests_spec.lua
@@ -4,7 +4,6 @@
local helpers = require('test.functional.helpers')
local clear, nvim, eval = helpers.clear, helpers.nvim, helpers.eval
local eq, run, stop = helpers.eq, helpers.run, helpers.stop
-local restart = helpers.restart
@@ -15,7 +14,6 @@ describe('server -> client', function()
clear()
cid = nvim('get_api_info')[1]
end)
- teardown(restart)
describe('simple call', function()
it('works', function()
@@ -110,7 +108,7 @@ describe('server -> client', function()
return
end
notified = notified + 1
- eq('notified', eval('rpcrequest('..cid..', "notify")'))
+ eq('notified!', eval('rpcrequest('..cid..', "notify")'))
end
run(on_request, on_notification, on_setup)
diff --git a/test/functional/helpers.lua b/test/functional/helpers.lua
index 70f4fcf9e5..fcef1bd621 100644
--- a/test/functional/helpers.lua
+++ b/test/functional/helpers.lua
@@ -1,10 +1,11 @@
+require('coxpcall')
local Loop = require('nvim.loop')
local MsgpackStream = require('nvim.msgpack_stream')
local AsyncSession = require('nvim.async_session')
local Session = require('nvim.session')
local nvim_prog = os.getenv('NVIM_PROG') or 'build/bin/nvim'
-local nvim_argv = {nvim_prog, '-u', 'NONE', '-N', '--embed'}
+local nvim_argv = {nvim_prog, '-u', 'NONE', '-i', 'NONE', '-N', '--embed'}
if os.getenv('VALGRIND') then
local log_file = os.getenv('VALGRIND_LOG') or 'valgrind-%p.log'
@@ -23,74 +24,7 @@ if os.getenv('VALGRIND') then
nvim_argv = valgrind_argv
end
-local session
-
-local rawfeed
-local function restart()
- local loop = Loop.new()
- local msgpack_stream = MsgpackStream.new(loop)
- local async_session = AsyncSession.new(msgpack_stream)
- session = Session.new(async_session)
- loop:spawn(nvim_argv)
- rawfeed([[:function BeforeEachTest()
- set all&
- redir => groups
- silent augroup
- redir END
- for group in split(groups)
- exe 'augroup '.group
- autocmd!
- augroup END
- endfor
- autocmd!
- tabnew
- let curbufnum = eval(bufnr('%'))
- redir => buflist
- silent ls!
- redir END
- let bufnums = []
- for buf in split(buflist, '\n')
- let bufnum = eval(split(buf, '[ u]')[0])
- if bufnum != curbufnum
- call add(bufnums, bufnum)
- endif
- endfor
- if len(bufnums) > 0
- exe 'silent bwipeout! '.join(bufnums, ' ')
- endif
- silent tabonly
- for k in keys(g:)
- exe 'unlet g:'.k
- endfor
- filetype plugin indent off
- mapclear
- mapclear!
- abclear
- comclear
- let regs = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/-"'
- let i = 0
- while i < strlen(regs)
- call setreg(regs[i], '')
- let i = i+1
- endwhile
- redir => funcs
- silent! function
- redir END
- for fname in split(funcs, '\n')
- let matches = matchlist(fname, '\v^function ([^()<>]+)')
- if type([]) == type(matches) && matches[1] !~ 'BeforeEachTest'
- exe 'silent! delfunc '.matches[1]
- endif
- endfor
- let options = ['shell', 'fileignorecase']
- for option in options
- exe 'set '.option.'&'
- endfor
- endfunction
- ]])
-end
-
-local loop_running, last_error
+local session, loop_running, last_error
local function request(method, ...)
local status, rv = session:request(method, ...)
@@ -112,9 +46,32 @@ local function next_message()
return session:next_message()
end
+local function call_and_stop_on_error(...)
+ local status, result = copcall(...)
+ if not status then
+ session:stop()
+ last_error = result
+ return ''
+ end
+ return result
+end
+
local function run(request_cb, notification_cb, setup_cb)
+
+ local function on_request(method, args)
+ return call_and_stop_on_error(request_cb, method, args)
+ end
+
+ local function on_notification(method, args)
+ call_and_stop_on_error(notification_cb, method, args)
+ end
+
+ local function on_setup()
+ call_and_stop_on_error(setup_cb)
+ end
+
loop_running = true
- session:run(request_cb, notification_cb, setup_cb)
+ session:run(on_request, on_notification, on_setup)
loop_running = false
if last_error then
local err = last_error
@@ -153,7 +110,7 @@ local function buffer_slice(start, stop, buffer_idx)
end
local function nvim_replace_termcodes(input)
- return request('vim_replace_termcodes', input, false, true, true )
+ return request('vim_replace_termcodes', input, false, true, true)
end
local function dedent(str)
@@ -178,22 +135,29 @@ local function dedent(str)
return str
end
-local function clear()
- nvim_command('call BeforeEachTest()')
-end
-
local function feed(...)
for _, v in ipairs({...}) do
nvim_feed(nvim_replace_termcodes(dedent(v)))
end
end
-function rawfeed(...)
+local function rawfeed(...)
for _, v in ipairs({...}) do
nvim_feed(dedent(v), 'nt')
end
end
+local function clear()
+ if session then
+ session:request('vim_command', 'qa!')
+ end
+ local loop = Loop.new()
+ local msgpack_stream = MsgpackStream.new(loop)
+ local async_session = AsyncSession.new(msgpack_stream)
+ session = Session.new(async_session)
+ loop:spawn(nvim_argv)
+end
+
local function insert(...)
nvim_feed('i', 'nt')
rawfeed(...)
@@ -271,12 +235,11 @@ local function curtab(method, ...)
return tabpage(method, tab, ...)
end
-restart()
+clear()
return {
clear = clear,
dedent = dedent,
- restart = restart,
rawfeed = rawfeed,
insert = insert,
feed = feed,
diff --git a/test/functional/legacy/006_argument_list_spec.lua b/test/functional/legacy/006_argument_list_spec.lua
index 30fb9a55ff..1266a876d4 100644
--- a/test/functional/legacy/006_argument_list_spec.lua
+++ b/test/functional/legacy/006_argument_list_spec.lua
@@ -50,7 +50,7 @@ describe('argument list', function()
execute('%d')
execute('0put=@a')
- execute('1d | $d')
+ execute('$d')
eq(dedent([[
start of test file Xxx1
diff --git a/test/functional/legacy/007_ball_buffer_list_spec.lua b/test/functional/legacy/007_ball_buffer_list_spec.lua
index 6d89323215..295f63f044 100644
--- a/test/functional/legacy/007_ball_buffer_list_spec.lua
+++ b/test/functional/legacy/007_ball_buffer_list_spec.lua
@@ -51,7 +51,7 @@ describe(':ball', function()
execute('bf')
execute('%d')
execute('0put=@a')
- execute('1d | $d')
+ execute('$d')
expect([[
start of test file Xxx4
diff --git a/test/functional/legacy/021_control_wi_spec.lua b/test/functional/legacy/021_control_wi_spec.lua
index f1f529e9a8..9fd83fec5f 100644
--- a/test/functional/legacy/021_control_wi_spec.lua
+++ b/test/functional/legacy/021_control_wi_spec.lua
@@ -31,7 +31,7 @@ describe('CTRL-W CTRL-I', function()
-- Clean buffer and put register
feed('ggdG"ap')
- execute('1,2d')
+ execute('1d')
-- The buffer should now contain:
expect([[
diff --git a/test/functional/legacy/023_edit_arguments_spec.lua b/test/functional/legacy/023_edit_arguments_spec.lua
index b5955c5987..e68af9758d 100644
--- a/test/functional/legacy/023_edit_arguments_spec.lua
+++ b/test/functional/legacy/023_edit_arguments_spec.lua
@@ -35,8 +35,8 @@ describe(':edit', function()
execute('%d')
execute('0put a')
- -- Remove empty lines
- execute('1d | $d')
+ -- Remove empty line
+ execute('$d')
-- The buffer should now contain
expect([[
diff --git a/test/functional/legacy/041_writing_and_reading_hundred_kbyte_spec.lua b/test/functional/legacy/041_writing_and_reading_hundred_kbyte_spec.lua
index ed1a914c0f..42fb5ed2b3 100644
--- a/test/functional/legacy/041_writing_and_reading_hundred_kbyte_spec.lua
+++ b/test/functional/legacy/041_writing_and_reading_hundred_kbyte_spec.lua
@@ -25,7 +25,7 @@ describe('writing and reading a file of over 100 Kbyte', function()
execute('6005yank A')
execute('%d')
execute('0put a')
- execute('1d | $d')
+ execute('$d')
execute('w!')
expect([[
diff --git a/test/functional/legacy/options_spec.lua b/test/functional/legacy/options_spec.lua
index 983d168609..773acb9663 100644
--- a/test/functional/legacy/options_spec.lua
+++ b/test/functional/legacy/options_spec.lua
@@ -2,11 +2,10 @@
-- other tests, so restart nvim in the teardown hook
local helpers = require('test.functional.helpers')
-local restart, command, clear = helpers.restart, helpers.command, helpers.clear
+local command, clear = helpers.command, helpers.clear
describe('options', function()
setup(clear)
- teardown(restart)
it('is working', function()
command('options')