]>
Commit | Line | Data |
---|---|---|
94ace6ff | 1 | AT_BANNER([appctl bashcomp unit tests]) |
08d42548 AW |
2 | |
3 | m4_define([GET_FORMAT], [ | |
4 | echo "$@" | grep -A 1 -- "Command format" | tail -n+2 | |
5 | ]) | |
6 | ||
7 | m4_define([GET_EXPAN], [ | |
8 | echo "$@" | grep -- "available completions for keyword" \ | |
9 | | sed -e 's/^[ ]*//g;s/[ ]*$//g' | |
10 | ]) | |
11 | ||
12 | m4_define([GET_AVAIL], [ | |
13 | echo "$@" | sed -e '1,/Available/d' | tail -n+2 | |
14 | ]) | |
15 | ||
16 | m4_define([GET_COMP_STR], [ | |
17 | echo "available completions for keyword \"$1\": $2" \ | |
18 | | sed -e 's/[ ]*$//g' | |
19 | ]) | |
20 | ||
94ace6ff | 21 | AT_SETUP([appctl-bashcomp - basic verification]) |
08d42548 AW |
22 | AT_SKIP_IF([test -z ${BASH_VERSION+x}]) |
23 | OVS_VSWITCHD_START | |
24 | ||
25 | # complete ovs-appctl [TAB] | |
26 | # complete ovs-dpctl [TAB] | |
27 | # complete ovs-ofctl [TAB] | |
28 | # complete ovsdb-tool [TAB] | |
29 | m4_foreach( | |
30 | [test_command], | |
31 | [[ovs-appctl], | |
32 | [ovs-dpctl], | |
33 | [ovs-ofctl], | |
34 | [ovsdb-tool]], | |
35 | [ | |
94ace6ff | 36 | INPUT="$(bash ovs-appctl-bashcomp.bash debug test_command TAB 2>&1)" |
08d42548 AW |
37 | MATCH="$(test_command --option | sort | sed -n '/^--.*/p' | cut -d '=' -f1) |
38 | $(test_command list-commands | tail -n +2 | cut -c3- | cut -d ' ' -f1 | sort)" | |
39 | AT_CHECK_UNQUOTED([GET_AVAIL(${INPUT})], | |
40 | [0], [dnl | |
41 | ${MATCH} | |
42 | ])]) | |
43 | ||
44 | ||
45 | # complete ovs-appctl --tar[TAB] | |
94ace6ff | 46 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl --tar 2>&1)" |
08d42548 AW |
47 | AT_CHECK_UNQUOTED([GET_AVAIL(${INPUT})], |
48 | [0], [dnl | |
49 | --target | |
50 | ]) | |
51 | ||
52 | ||
53 | # complete ovs-appctl --target [TAB] | |
94ace6ff | 54 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl --target TAB 2>&1)" |
08d42548 AW |
55 | AT_CHECK_UNQUOTED([GET_AVAIL(${INPUT})], |
56 | [0], [dnl | |
57 | ovs-ofctl | |
58 | ovs-vswitchd | |
59 | ovsdb-server | |
60 | ]) | |
61 | ||
62 | ||
63 | # complete ovs-appctl --target ovs-vswitchd [TAB] | |
64 | # complete ovs-appctl --target ovsdb-server [TAB] | |
65 | # complete ovs-appctl --target ovs-ofctl [TAB] | |
66 | AT_CHECK([ovs-ofctl monitor br0 --detach --no-chdir --pidfile]) | |
67 | m4_foreach( | |
68 | [target_daemon], | |
69 | [[ovs-vswitchd], | |
70 | [ovsdb-server], | |
71 | [ovs-ofctl]], | |
72 | [ | |
94ace6ff | 73 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl --target target_daemon TAB 2>&1)" |
08d42548 AW |
74 | MATCH="$(ovs-appctl --option | sort | sed -n '/^--.*/p' | cut -d '=' -f1) |
75 | $(ovs-appctl --target target_daemon list-commands | tail -n +2 | cut -c3- | cut -d ' ' -f1 | sort)" | |
76 | AT_CHECK_UNQUOTED([GET_AVAIL(${INPUT})], | |
77 | [0], [dnl | |
78 | ${MATCH} | |
79 | ])]) | |
d9c8c57c | 80 | OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) |
08d42548 AW |
81 | OVS_VSWITCHD_STOP |
82 | AT_CLEANUP | |
83 | ||
84 | ||
85 | # complex completion check - bfd/set-forwarding | |
86 | # bfd/set-forwarding [interface] normal|false|true | |
87 | # test expansion of 'interface' | |
94ace6ff | 88 | AT_SETUP([appctl-bashcomp - complex completion check 1]) |
08d42548 AW |
89 | AT_SKIP_IF([test -z ${BASH_VERSION+x}]) |
90 | OVS_VSWITCHD_START(add-port br0 p0 -- set Interface p0 type=dummy) | |
91 | ||
92 | # check the top level completion. | |
94ace6ff | 93 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl bfd/set-forwarding TAB 2>&1)" |
08d42548 AW |
94 | MATCH="$(GET_COMP_STR([normal], []) |
95 | GET_COMP_STR([false], []) | |
96 | GET_COMP_STR([true], []) | |
97 | GET_COMP_STR([interface], [p0]))" | |
98 | AT_CHECK_UNQUOTED([GET_EXPAN(${INPUT})], | |
99 | [0], [dnl | |
100 | ${MATCH} | |
101 | ]) | |
102 | # check the available completions. | |
103 | AT_CHECK_UNQUOTED([GET_AVAIL(${INPUT})], | |
104 | [0], [dnl | |
105 | p0 | |
106 | ]) | |
107 | ||
108 | ||
109 | # set argument to 'true', there should be no more completions. | |
94ace6ff | 110 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl bfd/set-forwarding true TAB 2>&1)" |
08d42548 AW |
111 | AT_CHECK_UNQUOTED([echo "$INPUT" | sed -e '/./,$!d'], |
112 | [0], [dnl | |
08d42548 AW |
113 | ]) |
114 | ||
115 | ||
116 | # set argument to 'p1', there should still be the completion for booleans. | |
94ace6ff | 117 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl bfd/set-forwarding p1 TAB 2>&1)" |
08d42548 AW |
118 | MATCH="$(GET_COMP_STR([normal], []) |
119 | GET_COMP_STR([false], []) | |
120 | GET_COMP_STR([true], []))" | |
121 | AT_CHECK_UNQUOTED([GET_EXPAN(${INPUT})], | |
122 | [0], [dnl | |
123 | ${MATCH} | |
124 | ]) | |
125 | # check the available completions. | |
126 | AT_CHECK_UNQUOTED([GET_AVAIL(${INPUT})], [0]) | |
127 | ||
128 | ||
129 | # set argument to 'p1 false', there should still no more completions. | |
94ace6ff | 130 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl bfd/set-forwarding p1 false TAB 2>&1)" |
08d42548 AW |
131 | AT_CHECK_UNQUOTED([echo "$INPUT" | sed -e '/./,$!d'], |
132 | [0], [dnl | |
08d42548 AW |
133 | ]) |
134 | ||
135 | OVS_VSWITCHD_STOP | |
136 | AT_CLEANUP | |
137 | ||
138 | ||
139 | # complex completion check - lacp/show | |
140 | # lacp/show [port] | |
141 | # test expansion on 'port' | |
94ace6ff | 142 | AT_SETUP([appctl-bashcomp - complex completion check 2]) |
08d42548 AW |
143 | AT_SKIP_IF([test -z ${BASH_VERSION+x}]) |
144 | OVS_VSWITCHD_START(add-port br0 p0 -- set Interface p0 type=dummy \ | |
145 | -- add-port br0 p1 -- set Interface p1 type=dummy) | |
146 | ||
147 | # check the top level completion. | |
94ace6ff | 148 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl lacp/show TAB 2>&1)" |
08d42548 AW |
149 | MATCH="$(GET_COMP_STR([port], [br0 p0 p1]))" |
150 | AT_CHECK_UNQUOTED([GET_EXPAN(${INPUT})], | |
151 | [0], [dnl | |
152 | ${MATCH} | |
153 | ]) | |
154 | # check the available completions. | |
155 | AT_CHECK_UNQUOTED([GET_AVAIL(${INPUT})], | |
156 | [0], [dnl | |
157 | br0 | |
158 | p0 | |
159 | p1 | |
160 | ]) | |
161 | ||
162 | ||
163 | # set argument to 'p1', there should be no more completions. | |
94ace6ff | 164 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl lacp/show p1 TAB 2>&1)" |
08d42548 AW |
165 | AT_CHECK_UNQUOTED([echo "$INPUT" | sed -e '/./,$!d'], |
166 | [0], [dnl | |
08d42548 AW |
167 | ]) |
168 | ||
169 | OVS_VSWITCHD_STOP | |
170 | AT_CLEANUP | |
171 | ||
172 | ||
173 | # complex completion check - ofproto/trace | |
174 | # ofproto/trace {[dp_name] odp_flow | bridge br_flow} [-generate|packet] | |
175 | # test expansion on 'dp|dp_name' and 'bridge' | |
94ace6ff | 176 | AT_SETUP([appctl-bashcomp - complex completion check 3]) |
08d42548 AW |
177 | AT_SKIP_IF([test -z ${BASH_VERSION+x}]) |
178 | OVS_VSWITCHD_START(add-port br0 p0 -- set Interface p0 type=dummy \ | |
179 | -- add-port br0 p1 -- set Interface p1 type=dummy) | |
180 | ||
181 | # check the top level completion. | |
94ace6ff | 182 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl ofproto/trace TAB 2>&1)" |
08d42548 AW |
183 | MATCH="$(GET_COMP_STR([bridge], [br0]) |
184 | GET_COMP_STR([odp_flow], []) | |
185 | GET_COMP_STR([dp_name], [ovs-dummy]))" | |
186 | AT_CHECK_UNQUOTED([GET_EXPAN(${INPUT})], | |
187 | [0], [dnl | |
188 | ${MATCH} | |
189 | ]) | |
190 | # check the available completions. | |
191 | AT_CHECK_UNQUOTED([GET_AVAIL(${INPUT})], | |
192 | [0], [dnl | |
193 | br0 | |
194 | ovs-dummy | |
195 | ]) | |
196 | ||
197 | ||
198 | # set argument to 'ovs-dummy', should go to the dp-name path. | |
94ace6ff | 199 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl ofproto/trace ovs-dummy TAB 2>&1)" |
08d42548 AW |
200 | MATCH="$(GET_COMP_STR([odp_flow], []))" |
201 | AT_CHECK_UNQUOTED([GET_EXPAN(${INPUT})], | |
202 | [0], [dnl | |
203 | ${MATCH} | |
204 | ]) | |
205 | # check the available completions. | |
206 | AT_CHECK_UNQUOTED([GET_AVAIL(${INPUT})], [0]) | |
207 | ||
208 | ||
209 | # set odp_flow to some random string, should go to the next level. | |
94ace6ff | 210 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl ofproto/trace ovs-dummy "in_port(123),mac(),ip,tcp" TAB 2>&1)" |
08d42548 AW |
211 | MATCH="$(GET_COMP_STR([-generate], [-generate]) |
212 | GET_COMP_STR([packet], []))" | |
213 | AT_CHECK_UNQUOTED([GET_EXPAN(${INPUT})], | |
214 | [0], [dnl | |
215 | ${MATCH} | |
216 | ]) | |
217 | # check the available completions. | |
218 | AT_CHECK_UNQUOTED([GET_AVAIL(${INPUT})], | |
219 | [0], [dnl | |
220 | -generate | |
221 | ]) | |
222 | ||
223 | ||
224 | # set packet to some random string, there should be no more completions. | |
94ace6ff | 225 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl ofproto/trace ovs-dummy "in_port(123),mac(),ip,tcp" "ABSJDFLSDJFOIWEQR" TAB 2>&1)" |
08d42548 AW |
226 | AT_CHECK_UNQUOTED([echo "$INPUT" | sed -e '/./,$!d'], |
227 | [0], [dnl | |
08d42548 AW |
228 | ]) |
229 | ||
230 | ||
231 | # set argument to 'br0', should go to the bridge path. | |
94ace6ff | 232 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl ofproto/trace br0 TAB 2>&1)" |
08d42548 AW |
233 | MATCH="$(GET_COMP_STR([br_flow], []))" |
234 | AT_CHECK_UNQUOTED([GET_EXPAN(${INPUT})], | |
235 | [0], [dnl | |
236 | ${MATCH} | |
237 | ]) | |
238 | # check the available completions. | |
239 | AT_CHECK_UNQUOTED([GET_AVAIL(${INPUT})], [0]) | |
240 | ||
241 | ||
242 | # set argument to some random string, should go to the odp_flow path. | |
94ace6ff | 243 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl ofproto/trace "in_port(123),mac(),ip,tcp" TAB 2>&1)" |
08d42548 AW |
244 | MATCH="$(GET_COMP_STR([-generate], [-generate]) |
245 | GET_COMP_STR([packet], []))" | |
246 | AT_CHECK_UNQUOTED([GET_EXPAN(${INPUT})], | |
247 | [0], [dnl | |
248 | ${MATCH} | |
249 | ]) | |
250 | # check the available completions. | |
251 | AT_CHECK_UNQUOTED([GET_AVAIL(${INPUT})], | |
252 | [0], [dnl | |
253 | -generate | |
254 | ]) | |
255 | ||
256 | OVS_VSWITCHD_STOP | |
257 | AT_CLEANUP | |
258 | ||
259 | ||
260 | # complex completion check - vlog/set | |
261 | # vlog/set {spec | PATTERN:destination:pattern} | |
262 | # test non expandable arguments | |
94ace6ff | 263 | AT_SETUP([appctl-bashcomp - complex completion check 4]) |
08d42548 AW |
264 | AT_SKIP_IF([test -z ${BASH_VERSION+x}]) |
265 | OVS_VSWITCHD_START | |
266 | ||
267 | # check the top level completion. | |
94ace6ff | 268 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl vlog/set TAB 2>&1)" |
08d42548 AW |
269 | MATCH="$(GET_COMP_STR([PATTERN:destination:pattern], []) |
270 | GET_COMP_STR([spec], []))" | |
271 | AT_CHECK_UNQUOTED([GET_EXPAN(${INPUT})], | |
272 | [0], [dnl | |
273 | ${MATCH} | |
274 | ]) | |
275 | # check the available completions. | |
276 | AT_CHECK_UNQUOTED([GET_AVAIL(${INPUT})], [0]) | |
277 | ||
278 | ||
279 | # set argument to random 'abcd', there should be no more completions. | |
94ace6ff | 280 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl vlog/set abcd TAB 2>&1)" |
08d42548 AW |
281 | AT_CHECK_UNQUOTED([echo "$INPUT" | sed -e '/./,$!d'], |
282 | [0], [dnl | |
08d42548 AW |
283 | ]) |
284 | ||
285 | OVS_VSWITCHD_STOP | |
286 | AT_CLEANUP | |
287 | ||
288 | ||
94ace6ff | 289 | AT_SETUP([appctl-bashcomp - negative test]) |
08d42548 AW |
290 | AT_SKIP_IF([test -z ${BASH_VERSION+x}]) |
291 | OVS_VSWITCHD_START(add-port br0 p0 -- set Interface p0 type=dummy) | |
292 | ||
293 | # negative test - incorrect subcommand | |
94ace6ff | 294 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl ERROR 2>&1)" |
08d42548 | 295 | AT_CHECK_UNQUOTED([echo "$INPUT" | sed -e 's/[ \t]*$//' | sed -e '/./,$!d'], [0]) |
94ace6ff | 296 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl ERROR TAB 2>&1)" |
08d42548 AW |
297 | AT_CHECK_UNQUOTED([echo "$INPUT" | sed -e 's/[ \t]*$//' | sed -e '/./!d'], |
298 | [0], [dnl | |
08d42548 AW |
299 | ]) |
300 | ||
301 | ||
302 | # negative test - no ovs-vswitchd | |
303 | # negative test - no ovsdb-server | |
304 | # negative test - no ovs-ofctl | |
305 | # should not see any error. | |
306 | OVS_VSWITCHD_STOP | |
307 | m4_foreach( | |
308 | [target_daemon], | |
309 | [[ovs-vswitchd], | |
310 | [ovsdb-server], | |
311 | [ovs-ofctl]], | |
312 | [ | |
94ace6ff | 313 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl --target target_daemon TAB 2>&1)" |
08d42548 AW |
314 | MATCH="$(ovs-appctl --option | sort | sed -n '/^--.*/p' | cut -d '=' -f1)" |
315 | AT_CHECK_UNQUOTED([GET_AVAIL(${INPUT})], | |
316 | [0], [dnl | |
317 | ${MATCH} | |
318 | ]) | |
94ace6ff | 319 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovs-appctl --target target_daemon ERROR SUBCMD TAB 2>&1)" |
08d42548 AW |
320 | AT_CHECK_UNQUOTED([echo "$INPUT" | sed -e 's/[ \t]*$//' | sed -e '/./!d'], |
321 | [0], [dnl | |
08d42548 AW |
322 | ])]) |
323 | ||
324 | ||
325 | # negative test - do not match on nested option | |
94ace6ff | 326 | INPUT="$(bash ovs-appctl-bashcomp.bash debug ovsdb-tool create TAB 2>&1)" |
08d42548 AW |
327 | AT_CHECK_UNQUOTED([GET_AVAIL(${INPUT})], [0]) |
328 | ||
557570fa AW |
329 | AT_CLEANUP |
330 | ||
331 | ||
332 | dnl ---------------------------------------------------------------------- | |
333 | AT_BANNER([vsctl bashcomp unit tests]) | |
334 | ||
335 | m4_define([PREPARE_MATCH_NOSPACE], [ | |
336 | echo "$@" | tr ' ' '\n' | sed -e '/^$/d' | sort -u | |
337 | ]) | |
338 | ||
339 | m4_define([PREPARE_MATCH_SPACE], [ | |
340 | echo "$@" | tr ' ' '\n' | sed -e '/^$/d' | sed -e 's/$/ /g' | sort -u | |
341 | ]) | |
342 | ||
343 | AT_SETUP([vsctl-bashcomp - basic verification]) | |
622aff96 YT |
344 | AT_SKIP_IF([test -z ${BASH_VERSION+x}]) |
345 | AT_SKIP_IF([eval 'test ${BASH_VERSINFO[[0]]} -lt 4']) | |
557570fa AW |
346 | OVS_VSWITCHD_START |
347 | ||
348 | # complete ovs-vsctl --db=* [TAB] | |
349 | TMP="$(ovs-vsctl --commands | cut -d',' -f1-2 | tr -d ',[[]]' | tr -s ' ' '\n') | |
350 | $(ovs-vsctl --options | grep -- '--' | sed -e 's/=.*$/=/g')" | |
351 | MATCH="$(PREPARE_MATCH_NOSPACE(${TMP}))" | |
352 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "--db=unix:$OVS_RUNDIR/db.sock "], | |
353 | [0], [dnl | |
354 | ${MATCH} | |
355 | ]) | |
356 | # complete ovs-vsctl [TAB] | |
357 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test ""], | |
358 | [0], [dnl | |
359 | ${MATCH} | |
360 | ]) | |
361 | ||
362 | # complete on global options. | |
363 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "--dry-run "], | |
364 | [0], [dnl | |
365 | ${MATCH} | |
366 | ]) | |
367 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "--dry-run --pretty "], | |
368 | [0], [dnl | |
369 | ${MATCH} | |
370 | ]) | |
371 | ||
372 | # complete on local options. | |
373 | TMP="$(ovs-vsctl --commands | grep -- '--may-exist' | cut -d',' -f1-2 | tr -d ',[[]]' | tr -s ' ' '\n' | grep -v -- '--may-exist')" | |
374 | MATCH="$(PREPARE_MATCH_SPACE(${TMP}))" | |
375 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "--may-exist "], | |
376 | [0], [dnl | |
377 | ${MATCH} | |
378 | ]) | |
379 | ||
380 | # | |
381 | # test !, +, ?, *. | |
382 | # | |
383 | # test !. no following arguments are expanded. | |
384 | TMP="$(ovsdb-client --no-heading list-tables)" | |
385 | MATCH="$(PREPARE_MATCH_SPACE(${TMP}))" | |
386 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "set "], | |
387 | [0], [dnl | |
388 | ${MATCH} | |
389 | ]) | |
390 | # test ?. will show completions for both current and following arguments. | |
391 | ovs-vsctl br-set-external-id br0 bridge-id br0 | |
392 | MATCH="$(PREPARE_MATCH_SPACE(bridge-id --))" | |
393 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "br-get-external-id br0 "], | |
394 | [0], [dnl | |
395 | ${MATCH} | |
396 | ]) | |
397 | # test *. argument with this prefix could be completed for zero or more times. | |
398 | TMP="$(ovs-vsctl --no-heading --columns=_uuid,name list Bridge | tr -d '\"')" | |
399 | MATCH="$(PREPARE_MATCH_SPACE(${TMP} --))" | |
400 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "destroy Bridge "], | |
401 | [0], [dnl | |
402 | ${MATCH} | |
403 | ]) | |
404 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "destroy Bridge br0 "], | |
405 | [0], [dnl | |
406 | ${MATCH} | |
407 | ]) | |
408 | # test +. the first time, an argument is required, after that, it becomes '*'. | |
409 | TMP="$(ovsdb-client --no-heading list-columns Open_vSwitch Bridge | awk '/key.*value/ { print $1":"; next } { print $1; next }')" | |
410 | MATCH="$(PREPARE_MATCH_NOSPACE(${TMP}))" | |
411 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "set Bridge br0 "], | |
412 | [0], [dnl | |
413 | ${MATCH} | |
414 | ]) | |
415 | MATCH="$(PREPARE_MATCH_NOSPACE(${TMP} --))" | |
416 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "set Bridge br0 other_config:random_key=123 "], | |
417 | [0], [dnl | |
418 | ${MATCH} | |
419 | ]) | |
420 | ||
421 | OVS_VSWITCHD_STOP | |
422 | AT_CLEANUP | |
423 | ||
424 | ||
425 | AT_SETUP([vsctl-bashcomp - argument completion]) | |
622aff96 YT |
426 | AT_SKIP_IF([test -z ${BASH_VERSION+x}]) |
427 | AT_SKIP_IF([eval 'test ${BASH_VERSINFO[[0]]} -lt 4']) | |
557570fa AW |
428 | OVS_VSWITCHD_START( |
429 | [add-br br1 -- \ | |
430 | set bridge br1 datapath-type=dummy -- \ | |
431 | add-br foo -- \ | |
432 | set bridge foo datapath-type=dummy -- \ | |
433 | add-br --weird-br_name -- \ | |
434 | set bridge --weird-br_name datapath-type=dummy -- \ | |
435 | add-port br0 br0p0 -- set Interface br0p0 type=dummy -- \ | |
436 | add-port br0 br0p1 -- set Interface br0p1 type=dummy -- \ | |
437 | add-port br1 br1p0 -- set Interface br1p0 type=dummy -- \ | |
438 | add-port br1 br1p1 -- set Interface br1p1 type=dummy -- \ | |
439 | add-port foo bar -- set Interface bar type=dummy ]) | |
440 | # | |
441 | # test completion functions defined in '_OVS_VSCTL_ARG_COMPLETION_FUNCS'. | |
442 | # therein, the different argument prefixes are also tested at the same time. | |
443 | # | |
444 | # A space is appended to each output if completion is configured without | |
445 | # 'nospace' option. | |
446 | # | |
447 | ||
448 | ||
449 | # | |
450 | # test: _ovs_vsctl_complete_table | |
451 | # | |
452 | TMP="$(ovsdb-client --no-heading list-tables)" | |
453 | MATCH="$(PREPARE_MATCH_SPACE(${TMP}))" | |
454 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "set "], | |
455 | [0], [dnl | |
456 | ${MATCH} | |
457 | ]) | |
458 | MATCH="$(PREPARE_MATCH_SPACE(Open_vSwitch))" | |
459 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "set Open"], | |
460 | [0], [dnl | |
461 | ${MATCH} | |
462 | ]) | |
463 | ||
464 | ||
465 | # | |
466 | # test: _ovs_vsctl_complete_record | |
467 | # | |
468 | TMP="$(ovs-vsctl --no-heading --columns=_uuid list Open_vSwitch | tr -d '\"')" | |
469 | MATCH="$(PREPARE_MATCH_SPACE(${TMP}))" | |
470 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "set Open_vSwitch "], | |
471 | [0], [dnl | |
472 | ${MATCH} | |
473 | ]) | |
474 | TMP="$(ovs-vsctl --no-heading --columns=_uuid,name list Bridge | tr -d '\"')" | |
475 | MATCH="$(PREPARE_MATCH_SPACE(${TMP}))" | |
476 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "set Bridge "], | |
477 | [0], [dnl | |
478 | ${MATCH} | |
479 | ]) | |
480 | ||
481 | ||
482 | # | |
483 | # test: _ovs_vsctl_complete_bridge | |
484 | # | |
485 | TMP="$(ovs-vsctl list-br)" | |
486 | MATCH="$(PREPARE_MATCH_SPACE(${TMP}))" | |
487 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "br-to-vlan "], | |
488 | [0], [dnl | |
489 | ${MATCH} | |
490 | ]) | |
491 | # this also helps check the '_ovs_vsctl_check_startswith_string'. | |
492 | MATCH="$(PREPARE_MATCH_SPACE(--weird-br_name))" | |
493 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "br-to-vlan --"], | |
494 | [0], [dnl | |
495 | ${MATCH} | |
496 | ]) | |
497 | ||
498 | ||
499 | # | |
500 | # test: _ovs_vsctl_complete_port | |
501 | # | |
502 | TMP="$(ovs-vsctl --no-heading --columns=name list Port | tr -d '\"')" | |
503 | MATCH="$(PREPARE_MATCH_SPACE(${TMP}))" | |
504 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "port-to-br "], | |
505 | [0], [dnl | |
506 | ${MATCH} | |
507 | ]) | |
508 | # complete on ports in particular bridge. | |
509 | TMP="$(ovs-vsctl list-ports br0)" | |
510 | MATCH="$(PREPARE_MATCH_SPACE(${TMP}))" | |
511 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "del-port br0 "], | |
512 | [0], [dnl | |
513 | ${MATCH} | |
514 | ]) | |
515 | ||
516 | ||
517 | # | |
518 | # test: _ovs_vsctl_complete_iface | |
519 | # | |
520 | for br in `ovs-vsctl list-br`; do | |
521 | TMP="${TMP} $(ovs-vsctl list-ifaces $br)" | |
522 | done | |
523 | MATCH="$(PREPARE_MATCH_SPACE(${TMP}))" | |
524 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "iface-to-br "], | |
525 | [0], [dnl | |
526 | ${MATCH} | |
527 | ]) | |
528 | ||
529 | ||
530 | # | |
531 | # test: _ovs_vsctl_complete_bridge_fail_mode | |
532 | # | |
533 | MATCH="$(PREPARE_MATCH_SPACE(standalone secure))" | |
534 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "set-fail-mode br0 "], | |
535 | [0], [dnl | |
536 | ${MATCH} | |
537 | ]) | |
538 | ||
539 | ||
540 | # | |
541 | # test: _ovs_vsctl_complete_key | |
542 | # | |
543 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "br-set-external-id br0 "], | |
544 | [0], [dnl | |
545 | ||
546 | ]) | |
547 | # since there is no key added yet, we will only get our own input. | |
548 | MATCH="$(PREPARE_MATCH_SPACE(test_key))" | |
549 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "br-set-external-id br0 test_key"], | |
550 | [0], [dnl | |
551 | ${MATCH} | |
552 | ]) | |
553 | # now add a key, as we should see it. | |
554 | ovs-vsctl br-set-external-id br0 bridge-id br0 | |
555 | MATCH="$(PREPARE_MATCH_SPACE(bridge-id))" | |
556 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "br-set-external-id br0 "], | |
557 | [0], [dnl | |
558 | ${MATCH} | |
559 | ]) | |
560 | MATCH="$(PREPARE_MATCH_SPACE(bridge-id --))" | |
561 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "br-get-external-id br0 "], | |
562 | [0], [dnl | |
563 | ${MATCH} | |
564 | ]) | |
565 | ||
566 | ||
567 | # | |
568 | # test: _ovs_vsctl_complete_value | |
569 | # | |
570 | # should just return the user input. | |
571 | MATCH="$(PREPARE_MATCH_SPACE(test_value --))" | |
572 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "br-set-external-id br0 bridge-id test_value"], | |
573 | [0], [dnl | |
574 | ${MATCH} | |
575 | ]) | |
576 | ||
577 | ||
578 | # | |
579 | # test: _ovs_vsctl_complete_column | |
580 | # | |
581 | TMP="$(ovsdb-client --no-heading list-columns Open_vSwitch Open_vSwitch | tr -d ':' | cut -d' ' -f1)" | |
582 | UUID="$(ovs-vsctl --no-heading --columns=_uuid list Open_vSwitch | tr -d ' ')" | |
583 | MATCH="$(PREPARE_MATCH_SPACE(${TMP}))" | |
584 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "clear Open_vSwitch $UUID "], | |
585 | [0], [dnl | |
586 | ${MATCH} | |
587 | ]) | |
588 | TMP="$(ovsdb-client --no-heading list-columns Open_vSwitch Bridge | tr -d ':' | cut -d' ' -f1)" | |
589 | MATCH="$(PREPARE_MATCH_SPACE(${TMP}))" | |
590 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "clear Bridge br0 "], | |
591 | [0], [dnl | |
592 | ${MATCH} | |
593 | ]) | |
594 | # the 'clear' command requires one or more (+) COLUMN. | |
595 | # so, with one specified COLUMN 'other_config', it should still complete on | |
596 | # COLUMNs, plus '--'. | |
597 | MATCH="$(PREPARE_MATCH_SPACE(${TMP} --))" | |
598 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "clear Bridge br0 other_config "], | |
599 | [0], [dnl | |
600 | ${MATCH} | |
601 | ]) | |
602 | ||
603 | ||
604 | # | |
605 | # test: _ovs_vsctl_complete_key_value | |
606 | # | |
607 | # with no key available, should always get user input. | |
608 | MATCH="$(PREPARE_MATCH_NOSPACE(random_key))" | |
609 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "add Bridge br0 other_config random_key"], | |
610 | [0], [dnl | |
611 | ${MATCH} | |
612 | ]) | |
bb5dbe78 | 613 | MATCH="$(PREPARE_MATCH_NOSPACE(abc))" |
557570fa AW |
614 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "add Bridge br0 other_config random_key=abc"], |
615 | [0], [dnl | |
616 | ${MATCH} | |
617 | ]) | |
618 | # now add two random keys. | |
619 | ovs-vsctl set Bridge br0 other_config:random_key1=abc other_config:random_val1=xyz | |
620 | MATCH="$(PREPARE_MATCH_NOSPACE(random_key1= random_val1=))" | |
621 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "add Bridge br0 other_config ran"], | |
622 | [0], [dnl | |
623 | ${MATCH} | |
624 | ]) | |
625 | ||
626 | ||
627 | # | |
628 | # test: _ovs_vsctl_complete_column_optkey_value | |
629 | # | |
630 | # at first, we should complete on column. | |
631 | TMP="$(ovsdb-client --no-heading list-columns Open_vSwitch Bridge | awk '/key.*value/ { print $1":"; next } { print $1; next }')" | |
632 | MATCH="$(PREPARE_MATCH_NOSPACE(${TMP}))" | |
633 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "set Bridge br0 "], | |
634 | [0], [dnl | |
635 | ${MATCH} | |
636 | ]) | |
637 | MATCH="$(PREPARE_MATCH_NOSPACE(other_config:))" | |
638 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "set Bridge br0 other"], | |
639 | [0], [dnl | |
640 | ${MATCH} | |
641 | ]) | |
642 | # then, with the ':' we should complete on key. | |
bb5dbe78 | 643 | TMP="$(ovs-vsctl --no-heading --columns=other_config list Bridge br0 | tr -d '{\"}' | tr -s ', ' '\n' | cut -d'=' -f1)" |
557570fa AW |
644 | MATCH="$(PREPARE_MATCH_NOSPACE(${TMP}))" |
645 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "set Bridge br0 other_config:"], | |
646 | [0], [dnl | |
647 | ${MATCH} | |
648 | ]) | |
649 | # finally, if user fill in some value, we should just complete on user input. | |
bb5dbe78 | 650 | MATCH="$(PREPARE_MATCH_NOSPACE(random_val1))" |
557570fa AW |
651 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "set Bridge br0 other_config:random_val1=12345"], |
652 | [0], [dnl | |
653 | ${MATCH} | |
654 | ]) | |
655 | ||
656 | ||
657 | # | |
658 | # test: _ovs_vsctl_complete_filename | |
659 | # | |
660 | touch private_key certificate | |
661 | MATCH="$(PREPARE_MATCH_SPACE(private_key))" | |
662 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "set-ssl priva"], | |
663 | [0], [dnl | |
664 | ${MATCH} | |
665 | ]) | |
666 | MATCH="$(PREPARE_MATCH_SPACE(certificate))" | |
667 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "set-ssl private_key cer"], | |
668 | [0], [dnl | |
669 | ${MATCH} | |
670 | ]) | |
671 | ||
672 | ||
673 | # | |
674 | # test: _ovs_vsctl_complete_target | |
675 | # | |
676 | MATCH="$(PREPARE_MATCH_NOSPACE(pssl: ptcp: punix: ssl: tcp: unix:))" | |
677 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "set-manager "], | |
678 | [0], [dnl | |
679 | ${MATCH} | |
680 | ]) | |
681 | # filename completion on unix, punix. | |
bb5dbe78 | 682 | MATCH="$(PREPARE_MATCH_NOSPACE(testsuite.log))" |
557570fa AW |
683 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "set-manager unix:test"], |
684 | [0], [dnl | |
685 | ${MATCH} | |
686 | ]) | |
687 | # no completion on other type, just return available types. | |
688 | # in real environment, bash will not complete on anything. | |
bb5dbe78 | 689 | MATCH="$(PREPARE_MATCH_NOSPACE(pssl: ptcp: punix: tcp: unix:))" |
557570fa AW |
690 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "set-manager ssl:something"], |
691 | [0], [dnl | |
692 | ${MATCH} | |
693 | ]) | |
694 | ||
695 | ||
696 | # | |
697 | # test: _ovs_vsctl_complete_new | |
698 | # | |
699 | # test 'add-br' | |
700 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "add-br "], | |
701 | [0], [dnl | |
702 | --- BEGIN MESSAGE | |
703 | Enter a new bridge: | |
704 | > ovs-vsctl add-br --- END MESSAGE | |
705 | ]) | |
706 | # user input does not change the output. | |
707 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "add-br new-br"], | |
708 | [0], [dnl | |
709 | --- BEGIN MESSAGE | |
710 | Enter a new bridge: | |
711 | > ovs-vsctl add-br new-br--- END MESSAGE | |
712 | ]) | |
713 | # after specifying the new bridge name, we should complete on parent bridge. | |
714 | TMP="$(ovs-vsctl list-br)" | |
715 | MATCH="$(PREPARE_MATCH_SPACE(${TMP}))" | |
716 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "add-br new-br "], | |
717 | [0], [dnl | |
718 | ${MATCH} | |
719 | ]) | |
720 | # test 'add-port' | |
721 | # after specifying the new port name, we should complete on the column part | |
722 | # of '*COLUMN?:KEY=VALUE'. | |
723 | TMP="$(ovsdb-client --no-heading list-columns Open_vSwitch Port | awk '/key.*value/ { print $1":"; next } { print $1; next }')" | |
724 | MATCH="$(PREPARE_MATCH_NOSPACE(${TMP} --))" | |
725 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "add-port br0 new-port "], | |
726 | [0], [dnl | |
727 | ${MATCH} | |
728 | ]) | |
729 | ||
730 | ||
731 | # | |
732 | # test: _ovs_vsctl_complete_dashdash | |
733 | # | |
734 | # after '--', there should be no global options available for completion. | |
735 | TMP="$(ovs-vsctl --commands | cut -d',' -f1-2 | tr -d ',[[]]' | tr -s ' ' '\n')" | |
736 | MATCH="$(PREPARE_MATCH_NOSPACE(${TMP}))" | |
737 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "init -- "], | |
738 | [0], [dnl | |
739 | ${MATCH} | |
740 | ]) | |
741 | TMP="$(ovs-vsctl --no-heading --columns=name,_uuid list Port | tr -d '\"')" | |
742 | MATCH="$(PREPARE_MATCH_SPACE(${TMP} newp1 newp2))" | |
743 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "add-port br0 newp1 -- add-port br1 newp2 -- set Port "], | |
744 | [0], [dnl | |
745 | ${MATCH} | |
746 | ]) | |
747 | ||
748 | OVS_VSWITCHD_STOP | |
749 | AT_CLEANUP | |
750 | ||
751 | ||
752 | AT_SETUP([vsctl-bashcomp - negative test]) | |
622aff96 YT |
753 | AT_SKIP_IF([test -z ${BASH_VERSION+x}]) |
754 | AT_SKIP_IF([eval 'test ${BASH_VERSINFO[[0]]} -lt 4']) | |
557570fa AW |
755 | OVS_VSWITCHD_START |
756 | ||
757 | # complete non-matching command. | |
758 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "invalid"], | |
759 | [0], [dnl | |
760 | ||
761 | ]) | |
762 | ||
763 | # complete after invalid command. | |
764 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "invalid argu"], | |
765 | [0], [dnl | |
766 | ||
767 | ]) | |
768 | ||
769 | # complete non-matching end argument. | |
770 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "set INVALID_"], | |
771 | [0], [dnl | |
772 | ||
773 | ]) | |
774 | ||
775 | # complete after invalid intermediate argument. | |
776 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "set INVALID_TBL "], | |
777 | [1], [dnl | |
778 | --- BEGIN MESSAGE | |
779 | Cannot complete 'INVALID_TBL' at index 3: | |
780 | > ovs-vsctl set INVALID_TBL --- END MESSAGE]) | |
781 | ||
782 | # complete ovs-vsctl --db=wrongdb [TAB] | |
783 | # should return 1 and show nothing. | |
784 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test "--db=wrongdb"], | |
785 | [1], []) | |
786 | ||
787 | OVS_VSWITCHD_STOP | |
788 | # delete ovsdb-server and try again. | |
789 | AT_CHECK_UNQUOTED([ovs-vsctl-bashcomp.bash test ""], | |
790 | [1], []) | |
791 | ||
622aff96 | 792 | AT_CLEANUP |