Bump to 1.14.1
[platform/upstream/augeas.git] / tests / run.tests
1 # Tests for aug_srun
2
3 # Blank lines and lines starting with '#' are ignored. This file is
4 # processed by test-run.c
5 #
6 # The syntax for a test specification is
7 #   test NAME RESULT ERRCODE
8 #   [use MODULE]
9 #     COMMANDS
10 #   prints
11 #     OUTPUT
12 #
13 # where
14 #   NAME     - the name printed to identify the test
15 #   RESULT   - an integer that is compared against the return code
16 #              of aug_srun
17 #   ERRCODE  - one of the error codes defined in enum errcode_t in augeas.h
18 #              without the AUG_ prefix, i.e. NOERROR, EMMATCH etc. If ERRCODE
19 #              is omitted, it defaults to NOERROR
20 #   MODULE   - the name of a module that should be loaded before the test
21 #   COMMANDS - the commands to hand to aug_srun; can be multiple lines,
22 #              which are passed as one string.
23 #   OUTPUT   - the string that aug_srun should print on the OUT file stream
24 #
25 # The prints keyword and OUTPUT are optional; if they are not provided, the
26 # output of aug_srun must be empty
27 #
28 # Leading spaces are stripped from COMMANDS and OUTPUT; a leading or trailing
29 # ':' is also stripped, but the rest of the line is used verbatim.
30 #
31 # A test passes when RESULT and ERRCODE agree with what aug_srun given
32 # COMMANDS produces, and OUTPUT coincides with what aug_srun prints on its
33 # OUT stream.
34 #
35 # The test is run against a tree initialized with AUG_NO_STDINC|AUG_NO_LOAD
36 # and file system root /dev/null. The Hosts module is loaded
37
38
39 #
40 # Various corner cases
41 #
42 test null 0
43
44 test empty 0
45   :
46
47 test quit -2
48   quit
49
50 test quit-2 -2
51   get /augeas
52   quit
53 prints
54   /augeas (none)
55
56 test two-commands 2
57   get /augeas/root
58   get /augeas/span
59 prints
60   /augeas/root = /dev/null/
61   /augeas/span = enable
62
63 test comment 1
64   :# Get /augeas
65   get /augeas
66 prints
67   /augeas (none)
68
69 test get_wspace 2
70   :  get /augeas        :
71   :  rm /augeas/root    :
72 prints
73   /augeas (none)
74   rm : /augeas/root 1
75
76 test get_wspace_between 1
77   :  get         /augeas
78 prints
79   /augeas (none)
80
81 test unknown-cmd -1 ECMDRUN
82   nocommand
83
84 test help 1
85   help
86 prints something
87
88 #
89 # ls tests
90 #
91 test ls-root 1
92   ls /
93 prints
94   augeas/ = (none)
95   files = (none)
96
97 test ls-bad-pathx -1 EPATHX
98   ls /files[]
99
100 #
101 # match tests
102 #
103 test match-root 1
104   match /
105 prints
106   /augeas = (none)
107   /files = (none)
108
109 test match-context 1
110   match .
111 prints
112   /files = (none)
113
114 test match-root-star 1
115   match /*
116 prints
117   /augeas = (none)
118   /files = (none)
119
120 test match-bad-pathx -1 EPATHX
121   match /files[]
122
123 test match-nothing 1
124   match /not-there
125 prints
126   :  (no matches)
127
128 #
129 # test rm
130 #
131 test rm-save-modes 1
132   rm /augeas/version/save
133 prints
134   rm : /augeas/version/save 5
135
136 test rm-bad-pathx -1 EPATHX
137   rm /files[]
138
139 #
140 # test mv
141 #
142 test mv 1
143   mv /augeas/version /files
144
145 test mv-not-there -1 ENOMATCH
146   mv /not-there /files
147
148 test mv-to-not-there 1
149   mv /files /new-node
150
151 test mv-into-descendant -1 EMVDESC
152   mv /augeas /augeas/version
153
154 test mv-into-self -1 EMVDESC
155   mv /augeas /augeas
156
157 test mv-into-multiple -1 EMMATCH
158   mv /files /augeas/version/save/*
159
160 test mv-multiple -1 EMMATCH
161   mv /augeas/version/save/* /files
162
163 test mv-tree1 3
164   set /a/b/c value
165   mv /a/b/c /x
166   print /*[ label() != 'augeas' and label() != 'files']
167 prints
168   /a
169   /a/b
170   /x = "value"
171
172 test mv-tree2 3
173   set /a/b/c value
174   mv /a/b/c /a/x
175   print /*[ label() != 'augeas' and label() != 'files']
176 prints
177   /a
178   /a/b
179   /a/x = "value"
180
181 test mv-tree3 3
182   set /a/b/c value
183   mv /a/b/c /x/y
184   print /*[ label() != 'augeas' and label() != 'files']
185 prints
186   /a
187   /a/b
188   /x
189   /x/y = "value"
190
191 test mv-tree4 -1 EMVDESC
192   set /a/b/c value
193   mv /a/b/c /a/b/c/d
194   print /*[ label() != 'augeas' and label() != 'files']
195
196 test mv-tree5 3
197   set /a/b/c value
198   mv /a/b/c /a/b/d
199   print /*[ label() != 'augeas' and label() != 'files']
200 prints
201   /a
202   /a/b
203   /a/b/d = "value"
204
205 test mv-tree6 3
206   set /a/b/c value
207   mv /a /x/y
208   print /*[ label() != 'augeas' and label() != 'files']
209 prints
210   /x
211   /x/y
212   /x/y/b
213   /x/y/b/c = "value"
214
215 #
216 # test rename
217 #
218 test rename 1
219   rename /augeas/version version2
220 prints
221   rename : /augeas/version to version2 1
222
223 test rename-into-self 1
224   rename /augeas augeas
225 prints
226   rename : /augeas to augeas 1
227
228 test rename-tree1 3
229   set /a/b/c value
230   rename /a/b/c x
231   print /*[ label() != 'augeas' and label() != 'files']
232 prints
233   rename : /a/b/c to x 1
234   /a
235   /a/b
236   /a/b/x = "value"
237
238 test rename-tree2 4
239   set /a/b/c value
240   set /a/b/d value2
241   rename /a/b/c x
242   print /*[ label() != 'augeas' and label() != 'files']
243 prints
244   rename : /a/b/c to x 1
245   /a
246   /a/b
247   /a/b/x = "value"
248   /a/b/d = "value2"
249
250 test rename-multiple 4
251   set /a/b/d value
252   set /a/c/d value2
253   rename //d x
254   print /*[ label() != 'augeas' and label() != 'files']
255 prints
256   rename : //d to x 2
257   /a
258   /a/b
259   /a/b/x = "value"
260   /a/c
261   /a/c/x = "value2"
262
263 test rename-slash -1 ELABEL
264   set /a/b/c value
265   rename /a/b/c va/lue
266
267 #
268 # test set
269 #
270 test set-not-there 2
271   set /foo value
272   get /foo
273 prints
274   /foo = value
275
276 test set-existing 2
277   set /files value
278   get /files
279 prints
280   /files = value
281
282 test set-trailing-slash 2
283   set /files/ value
284   get /files
285 prints
286   /files = value
287
288 test set-bad-pathx -1 EPATHX
289   set /files[] 1
290
291 test set-multiple -1 EMMATCH
292   set /augeas/version/save/mode value
293
294 test set-args 2
295   set /files
296   get /files
297 prints
298   /files (none)
299
300 test set-union-not-there -1 EMMATCH
301   set (/files/left|/files/right) 1
302
303 test set-union-existing -1 EMMATCH
304   set /files/left value1
305   set /files/right value2
306   set (/files/left|/files/right) 1
307
308 test set-else-not-there 2
309   set '(/files/not-there else /files/not-there-yet)' value
310   get /files/not-there-yet
311 prints
312   /files/not-there-yet = value
313
314 test set-else-existing 3
315   set /files/existing value
316   set '(/files/existing else /files/not-there)' new_value
317   get /files/existing
318 prints
319   /files/existing = new_value
320
321 test set-else-update 3
322   set /files/existing value
323   set '(/files/not-there else /files/existing)' value3
324   get /files/existing
325 prints
326   /files/existing = value3
327
328
329 #
330 # test clear
331 #
332 test clear-not-there 2
333   clear /foo
334   get /foo
335 prints
336   /foo (none)
337
338 test clear-existing 2
339   clear /files
340   get /files
341 prints
342   /files (none)
343
344 test clear-bad-pathx -1 EPATHX
345   clear /files[]
346
347 test clear-multiple -1 EMMATCH
348   clear /augeas/version/save/mode
349
350 test clear-args -1 ECMDRUN
351   clear /files value
352
353 #
354 # test get
355 #
356 test get-save-mode 1
357   get /augeas/version/save/mode[1]
358 prints
359  /augeas/version/save/mode[1] = backup
360
361 test get-too-many -1 EMMATCH
362   get /augeas/*
363
364 test get-not-there 1
365   get /not-there
366 prints
367   /not-there (o)
368
369 test get-bad-pathx -1 EPATHX
370   get /files[]
371
372 #
373 # test transform
374 #
375 test transform-1 3
376   transform Test incl /tmp/bar
377   get /augeas/load/Test/lens
378   get /augeas/load/Test/incl
379 prints
380   /augeas/load/Test/lens = Test.lns
381   /augeas/load/Test/incl = /tmp/bar
382
383 test transform-2 4
384   transform Bar incl /tmp/foo/*
385   transform Bar incl /tmp/bar/*
386   transform Bar excl /tmp/foo/baz
387   print /augeas/load/Bar
388 prints
389   /augeas/load/Bar
390   /augeas/load/Bar/lens = "Bar.lns"
391   /augeas/load/Bar/incl[1] = "/tmp/foo/*"
392   /augeas/load/Bar/incl[2] = "/tmp/bar/*"
393   /augeas/load/Bar/excl = "/tmp/foo/baz"
394
395 test transform-3 2
396   transform Bar.lns incl /tmp/foo/*
397   print /augeas/load/Bar
398 prints
399   /augeas/load/Bar
400   /augeas/load/Bar/lens = "Bar.lns"
401   /augeas/load/Bar/incl = "/tmp/foo/*"
402
403 #
404 # test print
405 #
406 test print-save 1
407   print /augeas/version/save
408 prints
409   /augeas/version/save
410   /augeas/version/save/mode[1] = "backup"
411   /augeas/version/save/mode[2] = "newfile"
412   /augeas/version/save/mode[3] = "noop"
413   /augeas/version/save/mode[4] = "overwrite"
414
415 test print-root 1
416   print /
417
418 #
419 # test set/get parsing with quoting, whitespace and escaping
420 #
421 test set-single-quotes 2
422   set /files 'a test value'
423   get /files
424 prints
425   /files = a test value
426
427 test set-double-quotes 2
428   set /files "a test value"
429   get /files
430 prints
431   /files = a test value
432
433 test set-mixed-quotes1 2
434   set /files "a 'mixed quotes' test"
435   get /files
436 prints
437   /files = a 'mixed quotes' test
438
439 test set-mixed-quotes2 2
440   set /files 'a "mixed quotes" test'
441   get /files
442 prints
443   /files = a "mixed quotes" test
444
445 test set-mixed-quotes-expr 2
446   clear /foo
447   print "/*[ label() != 'augeas' and label() != 'files']"
448 prints
449   /foo
450
451 test set-quote-concat 2
452   set "/fi"les test
453   get "/fi"les
454 prints
455   /files = test
456
457 test set-escaped-quotes 2
458   set /files "''\"''"
459   get /files
460 prints
461   /files = ''"''
462
463 test set-escaped-path 2
464   set /white\ space\    tab value
465   get /white\ space\    tab
466 prints
467   /white space  tab = value
468
469 test set-escaped-path-bracket 2
470   set /white\ space/\[section value
471   print /white\ space/\[section
472 prints
473   /white\ space/\[section = "value"
474
475 test set-squote-escaped-bracket 2
476   set '/augeas/\[section' value
477   print '/augeas/\[section'
478 prints
479   /augeas/\[section = "value"
480
481 test set-squote-escaped-path 2
482   set '/white\ space' value
483   get '/white\ space'
484 prints
485   /white\ space = value
486
487 test set-dquote-escaped-path 2
488   set "/white\ space" value
489   get "/white\ space"
490 prints
491   /white\ space = value
492
493 test set-tabnline 2
494   set /files newl\ntab\tend
495   get /files
496 prints
497   /files = newl
498 tab     end
499
500 test set-tabnline-squote 2
501   set /files 'newl\ntab\tend'
502   get /files
503 prints
504   /files = newl
505 tab     end
506
507 test set-tabnline-dquote 2
508   set /files "newl\ntab\tend"
509   get /files
510 prints
511   /files = newl
512 tab     end
513
514 # Combinations of quotes in values, some unmatched
515 # Tests from David Schmitt (Puppet bug #12199)
516 test quot_sq -1 ECMDRUN
517   set /test '
518
519 test quot_sq_sq -1 ECMDRUN
520   set /test '''
521
522 test quot_sq_dq 2
523   set /test "'"
524   get /test
525 prints
526   /test = '
527
528 test quot_sqsq 2
529   set /test ''
530   get /test
531 prints
532   /test = :
533
534 test quot_sqsq_sq 2
535   set /test ''''
536   get /test
537 prints
538   /test = :
539
540 test quot_sqsq_dq 2
541   set /test "''"
542   get /test
543 prints
544   /test = ''
545
546 test quot_sqsqsq -1 ECMDRUN
547   set /test '''
548
549 test quot_sqsqsq_sq -1 ECMDRUN
550   set /test '''''
551
552 test quot_sqsqsq_dq 2
553   set /test "'''"
554   get /test
555 prints
556   /test = '''
557
558 test quot_sqsqsqsq 2
559   set /test ''''
560   get /test
561 prints
562   /test = :
563
564 test quot_sqsqsqsq_sq 2
565   set /test ''''''
566   get /test
567 prints
568   /test = :
569
570 test quot_sqsqsqsq_dq 2
571   set /test "''''"
572   get /test
573 prints
574   /test = ''''
575
576 test quot_dq -1 ECMDRUN
577   set /test "
578
579 test quot_dq_sq 2
580   set /test '"'
581   get /test
582 prints
583   /test = "
584
585 test quot_dq_dq -1 ECMDRUN
586   set /test """
587
588 test quot_dqdq 2
589   set /test ""
590   get /test
591 prints
592   /test = :
593
594 test quot_dqdq_sq 2
595   set /test '""'
596   get /test
597 prints
598   /test = ""
599
600 test quot_dqdq_dq 2
601   set /test """"
602   get /test
603 prints
604   /test = :
605
606 test quot_dqdqdq -1 ECMDRUN
607   set /test """
608
609 test quot_dqdqdq_sq 2
610   set /test '"""'
611   get /test
612 prints
613   /test = """
614
615 test quot_dqdqdq_dq -1 ECMDRUN
616   set /test """""
617
618 test quot_dqdqdqdq 2
619   set /test """"
620   get /test
621 prints
622   /test = :
623
624 test quot_dqdqdqdq_sq 2
625   set /test '""""'
626   get /test
627 prints
628   /test = """"
629
630 test quot_dqdqdqdq_dq 2
631   set /test """"""
632   get /test
633 prints
634   /test = :
635
636 test quot_truncated_dq 2
637   set /test "s"bc"d"ef
638   get /test
639 prints
640   /test = sbcdef
641
642 test quot_truncated_dq_sq 2
643   set /test '"s"bc"d"ef'
644   get /test
645 prints
646   /test = "s"bc"d"ef
647
648 test quot_truncated_dq_dq 2
649   set /test ""s"bc"d"ef"
650   get /test
651 prints
652   /test = sbcdef
653
654 test quot_truncated_sq 2
655   set /test 's'bc'd'ef
656   get /test
657 prints
658   /test = sbcdef
659
660 test quot_truncated_sq_sq 2
661   set /test ''s'bc'd'ef'
662   get /test
663 prints
664   /test = sbcdef
665
666 test quot_truncated_sq_dq 2
667   set /test "'s'bc'd'ef"
668   get /test
669 prints
670   /test = 's'bc'd'ef
671
672 test quot_truncated_dq_mix 2
673   set /test "s"bc'd'ef
674   get /test
675 prints
676   /test = sbcdef
677
678 test quot_truncated_dq_mix_sq 2
679   set /test '"s"bc'd'ef'
680   get /test
681 prints
682   /test = "s"bcdef
683
684 test quot_truncated_dq_mix_dq 2
685   set /test ""s"bc'd'ef"
686   get /test
687 prints
688   /test = sbc'd'ef
689
690 test quot_truncated_sq_mix 2
691   set /test 's'bc"d"ef
692   get /test
693 prints
694   /test = sbcdef
695
696 test quot_truncated_sq_mix_sq 2
697   set /test ''s'bc"d"ef'
698   get /test
699 prints
700   /test = sbc"d"ef
701
702 test quot_truncated_sq_mix_dq 2
703   set /test "'s'bc"d"ef"
704   get /test
705 prints
706   /test = 's'bcdef
707
708 test quot_truncated_space -1 ECMDRUN
709   set /test before after
710
711 test quot_truncated_space_sq 2
712   set /test 'before after'
713   get /test
714 prints
715   /test = before after
716
717 test quot_truncated_space_dq 2
718   set /test "before after"
719   get /test
720 prints
721   /test = before after
722
723 test quot_mix -1 ECMDRUN
724   set /test a"b'c"d'e
725
726 test quot_mix_sq -1 ECMDRUN
727   set /test 'a"b'c"d'e'
728
729 test quot_mix_dq -1 ECMDRUN
730   set /test "a"b'c"d'e"
731
732 #
733 # Tests for aug_text_store
734 #
735 test store_hosts 3
736  use Hosts
737   set /text/in/t1 "192.168.0.1 rtr.example.com foo\n"
738   store Hosts.lns /text/in/t1 /text/tree/t1
739   print /text/tree/t1
740 prints
741   /text/tree/t1
742   /text/tree/t1/1
743   /text/tree/t1/1/ipaddr = "192.168.0.1"
744   /text/tree/t1/1/canonical = "rtr.example.com"
745   /text/tree/t1/1/alias = "foo"
746
747 test store_nolens -1 ENOLENS
748   set /text/in/t1 "192.168.0.1 rtr.example.com foo\n"
749   store Nomodule.lns /text/in/t1 /text/tree/t1
750
751 test store_epathx_node -1 EPATHX
752  use Hosts
753   store Hosts.lns [garbage] /text/tree/t1
754
755 test store_epathx_path -1 EPATHX
756  use Hosts
757   store Hosts.lns /text/in/t1 [garbage]
758
759 test store_null_text -1 ENOMATCH
760  use Hosts
761   store Hosts.lns /text/in/t1 /text/tree/t1
762
763 test store_esyntax 3
764  use Hosts
765   set /text/in/t1 "not a hosts file entry"
766   store Hosts.lns /text/in/t1 /text/tree/t1
767   match /augeas/text/text/tree/t1/error
768 prints
769   /augeas/text/text/tree/t1/error = parse_failed
770
771 # Bug #283; /text is actually NULL
772 test store_null -1 ENOMATCH
773  use Hosts
774   set /text/1 "192.168.0.1 toto\n"
775   store Hosts.lns /text /hosts
776
777 #
778 # Tests for aug_text_retrieve
779 #
780 test retrieve_hosts 5
781  use Hosts
782   set /text/in/t1 "192.168.0.1 rtr.example.com foo\n"
783   store Hosts.lns /text/in/t1 /text/tree/t1
784   set /text/tree/t1/1/alias[1] bar
785   retrieve Hosts.lns /text/in/t1 /text/tree/t1 /text/out/t1
786   print /text/out/t1
787 prints
788   /text/out/t1 = "192.168.0.1 rtr.example.com bar\n"
789
790 test retrieve_nolens -1 ENOLENS
791   set /text/in/t1 "192.168.0.1 rtr.example.com foo\n"
792   store Hosts.lns /text/in/t1 /text/tree/t1
793   retrieve Nomodule.lns /text/in/t1 /text/tree/t1 /text/out/t1
794
795 test retrieve_epathx_node_in -1 EPATHX
796  use Hosts
797   retrieve Hosts.lns [garbage] /text/tree/t1 /text/out/t1
798
799 test retrieve_epathx_path -1 EPATHX
800  use Hosts
801   retrieve Hosts.lns /text/in/t1 [garbage] /text/out/t1
802
803 test retrieve_epathx_node_out -1 EPATHX
804  use Hosts
805   set /text/in/t1 "192.168.0.1 rtr.example.com foo\n"
806   retrieve Hosts.lns /text/in/t1 /text/tree/t1 [garbage]
807
808 test retrieve_no_node_in -1 ENOMATCH
809  use Hosts
810   retrieve Hosts.lns /text/in/t1 /text/tree/t1 /text/out/t1
811
812 test retrieve_no_tree 3
813  use Hosts
814   set /text/in/t1 "192.168.0.1 rtr.example.com foo\n"
815   retrieve Hosts.lns /text/in/t1 /text/tree/t1 /text/out/t1
816   print /text/out/t1
817 prints
818   /text/out/t1 = ""
819
820 test retrieve_esyntax 5
821  use Hosts
822   set /text/in/t1 "192.168.0.1 rtr.example.com foo\n"
823   store Hosts.lns /text/in/t1 /text/tree/t1
824   set /text/in/t1 "not a hosts file entry"
825   retrieve Hosts.lns /text/in/t1 /text/tree/t1 /text/out/t1
826   match /augeas//error
827 prints
828   /augeas/text/text/tree/t1/error = parse_skel_failed
829
830 # Bug #283; /text is actually NULL
831 test retrieve_null -1 ENOMATCH
832  use Hosts
833   set /text/1 "192.168.0.1 toto\n"
834   retrieve Hosts.lns /text /hosts /out
835
836 # Change 'var=val' to 'variable=value' and check that the span gets updated
837 test span_updates_lv 9
838   set /in "var=val\n"
839   store Cron.lns /in /cron
840   span /cron/var
841   span /cron
842   mv /cron/var /cron/variable
843   set /cron/variable value
844   retrieve Cron.lns /in /cron /out
845   span /cron/variable
846   span /cron
847 prints
848   /cron label=(0:3) value=(4:7) span=(0,8)
849   /cron label=(0:0) value=(0:0) span=(0,8)
850   /cron label=(0:8) value=(9:14) span=(0,15)
851   /cron label=(0:0) value=(0:0) span=(0,15)
852
853 # Make a change and check that the parents' span gets updated
854 test span_updates_parent 8
855   set /in "10.0.0.1 gw.example.com\n"
856   store Hosts.lns /in /host
857   span /host/1
858   span /host
859   set /host/1/canonical gateway.example.com
860   retrieve Hosts.lns /in /host /out
861   span /host/1
862   span /host
863 prints
864   /host label=(0:0) value=(0:0) span=(0,24)
865   /host label=(0:0) value=(0:0) span=(0,24)
866   /host label=(0:0) value=(0:0) span=(0,29)
867   /host label=(0:0) value=(0:0) span=(0,29)
868
869 # Check that creating nodes sets spans
870 test span_updates_on_create 5
871   set /in ""
872   set /cron/var val
873   retrieve Cron.lns /in /cron /out
874   span /cron/var
875   span /cron
876 prints
877   /cron label=(0:3) value=(4:7) span=(0,8)
878   /cron label=(0:0) value=(0:0) span=(0,8)