Merge #21844 test: avoid noise in test logs

This commit is contained in:
Justin M. Keyes
2023-01-16 18:38:20 -05:00
committed by GitHub
10 changed files with 95 additions and 56 deletions

View File

@@ -101,7 +101,7 @@ char *server_address_new(const char *name)
xfree(dir); xfree(dir);
#endif #endif
if ((size_t)r >= sizeof(fmt)) { if ((size_t)r >= sizeof(fmt)) {
ELOG("truncated server address"); ELOG("truncated server address: %.40s...", fmt);
} }
return xstrdup(fmt); return xstrdup(fmt);
} }

View File

@@ -1,4 +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 eq, clear, eval, command, nvim, next_msg = local eq, clear, eval, command, nvim, next_msg =
helpers.eq, helpers.clear, helpers.eval, helpers.command, helpers.nvim, helpers.eq, helpers.clear, helpers.eval, helpers.command, helpers.nvim,
helpers.next_msg helpers.next_msg
@@ -9,6 +10,8 @@ local is_ci = helpers.is_ci
local assert_alive = helpers.assert_alive local assert_alive = helpers.assert_alive
local skip = helpers.skip local skip = helpers.skip
local testlog = 'Xtest-server-notify-log'
describe('notify', function() describe('notify', function()
local channel local channel
@@ -17,6 +20,10 @@ describe('notify', function()
channel = nvim('get_api_info')[1] channel = nvim('get_api_info')[1]
end) end)
after_each(function()
os.remove(testlog)
end)
describe('passing a valid channel id', function() describe('passing a valid channel id', function()
it('sends the notification/args to the corresponding channel', function() it('sends the notification/args to the corresponding channel', function()
eval('rpcnotify('..channel..', "test-event", 1, 2, 3)') eval('rpcnotify('..channel..', "test-event", 1, 2, 3)')
@@ -72,8 +79,12 @@ describe('notify', function()
end) end)
it('unsubscribe non-existing event #8745', function() it('unsubscribe non-existing event #8745', function()
clear{env={
NVIM_LOG_FILE=testlog,
}}
nvim('subscribe', 'event1') nvim('subscribe', 'event1')
nvim('unsubscribe', 'doesnotexist') nvim('unsubscribe', 'doesnotexist')
assert_log("tried to unsubscribe unknown event 'doesnotexist'", testlog, 10)
nvim('unsubscribe', 'event1') nvim('unsubscribe', 'event1')
assert_alive() assert_alive()
end) end)

View File

@@ -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))

View File

@@ -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)

View File

@@ -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()

View File

@@ -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:

View File

@@ -2,6 +2,7 @@
local helpers = require('test.functional.helpers')(after_each) local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen') local Screen = require('test.functional.ui.screen')
local nvim_prog = helpers.nvim_prog
local funcs = helpers.funcs local funcs = helpers.funcs
local meths = helpers.meths local meths = helpers.meths
local command = helpers.command local command = helpers.command
@@ -22,7 +23,6 @@ local remove_trace = helpers.remove_trace
local mkdir_p = helpers.mkdir_p local mkdir_p = helpers.mkdir_p
local rmdir = helpers.rmdir local rmdir = helpers.rmdir
local write_file = helpers.write_file local write_file = helpers.write_file
local expect_exit = helpers.expect_exit
local poke_eventloop = helpers.poke_eventloop local poke_eventloop = helpers.poke_eventloop
local assert_alive = helpers.assert_alive local assert_alive = helpers.assert_alive
@@ -2910,9 +2910,14 @@ describe('lua: builtin modules', function()
end) end)
it('does not work when disabled without runtime', function() it('fails when disabled without runtime', function()
clear{args={'--luamod-dev'}, env={VIMRUNTIME='fixtures/a'}} clear()
expect_exit(exec_lua, [[return vim.tbl_count {x=1,y=2}]]) command("let $VIMRUNTIME='fixtures/a'")
-- Use system([nvim,…]) instead of clear() to avoid stderr noise. #21844
local out = funcs.system({nvim_prog, '--clean', '--luamod-dev',
[[+call nvim_exec_lua('return vim.tbl_count {x=1,y=2}')]], '+qa!'}):gsub('\r\n', '\n')
eq(1, eval('v:shell_error'))
matches("'vim%.shared' not found", out)
end) end)
end) end)

View File

