/ test / test_sandbox_execution.vader
test_sandbox_execution.vader
  1  Before:
  2    function! TestCallback(buffer, output)
  3      return [
  4      \ {
  5      \   'lnum': 1,
  6      \   'bufnr': 1,
  7      \   'vcol': 0,
  8      \   'linter_name': 'testlinter',
  9      \   'nr': -1,
 10      \   'type': 'E',
 11      \   'col': 1,
 12      \   'text': 'Test Error',
 13      \ },
 14      \]
 15    endfunction
 16  
 17    call ale#linter#Define('foobar', {
 18    \ 'name': 'testlinter',
 19    \ 'callback': 'TestCallback',
 20    \ 'executable': 'echo',
 21    \ 'command': 'echo',
 22    \})
 23  
 24    let g:ale_buffer_info = {}
 25  
 26  After:
 27    unlet! b:in_sandbox
 28    unlet! b:result
 29  
 30    delfunction TestCallback
 31    call ale#linter#Reset()
 32    let g:ale_buffer_info = {}
 33  
 34  
 35  Given foobar (Some imaginary filetype):
 36    foo
 37    bar
 38    baz
 39  
 40  Execute(ale#util#InSandbox should return 1 when in a sandbox):
 41    sandbox let b:in_sandbox = ale#util#InSandbox()
 42  
 43    Assert b:in_sandbox, 'ale#util#InSandbox() returned 0 for a sandbox command'
 44  
 45  Execute(ALE shouldn't blow up when run from a sandbox):
 46    AssertEqual 'foobar', &filetype
 47  
 48    sandbox call ale#Queue(0)
 49    sandbox call ale#Queue(1)
 50  
 51  Execute(ALE shouldn't blow up if file cleanup happens in a sandbox):
 52    " Make a call to an engine function first, so the function will be defined
 53    " before we make the sandbox call.
 54    "
 55    " You are not allowed to define any functions in the sandbox.
 56    call ale#engine#InitBufferInfo(3)
 57  
 58    let g:ale_buffer_info[3] = {
 59    \ 'temporary_file_list': ['/tmp/foo'],
 60    \ 'temporary_directory_list': ['/tmp/bar'],
 61    \}
 62    sandbox call ale#command#RemoveManagedFiles(3)
 63  
 64    AssertEqual ['/tmp/foo'], g:ale_buffer_info[3].temporary_file_list
 65    AssertEqual ['/tmp/bar'], g:ale_buffer_info[3].temporary_directory_list
 66  
 67  Execute(You shouldn't be able to define linters from the sandbox):
 68    call ale#linter#Reset()
 69    call ale#linter#PreventLoading('testft')
 70  
 71    AssertThrows sandbox call ale#linter#Define('testft', {
 72    \ 'name': 'testlinter',
 73    \ 'output_stream': 'stdout',
 74    \ 'executable': 'testlinter',
 75    \ 'command': 'testlinter',
 76    \ 'callback': 'testCB',
 77    \})
 78    AssertEqual 'Vim(let):E48: Not allowed in sandbox', g:vader_exception
 79    AssertEqual [], ale#linter#GetAll(['testft'])
 80  
 81  Execute(You shouldn't be able to register fixers from the sandbox):
 82    call ale#fix#registry#Clear()
 83    AssertThrows sandbox call ale#fix#registry#Add('prettier', '', ['javascript'], 'prettier')
 84    AssertEqual 'Vim(let):E48: Not allowed in sandbox', g:vader_exception
 85    AssertEqual [], ale#fix#registry#CompleteFixers('', 'ALEFix ', 7)
 86  
 87  Execute(You shouldn't be able to get linters from the sandbox, to prevent tampering):
 88    AssertThrows sandbox call ale#linter#GetLintersLoaded()
 89    AssertEqual 'Vim(let):E48: Not allowed in sandbox', g:vader_exception
 90  
 91    call ale#linter#Reset()
 92  
 93    sandbox let b:result = ale#linter#GetAll(['testft'])
 94  
 95    AssertEqual 0, len(b:result)
 96  
 97    let b:result = ale#linter#GetAll(['testft'])
 98  
 99    AssertEqual 1, len(b:result)
100  
101    sandbox let b:result = ale#linter#GetAll(['testft'])
102  
103    AssertEqual 0, len(b:result)