--- /dev/null
+Before:
+ let g:can_run_socket_tests = !has('win32')
+ \ && (exists('*ch_close') || exists('*chanclose'))
+
+ if g:can_run_socket_tests
+ call ale#test#SetDirectory('/testplugin/test')
+
+ let g:channel_id_received = 0
+ let g:data_received = ''
+
+ function! WaitForData(expected_data, timeout) abort
+ let l:ticks = 0
+
+ while l:ticks < a:timeout
+ " Sleep first, so we can switch to the callback.
+ let l:ticks += 10
+ sleep 10ms
+
+ if g:data_received is# a:expected_data
+ break
+ endif
+ endwhile
+ endfunction
+
+ function! TestCallback(channel_id, data) abort
+ let g:channel_id_received = a:channel_id
+ let g:data_received .= a:data
+ endfunction
+
+ let g:port = 10347
+ let g:pid_tcp = str2nr(system(
+ \ 'python'
+ \ . ' ' . ale#Escape(g:dir . '/script/dumb_tcp_server.py')
+ \ . ' ' . g:port
+ \))
+ let g:pipe_path = tempname()
+ let g:pid_pipe = str2nr(system(
+ \ 'python'
+ \ . ' ' . ale#Escape(g:dir . '/script/dumb_named_pipe_server.py')
+ \ . ' ' . g:pipe_path
+ \))
+ endif
+
+After:
+ if g:can_run_socket_tests
+ call ale#test#RestoreDirectory()
+
+ unlet! g:channel_id_received
+ unlet! g:data_received
+ unlet! g:channel_id
+
+ delfunction WaitForData
+ delfunction TestCallback
+
+ if has_key(g:, 'pid_tcp')
+ call system('kill ' . g:pid_tcp)
+ endif
+
+ if has_key(g:, 'pid_pipe')
+ call system('kill ' . g:pid_pipe)
+ endif
+
+ unlet! g:pid_tcp
+ unlet! g:port
+ unlet! g:pid_pipe
+ unlet! g:pipe_path
+ endif
+
+ unlet! g:can_run_socket_tests
+
+Execute(Sending and receiving connections to tcp sockets should work):
+ if g:can_run_socket_tests
+ let g:channel_id = ale#socket#Open(
+ \ '127.0.0.1:' . g:port,
+ \ {'callback': function('TestCallback')}
+ \)
+
+ Assert g:channel_id >= 0, 'The socket was not opened!'
+
+ call ale#socket#Send(g:channel_id, 'hello')
+ call ale#socket#Send(g:channel_id, ' world')
+
+ AssertEqual 1, ale#socket#IsOpen(g:channel_id)
+
+ " Wait up to 1 second for the expected data to arrive.
+ call WaitForData('hello world', 1000)
+
+ AssertEqual g:channel_id, g:channel_id_received
+ AssertEqual 'hello world', g:data_received
+ AssertEqual '127.0.0.1:' . g:port, ale#socket#GetAddress(g:channel_id)
+
+ call ale#socket#Close(g:channel_id)
+
+ AssertEqual 0, ale#socket#IsOpen(g:channel_id)
+ AssertEqual '', ale#socket#GetAddress(g:channel_id)
+ endif
+
+ " NeoVim versions which can't connect to sockets should just fail.
+ if has('nvim') && !exists('*chanclose')
+ AssertEqual -1, ale#socket#Open(
+ \ '127.0.0.1:1111',
+ \ {'callback': function('function')}
+ \)
+ endif
+
+Execute(Sending and receiving connections to named pipe sockets should work):
+ if g:can_run_socket_tests && has('nvim-0.4')
+ let g:channel_id = ale#socket#Open(
+ \ g:pipe_path,
+ \ {'callback': function('TestCallback')}
+ \)
+
+ Assert g:channel_id >= 0, 'The socket was not opened!'
+
+ call ale#socket#Send(g:channel_id, 'hello')
+ call ale#socket#Send(g:channel_id, ' world')
+
+ AssertEqual 1, ale#socket#IsOpen(g:channel_id)
+
+ " Wait up to 1 second for the expected data to arrive.
+ call WaitForData('hello world', 1000)
+
+ AssertEqual g:channel_id, g:channel_id_received
+ AssertEqual 'hello world', g:data_received
+ AssertEqual g:pipe_path, ale#socket#GetAddress(g:channel_id)
+
+ call ale#socket#Close(g:channel_id)
+
+ AssertEqual 0, ale#socket#IsOpen(g:channel_id)
+ AssertEqual '', ale#socket#GetAddress(g:channel_id)
+ endif
+
+ " NeoVim versions which can't connect to sockets should just fail.
+ if has('nvim-0.4') && !exists('*chanclose')
+ AssertEqual -1, ale#socket#Open(
+ \ g:pipe_path,
+ \ {'callback': function('function')}
+ \)
+ endif