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