@@ -19,55 +19,63 @@ elseif has('win32')
1919 finish
2020 endif
2121else
22+ " Can't run this test.
2223 finish
2324endif
2425
25- let s: port = -1
2626let s: chopt = has (' macunix' ) ? {' waittime' : 1 } : {}
2727
28- func s: start_server ()
28+ " Run "testfunc" after sarting the server and stop the server afterwards.
29+ func s: run_server (testfunc)
2930 " The Python program writes the port number in Xportnr.
3031 call delete (" Xportnr" )
3132
32- if has (' job' )
33- let s: job = job_start (" python test_channel.py" )
34- elseif has (' win32' )
35- silent ! start cmd /c start " test_channel" py test_channel.py
36- else
37- silent ! python test_channel.py &
38- endif
33+ try
34+ if has (' job' )
35+ let s: job = job_start (" python test_channel.py" )
36+ elseif has (' win32' )
37+ silent ! start cmd /c start " test_channel" py test_channel.py
38+ else
39+ silent ! python test_channel.py &
40+ endif
3941
40- " Wait for up to 2 seconds for the port number to be there.
41- let cnt = 20
42- let l = []
43- while cnt > 0
44- try
45- let l = readfile (" Xportnr" )
46- catch
47- endtry
48- if len (l ) >= 1
49- break
42+ " Wait for up to 2 seconds for the port number to be there.
43+ let cnt = 20
44+ let l = []
45+ while cnt > 0
46+ try
47+ let l = readfile (" Xportnr" )
48+ catch
49+ endtry
50+ if len (l ) >= 1
51+ break
52+ endif
53+ sleep 100 m
54+ let cnt -= 1
55+ endwhile
56+ call delete (" Xportnr" )
57+
58+ if len (l ) == 0
59+ " Can't make the connection, give up.
60+ call assert_false (1 , " Can't start test_channel.py" )
61+ return -1
5062 endif
51- sleep 100 m
52- let cnt -= 1
53- endwhile
54- call delete (" Xportnr" )
63+ let port = l [0 ]
5564
56- if len (l ) == 0
57- " Can't make the connection, give up.
65+ call call (function (a: testfunc ), [port])
66+ catch
67+ call assert_false (1 , " Caught exception: " . v: exception )
68+ finally
5869 call s: kill_server ()
59- call assert_false (1 , " Can't start test_channel.py" )
60- return -1
61- endif
62- let s: port = l [0 ]
63-
64- let handle = ch_open (' localhost:' . s: port , s: chopt )
65- return handle
70+ endtry
6671endfunc
6772
6873func s: kill_server ()
6974 if has (' job' )
70- call job_stop (s: job )
75+ if exists (' s:job' )
76+ call job_stop (s: job )
77+ unlet s: job
78+ endif
7179 elseif has (' win32' )
7280 call system (' taskkill /IM py.exe /T /F /FI "WINDOWTITLE eq test_channel"' )
7381 else
@@ -82,9 +90,10 @@ func s:RequestHandler(handle, msg)
8290 let s: responseMsg = a: msg
8391endfunc
8492
85- func Test_communicate ( )
86- let handle = s: start_server ( )
93+ func s: communicate (port )
94+ let handle = ch_open ( ' localhost: ' . a: port , s: chopt )
8795 if handle < 0
96+ call assert_false (1 , " Can't open channel" )
8897 return
8998 endif
9099
@@ -144,39 +153,84 @@ func Test_communicate()
144153
145154 " make the server quit, can't check if this works, should not hang.
146155 call ch_sendexpr (handle, ' !quit!' , 0 )
156+ endfunc
147157
148- call s: kill_server ()
158+ func Test_communicate ()
159+ call s: run_server (' s:communicate' )
149160endfunc
150161
151162" Test that we can open two channels.
152- func Test_two_channels ( )
153- let handle = s: start_server ( )
163+ func s: two_channels (port )
164+ let handle = ch_open ( ' localhost: ' . a: port , s: chopt )
154165 if handle < 0
166+ call assert_false (1 , " Can't open channel" )
155167 return
156168 endif
169+
157170 call assert_equal (' got it' , ch_sendexpr (handle, ' hello!' ))
158171
159- let newhandle = ch_open (' localhost:' . s: port , s: chopt )
172+ let newhandle = ch_open (' localhost:' . a: port , s: chopt )
173+ if newhandle < 0
174+ call assert_false (1 , " Can't open second channel" )
175+ return
176+ endif
160177 call assert_equal (' got it' , ch_sendexpr (newhandle, ' hello!' ))
161178 call assert_equal (' got it' , ch_sendexpr (handle, ' hello!' ))
162179
163180 call ch_close (handle)
164181 call assert_equal (' got it' , ch_sendexpr (newhandle, ' hello!' ))
165182
166- call s: kill_server ()
183+ call ch_close (newhandle)
184+ endfunc
185+
186+ func Test_two_channels ()
187+ call s: run_server (' s:two_channels' )
167188endfunc
168189
169190" Test that a server crash is handled gracefully.
170- func Test_server_crash ( )
171- let handle = s: start_server ( )
191+ func s: server_crash (port )
192+ let handle = ch_open ( ' localhost: ' . a: port , s: chopt )
172193 if handle < 0
194+ call assert_false (1 , " Can't open channel" )
173195 return
174196 endif
197+
175198 call ch_sendexpr (handle, ' !crash!' )
176199
177- " kill the server in case if failed to crash
178200 sleep 10 m
179- call s: kill_server ()
201+ endfunc
202+
203+ func Test_server_crash ()
204+ call s: run_server (' s:server_crash' )
205+ endfunc
206+
207+ let s: reply = " "
208+ func s: Handler (chan, msg)
209+ let s: reply = a: msg
210+ endfunc
211+
212+ func s: channel_handler (port)
213+ let chopt = copy (s: chopt )
214+ let chopt[' callback' ] = ' s:Handler'
215+ let handle = ch_open (' localhost:' . a: port , chopt)
216+ if handle < 0
217+ call assert_false (1 , " Can't open channel" )
218+ return
219+ endif
220+
221+ " Test that it works while waiting on a numbered message.
222+ call assert_equal (' ok' , ch_sendexpr (handle, ' call me' ))
223+ sleep 10 m
224+ call assert_equal (' we called you' , s: reply )
225+
226+ " Test that it works while not waiting on a numbered message.
227+ call ch_sendexpr (handle, ' call me again' , 0 )
228+ sleep 10 m
229+ call assert_equal (' we did call you' , s: reply )
230+ endfunc
231+
232+ func Test_channel_handler ()
233+ call s: run_server (' s:channel_handler' )
180234endfunc
181235
182236" Test that trying to connect to a non-existing port fails quickly.
@@ -198,6 +252,7 @@ func Test_connect_waittime()
198252 call ch_close (handle)
199253 else
200254 " Failed connection doesn't wait the full time on Unix.
255+ " TODO: why is MS-Windows different?
201256 let elapsed = reltime (start )
202257 call assert_true (reltimefloat (elapsed) < (has (' unix' ) ? 1.0 : 3.0 ))
203258 endif
0 commit comments