mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +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('unsubscribe', 'doesnotexist') | ||||
|     retry(nil, 1000, function() | ||||
|       assert_log("tried to unsubscribe unknown event 'doesnotexist'", testlog, 10) | ||||
|     end) | ||||
|     assert_log("tried to unsubscribe unknown event 'doesnotexist'", testlog, 10) | ||||
|     nvim('unsubscribe', 'event1') | ||||
|     assert_alive() | ||||
|   end) | ||||
|   | ||||
| @@ -295,9 +295,7 @@ describe('tmpdir', function() | ||||
|     clear({ env={ NVIM_LOG_FILE=testlog, TMPDIR=faketmp, } }) | ||||
|     matches(tmproot_pat, funcs.stdpath('run'))  -- Tickle vim_mktempdir(). | ||||
|     -- Assert that broken tmpdir root was handled. | ||||
|     retry(nil, 1000, function() | ||||
|       assert_log('tempdir root not a directory', testlog, 100) | ||||
|     end) | ||||
|     assert_log('tempdir root not a directory', testlog, 100) | ||||
|  | ||||
|     -- "…/nvim.<user>/" has wrong permissions: | ||||
|     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, } }) | ||||
|     matches(tmproot_pat, funcs.stdpath('run'))  -- Tickle vim_mktempdir(). | ||||
|     -- Assert that broken tmpdir root was handled. | ||||
|     retry(nil, 1000, function() | ||||
|       assert_log('tempdir root has invalid permissions', testlog, 100) | ||||
|     end) | ||||
|     assert_log('tempdir root has invalid permissions', testlog, 100) | ||||
|   end) | ||||
|  | ||||
|   it('too long', function() | ||||
|   | ||||
| @@ -6,7 +6,6 @@ local eq = helpers.eq | ||||
| local exec_lua = helpers.exec_lua | ||||
| local expect_exit = helpers.expect_exit | ||||
| local request = helpers.request | ||||
| local retry = helpers.retry | ||||
|  | ||||
| describe('log', function() | ||||
|   local testlog = 'Xtest_logging' | ||||
| @@ -40,9 +39,7 @@ describe('log', function() | ||||
|       }}) | ||||
|  | ||||
|     local tid = _G._nvim_test_id | ||||
|     retry(nil, 1000, function() | ||||
|       assert_log(tid..'%.%d+%.%d +server_init:%d+: test log message', testlog, 100) | ||||
|     end) | ||||
|     assert_log(tid..'%.%d+%.%d +server_init:%d+: test log message', testlog, 100) | ||||
|  | ||||
|     exec_lua([[ | ||||
|       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. | ||||
|     retry(nil, 1000, function() | ||||
|       assert_log('%.%d+%.%d/c +server_init:%d+: test log message', testlog, 100) | ||||
|     end) | ||||
|     assert_log('%.%d+%.%d/c +server_init:%d+: test log message', testlog, 100) | ||||
|   end) | ||||
| end) | ||||
|   | ||||
| @@ -43,10 +43,8 @@ describe('startup', function() | ||||
|  | ||||
|   it('--startuptime', function() | ||||
|     clear({ args = {'--startuptime', testfile}}) | ||||
|     retry(nil, 1000, function() | ||||
|       assert_log('sourcing', testfile, 100) | ||||
|       assert_log("require%('vim%._editor'%)", testfile, 100) | ||||
|     end) | ||||
|     assert_log('sourcing', testfile, 100) | ||||
|     assert_log("require%('vim%._editor'%)", testfile, 100) | ||||
|   end) | ||||
|  | ||||
|   it('-D does not hang #12647', function() | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| require('coxpcall') | ||||
| local busted = require('busted') | ||||
| local luv = require('luv') | ||||
| local lfs = require('lfs') | ||||
| local mpack = require('mpack') | ||||
| @@ -434,28 +433,6 @@ function module.connect(file_or_address) | ||||
|   return Session.new(stream) | ||||
| 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. | ||||
| -- | ||||
| -- 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_log = helpers.assert_log | ||||
| local retry = helpers.retry | ||||
| local meths = helpers.meths | ||||
| local command = helpers.command | ||||
| local clear = helpers.clear | ||||
| @@ -360,9 +359,7 @@ describe('XDG defaults', function() | ||||
|     end) | ||||
|  | ||||
|     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) | ||||
|       end) | ||||
|       assert_log('Failed to start server: no such file or directory: /X/X/X', testlog, 10) | ||||
|  | ||||
|       local vimruntime, libdir = vimruntime_and_libdir() | ||||
|  | ||||
| @@ -436,9 +433,8 @@ describe('XDG defaults', function() | ||||
|     end) | ||||
|  | ||||
|     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) | ||||
|       end) | ||||
|       assert_log('Failed to start server: no such file or directory: %$XDG_RUNTIME_DIR%/', testlog, 10) | ||||
|  | ||||
|       local vimruntime, libdir = vimruntime_and_libdir() | ||||
|       eq((('$XDG_DATA_HOME/nvim' | ||||
|           .. ',$XDG_DATA_DIRS/nvim' | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| local helpers = require('test.functional.helpers')(after_each) | ||||
| local assert_log = helpers.assert_log | ||||
| local retry = helpers.retry | ||||
| local eq, neq, eval = helpers.eq, helpers.neq, helpers.eval | ||||
| local clear, funcs, meths = helpers.clear, helpers.funcs, helpers.meths | ||||
| local ok = helpers.ok | ||||
| @@ -88,9 +87,7 @@ describe('server', function() | ||||
|     }} | ||||
|     eq(0, eval("serverstop('')")) | ||||
|     eq(0, eval("serverstop('bogus-socket-name')")) | ||||
|     retry(nil, 1000, function() | ||||
|       assert_log('Not listening on bogus%-socket%-name', testlog, 10) | ||||
|     end) | ||||
|     assert_log('Not listening on bogus%-socket%-name', testlog, 10) | ||||
|   end) | ||||
|  | ||||
|   it('parses endpoints', function() | ||||
| @@ -121,9 +118,7 @@ describe('server', function() | ||||
|     if status then | ||||
|       table.insert(expected, v4) | ||||
|       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) | ||||
|       end) | ||||
|       assert_log('Failed to start server: address already in use: 127%.0%.0%.1', testlog, 10) | ||||
|     end | ||||
|  | ||||
|     local v6 = '::1:12345' | ||||
| @@ -131,9 +126,7 @@ describe('server', function() | ||||
|     if status then | ||||
|       table.insert(expected, v6) | ||||
|       pcall(funcs.serverstart, v6)  -- exists already; ignore | ||||
|       retry(nil, 1000, function() | ||||
|         assert_log('Failed to start server: address already in use: ::1', testlog, 10) | ||||
|       end) | ||||
|       assert_log('Failed to start server: address already in use: ::1', testlog, 10) | ||||
|     end | ||||
|     eq(expected, funcs.serverlist()) | ||||
|     clear_serverlist() | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| require('test.compat') | ||||
| local shared = require('vim.shared') | ||||
| local assert = require('luassert') | ||||
| local busted = require('busted') | ||||
| local luv = require('luv') | ||||
| local lfs = require('lfs') | ||||
| local relpath = require('pl.path').relpath | ||||
| @@ -45,6 +46,28 @@ function module.sleep(ms) | ||||
|   luv.sleep(ms) | ||||
| 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 = { | ||||
|   ['Warning: noted but unhandled ioctl']=1, | ||||
|   ['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`. | ||||
| --- | ||||
| --- Retries for 1 second in case of filesystem delay. | ||||
| --- | ||||
| ---@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 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') | ||||
|   nrlines = nrlines or 10 | ||||
|   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', | ||||
|     pat, (inverse and '' or 'not '), nrlines, logfile, '    '..table.concat(lines, '\n    ')) | ||||
|   for _,line in ipairs(lines) do | ||||
|     if line:match(pat) then | ||||
|       if inverse then error(msg) else return end | ||||
|  | ||||
|   module.retry(nil, 1000, function() | ||||
|     local lines = module.read_file_list(logfile, -nrlines) or {} | ||||
|     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    ')) | ||||
|     for _,line in ipairs(lines) do | ||||
|       if line:match(pat) then | ||||
|         if inverse then error(msg) else return end | ||||
|       end | ||||
|     end | ||||
|   end | ||||
|   if not inverse then error(msg) end | ||||
|     if not inverse then error(msg) 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 | ||||
| function module.assert_nolog(pat, logfile, nrlines) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Justin M. Keyes
					Justin M. Keyes