123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- local helpers = require('test.functional.helpers')(after_each)
- local eq = helpers.eq
- local exec_lua = helpers.exec_lua
- local clear = helpers.clear
- local is_os = helpers.is_os
- local mkdir = helpers.mkdir
- describe('vim._watch', function()
- before_each(function()
- clear()
- end)
- describe('watch', function()
- it('detects file changes', function()
- local root_dir = helpers.tmpname()
- os.remove(root_dir)
- mkdir(root_dir)
- local result = exec_lua(
- [[
- local root_dir = ...
- local events = {}
- local expected_events = 0
- local function wait_for_events()
- assert(vim.wait(100, function() return #events == expected_events end), 'Timed out waiting for expected number of events. Current events seen so far: ' .. vim.inspect(events))
- end
- local stop = vim._watch.watch(root_dir, {}, function(path, change_type)
- table.insert(events, { path = path, change_type = change_type })
- end)
- -- Only BSD seems to need some extra time for the watch to be ready to respond to events
- if vim.fn.has('bsd') then
- vim.wait(50)
- end
- local watched_path = root_dir .. '/file'
- local watched, err = io.open(watched_path, 'w')
- assert(not err, err)
- expected_events = expected_events + 1
- wait_for_events()
- watched:close()
- os.remove(watched_path)
- expected_events = expected_events + 1
- wait_for_events()
- stop()
- -- No events should come through anymore
- local watched_path = root_dir .. '/file'
- local watched, err = io.open(watched_path, 'w')
- assert(not err, err)
- vim.wait(50)
- watched:close()
- os.remove(watched_path)
- vim.wait(50)
- return events
- ]],
- root_dir
- )
- local expected = {
- {
- change_type = exec_lua([[return vim._watch.FileChangeType.Created]]),
- path = root_dir .. '/file',
- },
- {
- change_type = exec_lua([[return vim._watch.FileChangeType.Deleted]]),
- path = root_dir .. '/file',
- },
- }
- -- kqueue only reports events on the watched path itself, so creating a file within a
- -- watched directory results in a "rename" libuv event on the directory.
- if is_os('bsd') then
- expected = {
- {
- change_type = exec_lua([[return vim._watch.FileChangeType.Created]]),
- path = root_dir,
- },
- {
- change_type = exec_lua([[return vim._watch.FileChangeType.Created]]),
- path = root_dir,
- },
- }
- end
- eq(expected, result)
- end)
- end)
- describe('poll', function()
- it('detects file changes', function()
- local root_dir = helpers.tmpname()
- os.remove(root_dir)
- mkdir(root_dir)
- local result = exec_lua(
- [[
- local root_dir = ...
- local events = {}
- local poll_interval_ms = 1000
- local poll_wait_ms = poll_interval_ms+200
- local expected_events = 0
- local function wait_for_events()
- assert(vim.wait(poll_wait_ms, function() return #events == expected_events end), 'Timed out waiting for expected number of events. Current events seen so far: ' .. vim.inspect(events))
- end
- local stop = vim._watch.poll(root_dir, { interval = poll_interval_ms }, function(path, change_type)
- table.insert(events, { path = path, change_type = change_type })
- end)
- vim.wait(100)
- local watched_path = root_dir .. '/file'
- local watched, err = io.open(watched_path, 'w')
- assert(not err, err)
- expected_events = expected_events + 2
- wait_for_events()
- watched:close()
- os.remove(watched_path)
- expected_events = expected_events + 2
- wait_for_events()
- stop()
- -- No events should come through anymore
- local watched_path = root_dir .. '/file'
- local watched, err = io.open(watched_path, 'w')
- assert(not err, err)
- vim.wait(poll_wait_ms)
- watched:close()
- os.remove(watched_path)
- return events
- ]],
- root_dir
- )
- eq(4, #result)
- eq({
- change_type = exec_lua([[return vim._watch.FileChangeType.Created]]),
- path = root_dir .. '/file',
- }, result[1])
- eq({
- change_type = exec_lua([[return vim._watch.FileChangeType.Changed]]),
- path = root_dir,
- }, result[2])
- -- The file delete and corresponding directory change events do not happen in any
- -- particular order, so allow either
- if result[3].path == root_dir then
- eq({
- change_type = exec_lua([[return vim._watch.FileChangeType.Changed]]),
- path = root_dir,
- }, result[3])
- eq({
- change_type = exec_lua([[return vim._watch.FileChangeType.Deleted]]),
- path = root_dir .. '/file',
- }, result[4])
- else
- eq({
- change_type = exec_lua([[return vim._watch.FileChangeType.Deleted]]),
- path = root_dir .. '/file',
- }, result[3])
- eq({
- change_type = exec_lua([[return vim._watch.FileChangeType.Changed]]),
- path = root_dir,
- }, result[4])
- end
- end)
- end)
- end)
|