1#    rpmmacro.at: test rpm macros
2#
3AT_BANNER([RPM macros])
4
5# ------------------------------
6AT_SETUP([simple rpm --eval])
7AT_KEYWORDS([macros])
8AT_CHECK([
9runroot rpm --define "this that" --eval '%{this}' --eval '%not_defined' --eval '%{not_defined}' --eval '%{}'
10],
11[0],
12[that
13%not_defined
14%{not_defined}
15%{}
16])
17AT_CLEANUP
18
19# ------------------------------
20AT_SETUP([invalid rpm --eval])
21AT_KEYWORDS([macros])
22AT_CHECK([
23runroot rpm --eval '%define _ that'
24],
25[1],
26[],
27[error: Macro %_ has illegal name (%define)
28])
29AT_CLEANUP
30
31# ------------------------------
32AT_SETUP([invalid rpm --define])
33AT_KEYWORDS([macros])
34AT_CHECK([
35runroot rpm --define "_ that"
36runroot rpm --define "undefine that"
37],
38[1],
39[],
40[error: Macro %_ has illegal name (%define)
41error: Macro %undefine is a built-in (%define)
42])
43AT_CLEANUP
44
45AT_SETUP([rpm --undefine])
46AT_KEYWORDS([macros])
47AT_CHECK([
48runroot rpm --define "this that" --eval '1. %{this}' --undefine 'this' --eval '2. %{this'}
49runroot rpm --eval '1. %{this}' --define "this that" --eval '2. %{this}' --undefine 'this' --eval '3. %{this'}
50],
51[0],
52[1. that
532. %{this}
541. %{this}
552. that
563. %{this}
57])
58AT_CLEANUP
59
60AT_SETUP([simple true conditional rpm --eval])
61AT_KEYWORDS([macros])
62AT_CHECK([
63runroot rpm --define "this that" --eval '%{?this}'
64],
65[0],
66[that
67])
68AT_CLEANUP
69
70AT_SETUP([simple false conditional rpm --eval])
71AT_KEYWORDS([macros])
72AT_CHECK([
73runroot rpm --define "this that" --eval '%{?that}'
74],
75[0],
76[
77])
78AT_CLEANUP
79
80AT_SETUP([nested macro in name])
81AT_KEYWORDS([macros])
82AT_CHECK([
83runroot rpm --define "this that" --define "that_that foo" --eval '%{expand:%{%{this}_that}}'
84],
85[0],
86[foo
87])
88AT_CLEANUP
89
90AT_SETUP([parametrized macro 1])
91AT_KEYWORDS([macros])
92AT_CHECK([
93RPMDB_INIT
94cat << EOF > ${RPMTEST}/mtest
95%bar() bar
96%foo()\\
97%bar\\
98foo 1\\
99%{bar}\\
100foo 2\\
101%bar x\\
102foo 3\\
103%{bar x}\\
104foo 4\\
105%bar \\
106foo 5
107EOF
108
109runroot rpm --eval '%{load:mtest}%{foo}'
110],
111[0],
112[
113bar
114foo 1
115bar
116foo 2
117bar
118foo 3
119bar
120foo 4
121bar
122foo 5
123],
124[])
125AT_CLEANUP
126
127AT_SETUP([parametrized macro 2])
128AT_KEYWORDS([macros])
129AT_CHECK([
130runroot rpm \
131    --define '%bar() "Bar %#: %{?1} %{?2}"' \
132    --define '%foo() "Foo %#: %{?1} %{?2}" %bar a' \
133    --eval '%foo 1 2'
134],
135[0],
136["Foo 2: 1 2" "Bar 1: a "
137])
138AT_CLEANUP
139
140AT_SETUP([parametrized macro 3])
141AT_KEYWORDS([macros])
142AT_CHECK([
143runroot rpm \
144    --define '%foo() 1:%1 2:%2' \
145    --eval '%foo %nil bar'
146],
147[0],
148[1:bar 2:%2
149])
150AT_CLEANUP
151
152AT_SETUP([parametrized macro 4])
153AT_KEYWORDS([macros])
154AT_CHECK([
155runroot rpm \
156    --define '%bar yyy' \
157    --define '%foo() %1' \
158    --eval '%foo %bar' \
159    --eval '%foo %%bar'
160],
161[0],
162[yyy
163%bar
164])
165AT_CLEANUP
166
167AT_SETUP([parametrized macro 5])
168AT_KEYWORDS([macros])
169AT_CHECK([
170runroot rpm \
171    --define '%foo() %#:%{?1:"%1"}%{?2: "%2"}' \
172    --define 'bar zzz' \
173    --eval '%foo 1' \
174    --eval '%foo   2  ' \
175    --eval '%foo 1 2' \
176    --eval '%foo %{nil}' \
177    --eval '%foo %{nil} xx' \
178    --eval '%foo %{bar} xx' \
179    --eval '%foo %{quote:   2 3  5} %{quote:%{nil}}' \
180    --eval '%foo x%{quote:y}z 123' \
181    --eval '%foo x%{quote:%{nil}}z' \
182    --eval '%foo 1 \
183bar' \
184    --eval '%foo 1 \' \
185],
186[0],
187[1:"1"
1881:"2"
1892:"1" "2"
1900:
1911:"xx"
1922:"zzz" "xx"
1932:"   2 3  5" ""
1942:"xyz" "123"
1951:"xz"
1962:"1" "\"bar
1972:"1" "\"
198])
199AT_CLEANUP
200
201AT_SETUP([uncompress macro 1])
202AT_KEYWORDS([macros])
203AT_CHECK([
204runroot rpm \
205    --define "__gzip /my/bin/gzip" \
206    --eval "%{uncompress:/data/SOURCES/hello-2.0.tar.gz}"
207],
208[0],
209[/my/bin/gzip -dc /data/SOURCES/hello-2.0.tar.gz
210])
211AT_CLEANUP
212
213AT_SETUP([uncompress macro 2])
214AT_KEYWORDS([macros])
215AT_CHECK([
216RPMDB_INIT
217echo xxxxxxxxxxxxxxxxxxxxxxxxx > ${RPMTEST}/tmp/"some%%ath"
218runroot rpm \
219    --eval "%{uncompress:/tmp/some%%%%ath}"
220],
221[0],
222[/usr/bin/cat /tmp/some%%ath
223])
224
225AT_CLEANUP
226AT_SETUP([basename macro])
227AT_KEYWORDS([macros])
228AT_CHECK([
229runroot rpm \
230    --eval "%{basename:/data/SOURCES/hello-2.0.tar.gz}"
231],
232[0],
233[hello-2.0.tar.gz
234])
235AT_CLEANUP
236
237AT_SETUP([shrink macro])
238AT_KEYWORDS([macros])
239AT_CHECK([
240runroot rpm \
241    --eval "%{shrink:  h e  l   lo  }"
242],
243[0],
244[h e l lo
245])
246AT_CLEANUP
247
248AT_SETUP([suffix macro])
249AT_KEYWORDS([macros])
250AT_CHECK([
251runroot rpm \
252    --eval "%{suffix:/data/SOURCES/hello-2.0.tar.gz}"
253],
254[0],
255[gz
256])
257AT_CLEANUP
258
259AT_SETUP([url2path macro])
260AT_KEYWORDS([macros])
261AT_CHECK([
262runroot rpm \
263    --eval "%{url2path:http://hello.org/releases/hello-2.0.tar.gz}"
264],
265[0],
266[/releases/hello-2.0.tar.gz
267])
268AT_CLEANUP
269
270AT_SETUP([macrobody macro])
271AT_KEYWORDS([macros])
272AT_CHECK([
273runroot rpm \
274    --define "somedir %{_exec_prefix}/%{_lib}" \
275    --eval "%{macrobody:somedir}"
276runroot rpm \
277    --define "something somedir" \
278    --define "somedir %{_exec_prefix}/%{_lib}" \
279    --eval "%{macrobody:%{something}}"
280],
281[0],
282[%{_exec_prefix}/%{_lib}
283%{_exec_prefix}/%{_lib}
284])
285AT_CLEANUP
286
287AT_SETUP([builtin macro arguments])
288AT_KEYWORDS([macros])
289AT_CHECK([
290runroot rpm --eval "%{dirname}"
291runroot rpm --eval "%{dirname:}"
292runroot rpm --eval "%{dirname:dir}"
293runroot rpm --define '%xxx /hello/%%%%/world' --eval '%{dirname:%xxx}'
294runroot rpm --eval "%{uncompress}"
295runroot rpm --eval "%{uncompress:}"
296runroot rpm --eval "%{getncpus:}"
297runroot rpm --eval "%{getncpus:5}"
298runroot rpm --eval "%{define:}"
299runroot rpm --eval "%{dump:foo}"
300],
301[1],
302[
303dir
304/hello/%%
305
306],
307[error: %dirname: argument expected
308error: %uncompress: argument expected
309error: %getncpus: unexpected argument
310error: %getncpus: unexpected argument
311error: %define: unexpected argument
312error: %dump: unexpected argument
313])
314AT_CLEANUP
315
316AT_SETUP([expr macro 1])
317AT_KEYWORDS([macros])
318AT_CHECK([
319runroot rpm \
320    --define "aaa 5" \
321    --define "bbb 0" \
322    --eval '%{expr:4*1024}' \
323    --eval '%{expr:5 < 1}' \
324    --eval '%{expr:(4 + 5) * 2 == 18}' \
325    --eval '%{expr:%{aaa} || %{bbb}}' \
326    --eval '%{expr:%{aaa} && %{bbb}}' \
327    --eval '%{expr:! ""}' \
328    --eval '%{expr:! "foo"}' \
329    --eval '%{expr: 0 || 3}' \
330    --eval '%{expr: 2 || 3}' \
331    --eval '%{expr: "" || "foo"}' \
332    --eval '%{expr: "bar" || "foo"}' \
333    --eval '%{expr: 0 && 3}' \
334    --eval '%{expr: 2 && 3}' \
335    --eval '%{expr: "" && "foo"}' \
336    --eval '%{expr: "bar" && "foo"}'
337],
338[0],
339[4096
3400
3411
3425
3430
3441
3450
3463
3472
348foo
349bar
3500
3513
352
353foo
354],
355[])
356AT_CLEANUP
357
358AT_SETUP([expr macro 2])
359AT_KEYWORDS([macros])
360AT_CHECK([
361runroot rpm --eval '%{expr:"a"*1}'
362runroot rpm --eval '%{expr:(5+1)*4)}'
363runroot rpm --eval '%{expr:"a"=!"b"}'
364runroot rpm --eval '%{expr:4+}'
365runroot rpm --eval '%{expr:bare}'
366runroot rpm --eval '%{expr:1/0}'
367runroot rpm --eval '%{expr:0 < 1 ? 2 : 1*"a"}'
368runroot rpm --eval '%{expr:0 < 1 ? 1*"a" : 2}'
369runroot rpm --eval '%{expr:0 < 1 ? 2 : "a"}'
370runroot rpm --eval '%{expr:0 < 1 ? "a" : 2}'
371],
372[1],
373[],
374[error: types must match: "a"*1
375error: syntax error in expression: (5+1)*4)
376error:                                    ^
377error: syntax error while parsing ==: "a"=!"b"
378error:                                    ^
379error: unexpected end of expression: 4+
380error:                                ^
381error: bare words are no longer supported, please use "...": bare
382error:                                                       ^
383error: division by zero: 1/0
384error:                    ^
385error: types must match: 0 < 1 ? 2 : 1*"a"
386error: types must match: 0 < 1 ? 1*"a" : 2
387error: types must match: 0 < 1 ? 2 : "a"
388error: types must match: 0 < 1 ? "a" : 2
389])
390AT_CLEANUP
391
392AT_SETUP([ternary expressions])
393AT_KEYWORDS([macros])
394AT_CHECK([
395runroot rpm \
396    --eval '%{expr: 0 ? 2 : 3}' \
397    --eval '%{expr: 1 ? 2 : 3}' \
398    --eval '%{expr: 0 ? 0 ? 3 : 4 : 0 ? 6 : 7}' \
399    --eval '%{expr: 0 ? 0 ? 3 : 4 : 5 ? 6 : 7}' \
400    --eval '%{expr: 0 ? 2 ? 3 : 4 : 0 ? 6 : 7}' \
401    --eval '%{expr: 0 ? 2 ? 3 : 4 : 5 ? 6 : 7}' \
402    --eval '%{expr: 1 ? 0 ? 3 : 4 : 0 ? 6 : 7}' \
403    --eval '%{expr: 1 ? 0 ? 3 : 4 : 5 ? 6 : 7}' \
404    --eval '%{expr: 1 ? 2 ? 3 : 4 : 0 ? 6 : 7}' \
405    --eval '%{expr: 1 ? 2 ? 3 : 4 : 5 ? 6 : 7}' \
406],
407[0],
408[3
4092
4107
4116
4127
4136
4144
4154
4163
4173
418],
419[])
420AT_CLEANUP
421
422AT_SETUP([short circuiting])
423AT_KEYWORDS([macros])
424AT_CHECK([
425runroot rpm \
426    --eval '%{expr: 0 && 1 / 0}' \
427    --eval '%{expr: 1 || 1 / 0}' \
428    --eval '%{expr: 1 ? 2 : 1 / 0}' \
429],
430[0],
431[0
4321
4332
434],
435[])
436AT_CLEANUP
437
438AT_SETUP([shell expansion])
439AT_KEYWORDS([macros])
440AT_CHECK([
441runroot rpm \
442    --eval "%(echo foo)"
443],
444[0],
445[foo
446])
447AT_CLEANUP
448
449AT_SETUP([expression expansion 1])
450AT_KEYWORDS([macros])
451AT_CHECK([[
452runroot rpm \
453    --define "aaa 5" \
454    --define "bbb 0" \
455    --eval '%[4*1024]' \
456    --eval '%[5 < 1]' \
457    --eval '%[%aaa]' \
458    --eval '%[%{aaa}]' \
459    --eval '%["%{aaa}"]' \
460    --eval '%[%{?ccc}]' \
461    --eval '%[v"1:2.3-4"]' \
462]],
463[0],
464[4096
4650
4665
4675
4685
4690
4701:2.3-4
471],
472[])
473AT_CLEANUP
474
475AT_SETUP([expression expansion 2])
476AT_KEYWORDS([macros])
477AT_CHECK([[
478runroot rpm --define "aaa hello" --eval '%[%aaa]'
479runroot rpm --eval '%[%{foo]'
480runroot rpm --eval '%[v""]'
481runroot rpm --eval '%[v"1" + v"2"]'
482runroot rpm --eval '%[v"1" / v"2"]'
483]],
484[1],
485[],
486[error: macro expansion returned a bare word, please use "...": %aaa
487error:                                                         ^
488error: expanded string: hello
489error: Unterminated {: {foo
490error: invalid version: v""
491error:                    ^
492error: + and - not supported for versions: v"1" + v"2"
493error:                                          ^
494error: * and / not supported for versions: v"1" / v"2"
495error:                                          ^
496])
497AT_CLEANUP
498
499AT_SETUP([expression version comparison])
500AT_KEYWORDS([macros])
501AT_CHECK([[
502runroot rpm \
503    --eval '%[v"1.0" == v"1.0"]' \
504    --eval '%[v"1.0~rc" < v"1.0"]' \
505    --eval '%[v"1.0~rc" > v"1.0"]' \
506    --eval '%[v"1.0-rc" > v"1.0"]' \
507]],
508[0],
509[1
5101
5110
5121
513],
514[])
515AT_CLEANUP
516
517AT_SETUP([simple lua --eval])
518AT_KEYWORDS([macros lua])
519AT_CHECK([
520AT_SKIP_IF([$LUA_DISABLED])
521runroot rpm --eval '%{lua:print(5*5)}'
522],
523[0],
524[25
525])
526AT_CLEANUP
527
528AT_SETUP([lua rpm extensions 1])
529AT_KEYWORDS([macros lua])
530AT_CHECK([
531AT_SKIP_IF([$LUA_DISABLED])
532runroot rpm --eval '%{lua: rpm.define("foo bar") print(rpm.expand("%{foo}"))}'
533],
534[0],
535[bar
536])
537AT_CLEANUP
538
539AT_SETUP([lua rpm extensions 2])
540AT_KEYWORDS([macros lua])
541AT_CHECK([
542AT_SKIP_IF([$LUA_DISABLED])
543runroot rpm --eval '%{lua: print(rpm.vercmp("1.0", "2.0"))}'
544],
545[0],
546[-1
547])
548
549AT_CLEANUP
550AT_SETUP([lua posix extensions])
551AT_KEYWORDS([macros lua])
552AT_CHECK([
553AT_SKIP_IF([$LUA_DISABLED])
554runroot rpm \
555  --eval '%{lua: posix.putenv("LUATEST=ok") print(posix.getenv("LUATEST"))}'
556],
557[0],
558[ok
559])
560AT_CLEANUP
561
562AT_SETUP([lua script exit behavior])
563AT_KEYWORDS([macros lua])
564AT_CHECK([
565AT_SKIP_IF([$LUA_DISABLED])
566runroot rpm \
567  --eval '%{lua: os.exit()}))}'
568],
569[1],
570[],
571[error: lua script failed: [[string "<lua>"]]:1: exit not permitted in this context]
572)
573AT_CLEANUP
574
575AT_SETUP([lua script redirect2null])
576AT_KEYWORDS([macros lua])
577AT_CHECK([
578AT_SKIP_IF([$LUA_DISABLED])
579runroot rpm \
580  --eval '%{lua: posix.redirect2null()}))}'
581],
582[1],
583[],
584[error: lua script failed: [[string "<lua>"]]:1: redirect2null not permitted in this context]
585)
586AT_CLEANUP
587
588AT_SETUP([lua library path])
589AT_KEYWORDS([macros lua])
590AT_CHECK([
591AT_SKIP_IF([$LUA_DISABLED])
592RPMDB_INIT
593f=$(run rpm --eval "%{_rpmconfigdir}/lua/foo.lua")
594echo "bar = 'graak'" > ${f}
595runroot rpm \
596  --eval '%{lua:require "foo"; print(bar)}'
597rm -f ${f}
598],
599[0],
600[graak
601])
602AT_CLEANUP
603
604AT_SETUP([%define + %undefine in nested levels 1])
605AT_KEYWORDS([macros define undefine])
606AT_CHECK([
607# basic %define in nested scoping level
608runroot rpm \
609    --define '%foo() %{expand:%define xxx 1} %{echo:%xxx} %{expand:%undefine xxx} %{echo:%xxx}' \
610    --eval .'%foo'.
611],
612[0],
613[1
614%xxx
615.   .
616])
617AT_CLEANUP
618
619AT_SETUP([%define + %undefine in nested levels 2])
620AT_KEYWORDS([macros define])
621AT_CHECK([
622# %define macro once in a nested scope
623runroot rpm \
624    --define '%foo() %{expand:%define xxx 1} %{echo:%xxx}' \
625    --eval .'%foo'. \
626    --eval '%xxx'
627],
628[0],
629[1
630. .
631%xxx
632])
633AT_CLEANUP
634
635AT_SETUP([%define + %undefine in nested levels 3])
636AT_KEYWORDS([macros define])
637AT_CHECK([
638AT_XFAIL_IF([test $RPM_XFAIL -ne 0])
639# %define macro twice in a nested scope
640runroot rpm \
641    --define '%foo() %{expand:%define xxx 1} %{echo:%xxx} %{expand: %define xxx 2} %{echo:%xxx}' \
642    --eval .'%foo'. \
643    --eval '%xxx'
644],
645[0],
646[1
6472
648.    .
649%xxx
650])
651AT_CLEANUP
652
653AT_SETUP([%define + %undefine in nested levels 4])
654AT_KEYWORDS([macros define global])
655AT_CHECK([
656AT_XFAIL_IF([test $RPM_XFAIL -ne 0])
657# %define in a nested level covered by %global
658runroot rpm \
659    --define '%foo() %{expand:%define xxx 1} %{echo:%xxx} %{expand: %global xxx 2} %{echo:%xxx}' \
660    --eval .'%foo'. \
661    --eval '%xxx' \
662    --eval .'%undefine xxx'. \
663    --eval '%xxx'
664],
665[0],
666[1
6672
668.    .
6692
670..
671%xxx
672])
673AT_CLEANUP
674
675AT_SETUP([%define in conditional macro])
676AT_KEYWORDS([macros])
677AT_CHECK([
678runroot rpm \
679    --define 'dofoo() true'\
680    --eval '.%{!?foo: %define foo bar}.'\
681    --eval '%foo' \
682    --eval '%dofoo'\
683    --eval '%foo'
684],
685[0],
686[. .
687bar
688true
689bar
690])
691AT_CLEANUP
692
693AT_SETUP([%verbose negative test])
694AT_KEYWORDS([macros verbose])
695AT_CHECK([
696runroot rpm \
697  --eval '%{verbose:%{echo:is verbose}}' \
698  --eval '%{verbose:is verbose text}'\
699  --eval '%{!verbose:%{echo:is not verbose}}'\
700  --eval '%{!verbose:is not verbose text}'
701],
702[0],
703[
704
705is not verbose
706
707is not verbose text
708])
709AT_CLEANUP
710
711AT_SETUP([%verbose positive test])
712AT_KEYWORDS([macros verbose])
713AT_CHECK([
714runroot rpm -v \
715  --eval '%{!verbose:%{echo:is not verbose}}' \
716  --eval '%{!verbose:is not verbose text}'\
717  --eval '%{verbose:%{echo:is verbose}}'\
718  --eval '%{verbose:is verbose text}'
719],
720[0],
721[
722
723is verbose
724
725is verbose text
726])
727AT_CLEANUP
728
729AT_SETUP([macro with a line starting by "{"])
730AT_KEYWORDS([macros])
731AT_CHECK([
732runroot rpm --macros "/data/macros.testfile" \
733	--eval "%first" --eval "%second"],
734[0],
735[macro_1
736
737macro_2
738])
739AT_CLEANUP
740
741AT_SETUP([macro with %if-%endif])
742AT_KEYWORDS([macros])
743AT_CHECK([
744runroot rpmspec -q --qf "%{summary}\n%{description}\n" /data/SPECS/iftest.spec
745],
746[0],
747[macro 1
748ccc0
749ccc1
750])
751AT_CLEANUP
752
753AT_SETUP([macro file errors])
754AT_KEYWORDS([macros])
755AT_CHECK([
756cat << EOF > macros.bad
757%_i foo
758
759%multi \\
760line\\
761thing
762
763%foo bar
764%bad-name 123
765EOF
766
767run rpm --macros "macros.bad" --eval "%foo"
768],
769[0],
770[bar
771],
772[error: macros.bad: line 1: Macro %_i has illegal name (%define)
773warning: macros.bad: line 8: Macro %bad needs whitespace before body
774])
775AT_CLEANUP
776
777AT_SETUP([macro comments])
778AT_KEYWORDS([macros])
779AT_CHECK([
780runroot rpm \
781	--macros /data/macros.testfile \
782	--eval "%{comment1}" \
783	--eval "%{comment2}"
784],
785[0],
786[
787read
788me
789
790see
791this
792],
793[])
794AT_CLEANUP
795
796AT_SETUP([macro comments 2])
797AT_KEYWORDS([macros])
798AT_CHECK([
799runroot rpm \
800	--macros /data/macros.testfile \
801	--eval "%{comment3}"
802],
803[0],
804[
805read
806' change this meaning
807],
808[])
809AT_CLEANUP
810
811