Path: blob/main/contrib/atf/test-programs/c_helpers.c
39534 views
/* Copyright (c) 2007 The NetBSD Foundation, Inc.1* All rights reserved.2*3* Redistribution and use in source and binary forms, with or without4* modification, are permitted provided that the following conditions5* are met:6* 1. Redistributions of source code must retain the above copyright7* notice, this list of conditions and the following disclaimer.8* 2. Redistributions in binary form must reproduce the above copyright9* notice, this list of conditions and the following disclaimer in the10* documentation and/or other materials provided with the distribution.11*12* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND13* CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,14* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF15* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.16* IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY17* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL18* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE19* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS20* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER21* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR22* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN23* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */2425#include <sys/types.h>26#include <sys/wait.h>27#include <fcntl.h>28#include <unistd.h>2930#include <signal.h>31#include <stdio.h>32#include <stdlib.h>33#include <string.h>3435#include <atf-c.h>3637#include "atf-c/detail/env.h"38#include "atf-c/detail/fs.h"39#include "atf-c/detail/test_helpers.h"40#include "atf-c/detail/text.h"41#include "atf-c/error.h"4243/* ---------------------------------------------------------------------44* Auxiliary functions.45* --------------------------------------------------------------------- */4647static48void49safe_remove(const char* path)50{51if (unlink(path) == -1)52atf_tc_fail("unlink(2) of %s failed", path);53}5455static56void57touch(const char *path)58{59int fd;60fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, 0644);61if (fd == -1)62atf_tc_fail("Could not create file %s", path);63close(fd);64}6566/* ---------------------------------------------------------------------67* Helper tests for "t_cleanup".68* --------------------------------------------------------------------- */6970ATF_TC_WITH_CLEANUP(cleanup_pass);71ATF_TC_HEAD(cleanup_pass, tc)72{73atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test "74"program");75}76ATF_TC_BODY(cleanup_pass, tc)77{78touch(atf_tc_get_config_var(tc, "tmpfile"));79}80ATF_TC_CLEANUP(cleanup_pass, tc)81{82if (atf_tc_get_config_var_as_bool(tc, "cleanup"))83safe_remove(atf_tc_get_config_var(tc, "tmpfile"));84}8586ATF_TC_WITH_CLEANUP(cleanup_fail);87ATF_TC_HEAD(cleanup_fail, tc)88{89atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test "90"program");91}92ATF_TC_BODY(cleanup_fail, tc)93{94touch(atf_tc_get_config_var(tc, "tmpfile"));95atf_tc_fail("On purpose");96}97ATF_TC_CLEANUP(cleanup_fail, tc)98{99if (atf_tc_get_config_var_as_bool(tc, "cleanup"))100safe_remove(atf_tc_get_config_var(tc, "tmpfile"));101}102103ATF_TC_WITH_CLEANUP(cleanup_skip);104ATF_TC_HEAD(cleanup_skip, tc)105{106atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test "107"program");108}109ATF_TC_BODY(cleanup_skip, tc)110{111touch(atf_tc_get_config_var(tc, "tmpfile"));112atf_tc_skip("On purpose");113}114ATF_TC_CLEANUP(cleanup_skip, tc)115{116if (atf_tc_get_config_var_as_bool(tc, "cleanup"))117safe_remove(atf_tc_get_config_var(tc, "tmpfile"));118}119120ATF_TC_WITH_CLEANUP(cleanup_curdir);121ATF_TC_HEAD(cleanup_curdir, tc)122{123atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test "124"program");125}126ATF_TC_BODY(cleanup_curdir, tc)127{128FILE *f;129130f = fopen("oldvalue", "w");131if (f == NULL)132atf_tc_fail("Failed to create oldvalue file");133fprintf(f, "1234");134fclose(f);135}136ATF_TC_CLEANUP(cleanup_curdir, tc)137{138FILE *f;139140f = fopen("oldvalue", "r");141if (f != NULL) {142int i;143if (fscanf(f, "%d", &i) != 1)144fprintf(stderr, "Failed to read old value\n");145else146printf("Old value: %d", i);147fclose(f);148}149}150151ATF_TC_WITH_CLEANUP(cleanup_sigterm);152ATF_TC_HEAD(cleanup_sigterm, tc)153{154atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test "155"program");156}157ATF_TC_BODY(cleanup_sigterm, tc)158{159char *nofile;160161touch(atf_tc_get_config_var(tc, "tmpfile"));162kill(getpid(), SIGTERM);163164RE(atf_text_format(&nofile, "%s.no",165atf_tc_get_config_var(tc, "tmpfile")));166touch(nofile);167free(nofile);168}169ATF_TC_CLEANUP(cleanup_sigterm, tc)170{171safe_remove(atf_tc_get_config_var(tc, "tmpfile"));172}173174/* ---------------------------------------------------------------------175* Helper tests for "t_config".176* --------------------------------------------------------------------- */177178ATF_TC(config_unset);179ATF_TC_HEAD(config_unset, tc)180{181atf_tc_set_md_var(tc, "descr", "Helper test case for the t_config test "182"program");183}184ATF_TC_BODY(config_unset, tc)185{186ATF_REQUIRE(!atf_tc_has_config_var(tc, "test"));187}188189ATF_TC(config_empty);190ATF_TC_HEAD(config_empty, tc)191{192atf_tc_set_md_var(tc, "descr", "Helper test case for the t_config test "193"program");194}195ATF_TC_BODY(config_empty, tc)196{197ATF_REQUIRE(atf_tc_has_config_var(tc, "test"));198ATF_REQUIRE(strlen(atf_tc_get_config_var(tc, "test")) == 0);199}200201ATF_TC(config_value);202ATF_TC_HEAD(config_value, tc)203{204atf_tc_set_md_var(tc, "descr", "Helper test case for the t_config test "205"program");206}207ATF_TC_BODY(config_value, tc)208{209ATF_REQUIRE(atf_tc_has_config_var(tc, "test"));210ATF_REQUIRE(strcmp(atf_tc_get_config_var(tc, "test"), "foo") == 0);211}212213ATF_TC(config_multi_value);214ATF_TC_HEAD(config_multi_value, tc)215{216atf_tc_set_md_var(tc, "descr", "Helper test case for the t_config test "217"program");218}219ATF_TC_BODY(config_multi_value, tc)220{221ATF_REQUIRE(atf_tc_has_config_var(tc, "test"));222ATF_REQUIRE(strcmp(atf_tc_get_config_var(tc, "test"), "foo bar") == 0);223}224225/* ---------------------------------------------------------------------226* Helper tests for "t_expect".227* --------------------------------------------------------------------- */228229ATF_TC_WITHOUT_HEAD(expect_pass_and_pass);230ATF_TC_BODY(expect_pass_and_pass, tc)231{232atf_tc_expect_pass();233234}235236ATF_TC_WITHOUT_HEAD(expect_pass_but_fail_requirement);237ATF_TC_BODY(expect_pass_but_fail_requirement, tc)238{239atf_tc_expect_pass();240atf_tc_fail("Some reason");241}242243ATF_TC_WITHOUT_HEAD(expect_pass_but_fail_check);244ATF_TC_BODY(expect_pass_but_fail_check, tc)245{246atf_tc_expect_pass();247atf_tc_fail_nonfatal("Some reason");248}249250ATF_TC_WITHOUT_HEAD(expect_fail_and_fail_requirement);251ATF_TC_BODY(expect_fail_and_fail_requirement, tc)252{253atf_tc_expect_fail("Fail %s", "reason");254atf_tc_fail("The failure");255atf_tc_expect_pass();256}257258ATF_TC_WITHOUT_HEAD(expect_fail_and_fail_check);259ATF_TC_BODY(expect_fail_and_fail_check, tc)260{261atf_tc_expect_fail("Fail first");262atf_tc_fail_nonfatal("abc");263atf_tc_expect_pass();264265atf_tc_expect_fail("And fail again");266atf_tc_fail_nonfatal("def");267atf_tc_expect_pass();268}269270ATF_TC_WITHOUT_HEAD(expect_fail_but_pass);271ATF_TC_BODY(expect_fail_but_pass, tc)272{273atf_tc_expect_fail("Fail first");274atf_tc_fail_nonfatal("abc");275atf_tc_expect_pass();276277atf_tc_expect_fail("Will not fail");278atf_tc_expect_pass();279280atf_tc_expect_fail("And fail again");281atf_tc_fail_nonfatal("def");282atf_tc_expect_pass();283}284285ATF_TC_WITHOUT_HEAD(expect_exit_any_and_exit);286ATF_TC_BODY(expect_exit_any_and_exit, tc)287{288atf_tc_expect_exit(-1, "Call will exit");289exit(EXIT_SUCCESS);290}291292ATF_TC_WITHOUT_HEAD(expect_exit_code_and_exit);293ATF_TC_BODY(expect_exit_code_and_exit, tc)294{295atf_tc_expect_exit(123, "Call will exit");296exit(123);297}298299ATF_TC_WITHOUT_HEAD(expect_exit_but_pass);300ATF_TC_BODY(expect_exit_but_pass, tc)301{302atf_tc_expect_exit(-1, "Call won't exit");303}304305ATF_TC_WITHOUT_HEAD(expect_signal_any_and_signal);306ATF_TC_BODY(expect_signal_any_and_signal, tc)307{308atf_tc_expect_signal(-1, "Call will signal");309kill(getpid(), SIGKILL);310}311312ATF_TC_WITHOUT_HEAD(expect_signal_no_and_signal);313ATF_TC_BODY(expect_signal_no_and_signal, tc)314{315atf_tc_expect_signal(SIGHUP, "Call will signal");316kill(getpid(), SIGHUP);317}318319ATF_TC_WITHOUT_HEAD(expect_signal_but_pass);320ATF_TC_BODY(expect_signal_but_pass, tc)321{322atf_tc_expect_signal(-1, "Call won't signal");323}324325ATF_TC_WITHOUT_HEAD(expect_death_and_exit);326ATF_TC_BODY(expect_death_and_exit, tc)327{328atf_tc_expect_death("Exit case");329exit(123);330}331332ATF_TC_WITHOUT_HEAD(expect_death_and_signal);333ATF_TC_BODY(expect_death_and_signal, tc)334{335atf_tc_expect_death("Signal case");336kill(getpid(), SIGKILL);337}338339ATF_TC_WITHOUT_HEAD(expect_death_but_pass);340ATF_TC_BODY(expect_death_but_pass, tc)341{342atf_tc_expect_death("Call won't die");343}344345ATF_TC(expect_timeout_and_hang);346ATF_TC_HEAD(expect_timeout_and_hang, tc)347{348atf_tc_set_md_var(tc, "timeout", "1");349}350ATF_TC_BODY(expect_timeout_and_hang, tc)351{352atf_tc_expect_timeout("Will overrun");353sleep(5);354}355356ATF_TC(expect_timeout_but_pass);357ATF_TC_HEAD(expect_timeout_but_pass, tc)358{359atf_tc_set_md_var(tc, "timeout", "1");360}361ATF_TC_BODY(expect_timeout_but_pass, tc)362{363atf_tc_expect_timeout("Will just exit");364}365366/* ---------------------------------------------------------------------367* Helper tests for "t_meta_data".368* --------------------------------------------------------------------- */369370ATF_TC_WITHOUT_HEAD(metadata_no_descr);371ATF_TC_BODY(metadata_no_descr, tc)372{373}374375ATF_TC_WITHOUT_HEAD(metadata_no_head);376ATF_TC_BODY(metadata_no_head, tc)377{378}379380/* ---------------------------------------------------------------------381* Helper tests for "t_srcdir".382* --------------------------------------------------------------------- */383384ATF_TC(srcdir_exists);385ATF_TC_HEAD(srcdir_exists, tc)386{387atf_tc_set_md_var(tc, "descr", "Helper test case for the t_srcdir test "388"program");389}390ATF_TC_BODY(srcdir_exists, tc)391{392atf_fs_path_t p;393bool b;394395RE(atf_fs_path_init_fmt(&p, "%s/datafile",396atf_tc_get_config_var(tc, "srcdir")));397RE(atf_fs_exists(&p, &b));398atf_fs_path_fini(&p);399if (!b)400atf_tc_fail("Cannot find datafile");401}402403/* ---------------------------------------------------------------------404* Helper tests for "t_result".405* --------------------------------------------------------------------- */406407ATF_TC_WITHOUT_HEAD(result_pass);408ATF_TC_BODY(result_pass, tc)409{410printf("msg\n");411}412413ATF_TC_WITHOUT_HEAD(result_fail);414ATF_TC_BODY(result_fail, tc)415{416printf("msg\n");417atf_tc_fail("Failure reason");418}419420ATF_TC_WITHOUT_HEAD(result_skip);421ATF_TC_BODY(result_skip, tc)422{423printf("msg\n");424atf_tc_skip("Skipped reason");425}426427ATF_TC(result_newlines_fail);428ATF_TC_HEAD(result_newlines_fail, tc)429{430atf_tc_set_md_var(tc, "descr", "Helper test case for the t_result test "431"program");432}433ATF_TC_BODY(result_newlines_fail, tc)434{435atf_tc_fail("First line\nSecond line");436}437438ATF_TC(result_newlines_skip);439ATF_TC_HEAD(result_newlines_skip, tc)440{441atf_tc_set_md_var(tc, "descr", "Helper test case for the t_result test "442"program");443}444ATF_TC_BODY(result_newlines_skip, tc)445{446atf_tc_skip("First line\nSecond line");447}448449/* ---------------------------------------------------------------------450* Main.451* --------------------------------------------------------------------- */452453ATF_TP_ADD_TCS(tp)454{455/* Add helper tests for t_cleanup. */456ATF_TP_ADD_TC(tp, cleanup_pass);457ATF_TP_ADD_TC(tp, cleanup_fail);458ATF_TP_ADD_TC(tp, cleanup_skip);459ATF_TP_ADD_TC(tp, cleanup_curdir);460ATF_TP_ADD_TC(tp, cleanup_sigterm);461462/* Add helper tests for t_config. */463ATF_TP_ADD_TC(tp, config_unset);464ATF_TP_ADD_TC(tp, config_empty);465ATF_TP_ADD_TC(tp, config_value);466ATF_TP_ADD_TC(tp, config_multi_value);467468/* Add helper tests for t_expect. */469ATF_TP_ADD_TC(tp, expect_pass_and_pass);470ATF_TP_ADD_TC(tp, expect_pass_but_fail_requirement);471ATF_TP_ADD_TC(tp, expect_pass_but_fail_check);472ATF_TP_ADD_TC(tp, expect_fail_and_fail_requirement);473ATF_TP_ADD_TC(tp, expect_fail_and_fail_check);474ATF_TP_ADD_TC(tp, expect_fail_but_pass);475ATF_TP_ADD_TC(tp, expect_exit_any_and_exit);476ATF_TP_ADD_TC(tp, expect_exit_code_and_exit);477ATF_TP_ADD_TC(tp, expect_exit_but_pass);478ATF_TP_ADD_TC(tp, expect_signal_any_and_signal);479ATF_TP_ADD_TC(tp, expect_signal_no_and_signal);480ATF_TP_ADD_TC(tp, expect_signal_but_pass);481ATF_TP_ADD_TC(tp, expect_death_and_exit);482ATF_TP_ADD_TC(tp, expect_death_and_signal);483ATF_TP_ADD_TC(tp, expect_death_but_pass);484ATF_TP_ADD_TC(tp, expect_timeout_and_hang);485ATF_TP_ADD_TC(tp, expect_timeout_but_pass);486487/* Add helper tests for t_meta_data. */488ATF_TP_ADD_TC(tp, metadata_no_descr);489ATF_TP_ADD_TC(tp, metadata_no_head);490491/* Add helper tests for t_srcdir. */492ATF_TP_ADD_TC(tp, srcdir_exists);493494/* Add helper tests for t_result. */495ATF_TP_ADD_TC(tp, result_pass);496ATF_TP_ADD_TC(tp, result_fail);497ATF_TP_ADD_TC(tp, result_skip);498ATF_TP_ADD_TC(tp, result_newlines_fail);499ATF_TP_ADD_TC(tp, result_newlines_skip);500501return atf_no_error();502}503504505