@@ -3,6 +3,7 @@ local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen') 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 meths = helpers.meths local meths = helpers.meths
local command = helpers.command local command = helpers.command
local clear = helpers.clear local clear = helpers.clear
@@ -20,6 +21,8 @@ local tbl_contains = helpers.tbl_contains
local expect_exit = helpers.expect_exit local expect_exit = helpers.expect_exit
local is_os = helpers.is_os local is_os = helpers.is_os
local testlog = 'Xtest-defaults-log'
describe('startup defaults', function() describe('startup defaults', function()
describe(':filetype', function() describe(':filetype', function()
local function expect_filetype(expected) local function expect_filetype(expected)
@@ -275,6 +278,10 @@ describe('XDG defaults', function()
-- Need separate describe() blocks to not run clear() twice. -- Need separate describe() blocks to not run clear() twice.
-- Do not put before_each() here for the same reasons. -- Do not put before_each() here for the same reasons.
after_each(function()
os.remove(testlog)
end)
it("&runtimepath data-dir matches stdpath('data') #9910", function() it("&runtimepath data-dir matches stdpath('data') #9910", function()
clear() clear()
local rtp = eval('split(&runtimepath, ",")') local rtp = eval('split(&runtimepath, ",")')
@@ -337,6 +344,7 @@ describe('XDG defaults', function()
clear({ clear({
args_rm={'runtimepath'}, args_rm={'runtimepath'},
env={ env={
NVIM_LOG_FILE=testlog,
XDG_CONFIG_HOME=(root_path .. ('/x'):rep(4096)), XDG_CONFIG_HOME=(root_path .. ('/x'):rep(4096)),
XDG_CONFIG_DIRS=(root_path .. ('/a'):rep(2048) XDG_CONFIG_DIRS=(root_path .. ('/a'):rep(2048)
.. env_sep.. root_path .. ('/b'):rep(2048) .. env_sep.. root_path .. ('/b'):rep(2048)
@@ -351,6 +359,8 @@ describe('XDG defaults', function()
end) end)
it('are correctly set', function() it('are correctly set', function()
assert_log('Failed to start server: no such file or directory: /X/X/X', testlog, 10)
local vimruntime, libdir = vimruntime_and_libdir() local vimruntime, libdir = vimruntime_and_libdir()
eq(((root_path .. ('/x'):rep(4096) .. '/nvim' eq(((root_path .. ('/x'):rep(4096) .. '/nvim'
@@ -412,6 +422,7 @@ describe('XDG defaults', function()
clear({ clear({
args_rm={'runtimepath'}, args_rm={'runtimepath'},
env={ env={
NVIM_LOG_FILE=testlog,
XDG_CONFIG_HOME='$XDG_DATA_HOME', XDG_CONFIG_HOME='$XDG_DATA_HOME',
XDG_CONFIG_DIRS='$XDG_DATA_DIRS', XDG_CONFIG_DIRS='$XDG_DATA_DIRS',
XDG_DATA_HOME='$XDG_CONFIG_HOME', XDG_DATA_HOME='$XDG_CONFIG_HOME',
@@ -422,6 +433,8 @@ describe('XDG defaults', function()
end) end)
it('are not expanded', function() it('are not expanded', function()
assert_log('Failed to start server: no such file or directory: %$XDG_RUNTIME_DIR%/', testlog, 10)
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'

View File

@@ -1,4 +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 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
@@ -7,6 +8,8 @@ local pcall_err = helpers.pcall_err
local mkdir = helpers.mkdir local mkdir = helpers.mkdir
local is_os = helpers.is_os local is_os = helpers.is_os
local testlog = 'Xtest-server-log'
local function clear_serverlist() local function clear_serverlist()
for _, server in pairs(funcs.serverlist()) do for _, server in pairs(funcs.serverlist()) do
funcs.serverstop(server) funcs.serverstop(server)
@@ -14,6 +17,10 @@ local function clear_serverlist()
end end
describe('server', function() describe('server', function()
after_each(function()
os.remove(testlog)
end)
it('serverstart() stores sockets in $XDG_RUNTIME_DIR', function() it('serverstart() stores sockets in $XDG_RUNTIME_DIR', function()
local dir = 'Xtest_xdg_run' local dir = 'Xtest_xdg_run'
mkdir(dir) mkdir(dir)
@@ -74,13 +81,20 @@ describe('server', function()
end) end)
it('serverstop() returns false for invalid input', function() it('serverstop() returns false for invalid input', function()
clear() clear{env={
NVIM_LOG_FILE=testlog,
NVIM_LISTEN_ADDRESS='.',
}}
eq(0, eval("serverstop('')")) eq(0, eval("serverstop('')"))
eq(0, eval("serverstop('bogus-socket-name')")) eq(0, eval("serverstop('bogus-socket-name')"))
assert_log('Not listening on bogus%-socket%-name', testlog, 10)
end) end)
it('parses endpoints', function() it('parses endpoints', function()
clear() clear{env={
NVIM_LOG_FILE=testlog,
NVIM_LISTEN_ADDRESS='.',
}}
clear_serverlist() clear_serverlist()
eq({}, funcs.serverlist()) eq({}, funcs.serverlist())
@@ -104,6 +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
assert_log('Failed to start server: address already in use: 127%.0%.0%.1', testlog, 10)
end end
local v6 = '::1:12345' local v6 = '::1:12345'
@@ -111,6 +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
assert_log('Failed to start server: address already in use: ::1', testlog, 10)
end end
eq(expected, funcs.serverlist()) eq(expected, funcs.serverlist())
clear_serverlist() clear_serverlist()

View File

@@ -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)