1 /* 2 * Automated Testing Framework (atf) 3 * 4 * Copyright (c) 2007, 2008, 2009, 2010 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 17 * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 18 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 23 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 26 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30 #include <sys/types.h> 31 #include <sys/wait.h> 32 #include <fcntl.h> 33 #include <unistd.h> 34 35 #include <signal.h> 36 #include <stdio.h> 37 #include <stdlib.h> 38 #include <string.h> 39 40 #include <atf-c.h> 41 42 #include "atf-c/env.h" 43 #include "atf-c/error.h" 44 #include "atf-c/fs.h" 45 #include "atf-c/text.h" 46 47 #include "atf-c/test_helpers.h" 48 49 /* --------------------------------------------------------------------- 50 * Auxiliary functions. 51 * --------------------------------------------------------------------- */ 52 53 static 54 void 55 safe_remove(const char* path) 56 { 57 if (unlink(path) == -1) 58 atf_tc_fail("unlink(2) of %s failed", path); 59 } 60 61 static 62 void 63 touch(const char *path) 64 { 65 int fd; 66 fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, 0644); 67 if (fd == -1) 68 atf_tc_fail("Could not create file %s", path); 69 close(fd); 70 } 71 72 /* --------------------------------------------------------------------- 73 * Helper tests for "t_cleanup". 74 * --------------------------------------------------------------------- */ 75 76 ATF_TC_WITH_CLEANUP(cleanup_pass); 77 ATF_TC_HEAD(cleanup_pass, tc) 78 { 79 atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test " 80 "program"); 81 } 82 ATF_TC_BODY(cleanup_pass, tc) 83 { 84 touch(atf_tc_get_config_var(tc, "tmpfile")); 85 } 86 ATF_TC_CLEANUP(cleanup_pass, tc) 87 { 88 bool cleanup; 89 90 RE(atf_text_to_bool(atf_tc_get_config_var(tc, "cleanup"), &cleanup)); 91 92 if (cleanup) 93 safe_remove(atf_tc_get_config_var(tc, "tmpfile")); 94 } 95 96 ATF_TC_WITH_CLEANUP(cleanup_fail); 97 ATF_TC_HEAD(cleanup_fail, tc) 98 { 99 atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test " 100 "program"); 101 } 102 ATF_TC_BODY(cleanup_fail, tc) 103 { 104 touch(atf_tc_get_config_var(tc, "tmpfile")); 105 atf_tc_fail("On purpose"); 106 } 107 ATF_TC_CLEANUP(cleanup_fail, tc) 108 { 109 bool cleanup; 110 111 RE(atf_text_to_bool(atf_tc_get_config_var(tc, "cleanup"), &cleanup)); 112 113 if (cleanup) 114 safe_remove(atf_tc_get_config_var(tc, "tmpfile")); 115 } 116 117 ATF_TC_WITH_CLEANUP(cleanup_skip); 118 ATF_TC_HEAD(cleanup_skip, tc) 119 { 120 atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test " 121 "program"); 122 } 123 ATF_TC_BODY(cleanup_skip, tc) 124 { 125 touch(atf_tc_get_config_var(tc, "tmpfile")); 126 atf_tc_skip("On purpose"); 127 } 128 ATF_TC_CLEANUP(cleanup_skip, tc) 129 { 130 bool cleanup; 131 132 RE(atf_text_to_bool(atf_tc_get_config_var(tc, "cleanup"), &cleanup)); 133 134 if (cleanup) 135 safe_remove(atf_tc_get_config_var(tc, "tmpfile")); 136 } 137 138 ATF_TC_WITH_CLEANUP(cleanup_curdir); 139 ATF_TC_HEAD(cleanup_curdir, tc) 140 { 141 atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test " 142 "program"); 143 } 144 ATF_TC_BODY(cleanup_curdir, tc) 145 { 146 FILE *f; 147 148 f = fopen("oldvalue", "w"); 149 if (f == NULL) 150 atf_tc_fail("Failed to create oldvalue file"); 151 fprintf(f, "1234"); 152 fclose(f); 153 } 154 ATF_TC_CLEANUP(cleanup_curdir, tc) 155 { 156 FILE *f; 157 158 f = fopen("oldvalue", "r"); 159 if (f != NULL) { 160 int i; 161 if (fscanf(f, "%d", &i) != 1) 162 fprintf(stderr, "Failed to read old value\n"); 163 else 164 printf("Old value: %d", i); 165 fclose(f); 166 } 167 } 168 169 ATF_TC_WITH_CLEANUP(cleanup_sigterm); 170 ATF_TC_HEAD(cleanup_sigterm, tc) 171 { 172 atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test " 173 "program"); 174 } 175 ATF_TC_BODY(cleanup_sigterm, tc) 176 { 177 char *nofile; 178 179 touch(atf_tc_get_config_var(tc, "tmpfile")); 180 kill(getpid(), SIGTERM); 181 182 RE(atf_text_format(&nofile, "%s.no", 183 atf_tc_get_config_var(tc, "tmpfile"))); 184 touch(nofile); 185 free(nofile); 186 } 187 ATF_TC_CLEANUP(cleanup_sigterm, tc) 188 { 189 safe_remove(atf_tc_get_config_var(tc, "tmpfile")); 190 } 191 192 ATF_TC_WITH_CLEANUP(cleanup_fork); 193 ATF_TC_HEAD(cleanup_fork, tc) 194 { 195 atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test " 196 "program"); 197 } 198 ATF_TC_BODY(cleanup_fork, tc) 199 { 200 } 201 ATF_TC_CLEANUP(cleanup_fork, tc) 202 { 203 close(STDOUT_FILENO); 204 close(STDERR_FILENO); 205 close(3); 206 } 207 208 /* --------------------------------------------------------------------- 209 * Helper tests for "t_config". 210 * --------------------------------------------------------------------- */ 211 212 ATF_TC(config_unset); 213 ATF_TC_HEAD(config_unset, tc) 214 { 215 atf_tc_set_md_var(tc, "descr", "Helper test case for the t_config test " 216 "program"); 217 } 218 ATF_TC_BODY(config_unset, tc) 219 { 220 ATF_REQUIRE(!atf_tc_has_config_var(tc, "test")); 221 } 222 223 ATF_TC(config_empty); 224 ATF_TC_HEAD(config_empty, tc) 225 { 226 atf_tc_set_md_var(tc, "descr", "Helper test case for the t_config test " 227 "program"); 228 } 229 ATF_TC_BODY(config_empty, tc) 230 { 231 ATF_REQUIRE(atf_tc_has_config_var(tc, "test")); 232 ATF_REQUIRE(strlen(atf_tc_get_config_var(tc, "test")) == 0); 233 } 234 235 ATF_TC(config_value); 236 ATF_TC_HEAD(config_value, tc) 237 { 238 atf_tc_set_md_var(tc, "descr", "Helper test case for the t_config test " 239 "program"); 240 } 241 ATF_TC_BODY(config_value, tc) 242 { 243 ATF_REQUIRE(atf_tc_has_config_var(tc, "test")); 244 ATF_REQUIRE(strcmp(atf_tc_get_config_var(tc, "test"), "foo") == 0); 245 } 246 247 ATF_TC(config_multi_value); 248 ATF_TC_HEAD(config_multi_value, tc) 249 { 250 atf_tc_set_md_var(tc, "descr", "Helper test case for the t_config test " 251 "program"); 252 } 253 ATF_TC_BODY(config_multi_value, tc) 254 { 255 ATF_REQUIRE(atf_tc_has_config_var(tc, "test")); 256 ATF_REQUIRE(strcmp(atf_tc_get_config_var(tc, "test"), "foo bar") == 0); 257 } 258 259 /* --------------------------------------------------------------------- 260 * Helper tests for "t_expect". 261 * --------------------------------------------------------------------- */ 262 263 ATF_TC_WITHOUT_HEAD(expect_pass_and_pass); 264 ATF_TC_BODY(expect_pass_and_pass, tc) 265 { 266 atf_tc_expect_pass(); 267 268 } 269 270 ATF_TC_WITHOUT_HEAD(expect_pass_but_fail_requirement); 271 ATF_TC_BODY(expect_pass_but_fail_requirement, tc) 272 { 273 atf_tc_expect_pass(); 274 atf_tc_fail("Some reason"); 275 } 276 277 ATF_TC_WITHOUT_HEAD(expect_pass_but_fail_check); 278 ATF_TC_BODY(expect_pass_but_fail_check, tc) 279 { 280 atf_tc_expect_pass(); 281 atf_tc_fail_nonfatal("Some reason"); 282 } 283 284 ATF_TC_WITHOUT_HEAD(expect_fail_and_fail_requirement); 285 ATF_TC_BODY(expect_fail_and_fail_requirement, tc) 286 { 287 atf_tc_expect_fail("Fail %s", "reason"); 288 atf_tc_fail("The failure"); 289 atf_tc_expect_pass(); 290 } 291 292 ATF_TC_WITHOUT_HEAD(expect_fail_and_fail_check); 293 ATF_TC_BODY(expect_fail_and_fail_check, tc) 294 { 295 atf_tc_expect_fail("Fail first"); 296 atf_tc_fail_nonfatal("abc"); 297 atf_tc_expect_pass(); 298 299 atf_tc_expect_fail("And fail again"); 300 atf_tc_fail_nonfatal("def"); 301 atf_tc_expect_pass(); 302 } 303 304 ATF_TC_WITHOUT_HEAD(expect_fail_but_pass); 305 ATF_TC_BODY(expect_fail_but_pass, tc) 306 { 307 atf_tc_expect_fail("Fail first"); 308 atf_tc_fail_nonfatal("abc"); 309 atf_tc_expect_pass(); 310 311 atf_tc_expect_fail("Will not fail"); 312 atf_tc_expect_pass(); 313 314 atf_tc_expect_fail("And fail again"); 315 atf_tc_fail_nonfatal("def"); 316 atf_tc_expect_pass(); 317 } 318 319 ATF_TC_WITHOUT_HEAD(expect_exit_any_and_exit); 320 ATF_TC_BODY(expect_exit_any_and_exit, tc) 321 { 322 atf_tc_expect_exit(-1, "Call will exit"); 323 exit(EXIT_SUCCESS); 324 } 325 326 ATF_TC_WITHOUT_HEAD(expect_exit_code_and_exit); 327 ATF_TC_BODY(expect_exit_code_and_exit, tc) 328 { 329 atf_tc_expect_exit(123, "Call will exit"); 330 exit(123); 331 } 332 333 ATF_TC_WITHOUT_HEAD(expect_exit_but_pass); 334 ATF_TC_BODY(expect_exit_but_pass, tc) 335 { 336 atf_tc_expect_exit(-1, "Call won't exit"); 337 } 338 339 ATF_TC_WITHOUT_HEAD(expect_signal_any_and_signal); 340 ATF_TC_BODY(expect_signal_any_and_signal, tc) 341 { 342 atf_tc_expect_signal(-1, "Call will signal"); 343 kill(getpid(), SIGKILL); 344 } 345 346 ATF_TC_WITHOUT_HEAD(expect_signal_no_and_signal); 347 ATF_TC_BODY(expect_signal_no_and_signal, tc) 348 { 349 atf_tc_expect_signal(SIGHUP, "Call will signal"); 350 kill(getpid(), SIGHUP); 351 } 352 353 ATF_TC_WITHOUT_HEAD(expect_signal_but_pass); 354 ATF_TC_BODY(expect_signal_but_pass, tc) 355 { 356 atf_tc_expect_signal(-1, "Call won't signal"); 357 } 358 359 ATF_TC_WITHOUT_HEAD(expect_death_and_exit); 360 ATF_TC_BODY(expect_death_and_exit, tc) 361 { 362 atf_tc_expect_death("Exit case"); 363 exit(123); 364 } 365 366 ATF_TC_WITHOUT_HEAD(expect_death_and_signal); 367 ATF_TC_BODY(expect_death_and_signal, tc) 368 { 369 atf_tc_expect_death("Signal case"); 370 kill(getpid(), SIGKILL); 371 } 372 373 ATF_TC_WITHOUT_HEAD(expect_death_but_pass); 374 ATF_TC_BODY(expect_death_but_pass, tc) 375 { 376 atf_tc_expect_death("Call won't die"); 377 } 378 379 ATF_TC(expect_timeout_and_hang); 380 ATF_TC_HEAD(expect_timeout_and_hang, tc) 381 { 382 atf_tc_set_md_var(tc, "timeout", "1"); 383 } 384 ATF_TC_BODY(expect_timeout_and_hang, tc) 385 { 386 atf_tc_expect_timeout("Will overrun"); 387 sleep(5); 388 } 389 390 ATF_TC(expect_timeout_but_pass); 391 ATF_TC_HEAD(expect_timeout_but_pass, tc) 392 { 393 atf_tc_set_md_var(tc, "timeout", "1"); 394 } 395 ATF_TC_BODY(expect_timeout_but_pass, tc) 396 { 397 atf_tc_expect_timeout("Will just exit"); 398 } 399 400 /* --------------------------------------------------------------------- 401 * Helper tests for "t_fork". 402 * --------------------------------------------------------------------- */ 403 404 ATF_TC(fork_stop); 405 ATF_TC_HEAD(fork_stop, tc) 406 { 407 atf_tc_set_md_var(tc, "descr", "Helper test case for the t_fork test " 408 "program"); 409 } 410 ATF_TC_BODY(fork_stop, tc) 411 { 412 FILE *f; 413 const char *dfstr, *pfstr; 414 415 dfstr = atf_tc_get_config_var(tc, "donefile"); 416 pfstr = atf_tc_get_config_var(tc, "pidfile"); 417 418 f = fopen(pfstr, "w"); 419 if (f == NULL) 420 atf_tc_fail("Failed to create pidfile %s", pfstr); 421 fprintf(f, "%d", (int)getpid()); 422 fclose(f); 423 printf("Wrote pid file\n"); 424 425 printf("Waiting for done file\n"); 426 while (access(dfstr, F_OK) != 0) 427 usleep(10000); 428 printf("Exiting\n"); 429 } 430 431 /* --------------------------------------------------------------------- 432 * Helper tests for "t_meta_data". 433 * --------------------------------------------------------------------- */ 434 435 ATF_TC(metadata_no_descr); 436 ATF_TC_HEAD(metadata_no_descr, tc) 437 { 438 } 439 ATF_TC_BODY(metadata_no_descr, tc) 440 { 441 } 442 443 ATF_TC_WITHOUT_HEAD(metadata_no_head); 444 ATF_TC_BODY(metadata_no_head, tc) 445 { 446 } 447 448 /* --------------------------------------------------------------------- 449 * Helper tests for "t_srcdir". 450 * --------------------------------------------------------------------- */ 451 452 ATF_TC(srcdir_exists); 453 ATF_TC_HEAD(srcdir_exists, tc) 454 { 455 atf_tc_set_md_var(tc, "descr", "Helper test case for the t_srcdir test " 456 "program"); 457 } 458 ATF_TC_BODY(srcdir_exists, tc) 459 { 460 atf_fs_path_t p; 461 bool b; 462 463 RE(atf_fs_path_init_fmt(&p, "%s/datafile", 464 atf_tc_get_config_var(tc, "srcdir"))); 465 RE(atf_fs_exists(&p, &b)); 466 atf_fs_path_fini(&p); 467 if (!b) 468 atf_tc_fail("Cannot find datafile"); 469 } 470 471 /* --------------------------------------------------------------------- 472 * Helper tests for "t_result". 473 * --------------------------------------------------------------------- */ 474 475 ATF_TC(result_pass); 476 ATF_TC_HEAD(result_pass, tc) { } 477 ATF_TC_BODY(result_pass, tc) 478 { 479 printf("msg\n"); 480 } 481 482 ATF_TC(result_fail); 483 ATF_TC_HEAD(result_fail, tc) { } 484 ATF_TC_BODY(result_fail, tc) 485 { 486 printf("msg\n"); 487 atf_tc_fail("Failure reason"); 488 } 489 490 ATF_TC(result_skip); 491 ATF_TC_HEAD(result_skip, tc) { } 492 ATF_TC_BODY(result_skip, tc) 493 { 494 printf("msg\n"); 495 atf_tc_skip("Skipped reason"); 496 } 497 498 ATF_TC(result_newlines_fail); 499 ATF_TC_HEAD(result_newlines_fail, tc) 500 { 501 atf_tc_set_md_var(tc, "descr", "Helper test case for the t_result test " 502 "program"); 503 } 504 ATF_TC_BODY(result_newlines_fail, tc) 505 { 506 atf_tc_fail("First line\nSecond line"); 507 } 508 509 ATF_TC(result_newlines_skip); 510 ATF_TC_HEAD(result_newlines_skip, tc) 511 { 512 atf_tc_set_md_var(tc, "descr", "Helper test case for the t_result test " 513 "program"); 514 } 515 ATF_TC_BODY(result_newlines_skip, tc) 516 { 517 atf_tc_skip("First line\nSecond line"); 518 } 519 520 /* --------------------------------------------------------------------- 521 * Main. 522 * --------------------------------------------------------------------- */ 523 524 ATF_TP_ADD_TCS(tp) 525 { 526 /* Add helper tests for t_cleanup. */ 527 ATF_TP_ADD_TC(tp, cleanup_pass); 528 ATF_TP_ADD_TC(tp, cleanup_fail); 529 ATF_TP_ADD_TC(tp, cleanup_skip); 530 ATF_TP_ADD_TC(tp, cleanup_curdir); 531 ATF_TP_ADD_TC(tp, cleanup_sigterm); 532 ATF_TP_ADD_TC(tp, cleanup_fork); 533 534 /* Add helper tests for t_config. */ 535 ATF_TP_ADD_TC(tp, config_unset); 536 ATF_TP_ADD_TC(tp, config_empty); 537 ATF_TP_ADD_TC(tp, config_value); 538 ATF_TP_ADD_TC(tp, config_multi_value); 539 540 /* Add helper tests for t_expect. */ 541 ATF_TP_ADD_TC(tp, expect_pass_and_pass); 542 ATF_TP_ADD_TC(tp, expect_pass_but_fail_requirement); 543 ATF_TP_ADD_TC(tp, expect_pass_but_fail_check); 544 ATF_TP_ADD_TC(tp, expect_fail_and_fail_requirement); 545 ATF_TP_ADD_TC(tp, expect_fail_and_fail_check); 546 ATF_TP_ADD_TC(tp, expect_fail_but_pass); 547 ATF_TP_ADD_TC(tp, expect_exit_any_and_exit); 548 ATF_TP_ADD_TC(tp, expect_exit_code_and_exit); 549 ATF_TP_ADD_TC(tp, expect_exit_but_pass); 550 ATF_TP_ADD_TC(tp, expect_signal_any_and_signal); 551 ATF_TP_ADD_TC(tp, expect_signal_no_and_signal); 552 ATF_TP_ADD_TC(tp, expect_signal_but_pass); 553 ATF_TP_ADD_TC(tp, expect_death_and_exit); 554 ATF_TP_ADD_TC(tp, expect_death_and_signal); 555 ATF_TP_ADD_TC(tp, expect_death_but_pass); 556 ATF_TP_ADD_TC(tp, expect_timeout_and_hang); 557 ATF_TP_ADD_TC(tp, expect_timeout_but_pass); 558 559 /* Add helper tests for t_fork. */ 560 ATF_TP_ADD_TC(tp, fork_stop); 561 562 /* Add helper tests for t_meta_data. */ 563 ATF_TP_ADD_TC(tp, metadata_no_descr); 564 ATF_TP_ADD_TC(tp, metadata_no_head); 565 566 /* Add helper tests for t_srcdir. */ 567 ATF_TP_ADD_TC(tp, srcdir_exists); 568 569 /* Add helper tests for t_result. */ 570 ATF_TP_ADD_TC(tp, result_pass); 571 ATF_TP_ADD_TC(tp, result_fail); 572 ATF_TP_ADD_TC(tp, result_skip); 573 ATF_TP_ADD_TC(tp, result_newlines_fail); 574 ATF_TP_ADD_TC(tp, result_newlines_skip); 575 576 return atf_no_error(); 577 } 578