1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-01-24 05:20:04 +08:00
SpaceVim/bundle/neomake/tests/cancellation.vader

294 lines
11 KiB
Plaintext
Raw Normal View History

2020-06-13 14:06:35 +08:00
Include: include/setup.vader
Execute (neomake#CancelJob):
if NeomakeAsyncTestsSetup()
let job_id = neomake#Sh("sh -c 'while true; do sleep 0.01; done'")
let jobinfo = neomake#GetJob(job_id)
let job = has('nvim') ? jobinfo.nvim_job : string(jobinfo.vim_job)
AssertEqual neomake#CancelJob(job_id), 1
AssertNeomakeMessage printf('Stopping %s job: %s.',
\ (has('nvim') ? 'Neovim' : 'Vim'), job), 3, jobinfo
AssertEqual neomake#CancelJob(job_id), 0
AssertNeomakeMessage 'Job was canceled already.', 2, jobinfo
NeomakeTestsWaitForFinishedJobs
if has('nvim-0.4.0')
let expected_status = 143
elseif has('nvim')
let expected_status = 0
else
let expected_status = -1
endif
AssertNeomakeMessage '\Vexit: \.\*: '.expected_status.' (job was canceled).', 3, jobinfo
AssertNeomakeMessage 'Cleaning jobinfo.', 3, jobinfo
AssertNeomakeMessage 'Cleaning make info.'
AssertEqual neomake#CancelJob(job_id), 0
AssertNeomakeMessage 'CancelJob: job not found: '.job_id.'.', 0
endif
Execute (neomake#CancelJob with invalid job):
if NeomakeAsyncTestsSetup()
let job_id = neomake#Sh("sh -c 'sleep 1'")
let jobinfo = neomake#GetJob(job_id)
" Stop the job manually.
if has('nvim')
call jobstop(jobinfo.nvim_job)
else
call ch_close(jobinfo.vim_job)
while job_status(jobinfo.vim_job) !=# 'dead'
sleep 10m
endwhile
endif
AssertEqual len(neomake#GetJobs()), 1, 'There are jobs (1)'
let ret = neomake#CancelJob(job_id)
AssertEqual ret, 0, 'CancelJob returned 0.'
AssertEqual len(neomake#GetJobs()), 0, 'There are no more jobs'
AssertNeomakeMessageAbsent 'exit: job not found: '.job_id.'.'
AssertNeomakeMessage '\v^Stopping \w+ job: .+\.$', 3, jobinfo
if has('nvim')
if !has('nvim-0.5')
AssertNeomakeMessage '\vjobstop failed: Vim\(let\):E900: Invalid (job|channel) id.', 2, jobinfo
endif
else
AssertNeomakeMessage 'job_stop: job was not running anymore.', 2, jobinfo
endif
let ret = neomake#CancelJob(job_id)
if has('nvim')
" Vim returns 1 via job_stop usually.
AssertEqual ret, 0, "CancelJob (2) returned ".ret
endif
AssertNeomakeMessage 'CancelJob: job not found: '.job_id.'.', 0, {}
if has('nvim')
" With Vim the exit callback is not invoked (since ch_close was used).
NeomakeTestsWaitForNextMessage
AssertNeomakeMessage 'exit: job not found: '.jobinfo.nvim_job.'.', 3, {}
else
NeomakeCancelJobs!
endif
let ret = neomake#CancelJob(job_id)
AssertEqual ret, 0, "CancelJob (3) returned ".ret
AssertNeomakeMessage 'CancelJob: job not found: '.job_id.'.', 0, {}
endif
Execute (neomake#CancelJobs! removes canceled jobs):
if NeomakeAsyncTestsSetup()
let jobinfos = neomake#Make({'enabled_makers': [g:sleep_maker, g:sleep_maker]})
let jobinfos[0].canceled = 1
NeomakeCancelJobs!
AssertNeomakeMessage 'Canceling 2 jobs.', 3
AssertNeomakeMessage 'Job was canceled already.', 2, jobinfos[0]
AssertNeomakeMessage '\v^Stopping \w+ job: .+\.$', 3, jobinfos[1]
AssertNeomakeMessage 'Cleaning jobinfo.', 3, jobinfos[1]
NeomakeTestsWaitForMessage '\m^exit: job not found'
endif
Execute (neomake#CancelJob! with invalid job):
if NeomakeAsyncTestsSetup()
let job_id = neomake#Sh("sh -c 'sleep 0.1'")
let jobinfo = neomake#GetJob(job_id)
" Stop the job manually.
if has('nvim')
call jobstop(jobinfo.nvim_job)
else
let vim_job = jobinfo.vim_job
call job_stop(vim_job)
endif
AssertEqual len(neomake#GetJobs()), 1, 'There are jobs'
let ret = neomake#CancelJob(job_id, 1)
" Jobinfo should have been cleaned already. With Neovim it gets done
"" anyway, because jobstop fails.
Assert !len(neomake#GetJobs()), 'There are no jobs'
if has('nvim')
" Vim returns 1 via job_stop usually.
AssertEqual ret, 0, "CancelJob (1) returned ".ret
endif
AssertNeomakeMessageAbsent 'exit: job not found: '.job_id.'.'
AssertNeomakeMessage '\v^Stopping \w+ job: .+\.$', 3, jobinfo
if has('nvim')
if !has('nvim-0.5')
AssertNeomakeMessage '\vjobstop failed: Vim\(let\):E900: Invalid (job|channel) id.', 2, jobinfo
endif
endif
AssertEqual neomake#GetJobs(), []
AssertEqual neomake#CancelJob(job_id), 0
AssertNeomakeMessageAbsent '\v^Stopping \w+ job: .+\.$', 3, jobinfo
AssertNeomakeMessage 'CancelJob: job not found: '.job_id.'.', 0
NeomakeTestsWaitForFinishedJobs
AssertNeomakeMessageAbsent 'exit: job not found: '.job_id.'.'
if has('nvim')
NeomakeTestsWaitForMessage 'exit: job not found: '.jobinfo.nvim_job.'.', 3
else
NeomakeTestsWaitForMessage '\vexit: job not found: channel \d+ closed \(\{''status'': ''dead''.*\.', 3
endif
AssertEqual neomake#CancelJob(job_id, 1), 0
AssertNeomakeMessage 'CancelJob: job not found: '.job_id.'.', 0
endif
Execute (neomake#CancelJob with trapped TERM):
if NeomakeAsyncTestsSetup()
let trap_sh = fnamemodify(g:vader_file, ':p:h').'/helpers/trap.sh'
let job_id = neomake#ShCommand(1, trap_sh)
let jobinfo = neomake#GetJob(job_id)
" Ensure the script is running.
NeomakeTestsWaitForMessage '\voutput on stdout: \[''Started: (\d+)''', 3, jobinfo
let pid = g:neomake_test_matchlist[1]
AssertEqual neomake#CancelJob(job_id), 1
AssertNeomakeMessage '\v^Stopping \w+ job: .+\.$', 3, jobinfo
NeomakeTestsWaitForMessage '\Moutput on stdout: \.\*''not stopping on SIGTERM''', 3, jobinfo
AssertNeomakeMessage 'Ignoring output (job was canceled).', 3, jobinfo
if has('nvim-0.4.0')
let expected_status = 137
elseif has('nvim')
let expected_status = 0
else
let expected_status = -1
endif
NeomakeTestsWaitForMessage '\Vexit: \.\*: '.expected_status.' (job was canceled).', 3, jobinfo, {'timeout': 5000}
if !has('nvim')
AssertNeomakeMessage 'Forcefully killing still running Vim job.', 3, jobinfo, {'ignore_order': 1}
endif
AssertEqual neomake#CancelJob(job_id), 0
AssertNeomakeMessage 'CancelJob: job not found: '.job_id.'.', 0
endif
Execute (neomake#CancelMake stops all jobs):
if NeomakeAsyncTestsSetup()
let jobinfos = neomake#Make({'file_mode': 0, 'enabled_makers': [g:sleep_maker, g:sleep_maker]})
let make_id = neomake#GetStatus().last_make_id
AssertEqual neomake#CancelMake(make_id), 1
NeomakeTestsWaitForFinishedJobs
AssertNeomakeMessage '\v^Stopping \w+ job: .+\.$'
AssertNeomakeMessage '\v^Stopping \w+ job: .+\.$'
if has('nvim-0.4.0')
let expected_status = 143
elseif has('nvim')
let expected_status = 0
else
let expected_status = -1
endif
AssertNeomakeMessage 'exit: sleep-maker: '.expected_status.' (job was canceled).'
AssertNeomakeMessage 'Cleaning jobinfo.'
AssertNeomakeMessage 'exit: sleep-maker: '.expected_status.' (job was canceled).'
AssertNeomakeMessage 'Cleaning jobinfo.'
endif
Execute (neomake#CancelMake handles invalid make id):
AssertEqual neomake#CancelMake(-1), 0
AssertNeomakeMessage 'CancelMake: make not found: -1.', 0
Execute (neomake#CancelMake removes queued actions):
if NeomakeAsyncTestsSetup()
new
let maker = NeomakeTestsCommandMaker('silent-sleep-success', 'sleep .01')
let jobinfo = neomake#Make({'enabled_makers': [maker]})[0]
new
NeomakeTestsWaitForFinishedJobs
AssertNeomakeMessage 'Cleaning jobinfo.', 3
AssertNeomakeMessage 'Postponing final location list handling (in another window).', 3
AssertNeomakeMessage 'Queuing action handle_locqf_list_for_finished_jobs for WinEnter.', 3
let log_context = neomake#GetStatus().make_info[jobinfo.make_id]
let log_context.make_id = jobinfo.make_id
call neomake#CancelAllMakes()
AssertNeomakeMessage 'Canceling make.', 3, log_context
AssertNeomakeMessage 'Removed 1 action queue entries.', 3
AssertNeomakeMessage 'Skipping final processing for canceled make.'
call neomake#CancelMake(jobinfo.make_id)
AssertNeomakeMessage 'CancelMake: make not found: '.jobinfo.make_id.'.', 0
bwipe
bwipe
endif
Execute (neomake#CancelJob empties action queue):
if NeomakeAsyncTestsSetup()
new
let maker = copy(g:entry_maker)
function! maker.get_list_entries(...)
wincmd p
return [{'text': 'entry_text', 'lnum': 1}]
endfunction
let jobinfo = neomake#Make({'enabled_makers': [maker]})[0]
let job_id = jobinfo.id
NeomakeTestsWaitForMessage 'Queuing action ProcessEntries for BufEnter, WinEnter.'
AssertNeomakeMessage "Skipping cleaning of job info because of queued actions: ['ProcessEntries', ['BufEnter', 'WinEnter']].", 3
AssertNeomakeMessage 'Queuing action CleanJobinfo for WinEnter.'
call neomake#CancelJob(job_id)
AssertNeomakeMessage 'Removed 2 action queue entries.', 3
AssertNeomakeMessage 'Removing job for get_list_entries.', 3, jobinfo
wincmd p
AssertNeomakeMessage 'Cleaning make info.', 3
bwipe
Assert !exists('#neomake_event_queue#WinEnter'), 'autocmd does not exist'
endif
Execute (neomake#CancelJob handles dict):
if NeomakeAsyncTestsSetup()
let jobinfo = neomake#Make({'enabled_makers': [g:sleep_maker]})[0]
Assert type(jobinfo), type({})
AssertEqual neomake#CancelJob(jobinfo), 1
AssertNeomakeMessage '\v^Stopping \w+ job: .+\.$', 3, jobinfo
NeomakeTestsWaitForFinishedJobs
endif
Execute (neomake#CancelJob handles string with job_id at the beginning):
if NeomakeAsyncTestsSetup()
let jobinfo = neomake#Make({'enabled_makers': [g:sleep_maker]})[0]
AssertEqual neomake#CancelJob(jobinfo.id . ':'), 1
AssertNeomakeMessage '\v^Stopping \w+ job: .+\.$', 3, jobinfo
NeomakeTestsWaitForFinishedJobs
endif
Execute (neomake#CancelJob clears action queue for get_list_entries maker):
if NeomakeAsyncTestsSetup()
let maker = {}
function! maker.get_list_entries(...) abort dict
" causes E48
sandbox bprevious
endfunction
let jobinfo = neomake#Make({'enabled_makers': [maker]})[0]
AssertNeomakeMessage 'Queuing action handle_get_list_entries for Timer, WinEnter.'
" CancelJob returns 0, since it is processed directly.
AssertEqual neomake#CancelJob(jobinfo), 0
AssertNeomakeMessage 'Canceling job.', 3, jobinfo
AssertNeomakeMessage 'Removed 1 action queue entries.', 3
AssertNeomakeMessage 'Removing job for get_list_entries.', 3
AssertNeomakeMessage 'Cleaning jobinfo.', 3
AssertNeomakeMessage 'Cleaning make info.', 3
endif
Execute (CleanJobinfo with cancellation while in exit handler):
new
let maker = copy(g:error_maker)
let maker.name = 'mymaker1'
function! maker.process_output(...)
NeomakeCancelJobs
return [{'lnum': 1, 'text': 'still_processed'}]
endfunction
CallNeomake 1, [maker]
AssertNeomakeMessage 'Canceling 1 jobs.', 3
AssertNeomakeMessage 'Job exited already.', 3
AssertEqual map(getloclist(0), 'v:val.text'), []
bwipe