mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +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,9 +306,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 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()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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,10 +43,8 @@ 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()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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,9 +87,7 @@ 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()
 | 
				
			||||||
@@ -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,18 +121,21 @@ 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
 | 
				
			||||||
  local lines = module.read_file_list(logfile, -nrlines) or {}
 | 
					
 | 
				
			||||||
  local msg = string.format('Pattern %q %sfound in log (last %d lines): %s:\n%s',
 | 
					  module.retry(nil, 1000, function()
 | 
				
			||||||
    pat, (inverse and '' or 'not '), nrlines, logfile, '    '..table.concat(lines, '\n    '))
 | 
					    local lines = module.read_file_list(logfile, -nrlines) or {}
 | 
				
			||||||
  for _,line in ipairs(lines) do
 | 
					    local msg = string.format('Pattern %q %sfound in log (last %d lines): %s:\n%s',
 | 
				
			||||||
    if line:match(pat) then
 | 
					      pat, (inverse and '' or 'not '), nrlines, logfile, '    '..table.concat(lines, '\n    '))
 | 
				
			||||||
      if inverse then error(msg) else return end
 | 
					    for _,line in ipairs(lines) do
 | 
				
			||||||
 | 
					      if line:match(pat) then
 | 
				
			||||||
 | 
					        if inverse then error(msg) else return end
 | 
				
			||||||
 | 
					      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