1# Copyright 2011 The Kyua Authors. 2# All rights reserved. 3# 4# Redistribution and use in source and binary forms, with or without 5# modification, are permitted provided that the following conditions are 6# met: 7# 8# * Redistributions of source code must retain the above copyright 9# notice, this list of conditions and the following disclaimer. 10# * Redistributions in binary form must reproduce the above copyright 11# notice, this list of conditions and the following disclaimer in the 12# documentation and/or other materials provided with the distribution. 13# * Neither the name of Google Inc. nor the names of its contributors 14# may be used to endorse or promote products derived from this software 15# without specific prior written permission. 16# 17# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 29 30utils_test_case no_args 31no_args_body() { 32 cat >Kyuafile <<EOF 33syntax(2) 34test_suite("integration") 35atf_test_program{name="metadata"} 36atf_test_program{name="simple_all_pass"} 37include("subdir/Kyuafile") 38EOF 39 utils_cp_helper metadata . 40 utils_cp_helper simple_all_pass . 41 42 mkdir subdir 43 cat >subdir/Kyuafile <<EOF 44syntax(2) 45test_suite("integration2") 46atf_test_program{name="simple_some_fail"} 47EOF 48 utils_cp_helper simple_some_fail subdir 49 50 cat >expout <<EOF 51metadata:many_properties 52metadata:no_properties 53metadata:one_property 54metadata:with_cleanup 55simple_all_pass:pass 56simple_all_pass:skip 57subdir/simple_some_fail:fail 58subdir/simple_some_fail:pass 59EOF 60 atf_check -s exit:0 -o file:expout -e empty kyua list 61} 62 63 64utils_test_case one_arg__subdir 65one_arg__subdir_body() { 66 cat >Kyuafile <<EOF 67syntax(2) 68test_suite("top-level") 69include("subdir/Kyuafile") 70EOF 71 72 mkdir subdir 73 cat >subdir/Kyuafile <<EOF 74syntax(2) 75test_suite("in-subdir") 76atf_test_program{name="simple_all_pass"} 77EOF 78 utils_cp_helper simple_all_pass subdir 79 80 cat >expout <<EOF 81subdir/simple_all_pass:pass 82subdir/simple_all_pass:skip 83EOF 84 atf_check -s exit:0 -o file:expout -e empty kyua list subdir 85} 86 87 88utils_test_case one_arg__test_case 89one_arg__test_case_body() { 90 cat >Kyuafile <<EOF 91syntax(2) 92test_suite("top-level") 93atf_test_program{name="first"} 94atf_test_program{name="second"} 95EOF 96 utils_cp_helper simple_all_pass first 97 utils_cp_helper simple_all_pass second 98 99 cat >expout <<EOF 100first:skip 101EOF 102 atf_check -s exit:0 -o file:expout -e empty kyua list first:skip 103} 104 105 106utils_test_case one_arg__test_program 107one_arg__test_program_body() { 108 cat >Kyuafile <<EOF 109syntax(2) 110test_suite("top-level") 111atf_test_program{name="first"} 112atf_test_program{name="second"} 113EOF 114 utils_cp_helper simple_all_pass first 115 utils_cp_helper simple_some_fail second 116 117 cat >expout <<EOF 118second:fail 119second:pass 120EOF 121 atf_check -s exit:0 -o file:expout -e empty kyua list second 122} 123 124 125utils_test_case one_arg__invalid 126one_arg__invalid_body() { 127cat >experr <<EOF 128kyua: E: Test case component in 'foo:' is empty. 129EOF 130 atf_check -s exit:2 -o empty -e file:experr kyua list foo: 131 132cat >experr <<EOF 133kyua: E: Program name '/a/b' must be relative to the test suite, not absolute. 134EOF 135 atf_check -s exit:2 -o empty -e file:experr kyua list /a/b 136} 137 138 139utils_test_case many_args__ok 140many_args__ok_body() { 141 cat >Kyuafile <<EOF 142syntax(2) 143test_suite("top-level") 144include("subdir/Kyuafile") 145atf_test_program{name="first"} 146EOF 147 utils_cp_helper simple_all_pass first 148 149 mkdir subdir 150 cat >subdir/Kyuafile <<EOF 151syntax(2) 152test_suite("in-subdir") 153atf_test_program{name="second"} 154EOF 155 utils_cp_helper simple_some_fail subdir/second 156 157 cat >expout <<EOF 158subdir/second:fail (in-subdir) 159subdir/second:pass (in-subdir) 160first:pass (top-level) 161EOF 162 atf_check -s exit:0 -o file:expout -e empty kyua list -v subdir first:pass 163} 164 165 166utils_test_case many_args__invalid 167many_args__invalid_body() { 168cat >experr <<EOF 169kyua: E: Program name component in ':badbad' is empty. 170EOF 171 atf_check -s exit:2 -o empty -e file:experr kyua list this-is-ok :badbad 172 173cat >experr <<EOF 174kyua: E: Program name '/foo' must be relative to the test suite, not absolute. 175EOF 176 atf_check -s exit:2 -o empty -e file:experr kyua list this-is-ok /foo 177} 178 179 180utils_test_case many_args__no_match__all 181many_args__no_match__all_body() { 182 cat >Kyuafile <<EOF 183syntax(2) 184test_suite("top-level") 185atf_test_program{name="first"} 186atf_test_program{name="second"} 187EOF 188 utils_cp_helper simple_all_pass first 189 utils_cp_helper simple_all_pass second 190 191 cat >experr <<EOF 192kyua: W: No test cases matched by the filter 'first1'. 193EOF 194 atf_check -s exit:1 -o empty -e file:experr kyua list first1 195} 196 197 198utils_test_case many_args__no_match__some 199many_args__no_match__some_body() { 200 cat >Kyuafile <<EOF 201syntax(2) 202test_suite("top-level") 203atf_test_program{name="first"} 204atf_test_program{name="second"} 205atf_test_program{name="third"} 206EOF 207 utils_cp_helper simple_all_pass first 208 utils_cp_helper simple_all_pass second 209 utils_cp_helper simple_some_fail third 210 211 cat >expout <<EOF 212first:pass 213first:skip 214third:fail 215third:pass 216EOF 217 218 cat >experr <<EOF 219kyua: W: No test cases matched by the filter 'fifth'. 220kyua: W: No test cases matched by the filter 'fourth'. 221EOF 222 atf_check -s exit:1 -o file:expout -e file:experr kyua list first fourth \ 223 third fifth 224} 225 226 227utils_test_case args_are_relative 228args_are_relative_body() { 229 mkdir root 230 cat >root/Kyuafile <<EOF 231syntax(2) 232test_suite("integration-1") 233atf_test_program{name="first"} 234atf_test_program{name="second"} 235include("subdir/Kyuafile") 236EOF 237 utils_cp_helper simple_all_pass root/first 238 utils_cp_helper simple_some_fail root/second 239 240 mkdir root/subdir 241 cat >root/subdir/Kyuafile <<EOF 242syntax(2) 243test_suite("integration-2") 244atf_test_program{name="third"} 245atf_test_program{name="fourth"} 246EOF 247 utils_cp_helper simple_all_pass root/subdir/third 248 utils_cp_helper simple_some_fail root/subdir/fourth 249 250 cat >expout <<EOF 251first:pass (integration-1) 252first:skip (integration-1) 253subdir/fourth:fail (integration-2) 254EOF 255 atf_check -s exit:0 -o file:expout -e empty kyua list \ 256 -v -k "$(pwd)/root/Kyuafile" first subdir/fourth:fail 257} 258 259 260utils_test_case only_load_used_test_programs 261only_load_used_test_programs_body() { 262 cat >Kyuafile <<EOF 263syntax(2) 264test_suite("integration") 265atf_test_program{name="first"} 266atf_test_program{name="second"} 267EOF 268 utils_cp_helper simple_all_pass first 269 utils_cp_helper bad_test_program second 270 271 cat >expout <<EOF 272first:pass 273first:skip 274EOF 275 CREATE_COOKIE="$(pwd)/cookie"; export CREATE_COOKIE 276 atf_check -s exit:0 -o file:expout -e empty kyua list first 277 if [ -f "${CREATE_COOKIE}" ]; then 278 atf_fail "An unmatched test case has been executed, which harms" \ 279 "performance" 280 fi 281} 282 283 284utils_test_case config_behavior 285config_behavior_body() { 286 cat >"my-config" <<EOF 287syntax(2) 288test_suites.suite1["the-variable"] = "value1" 289EOF 290 291 cat >Kyuafile <<EOF 292syntax(2) 293atf_test_program{name="config1", test_suite="suite1"} 294EOF 295 utils_cp_helper config config1 296 297 CONFIG_VAR_FILE="$(pwd)/cookie"; export CONFIG_VAR_FILE 298 if [ -f "${CONFIG_VAR_FILE}" ]; then 299 atf_fail "Cookie file already created; test case list may have gotten" \ 300 "a bad configuration" 301 fi 302 atf_check -s exit:0 -o ignore -e empty kyua -c my-config list 303 [ -f "${CONFIG_VAR_FILE}" ] || \ 304 atf_fail "Cookie file not created; test case list did not get" \ 305 "configuration variables" 306 value="$(cat "${CONFIG_VAR_FILE}")" 307 [ "${value}" = "value1" ] || \ 308 atf_fail "Invalid value (${value}) in cookie file; test case list did" \ 309 "not get the correct configuration variables" 310} 311 312 313utils_test_case build_root_flag 314build_root_flag_body() { 315 mkdir subdir 316 mkdir build 317 mkdir build/subdir 318 319 cat >Kyuafile <<EOF 320syntax(2) 321test_suite("top-level") 322include("subdir/Kyuafile") 323atf_test_program{name="first"} 324EOF 325 echo 'invalid' >first 326 utils_cp_helper simple_all_pass build/first 327 328 cat >subdir/Kyuafile <<EOF 329syntax(2) 330test_suite("in-subdir") 331atf_test_program{name="second"} 332EOF 333 echo 'invalid' >subdir/second 334 utils_cp_helper simple_some_fail build/subdir/second 335 336 cat >expout <<EOF 337subdir/second:fail 338subdir/second:pass 339first:pass 340EOF 341 atf_check -s exit:0 -o file:expout -e empty kyua list --build-root=build \ 342 subdir first:pass 343} 344 345 346utils_test_case kyuafile_flag__no_args 347kyuafile_flag__no_args_body() { 348 cat >Kyuafile <<EOF 349This file is bogus but it is not loaded. 350EOF 351 352 cat >myfile <<EOF 353syntax(2) 354test_suite("integration") 355atf_test_program{name="sometest"} 356EOF 357 utils_cp_helper simple_all_pass sometest 358 359 cat >expout <<EOF 360sometest:pass 361sometest:skip 362EOF 363 atf_check -s exit:0 -o file:expout -e empty kyua list -k myfile 364 atf_check -s exit:0 -o file:expout -e empty kyua list --kyuafile=myfile 365} 366 367 368utils_test_case kyuafile_flag__some_args 369kyuafile_flag__some_args_body() { 370 cat >Kyuafile <<EOF 371This file is bogus but it is not loaded. 372EOF 373 374 cat >myfile <<EOF 375syntax(2) 376test_suite("hello-world") 377atf_test_program{name="sometest"} 378EOF 379 utils_cp_helper simple_all_pass sometest 380 381 cat >expout <<EOF 382sometest:pass (hello-world) 383sometest:skip (hello-world) 384EOF 385 atf_check -s exit:0 -o file:expout -e empty kyua list -v -k myfile sometest 386 atf_check -s exit:0 -o file:expout -e empty kyua list -v --kyuafile=myfile \ 387 sometest 388} 389 390 391utils_test_case verbose_flag 392verbose_flag_body() { 393 cat >Kyuafile <<EOF 394syntax(2) 395test_suite("integration-suite-1") 396atf_test_program{name="simple_all_pass"} 397plain_test_program{name="i_am_plain", timeout=654} 398include("subdir/Kyuafile") 399EOF 400 utils_cp_helper simple_all_pass . 401 touch i_am_plain 402 403 mkdir subdir 404 cat >subdir/Kyuafile <<EOF 405syntax(2) 406test_suite("integration-suite-2") 407atf_test_program{name="metadata"} 408EOF 409 utils_cp_helper metadata subdir 410 411 cat >expout <<EOF 412simple_all_pass:pass (integration-suite-1) 413simple_all_pass:skip (integration-suite-1) 414i_am_plain:main (integration-suite-1) 415 timeout = 654 416subdir/metadata:many_properties (integration-suite-2) 417 allowed_architectures = some-architecture 418 allowed_platforms = some-platform 419 custom.no-meaning = I am a custom variable 420 description = A description with some padding 421 required_configs = var1 var2 var3 422 required_files = /my/file1 /some/other/file 423 required_programs = /nonexistent/bin3 bin1 bin2 424 required_user = root 425subdir/metadata:no_properties (integration-suite-2) 426subdir/metadata:one_property (integration-suite-2) 427 description = Does nothing but has one metadata property 428subdir/metadata:with_cleanup (integration-suite-2) 429 has_cleanup = true 430 timeout = 250 431EOF 432 atf_check -s exit:0 -o file:expout -e empty kyua list -v 433 atf_check -s exit:0 -o file:expout -e empty kyua list --verbose 434} 435 436 437utils_test_case no_test_program_match 438no_test_program_match_body() { 439 cat >Kyuafile <<EOF 440syntax(2) 441test_suite("integration") 442atf_test_program{name="first"} 443EOF 444 utils_cp_helper simple_all_pass first 445 utils_cp_helper simple_all_pass second 446 447 cat >experr <<EOF 448kyua: W: No test cases matched by the filter 'second'. 449EOF 450 atf_check -s exit:1 -o empty -e file:experr kyua list second 451} 452 453 454utils_test_case no_test_case_match 455no_test_case_match_body() { 456 cat >Kyuafile <<EOF 457syntax(2) 458test_suite("integration") 459atf_test_program{name="first"} 460EOF 461 utils_cp_helper simple_all_pass first 462 463 cat >experr <<EOF 464kyua: W: No test cases matched by the filter 'first:foobar'. 465EOF 466 atf_check -s exit:1 -o empty -e file:experr kyua list first:foobar 467} 468 469 470utils_test_case missing_kyuafile__no_args 471missing_kyuafile__no_args_body() { 472 cat >experr <<EOF 473kyua: E: Load of 'Kyuafile' failed: File 'Kyuafile' not found. 474EOF 475 atf_check -s exit:2 -o empty -e file:experr kyua list 476} 477 478 479utils_test_case missing_kyuafile__test_program 480missing_kyuafile__test_program_body() { 481 mkdir subdir 482 cat >subdir/Kyuafile <<EOF 483syntax(2) 484test_suite("integration") 485atf_test_program{name="unused"} 486EOF 487 utils_cp_helper simple_all_pass subdir/unused 488 489 cat >experr <<EOF 490kyua: E: Load of 'Kyuafile' failed: File 'Kyuafile' not found. 491EOF 492 atf_check -s exit:2 -o empty -e file:experr kyua list subdir/unused 493} 494 495 496utils_test_case missing_kyuafile__subdir 497missing_kyuafile__subdir_body() { 498 mkdir subdir 499 cat >subdir/Kyuafile <<EOF 500syntax(2) 501test_suite("integration") 502atf_test_program{name="unused"} 503EOF 504 utils_cp_helper simple_all_pass subdir/unused 505 506 cat >experr <<EOF 507kyua: E: Load of 'Kyuafile' failed: File 'Kyuafile' not found. 508EOF 509 atf_check -s exit:2 -o empty -e file:experr kyua list subdir 510} 511 512 513utils_test_case bogus_kyuafile 514bogus_kyuafile_body() { 515 cat >Kyuafile <<EOF 516Hello, world. 517EOF 518 atf_check -s exit:2 -o empty \ 519 -e match:"Load of 'Kyuafile' failed: .* Kyuafile:2:" kyua list 520} 521 522 523utils_test_case bogus_test_program 524bogus_test_program_body() { 525 cat >Kyuafile <<EOF 526syntax(2) 527test_suite("integration") 528atf_test_program{name="crash_on_list"} 529atf_test_program{name="non_executable"} 530EOF 531 utils_cp_helper bad_test_program crash_on_list 532 echo 'I am not executable' >non_executable 533 534 cat >expout <<EOF 535crash_on_list:__test_cases_list__ 536non_executable:__test_cases_list__ 537EOF 538 atf_check -s exit:0 -o file:expout -e empty kyua list 539} 540 541 542utils_test_case missing_test_program 543missing_test_program_body() { 544 cat >Kyuafile <<EOF 545syntax(2) 546include("subdir/Kyuafile") 547EOF 548 mkdir subdir 549 cat >subdir/Kyuafile <<EOF 550syntax(2) 551test_suite("integration") 552atf_test_program{name="ok"} 553atf_test_program{name="i-am-missing"} 554EOF 555 echo 'I should not be touched because the Kyuafile is bogus' >subdir/ok 556 557# CHECK_STYLE_DISABLE 558 cat >experr <<EOF 559kyua: E: Load of 'Kyuafile' failed: .*Non-existent test program 'subdir/i-am-missing'. 560EOF 561# CHECK_STYLE_ENABLE 562 atf_check -s exit:2 -o empty -e "match:$(cat experr)" kyua list 563} 564 565 566atf_init_test_cases() { 567 atf_add_test_case no_args 568 atf_add_test_case one_arg__subdir 569 atf_add_test_case one_arg__test_case 570 atf_add_test_case one_arg__test_program 571 atf_add_test_case one_arg__invalid 572 atf_add_test_case many_args__ok 573 atf_add_test_case many_args__invalid 574 atf_add_test_case many_args__no_match__all 575 atf_add_test_case many_args__no_match__some 576 577 atf_add_test_case args_are_relative 578 579 atf_add_test_case only_load_used_test_programs 580 581 atf_add_test_case config_behavior 582 583 atf_add_test_case build_root_flag 584 585 atf_add_test_case kyuafile_flag__no_args 586 atf_add_test_case kyuafile_flag__some_args 587 588 atf_add_test_case verbose_flag 589 590 atf_add_test_case no_test_program_match 591 atf_add_test_case no_test_case_match 592 593 atf_add_test_case missing_kyuafile__no_args 594 atf_add_test_case missing_kyuafile__test_program 595 atf_add_test_case missing_kyuafile__subdir 596 597 atf_add_test_case bogus_kyuafile 598 atf_add_test_case bogus_test_program 599 atf_add_test_case missing_test_program 600} 601