diff options
Diffstat (limited to '')
-rw-r--r-- | unit/atf-src/test-programs/Atffile | 9 | ||||
-rw-r--r-- | unit/atf-src/test-programs/Kyuafile | 9 | ||||
-rw-r--r-- | unit/atf-src/test-programs/Makefile.am.inc | 84 | ||||
-rw-r--r-- | unit/atf-src/test-programs/c_helpers.c | 503 | ||||
-rw-r--r-- | unit/atf-src/test-programs/common.sh | 39 | ||||
-rw-r--r-- | unit/atf-src/test-programs/config_test.sh | 58 | ||||
-rw-r--r-- | unit/atf-src/test-programs/cpp_helpers.cpp | 355 | ||||
-rw-r--r-- | unit/atf-src/test-programs/expect_test.sh | 151 | ||||
-rw-r--r-- | unit/atf-src/test-programs/meta_data_test.sh | 60 | ||||
-rw-r--r-- | unit/atf-src/test-programs/result_test.sh | 135 | ||||
-rw-r--r-- | unit/atf-src/test-programs/sh_helpers.sh | 390 | ||||
-rw-r--r-- | unit/atf-src/test-programs/srcdir_test.sh | 145 |
12 files changed, 1938 insertions, 0 deletions
diff --git a/unit/atf-src/test-programs/Atffile b/unit/atf-src/test-programs/Atffile new file mode 100644 index 0000000..6a67a8f --- /dev/null +++ b/unit/atf-src/test-programs/Atffile @@ -0,0 +1,9 @@ +Content-Type: application/X-atf-atffile; version="1" + +prop: test-suite = atf + +tp: config_test +tp: expect_test +tp: meta_data_test +tp: srcdir_test +tp: result_test diff --git a/unit/atf-src/test-programs/Kyuafile b/unit/atf-src/test-programs/Kyuafile new file mode 100644 index 0000000..e525282 --- /dev/null +++ b/unit/atf-src/test-programs/Kyuafile @@ -0,0 +1,9 @@ +syntax("kyuafile", 1) + +test_suite("atf") + +atf_test_program{name="config_test"} +atf_test_program{name="expect_test"} +atf_test_program{name="meta_data_test"} +atf_test_program{name="srcdir_test"} +atf_test_program{name="result_test"} diff --git a/unit/atf-src/test-programs/Makefile.am.inc b/unit/atf-src/test-programs/Makefile.am.inc new file mode 100644 index 0000000..9ef2b12 --- /dev/null +++ b/unit/atf-src/test-programs/Makefile.am.inc @@ -0,0 +1,84 @@ +# Copyright (c) 2007 The NetBSD Foundation, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND +# CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +tests_test_programs_DATA = test-programs/Atffile \ + test-programs/Kyuafile +tests_test_programsdir = $(pkgtestsdir)/test-programs +EXTRA_DIST += $(tests_test_programs_DATA) + +tests_test_programs_PROGRAMS = test-programs/c_helpers +test_programs_c_helpers_SOURCES = test-programs/c_helpers.c +test_programs_c_helpers_LDADD = libatf-c.la + +tests_test_programs_PROGRAMS += test-programs/cpp_helpers +test_programs_cpp_helpers_SOURCES = test-programs/cpp_helpers.cpp +test_programs_cpp_helpers_LDADD = $(ATF_CXX_LIBS) + +common_sh = $(srcdir)/test-programs/common.sh +EXTRA_DIST += test-programs/common.sh + +tests_test_programs_SCRIPTS = test-programs/sh_helpers +CLEANFILES += test-programs/sh_helpers +EXTRA_DIST += test-programs/sh_helpers.sh +test-programs/sh_helpers: $(srcdir)/test-programs/sh_helpers.sh + $(AM_V_GEN)src="$(srcdir)/test-programs/sh_helpers.sh $(common_sh)"; \ + dst="test-programs/sh_helpers"; $(BUILD_SH_TP) + +tests_test_programs_SCRIPTS += test-programs/config_test +CLEANFILES += test-programs/config_test +EXTRA_DIST += test-programs/config_test.sh +test-programs/config_test: $(srcdir)/test-programs/config_test.sh + $(AM_V_GEN)src="$(srcdir)/test-programs/config_test.sh $(common_sh)"; \ + dst="test-programs/config_test"; $(BUILD_SH_TP) + +tests_test_programs_SCRIPTS += test-programs/expect_test +CLEANFILES += test-programs/expect_test +EXTRA_DIST += test-programs/expect_test.sh +test-programs/expect_test: $(srcdir)/test-programs/expect_test.sh + $(AM_V_GEN)src="$(srcdir)/test-programs/expect_test.sh $(common_sh)"; \ + dst="test-programs/expect_test"; $(BUILD_SH_TP) + +tests_test_programs_SCRIPTS += test-programs/meta_data_test +CLEANFILES += test-programs/meta_data_test +EXTRA_DIST += test-programs/meta_data_test.sh +test-programs/meta_data_test: $(srcdir)/test-programs/meta_data_test.sh + $(AM_V_GEN)src="$(srcdir)/test-programs/meta_data_test.sh $(common_sh)"; \ + dst="test-programs/meta_data_test"; $(BUILD_SH_TP) + +tests_test_programs_SCRIPTS += test-programs/result_test +CLEANFILES += test-programs/result_test +EXTRA_DIST += test-programs/result_test.sh +test-programs/result_test: $(srcdir)/test-programs/result_test.sh + $(AM_V_GEN)src="$(srcdir)/test-programs/result_test.sh $(common_sh)"; \ + dst="test-programs/result_test"; $(BUILD_SH_TP) + +tests_test_programs_SCRIPTS += test-programs/srcdir_test +CLEANFILES += test-programs/srcdir_test +EXTRA_DIST += test-programs/srcdir_test.sh +test-programs/srcdir_test: $(srcdir)/test-programs/srcdir_test.sh + $(AM_V_GEN)src="$(srcdir)/test-programs/srcdir_test.sh $(common_sh)"; \ + dst="test-programs/srcdir_test"; $(BUILD_SH_TP) + +# vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 diff --git a/unit/atf-src/test-programs/c_helpers.c b/unit/atf-src/test-programs/c_helpers.c new file mode 100644 index 0000000..1b7aa4e --- /dev/null +++ b/unit/atf-src/test-programs/c_helpers.c @@ -0,0 +1,503 @@ +/* Copyright (c) 2007 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND + * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#include <sys/types.h> +#include <sys/wait.h> +#include <fcntl.h> +#include <unistd.h> + +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <atf-c.h> + +#include "atf-c/detail/env.h" +#include "atf-c/detail/fs.h" +#include "atf-c/detail/test_helpers.h" +#include "atf-c/detail/text.h" +#include "atf-c/error.h" + +/* --------------------------------------------------------------------- + * Auxiliary functions. + * --------------------------------------------------------------------- */ + +static +void +safe_remove(const char* path) +{ + if (unlink(path) == -1) + atf_tc_fail("unlink(2) of %s failed", path); +} + +static +void +touch(const char *path) +{ + int fd; + fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, 0644); + if (fd == -1) + atf_tc_fail("Could not create file %s", path); + close(fd); +} + +/* --------------------------------------------------------------------- + * Helper tests for "t_cleanup". + * --------------------------------------------------------------------- */ + +ATF_TC_WITH_CLEANUP(cleanup_pass); +ATF_TC_HEAD(cleanup_pass, tc) +{ + atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test " + "program"); +} +ATF_TC_BODY(cleanup_pass, tc) +{ + touch(atf_tc_get_config_var(tc, "tmpfile")); +} +ATF_TC_CLEANUP(cleanup_pass, tc) +{ + if (atf_tc_get_config_var_as_bool(tc, "cleanup")) + safe_remove(atf_tc_get_config_var(tc, "tmpfile")); +} + +ATF_TC_WITH_CLEANUP(cleanup_fail); +ATF_TC_HEAD(cleanup_fail, tc) +{ + atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test " + "program"); +} +ATF_TC_BODY(cleanup_fail, tc) +{ + touch(atf_tc_get_config_var(tc, "tmpfile")); + atf_tc_fail("On purpose"); +} +ATF_TC_CLEANUP(cleanup_fail, tc) +{ + if (atf_tc_get_config_var_as_bool(tc, "cleanup")) + safe_remove(atf_tc_get_config_var(tc, "tmpfile")); +} + +ATF_TC_WITH_CLEANUP(cleanup_skip); +ATF_TC_HEAD(cleanup_skip, tc) +{ + atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test " + "program"); +} +ATF_TC_BODY(cleanup_skip, tc) +{ + touch(atf_tc_get_config_var(tc, "tmpfile")); + atf_tc_skip("On purpose"); +} +ATF_TC_CLEANUP(cleanup_skip, tc) +{ + if (atf_tc_get_config_var_as_bool(tc, "cleanup")) + safe_remove(atf_tc_get_config_var(tc, "tmpfile")); +} + +ATF_TC_WITH_CLEANUP(cleanup_curdir); +ATF_TC_HEAD(cleanup_curdir, tc) +{ + atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test " + "program"); +} +ATF_TC_BODY(cleanup_curdir, tc) +{ + FILE *f; + + f = fopen("oldvalue", "w"); + if (f == NULL) + atf_tc_fail("Failed to create oldvalue file"); + fprintf(f, "1234"); + fclose(f); +} +ATF_TC_CLEANUP(cleanup_curdir, tc) +{ + FILE *f; + + f = fopen("oldvalue", "r"); + if (f != NULL) { + int i; + if (fscanf(f, "%d", &i) != 1) + fprintf(stderr, "Failed to read old value\n"); + else + printf("Old value: %d", i); + fclose(f); + } +} + +ATF_TC_WITH_CLEANUP(cleanup_sigterm); +ATF_TC_HEAD(cleanup_sigterm, tc) +{ + atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test " + "program"); +} +ATF_TC_BODY(cleanup_sigterm, tc) +{ + char *nofile; + + touch(atf_tc_get_config_var(tc, "tmpfile")); + kill(getpid(), SIGTERM); + + RE(atf_text_format(&nofile, "%s.no", + atf_tc_get_config_var(tc, "tmpfile"))); + touch(nofile); + free(nofile); +} +ATF_TC_CLEANUP(cleanup_sigterm, tc) +{ + safe_remove(atf_tc_get_config_var(tc, "tmpfile")); +} + +/* --------------------------------------------------------------------- + * Helper tests for "t_config". + * --------------------------------------------------------------------- */ + +ATF_TC(config_unset); +ATF_TC_HEAD(config_unset, tc) +{ + atf_tc_set_md_var(tc, "descr", "Helper test case for the t_config test " + "program"); +} +ATF_TC_BODY(config_unset, tc) +{ + ATF_REQUIRE(!atf_tc_has_config_var(tc, "test")); +} + +ATF_TC(config_empty); +ATF_TC_HEAD(config_empty, tc) +{ + atf_tc_set_md_var(tc, "descr", "Helper test case for the t_config test " + "program"); +} +ATF_TC_BODY(config_empty, tc) +{ + ATF_REQUIRE(atf_tc_has_config_var(tc, "test")); + ATF_REQUIRE(strlen(atf_tc_get_config_var(tc, "test")) == 0); +} + +ATF_TC(config_value); +ATF_TC_HEAD(config_value, tc) +{ + atf_tc_set_md_var(tc, "descr", "Helper test case for the t_config test " + "program"); +} +ATF_TC_BODY(config_value, tc) +{ + ATF_REQUIRE(atf_tc_has_config_var(tc, "test")); + ATF_REQUIRE(strcmp(atf_tc_get_config_var(tc, "test"), "foo") == 0); +} + +ATF_TC(config_multi_value); +ATF_TC_HEAD(config_multi_value, tc) +{ + atf_tc_set_md_var(tc, "descr", "Helper test case for the t_config test " + "program"); +} +ATF_TC_BODY(config_multi_value, tc) +{ + ATF_REQUIRE(atf_tc_has_config_var(tc, "test")); + ATF_REQUIRE(strcmp(atf_tc_get_config_var(tc, "test"), "foo bar") == 0); +} + +/* --------------------------------------------------------------------- + * Helper tests for "t_expect". + * --------------------------------------------------------------------- */ + +ATF_TC_WITHOUT_HEAD(expect_pass_and_pass); +ATF_TC_BODY(expect_pass_and_pass, tc) +{ + atf_tc_expect_pass(); + +} + +ATF_TC_WITHOUT_HEAD(expect_pass_but_fail_requirement); +ATF_TC_BODY(expect_pass_but_fail_requirement, tc) +{ + atf_tc_expect_pass(); + atf_tc_fail("Some reason"); +} + +ATF_TC_WITHOUT_HEAD(expect_pass_but_fail_check); +ATF_TC_BODY(expect_pass_but_fail_check, tc) +{ + atf_tc_expect_pass(); + atf_tc_fail_nonfatal("Some reason"); +} + +ATF_TC_WITHOUT_HEAD(expect_fail_and_fail_requirement); +ATF_TC_BODY(expect_fail_and_fail_requirement, tc) +{ + atf_tc_expect_fail("Fail %s", "reason"); + atf_tc_fail("The failure"); + atf_tc_expect_pass(); +} + +ATF_TC_WITHOUT_HEAD(expect_fail_and_fail_check); +ATF_TC_BODY(expect_fail_and_fail_check, tc) +{ + atf_tc_expect_fail("Fail first"); + atf_tc_fail_nonfatal("abc"); + atf_tc_expect_pass(); + + atf_tc_expect_fail("And fail again"); + atf_tc_fail_nonfatal("def"); + atf_tc_expect_pass(); +} + +ATF_TC_WITHOUT_HEAD(expect_fail_but_pass); +ATF_TC_BODY(expect_fail_but_pass, tc) +{ + atf_tc_expect_fail("Fail first"); + atf_tc_fail_nonfatal("abc"); + atf_tc_expect_pass(); + + atf_tc_expect_fail("Will not fail"); + atf_tc_expect_pass(); + + atf_tc_expect_fail("And fail again"); + atf_tc_fail_nonfatal("def"); + atf_tc_expect_pass(); +} + +ATF_TC_WITHOUT_HEAD(expect_exit_any_and_exit); +ATF_TC_BODY(expect_exit_any_and_exit, tc) +{ + atf_tc_expect_exit(-1, "Call will exit"); + exit(EXIT_SUCCESS); +} + +ATF_TC_WITHOUT_HEAD(expect_exit_code_and_exit); +ATF_TC_BODY(expect_exit_code_and_exit, tc) +{ + atf_tc_expect_exit(123, "Call will exit"); + exit(123); +} + +ATF_TC_WITHOUT_HEAD(expect_exit_but_pass); +ATF_TC_BODY(expect_exit_but_pass, tc) +{ + atf_tc_expect_exit(-1, "Call won't exit"); +} + +ATF_TC_WITHOUT_HEAD(expect_signal_any_and_signal); +ATF_TC_BODY(expect_signal_any_and_signal, tc) +{ + atf_tc_expect_signal(-1, "Call will signal"); + kill(getpid(), SIGKILL); +} + +ATF_TC_WITHOUT_HEAD(expect_signal_no_and_signal); +ATF_TC_BODY(expect_signal_no_and_signal, tc) +{ + atf_tc_expect_signal(SIGHUP, "Call will signal"); + kill(getpid(), SIGHUP); +} + +ATF_TC_WITHOUT_HEAD(expect_signal_but_pass); +ATF_TC_BODY(expect_signal_but_pass, tc) +{ + atf_tc_expect_signal(-1, "Call won't signal"); +} + +ATF_TC_WITHOUT_HEAD(expect_death_and_exit); +ATF_TC_BODY(expect_death_and_exit, tc) +{ + atf_tc_expect_death("Exit case"); + exit(123); +} + +ATF_TC_WITHOUT_HEAD(expect_death_and_signal); +ATF_TC_BODY(expect_death_and_signal, tc) +{ + atf_tc_expect_death("Signal case"); + kill(getpid(), SIGKILL); +} + +ATF_TC_WITHOUT_HEAD(expect_death_but_pass); +ATF_TC_BODY(expect_death_but_pass, tc) +{ + atf_tc_expect_death("Call won't die"); +} + +ATF_TC(expect_timeout_and_hang); +ATF_TC_HEAD(expect_timeout_and_hang, tc) +{ + atf_tc_set_md_var(tc, "timeout", "1"); +} +ATF_TC_BODY(expect_timeout_and_hang, tc) +{ + atf_tc_expect_timeout("Will overrun"); + sleep(5); +} + +ATF_TC(expect_timeout_but_pass); +ATF_TC_HEAD(expect_timeout_but_pass, tc) +{ + atf_tc_set_md_var(tc, "timeout", "1"); +} +ATF_TC_BODY(expect_timeout_but_pass, tc) +{ + atf_tc_expect_timeout("Will just exit"); +} + +/* --------------------------------------------------------------------- + * Helper tests for "t_meta_data". + * --------------------------------------------------------------------- */ + +ATF_TC_WITHOUT_HEAD(metadata_no_descr); +ATF_TC_BODY(metadata_no_descr, tc) +{ +} + +ATF_TC_WITHOUT_HEAD(metadata_no_head); +ATF_TC_BODY(metadata_no_head, tc) +{ +} + +/* --------------------------------------------------------------------- + * Helper tests for "t_srcdir". + * --------------------------------------------------------------------- */ + +ATF_TC(srcdir_exists); +ATF_TC_HEAD(srcdir_exists, tc) +{ + atf_tc_set_md_var(tc, "descr", "Helper test case for the t_srcdir test " + "program"); +} +ATF_TC_BODY(srcdir_exists, tc) +{ + atf_fs_path_t p; + bool b; + + RE(atf_fs_path_init_fmt(&p, "%s/datafile", + atf_tc_get_config_var(tc, "srcdir"))); + RE(atf_fs_exists(&p, &b)); + atf_fs_path_fini(&p); + if (!b) + atf_tc_fail("Cannot find datafile"); +} + +/* --------------------------------------------------------------------- + * Helper tests for "t_result". + * --------------------------------------------------------------------- */ + +ATF_TC_WITHOUT_HEAD(result_pass); +ATF_TC_BODY(result_pass, tc) +{ + printf("msg\n"); +} + +ATF_TC_WITHOUT_HEAD(result_fail); +ATF_TC_BODY(result_fail, tc) +{ + printf("msg\n"); + atf_tc_fail("Failure reason"); +} + +ATF_TC_WITHOUT_HEAD(result_skip); +ATF_TC_BODY(result_skip, tc) +{ + printf("msg\n"); + atf_tc_skip("Skipped reason"); +} + +ATF_TC(result_newlines_fail); +ATF_TC_HEAD(result_newlines_fail, tc) +{ + atf_tc_set_md_var(tc, "descr", "Helper test case for the t_result test " + "program"); +} +ATF_TC_BODY(result_newlines_fail, tc) +{ + atf_tc_fail("First line\nSecond line"); +} + +ATF_TC(result_newlines_skip); +ATF_TC_HEAD(result_newlines_skip, tc) +{ + atf_tc_set_md_var(tc, "descr", "Helper test case for the t_result test " + "program"); +} +ATF_TC_BODY(result_newlines_skip, tc) +{ + atf_tc_skip("First line\nSecond line"); +} + +/* --------------------------------------------------------------------- + * Main. + * --------------------------------------------------------------------- */ + +ATF_TP_ADD_TCS(tp) +{ + /* Add helper tests for t_cleanup. */ + ATF_TP_ADD_TC(tp, cleanup_pass); + ATF_TP_ADD_TC(tp, cleanup_fail); + ATF_TP_ADD_TC(tp, cleanup_skip); + ATF_TP_ADD_TC(tp, cleanup_curdir); + ATF_TP_ADD_TC(tp, cleanup_sigterm); + + /* Add helper tests for t_config. */ + ATF_TP_ADD_TC(tp, config_unset); + ATF_TP_ADD_TC(tp, config_empty); + ATF_TP_ADD_TC(tp, config_value); + ATF_TP_ADD_TC(tp, config_multi_value); + + /* Add helper tests for t_expect. */ + ATF_TP_ADD_TC(tp, expect_pass_and_pass); + ATF_TP_ADD_TC(tp, expect_pass_but_fail_requirement); + ATF_TP_ADD_TC(tp, expect_pass_but_fail_check); + ATF_TP_ADD_TC(tp, expect_fail_and_fail_requirement); + ATF_TP_ADD_TC(tp, expect_fail_and_fail_check); + ATF_TP_ADD_TC(tp, expect_fail_but_pass); + ATF_TP_ADD_TC(tp, expect_exit_any_and_exit); + ATF_TP_ADD_TC(tp, expect_exit_code_and_exit); + ATF_TP_ADD_TC(tp, expect_exit_but_pass); + ATF_TP_ADD_TC(tp, expect_signal_any_and_signal); + ATF_TP_ADD_TC(tp, expect_signal_no_and_signal); + ATF_TP_ADD_TC(tp, expect_signal_but_pass); + ATF_TP_ADD_TC(tp, expect_death_and_exit); + ATF_TP_ADD_TC(tp, expect_death_and_signal); + ATF_TP_ADD_TC(tp, expect_death_but_pass); + ATF_TP_ADD_TC(tp, expect_timeout_and_hang); + ATF_TP_ADD_TC(tp, expect_timeout_but_pass); + + /* Add helper tests for t_meta_data. */ + ATF_TP_ADD_TC(tp, metadata_no_descr); + ATF_TP_ADD_TC(tp, metadata_no_head); + + /* Add helper tests for t_srcdir. */ + ATF_TP_ADD_TC(tp, srcdir_exists); + + /* Add helper tests for t_result. */ + ATF_TP_ADD_TC(tp, result_pass); + ATF_TP_ADD_TC(tp, result_fail); + ATF_TP_ADD_TC(tp, result_skip); + ATF_TP_ADD_TC(tp, result_newlines_fail); + ATF_TP_ADD_TC(tp, result_newlines_skip); + + return atf_no_error(); +} diff --git a/unit/atf-src/test-programs/common.sh b/unit/atf-src/test-programs/common.sh new file mode 100644 index 0000000..9165752 --- /dev/null +++ b/unit/atf-src/test-programs/common.sh @@ -0,0 +1,39 @@ +# Copyright (c) 2008 The NetBSD Foundation, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND +# CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +get_helpers() +{ + srcdir=$(atf_get_srcdir) + + if [ ${#} -eq 0 ]; then + set -- c_helpers cpp_helpers sh_helpers + fi + + for h_name in "${@}"; do + echo ${srcdir}/${h_name} + done +} + +# vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 diff --git a/unit/atf-src/test-programs/config_test.sh b/unit/atf-src/test-programs/config_test.sh new file mode 100644 index 0000000..5102852 --- /dev/null +++ b/unit/atf-src/test-programs/config_test.sh @@ -0,0 +1,58 @@ +# Copyright (c) 2007 The NetBSD Foundation, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND +# CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +atf_test_case vflag +vflag_head() +{ + atf_set "descr" "Tests that the -v flag works correctly to set" \ + "configuration variables" +} +vflag_body() +{ + for h in $(get_helpers); do + atf_check -s eq:0 -o ignore -e ignore ${h} -s $(atf_get_srcdir) \ + -r resfile config_unset + atf_check -s eq:0 -o ignore -e empty grep 'passed' resfile + + atf_check -s eq:0 -o ignore -e ignore ${h} -s $(atf_get_srcdir) \ + -r resfile -v 'test=' config_empty + atf_check -s eq:0 -o ignore -e empty grep 'passed' resfile + + atf_check -s eq:0 -o ignore -e ignore ${h} -s $(atf_get_srcdir) \ + -r resfile -v 'test=foo' config_value + atf_check -s eq:0 -o ignore -e empty grep 'passed' resfile + + atf_check -s eq:0 -o ignore -e ignore -x ${h} -s $(atf_get_srcdir) \ + -r resfile -v \'test=foo bar\' config_multi_value + atf_check -s eq:0 -o ignore -e empty grep 'passed' resfile + done +} + +atf_init_test_cases() +{ + atf_add_test_case vflag +} + +# vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 diff --git a/unit/atf-src/test-programs/cpp_helpers.cpp b/unit/atf-src/test-programs/cpp_helpers.cpp new file mode 100644 index 0000000..ff9e543 --- /dev/null +++ b/unit/atf-src/test-programs/cpp_helpers.cpp @@ -0,0 +1,355 @@ +// Copyright (c) 2007 The NetBSD Foundation, Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND +// CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +// IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +extern "C" { +#include <signal.h> +#include <unistd.h> +} + +#include <cstdlib> +#include <fstream> +#include <iostream> + +#include <atf-c++.hpp> + +#include "atf-c++/detail/fs.hpp" + +// ------------------------------------------------------------------------ +// Helper tests for "t_config". +// ------------------------------------------------------------------------ + +ATF_TEST_CASE(config_unset); +ATF_TEST_CASE_HEAD(config_unset) +{ + set_md_var("descr", "Helper test case for the t_config test program"); +} +ATF_TEST_CASE_BODY(config_unset) +{ + ATF_REQUIRE(!has_config_var("test")); +} + +ATF_TEST_CASE(config_empty); +ATF_TEST_CASE_HEAD(config_empty) +{ + set_md_var("descr", "Helper test case for the t_config test program"); +} +ATF_TEST_CASE_BODY(config_empty) +{ + ATF_REQUIRE_EQ(get_config_var("test"), ""); +} + +ATF_TEST_CASE(config_value); +ATF_TEST_CASE_HEAD(config_value) +{ + set_md_var("descr", "Helper test case for the t_config test program"); +} +ATF_TEST_CASE_BODY(config_value) +{ + ATF_REQUIRE_EQ(get_config_var("test"), "foo"); +} + +ATF_TEST_CASE(config_multi_value); +ATF_TEST_CASE_HEAD(config_multi_value) +{ + set_md_var("descr", "Helper test case for the t_config test program"); +} +ATF_TEST_CASE_BODY(config_multi_value) +{ + ATF_REQUIRE_EQ(get_config_var("test"), "foo bar"); +} + +// ------------------------------------------------------------------------ +// Helper tests for "t_expect". +// ------------------------------------------------------------------------ + +ATF_TEST_CASE_WITHOUT_HEAD(expect_pass_and_pass); +ATF_TEST_CASE_BODY(expect_pass_and_pass) +{ + expect_pass(); +} + +ATF_TEST_CASE_WITHOUT_HEAD(expect_pass_but_fail_requirement); +ATF_TEST_CASE_BODY(expect_pass_but_fail_requirement) +{ + expect_pass(); + fail("Some reason"); +} + +ATF_TEST_CASE_WITHOUT_HEAD(expect_pass_but_fail_check); +ATF_TEST_CASE_BODY(expect_pass_but_fail_check) +{ + expect_pass(); + fail_nonfatal("Some reason"); +} + +ATF_TEST_CASE_WITHOUT_HEAD(expect_fail_and_fail_requirement); +ATF_TEST_CASE_BODY(expect_fail_and_fail_requirement) +{ + expect_fail("Fail reason"); + fail("The failure"); + expect_pass(); +} + +ATF_TEST_CASE_WITHOUT_HEAD(expect_fail_and_fail_check); +ATF_TEST_CASE_BODY(expect_fail_and_fail_check) +{ + expect_fail("Fail first"); + fail_nonfatal("abc"); + expect_pass(); + + expect_fail("And fail again"); + fail_nonfatal("def"); + expect_pass(); +} + +ATF_TEST_CASE_WITHOUT_HEAD(expect_fail_but_pass); +ATF_TEST_CASE_BODY(expect_fail_but_pass) +{ + expect_fail("Fail first"); + fail_nonfatal("abc"); + expect_pass(); + + expect_fail("Will not fail"); + expect_pass(); + + expect_fail("And fail again"); + fail_nonfatal("def"); + expect_pass(); +} + +ATF_TEST_CASE_WITHOUT_HEAD(expect_exit_any_and_exit); +ATF_TEST_CASE_BODY(expect_exit_any_and_exit) +{ + expect_exit(-1, "Call will exit"); + std::exit(EXIT_SUCCESS); +} + +ATF_TEST_CASE_WITHOUT_HEAD(expect_exit_code_and_exit); +ATF_TEST_CASE_BODY(expect_exit_code_and_exit) +{ + expect_exit(123, "Call will exit"); + std::exit(123); +} + +ATF_TEST_CASE_WITHOUT_HEAD(expect_exit_but_pass); +ATF_TEST_CASE_BODY(expect_exit_but_pass) +{ + expect_exit(-1, "Call won't exit"); +} + +ATF_TEST_CASE_WITHOUT_HEAD(expect_signal_any_and_signal); +ATF_TEST_CASE_BODY(expect_signal_any_and_signal) +{ + expect_signal(-1, "Call will signal"); + ::kill(getpid(), SIGKILL); +} + +ATF_TEST_CASE_WITHOUT_HEAD(expect_signal_no_and_signal); +ATF_TEST_CASE_BODY(expect_signal_no_and_signal) +{ + expect_signal(SIGHUP, "Call will signal"); + ::kill(getpid(), SIGHUP); +} + +ATF_TEST_CASE_WITHOUT_HEAD(expect_signal_but_pass); +ATF_TEST_CASE_BODY(expect_signal_but_pass) +{ + expect_signal(-1, "Call won't signal"); +} + +ATF_TEST_CASE_WITHOUT_HEAD(expect_death_and_exit); +ATF_TEST_CASE_BODY(expect_death_and_exit) +{ + expect_death("Exit case"); + std::exit(123); +} + +ATF_TEST_CASE_WITHOUT_HEAD(expect_death_and_signal); +ATF_TEST_CASE_BODY(expect_death_and_signal) +{ + expect_death("Signal case"); + kill(getpid(), SIGKILL); +} + +ATF_TEST_CASE_WITHOUT_HEAD(expect_death_but_pass); +ATF_TEST_CASE_BODY(expect_death_but_pass) +{ + expect_death("Call won't die"); +} + +ATF_TEST_CASE(expect_timeout_and_hang); +ATF_TEST_CASE_HEAD(expect_timeout_and_hang) +{ + set_md_var("timeout", "1"); +} +ATF_TEST_CASE_BODY(expect_timeout_and_hang) +{ + expect_timeout("Will overrun"); + ::sleep(5); +} + +ATF_TEST_CASE(expect_timeout_but_pass); +ATF_TEST_CASE_HEAD(expect_timeout_but_pass) +{ + set_md_var("timeout", "1"); +} +ATF_TEST_CASE_BODY(expect_timeout_but_pass) +{ + expect_timeout("Will just exit"); +} + +// ------------------------------------------------------------------------ +// Helper tests for "t_meta_data". +// ------------------------------------------------------------------------ + +ATF_TEST_CASE(metadata_no_descr); +ATF_TEST_CASE_HEAD(metadata_no_descr) +{ +} +ATF_TEST_CASE_BODY(metadata_no_descr) +{ +} + +ATF_TEST_CASE_WITHOUT_HEAD(metadata_no_head); +ATF_TEST_CASE_BODY(metadata_no_head) +{ +} + +// ------------------------------------------------------------------------ +// Helper tests for "t_srcdir". +// ------------------------------------------------------------------------ + +ATF_TEST_CASE(srcdir_exists); +ATF_TEST_CASE_HEAD(srcdir_exists) +{ + set_md_var("descr", "Helper test case for the t_srcdir test program"); +} +ATF_TEST_CASE_BODY(srcdir_exists) +{ + if (!atf::fs::exists(atf::fs::path(get_config_var("srcdir")) / + "datafile")) + ATF_FAIL("Cannot find datafile"); +} + +// ------------------------------------------------------------------------ +// Helper tests for "t_result". +// ------------------------------------------------------------------------ + +ATF_TEST_CASE(result_pass); +ATF_TEST_CASE_HEAD(result_pass) { } +ATF_TEST_CASE_BODY(result_pass) +{ + std::cout << "msg\n"; +} + +ATF_TEST_CASE(result_fail); +ATF_TEST_CASE_HEAD(result_fail) { } +ATF_TEST_CASE_BODY(result_fail) +{ + std::cout << "msg\n"; + ATF_FAIL("Failure reason"); +} + +ATF_TEST_CASE(result_skip); +ATF_TEST_CASE_HEAD(result_skip) { } +ATF_TEST_CASE_BODY(result_skip) +{ + std::cout << "msg\n"; + ATF_SKIP("Skipped reason"); +} + +ATF_TEST_CASE(result_newlines_fail); +ATF_TEST_CASE_HEAD(result_newlines_fail) +{ + set_md_var("descr", "Helper test case for the t_result test program"); +} +ATF_TEST_CASE_BODY(result_newlines_fail) +{ + ATF_FAIL("First line\nSecond line"); +} + +ATF_TEST_CASE(result_newlines_skip); +ATF_TEST_CASE_HEAD(result_newlines_skip) +{ + set_md_var("descr", "Helper test case for the t_result test program"); +} +ATF_TEST_CASE_BODY(result_newlines_skip) +{ + ATF_SKIP("First line\nSecond line"); +} + +ATF_TEST_CASE(result_exception); +ATF_TEST_CASE_HEAD(result_exception) { } +ATF_TEST_CASE_BODY(result_exception) +{ + throw std::runtime_error("This is unhandled"); +} + +// ------------------------------------------------------------------------ +// Main. +// ------------------------------------------------------------------------ + +ATF_INIT_TEST_CASES(tcs) +{ + // Add helper tests for t_config. + ATF_ADD_TEST_CASE(tcs, config_unset); + ATF_ADD_TEST_CASE(tcs, config_empty); + ATF_ADD_TEST_CASE(tcs, config_value); + ATF_ADD_TEST_CASE(tcs, config_multi_value); + + // Add helper tests for t_expect. + ATF_ADD_TEST_CASE(tcs, expect_pass_and_pass); + ATF_ADD_TEST_CASE(tcs, expect_pass_but_fail_requirement); + ATF_ADD_TEST_CASE(tcs, expect_pass_but_fail_check); + ATF_ADD_TEST_CASE(tcs, expect_fail_and_fail_requirement); + ATF_ADD_TEST_CASE(tcs, expect_fail_and_fail_check); + ATF_ADD_TEST_CASE(tcs, expect_fail_but_pass); + ATF_ADD_TEST_CASE(tcs, expect_exit_any_and_exit); + ATF_ADD_TEST_CASE(tcs, expect_exit_code_and_exit); + ATF_ADD_TEST_CASE(tcs, expect_exit_but_pass); + ATF_ADD_TEST_CASE(tcs, expect_signal_any_and_signal); + ATF_ADD_TEST_CASE(tcs, expect_signal_no_and_signal); + ATF_ADD_TEST_CASE(tcs, expect_signal_but_pass); + ATF_ADD_TEST_CASE(tcs, expect_death_and_exit); + ATF_ADD_TEST_CASE(tcs, expect_death_and_signal); + ATF_ADD_TEST_CASE(tcs, expect_death_but_pass); + ATF_ADD_TEST_CASE(tcs, expect_timeout_and_hang); + ATF_ADD_TEST_CASE(tcs, expect_timeout_but_pass); + + // Add helper tests for t_meta_data. + ATF_ADD_TEST_CASE(tcs, metadata_no_descr); + ATF_ADD_TEST_CASE(tcs, metadata_no_head); + + // Add helper tests for t_srcdir. + ATF_ADD_TEST_CASE(tcs, srcdir_exists); + + // Add helper tests for t_result. + ATF_ADD_TEST_CASE(tcs, result_pass); + ATF_ADD_TEST_CASE(tcs, result_fail); + ATF_ADD_TEST_CASE(tcs, result_skip); + ATF_ADD_TEST_CASE(tcs, result_newlines_fail); + ATF_ADD_TEST_CASE(tcs, result_newlines_skip); + ATF_ADD_TEST_CASE(tcs, result_exception); +} diff --git a/unit/atf-src/test-programs/expect_test.sh b/unit/atf-src/test-programs/expect_test.sh new file mode 100644 index 0000000..74e38e1 --- /dev/null +++ b/unit/atf-src/test-programs/expect_test.sh @@ -0,0 +1,151 @@ +# Copyright (c) 2007 The NetBSD Foundation, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND +# CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +check_result() { + file="${1}"; shift + + atf_check -s eq:0 -o match:"${*}" -e empty cat "${file}" + rm "${file}" +} + +atf_test_case expect_pass +expect_pass_body() { + for h in $(get_helpers); do + atf_check -s eq:0 -e ignore "${h}" -r result expect_pass_and_pass + check_result result "passed" + + atf_check -s eq:1 -e ignore "${h}" -r result \ + expect_pass_but_fail_requirement + check_result result "failed: Some reason" + + # atf-sh does not support non-fatal failures yet; skip checks for + # such conditions. + case "${h}" in *sh_helpers*) continue ;; esac + + atf_check -s eq:1 -o empty -e match:"Some reason" \ + "${h}" -r result expect_pass_but_fail_check + check_result result "failed: 1 checks failed" + done +} + +atf_test_case expect_fail +expect_fail_body() { + for h in $(get_helpers c_helpers cpp_helpers); do + atf_check -s eq:0 "${h}" -r result expect_fail_and_fail_requirement + check_result result "expected_failure: Fail reason: The failure" + + atf_check -s eq:1 -e match:"Expected check failure: Fail first: abc" \ + -e not-match:"And fail again" "${h}" -r result expect_fail_but_pass + check_result result "failed: .*expecting a failure" + + # atf-sh does not support non-fatal failures yet; skip checks for + # such conditions. + case "${h}" in *sh_helpers*) continue ;; esac + + atf_check -s eq:0 -e match:"Expected check failure: Fail first: abc" \ + -e match:"Expected check failure: And fail again: def" \ + "${h}" -r result expect_fail_and_fail_check + check_result result "expected_failure: And fail again: 2 checks" \ + "failed as expected" + done + + # atf-sh does not support non-fatal failures yet; skip checks for + # such conditions. + for h in $(get_helpers sh_helpers); do + atf_check -s eq:0 -e ignore "${h}" -r result \ + expect_fail_and_fail_requirement + check_result result "expected_failure: Fail reason: The failure" + + atf_check -s eq:1 -e ignore "${h}" -r result expect_fail_but_pass + check_result result "failed: .*expecting a failure" + done +} + +atf_test_case expect_exit +expect_exit_body() { + for h in $(get_helpers); do + atf_check -s eq:0 -e ignore "${h}" -r result expect_exit_any_and_exit + check_result result "expected_exit: Call will exit" + + atf_check -s eq:123 -e ignore "${h}" -r result expect_exit_code_and_exit + check_result result "expected_exit\(123\): Call will exit" + + atf_check -s eq:1 -e ignore "${h}" -r result expect_exit_but_pass + check_result result "failed: .*expected to exit" + done +} + +atf_test_case expect_signal +expect_signal_body() { + for h in $(get_helpers); do + atf_check -s signal:9 -e ignore "${h}" -r result \ + expect_signal_any_and_signal + check_result result "expected_signal: Call will signal" + + atf_check -s signal:hup -e ignore "${h}" -r result \ + expect_signal_no_and_signal + check_result result "expected_signal\(1\): Call will signal" + + atf_check -s eq:1 -e ignore "${h}" -r result \ + expect_signal_but_pass + check_result result "failed: .*termination signal" + done +} + +atf_test_case expect_death +expect_death_body() { + for h in $(get_helpers); do + atf_check -s eq:123 -e ignore "${h}" -r result expect_death_and_exit + check_result result "expected_death: Exit case" + + atf_check -s signal:kill -e ignore "${h}" -r result \ + expect_death_and_signal + check_result result "expected_death: Signal case" + + atf_check -s eq:1 -e ignore "${h}" -r result expect_death_but_pass + check_result result "failed: .*terminate abruptly" + done +} + +atf_test_case expect_timeout +expect_timeout_body() { + for h in $(get_helpers); do + atf_check -s eq:1 -e ignore "${h}" -r result expect_timeout_but_pass + check_result result "failed: Test case was expected to hang but it" \ + "continued execution" + done +} + +atf_init_test_cases() +{ + atf_add_test_case expect_pass + atf_add_test_case expect_fail + atf_add_test_case expect_exit + atf_add_test_case expect_signal + atf_add_test_case expect_death + atf_add_test_case expect_timeout +} + +# vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 diff --git a/unit/atf-src/test-programs/meta_data_test.sh b/unit/atf-src/test-programs/meta_data_test.sh new file mode 100644 index 0000000..150b9e2 --- /dev/null +++ b/unit/atf-src/test-programs/meta_data_test.sh @@ -0,0 +1,60 @@ +# Copyright (c) 2010 The NetBSD Foundation, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND +# CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +atf_test_case no_descr +no_descr_head() +{ + atf_set "descr" "Tests that the description may not be present" +} +no_descr_body() +{ + for h in $(get_helpers); do + atf_check -s eq:0 -o ignore -e ignore ${h} -s $(atf_get_srcdir) -l + atf_check -s eq:0 -o match:passed -e ignore ${h} -s $(atf_get_srcdir) \ + metadata_no_descr + done +} + +atf_test_case no_head +no_head_head() +{ + atf_set "descr" "Tests that the head may not be present" +} +no_head_body() +{ + for h in $(get_helpers); do + atf_check -s eq:0 -o ignore -e ignore ${h} -s $(atf_get_srcdir) -l + atf_check -s eq:0 -o match:passed -e ignore ${h} -s $(atf_get_srcdir) \ + metadata_no_head + done +} + +atf_init_test_cases() +{ + atf_add_test_case no_descr + atf_add_test_case no_head +} + +# vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 diff --git a/unit/atf-src/test-programs/result_test.sh b/unit/atf-src/test-programs/result_test.sh new file mode 100644 index 0000000..a87f08d --- /dev/null +++ b/unit/atf-src/test-programs/result_test.sh @@ -0,0 +1,135 @@ +# Copyright (c) 2007 The NetBSD Foundation, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND +# CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +atf_test_case runtime_warnings +runtime_warnings_head() +{ + # The fact that this test case is in this test program is an abuse. + atf_set "descr" "Tests that the test case prints a warning because" \ + "it is being run outside of a runtime engine" +} +runtime_warnings_body() +{ + unset __RUNNING_INSIDE_ATF_RUN + srcdir="$(atf_get_srcdir)" + for h in $(get_helpers); do + atf_check -s eq:0 -o match:"passed" -e match:"WARNING.*kyua" \ + "${h}" -s "${srcdir}" result_pass + done +} + +atf_test_case result_on_stdout +result_on_stdout_head() +{ + atf_set "descr" "Tests that the test case result is printed on stdout" \ + "by default" +} +result_on_stdout_body() +{ + srcdir="$(atf_get_srcdir)" + for h in $(get_helpers); do + atf_check -s eq:0 -o match:"passed" -o match:"msg" \ + -e ignore "${h}" -s "${srcdir}" result_pass + atf_check -s eq:1 -o match:"failed: Failure reason" -o match:"msg" \ + -e ignore "${h}" -s "${srcdir}" result_fail + atf_check -s eq:0 -o match:"skipped: Skipped reason" -o match:"msg" \ + -e ignore "${h}" -s "${srcdir}" result_skip + done +} + +atf_test_case result_to_file +result_to_file_head() +{ + atf_set "descr" "Tests that the test case result is sent to a file if -r" \ + "is used" +} +result_to_file_body() +{ + srcdir="$(atf_get_srcdir)" + for h in $(get_helpers); do + atf_check -s eq:0 -o inline:"msg\n" -e ignore "${h}" -s "${srcdir}" \ + -r resfile result_pass + atf_check -o inline:"passed\n" cat resfile + + atf_check -s eq:1 -o inline:"msg\n" -e ignore "${h}" -s "${srcdir}" \ + -r resfile result_fail + atf_check -o inline:"failed: Failure reason\n" cat resfile + + atf_check -s eq:0 -o inline:"msg\n" -e ignore "${h}" -s "${srcdir}" \ + -r resfile result_skip + atf_check -o inline:"skipped: Skipped reason\n" cat resfile + done +} + +atf_test_case result_to_file_fail +result_to_file_fail_head() +{ + atf_set "descr" "Tests controlled failure if the test program fails to" \ + "create the results file" + atf_set "require.user" "unprivileged" +} +result_to_file_fail_body() +{ + mkdir dir + chmod 444 dir + + srcdir="$(atf_get_srcdir)" + + for h in $(get_helpers c_helpers cpp_helpers); do + atf_check -s signal -o ignore \ + -e match:"FATAL ERROR: Cannot create.*'dir/resfile'" \ + "${h}" -s "${srcdir}" -r dir/resfile result_pass + done + + for h in $(get_helpers sh_helpers); do + atf_check -s exit -o ignore \ + -e match:"ERROR: Cannot create.*'dir/resfile'" \ + "${h}" -s "${srcdir}" -r dir/resfile result_pass + done +} + +atf_test_case result_exception +result_exception_head() +{ + atf_set "descr" "Tests that an unhandled exception is correctly captured" +} +result_exception_body() +{ + for h in $(get_helpers cpp_helpers); do + atf_check -s signal -o not-match:'failed: .*This is unhandled' \ + -e ignore "${h}" -s "${srcdir}" result_exception + done +} + +atf_init_test_cases() +{ + atf_add_test_case runtime_warnings + atf_add_test_case result_on_stdout + atf_add_test_case result_to_file + atf_add_test_case result_to_file_fail + atf_add_test_case result_exception +} + +# vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 diff --git a/unit/atf-src/test-programs/sh_helpers.sh b/unit/atf-src/test-programs/sh_helpers.sh new file mode 100644 index 0000000..b27a541 --- /dev/null +++ b/unit/atf-src/test-programs/sh_helpers.sh @@ -0,0 +1,390 @@ +# Copyright (c) 2007 The NetBSD Foundation, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND +# CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# ------------------------------------------------------------------------- +# Helper tests for "t_cleanup". +# ------------------------------------------------------------------------- + +atf_test_case cleanup_pass cleanup +cleanup_pass_head() +{ + atf_set "descr" "Helper test case for the t_cleanup test program" +} +cleanup_pass_body() +{ + touch $(atf_config_get tmpfile) +} +cleanup_pass_cleanup() +{ + if [ $(atf_config_get cleanup no) = yes ]; then + rm $(atf_config_get tmpfile) + fi +} + +atf_test_case cleanup_fail cleanup +cleanup_fail_head() +{ + atf_set "descr" "Helper test case for the t_cleanup test program" +} +cleanup_fail_body() +{ + touch $(atf_config_get tmpfile) + atf_fail "On purpose" +} +cleanup_fail_cleanup() +{ + if [ $(atf_config_get cleanup no) = yes ]; then + rm $(atf_config_get tmpfile) + fi +} + +atf_test_case cleanup_skip cleanup +cleanup_skip_head() +{ + atf_set "descr" "Helper test case for the t_cleanup test program" +} +cleanup_skip_body() +{ + touch $(atf_config_get tmpfile) + atf_skip "On purpose" +} +cleanup_skip_cleanup() +{ + if [ $(atf_config_get cleanup no) = yes ]; then + rm $(atf_config_get tmpfile) + fi +} + +atf_test_case cleanup_curdir cleanup +cleanup_curdir_head() +{ + atf_set "descr" "Helper test case for the t_cleanup test program" +} +cleanup_curdir_body() +{ + echo 1234 >oldvalue +} +cleanup_curdir_cleanup() +{ + test -f oldvalue && echo "Old value: $(cat oldvalue)" +} + +atf_test_case cleanup_sigterm cleanup +cleanup_sigterm_head() +{ + atf_set "descr" "Helper test case for the t_cleanup test program" +} +cleanup_sigterm_body() +{ + touch $(atf_config_get tmpfile) + kill $$ + touch $(atf_config_get tmpfile).no +} +cleanup_sigterm_cleanup() +{ + rm $(atf_config_get tmpfile) +} + +# ------------------------------------------------------------------------- +# Helper tests for "t_config". +# ------------------------------------------------------------------------- + +atf_test_case config_unset +config_unset_head() +{ + atf_set "descr" "Helper test case for the t_config test program" +} +config_unset_body() +{ + if atf_config_has 'test'; then + atf_fail "Test variable already defined" + fi +} + +atf_test_case config_empty +config_empty_head() +{ + atf_set "descr" "Helper test case for the t_config test program" +} +config_empty_body() +{ + atf_check_equal "$(atf_config_get 'test')" "" +} + +atf_test_case config_value +config_value_head() +{ + atf_set "descr" "Helper test case for the t_config test program" +} +config_value_body() +{ + atf_check_equal "$(atf_config_get 'test')" "foo" +} + +atf_test_case config_multi_value +config_multi_value_head() +{ + atf_set "descr" "Helper test case for the t_config test program" +} +config_multi_value_body() +{ + atf_check_equal "$(atf_config_get 'test')" "foo bar" +} + +# ------------------------------------------------------------------------- +# Helper tests for "t_expect". +# ------------------------------------------------------------------------- + +atf_test_case expect_pass_and_pass +expect_pass_and_pass_body() +{ + atf_expect_pass +} + +atf_test_case expect_pass_but_fail_requirement +expect_pass_but_fail_requirement_body() +{ + atf_expect_pass + atf_fail "Some reason" +} + +atf_test_case expect_pass_but_fail_check +expect_pass_but_fail_check_body() +{ + atf_fail "Non-fatal failures not implemented" +} + +atf_test_case expect_fail_and_fail_requirement +expect_fail_and_fail_requirement_body() +{ + atf_expect_fail "Fail reason" + atf_fail "The failure" + atf_expect_pass +} + +atf_test_case expect_fail_and_fail_check +expect_fail_and_fail_check_body() +{ + atf_fail "Non-fatal failures not implemented" +} + +atf_test_case expect_fail_but_pass +expect_fail_but_pass_body() +{ + atf_expect_fail "Fail first" + atf_expect_pass +} + +atf_test_case expect_exit_any_and_exit +expect_exit_any_and_exit_body() +{ + atf_expect_exit -1 "Call will exit" + exit 0 +} + +atf_test_case expect_exit_code_and_exit +expect_exit_code_and_exit_body() +{ + atf_expect_exit 123 "Call will exit" + exit 123 +} + +atf_test_case expect_exit_but_pass +expect_exit_but_pass_body() +{ + atf_expect_exit -1 "Call won't exit" +} + +atf_test_case expect_signal_any_and_signal +expect_signal_any_and_signal_body() +{ + atf_expect_signal -1 "Call will signal" + kill -9 $$ +} + +atf_test_case expect_signal_no_and_signal +expect_signal_no_and_signal_body() +{ + atf_expect_signal 1 "Call will signal" + kill -1 $$ +} + +atf_test_case expect_signal_but_pass +expect_signal_but_pass_body() +{ + atf_expect_signal -1 "Call won't signal" +} + +atf_test_case expect_death_and_exit +expect_death_and_exit_body() +{ + atf_expect_death "Exit case" + exit 123 +} + +atf_test_case expect_death_and_signal +expect_death_and_signal_body() +{ + atf_expect_death "Signal case" + kill -9 $$ +} + +atf_test_case expect_death_but_pass +expect_death_but_pass_body() +{ + atf_expect_death "Call won't die" +} + +atf_test_case expect_timeout_and_hang +expect_timeout_and_hang_head() +{ + atf_set "timeout" "1" +} +expect_timeout_and_hang_body() +{ + atf_expect_timeout "Will overrun" + sleep 5 +} + +atf_test_case expect_timeout_but_pass +expect_timeout_but_pass_head() +{ + atf_set "timeout" "1" +} +expect_timeout_but_pass_body() +{ + atf_expect_timeout "Will just exit" +} + +# ------------------------------------------------------------------------- +# Helper tests for "t_meta_data". +# ------------------------------------------------------------------------- + +atf_test_case metadata_no_descr +metadata_no_descr_head() +{ + : +} +metadata_no_descr_body() +{ + : +} + +atf_test_case metadata_no_head +metadata_no_head_body() +{ + : +} + +# ------------------------------------------------------------------------- +# Helper tests for "t_srcdir". +# ------------------------------------------------------------------------- + +atf_test_case srcdir_exists +srcdir_exists_head() +{ + atf_set "descr" "Helper test case for the t_srcdir test program" +} +srcdir_exists_body() +{ + [ -f "$(atf_get_srcdir)/datafile" ] || atf_fail "Cannot find datafile" +} + +# ------------------------------------------------------------------------- +# Helper tests for "t_result". +# ------------------------------------------------------------------------- + +atf_test_case result_pass +result_pass_body() +{ + echo "msg" +} + +atf_test_case result_fail +result_fail_body() +{ + echo "msg" + atf_fail "Failure reason" +} + +atf_test_case result_skip +result_skip_body() +{ + echo "msg" + atf_skip "Skipped reason" +} + +# ------------------------------------------------------------------------- +# Main. +# ------------------------------------------------------------------------- + +atf_init_test_cases() +{ + # Add helper tests for t_cleanup. + atf_add_test_case cleanup_pass + atf_add_test_case cleanup_fail + atf_add_test_case cleanup_skip + atf_add_test_case cleanup_curdir + atf_add_test_case cleanup_sigterm + + # Add helper tests for t_config. + atf_add_test_case config_unset + atf_add_test_case config_empty + atf_add_test_case config_value + atf_add_test_case config_multi_value + + # Add helper tests for t_expect. + atf_add_test_case expect_pass_and_pass + atf_add_test_case expect_pass_but_fail_requirement + atf_add_test_case expect_pass_but_fail_check + atf_add_test_case expect_fail_and_fail_requirement + atf_add_test_case expect_fail_and_fail_check + atf_add_test_case expect_fail_but_pass + atf_add_test_case expect_exit_any_and_exit + atf_add_test_case expect_exit_code_and_exit + atf_add_test_case expect_exit_but_pass + atf_add_test_case expect_signal_any_and_signal + atf_add_test_case expect_signal_no_and_signal + atf_add_test_case expect_signal_but_pass + atf_add_test_case expect_death_and_exit + atf_add_test_case expect_death_and_signal + atf_add_test_case expect_death_but_pass + atf_add_test_case expect_timeout_and_hang + atf_add_test_case expect_timeout_but_pass + + # Add helper tests for t_meta_data. + atf_add_test_case metadata_no_descr + atf_add_test_case metadata_no_head + + # Add helper tests for t_srcdir. + atf_add_test_case srcdir_exists + + # Add helper tests for t_result. + atf_add_test_case result_pass + atf_add_test_case result_fail + atf_add_test_case result_skip +} + +# vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 diff --git a/unit/atf-src/test-programs/srcdir_test.sh b/unit/atf-src/test-programs/srcdir_test.sh new file mode 100644 index 0000000..90a468a --- /dev/null +++ b/unit/atf-src/test-programs/srcdir_test.sh @@ -0,0 +1,145 @@ +# Copyright (c) 2007 The NetBSD Foundation, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND +# CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +create_files() +{ + mkdir tmp + touch tmp/datafile +} + +atf_test_case default +default_head() +{ + atf_set "descr" "Checks that the program can find its files if" \ + "executed from the same directory" +} +default_body() +{ + create_files + + for hp in $(get_helpers); do + h=${hp##*/} + cp ${hp} tmp + atf_check -s eq:0 -o ignore -e ignore -x \ + "cd tmp && ./${h} srcdir_exists" + atf_check -s eq:1 -o empty -e ignore "${hp}" -r res srcdir_exists + atf_check -s eq:0 -o ignore -e empty grep "Cannot find datafile" res + done +} + +atf_test_case libtool +libtool_head() +{ + atf_set "descr" "Checks that the program can find its files if" \ + "executed from the source directory and if it" \ + "was built with libtool" +} +libtool_body() +{ + create_files + mkdir tmp/.libs + + for hp in $(get_helpers c_helpers cpp_helpers); do + h=${hp##*/} + cp ${hp} tmp + cp ${hp} tmp/.libs + atf_check -s eq:0 -o ignore -e ignore -x \ + "cd tmp && ./.libs/${h} srcdir_exists" + atf_check -s eq:1 -o empty -e ignore "${hp}" -r res srcdir_exists + atf_check -s eq:0 -o ignore -e empty grep "Cannot find datafile" res + done + + for hp in $(get_helpers c_helpers cpp_helpers); do + h=${hp##*/} + cp ${hp} tmp + cp ${hp} tmp/.libs/lt-${h} + atf_check -s eq:0 -o ignore -e ignore -x \ + "cd tmp && ./.libs/lt-${h} srcdir_exists" + atf_check -s eq:1 -o empty -e ignore "${hp}" -r res srcdir_exists + atf_check -s eq:0 -o ignore -e empty grep "Cannot find datafile" res + done +} + +atf_test_case sflag +sflag_head() +{ + atf_set "descr" "Checks that the program can find its files when" \ + "using the -s flag" +} +sflag_body() +{ + create_files + + for hp in $(get_helpers); do + h=${hp##*/} + cp ${hp} tmp + atf_check -s eq:0 -o ignore -e ignore -x \ + "cd tmp && ./${h} -s $(pwd)/tmp \ + srcdir_exists" + atf_check -s eq:1 -o empty -e save:stderr "${hp}" -r res srcdir_exists + atf_check -s eq:0 -o ignore -e empty grep "Cannot find datafile" res + atf_check -s eq:0 -o ignore -e ignore \ + "${hp}" -s "$(pwd)"/tmp srcdir_exists + done +} + +atf_test_case relative +relative_head() +{ + atf_set "descr" "Checks that passing a relative path through -s" \ + "works" +} +relative_body() +{ + create_files + + for hp in $(get_helpers); do + h=${hp##*/} + cp ${hp} tmp + + for p in tmp tmp/. ./tmp; do + echo "Helper is: ${h}" + echo "Using source directory: ${p}" + + atf_check -s eq:0 -o ignore -e ignore \ + "./tmp/${h}" -s "${p}" srcdir_exists + atf_check -s eq:1 -o empty -e save:stderr "${hp}" -r res \ + srcdir_exists + atf_check -s eq:0 -o ignore -e empty grep "Cannot find datafile" res + atf_check -s eq:0 -o ignore -e ignore \ + "${hp}" -s "${p}" srcdir_exists + done + done +} + +atf_init_test_cases() +{ + atf_add_test_case default + atf_add_test_case libtool + atf_add_test_case sflag + atf_add_test_case relative +} + +# vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 |