rpm/tests/rpmmacro.at

1362 lines
25 KiB
Plaintext

# rpmmacro.at: test rpm macros
#
AT_BANNER([RPM macros])
# ------------------------------
AT_SETUP([simple rpm --eval])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm --define "this that" --eval '%{this}' --eval '%not_defined' --eval '%{not_defined}' --eval '%{}'
],
[0],
[that
%not_defined
%{not_defined}
%{}
])
RPMTEST_CLEANUP
# ------------------------------
AT_SETUP([invalid rpm --eval])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm --eval '%define _ that'
],
[1],
[],
[error: Macro %_ has illegal name (%define)
])
RPMTEST_CLEANUP
# ------------------------------
AT_SETUP([invalid rpm --define])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm --define "_ that"
runroot rpm --define "undefine that"
],
[1],
[],
[error: Macro %_ has illegal name (%define)
error: Macro %undefine is a built-in (%define)
])
RPMTEST_CLEANUP
AT_SETUP([rpm --undefine])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm --define "this that" --eval '1. %{this}' --undefine 'this' --eval '2. %{this'}
runroot rpm --eval '1. %{this}' --define "this that" --eval '2. %{this}' --undefine 'this' --eval '3. %{this'}
],
[0],
[1. that
2. %{this}
1. %{this}
2. that
3. %{this}
])
RPMTEST_CLEANUP
AT_SETUP([simple true conditional rpm --eval])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm --define "this that" --eval '%{?this}'
],
[0],
[that
])
RPMTEST_CLEANUP
AT_SETUP([simple false conditional rpm --eval])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm --define "this that" --eval '%{?that}'
],
[0],
[
])
RPMTEST_CLEANUP
AT_SETUP([nested macro in name])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm --define "this that" --define "that_that foo" --eval '%{expand:%{%{this}_that}}'
],
[0],
[foo
])
RPMTEST_CLEANUP
AT_SETUP([parametrized macro 1])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
RPMDB_INIT
cat << EOF > ${RPMTEST}/mtest
%bar() bar
%foo()\\
%bar\\
foo 1\\
%{bar}\\
foo 2\\
%bar x\\
foo 3\\
%{bar x}\\
foo 4\\
%bar \\
foo 5
EOF
runroot rpm --eval '%{load:/mtest}%{foo}'
],
[0],
[
bar
foo 1
bar
foo 2
bar
foo 3
bar
foo 4
bar
foo 5
],
[])
RPMTEST_CLEANUP
AT_SETUP([parametrized macro 2])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--define '%bar() "Bar %#: %{?1} %{?2}"' \
--define '%foo() "Foo %#: %{?1} %{?2}" %bar a' \
--eval '%foo 1 2'
],
[0],
["Foo 2: 1 2" "Bar 1: a "
])
RPMTEST_CLEANUP
AT_SETUP([parametrized macro 3])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--define '%foo() 1:%1 2:%2' \
--eval '%foo %nil bar'
],
[0],
[1:bar 2:%2
])
RPMTEST_CLEANUP
AT_SETUP([parametrized macro 4])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--define '%bar yyy' \
--define '%foo() %1' \
--eval '%foo %bar' \
--eval '%foo %%bar'
],
[0],
[yyy
%bar
])
RPMTEST_CLEANUP
AT_SETUP([parametrized macro 5])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--define '%foo() %#:%{?1:"%1"}%{?2: "%2"}' \
--define 'bar zzz' \
--eval '%foo 1' \
--eval '%foo 2 ' \
--eval '%foo 1 2' \
--eval '%foo %{nil}' \
--eval '%foo %{nil} xx' \
--eval '%foo %{bar} xx' \
--eval '%foo %{quote: 2 3 5} %{quote:%{nil}}' \
--eval '%foo %{quote 1 2}' \
--eval '%foo x%{quote:y}z 123' \
--eval '%foo x%{quote:%{nil}}z' \
--eval '%foo 1 \
bar' \
--eval '%foo 1 \' \
],
[0],
[1:"1"
1:"2"
2:"1" "2"
0:
1:"xx"
2:"zzz" "xx"
2:" 2 3 5" ""
2:"1" "2"
2:"xyz" "123"
1:"xz"
2:"1" "\"bar
2:"1" "\"
])
RPMTEST_CLEANUP
AT_SETUP([parametrized macro 6])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--define '%foo(-) %{*}' \
--eval '%foo 5 a -z -b2'
],
[0],
[5 a -z -b2
])
RPMTEST_CLEANUP
AT_SETUP([parametrized macro 7])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--define '%foo(zb:) %{**}' \
--eval '%foo 5 a -z -b2'
],
[0],
[5 a -z -b2
])
RPMTEST_CLEANUP
AT_SETUP([uncompress macro 1])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--define "__rpmuncompress /my/bin/rpmuncompress" \
--eval "%{uncompress:/data/SOURCES/hello-2.0.tar.gz}"
],
[0],
[/my/bin/rpmuncompress /data/SOURCES/hello-2.0.tar.gz
])
RPMTEST_CLEANUP
AT_SETUP([uncompress 1])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
RPMDB_INIT
runroot_other ${RPM_CONFIGDIR_PATH}/rpmuncompress /data/SOURCES/hello-2.0.tar.gz | tar t
],
[0],
[hello-2.0/
hello-2.0/COPYING
hello-2.0/hello.spec
hello-2.0/hello.c
hello-2.0/Makefile
hello-2.0/README
hello-2.0/FAQ
])
RPMTEST_CLEANUP
AT_SETUP([uncompress 2])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
RPMDB_INIT
echo xxxxxxxxxxxxxxxxxxxxxxxxx > ${RPMTEST}/tmp/"some%%ath"
runroot_other ${RPM_CONFIGDIR_PATH}/rpmuncompress "/tmp/some%%ath"
],
[0],
[xxxxxxxxxxxxxxxxxxxxxxxxx
])
RPMTEST_CLEANUP
AT_SETUP([getncpus macro])
AT_KEYWORDS([macros])
# skip if nproc not available
AT_SKIP_IF([test -z "$(nproc 2>/dev/null)"])
RPMTEST_CHECK([
mem=$(expr $(getconf PAGESIZE) \* $(getconf _PHYS_PAGES) / 1024 / 1024)
expr $(runroot rpm --eval "%{getncpus}") = $(nproc)
expr $(runroot rpm --define "_smp_tasksize_thread ${mem}" --eval "%{getncpus:thread}") = 1
expr $(runroot rpm --define "_smp_tasksize_proc ${mem}" --eval "%{getncpus:proc}") = 1
],
[ignore],
[1
1
1
],
[])
RPMTEST_CLEANUP
AT_SETUP([basename macro])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--eval "%{basename:/data/SOURCES/hello-2.0.tar.gz}"
],
[0],
[hello-2.0.tar.gz
])
RPMTEST_CLEANUP
AT_SETUP([shrink macro])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--eval "%{shrink: h e l lo }"
],
[0],
[h e l lo
])
RPMTEST_CLEANUP
AT_SETUP([suffix macro])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--eval "%{suffix:/data/SOURCES/hello-2.0.tar.gz}"
],
[0],
[gz
])
RPMTEST_CLEANUP
AT_SETUP([url2path macro])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--eval "%{url2path:http://hello.org/releases/hello-2.0.tar.gz}"
],
[0],
[/releases/hello-2.0.tar.gz
])
RPMTEST_CLEANUP
AT_SETUP([macrobody macro])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--define "somedir %{_exec_prefix}/%{_lib}" \
--eval "%{macrobody:somedir}"
runroot rpm \
--define "something somedir" \
--define "somedir %{_exec_prefix}/%{_lib}" \
--eval "%{macrobody:%{something}}"
],
[0],
[%{_exec_prefix}/%{_lib}
%{_exec_prefix}/%{_lib}
])
RPMTEST_CLEANUP
AT_SETUP([rpmversion macro])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm --eval "%{rpmversion}"
],
[0],
[AT_PACKAGE_VERSION
],
[])
RPMTEST_CLEANUP
AT_SETUP([builtin macro arguments])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm --eval "%{dirname}"
runroot rpm --eval "%{dirname:}"
runroot rpm --eval "%{dirname:dir}"
runroot rpm --eval "%{dirname dir}"
runroot rpm --eval "%dirname"
runroot rpm --eval "%dirname dir"
runroot rpm --eval "%dirname /"
runroot rpm --eval "%dirname ./"
runroot rpm --eval "%dirname .."
runroot rpm --eval "%dirname ../"
runroot rpm --eval "%dirname ../foo"
runroot rpm --eval "%dirname /foo"
runroot rpm --eval "%dirname /foo/"
runroot rpm --eval "%dirname /foo/foobar"
runroot rpm --eval "%dirname /foo/foobar/"
runroot rpm --eval "%basename /foo/foobar"
runroot rpm --eval "%basename /foo/foobar/"
runroot rpm --eval "%basename /"
runroot rpm --eval "%basename foobar/"
runroot rpm --eval "%basename foobar"
runroot rpm --define '%xxx /hello/%%%%/world' --eval '%{dirname:%xxx}'
runroot rpm --eval "%{uncompress}"
runroot rpm --eval "%{uncompress:}"
runroot rpm --eval "%{getconfdir:}"
runroot rpm --eval "%{getconfdir:5}"
runroot rpm --eval "%{define:}"
runroot rpm --eval "%{define:foo}"
runroot rpm --eval "%{define:foo bar}%{foo}"
runroot rpm --eval "%{define foo}"
runroot rpm --eval "%{define foo bar baz\baz}%{foo}"
runroot rpm --eval "%{dump:foo}"
runroot rpm --eval "%{shrink:%%%%}"
runroot rpm --eval "%{shrink %%%%}"
runroot rpm --eval "%shrink %%%%"
runroot rpm --eval "%verbose foo"
],
[0],
[.
.
.
.
/
.
.
.
..
/
/
/foo
/foo
foobar
foobar
/
foobar
foobar
/hello/%%
bar
bar baz\baz
%%
%%
%%
0 foo
],
[error: %dirname: argument expected
error: %dirname: argument expected
error: %uncompress: argument expected
error: %getconfdir: unexpected argument
error: %getconfdir: unexpected argument
error: Macro % has illegal name (%define)
error: Macro %foo has empty body
error: Macro %foo has empty body
error: %dump: unexpected argument
])
RPMTEST_CLEANUP
AT_SETUP([macro arguments])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--define 'zzz xxx' \
--eval '%{defined zzz}' \
--eval '%{defined:zzz}' \
--eval '%defined zzz' \
--eval '%{defined aaa}' \
--eval '%{defined:aaa}' \
--eval '%defined aaa'
],
[0],
[1
1
1
0
0
0
])
RPMTEST_CLEANUP
AT_SETUP([string functions])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--eval "%sub cd6317ba61e6c27b92d6bbdf2702094ff3c0c732 1 7" \
--eval "%sub cd6317ba61e6c27b92d6bbdf2702094ff3c0c732 7 -7" \
--eval "%sub cd6317ba61e6c27b92d6bbdf2702094ff3c0c732 -7" \
--eval "%len cd6317ba61e6c27b92d6bbdf2702094ff3c0c732" \
--eval "%upper abba" \
--eval "%lower Beatles" \
--eval "%rep ai 2" \
--eval "%reverse live" \
--eval "%reverse a'b" \
--eval "%reverse a\"b" \
--eval "%gsub aaa a b 2"
],
[0],
[cd6317b
ba61e6c27b92d6bbdf2702094ff3
3c0c732
40
ABBA
beatles
aiai
evil
b'a
b"a
bba
],
[])
RPMTEST_CLEANUP
AT_SETUP([expr macro 1])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--define "aaa 5" \
--define "bbb 0" \
--eval '%{expr:4*1024}' \
--eval '%{expr:5 < 1}' \
--eval '%{expr:(4 + 5) * 2 == 18}' \
--eval '%{expr:%{aaa} || %{bbb}}' \
--eval '%{expr:%{aaa} && %{bbb}}' \
--eval '%{expr:! ""}' \
--eval '%{expr:! "foo"}' \
--eval '%{expr: 0 || 3}' \
--eval '%{expr: 2 || 3}' \
--eval '%{expr: "" || "foo"}' \
--eval '%{expr: "bar" || "foo"}' \
--eval '%{expr: 0 && 3}' \
--eval '%{expr: 2 && 3}' \
--eval '%{expr: "" && "foo"}' \
--eval '%{expr: "bar" && "foo"}'
],
[0],
[4096
0
1
5
0
1
0
3
2
foo
bar
0
3
foo
],
[])
RPMTEST_CLEANUP
AT_SETUP([expr macro 2])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm --eval '%{expr:"a"*1}'
runroot rpm --eval '%{expr:(5+1)*4)}'
runroot rpm --eval '%{expr:"a"=!"b"}'
runroot rpm --eval '%{expr:4+}'
runroot rpm --eval '%{expr:bare}'
runroot rpm --eval '%{expr:1/0}'
runroot rpm --eval '%{expr:0 < 1 ? 2 : 1*"a"}'
runroot rpm --eval '%{expr:0 < 1 ? 1*"a" : 2}'
runroot rpm --eval '%{expr:0 < 1 ? 2 : "a"}'
runroot rpm --eval '%{expr:0 < 1 ? "a" : 2}'
],
[1],
[],
[error: types must match: "a"*1
error: syntax error in expression: (5+1)*4)
error: ^
error: syntax error while parsing ==: "a"=!"b"
error: ^
error: unexpected end of expression: 4+
error: ^
error: bare words are no longer supported, please use "...": bare
error: ^
error: division by zero: 1/0
error: ^
error: types must match: 0 < 1 ? 2 : 1*"a"
error: types must match: 0 < 1 ? 1*"a" : 2
error: types must match: 0 < 1 ? 2 : "a"
error: types must match: 0 < 1 ? "a" : 2
])
RPMTEST_CLEANUP
AT_SETUP([ternary expressions])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--eval '%{expr: 0 ? 2 : 3}' \
--eval '%{expr: 1 ? 2 : 3}' \
--eval '%{expr: 0 ? 0 ? 3 : 4 : 0 ? 6 : 7}' \
--eval '%{expr: 0 ? 0 ? 3 : 4 : 5 ? 6 : 7}' \
--eval '%{expr: 0 ? 2 ? 3 : 4 : 0 ? 6 : 7}' \
--eval '%{expr: 0 ? 2 ? 3 : 4 : 5 ? 6 : 7}' \
--eval '%{expr: 1 ? 0 ? 3 : 4 : 0 ? 6 : 7}' \
--eval '%{expr: 1 ? 0 ? 3 : 4 : 5 ? 6 : 7}' \
--eval '%{expr: 1 ? 2 ? 3 : 4 : 0 ? 6 : 7}' \
--eval '%{expr: 1 ? 2 ? 3 : 4 : 5 ? 6 : 7}' \
],
[0],
[3
2
7
6
7
6
4
4
3
3
],
[])
RPMTEST_CLEANUP
AT_SETUP([expression macro level])
AT_KEYWORDS([macros])
RPMTEST_CHECK([[
runroot rpm \
--define 'expopt(r) %[%{undefined yyy} ? "aa " : "bb "]%{-r:the -r option was set}%{!-r:the -r option was not set}' \
--eval '%expopt' \
--eval '%expopt -r' \
--define 'yyy 1' \
--eval '%expopt' \
--eval '%expopt -r'
]],
[0],
[aa the -r option was not set
aa the -r option was set
bb the -r option was not set
bb the -r option was set
],
[])
RPMTEST_CHECK([[
runroot rpm \
--define 'expopt(r) %{expr:%{undefined yyy} ? "aa " : "bb "}%{-r:the -r option was set}%{!-r:the -r option was not set}' \
--eval '%expopt' \
--eval '%expopt -r' \
--define 'yyy 1' \
--eval '%expopt' \
--eval '%expopt -r'
]],
[0],
[aa the -r option was not set
aa the -r option was set
bb the -r option was not set
bb the -r option was set
],
[])
RPMTEST_CLEANUP
AT_SETUP([short circuiting])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--eval '%{expr: 0 && 1 / 0}' \
--eval '%{expr: 1 || 1 / 0}' \
--eval '%{expr: 1 ? 2 : 1 / 0}' \
],
[0],
[0
1
2
],
[])
RPMTEST_CLEANUP
AT_SETUP([shell expansion])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--eval "%(echo foo)"
],
[0],
[foo
])
RPMTEST_CLEANUP
AT_SETUP([expression expansion 1])
AT_KEYWORDS([macros])
RPMTEST_CHECK([[
runroot rpm \
--define "aaa 5" \
--define "bbb 0" \
--eval '%[4*1024]' \
--eval '%[5 < 1]' \
--eval '%[%aaa]' \
--eval '%[%{aaa}]' \
--eval '%["%{aaa}"]' \
--eval '%[%{?ccc}]' \
--eval '%[v"1:2.3-4"]' \
--eval '%[v"0" && v"0"]' \
]],
[0],
[4096
0
5
5
5
0
1:2.3-4
0
],
[])
RPMTEST_CLEANUP
AT_SETUP([expression expansion 2])
AT_KEYWORDS([macros])
RPMTEST_CHECK([[
runroot rpm --define "aaa hello" --eval '%[%aaa]'
runroot rpm --eval '%[%{foo]'
runroot rpm --eval '%[v""]'
runroot rpm --eval '%[v"1" + v"2"]'
runroot rpm --eval '%[v"1" / v"2"]'
]],
[1],
[],
[error: macro expansion returned a bare word, please use "...": %aaa
error: ^
error: expanded string: hello
error: Unterminated {: {foo
error: invalid version: v""
error: ^
error: + and - not supported for versions: v"1" + v"2"
error: ^
error: * and / not supported for versions: v"1" / v"2"
error: ^
])
RPMTEST_CLEANUP
AT_SETUP([expression version comparison])
AT_KEYWORDS([macros])
RPMTEST_CHECK([[
runroot rpm \
--eval '%[v"1.0" == v"1.0"]' \
--eval '%[v"1.0~rc" < v"1.0"]' \
--eval '%[v"1.0~rc" > v"1.0"]' \
--eval '%[v"1.0-rc" > v"1.0"]' \
]],
[0],
[1
1
0
1
],
[])
RPMTEST_CLEANUP
AT_SETUP([simple lua --eval])
AT_KEYWORDS([macros lua])
RPMTEST_CHECK([
runroot rpm --eval '%{lua:print(5*5)}'
],
[0],
[25
])
RPMTEST_CLEANUP
AT_SETUP([lua glob])
RPMTEST_CHECK([
RPMDB_INIT
runroot_other mkdir -p aaa/{123,223,323,322,321}
runroot rpm --eval "%{lua:for i,p in ipairs(rpm.glob('aaa/3*')) do print(p..'\\n') end}"
runroot rpm --eval "%{lua:for i,p in ipairs(rpm.glob('aaa/b*', 'c')) do print(p..'\\n') end}"
],
[0],
[aaa/321
aaa/322
aaa/323
aaa/b*
],
[])
RPMTEST_CLEANUP
AT_SETUP([lua macro arguments])
AT_KEYWORDS([macros lua])
RPMTEST_CHECK([[
runroot rpm \
--define "foo(a:) %{lua:print(opt.a, arg[1])}" \
--define "bar() %{lua:print(rpm.expand('%foo -a'..arg[2]..' '..arg[1]))}" \
--eval '%bar 5 3'
]],
[0],
[3 5
])
RPMTEST_CLEANUP
AT_SETUP([lua macros table])
AT_KEYWORDS([macros lua])
RPMTEST_CHECK([[
runroot rpm \
--define "qtst() %{lua:for i=1, #arg do print(' '..i..':'..arg[i]) end}"\
--eval "%{lua:print(macros.with('zap'), macros.without('zap'))}" \
--eval "%{lua:print(macros.aaa)}" \
--eval "%{lua:macros.aaa='bbb'; macros['yyy']='zzz'}" \
--eval "%{lua:print(macros['aaa'], macros.yyy)}" \
--eval "%{lua:macros.aaa=nil"} \
--eval "%{lua:print(macros.aaa)}" \
--eval "%{lua:print(macros.qtst('a c'))}" \
--eval "%{lua:print(macros.qtst({'a', '', 'c'}))}" \
--eval "%{lua:print(macros.qtst('%{?aaa} %{yyy}'))}" \
--eval "%{lua:print(macros.qtst({'%{?aaa}', '%{yyy}'}))}" \
--eval "%{lua:macros.define({'this', 'that'}); print(macros.this)}"
]],
[0],
[0 1
nil
bbb zzz
nil
1:a 2:c
1:a 2: 3:c
1:zzz
1:%{?aaa} 2:%{yyy}
that
])
RPMTEST_CHECK([[
runroot rpm \
--eval "%{lua:macros.defined({1,2,{}})}"
]],
[1],
[],
[[error: lua script failed: [string "<lua>"]:1: bad argument #3 to 'defined' (cannot convert to string)
]])
RPMTEST_CLEANUP
AT_SETUP([lua macros recursion])
AT_KEYWORDS([macros lua])
RPMTEST_CHECK([[
runroot rpm \
--define "%recurse() %{lua:io.write(' '..#arg); if #arg < 16 then table.insert(arg, #arg); macros.recurse(arg) end;}" \
--eval "%recurse"
]],
[0],
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
])
RPMTEST_CLEANUP
AT_SETUP([lua rpm extensions 1])
AT_KEYWORDS([macros lua])
RPMTEST_CHECK([
runroot rpm --eval '%{lua: rpm.define("foo bar") print(rpm.expand("%{foo}"))}'
],
[0],
[bar
])
RPMTEST_CLEANUP
AT_SETUP([lua rpm extensions 2])
AT_KEYWORDS([macros lua])
RPMTEST_CHECK([
runroot rpm --eval '%{lua: print(rpm.vercmp("1.0", "2.0"))}'
],
[0],
[-1
])
RPMTEST_CLEANUP
AT_SETUP([lua rpm isdefined])
AT_KEYWORDS([macros lua])
RPMTEST_CHECK([
runroot rpm \
--eval '%{lua: print(rpm.isdefined("with"))}' \
--eval '%{lua: print(rpm.isdefined("nil"))}' \
--eval '%{lua: print(rpm.isdefined("ponies"))}'
],
[0],
[true true
true false
false false
])
RPMTEST_CLEANUP
AT_SETUP([lua rpm split/unsplitargs])
AT_KEYWORDS([macros lua])
RPMTEST_CHECK([[
runroot rpm \
--eval '%{lua: local a=rpm.splitargs("1 2 3");a[2]=" " .. a[2] .. " ";print(rpm.unsplitargs(a))}' \
| tr '\037' :
]],
[0],
[:1: : 2 : :3:
])
RPMTEST_CLEANUP
AT_SETUP([lua posix extensions])
AT_KEYWORDS([macros lua])
RPMTEST_CHECK([
runroot rpm \
--eval '%{lua: posix.putenv("LUATEST=ok") print(posix.getenv("LUATEST"))}'
],
[0],
[ok
])
RPMTEST_CLEANUP
AT_SETUP([lua script exit behavior])
AT_KEYWORDS([macros lua])
RPMTEST_CHECK([
runroot rpm \
--eval '%{lua: os.exit()}))}'
],
[1],
[],
[error: lua script failed: [[string "<lua>"]]:1: exit not permitted in this context]
)
RPMTEST_CLEANUP
AT_SETUP([lua script redirect2null])
AT_KEYWORDS([macros lua])
RPMTEST_CHECK([
runroot rpm \
--eval '%{lua: posix.redirect2null()}))}'
],
[1],
[],
[error: lua script failed: [[string "<lua>"]]:1: redirect2null not permitted in this context]
)
RPMTEST_CLEANUP
AT_SETUP([lua library path])
AT_KEYWORDS([macros lua])
RPMTEST_CHECK([
RPMDB_INIT
f=$(run rpm --eval "%{_rpmconfigdir}/lua/foo.lua")
echo "bar = 'graak'" > ${RPMTEST}/${f}
runroot rpm \
--eval '%{lua:require "foo"; print(bar)}'
rm -f ${RPMTEST}/${f}
],
[0],
[graak
])
RPMTEST_CLEANUP
AT_SETUP([lua auto-print])
AT_KEYWORDS([macros lua])
RPMDB_INIT
RPMTEST_CHECK([[
runroot rpm \
--define 'foo() %{lua:return string.reverse(arg[1])}' \
--eval '%foo hello' \
--eval '%{lua:return 1, 2, 3}'
]],
[0],
[olleh
1 2 3
])
RPMTEST_CLEANUP
AT_SETUP([lua rpm version objects])
AT_KEYWORDS([macros lua])
RPMTEST_CHECK([
runroot rpm \
--eval '%{lua: v1 = rpm.ver("1:4.16-5"); print(v1, v1.e, v1.v, v1.r)}' \
--eval '%{lua: v1 = rpm.ver("4.16-1"); print(v1, v1.e, v1.v, v1.r)}' \
--eval '%{lua: v1 = rpm.ver("4.16"); print(v1, v1.e, v1.v, v1.r)}' \
--eval '%{lua: v1 = rpm.ver("1:4.16-5"); v2 = rpm.ver("4.4-1"); print(v1 < v2, v1 == v2, v1 > v2, v1 == v1)}'
],
[0],
[1:4.16-5 1 4.16 5
4.16-1 nil 4.16 1
4.16 nil 4.16 nil
false false true true
])
RPMTEST_CLEANUP
AT_SETUP([lua rpm io stream])
AT_KEYWORDS([macros lua])
RPMTEST_CHECK([
RPMDB_INIT
runroot rpm \
--eval '%{lua: local f = rpm.open("zzz", "w+"); f:write("gggg"); print(f:seek("cur")); f:close()}' \
--eval '%{lua: local f = rpm.open("zzz"); print(f:read()); f:close()}' \
--eval '%{lua: local f = rpm.open("/data/SOURCES/hello-2.0.tar.gz"); f:reopen("r.gzip"); f:seek("cur", 6); print(f:read(3)); f:close()}'
],
[0],
[4
gggg
2.0
])
RPMTEST_CLEANUP
AT_SETUP([lua functions in expressions])
AT_KEYWORDS([macros lua])
RPMTEST_CHECK([[
runroot rpm \
--eval '%[lua:string.reverse("hello")]'
]],
[0],
[olleh
])
RPMTEST_CLEANUP
AT_SETUP([lua hooks])
AT_KEYWORDS([macros lua])
RPMTEST_CHECK([[
runroot rpm \
--eval '%{lua:
function regtest(n) for _,v in ipairs(n) do print(" "..type(v)..":"..v);end;end
local h = rpm.register("test", regtest)
rpm.call("test", "foo", 6, 29 / 4)
rpm.unregister("test", h)
rpm.call("test", "foo", 6, 29 / 4)
}'
]],
[0],
[ string:foo number:6 number:7.25
])
RPMTEST_CLEANUP
AT_SETUP([%define + %undefine in nested levels 1])
AT_KEYWORDS([macros define undefine])
RPMTEST_CHECK([
# basic %define in nested scoping level
runroot rpm \
--define '%foo() %{expand:%define xxx 1} %{echo:%xxx} %{expand:%undefine xxx} %{echo:%xxx}' \
--eval .'%foo'.
],
[0],
[1
%xxx
. .
])
RPMTEST_CLEANUP
AT_SETUP([%define + %undefine in nested levels 2])
AT_KEYWORDS([macros define])
RPMTEST_CHECK([
# %define macro once in a nested scope
runroot rpm \
--define '%foo() %{expand:%define xxx 1} %{echo:%xxx}' \
--eval .'%foo'. \
--eval '%xxx'
],
[0],
[1
. .
%xxx
])
RPMTEST_CLEANUP
AT_SETUP([%define + %undefine in nested levels 3])
AT_KEYWORDS([macros define])
RPMTEST_CHECK([
AT_XFAIL_IF([test $RPM_XFAIL -ne 0])
# %define macro twice in a nested scope
runroot rpm \
--define '%foo() %{expand:%define xxx 1} %{echo:%xxx} %{expand: %define xxx 2} %{echo:%xxx}' \
--eval .'%foo'. \
--eval '%xxx'
],
[0],
[1
2
. .
%xxx
])
RPMTEST_CLEANUP
AT_SETUP([%define + %undefine in nested levels 4])
AT_KEYWORDS([macros define global])
RPMTEST_CHECK([
AT_XFAIL_IF([test $RPM_XFAIL -ne 0])
# %define in a nested level covered by %global
runroot rpm \
--define '%foo() %{expand:%define xxx 1} %{echo:%xxx} %{expand: %global xxx 2} %{echo:%xxx}' \
--eval .'%foo'. \
--eval '%xxx' \
--eval '%undefine xxx' \
--eval '%xxx'
],
[0],
[1
2
. .
2
%xxx
])
RPMTEST_CLEANUP
AT_SETUP([%define in conditional macro])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--define 'dofoo() true'\
--eval '.%{!?foo: %define foo bar}.'\
--eval '%foo' \
--eval '%dofoo'\
--eval '%foo'
],
[0],
[. .
bar
true
bar
])
RPMTEST_CLEANUP
AT_SETUP([%verbose macro])
AT_KEYWORDS([macros verbose])
RPMTEST_CHECK([
runroot rpm --eval '%{verbose}'
runroot rpm -v --eval '%{verbose}'
runroot rpm --eval '%{verbose:zzz}'
runroot rpm -v --eval '%{verbose:zzz}'
],
[0],
[0
1
zzz
])
RPMTEST_CLEANUP
AT_SETUP([%exists macro])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--eval "%{exists:/data}" \
--eval "%{exists:/zzz}" \
--eval "%{exists}"
],
[1],
[1
0
],
[error: %exists: argument expected
])
RPMTEST_CLEANUP
AT_SETUP([%shescape macro])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--eval "%{shescape:foo's}"
],
[0],
['foo'\''s'
],
[])
RPMTEST_CLEANUP
AT_SETUP([%shescape macro with multiple arguments])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--eval "%{shescape foo bar's}"
],
[0],
['foo' 'bar'\''s'
],
[])
RPMTEST_CLEANUP
AT_SETUP([macro with a line starting by "{"])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm --macros "/data/macros.testfile" \
--eval "%first" --eval "%second"],
[0],
[macro_1
macro_2
])
RPMTEST_CLEANUP
AT_SETUP([macro with %if-%endif])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpmspec -q --qf "%{summary}\n%{description}\n" /data/SPECS/iftest.spec
],
[0],
[macro 1
ccc0
ccc1
])
RPMTEST_CLEANUP
AT_SETUP([macro file errors])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
cat << EOF > macros.bad
%1 foo
%multi \\
line\\
thing
%foo bar
%bad-name 123
EOF
run rpm --macros "macros.bad" --eval "%foo"
],
[0],
[bar
],
[error: macros.bad: line 1: Macro %1 has illegal name (%define)
warning: macros.bad: line 8: Macro %bad needs whitespace before body
])
RPMTEST_CLEANUP
AT_SETUP([macro comments])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--macros /data/macros.testfile \
--eval "%{comment1}" \
--eval "%{comment2}"
],
[0],
[
read
me
see
this
],
[])
RPMTEST_CLEANUP
AT_SETUP([macro comments 2])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--macros /data/macros.testfile \
--eval "%{comment3}"
],
[0],
[
read
' change this meaning
],
[])
RPMTEST_CLEANUP
AT_SETUP([macro file empty lines])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm \
--macros /data/macros.testfile \
--eval "%{empty0}"
],
[0],
[
some
thing
],
[])
RPMTEST_CLEANUP
AT_SETUP([macro traceback])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
for o in "-v" ""; do
runroot rpm $o \
--define "err %{error:bad}" \
--define "bar %err" \
--define "foo %bar zz" \
--eval "xxx%{foo}yyy"
done
],
[1],
[],
[error: bad
3< (%error)
2< (%err)
1< (%bar)
0< (%foo)
xxx
error: bad
])
RPMTEST_CLEANUP
AT_SETUP([error macro return])
AT_KEYWORDS([macros lua])
RPMTEST_CHECK([
runroot rpm --eval '%{error:fail}'
],
[1],
[],
[error: fail
])
RPMTEST_CHECK([
runroot rpm --eval '%{lua:rpm.expand("%{error:fail}")}'
],
[1],
[],
[[error: fail
error: lua script failed: [string "<lua>"]:1: error expanding macro
]])
RPMTEST_CHECK([
runroot rpm --eval '%{lua:macros.error({"fail"})}'
],
[1],
[],
[[error: fail
error: lua script failed: [string "<lua>"]:1: error expanding macro
]])
RPMTEST_CLEANUP
AT_SETUP([no space left on stdout])
AT_KEYWORDS([macros])
RPMTEST_CHECK([
runroot rpm --eval 1 >/dev/full
],
[1],
[],
[Error writing to stdout: No space left on device
])
RPMTEST_CLEANUP
AT_SETUP([rpmlua])
AT_KEYWORDS([lua])
RPMTEST_SETUP
RPMTEST_CHECK([
runroot_other rpmlua /data/t1.lua a b
],
[0],
[hello world
opts:
args:
/data/t1.lua
a
b
],
[])
RPMTEST_CHECK([
runroot_other rpmlua --opts=ot: /data/t1.lua -- -t1 a
],
[0],
[hello world
opts:
t 1
args:
a
],
[])
RPMTEST_CHECK([
runroot_other rpmlua -e "print(macros.basename('/some/thing'))"
],
[0],
[thing
],
[])
RPMTEST_CHECK([
runroot_other rpmlua -e "for i, v in ipairs({'true', 'false', 'grue'}) do print(rpm.execute('/bin/'..v)) end"
],
[0],
[0.0
nil exit code 256.0
nil No such file or directory 2.0
],
[])
RPMTEST_CHECK([
runroot_other rpmlua -e 'pid = posix.fork(); if pid == 0 then a,b,c=rpm.redirect2null(-1); print(string.format("%s\t%s\t%s", a,b,c)); io.flush() else posix.wait(pid) end'
],
[0],
[nil Bad file descriptor 9.0
],
[warning: runaway fork() in Lua script]
)
RPMTEST_CLEANUP