blob: 15d849c03a8527389597bf63282391af13a5a3d8 [file] [log] [blame]
Bram Moolenaard7ece102016-02-02 23:23:02 +01001" Test for channel functions.
2scriptencoding utf-8
3
Bram Moolenaare2469252016-02-04 10:54:34 +01004if !has('channel')
5 finish
6endif
7
8" This test requires the Python command to run the test server.
Bram Moolenaara8343c12016-02-04 22:09:48 +01009" This most likely only works on Unix and Windows.
Bram Moolenaara0f9cd12016-02-03 20:13:24 +010010if has('unix')
Bram Moolenaar835dc632016-02-07 14:27:38 +010011 " We also need the job feature or the pkill command to make sure the server
12 " can be stopped.
13 if !(executable('python') && (has('job') || executable('pkill')))
Bram Moolenaara0f9cd12016-02-03 20:13:24 +010014 finish
15 endif
Bram Moolenaarb6a77372016-02-15 22:55:28 +010016 let s:python = 'python'
Bram Moolenaara8343c12016-02-04 22:09:48 +010017elseif has('win32')
Bram Moolenaarb6a77372016-02-15 22:55:28 +010018 " Use Python Launcher for Windows (py.exe) if available.
19 if executable('py.exe')
20 let s:python = 'py.exe'
21 elseif executable('python.exe')
22 let s:python = 'python.exe'
23 else
Bram Moolenaara0f9cd12016-02-03 20:13:24 +010024 finish
25 endif
26else
Bram Moolenaard6a8d482016-02-10 20:32:20 +010027 " Can't run this test.
Bram Moolenaard7ece102016-02-02 23:23:02 +010028 finish
29endif
30
Bram Moolenaare74e8e72016-02-16 22:01:30 +010031let s:chopt = {}
Bram Moolenaar3b05b132016-02-03 23:25:07 +010032
Bram Moolenaard6a8d482016-02-10 20:32:20 +010033" Run "testfunc" after sarting the server and stop the server afterwards.
Bram Moolenaar81661fb2016-02-18 22:23:34 +010034func s:run_server(testfunc, ...)
Bram Moolenaarfcb1e3d2016-02-03 21:32:46 +010035 " The Python program writes the port number in Xportnr.
36 call delete("Xportnr")
37
Bram Moolenaar81661fb2016-02-18 22:23:34 +010038 if a:0 == 1
39 let arg = ' ' . a:1
40 else
41 let arg = ''
42 endif
43 let cmd = s:python . " test_channel.py" . arg
44
Bram Moolenaard6a8d482016-02-10 20:32:20 +010045 try
46 if has('job')
Bram Moolenaar65edff82016-02-21 16:40:11 +010047 let s:job = job_start(cmd, {"stoponexit": "hup"})
48 call job_setoptions(s:job, {"stoponexit": "kill"})
Bram Moolenaard6a8d482016-02-10 20:32:20 +010049 elseif has('win32')
Bram Moolenaar81661fb2016-02-18 22:23:34 +010050 exe 'silent !start cmd /c start "test_channel" ' . cmd
Bram Moolenaard6a8d482016-02-10 20:32:20 +010051 else
Bram Moolenaar81661fb2016-02-18 22:23:34 +010052 exe 'silent !' . cmd . '&'
Bram Moolenaard7ece102016-02-02 23:23:02 +010053 endif
Bram Moolenaard7ece102016-02-02 23:23:02 +010054
Bram Moolenaard6a8d482016-02-10 20:32:20 +010055 " Wait for up to 2 seconds for the port number to be there.
Bram Moolenaard6a8d482016-02-10 20:32:20 +010056 let l = []
Bram Moolenaar9fe885e2016-03-08 16:06:55 +010057 for i in range(200)
Bram Moolenaard6a8d482016-02-10 20:32:20 +010058 try
59 let l = readfile("Xportnr")
60 catch
61 endtry
62 if len(l) >= 1
63 break
64 endif
Bram Moolenaar9fe885e2016-03-08 16:06:55 +010065 sleep 10m
66 endfor
Bram Moolenaard6a8d482016-02-10 20:32:20 +010067 call delete("Xportnr")
68
69 if len(l) == 0
70 " Can't make the connection, give up.
71 call assert_false(1, "Can't start test_channel.py")
72 return -1
73 endif
74 let port = l[0]
75
76 call call(function(a:testfunc), [port])
77 catch
78 call assert_false(1, "Caught exception: " . v:exception)
79 finally
Bram Moolenaara0f9cd12016-02-03 20:13:24 +010080 call s:kill_server()
Bram Moolenaard6a8d482016-02-10 20:32:20 +010081 endtry
Bram Moolenaarfcb1e3d2016-02-03 21:32:46 +010082endfunc
83
84func s:kill_server()
Bram Moolenaar835dc632016-02-07 14:27:38 +010085 if has('job')
Bram Moolenaard6a8d482016-02-10 20:32:20 +010086 if exists('s:job')
87 call job_stop(s:job)
88 unlet s:job
89 endif
Bram Moolenaar835dc632016-02-07 14:27:38 +010090 elseif has('win32')
Bram Moolenaarb6a77372016-02-15 22:55:28 +010091 call system('taskkill /IM ' . s:python . ' /T /F /FI "WINDOWTITLE eq test_channel"')
Bram Moolenaarfcb1e3d2016-02-03 21:32:46 +010092 else
Bram Moolenaar608a8912016-02-03 22:39:51 +010093 call system("pkill -f test_channel.py")
Bram Moolenaarfcb1e3d2016-02-03 21:32:46 +010094 endif
95endfunc
96
Bram Moolenaara07fec92016-02-05 21:04:08 +010097let s:responseMsg = ''
98func s:RequestHandler(handle, msg)
99 let s:responseHandle = a:handle
100 let s:responseMsg = a:msg
101endfunc
102
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100103" Wait for up to a second for "expr" to become true.
104func s:waitFor(expr)
105 for i in range(100)
106 if eval(a:expr)
107 return
108 endif
109 sleep 10m
110 endfor
111endfunc
112
Bram Moolenaard6a8d482016-02-10 20:32:20 +0100113func s:communicate(port)
114 let handle = ch_open('localhost:' . a:port, s:chopt)
Bram Moolenaar77073442016-02-13 23:23:53 +0100115 if ch_status(handle) == "fail"
Bram Moolenaard6a8d482016-02-10 20:32:20 +0100116 call assert_false(1, "Can't open channel")
Bram Moolenaarfcb1e3d2016-02-03 21:32:46 +0100117 return
118 endif
Bram Moolenaar839fd112016-03-06 21:34:03 +0100119 if has('job')
120 " check that no job is handled correctly
121 call assert_equal('no process', string(ch_getjob(handle)))
122 endif
Bram Moolenaard7ece102016-02-02 23:23:02 +0100123
124 " Simple string request and reply.
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100125 call assert_equal('got it', ch_evalexpr(handle, 'hello!'))
Bram Moolenaard7ece102016-02-02 23:23:02 +0100126
127 " Request that triggers sending two ex commands. These will usually be
128 " handled before getting the response, but it's not guaranteed, thus wait a
129 " tiny bit for the commands to get executed.
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100130 call assert_equal('ok', ch_evalexpr(handle, 'make change'))
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100131 call s:waitFor('"added2" == getline("$")')
Bram Moolenaard7ece102016-02-02 23:23:02 +0100132 call assert_equal('added1', getline(line('$') - 1))
133 call assert_equal('added2', getline('$'))
134
Bram Moolenaarda94fdf2016-03-03 18:09:10 +0100135 call assert_equal('ok', ch_evalexpr(handle, 'do normal', {'timeout': 100}))
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100136 call s:waitFor('"added more" == getline("$")')
Bram Moolenaarf4160862016-02-05 23:09:12 +0100137 call assert_equal('added more', getline('$'))
138
Bram Moolenaara07fec92016-02-05 21:04:08 +0100139 " Send a request with a specific handler.
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100140 call ch_sendexpr(handle, 'hello!', {'callback': 's:RequestHandler'})
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100141 call s:waitFor('exists("s:responseHandle")')
Bram Moolenaar77073442016-02-13 23:23:53 +0100142 if !exists('s:responseHandle')
143 call assert_false(1, 's:responseHandle was not set')
144 else
145 call assert_equal(handle, s:responseHandle)
Bram Moolenaar9186a272016-02-23 19:34:01 +0100146 unlet s:responseHandle
Bram Moolenaar77073442016-02-13 23:23:53 +0100147 endif
Bram Moolenaara07fec92016-02-05 21:04:08 +0100148 call assert_equal('got it', s:responseMsg)
149
Bram Moolenaarb6a4fee2016-02-11 20:48:34 +0100150 let s:responseMsg = ''
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100151 call ch_sendexpr(handle, 'hello!', {'callback': function('s:RequestHandler')})
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100152 call s:waitFor('exists("s:responseHandle")')
Bram Moolenaar77073442016-02-13 23:23:53 +0100153 if !exists('s:responseHandle')
154 call assert_false(1, 's:responseHandle was not set')
155 else
156 call assert_equal(handle, s:responseHandle)
Bram Moolenaar9186a272016-02-23 19:34:01 +0100157 unlet s:responseHandle
Bram Moolenaar77073442016-02-13 23:23:53 +0100158 endif
Bram Moolenaarb6a4fee2016-02-11 20:48:34 +0100159 call assert_equal('got it', s:responseMsg)
160
Bram Moolenaar38fd4bb2016-03-06 16:38:28 +0100161 " Collect garbage, tests that our handle isn't collected.
162 call garbagecollect()
163
Bram Moolenaar40ea1da2016-02-19 22:33:35 +0100164 " check setting options (without testing the effect)
165 call ch_setoptions(handle, {'callback': 's:NotUsed'})
Bram Moolenaar1f6ef662016-02-19 22:59:44 +0100166 call ch_setoptions(handle, {'timeout': 1111})
Bram Moolenaarb6b52522016-02-20 23:30:07 +0100167 call ch_setoptions(handle, {'mode': 'json'})
Bram Moolenaar40ea1da2016-02-19 22:33:35 +0100168 call assert_fails("call ch_setoptions(handle, {'waittime': 111})", "E475")
Bram Moolenaar0ba75a92016-02-19 23:21:26 +0100169 call ch_setoptions(handle, {'callback': ''})
Bram Moolenaar40ea1da2016-02-19 22:33:35 +0100170
Bram Moolenaarfcb1e3d2016-02-03 21:32:46 +0100171 " Send an eval request that works.
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100172 call assert_equal('ok', ch_evalexpr(handle, 'eval-works'))
Bram Moolenaara02b3212016-02-04 21:03:33 +0100173 sleep 10m
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100174 call assert_equal([-1, 'foo123'], ch_evalexpr(handle, 'eval-result'))
Bram Moolenaarfcb1e3d2016-02-03 21:32:46 +0100175
176 " Send an eval request that fails.
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100177 call assert_equal('ok', ch_evalexpr(handle, 'eval-fails'))
Bram Moolenaara02b3212016-02-04 21:03:33 +0100178 sleep 10m
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100179 call assert_equal([-2, 'ERROR'], ch_evalexpr(handle, 'eval-result'))
Bram Moolenaarfcb1e3d2016-02-03 21:32:46 +0100180
Bram Moolenaar55fab432016-02-07 16:53:13 +0100181 " Send an eval request that works but can't be encoded.
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100182 call assert_equal('ok', ch_evalexpr(handle, 'eval-error'))
Bram Moolenaar55fab432016-02-07 16:53:13 +0100183 sleep 10m
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100184 call assert_equal([-3, 'ERROR'], ch_evalexpr(handle, 'eval-result'))
Bram Moolenaar55fab432016-02-07 16:53:13 +0100185
Bram Moolenaar66624ff2016-02-03 23:59:43 +0100186 " Send a bad eval request. There will be no response.
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100187 call assert_equal('ok', ch_evalexpr(handle, 'eval-bad'))
Bram Moolenaara02b3212016-02-04 21:03:33 +0100188 sleep 10m
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100189 call assert_equal([-3, 'ERROR'], ch_evalexpr(handle, 'eval-result'))
Bram Moolenaar66624ff2016-02-03 23:59:43 +0100190
Bram Moolenaarf4160862016-02-05 23:09:12 +0100191 " Send an expr request
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100192 call assert_equal('ok', ch_evalexpr(handle, 'an expr'))
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100193 call s:waitFor('"three" == getline("$")')
Bram Moolenaarf4160862016-02-05 23:09:12 +0100194 call assert_equal('one', getline(line('$') - 2))
195 call assert_equal('two', getline(line('$') - 1))
196 call assert_equal('three', getline('$'))
197
198 " Request a redraw, we don't check for the effect.
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100199 call assert_equal('ok', ch_evalexpr(handle, 'redraw'))
200 call assert_equal('ok', ch_evalexpr(handle, 'redraw!'))
Bram Moolenaarf4160862016-02-05 23:09:12 +0100201
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100202 call assert_equal('ok', ch_evalexpr(handle, 'empty-request'))
Bram Moolenaarf4160862016-02-05 23:09:12 +0100203
Bram Moolenaar6f3a5442016-02-20 19:56:13 +0100204 " Reading while there is nothing available.
Bram Moolenaar9186a272016-02-23 19:34:01 +0100205 call assert_equal(v:none, ch_read(handle, {'timeout': 0}))
206 let start = reltime()
207 call assert_equal(v:none, ch_read(handle, {'timeout': 333}))
208 let elapsed = reltime(start)
209 call assert_true(reltimefloat(elapsed) > 0.3)
210 call assert_true(reltimefloat(elapsed) < 0.6)
Bram Moolenaar6f3a5442016-02-20 19:56:13 +0100211
212 " Send without waiting for a response, then wait for a response.
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100213 call ch_sendexpr(handle, 'wait a bit')
Bram Moolenaar6f3a5442016-02-20 19:56:13 +0100214 let resp = ch_read(handle)
215 call assert_equal(type([]), type(resp))
216 call assert_equal(type(11), type(resp[0]))
217 call assert_equal('waited', resp[1])
218
Bram Moolenaard7ece102016-02-02 23:23:02 +0100219 " make the server quit, can't check if this works, should not hang.
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100220 call ch_sendexpr(handle, '!quit!')
Bram Moolenaard6a8d482016-02-10 20:32:20 +0100221endfunc
Bram Moolenaard7ece102016-02-02 23:23:02 +0100222
Bram Moolenaard6a8d482016-02-10 20:32:20 +0100223func Test_communicate()
Bram Moolenaar81661fb2016-02-18 22:23:34 +0100224 call ch_log('Test_communicate()')
Bram Moolenaard6a8d482016-02-10 20:32:20 +0100225 call s:run_server('s:communicate')
Bram Moolenaard7ece102016-02-02 23:23:02 +0100226endfunc
Bram Moolenaarfcb1e3d2016-02-03 21:32:46 +0100227
Bram Moolenaar3b05b132016-02-03 23:25:07 +0100228" Test that we can open two channels.
Bram Moolenaard6a8d482016-02-10 20:32:20 +0100229func s:two_channels(port)
Bram Moolenaar39b21272016-02-10 23:28:21 +0100230 let handle = ch_open('localhost:' . a:port, s:chopt)
Bram Moolenaar77073442016-02-13 23:23:53 +0100231 if ch_status(handle) == "fail"
Bram Moolenaard6a8d482016-02-10 20:32:20 +0100232 call assert_false(1, "Can't open channel")
Bram Moolenaar3b05b132016-02-03 23:25:07 +0100233 return
234 endif
Bram Moolenaard6a8d482016-02-10 20:32:20 +0100235
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100236 call assert_equal('got it', ch_evalexpr(handle, 'hello!'))
Bram Moolenaar3b05b132016-02-03 23:25:07 +0100237
Bram Moolenaard6a8d482016-02-10 20:32:20 +0100238 let newhandle = ch_open('localhost:' . a:port, s:chopt)
Bram Moolenaar77073442016-02-13 23:23:53 +0100239 if ch_status(newhandle) == "fail"
Bram Moolenaard6a8d482016-02-10 20:32:20 +0100240 call assert_false(1, "Can't open second channel")
241 return
242 endif
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100243 call assert_equal('got it', ch_evalexpr(newhandle, 'hello!'))
244 call assert_equal('got it', ch_evalexpr(handle, 'hello!'))
Bram Moolenaar3b05b132016-02-03 23:25:07 +0100245
246 call ch_close(handle)
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100247 call assert_equal('got it', ch_evalexpr(newhandle, 'hello!'))
Bram Moolenaar3b05b132016-02-03 23:25:07 +0100248
Bram Moolenaard6a8d482016-02-10 20:32:20 +0100249 call ch_close(newhandle)
250endfunc
251
252func Test_two_channels()
Bram Moolenaar81661fb2016-02-18 22:23:34 +0100253 call ch_log('Test_two_channels()')
Bram Moolenaarbfa1ffc2016-02-13 18:40:30 +0100254 call s:run_server('s:two_channels')
Bram Moolenaar3b05b132016-02-03 23:25:07 +0100255endfunc
256
Bram Moolenaarfcb1e3d2016-02-03 21:32:46 +0100257" Test that a server crash is handled gracefully.
Bram Moolenaard6a8d482016-02-10 20:32:20 +0100258func s:server_crash(port)
259 let handle = ch_open('localhost:' . a:port, s:chopt)
Bram Moolenaar77073442016-02-13 23:23:53 +0100260 if ch_status(handle) == "fail"
Bram Moolenaard6a8d482016-02-10 20:32:20 +0100261 call assert_false(1, "Can't open channel")
Bram Moolenaarfcb1e3d2016-02-03 21:32:46 +0100262 return
263 endif
Bram Moolenaard6a8d482016-02-10 20:32:20 +0100264
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100265 call ch_evalexpr(handle, '!crash!')
Bram Moolenaarfcb1e3d2016-02-03 21:32:46 +0100266
Bram Moolenaarfcb1e3d2016-02-03 21:32:46 +0100267 sleep 10m
Bram Moolenaard6a8d482016-02-10 20:32:20 +0100268endfunc
269
270func Test_server_crash()
Bram Moolenaar81661fb2016-02-18 22:23:34 +0100271 call ch_log('Test_server_crash()')
Bram Moolenaarbfa1ffc2016-02-13 18:40:30 +0100272 call s:run_server('s:server_crash')
Bram Moolenaarfcb1e3d2016-02-03 21:32:46 +0100273endfunc
Bram Moolenaar7a84dbe2016-02-07 21:29:00 +0100274
Bram Moolenaard6547fc2016-03-03 19:35:02 +0100275"""""""""
276
Bram Moolenaarf6157282016-02-10 21:07:14 +0100277let s:reply = ""
278func s:Handler(chan, msg)
Bram Moolenaarb6a4fee2016-02-11 20:48:34 +0100279 unlet s:reply
Bram Moolenaarf6157282016-02-10 21:07:14 +0100280 let s:reply = a:msg
281endfunc
282
283func s:channel_handler(port)
Bram Moolenaarb6a4fee2016-02-11 20:48:34 +0100284 let handle = ch_open('localhost:' . a:port, s:chopt)
Bram Moolenaar77073442016-02-13 23:23:53 +0100285 if ch_status(handle) == "fail"
Bram Moolenaarf6157282016-02-10 21:07:14 +0100286 call assert_false(1, "Can't open channel")
287 return
288 endif
289
290 " Test that it works while waiting on a numbered message.
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100291 call assert_equal('ok', ch_evalexpr(handle, 'call me'))
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100292 call s:waitFor('"we called you" == s:reply')
Bram Moolenaarf6157282016-02-10 21:07:14 +0100293 call assert_equal('we called you', s:reply)
294
295 " Test that it works while not waiting on a numbered message.
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100296 call ch_sendexpr(handle, 'call me again')
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100297 call s:waitFor('"we did call you" == s:reply')
Bram Moolenaarf6157282016-02-10 21:07:14 +0100298 call assert_equal('we did call you', s:reply)
299endfunc
300
301func Test_channel_handler()
Bram Moolenaar81661fb2016-02-18 22:23:34 +0100302 call ch_log('Test_channel_handler()')
Bram Moolenaarb6a4fee2016-02-11 20:48:34 +0100303 let s:chopt.callback = 's:Handler'
Bram Moolenaarf6157282016-02-10 21:07:14 +0100304 call s:run_server('s:channel_handler')
Bram Moolenaarb6a4fee2016-02-11 20:48:34 +0100305 let s:chopt.callback = function('s:Handler')
306 call s:run_server('s:channel_handler')
307 unlet s:chopt.callback
Bram Moolenaarf6157282016-02-10 21:07:14 +0100308endfunc
309
Bram Moolenaard6547fc2016-03-03 19:35:02 +0100310"""""""""
311
Bram Moolenaar5983ad02016-03-05 20:54:36 +0100312let s:ch_reply = ''
313func s:ChHandler(chan, msg)
314 unlet s:ch_reply
315 let s:ch_reply = a:msg
316endfunc
317
318let s:zero_reply = ''
319func s:OneHandler(chan, msg)
320 unlet s:zero_reply
321 let s:zero_reply = a:msg
322endfunc
323
324func s:channel_zero(port)
325 let handle = ch_open('localhost:' . a:port, s:chopt)
326 if ch_status(handle) == "fail"
327 call assert_false(1, "Can't open channel")
328 return
329 endif
330
331 " Check that eval works.
332 call assert_equal('got it', ch_evalexpr(handle, 'hello!'))
333
334 " Check that eval works if a zero id message is sent back.
335 let s:ch_reply = ''
336 call assert_equal('sent zero', ch_evalexpr(handle, 'send zero'))
Bram Moolenaar5983ad02016-03-05 20:54:36 +0100337 if s:has_handler
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100338 call s:waitFor('"zero index" == s:ch_reply')
Bram Moolenaar5983ad02016-03-05 20:54:36 +0100339 call assert_equal('zero index', s:ch_reply)
340 else
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100341 sleep 20m
Bram Moolenaar5983ad02016-03-05 20:54:36 +0100342 call assert_equal('', s:ch_reply)
343 endif
344
345 " Check that handler works if a zero id message is sent back.
346 let s:ch_reply = ''
347 let s:zero_reply = ''
348 call ch_sendexpr(handle, 'send zero', {'callback': 's:OneHandler'})
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100349 call s:waitFor('"sent zero" == s:zero_reply')
Bram Moolenaar5983ad02016-03-05 20:54:36 +0100350 if s:has_handler
351 call assert_equal('zero index', s:ch_reply)
352 else
353 call assert_equal('', s:ch_reply)
354 endif
355 call assert_equal('sent zero', s:zero_reply)
356endfunc
357
358func Test_zero_reply()
359 call ch_log('Test_zero_reply()')
360 " Run with channel handler
361 let s:has_handler = 1
362 let s:chopt.callback = 's:ChHandler'
363 call s:run_server('s:channel_zero')
364 unlet s:chopt.callback
365
366 " Run without channel handler
367 let s:has_handler = 0
368 call s:run_server('s:channel_zero')
369endfunc
370
371"""""""""
372
Bram Moolenaard6547fc2016-03-03 19:35:02 +0100373let s:reply1 = ""
374func s:HandleRaw1(chan, msg)
375 unlet s:reply1
376 let s:reply1 = a:msg
377endfunc
378
379let s:reply2 = ""
380func s:HandleRaw2(chan, msg)
381 unlet s:reply2
382 let s:reply2 = a:msg
383endfunc
384
385let s:reply3 = ""
386func s:HandleRaw3(chan, msg)
387 unlet s:reply3
388 let s:reply3 = a:msg
389endfunc
390
391func s:raw_one_time_callback(port)
392 let handle = ch_open('localhost:' . a:port, s:chopt)
393 if ch_status(handle) == "fail"
394 call assert_false(1, "Can't open channel")
395 return
396 endif
397 call ch_setoptions(handle, {'mode': 'raw'})
398
399 " The message are sent raw, we do our own JSON strings here.
400 call ch_sendraw(handle, "[1, \"hello!\"]", {'callback': 's:HandleRaw1'})
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100401 call s:waitFor('s:reply1 != ""')
Bram Moolenaard6547fc2016-03-03 19:35:02 +0100402 call assert_equal("[1, \"got it\"]", s:reply1)
403 call ch_sendraw(handle, "[2, \"echo something\"]", {'callback': 's:HandleRaw2'})
404 call ch_sendraw(handle, "[3, \"wait a bit\"]", {'callback': 's:HandleRaw3'})
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100405 call s:waitFor('s:reply2 != ""')
Bram Moolenaard6547fc2016-03-03 19:35:02 +0100406 call assert_equal("[2, \"something\"]", s:reply2)
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100407 " wait for the 200 msec delayed reply
408 call s:waitFor('s:reply3 != ""')
Bram Moolenaard6547fc2016-03-03 19:35:02 +0100409 call assert_equal("[3, \"waited\"]", s:reply3)
410endfunc
411
412func Test_raw_one_time_callback()
Bram Moolenaard6547fc2016-03-03 19:35:02 +0100413 call ch_log('Test_raw_one_time_callback()')
414 call s:run_server('s:raw_one_time_callback')
Bram Moolenaard6547fc2016-03-03 19:35:02 +0100415endfunc
416
417"""""""""
418
Bram Moolenaar7a84dbe2016-02-07 21:29:00 +0100419" Test that trying to connect to a non-existing port fails quickly.
420func Test_connect_waittime()
Bram Moolenaar81661fb2016-02-18 22:23:34 +0100421 call ch_log('Test_connect_waittime()')
Bram Moolenaar7a84dbe2016-02-07 21:29:00 +0100422 let start = reltime()
Bram Moolenaara4833262016-02-09 23:33:25 +0100423 let handle = ch_open('localhost:9876', s:chopt)
Bram Moolenaar81661fb2016-02-18 22:23:34 +0100424 if ch_status(handle) != "fail"
Bram Moolenaar7a84dbe2016-02-07 21:29:00 +0100425 " Oops, port does exists.
426 call ch_close(handle)
427 else
428 let elapsed = reltime(start)
Bram Moolenaar74f5e652016-02-07 21:44:49 +0100429 call assert_true(reltimefloat(elapsed) < 1.0)
Bram Moolenaar7a84dbe2016-02-07 21:29:00 +0100430 endif
431
Bram Moolenaar08298fa2016-02-21 13:01:53 +0100432 " We intend to use a socket that doesn't exist and wait for half a second
433 " before giving up. If the socket does exist it can fail in various ways.
434 " Check for "Connection reset by peer" to avoid flakyness.
Bram Moolenaar7a84dbe2016-02-07 21:29:00 +0100435 let start = reltime()
Bram Moolenaar08298fa2016-02-21 13:01:53 +0100436 try
437 let handle = ch_open('localhost:9867', {'waittime': 500})
438 if ch_status(handle) != "fail"
439 " Oops, port does exists.
440 call ch_close(handle)
441 else
442 " Failed connection should wait about 500 msec.
443 let elapsed = reltime(start)
444 call assert_true(reltimefloat(elapsed) > 0.3)
445 call assert_true(reltimefloat(elapsed) < 1.0)
446 endif
447 catch
448 if v:exception !~ 'Connection reset by peer'
449 call assert_false(1, "Caught exception: " . v:exception)
450 endif
451 endtry
Bram Moolenaar7a84dbe2016-02-07 21:29:00 +0100452endfunc
Bram Moolenaar6463ca22016-02-13 17:04:46 +0100453
Bram Moolenaard6547fc2016-03-03 19:35:02 +0100454"""""""""
455
Bram Moolenaar9a6e33a2016-02-16 19:25:12 +0100456func Test_raw_pipe()
457 if !has('job')
458 return
459 endif
Bram Moolenaar81661fb2016-02-18 22:23:34 +0100460 call ch_log('Test_raw_pipe()')
Bram Moolenaar9a6e33a2016-02-16 19:25:12 +0100461 let job = job_start(s:python . " test_channel_pipe.py", {'mode': 'raw'})
462 call assert_equal("run", job_status(job))
463 try
Bram Moolenaar151f6562016-03-07 21:19:38 +0100464 " For a change use the job where a channel is expected.
465 call ch_sendraw(job, "echo something\n")
466 let msg = ch_readraw(job)
Bram Moolenaar9a6e33a2016-02-16 19:25:12 +0100467 call assert_equal("something\n", substitute(msg, "\r", "", 'g'))
468
Bram Moolenaar151f6562016-03-07 21:19:38 +0100469 call ch_sendraw(job, "double this\n")
470 let msg = ch_readraw(job)
Bram Moolenaar9a6e33a2016-02-16 19:25:12 +0100471 call assert_equal("this\nAND this\n", substitute(msg, "\r", "", 'g'))
472
Bram Moolenaar151f6562016-03-07 21:19:38 +0100473 let reply = ch_evalraw(job, "quit\n", {'timeout': 100})
Bram Moolenaar9a6e33a2016-02-16 19:25:12 +0100474 call assert_equal("Goodbye!\n", substitute(reply, "\r", "", 'g'))
475 finally
476 call job_stop(job)
477 endtry
478endfunc
479
480func Test_nl_pipe()
Bram Moolenaard8070362016-02-15 21:56:54 +0100481 if !has('job')
Bram Moolenaar6463ca22016-02-13 17:04:46 +0100482 return
483 endif
Bram Moolenaar81661fb2016-02-18 22:23:34 +0100484 call ch_log('Test_nl_pipe()')
Bram Moolenaarb6a77372016-02-15 22:55:28 +0100485 let job = job_start(s:python . " test_channel_pipe.py")
Bram Moolenaar6463ca22016-02-13 17:04:46 +0100486 call assert_equal("run", job_status(job))
487 try
488 let handle = job_getchannel(job)
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100489 call ch_sendraw(handle, "echo something\n")
Bram Moolenaar9a6e33a2016-02-16 19:25:12 +0100490 call assert_equal("something", ch_readraw(handle))
491
Bram Moolenaarc25558b2016-03-03 21:02:23 +0100492 call ch_sendraw(handle, "echoerr wrong\n")
493 call assert_equal("wrong", ch_readraw(handle, {'part': 'err'}))
494
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100495 call ch_sendraw(handle, "double this\n")
Bram Moolenaar9a6e33a2016-02-16 19:25:12 +0100496 call assert_equal("this", ch_readraw(handle))
497 call assert_equal("AND this", ch_readraw(handle))
498
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100499 let reply = ch_evalraw(handle, "quit\n")
Bram Moolenaar9a6e33a2016-02-16 19:25:12 +0100500 call assert_equal("Goodbye!", reply)
Bram Moolenaar6463ca22016-02-13 17:04:46 +0100501 finally
502 call job_stop(job)
503 endtry
504endfunc
Bram Moolenaar3bece9f2016-02-15 20:39:46 +0100505
Bram Moolenaarc25558b2016-03-03 21:02:23 +0100506func Test_nl_err_to_out_pipe()
507 if !has('job')
508 return
509 endif
510 call ch_log('Test_nl_err_to_out_pipe()')
511 let job = job_start(s:python . " test_channel_pipe.py", {'err-io': 'out'})
512 call assert_equal("run", job_status(job))
513 try
514 let handle = job_getchannel(job)
515 call ch_sendraw(handle, "echo something\n")
516 call assert_equal("something", ch_readraw(handle))
517
518 call ch_sendraw(handle, "echoerr wrong\n")
519 call assert_equal("wrong", ch_readraw(handle))
520 finally
521 call job_stop(job)
522 endtry
523endfunc
524
Bram Moolenaarb69fccf2016-03-06 23:06:25 +0100525func Test_nl_read_file()
526 if !has('job')
527 return
528 endif
Bram Moolenaarb69fccf2016-03-06 23:06:25 +0100529 call ch_log('Test_nl_read_file()')
530 call writefile(['echo something', 'echoerr wrong', 'double this'], 'Xinput')
531 let job = job_start(s:python . " test_channel_pipe.py",
532 \ {'in-io': 'file', 'in-name': 'Xinput'})
533 call assert_equal("run", job_status(job))
534 try
535 let handle = job_getchannel(job)
536 call assert_equal("something", ch_readraw(handle))
537 call assert_equal("wrong", ch_readraw(handle, {'part': 'err'}))
538 call assert_equal("this", ch_readraw(handle))
539 call assert_equal("AND this", ch_readraw(handle))
540 finally
541 call job_stop(job)
542 call delete('Xinput')
543 endtry
544endfunc
545
Bram Moolenaare98d1212016-03-08 15:37:41 +0100546func Test_nl_write_out_file()
547 if !has('job')
548 return
549 endif
Bram Moolenaare98d1212016-03-08 15:37:41 +0100550 call ch_log('Test_nl_write_out_file()')
551 let job = job_start(s:python . " test_channel_pipe.py",
552 \ {'out-io': 'file', 'out-name': 'Xoutput'})
553 call assert_equal("run", job_status(job))
554 try
555 let handle = job_getchannel(job)
556 call ch_sendraw(handle, "echo line one\n")
557 call ch_sendraw(handle, "echo line two\n")
558 call ch_sendraw(handle, "double this\n")
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100559 call s:waitFor('len(readfile("Xoutput")) > 2')
Bram Moolenaare98d1212016-03-08 15:37:41 +0100560 call assert_equal(['line one', 'line two', 'this', 'AND this'], readfile('Xoutput'))
561 finally
562 call job_stop(job)
563 call delete('Xoutput')
564 endtry
565endfunc
566
567func Test_nl_write_err_file()
568 if !has('job')
569 return
570 endif
Bram Moolenaare98d1212016-03-08 15:37:41 +0100571 call ch_log('Test_nl_write_err_file()')
572 let job = job_start(s:python . " test_channel_pipe.py",
573 \ {'err-io': 'file', 'err-name': 'Xoutput'})
574 call assert_equal("run", job_status(job))
575 try
576 let handle = job_getchannel(job)
577 call ch_sendraw(handle, "echoerr line one\n")
578 call ch_sendraw(handle, "echoerr line two\n")
579 call ch_sendraw(handle, "doubleerr this\n")
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100580 call s:waitFor('len(readfile("Xoutput")) > 2')
Bram Moolenaare98d1212016-03-08 15:37:41 +0100581 call assert_equal(['line one', 'line two', 'this', 'AND this'], readfile('Xoutput'))
582 finally
583 call job_stop(job)
584 call delete('Xoutput')
585 endtry
586endfunc
587
588func Test_nl_write_both_file()
589 if !has('job')
590 return
591 endif
Bram Moolenaare98d1212016-03-08 15:37:41 +0100592 call ch_log('Test_nl_write_both_file()')
593 let job = job_start(s:python . " test_channel_pipe.py",
594 \ {'out-io': 'file', 'out-name': 'Xoutput', 'err-io': 'out'})
595 call assert_equal("run", job_status(job))
596 try
597 let handle = job_getchannel(job)
598 call ch_sendraw(handle, "echoerr line one\n")
599 call ch_sendraw(handle, "echo line two\n")
600 call ch_sendraw(handle, "double this\n")
601 call ch_sendraw(handle, "doubleerr that\n")
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100602 call s:waitFor('len(readfile("Xoutput")) > 5')
Bram Moolenaare98d1212016-03-08 15:37:41 +0100603 call assert_equal(['line one', 'line two', 'this', 'AND this', 'that', 'AND that'], readfile('Xoutput'))
604 finally
605 call job_stop(job)
606 call delete('Xoutput')
607 endtry
608endfunc
609
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100610func Test_pipe_to_buffer()
611 if !has('job')
612 return
613 endif
614 call ch_log('Test_pipe_to_buffer()')
615 let job = job_start(s:python . " test_channel_pipe.py",
616 \ {'out-io': 'buffer', 'out-name': 'pipe-output'})
617 call assert_equal("run", job_status(job))
618 try
619 let handle = job_getchannel(job)
620 call ch_sendraw(handle, "echo line one\n")
621 call ch_sendraw(handle, "echo line two\n")
622 call ch_sendraw(handle, "double this\n")
623 call ch_sendraw(handle, "quit\n")
624 sp pipe-output
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100625 call s:waitFor('line("$") >= 6')
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100626 call assert_equal(['Reading from channel output...', 'line one', 'line two', 'this', 'AND this', 'Goodbye!'], getline(1, '$'))
627 bwipe!
628 finally
629 call job_stop(job)
630 endtry
631endfunc
632
Bram Moolenaar014069a2016-03-03 22:51:40 +0100633func Test_pipe_from_buffer()
634 if !has('job')
635 return
636 endif
Bram Moolenaar014069a2016-03-03 22:51:40 +0100637 call ch_log('Test_pipe_from_buffer()')
638
639 sp pipe-input
640 call setline(1, ['echo one', 'echo two', 'echo three'])
641
642 let job = job_start(s:python . " test_channel_pipe.py",
643 \ {'in-io': 'buffer', 'in-name': 'pipe-input'})
644 call assert_equal("run", job_status(job))
645 try
646 let handle = job_getchannel(job)
647 call assert_equal('one', ch_read(handle))
648 call assert_equal('two', ch_read(handle))
649 call assert_equal('three', ch_read(handle))
650 bwipe!
651 finally
652 call job_stop(job)
653 endtry
Bram Moolenaar014069a2016-03-03 22:51:40 +0100654endfunc
655
Bram Moolenaarc7f0ebc2016-02-27 21:10:09 +0100656func Test_pipe_to_nameless_buffer()
657 if !has('job')
658 return
659 endif
660 call ch_log('Test_pipe_to_nameless_buffer()')
661 let job = job_start(s:python . " test_channel_pipe.py",
662 \ {'out-io': 'buffer'})
663 call assert_equal("run", job_status(job))
664 try
665 let handle = job_getchannel(job)
666 call ch_sendraw(handle, "echo line one\n")
667 call ch_sendraw(handle, "echo line two\n")
668 exe ch_getbufnr(handle, "out") . 'sbuf'
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100669 call s:waitFor('line("$") >= 3')
Bram Moolenaarc7f0ebc2016-02-27 21:10:09 +0100670 call assert_equal(['Reading from channel output...', 'line one', 'line two'], getline(1, '$'))
671 bwipe!
672 finally
673 call job_stop(job)
674 endtry
675endfunc
676
Bram Moolenaarcc7f8be2016-02-29 22:55:56 +0100677func Test_pipe_to_buffer_json()
678 if !has('job')
679 return
680 endif
681 call ch_log('Test_pipe_to_buffer_json()')
682 let job = job_start(s:python . " test_channel_pipe.py",
683 \ {'out-io': 'buffer', 'out-mode': 'json'})
684 call assert_equal("run", job_status(job))
685 try
686 let handle = job_getchannel(job)
687 call ch_sendraw(handle, "echo [0, \"hello\"]\n")
688 call ch_sendraw(handle, "echo [-2, 12.34]\n")
689 exe ch_getbufnr(handle, "out") . 'sbuf'
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100690 call s:waitFor('line("$") >= 3')
Bram Moolenaarcc7f8be2016-02-29 22:55:56 +0100691 call assert_equal(['Reading from channel output...', '[0,"hello"]', '[-2,12.34]'], getline(1, '$'))
692 bwipe!
693 finally
694 call job_stop(job)
695 endtry
696endfunc
697
Bram Moolenaar3f39f642016-03-06 21:35:57 +0100698" Wait a little while for the last line, minus "offset", to equal "line".
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100699func s:wait_for_last_line(line, offset)
Bram Moolenaar3f39f642016-03-06 21:35:57 +0100700 for i in range(100)
Bram Moolenaar3f39f642016-03-06 21:35:57 +0100701 if getline(line('$') - a:offset) == a:line
702 break
703 endif
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100704 sleep 10m
Bram Moolenaar3f39f642016-03-06 21:35:57 +0100705 endfor
706endfunc
707
708func Test_pipe_io_two_buffers()
709 if !has('job')
710 return
711 endif
712 call ch_log('Test_pipe_io_two_buffers()')
713
714 " Create two buffers, one to read from and one to write to.
715 split pipe-output
716 set buftype=nofile
717 split pipe-input
718 set buftype=nofile
719
720 let job = job_start(s:python . " test_channel_pipe.py",
721 \ {'in-io': 'buffer', 'in-name': 'pipe-input', 'in-top': 0,
722 \ 'out-io': 'buffer', 'out-name': 'pipe-output'})
723 call assert_equal("run", job_status(job))
724 try
725 exe "normal Gaecho hello\<CR>"
726 exe bufwinnr('pipe-output') . "wincmd w"
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100727 call s:wait_for_last_line('hello', 0)
Bram Moolenaar3f39f642016-03-06 21:35:57 +0100728 call assert_equal('hello', getline('$'))
729
730 exe bufwinnr('pipe-input') . "wincmd w"
731 exe "normal Gadouble this\<CR>"
732 exe bufwinnr('pipe-output') . "wincmd w"
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100733 call s:wait_for_last_line('AND this', 0)
Bram Moolenaar3f39f642016-03-06 21:35:57 +0100734 call assert_equal('this', getline(line('$') - 1))
735 call assert_equal('AND this', getline('$'))
736
737 bwipe!
738 exe bufwinnr('pipe-input') . "wincmd w"
739 bwipe!
740 finally
741 call job_stop(job)
742 endtry
743endfunc
744
745func Test_pipe_io_one_buffer()
746 if !has('job')
747 return
748 endif
749 call ch_log('Test_pipe_io_one_buffer()')
750
751 " Create one buffer to read from and to write to.
752 split pipe-io
753 set buftype=nofile
754
755 let job = job_start(s:python . " test_channel_pipe.py",
756 \ {'in-io': 'buffer', 'in-name': 'pipe-io', 'in-top': 0,
757 \ 'out-io': 'buffer', 'out-name': 'pipe-io'})
758 call assert_equal("run", job_status(job))
759 try
760 exe "normal Goecho hello\<CR>"
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100761 call s:wait_for_last_line('hello', 1)
Bram Moolenaar3f39f642016-03-06 21:35:57 +0100762 call assert_equal('hello', getline(line('$') - 1))
763
764 exe "normal Gadouble this\<CR>"
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100765 call s:wait_for_last_line('AND this', 1)
Bram Moolenaar3f39f642016-03-06 21:35:57 +0100766 call assert_equal('this', getline(line('$') - 2))
767 call assert_equal('AND this', getline(line('$') - 1))
768
769 bwipe!
770 finally
771 call job_stop(job)
772 endtry
773endfunc
774
Bram Moolenaarf65333c2016-03-08 18:27:21 +0100775func Test_pipe_null()
776 if !has('job')
777 return
778 endif
779 " TODO: implement this for MS-Windows
780 if !has('unix')
781 return
782 endif
783 call ch_log('Test_pipe_null()')
784
785 " We cannot check that no I/O works, we only check that the job starts
786 " properly.
787 let job = job_start(s:python . " test_channel_pipe.py something",
788 \ {'in-io': 'null'})
789 call assert_equal("run", job_status(job))
790 try
791 call assert_equal('something', ch_read(job))
792 finally
793 call job_stop(job)
794 endtry
795
796 let job = job_start(s:python . " test_channel_pipe.py err-out",
797 \ {'out-io': 'null'})
798 call assert_equal("run", job_status(job))
799 try
800 call assert_equal('err-out', ch_read(job, {"part": "err"}))
801 finally
802 call job_stop(job)
803 endtry
804
805 let job = job_start(s:python . " test_channel_pipe.py something",
806 \ {'err-io': 'null'})
807 call assert_equal("run", job_status(job))
808 try
809 call assert_equal('something', ch_read(job))
810 finally
811 call job_stop(job)
812 endtry
813
814 let job = job_start(s:python . " test_channel_pipe.py something",
815 \ {'out-io': 'null', 'err-io': 'out'})
816 call assert_equal("run", job_status(job))
817 call job_stop(job)
818
819 let job = job_start(s:python . " test_channel_pipe.py something",
820 \ {'in-io': 'null', 'out-io': 'null', 'err-io': 'null'})
821 call assert_equal("run", job_status(job))
822 call assert_equal('channel fail', string(job_getchannel(job)))
823 call assert_equal('fail', ch_status(job))
824 call job_stop(job)
825endfunc
826
Bram Moolenaard46ae142016-02-16 13:33:52 +0100827""""""""""
828
Bram Moolenaar3bece9f2016-02-15 20:39:46 +0100829let s:unletResponse = ''
830func s:UnletHandler(handle, msg)
831 let s:unletResponse = a:msg
832 unlet s:channelfd
833endfunc
834
835" Test that "unlet handle" in a handler doesn't crash Vim.
836func s:unlet_handle(port)
837 let s:channelfd = ch_open('localhost:' . a:port, s:chopt)
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100838 call ch_sendexpr(s:channelfd, "test", {'callback': function('s:UnletHandler')})
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100839 call s:waitFor('"what?" == s:unletResponse')
Bram Moolenaar3bece9f2016-02-15 20:39:46 +0100840 call assert_equal('what?', s:unletResponse)
841endfunc
842
843func Test_unlet_handle()
Bram Moolenaar81661fb2016-02-18 22:23:34 +0100844 call ch_log('Test_unlet_handle()')
Bram Moolenaar3bece9f2016-02-15 20:39:46 +0100845 call s:run_server('s:unlet_handle')
846endfunc
Bram Moolenaar5cefd402016-02-16 12:44:26 +0100847
Bram Moolenaard46ae142016-02-16 13:33:52 +0100848""""""""""
849
850let s:unletResponse = ''
851func s:CloseHandler(handle, msg)
852 let s:unletResponse = a:msg
853 call ch_close(s:channelfd)
854endfunc
855
856" Test that "unlet handle" in a handler doesn't crash Vim.
857func s:close_handle(port)
858 let s:channelfd = ch_open('localhost:' . a:port, s:chopt)
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100859 call ch_sendexpr(s:channelfd, "test", {'callback': function('s:CloseHandler')})
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100860 call s:waitFor('"what?" == s:unletResponse')
Bram Moolenaard46ae142016-02-16 13:33:52 +0100861 call assert_equal('what?', s:unletResponse)
862endfunc
863
864func Test_close_handle()
Bram Moolenaar81661fb2016-02-18 22:23:34 +0100865 call ch_log('Test_close_handle()')
Bram Moolenaard46ae142016-02-16 13:33:52 +0100866 call s:run_server('s:close_handle')
867endfunc
868
869""""""""""
870
Bram Moolenaar5cefd402016-02-16 12:44:26 +0100871func Test_open_fail()
Bram Moolenaar81661fb2016-02-18 22:23:34 +0100872 call ch_log('Test_open_fail()')
Bram Moolenaar5cefd402016-02-16 12:44:26 +0100873 silent! let ch = ch_open("noserver")
874 echo ch
875 let d = ch
876endfunc
Bram Moolenaar81661fb2016-02-18 22:23:34 +0100877
878""""""""""
879
880func s:open_delay(port)
881 " Wait up to a second for the port to open.
882 let s:chopt.waittime = 1000
883 let channel = ch_open('localhost:' . a:port, s:chopt)
884 unlet s:chopt.waittime
885 if ch_status(channel) == "fail"
886 call assert_false(1, "Can't open channel")
887 return
888 endif
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100889 call assert_equal('got it', ch_evalexpr(channel, 'hello!'))
Bram Moolenaar81661fb2016-02-18 22:23:34 +0100890 call ch_close(channel)
891endfunc
892
893func Test_open_delay()
894 call ch_log('Test_open_delay()')
895 " The server will wait half a second before creating the port.
896 call s:run_server('s:open_delay', 'delay')
897endfunc
Bram Moolenaarece61b02016-02-20 21:39:05 +0100898
899"""""""""
900
901function MyFunction(a,b,c)
902 let s:call_ret = [a:a, a:b, a:c]
903endfunc
904
905function s:test_call(port)
906 let handle = ch_open('localhost:' . a:port, s:chopt)
907 if ch_status(handle) == "fail"
908 call assert_false(1, "Can't open channel")
909 return
910 endif
911
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100912 let s:call_ret = []
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100913 call assert_equal('ok', ch_evalexpr(handle, 'call-func'))
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100914 call s:waitFor('len(s:call_ret) > 0')
Bram Moolenaarece61b02016-02-20 21:39:05 +0100915 call assert_equal([1, 2, 3], s:call_ret)
916endfunc
917
918func Test_call()
919 call ch_log('Test_call()')
920 call s:run_server('s:test_call')
921endfunc
Bram Moolenaaree1cffc2016-02-21 19:14:41 +0100922
923"""""""""
924
Bram Moolenaar4e221c92016-02-23 13:20:22 +0100925let s:job_exit_ret = 'not yet'
Bram Moolenaaree1cffc2016-02-21 19:14:41 +0100926function MyExitCb(job, status)
Bram Moolenaar4e221c92016-02-23 13:20:22 +0100927 let s:job_exit_ret = 'done'
Bram Moolenaaree1cffc2016-02-21 19:14:41 +0100928endfunc
929
930function s:test_exit_callback(port)
931 call job_setoptions(s:job, {'exit-cb': 'MyExitCb'})
932 let s:exit_job = s:job
933endfunc
934
935func Test_exit_callback()
936 if has('job')
Bram Moolenaar9730f742016-02-28 19:50:51 +0100937 call ch_log('Test_exit_callback()')
Bram Moolenaaree1cffc2016-02-21 19:14:41 +0100938 call s:run_server('s:test_exit_callback')
939
Bram Moolenaar9730f742016-02-28 19:50:51 +0100940 " wait up to a second for the job to exit
941 for i in range(100)
942 if s:job_exit_ret == 'done'
943 break
944 endif
945 sleep 10m
946 " calling job_status() triggers the callback
947 call job_status(s:exit_job)
948 endfor
Bram Moolenaaree1cffc2016-02-21 19:14:41 +0100949
Bram Moolenaar4e221c92016-02-23 13:20:22 +0100950 call assert_equal('done', s:job_exit_ret)
Bram Moolenaar9730f742016-02-28 19:50:51 +0100951 unlet s:exit_job
Bram Moolenaaree1cffc2016-02-21 19:14:41 +0100952 endif
953endfunc
Bram Moolenaar4e221c92016-02-23 13:20:22 +0100954
955"""""""""
956
957let s:ch_close_ret = 'alive'
958function MyCloseCb(ch)
959 let s:ch_close_ret = 'closed'
960endfunc
961
962function s:test_close_callback(port)
963 let handle = ch_open('localhost:' . a:port, s:chopt)
964 if ch_status(handle) == "fail"
965 call assert_false(1, "Can't open channel")
966 return
967 endif
968 call ch_setoptions(handle, {'close-cb': 'MyCloseCb'})
969
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100970 call assert_equal('', ch_evalexpr(handle, 'close me'))
Bram Moolenaar9fe885e2016-03-08 16:06:55 +0100971 call s:waitFor('"closed" == s:ch_close_ret')
Bram Moolenaar4e221c92016-02-23 13:20:22 +0100972 call assert_equal('closed', s:ch_close_ret)
973endfunc
974
975func Test_close_callback()
976 call ch_log('Test_close_callback()')
977 call s:run_server('s:test_close_callback')
978endfunc
979
Bram Moolenaar9730f742016-02-28 19:50:51 +0100980" Uncomment this to see what happens, output is in src/testdir/channellog.
981" call ch_logfile('channellog', 'w')