Add condition-targeting error query
[lttng-tools.git] / tests / regression / tools / trigger / test_list_triggers_cli
1 #!/bin/bash
2 #
3 # Copyright (C) - 2020 EfficiOS, inc
4 #
5 # This library is free software; you can redistribute it and/or modify it under
6 # the terms of the GNU Lesser General Public License as published by the Free
7 # Software Foundation; version 2.1 of the License.
8 #
9 # This library is distributed in the hope that it will be useful, but WITHOUT
10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12 # details.
13 #
14 # You should have received a copy of the GNU Lesser General Public License
15 # along with this library; if not, write to the Free Software Foundation, Inc.,
16 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
18 # Test the `lttng list-trigger` command line interface.
19
20 CURDIR="$(dirname "$0")"
21 TESTDIR="$CURDIR/../../.."
22
23 # shellcheck source=../../../utils/utils.sh
24 source "$TESTDIR/utils/utils.sh"
25
26 NUM_TESTS=106
27
28 FULL_LTTNG_BIN="${TESTDIR}/../src/bin/lttng/${LTTNG_BIN}"
29
30 tmp_stdout=$(mktemp --tmpdir -t test_list_triggers_cli_stdout.XXXXXX)
31 tmp_stderr=$(mktemp --tmpdir -t test_list_triggers_cli_stderr.XXXXXX)
32 tmp_expected_stdout=$(mktemp --tmpdir -t test_list_triggers_cli_expected_stdout.XXXXXX)
33 uprobe_elf_binary=$(realpath "${TESTDIR}/utils/testapp/userspace-probe-elf-binary/.libs/userspace-probe-elf-binary")
34 uprobe_sdt_binary=$(realpath "${TESTDIR}/utils/testapp/userspace-probe-sdt-binary/.libs/userspace-probe-sdt-binary")
35 register_some_triggers_bin=$(realpath "${CURDIR}/utils/register-some-triggers")
36
37 uid=$(id --user)
38 gid=$(id --group)
39
40 if [ "$uid" == "0" ]; then
41 ist_root=1
42 ls "$uprobe_sdt_binary" >/dev/null 2>&1
43 if test $? == 0; then
44 hast_sdt_binary=1
45 else
46 hast_sdt_binary=0
47 fi
48 else
49 ist_root=0
50 hast_sdt_binary=0
51 fi
52
53
54 test_top_level_options ()
55 {
56 diag "Listing top level options"
57
58 lttng_add_trigger_ok "hello" --condition event-rule-matches --type=user --name=test-name --action notify
59
60 cat > "${tmp_expected_stdout}" <<- EOF
61 - name: hello
62 owner uid: ${uid}
63 condition: event rule matches
64 rule: test-name (type: user tracepoint)
65 errors: none
66 actions:
67 notify
68 errors: none
69 errors: none
70 EOF
71
72 list_triggers_matches_ok "top level options" "${tmp_expected_stdout}"
73
74 lttng_remove_trigger_ok "hello"
75 }
76
77 test_event_rule_matches_tracepoint ()
78 {
79 diag "Listing event-rule-matches tracepoint"
80
81 lttng_add_trigger_ok "C" --condition event-rule-matches --type=user --action notify
82 lttng_add_trigger_ok "A" --condition event-rule-matches --name=aaa --type=user --filter 'p == 2' --action notify
83 lttng_add_trigger_ok "D" --condition event-rule-matches --name='hello*' --type=user -x hello2 --exclude-name hello3 -x hello4 --action notify
84 lttng_add_trigger_ok "B" --condition event-rule-matches --type=user --name=gerboise --log-level INFO.. --action notify
85 lttng_add_trigger_ok "E" --condition event-rule-matches --type=user --name=lemming --log-level WARNING --action notify
86 lttng_add_trigger_ok "J" --condition event-rule-matches --type=user --name=lemming --log-level .. --action notify
87 lttng_add_trigger_ok "F" --condition event-rule-matches --type=user --name=capture-payload-field --capture a --action notify
88 lttng_add_trigger_ok "G" --condition event-rule-matches --type=user --name=capture-array --capture 'a[2]' --capture '$ctx.tourlou[18]' --action notify
89 lttng_add_trigger_ok "H" --condition event-rule-matches --type=user --name=capture-chan-ctx --capture '$ctx.vpid' --action notify
90 lttng_add_trigger_ok "I" --condition event-rule-matches --type=user --name=capture-app-ctx --capture '$app.iga:active_clients' --action notify
91
92 cat > "${tmp_expected_stdout}" <<- EOF
93 - name: A
94 owner uid: ${uid}
95 condition: event rule matches
96 rule: aaa (type: user tracepoint, filter: p == 2)
97 errors: none
98 actions:
99 notify
100 errors: none
101 errors: none
102 - name: B
103 owner uid: ${uid}
104 condition: event rule matches
105 rule: gerboise (type: user tracepoint, log level at least INFO)
106 errors: none
107 actions:
108 notify
109 errors: none
110 errors: none
111 - name: C
112 owner uid: ${uid}
113 condition: event rule matches
114 rule: * (type: user tracepoint)
115 errors: none
116 actions:
117 notify
118 errors: none
119 errors: none
120 - name: D
121 owner uid: ${uid}
122 condition: event rule matches
123 rule: hello* (type: user tracepoint, exclusions: hello2,hello3,hello4)
124 errors: none
125 actions:
126 notify
127 errors: none
128 errors: none
129 - name: E
130 owner uid: ${uid}
131 condition: event rule matches
132 rule: lemming (type: user tracepoint, log level is WARNING)
133 errors: none
134 actions:
135 notify
136 errors: none
137 errors: none
138 - name: F
139 owner uid: ${uid}
140 condition: event rule matches
141 rule: capture-payload-field (type: user tracepoint)
142 captures:
143 - a
144 errors: none
145 actions:
146 notify
147 errors: none
148 errors: none
149 - name: G
150 owner uid: ${uid}
151 condition: event rule matches
152 rule: capture-array (type: user tracepoint)
153 captures:
154 - a[2]
155 - \$ctx.tourlou[18]
156 errors: none
157 actions:
158 notify
159 errors: none
160 errors: none
161 - name: H
162 owner uid: ${uid}
163 condition: event rule matches
164 rule: capture-chan-ctx (type: user tracepoint)
165 captures:
166 - \$ctx.vpid
167 errors: none
168 actions:
169 notify
170 errors: none
171 errors: none
172 - name: I
173 owner uid: ${uid}
174 condition: event rule matches
175 rule: capture-app-ctx (type: user tracepoint)
176 captures:
177 - \$app.iga:active_clients
178 errors: none
179 actions:
180 notify
181 errors: none
182 errors: none
183 - name: J
184 owner uid: ${uid}
185 condition: event rule matches
186 rule: lemming (type: user tracepoint)
187 errors: none
188 actions:
189 notify
190 errors: none
191 errors: none
192 EOF
193
194 list_triggers_matches_ok "event-rule-matches, tracepoint event rule" "${tmp_expected_stdout}"
195
196 lttng_remove_trigger_ok "A"
197 lttng_remove_trigger_ok "B"
198 lttng_remove_trigger_ok "C"
199 lttng_remove_trigger_ok "D"
200 lttng_remove_trigger_ok "E"
201 lttng_remove_trigger_ok "F"
202 lttng_remove_trigger_ok "G"
203 lttng_remove_trigger_ok "H"
204 lttng_remove_trigger_ok "I"
205 lttng_remove_trigger_ok "J"
206 }
207
208 test_event_rule_matches_probe ()
209 {
210 local channel_enable_addr
211 local channel_disable_addr
212
213 diag "Listing event-rule-matches kernel probe"
214
215 channel_enable_addr=$(grep ' t lttng_channel_enable\s\[lttng_tracer\]$' /proc/kallsyms | cut -f 1 -d ' ')
216 channel_disable_addr=$(grep ' t lttng_channel_disable\s\[lttng_tracer\]$' /proc/kallsyms | cut -f 1 -d ' ')
217
218 # We need to find a valid offset.
219 base_symbol=""
220 offset=0
221 if [[ 0x$channel_enable_addr -lt 0x$channel_disable_addr ]]; then
222 base_symbol="lttng_channel_enable"
223 offset=$(( 0x$channel_disable_addr - 0x$channel_enable_addr ))
224 else
225 base_symbol="lttng_channel_disable"
226 offset=$(( 0x$channel_enable_addr - 0x$channel_disable_addr ))
227 fi
228
229 offset_hex="0x$(printf '%x' $offset)"
230
231 lttng_add_trigger_ok "T0" --condition event-rule-matches --type=kprobe --location=lttng_channel_enable --event-name=my_channel_enable --action notify
232 lttng_add_trigger_ok "T1" --condition event-rule-matches --type=kprobe --location="${base_symbol}+${offset_hex}" --event-name=my_channel_enable --action notify
233 lttng_add_trigger_ok "T2" --condition event-rule-matches --type=kprobe --location="0x${channel_enable_addr}" --event-name=my_channel_enable --action notify
234
235 cat > "${tmp_expected_stdout}" <<- EOF
236 - name: T0
237 owner uid: ${uid}
238 condition: event rule matches
239 rule: my_channel_enable (type: kernel:kprobe, location: lttng_channel_enable)
240 errors: none
241 actions:
242 notify
243 errors: none
244 errors: none
245 - name: T1
246 owner uid: ${uid}
247 condition: event rule matches
248 rule: my_channel_enable (type: kernel:kprobe, location: ${base_symbol}+${offset_hex})
249 errors: none
250 actions:
251 notify
252 errors: none
253 errors: none
254 - name: T2
255 owner uid: ${uid}
256 condition: event rule matches
257 rule: my_channel_enable (type: kernel:kprobe, location: 0x${channel_enable_addr})
258 errors: none
259 actions:
260 notify
261 errors: none
262 errors: none
263 EOF
264
265 list_triggers_matches_ok "event-rule-matches, probe event rule" "${tmp_expected_stdout}"
266
267 lttng_remove_trigger_ok "T0"
268 lttng_remove_trigger_ok "T1"
269 lttng_remove_trigger_ok "T2"
270 }
271
272 test_event_rule_matches_userspace_probe_elf ()
273 {
274 local elf_function_name="test_function"
275
276 diag "Listing event-rule-matches userspace-probe elf"
277
278 lttng_add_trigger_ok "T0" --condition event-rule-matches --type=kernel:uprobe --location=${uprobe_elf_binary}:test_function --event-name=ma-probe-elf --action notify
279
280 cat > "${tmp_expected_stdout}" <<- EOF
281 - name: T0
282 owner uid: ${uid}
283 condition: event rule matches
284 rule: ma-probe-elf (type: kernel:uprobe, location type: ELF, location: ${uprobe_elf_binary}:${elf_function_name})
285 errors: none
286 actions:
287 notify
288 errors: none
289 errors: none
290 EOF
291
292 list_triggers_matches_ok "event-rule-matches, userspace-probe event rule" "${tmp_expected_stdout}"
293
294 lttng_remove_trigger_ok "T0"
295 }
296
297 test_event_rule_matches_userspace_probe_sdt ()
298 {
299 local sdt_provider_name="foobar"
300 local sdt_probe_name="tp1"
301
302 diag "Listing event-rule-matches userspace-probe sdt"
303
304 lttng_add_trigger_ok "T0" --condition event-rule-matches --type=kernel:uprobe --location=sdt:${uprobe_sdt_binary}:${sdt_provider_name}:${sdt_probe_name} --event-name=ma-probe-sdt --action notify
305
306 cat > "${tmp_expected_stdout}" <<- EOF
307 - name: T0
308 owner uid: 0
309 condition: event rule matches
310 rule: ma-probe-sdt (type: kernel:uprobe, location type: SDT, location: ${uprobe_sdt_binary}:${sdt_provider_name}:${sdt_probe_name})
311 errors: none
312 actions:
313 notify
314 errors: none
315 errors: none
316 EOF
317
318 list_triggers_matches_ok "event-rule-matches, userspace-probe event rule SDT" "${tmp_expected_stdout}"
319
320 lttng_remove_trigger_ok "T0"
321 }
322
323 test_event_rule_matches_syscall ()
324 {
325 diag "Listing event-rule-matches syscall"
326
327 lttng_add_trigger_ok "T0" --condition event-rule-matches --type=syscall --name=open --action notify
328 lttng_add_trigger_ok "T1" --condition event-rule-matches --type=syscall:entry --name=open --action notify
329 lttng_add_trigger_ok "T2" --condition event-rule-matches --type=syscall:exit --name=open --action notify
330 lttng_add_trigger_ok "T3" --condition event-rule-matches --type=syscall:entry+exit --name=open --action notify
331 lttng_add_trigger_ok "T4" --condition event-rule-matches --type=syscall --name=ptrace --filter 'a > 2' --action notify
332
333 cat > "${tmp_expected_stdout}" <<- EOF
334 - name: T0
335 owner uid: ${uid}
336 condition: event rule matches
337 rule: open (type: kernel:syscall:entry+exit)
338 errors: none
339 actions:
340 notify
341 errors: none
342 errors: none
343 - name: T1
344 owner uid: ${uid}
345 condition: event rule matches
346 rule: open (type: kernel:syscall:entry)
347 errors: none
348 actions:
349 notify
350 errors: none
351 errors: none
352 - name: T2
353 owner uid: ${uid}
354 condition: event rule matches
355 rule: open (type: kernel:syscall:exit)
356 errors: none
357 actions:
358 notify
359 errors: none
360 errors: none
361 - name: T3
362 owner uid: ${uid}
363 condition: event rule matches
364 rule: open (type: kernel:syscall:entry+exit)
365 errors: none
366 actions:
367 notify
368 errors: none
369 errors: none
370 - name: T4
371 owner uid: ${uid}
372 condition: event rule matches
373 rule: ptrace (type: kernel:syscall:entry+exit, filter: a > 2)
374 errors: none
375 actions:
376 notify
377 errors: none
378 errors: none
379 EOF
380
381 list_triggers_matches_ok "event-rule-matches, syscall event rule" "${tmp_expected_stdout}"
382
383 lttng_remove_trigger_ok "T0"
384 lttng_remove_trigger_ok "T1"
385 lttng_remove_trigger_ok "T2"
386 lttng_remove_trigger_ok "T3"
387 lttng_remove_trigger_ok "T4"
388 }
389
390 test_session_consumed_size_condition ()
391 {
392 ${register_some_triggers_bin} test_session_consumed_size_condition
393
394 cat > "${tmp_expected_stdout}" <<- EOF
395 - name: trigger-with-session-consumed-size-condition
396 owner uid: ${uid}
397 condition: session consumed size
398 session name: the-session-name
399 threshold: 1234 bytes
400 errors: none
401 actions:
402 notify
403 errors: none
404 errors: none
405 EOF
406
407 list_triggers_matches_ok "session consumed size condition" "${tmp_expected_stdout}"
408
409 lttng_remove_trigger_ok "trigger-with-session-consumed-size-condition"
410 }
411
412 test_buffer_usage_conditions ()
413 {
414 ${register_some_triggers_bin} test_buffer_usage_conditions
415
416 cat > "${tmp_expected_stdout}" <<- EOF
417 - name: trigger-with-buffer-usage-high-bytes-condition
418 owner uid: ${uid}
419 condition: buffer usage high
420 session name: the-session-name
421 channel name: the-channel-name
422 domain: ust
423 threshold (bytes): 1234
424 errors: none
425 actions:
426 notify
427 errors: none
428 errors: none
429 - name: trigger-with-buffer-usage-high-ratio-condition
430 owner uid: ${uid}
431 condition: buffer usage high
432 session name: the-session-name
433 channel name: the-channel-name
434 domain: ust
435 threshold (ratio): 0.25
436 errors: none
437 actions:
438 notify
439 errors: none
440 errors: none
441 - name: trigger-with-buffer-usage-low-bytes-condition
442 owner uid: ${uid}
443 condition: buffer usage low
444 session name: the-session-name
445 channel name: the-channel-name
446 domain: ust
447 threshold (bytes): 2345
448 errors: none
449 actions:
450 notify
451 errors: none
452 errors: none
453 - name: trigger-with-buffer-usage-low-ratio-condition
454 owner uid: ${uid}
455 condition: buffer usage low
456 session name: the-session-name
457 channel name: the-channel-name
458 domain: ust
459 threshold (ratio): 0.40
460 errors: none
461 actions:
462 notify
463 errors: none
464 errors: none
465 EOF
466
467 list_triggers_matches_ok "buffer usage condition" "${tmp_expected_stdout}"
468
469 lttng_remove_trigger_ok "trigger-with-buffer-usage-high-bytes-condition"
470 lttng_remove_trigger_ok "trigger-with-buffer-usage-high-ratio-condition"
471 lttng_remove_trigger_ok "trigger-with-buffer-usage-low-bytes-condition"
472 lttng_remove_trigger_ok "trigger-with-buffer-usage-low-ratio-condition"
473 }
474
475 test_session_rotation_conditions ()
476 {
477 ${register_some_triggers_bin} test_session_rotation_conditions
478
479 cat > "${tmp_expected_stdout}" <<- EOF
480 - name: trigger-with-session-rotation-completed-condition
481 owner uid: ${uid}
482 condition: session rotation completed
483 session name: the-session-name
484 errors: none
485 actions:
486 notify
487 errors: none
488 errors: none
489 - name: trigger-with-session-rotation-ongoing-condition
490 owner uid: ${uid}
491 condition: session rotation ongoing
492 session name: the-session-name
493 errors: none
494 actions:
495 notify
496 errors: none
497 errors: none
498 EOF
499
500 list_triggers_matches_ok "session rotation conditions" "${tmp_expected_stdout}"
501
502 lttng_remove_trigger_ok "trigger-with-session-rotation-completed-condition"
503 lttng_remove_trigger_ok "trigger-with-session-rotation-ongoing-condition"
504 }
505
506 test_snapshot_action ()
507 {
508 diag "Listing snapshot actions"
509
510 lttng_add_trigger_ok "T0" --condition event-rule-matches --type=user --name=some-event --action snapshot-session ze-session
511 lttng_add_trigger_ok "T1" --condition event-rule-matches --type=user --name=some-event --action snapshot-session ze-session --path /some/path
512 lttng_add_trigger_ok "T2" --condition event-rule-matches --type=user --name=some-event --action snapshot-session ze-session --url file:///some/other/path
513 lttng_add_trigger_ok "T3" --condition event-rule-matches --type=user --name=some-event --action snapshot-session ze-session --url net://1.2.3.4
514 lttng_add_trigger_ok "T4" --condition event-rule-matches --type=user --name=some-event --action snapshot-session ze-session --url net://1.2.3.4:1234:1235
515 lttng_add_trigger_ok "T5" --condition event-rule-matches --type=user --name=some-event --action snapshot-session ze-session --ctrl-url=tcp://1.2.3.4:1111 --data-url=tcp://1.2.3.4:1112
516 lttng_add_trigger_ok "T6" --condition event-rule-matches --type=user --name=some-event --action snapshot-session ze-session --path /some/path --max-size=1234
517 lttng_add_trigger_ok "T7" --condition event-rule-matches --type=user --name=some-event --action snapshot-session ze-session --path /some/path --name=meh
518 lttng_add_trigger_ok "T8" --condition event-rule-matches --type=user --name=some-event --action snapshot-session ze-session --rate-policy=every:10
519 lttng_add_trigger_ok "T9" --condition event-rule-matches --type=user --name=some-event --action snapshot-session ze-session --rate-policy=once-after:10
520
521 cat > "${tmp_expected_stdout}" <<- EOF
522 - name: T0
523 owner uid: ${uid}
524 condition: event rule matches
525 rule: some-event (type: user tracepoint)
526 errors: none
527 actions:
528 snapshot session \`ze-session\`
529 errors: none
530 errors: none
531 - name: T1
532 owner uid: ${uid}
533 condition: event rule matches
534 rule: some-event (type: user tracepoint)
535 errors: none
536 actions:
537 snapshot session \`ze-session\`, path: /some/path
538 errors: none
539 errors: none
540 - name: T2
541 owner uid: ${uid}
542 condition: event rule matches
543 rule: some-event (type: user tracepoint)
544 errors: none
545 actions:
546 snapshot session \`ze-session\`, path: /some/other/path
547 errors: none
548 errors: none
549 - name: T3
550 owner uid: ${uid}
551 condition: event rule matches
552 rule: some-event (type: user tracepoint)
553 errors: none
554 actions:
555 snapshot session \`ze-session\`, url: net://1.2.3.4
556 errors: none
557 errors: none
558 - name: T4
559 owner uid: ${uid}
560 condition: event rule matches
561 rule: some-event (type: user tracepoint)
562 errors: none
563 actions:
564 snapshot session \`ze-session\`, url: net://1.2.3.4:1234:1235
565 errors: none
566 errors: none
567 - name: T5
568 owner uid: ${uid}
569 condition: event rule matches
570 rule: some-event (type: user tracepoint)
571 errors: none
572 actions:
573 snapshot session \`ze-session\`, control url: tcp://1.2.3.4:1111, data url: tcp://1.2.3.4:1112
574 errors: none
575 errors: none
576 - name: T6
577 owner uid: ${uid}
578 condition: event rule matches
579 rule: some-event (type: user tracepoint)
580 errors: none
581 actions:
582 snapshot session \`ze-session\`, path: /some/path, max size: 1234
583 errors: none
584 errors: none
585 - name: T7
586 owner uid: ${uid}
587 condition: event rule matches
588 rule: some-event (type: user tracepoint)
589 errors: none
590 actions:
591 snapshot session \`ze-session\`, path: /some/path, name: meh
592 errors: none
593 errors: none
594 - name: T8
595 owner uid: ${uid}
596 condition: event rule matches
597 rule: some-event (type: user tracepoint)
598 errors: none
599 actions:
600 snapshot session \`ze-session\`, rate policy: every 10 occurrences
601 errors: none
602 errors: none
603 - name: T9
604 owner uid: ${uid}
605 condition: event rule matches
606 rule: some-event (type: user tracepoint)
607 errors: none
608 actions:
609 snapshot session \`ze-session\`, rate policy: once after 10 occurrences
610 errors: none
611 errors: none
612 EOF
613
614 list_triggers_matches_ok "snapshot action" "${tmp_expected_stdout}"
615
616 lttng_remove_trigger_ok "T0"
617 lttng_remove_trigger_ok "T1"
618 lttng_remove_trigger_ok "T2"
619 lttng_remove_trigger_ok "T3"
620 lttng_remove_trigger_ok "T4"
621 lttng_remove_trigger_ok "T5"
622 lttng_remove_trigger_ok "T6"
623 lttng_remove_trigger_ok "T7"
624 lttng_remove_trigger_ok "T8"
625 lttng_remove_trigger_ok "T9"
626 }
627
628 test_notify_action ()
629 {
630 lttng_add_trigger_ok "T0" --condition event-rule-matches --type=user --name=some-event --action notify --rate-policy=once-after:5
631 lttng_add_trigger_ok "T1" --condition event-rule-matches --type=user --name=some-event --action notify --rate-policy=every:10
632
633 cat > "${tmp_expected_stdout}" <<- EOF
634 - name: T0
635 owner uid: ${uid}
636 condition: event rule matches
637 rule: some-event (type: user tracepoint)
638 errors: none
639 actions:
640 notify, rate policy: once after 5 occurrences
641 errors: none
642 errors: none
643 - name: T1
644 owner uid: ${uid}
645 condition: event rule matches
646 rule: some-event (type: user tracepoint)
647 errors: none
648 actions:
649 notify, rate policy: every 10 occurrences
650 errors: none
651 errors: none
652 EOF
653
654 list_triggers_matches_ok "notify action" "${tmp_expected_stdout}"
655
656 lttng_remove_trigger_ok "T0"
657 lttng_remove_trigger_ok "T1"
658 }
659
660 plan_tests $NUM_TESTS
661
662 # shellcheck disable=SC2119
663 start_lttng_sessiond_notap
664
665 test_top_level_options
666 test_event_rule_matches_tracepoint
667 skip $ist_root "non-root user: skipping kprobe tests" 9 || test_event_rule_matches_probe
668 skip $ist_root "non-root user: skipping uprobe tests" 5 || test_event_rule_matches_userspace_probe_elf
669 skip $(($ist_root && $hast_sdt_binary)) "skipping userspace probe SDT tests" 5 || test_event_rule_matches_userspace_probe_sdt
670 skip $ist_root "non-root user: skipping syscall tests" 13 || test_event_rule_matches_syscall
671 test_session_consumed_size_condition
672 test_buffer_usage_conditions
673 test_session_rotation_conditions
674 test_snapshot_action
675 test_notify_action
676
677 stop_lttng_sessiond_notap
678
679 # Cleanup
680 rm -f "${tmp_stdout}"
681 rm -f "${tmp_stderr}"
682 rm -f "${tmp_expected_stdout}"
This page took 0.044182 seconds and 4 git commands to generate.