1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
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 . '/dumb_tcp_server.py')
\ . ' ' . g:port
\))
let g:pipe_path = 'tmp_named_pipe'
let g:pid_pipe = str2nr(system(
\ 'python'
\ . ' ' . ale#Escape(g:dir . '/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')
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') && !exists('*chanclose')
AssertEqual -1, ale#socket#Open(
\ 'tmp_named_pipe',
\ {'callback': function('function')}
\)
endif
|