mirror of
https://github.com/neovim/neovim.git
synced 2025-09-08 04:18:18 +00:00
refactor(tests): lift retry() into assert_log()
This commit is contained in:
@@ -84,9 +84,7 @@ describe('notify', function()
|
|||||||
}}
|
}}
|
||||||
nvim('subscribe', 'event1')
|
nvim('subscribe', 'event1')
|
||||||
nvim('unsubscribe', 'doesnotexist')
|
nvim('unsubscribe', 'doesnotexist')
|
||||||
retry(nil, 1000, function()
|
|
||||||
assert_log("tried to unsubscribe unknown event 'doesnotexist'", testlog, 10)
|
assert_log("tried to unsubscribe unknown event 'doesnotexist'", testlog, 10)
|
||||||
end)
|
|
||||||
nvim('unsubscribe', 'event1')
|
nvim('unsubscribe', 'event1')
|
||||||
assert_alive()
|
assert_alive()
|
||||||
end)
|
end)
|
||||||
|
@@ -295,9 +295,7 @@ describe('tmpdir', function()
|
|||||||
clear({ env={ NVIM_LOG_FILE=testlog, TMPDIR=faketmp, } })
|
clear({ env={ NVIM_LOG_FILE=testlog, TMPDIR=faketmp, } })
|
||||||
matches(tmproot_pat, funcs.stdpath('run')) -- Tickle vim_mktempdir().
|
matches(tmproot_pat, funcs.stdpath('run')) -- Tickle vim_mktempdir().
|
||||||
-- Assert that broken tmpdir root was handled.
|
-- Assert that broken tmpdir root was handled.
|
||||||
retry(nil, 1000, function()
|
|
||||||
assert_log('tempdir root not a directory', testlog, 100)
|
assert_log('tempdir root not a directory', testlog, 100)
|
||||||
end)
|
|
||||||
|
|
||||||
-- "…/nvim.<user>/" has wrong permissions:
|
-- "…/nvim.<user>/" has wrong permissions:
|
||||||
skip(is_os('win'), 'TODO(justinmk): need setfperm/getfperm on Windows. #8244')
|
skip(is_os('win'), 'TODO(justinmk): need setfperm/getfperm on Windows. #8244')
|
||||||
@@ -308,10 +306,8 @@ describe('tmpdir', function()
|
|||||||
clear({ env={ NVIM_LOG_FILE=testlog, TMPDIR=faketmp, } })
|
clear({ env={ NVIM_LOG_FILE=testlog, TMPDIR=faketmp, } })
|
||||||
matches(tmproot_pat, funcs.stdpath('run')) -- Tickle vim_mktempdir().
|
matches(tmproot_pat, funcs.stdpath('run')) -- Tickle vim_mktempdir().
|
||||||
-- Assert that broken tmpdir root was handled.
|
-- Assert that broken tmpdir root was handled.
|
||||||
retry(nil, 1000, function()
|
|
||||||
assert_log('tempdir root has invalid permissions', testlog, 100)
|
assert_log('tempdir root has invalid permissions', testlog, 100)
|
||||||
end)
|
end)
|
||||||
end)
|
|
||||||
|
|
||||||
it('too long', function()
|
it('too long', function()
|
||||||
local bigname = ('%s/%s'):format(faketmp, ('x'):rep(666))
|
local bigname = ('%s/%s'):format(faketmp, ('x'):rep(666))
|
||||||
|
@@ -6,7 +6,6 @@ local eq = helpers.eq
|
|||||||
local exec_lua = helpers.exec_lua
|
local exec_lua = helpers.exec_lua
|
||||||
local expect_exit = helpers.expect_exit
|
local expect_exit = helpers.expect_exit
|
||||||
local request = helpers.request
|
local request = helpers.request
|
||||||
local retry = helpers.retry
|
|
||||||
|
|
||||||
describe('log', function()
|
describe('log', function()
|
||||||
local testlog = 'Xtest_logging'
|
local testlog = 'Xtest_logging'
|
||||||
@@ -40,9 +39,7 @@ describe('log', function()
|
|||||||
}})
|
}})
|
||||||
|
|
||||||
local tid = _G._nvim_test_id
|
local tid = _G._nvim_test_id
|
||||||
retry(nil, 1000, function()
|
|
||||||
assert_log(tid..'%.%d+%.%d +server_init:%d+: test log message', testlog, 100)
|
assert_log(tid..'%.%d+%.%d +server_init:%d+: test log message', testlog, 100)
|
||||||
end)
|
|
||||||
|
|
||||||
exec_lua([[
|
exec_lua([[
|
||||||
local j1 = vim.fn.jobstart({ vim.v.progpath, '-es', '-V1', '+foochild', '+qa!' }, vim.empty_dict())
|
local j1 = vim.fn.jobstart({ vim.v.progpath, '-es', '-V1', '+foochild', '+qa!' }, vim.empty_dict())
|
||||||
@@ -50,8 +47,6 @@ describe('log', function()
|
|||||||
]])
|
]])
|
||||||
|
|
||||||
-- Child Nvim spawned by jobstart() appends "/c" to parent name.
|
-- Child Nvim spawned by jobstart() appends "/c" to parent name.
|
||||||
retry(nil, 1000, function()
|
|
||||||
assert_log('%.%d+%.%d/c +server_init:%d+: test log message', testlog, 100)
|
assert_log('%.%d+%.%d/c +server_init:%d+: test log message', testlog, 100)
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
end)
|
|
||||||
|
@@ -43,11 +43,9 @@ describe('startup', function()
|
|||||||
|
|
||||||
it('--startuptime', function()
|
it('--startuptime', function()
|
||||||
clear({ args = {'--startuptime', testfile}})
|
clear({ args = {'--startuptime', testfile}})
|
||||||
retry(nil, 1000, function()
|
|
||||||
assert_log('sourcing', testfile, 100)
|
assert_log('sourcing', testfile, 100)
|
||||||
assert_log("require%('vim%._editor'%)", testfile, 100)
|
assert_log("require%('vim%._editor'%)", testfile, 100)
|
||||||
end)
|
end)
|
||||||
end)
|
|
||||||
|
|
||||||
it('-D does not hang #12647', function()
|
it('-D does not hang #12647', function()
|
||||||
clear()
|
clear()
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
require('coxpcall')
|
require('coxpcall')
|
||||||
local busted = require('busted')
|
|
||||||
local luv = require('luv')
|
local luv = require('luv')
|
||||||
local lfs = require('lfs')
|
local lfs = require('lfs')
|
||||||
local mpack = require('mpack')
|
local mpack = require('mpack')
|
||||||
@@ -434,28 +433,6 @@ function module.connect(file_or_address)
|
|||||||
return Session.new(stream)
|
return Session.new(stream)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Calls fn() until it succeeds, up to `max` times or until `max_ms`
|
|
||||||
-- milliseconds have passed.
|
|
||||||
function module.retry(max, max_ms, fn)
|
|
||||||
assert(max == nil or max > 0)
|
|
||||||
assert(max_ms == nil or max_ms > 0)
|
|
||||||
local tries = 1
|
|
||||||
local timeout = (max_ms and max_ms or 10000)
|
|
||||||
local start_time = luv.now()
|
|
||||||
while true do
|
|
||||||
local status, result = pcall(fn)
|
|
||||||
if status then
|
|
||||||
return result
|
|
||||||
end
|
|
||||||
luv.update_time() -- Update cached value of luv.now() (libuv: uv_now()).
|
|
||||||
if (max and tries >= max) or (luv.now() - start_time > timeout) then
|
|
||||||
busted.fail(string.format("retry() attempts: %d\n%s", tries, tostring(result)), 2)
|
|
||||||
end
|
|
||||||
tries = tries + 1
|
|
||||||
luv.sleep(20) -- Avoid hot loop...
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Starts a new global Nvim session.
|
-- Starts a new global Nvim session.
|
||||||
--
|
--
|
||||||
-- Parameters are interpreted as startup args, OR a map with these keys:
|
-- Parameters are interpreted as startup args, OR a map with these keys:
|
||||||
|
@@ -4,7 +4,6 @@ local Screen = require('test.functional.ui.screen')
|
|||||||
|
|
||||||
local assert_alive = helpers.assert_alive
|
local assert_alive = helpers.assert_alive
|
||||||
local assert_log = helpers.assert_log
|
local assert_log = helpers.assert_log
|
||||||
local retry = helpers.retry
|
|
||||||
local meths = helpers.meths
|
local meths = helpers.meths
|
||||||
local command = helpers.command
|
local command = helpers.command
|
||||||
local clear = helpers.clear
|
local clear = helpers.clear
|
||||||
@@ -360,9 +359,7 @@ describe('XDG defaults', function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
it('are correctly set', function()
|
it('are correctly set', function()
|
||||||
retry(nil, 1000, function()
|
|
||||||
assert_log('Failed to start server: no such file or directory: /X/X/X', testlog, 10)
|
assert_log('Failed to start server: no such file or directory: /X/X/X', testlog, 10)
|
||||||
end)
|
|
||||||
|
|
||||||
local vimruntime, libdir = vimruntime_and_libdir()
|
local vimruntime, libdir = vimruntime_and_libdir()
|
||||||
|
|
||||||
@@ -436,9 +433,8 @@ describe('XDG defaults', function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
it('are not expanded', function()
|
it('are not expanded', function()
|
||||||
retry(nil, 1000, function()
|
|
||||||
assert_log('Failed to start server: no such file or directory: %$XDG_RUNTIME_DIR%/', testlog, 10)
|
assert_log('Failed to start server: no such file or directory: %$XDG_RUNTIME_DIR%/', testlog, 10)
|
||||||
end)
|
|
||||||
local vimruntime, libdir = vimruntime_and_libdir()
|
local vimruntime, libdir = vimruntime_and_libdir()
|
||||||
eq((('$XDG_DATA_HOME/nvim'
|
eq((('$XDG_DATA_HOME/nvim'
|
||||||
.. ',$XDG_DATA_DIRS/nvim'
|
.. ',$XDG_DATA_DIRS/nvim'
|
||||||
|
@@ -1,6 +1,5 @@
|
|||||||
local helpers = require('test.functional.helpers')(after_each)
|
local helpers = require('test.functional.helpers')(after_each)
|
||||||
local assert_log = helpers.assert_log
|
local assert_log = helpers.assert_log
|
||||||
local retry = helpers.retry
|
|
||||||
local eq, neq, eval = helpers.eq, helpers.neq, helpers.eval
|
local eq, neq, eval = helpers.eq, helpers.neq, helpers.eval
|
||||||
local clear, funcs, meths = helpers.clear, helpers.funcs, helpers.meths
|
local clear, funcs, meths = helpers.clear, helpers.funcs, helpers.meths
|
||||||
local ok = helpers.ok
|
local ok = helpers.ok
|
||||||
@@ -88,10 +87,8 @@ describe('server', function()
|
|||||||
}}
|
}}
|
||||||
eq(0, eval("serverstop('')"))
|
eq(0, eval("serverstop('')"))
|
||||||
eq(0, eval("serverstop('bogus-socket-name')"))
|
eq(0, eval("serverstop('bogus-socket-name')"))
|
||||||
retry(nil, 1000, function()
|
|
||||||
assert_log('Not listening on bogus%-socket%-name', testlog, 10)
|
assert_log('Not listening on bogus%-socket%-name', testlog, 10)
|
||||||
end)
|
end)
|
||||||
end)
|
|
||||||
|
|
||||||
it('parses endpoints', function()
|
it('parses endpoints', function()
|
||||||
clear{env={
|
clear{env={
|
||||||
@@ -121,9 +118,7 @@ describe('server', function()
|
|||||||
if status then
|
if status then
|
||||||
table.insert(expected, v4)
|
table.insert(expected, v4)
|
||||||
pcall(funcs.serverstart, v4) -- exists already; ignore
|
pcall(funcs.serverstart, v4) -- exists already; ignore
|
||||||
retry(nil, 1000, function()
|
|
||||||
assert_log('Failed to start server: address already in use: 127%.0%.0%.1', testlog, 10)
|
assert_log('Failed to start server: address already in use: 127%.0%.0%.1', testlog, 10)
|
||||||
end)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local v6 = '::1:12345'
|
local v6 = '::1:12345'
|
||||||
@@ -131,9 +126,7 @@ describe('server', function()
|
|||||||
if status then
|
if status then
|
||||||
table.insert(expected, v6)
|
table.insert(expected, v6)
|
||||||
pcall(funcs.serverstart, v6) -- exists already; ignore
|
pcall(funcs.serverstart, v6) -- exists already; ignore
|
||||||
retry(nil, 1000, function()
|
|
||||||
assert_log('Failed to start server: address already in use: ::1', testlog, 10)
|
assert_log('Failed to start server: address already in use: ::1', testlog, 10)
|
||||||
end)
|
|
||||||
end
|
end
|
||||||
eq(expected, funcs.serverlist())
|
eq(expected, funcs.serverlist())
|
||||||
clear_serverlist()
|
clear_serverlist()
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
require('test.compat')
|
require('test.compat')
|
||||||
local shared = require('vim.shared')
|
local shared = require('vim.shared')
|
||||||
local assert = require('luassert')
|
local assert = require('luassert')
|
||||||
|
local busted = require('busted')
|
||||||
local luv = require('luv')
|
local luv = require('luv')
|
||||||
local lfs = require('lfs')
|
local lfs = require('lfs')
|
||||||
local relpath = require('pl.path').relpath
|
local relpath = require('pl.path').relpath
|
||||||
@@ -45,6 +46,28 @@ function module.sleep(ms)
|
|||||||
luv.sleep(ms)
|
luv.sleep(ms)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Calls fn() until it succeeds, up to `max` times or until `max_ms`
|
||||||
|
-- milliseconds have passed.
|
||||||
|
function module.retry(max, max_ms, fn)
|
||||||
|
assert(max == nil or max > 0)
|
||||||
|
assert(max_ms == nil or max_ms > 0)
|
||||||
|
local tries = 1
|
||||||
|
local timeout = (max_ms and max_ms or 10000)
|
||||||
|
local start_time = luv.now()
|
||||||
|
while true do
|
||||||
|
local status, result = pcall(fn)
|
||||||
|
if status then
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
luv.update_time() -- Update cached value of luv.now() (libuv: uv_now()).
|
||||||
|
if (max and tries >= max) or (luv.now() - start_time > timeout) then
|
||||||
|
busted.fail(string.format("retry() attempts: %d\n%s", tries, tostring(result)), 2)
|
||||||
|
end
|
||||||
|
tries = tries + 1
|
||||||
|
luv.sleep(20) -- Avoid hot loop...
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local check_logs_useless_lines = {
|
local check_logs_useless_lines = {
|
||||||
['Warning: noted but unhandled ioctl']=1,
|
['Warning: noted but unhandled ioctl']=1,
|
||||||
['could cause spurious value errors to appear']=2,
|
['could cause spurious value errors to appear']=2,
|
||||||
@@ -87,6 +110,8 @@ end
|
|||||||
|
|
||||||
--- Asserts that `pat` matches (or *not* if inverse=true) any line in the tail of `logfile`.
|
--- Asserts that `pat` matches (or *not* if inverse=true) any line in the tail of `logfile`.
|
||||||
---
|
---
|
||||||
|
--- Retries for 1 second in case of filesystem delay.
|
||||||
|
---
|
||||||
---@param pat (string) Lua pattern to match lines in the log file
|
---@param pat (string) Lua pattern to match lines in the log file
|
||||||
---@param logfile (string) Full path to log file (default=$NVIM_LOG_FILE)
|
---@param logfile (string) Full path to log file (default=$NVIM_LOG_FILE)
|
||||||
---@param nrlines (number) Search up to this many log lines
|
---@param nrlines (number) Search up to this many log lines
|
||||||
@@ -96,6 +121,8 @@ function module.assert_log(pat, logfile, nrlines, inverse)
|
|||||||
assert(logfile ~= nil, 'no logfile')
|
assert(logfile ~= nil, 'no logfile')
|
||||||
nrlines = nrlines or 10
|
nrlines = nrlines or 10
|
||||||
inverse = inverse or false
|
inverse = inverse or false
|
||||||
|
|
||||||
|
module.retry(nil, 1000, function()
|
||||||
local lines = module.read_file_list(logfile, -nrlines) or {}
|
local lines = module.read_file_list(logfile, -nrlines) or {}
|
||||||
local msg = string.format('Pattern %q %sfound in log (last %d lines): %s:\n%s',
|
local msg = string.format('Pattern %q %sfound in log (last %d lines): %s:\n%s',
|
||||||
pat, (inverse and '' or 'not '), nrlines, logfile, ' '..table.concat(lines, '\n '))
|
pat, (inverse and '' or 'not '), nrlines, logfile, ' '..table.concat(lines, '\n '))
|
||||||
@@ -105,9 +132,10 @@ function module.assert_log(pat, logfile, nrlines, inverse)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
if not inverse then error(msg) end
|
if not inverse then error(msg) end
|
||||||
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Asserts that `pat` does NOT matche any line in the tail of `logfile`.
|
--- Asserts that `pat` does NOT match any line in the tail of `logfile`.
|
||||||
---
|
---
|
||||||
--- @see assert_log
|
--- @see assert_log
|
||||||
function module.assert_nolog(pat, logfile, nrlines)
|
function module.assert_nolog(pat, logfile, nrlines)
|
||||||
|
Reference in New Issue
Block a user