Imported Upstream version 1.11.0
[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 clear
301 #
302 test clear-not-there 2
303   clear /foo
304   get /foo
305 prints
306   /foo (none)
307
308 test clear-existing 2
309   clear /files
310   get /files
311 prints
312   /files (none)
313
314 test clear-bad-pathx -1 EPATHX
315   clear /files[]
316
317 test clear-multiple -1 EMMATCH
318   clear /augeas/version/save/mode
319
320 test clear-args -1 ECMDRUN
321   clear /files value
322
323 #
324 # test get
325 #
326 test get-save-mode 1
327   get /augeas/version/save/mode[1]
328 prints
329  /augeas/version/save/mode[1] = backup
330
331 test get-too-many -1 EMMATCH
332   get /augeas/*
333
334 test get-not-there 1
335   get /not-there
336 prints
337   /not-there (o)
338
339 test get-bad-pathx -1 EPATHX
340   get /files[]
341
342 #
343 # test transform
344 #
345 test transform-1 3
346   transform Test incl /tmp/bar
347   get /augeas/load/Test/lens
348   get /augeas/load/Test/incl
349 prints
350   /augeas/load/Test/lens = Test.lns
351   /augeas/load/Test/incl = /tmp/bar
352
353 test transform-2 4
354   transform Bar incl /tmp/foo/*
355   transform Bar incl /tmp/bar/*
356   transform Bar excl /tmp/foo/baz
357   print /augeas/load/Bar
358 prints
359   /augeas/load/Bar
360   /augeas/load/Bar/lens = "Bar.lns"
361   /augeas/load/Bar/incl[1] = "/tmp/foo/*"
362   /augeas/load/Bar/incl[2] = "/tmp/bar/*"
363   /augeas/load/Bar/excl = "/tmp/foo/baz"
364
365 test transform-3 2
366   transform Bar.lns incl /tmp/foo/*
367   print /augeas/load/Bar
368 prints
369   /augeas/load/Bar
370   /augeas/load/Bar/lens = "Bar.lns"
371   /augeas/load/Bar/incl = "/tmp/foo/*"
372
373 #
374 # test print
375 #
376 test print-save 1
377   print /augeas/version/save
378 prints
379   /augeas/version/save
380   /augeas/version/save/mode[1] = "backup"
381   /augeas/version/save/mode[2] = "newfile"
382   /augeas/version/save/mode[3] = "noop"
383   /augeas/version/save/mode[4] = "overwrite"
384
385 test print-root 1
386   print /
387
388 #
389 # test set/get parsing with quoting, whitespace and escaping
390 #
391 test set-single-quotes 2
392   set /files 'a test value'
393   get /files
394 prints
395   /files = a test value
396
397 test set-double-quotes 2
398   set /files "a test value"
399   get /files
400 prints
401   /files = a test value
402
403 test set-mixed-quotes1 2
404   set /files "a 'mixed quotes' test"
405   get /files
406 prints
407   /files = a 'mixed quotes' test
408
409 test set-mixed-quotes2 2
410   set /files 'a "mixed quotes" test'
411   get /files
412 prints
413   /files = a "mixed quotes" test
414
415 test set-mixed-quotes-expr 2
416   clear /foo
417   print "/*[ label() != 'augeas' and label() != 'files']"
418 prints
419   /foo
420
421 test set-quote-concat 2
422   set "/fi"les test
423   get "/fi"les
424 prints
425   /files = test
426
427 test set-escaped-quotes 2
428   set /files "''\"''"
429   get /files
430 prints
431   /files = ''"''
432
433 test set-escaped-path 2
434   set /white\ space\    tab value
435   get /white\ space\    tab
436 prints
437   /white space  tab = value
438
439 test set-escaped-path-bracket 2
440   set /white\ space/\[section value
441   print /white\ space/\[section
442 prints
443   /white\ space/\[section = "value"
444
445 test set-squote-escaped-bracket 2
446   set '/augeas/\[section' value
447   print '/augeas/\[section'
448 prints
449   /augeas/\[section = "value"
450
451 test set-squote-escaped-path 2
452   set '/white\ space' value
453   get '/white\ space'
454 prints
455   /white\ space = value
456
457 test set-dquote-escaped-path 2
458   set "/white\ space" value
459   get "/white\ space"
460 prints
461   /white\ space = value
462
463 test set-tabnline 2
464   set /files newl\ntab\tend
465   get /files
466 prints
467   /files = newl
468 tab     end
469
470 test set-tabnline-squote 2
471   set /files 'newl\ntab\tend'
472   get /files
473 prints
474   /files = newl
475 tab     end
476
477 test set-tabnline-dquote 2
478   set /files "newl\ntab\tend"
479   get /files
480 prints
481   /files = newl
482 tab     end
483
484 # Combinations of quotes in values, some unmatched
485 # Tests from David Schmitt (Puppet bug #12199)
486 test quot_sq -1 ECMDRUN
487   set /test '
488
489 test quot_sq_sq -1 ECMDRUN
490   set /test '''
491
492 test quot_sq_dq 2
493   set /test "'"
494   get /test
495 prints
496   /test = '
497
498 test quot_sqsq 2
499   set /test ''
500   get /test
501 prints
502   /test = :
503
504 test quot_sqsq_sq 2
505   set /test ''''
506   get /test
507 prints
508   /test = :
509
510 test quot_sqsq_dq 2
511   set /test "''"
512   get /test
513 prints
514   /test = ''
515
516 test quot_sqsqsq -1 ECMDRUN
517   set /test '''
518
519 test quot_sqsqsq_sq -1 ECMDRUN
520   set /test '''''
521
522 test quot_sqsqsq_dq 2
523   set /test "'''"
524   get /test
525 prints
526   /test = '''
527
528 test quot_sqsqsqsq 2
529   set /test ''''
530   get /test
531 prints
532   /test = :
533
534 test quot_sqsqsqsq_sq 2
535   set /test ''''''
536   get /test
537 prints
538   /test = :
539
540 test quot_sqsqsqsq_dq 2
541   set /test "''''"
542   get /test
543 prints
544   /test = ''''
545
546 test quot_dq -1 ECMDRUN
547   set /test "
548
549 test quot_dq_sq 2
550   set /test '"'
551   get /test
552 prints
553   /test = "
554
555 test quot_dq_dq -1 ECMDRUN
556   set /test """
557
558 test quot_dqdq 2
559   set /test ""
560   get /test
561 prints
562   /test = :
563
564 test quot_dqdq_sq 2
565   set /test '""'
566   get /test
567 prints
568   /test = ""
569
570 test quot_dqdq_dq 2
571   set /test """"
572   get /test
573 prints
574   /test = :
575
576 test quot_dqdqdq -1 ECMDRUN
577   set /test """
578
579 test quot_dqdqdq_sq 2
580   set /test '"""'
581   get /test
582 prints
583   /test = """
584
585 test quot_dqdqdq_dq -1 ECMDRUN
586   set /test """""
587
588 test quot_dqdqdqdq 2
589   set /test """"
590   get /test
591 prints
592   /test = :
593
594 test quot_dqdqdqdq_sq 2
595   set /test '""""'
596   get /test
597 prints
598   /test = """"
599
600 test quot_dqdqdqdq_dq 2
601   set /test """"""
602   get /test
603 prints
604   /test = :
605
606 test quot_truncated_dq 2
607   set /test "s"bc"d"ef
608   get /test
609 prints
610   /test = sbcdef
611
612 test quot_truncated_dq_sq 2
613   set /test '"s"bc"d"ef'
614   get /test
615 prints
616   /test = "s"bc"d"ef
617
618 test quot_truncated_dq_dq 2
619   set /test ""s"bc"d"ef"
620   get /test
621 prints
622   /test = sbcdef
623
624 test quot_truncated_sq 2
625   set /test 's'bc'd'ef
626   get /test
627 prints
628   /test = sbcdef
629
630 test quot_truncated_sq_sq 2
631   set /test ''s'bc'd'ef'
632   get /test
633 prints
634   /test = sbcdef
635
636 test quot_truncated_sq_dq 2
637   set /test "'s'bc'd'ef"
638   get /test
639 prints
640   /test = 's'bc'd'ef
641
642 test quot_truncated_dq_mix 2
643   set /test "s"bc'd'ef
644   get /test
645 prints
646   /test = sbcdef
647
648 test quot_truncated_dq_mix_sq 2
649   set /test '"s"bc'd'ef'
650   get /test
651 prints
652   /test = "s"bcdef
653
654 test quot_truncated_dq_mix_dq 2
655   set /test ""s"bc'd'ef"
656   get /test
657 prints
658   /test = sbc'd'ef
659
660 test quot_truncated_sq_mix 2
661   set /test 's'bc"d"ef
662   get /test
663 prints
664   /test = sbcdef
665
666 test quot_truncated_sq_mix_sq 2
667   set /test ''s'bc"d"ef'
668   get /test
669 prints
670   /test = sbc"d"ef
671
672 test quot_truncated_sq_mix_dq 2
673   set /test "'s'bc"d"ef"
674   get /test
675 prints
676   /test = 's'bcdef
677
678 test quot_truncated_space -1 ECMDRUN
679   set /test before after
680
681 test quot_truncated_space_sq 2
682   set /test 'before after'
683   get /test
684 prints
685   /test = before after
686
687 test quot_truncated_space_dq 2
688   set /test "before after"
689   get /test
690 prints
691   /test = before after
692
693 test quot_mix -1 ECMDRUN
694   set /test a"b'c"d'e
695
696 test quot_mix_sq -1 ECMDRUN
697   set /test 'a"b'c"d'e'
698
699 test quot_mix_dq -1 ECMDRUN
700   set /test "a"b'c"d'e"
701
702 #
703 # Tests for aug_text_store
704 #
705 test store_hosts 3
706  use Hosts
707   set /text/in/t1 "192.168.0.1 rtr.example.com foo\n"
708   store Hosts.lns /text/in/t1 /text/tree/t1
709   print /text/tree/t1
710 prints
711   /text/tree/t1
712   /text/tree/t1/1
713   /text/tree/t1/1/ipaddr = "192.168.0.1"
714   /text/tree/t1/1/canonical = "rtr.example.com"
715   /text/tree/t1/1/alias = "foo"
716
717 test store_nolens -1 ENOLENS
718   set /text/in/t1 "192.168.0.1 rtr.example.com foo\n"
719   store Nomodule.lns /text/in/t1 /text/tree/t1
720
721 test store_epathx_node -1 EPATHX
722  use Hosts
723   store Hosts.lns [garbage] /text/tree/t1
724
725 test store_epathx_path -1 EPATHX
726  use Hosts
727   store Hosts.lns /text/in/t1 [garbage]
728
729 test store_null_text -1 ENOMATCH
730  use Hosts
731   store Hosts.lns /text/in/t1 /text/tree/t1
732
733 test store_esyntax 3
734  use Hosts
735   set /text/in/t1 "not a hosts file entry"
736   store Hosts.lns /text/in/t1 /text/tree/t1
737   match /augeas/text/text/tree/t1/error
738 prints
739   /augeas/text/text/tree/t1/error = parse_failed
740
741 # Bug #283; /text is actually NULL
742 test store_null -1 ENOMATCH
743  use Hosts
744   set /text/1 "192.168.0.1 toto\n"
745   store Hosts.lns /text /hosts
746
747 #
748 # Tests for aug_text_retrieve
749 #
750 test retrieve_hosts 5
751  use Hosts
752   set /text/in/t1 "192.168.0.1 rtr.example.com foo\n"
753   store Hosts.lns /text/in/t1 /text/tree/t1
754   set /text/tree/t1/1/alias[1] bar
755   retrieve Hosts.lns /text/in/t1 /text/tree/t1 /text/out/t1
756   print /text/out/t1
757 prints
758   /text/out/t1 = "192.168.0.1 rtr.example.com bar\n"
759
760 test retrieve_nolens -1 ENOLENS
761   set /text/in/t1 "192.168.0.1 rtr.example.com foo\n"
762   store Hosts.lns /text/in/t1 /text/tree/t1
763   retrieve Nomodule.lns /text/in/t1 /text/tree/t1 /text/out/t1
764
765 test retrieve_epathx_node_in -1 EPATHX
766  use Hosts
767   retrieve Hosts.lns [garbage] /text/tree/t1 /text/out/t1
768
769 test retrieve_epathx_path -1 EPATHX
770  use Hosts
771   retrieve Hosts.lns /text/in/t1 [garbage] /text/out/t1
772
773 test retrieve_epathx_node_out -1 EPATHX
774  use Hosts
775   set /text/in/t1 "192.168.0.1 rtr.example.com foo\n"
776   retrieve Hosts.lns /text/in/t1 /text/tree/t1 [garbage]
777
778 test retrieve_no_node_in -1 ENOMATCH
779  use Hosts
780   retrieve Hosts.lns /text/in/t1 /text/tree/t1 /text/out/t1
781
782 test retrieve_no_tree 3
783  use Hosts
784   set /text/in/t1 "192.168.0.1 rtr.example.com foo\n"
785   retrieve Hosts.lns /text/in/t1 /text/tree/t1 /text/out/t1
786   print /text/out/t1
787 prints
788   /text/out/t1 = ""
789
790 test retrieve_esyntax 5
791  use Hosts
792   set /text/in/t1 "192.168.0.1 rtr.example.com foo\n"
793   store Hosts.lns /text/in/t1 /text/tree/t1
794   set /text/in/t1 "not a hosts file entry"
795   retrieve Hosts.lns /text/in/t1 /text/tree/t1 /text/out/t1
796   match /augeas//error
797 prints
798   /augeas/text/text/tree/t1/error = parse_skel_failed
799
800 # Bug #283; /text is actually NULL
801 test retrieve_null -1 ENOMATCH
802  use Hosts
803   set /text/1 "192.168.0.1 toto\n"
804   retrieve Hosts.lns /text /hosts /out
805
806 # Change 'var=val' to 'variable=value' and check that the span gets updated
807 test span_updates_lv 9
808   set /in "var=val\n"
809   store Cron.lns /in /cron
810   span /cron/var
811   span /cron
812   mv /cron/var /cron/variable
813   set /cron/variable value
814   retrieve Cron.lns /in /cron /out
815   span /cron/variable
816   span /cron
817 prints
818   /cron label=(0:3) value=(4:7) span=(0,8)
819   /cron label=(0:0) value=(0:0) span=(0,8)
820   /cron label=(0:8) value=(9:14) span=(0,15)
821   /cron label=(0:0) value=(0:0) span=(0,15)
822
823 # Make a change and check that the parents' span gets updated
824 test span_updates_parent 8
825   set /in "10.0.0.1 gw.example.com\n"
826   store Hosts.lns /in /host
827   span /host/1
828   span /host
829   set /host/1/canonical gateway.example.com
830   retrieve Hosts.lns /in /host /out
831   span /host/1
832   span /host
833 prints
834   /host label=(0:0) value=(0:0) span=(0,24)
835   /host label=(0:0) value=(0:0) span=(0,24)
836   /host label=(0:0) value=(0:0) span=(0,29)
837   /host label=(0:0) value=(0:0) span=(0,29)
838
839 # Check that creating nodes sets spans
840 test span_updates_on_create 5
841   set /in ""
842   set /cron/var val
843   retrieve Cron.lns /in /cron /out
844   span /cron/var
845   span /cron
846 prints
847   /cron label=(0:3) value=(4:7) span=(0,8)
848   /cron label=(0:0) value=(0:0) span=(0,8)