Module Name: src
Committed By: jmmv
Date: Sat May 8 08:11:05 UTC 2010
Modified Files:
src/external/bsd/atf/dist/atf-c: tc.c
Removed Files:
src/external/bsd/atf/dist: revision.h
src/external/bsd/atf/dist/atf-c: expand.c expand.h signals.c signals.h
src/external/bsd/atf/dist/tests/atf/atf-c: d_include_expand_h.c
d_include_signals_h.c t_expand.c t_signals.c
src/external/bsd/atf/dist/tests/atf/formats: d_tcs_1 d_tcs_1.errin
d_tcs_1.expout d_tcs_1.outin d_tcs_2 d_tcs_2.errin d_tcs_2.expout
d_tcs_2.outin d_tcs_3 d_tcs_3.errin d_tcs_3.expout d_tcs_3.outin
d_tcs_4 d_tcs_4.errin d_tcs_4.expout d_tcs_4.outin d_tcs_5
d_tcs_5.errin d_tcs_5.expout d_tcs_5.outin d_tcs_50 d_tcs_50.experr
d_tcs_51 d_tcs_51.experr d_tcs_52 d_tcs_52.experr d_tcs_53
d_tcs_53.experr d_tcs_53.expout d_tcs_54 d_tcs_54.experr
d_tcs_54.expout d_tcs_55 d_tcs_55.experr d_tcs_55.expout d_tcs_56
d_tcs_56.errin d_tcs_56.experr d_tcs_56.expout d_tcs_56.outin
d_tcs_57 d_tcs_57.errin d_tcs_57.experr d_tcs_57.expout
d_tcs_57.outin
src/external/bsd/atf/dist/tests/atf/test_programs: t_cleanup.sh
t_env.sh t_workdir.sh
src/external/bsd/atf/dist/tests/atf/tools: Atffile h_fail.cpp
h_misc.cpp h_mode.cpp h_pass.cpp t_atf_check.sh t_atf_cleanup.sh
t_atf_compile.sh t_atf_config.sh t_atf_exec.sh t_atf_report.sh
t_atf_run.sh
src/external/bsd/atf/dist/tools: atf-check.1 atf-check.cpp
atf-cleanup.1 atf-cleanup.cpp atf-compile.1 atf-compile.cpp
atf-config.1 atf-config.cpp atf-exec.1 atf-exec.cpp atf-format.1
atf-format.cpp atf-host-compile.sh atf-report.1 atf-report.cpp
atf-run.1 atf-run.cpp atf-run.hooks atf-version.1 atf-version.cpp
Log Message:
Merge atf 0.8.
To generate a diff of this commit:
cvs rdiff -u -r1.1.1.2 -r0 src/external/bsd/atf/dist/revision.h
cvs rdiff -u -r1.1.1.2 -r0 src/external/bsd/atf/dist/atf-c/expand.c
cvs rdiff -u -r1.1.1.1 -r0 src/external/bsd/atf/dist/atf-c/expand.h \
src/external/bsd/atf/dist/atf-c/signals.c \
src/external/bsd/atf/dist/atf-c/signals.h
cvs rdiff -u -r1.3 -r1.4 src/external/bsd/atf/dist/atf-c/tc.c
cvs rdiff -u -r1.1.1.1 -r0 \
src/external/bsd/atf/dist/tests/atf/atf-c/d_include_expand_h.c \
src/external/bsd/atf/dist/tests/atf/atf-c/d_include_signals_h.c
cvs rdiff -u -r1.1.1.2 -r0 \
src/external/bsd/atf/dist/tests/atf/atf-c/t_expand.c \
src/external/bsd/atf/dist/tests/atf/atf-c/t_signals.c
cvs rdiff -u -r1.1.1.1 -r0 \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_1 \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_1.errin \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_1.expout \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_1.outin \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_2 \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_2.errin \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_2.expout \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_2.outin \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_3 \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_3.errin \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_3.expout \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_3.outin \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_4 \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_4.errin \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_4.expout \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_4.outin \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_5 \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_5.errin \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_5.expout \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_5.outin \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_50 \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_50.experr \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_51 \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_51.experr \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_52 \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_52.experr \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_53 \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_53.experr \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_53.expout \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_54 \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_54.experr \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_54.expout \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_55 \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_55.experr \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_55.expout \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_56 \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_56.errin \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_56.experr \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_56.expout \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_56.outin \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_57 \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_57.errin \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_57.experr \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_57.expout \
src/external/bsd/atf/dist/tests/atf/formats/d_tcs_57.outin
cvs rdiff -u -r1.1.1.1 -r0 \
src/external/bsd/atf/dist/tests/atf/test_programs/t_cleanup.sh \
src/external/bsd/atf/dist/tests/atf/test_programs/t_env.sh \
src/external/bsd/atf/dist/tests/atf/test_programs/t_workdir.sh
cvs rdiff -u -r1.1.1.1 -r0 src/external/bsd/atf/dist/tests/atf/tools/Atffile \
src/external/bsd/atf/dist/tests/atf/tools/h_fail.cpp \
src/external/bsd/atf/dist/tests/atf/tools/h_misc.cpp \
src/external/bsd/atf/dist/tests/atf/tools/h_mode.cpp \
src/external/bsd/atf/dist/tests/atf/tools/h_pass.cpp \
src/external/bsd/atf/dist/tests/atf/tools/t_atf_exec.sh \
src/external/bsd/atf/dist/tests/atf/tools/t_atf_report.sh \
src/external/bsd/atf/dist/tests/atf/tools/t_atf_run.sh
cvs rdiff -u -r1.1.1.2 -r0 \
src/external/bsd/atf/dist/tests/atf/tools/t_atf_check.sh \
src/external/bsd/atf/dist/tests/atf/tools/t_atf_cleanup.sh \
src/external/bsd/atf/dist/tests/atf/tools/t_atf_compile.sh \
src/external/bsd/atf/dist/tests/atf/tools/t_atf_config.sh
cvs rdiff -u -r1.3 -r0 src/external/bsd/atf/dist/tools/atf-check.1
cvs rdiff -u -r1.1.1.2 -r0 src/external/bsd/atf/dist/tools/atf-check.cpp \
src/external/bsd/atf/dist/tools/atf-config.1 \
src/external/bsd/atf/dist/tools/atf-exec.cpp \
src/external/bsd/atf/dist/tools/atf-host-compile.sh \
src/external/bsd/atf/dist/tools/atf-run.cpp
cvs rdiff -u -r1.1.1.1 -r0 src/external/bsd/atf/dist/tools/atf-cleanup.1 \
src/external/bsd/atf/dist/tools/atf-cleanup.cpp \
src/external/bsd/atf/dist/tools/atf-compile.1 \
src/external/bsd/atf/dist/tools/atf-compile.cpp \
src/external/bsd/atf/dist/tools/atf-config.cpp \
src/external/bsd/atf/dist/tools/atf-exec.1 \
src/external/bsd/atf/dist/tools/atf-format.cpp \
src/external/bsd/atf/dist/tools/atf-report.cpp \
src/external/bsd/atf/dist/tools/atf-run.hooks \
src/external/bsd/atf/dist/tools/atf-version.1 \
src/external/bsd/atf/dist/tools/atf-version.cpp
cvs rdiff -u -r1.2 -r0 src/external/bsd/atf/dist/tools/atf-format.1 \
src/external/bsd/atf/dist/tools/atf-report.1 \
src/external/bsd/atf/dist/tools/atf-run.1
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/bsd/atf/dist/atf-c/tc.c
diff -u src/external/bsd/atf/dist/atf-c/tc.c:1.3 src/external/bsd/atf/dist/atf-c/tc.c:1.4
--- src/external/bsd/atf/dist/atf-c/tc.c:1.3 Tue Dec 22 13:36:56 2009
+++ src/external/bsd/atf/dist/atf-c/tc.c Sat May 8 08:11:04 2010
@@ -1,7 +1,7 @@
/*
* Automated Testing Framework (atf)
*
- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
+ * Copyright (c) 2008, 2009, 2010 The NetBSD Foundation, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -49,7 +49,6 @@
#include "atf-c/fs.h"
#include "atf-c/process.h"
#include "atf-c/sanity.h"
-#include "atf-c/signals.h"
#include "atf-c/tc.h"
#include "atf-c/tcr.h"
#include "atf-c/text.h"
@@ -59,47 +58,14 @@
* Auxiliary types and functions.
* --------------------------------------------------------------------- */
-struct child_data {
- const atf_tc_t *tc;
- const atf_fs_path_t *workdir;
-};
-
-/* Parent-only stuff. */
-struct timeout_data;
-static atf_error_t body_parent(const atf_tc_t *, const atf_fs_path_t *,
- atf_process_child_t *, atf_tcr_t *);
-static atf_error_t cleanup_parent(const atf_tc_t *, atf_process_child_t *);
-static atf_error_t fork_body(const atf_tc_t *, int, int,
- const atf_fs_path_t *, atf_tcr_t *);
-static atf_error_t fork_cleanup(const atf_tc_t *, int, int,
- const atf_fs_path_t *);
-static atf_error_t get_tc_result(const atf_fs_path_t *, atf_tcr_t *);
-static atf_error_t program_timeout(const atf_process_child_t *,
- const atf_tc_t *, struct timeout_data *);
-static void unprogram_timeout(struct timeout_data *);
-static void sigalrm_handler(int);
-
-/* Child-only stuff. */
-static void body_child(void *) ATF_DEFS_ATTRIBUTE_NORETURN;
-static atf_error_t check_arch(const char *, void *);
-static atf_error_t check_config(const char *, void *);
-static atf_error_t check_machine(const char *, void *);
static atf_error_t check_prog(const char *, void *);
static atf_error_t check_prog_in_dir(const char *, void *);
-static atf_error_t check_requirements(const atf_tc_t *);
-static void cleanup_child(void *) ATF_DEFS_ATTRIBUTE_NORETURN;
static void fail_internal(const char *, int, const char *, const char *,
const char *, va_list,
void (*)(atf_dynstr_t *),
void (*)(const char *, ...));
-static void fatal_atf_error(const char *, atf_error_t)
- ATF_DEFS_ATTRIBUTE_NORETURN;
-static void fatal_libc_error(const char *, int)
- ATF_DEFS_ATTRIBUTE_NORETURN;
-static atf_error_t prepare_child(const struct child_data *);
static void tc_fail(atf_dynstr_t *) ATF_DEFS_ATTRIBUTE_NORETURN;
static void tc_fail_nonfatal(atf_dynstr_t *);
-static void write_tcr(const atf_tcr_t *);
/* ---------------------------------------------------------------------
* The "atf_tc" type.
@@ -132,10 +98,6 @@
if (atf_is_error(err))
goto err_map;
- err = atf_tc_set_md_var(tc, "timeout", "300");
- if (atf_is_error(err))
- goto err_map;
-
/* XXX Should the head be able to return error codes? */
tc->m_head(tc);
@@ -222,6 +184,12 @@
return val;
}
+const atf_map_t *
+atf_tc_get_md_vars(const atf_tc_t *tc)
+{
+ return &tc->m_vars;
+}
+
bool
atf_tc_has_config_var(const atf_tc_t *tc, const char *name)
{
@@ -276,405 +244,20 @@
* Free functions.
* --------------------------------------------------------------------- */
-atf_error_t
-atf_tc_run(const atf_tc_t *tc, atf_tcr_t *tcr, int fdout, int fderr,
- const atf_fs_path_t *workdirbase)
-{
- atf_error_t err, cleanuperr;
- atf_fs_path_t workdir;
-
- err = atf_fs_path_copy(&workdir, workdirbase);
- if (atf_is_error(err))
- goto out;
-
- err = atf_fs_path_append_fmt(&workdir, "atf.XXXXXX");
- if (atf_is_error(err))
- goto out_workdir;
-
- err = atf_fs_mkdtemp(&workdir);
- if (atf_is_error(err))
- goto out_workdir;
-
- err = fork_body(tc, fdout, fderr, &workdir, tcr);
- cleanuperr = fork_cleanup(tc, fdout, fderr, &workdir);
- if (!atf_is_error(cleanuperr))
- (void)atf_fs_cleanup(&workdir);
- if (!atf_is_error(err))
- err = cleanuperr;
- else if (atf_is_error(cleanuperr))
- atf_error_free(cleanuperr);
-
-out_workdir:
- atf_fs_path_fini(&workdir);
-out:
- return err;
-}
-
-/*
- * Parent-only stuff.
- */
-
-static bool sigalrm_killed = false;
-static pid_t sigalrm_pid = -1;
-
-static
-void
-sigalrm_handler(int signo)
-{
- INV(signo == SIGALRM);
-
- if (sigalrm_pid != -1) {
- killpg(sigalrm_pid, SIGTERM);
- sigalrm_killed = true;
- }
-}
-
-struct timeout_data {
- bool m_programmed;
- atf_signal_programmer_t m_sigalrm;
-};
-
-static
-atf_error_t
-program_timeout(const atf_process_child_t *child, const atf_tc_t *tc,
- struct timeout_data *td)
-{
- atf_error_t err;
- long timeout;
-
- err = atf_text_to_long(atf_tc_get_md_var(tc, "timeout"), &timeout);
- if (atf_is_error(err))
- goto out;
-
- if (timeout != 0) {
- sigalrm_pid = atf_process_child_pid(child);
- sigalrm_killed = false;
-
- err = atf_signal_programmer_init(&td->m_sigalrm, SIGALRM,
- sigalrm_handler);
- if (atf_is_error(err))
- goto out;
-
- struct itimerval itv;
- timerclear(&itv.it_interval);
- timerclear(&itv.it_value);
- itv.it_value.tv_sec = timeout;
- if (setitimer(ITIMER_REAL, &itv, NULL) == -1) {
- atf_signal_programmer_fini(&td->m_sigalrm);
- err = atf_libc_error(errno, "Failed to program timeout "
- "with %ld seconds", timeout);
- }
-
- td->m_programmed = !atf_is_error(err);
- } else
- td->m_programmed = false;
-
-out:
- return err;
-}
-
-static
-void
-unprogram_timeout(struct timeout_data *td)
-{
- if (td->m_programmed) {
- atf_signal_programmer_fini(&td->m_sigalrm);
- sigalrm_pid = -1;
- sigalrm_killed = false;
- }
-}
-
-static
-atf_error_t
-body_parent(const atf_tc_t *tc, const atf_fs_path_t *workdir,
- atf_process_child_t *child, atf_tcr_t *tcr)
-{
- atf_error_t err;
- atf_process_status_t status;
- struct timeout_data td;
-
- err = program_timeout(child, tc, &td);
- if (atf_is_error(err)) {
- char buf[4096];
-
- atf_error_format(err, buf, sizeof(buf));
- fprintf(stderr, "Error programming test case's timeout: %s", buf);
- atf_error_free(err);
- killpg(atf_process_child_pid(child), SIGKILL);
- }
-
-again:
- err = atf_process_child_wait(child, &status);
- if (atf_is_error(err)) {
- if (atf_error_is(err, "libc") && atf_libc_error_code(err) == EINTR) {
- atf_error_free(err);
- goto again;
- } else {
- /* Propagate err */
- }
- } else {
- if (sigalrm_killed)
- err = atf_tcr_init_reason_fmt(tcr, atf_tcr_failed_state,
- "Test case timed out after %s "
- "seconds",
- atf_tc_get_md_var(tc, "timeout"));
- else {
- if (atf_process_status_exited(&status)) {
- const int exitstatus = atf_process_status_exitstatus(&status);
- if (exitstatus == EXIT_SUCCESS)
- err = get_tc_result(workdir, tcr);
- else
- err = atf_tcr_init_reason_fmt(tcr, atf_tcr_failed_state,
- "Test case exited with "
- "status %d", exitstatus);
- } else if (atf_process_status_signaled(&status)) {
- const int sig = atf_process_status_termsig(&status);
- const bool wcore = atf_process_status_coredump(&status);
- err = atf_tcr_init_reason_fmt(tcr, atf_tcr_failed_state,
- "Test case was signaled by "
- "signal %d%s", sig,
- wcore ? " (core dumped)" : "");
- } else {
- err = atf_tcr_init_reason_fmt(tcr, atf_tcr_failed_state,
- "Test case exited due to an "
- "unexpected condition");
- }
- }
-
- atf_process_status_fini(&status);
- }
-
- unprogram_timeout(&td);
-
- return err;
-}
-
-static
-atf_error_t
-cleanup_parent(const atf_tc_t *tc, atf_process_child_t *child)
-{
- atf_error_t err;
- atf_process_status_t status;
-
- err = atf_process_child_wait(child, &status);
- if (atf_is_error(err))
- goto out;
-
- if (!atf_process_status_exited(&status) ||
- atf_process_status_exitstatus(&status) != EXIT_SUCCESS) {
- /* XXX Not really a libc error. */
- err = atf_libc_error(EINVAL, "Child process did not exit cleanly");
- } else
- err = atf_no_error();
-
- atf_process_status_fini(&status);
-out:
- return err;
-}
-
-static
-atf_error_t
-fork_body(const atf_tc_t *tc, int fdout, int fderr,
- const atf_fs_path_t *workdir, atf_tcr_t *tcr)
-{
- atf_error_t err;
- atf_process_stream_t outsb, errsb;
- atf_process_child_t child;
- struct child_data data = {
- tc,
- workdir,
- };
-
- err = atf_process_stream_init_redirect_fd(&outsb, fdout);
- if (atf_is_error(err))
- goto out;
-
- err = atf_process_stream_init_redirect_fd(&errsb, fderr);
- if (atf_is_error(err))
- goto out_outsb;
-
- err = atf_process_fork(&child, body_child, &outsb, &errsb, &data);
- if (atf_is_error(err))
- goto out_errsb;
-
- err = body_parent(tc, workdir, &child, tcr);
-
-out_errsb:
- atf_process_stream_fini(&errsb);
-out_outsb:
- atf_process_stream_fini(&outsb);
-out:
- return err;
-}
-
-static
-atf_error_t
-fork_cleanup(const atf_tc_t *tc, int fdout, int fderr,
- const atf_fs_path_t *workdir)
-{
- atf_error_t err;
-
- if (tc->m_cleanup == NULL)
- err = atf_no_error();
- else {
- atf_process_stream_t outsb, errsb;
- atf_process_child_t child;
- struct child_data data = {
- tc,
- workdir,
- };
-
- err = atf_process_stream_init_redirect_fd(&outsb, fdout);
- if (atf_is_error(err))
- goto out;
-
- err = atf_process_stream_init_redirect_fd(&errsb, fderr);
- if (atf_is_error(err))
- goto out_outsb;
-
- err = atf_process_fork(&child, cleanup_child, &outsb, &errsb, &data);
- if (atf_is_error(err))
- goto out_errsb;
-
- err = cleanup_parent(tc, &child);
-
-out_errsb:
- atf_process_stream_fini(&errsb);
-out_outsb:
- atf_process_stream_fini(&outsb);
- }
-
-out:
- return err;
-}
-
-static
-atf_error_t
-get_tc_result(const atf_fs_path_t *workdir, atf_tcr_t *tcr)
-{
- atf_error_t err;
- int fd;
- atf_fs_path_t tcrfile;
-
- err = atf_fs_path_copy(&tcrfile, workdir);
- if (atf_is_error(err))
- goto out;
-
- err = atf_fs_path_append_fmt(&tcrfile, "tc-result");
- if (atf_is_error(err))
- goto out_tcrfile;
-
- fd = open(atf_fs_path_cstring(&tcrfile), O_RDONLY);
- if (fd == -1) {
- err = atf_libc_error(errno, "Cannot retrieve test case result");
- goto out_tcrfile;
- }
-
- err = atf_tcr_deserialize(tcr, fd);
-
- close(fd);
-out_tcrfile:
- atf_fs_path_fini(&tcrfile);
-out:
- return err;
-}
-
-/*
- * Child-only stuff.
- */
-
static const atf_tc_t *current_tc = NULL;
-static const atf_fs_path_t *current_workdir = NULL;
+static const atf_fs_path_t *current_resfile = NULL;
static size_t current_tc_fail_count = 0;
-static
atf_error_t
-prepare_child(const struct child_data *cd)
+atf_tc_run(const atf_tc_t *tc, const atf_fs_path_t *resfile)
{
- atf_error_t err;
- int i, ret;
+ atf_reset_exit_checks(); /* XXX */
- current_tc = cd->tc;
- current_workdir = cd->workdir;
+ current_tc = tc;
+ current_resfile = resfile;
current_tc_fail_count = 0;
- ret = setpgid(getpid(), 0);
- INV(ret != -1);
-
- umask(S_IWGRP | S_IWOTH);
-
- for (i = 1; i <= atf_signals_last_signo; i++)
- atf_signal_reset(i);
-
- err = atf_env_set("HOME", atf_fs_path_cstring(cd->workdir));
- if (atf_is_error(err))
- goto out;
-
- err = atf_env_unset("LANG");
- if (atf_is_error(err))
- goto out;
-
- err = atf_env_unset("LC_ALL");
- if (atf_is_error(err))
- goto out;
-
- err = atf_env_unset("LC_COLLATE");
- if (atf_is_error(err))
- goto out;
-
- err = atf_env_unset("LC_CTYPE");
- if (atf_is_error(err))
- goto out;
-
- err = atf_env_unset("LC_MESSAGES");
- if (atf_is_error(err))
- goto out;
-
- err = atf_env_unset("LC_MONETARY");
- if (atf_is_error(err))
- goto out;
-
- err = atf_env_unset("LC_NUMERIC");
- if (atf_is_error(err))
- goto out;
-
- err = atf_env_unset("LC_TIME");
- if (atf_is_error(err))
- goto out;
-
- err = atf_env_unset("TZ");
- if (atf_is_error(err))
- goto out;
-
- if (chdir(atf_fs_path_cstring(cd->workdir)) == -1) {
- err = atf_libc_error(errno, "Cannot enter work directory '%s'",
- atf_fs_path_cstring(cd->workdir));
- goto out;
- }
-
- err = atf_no_error();
-
-out:
- return err;
-}
-
-static
-void
-body_child(void *v)
-{
- const struct child_data *cd = v;
- atf_error_t err;
-
- atf_reset_exit_checks();
-
- err = prepare_child(cd);
- if (atf_is_error(err))
- goto print_err;
- err = check_requirements(cd->tc);
- if (atf_is_error(err))
- goto print_err;
-
- cd->tc->m_body(cd->tc);
+ tc->m_body(tc);
if (current_tc_fail_count == 0)
atf_tc_pass();
@@ -682,54 +265,19 @@
atf_tc_fail("%d checks failed; see output for more details",
current_tc_fail_count);
- UNREACHABLE;
-
-print_err:
- INV(atf_is_error(err));
- {
- char buf[4096];
-
- atf_error_format(err, buf, sizeof(buf));
- atf_error_free(err);
-
- atf_tc_fail("Error while preparing child process: %s", buf);
- }
-
- UNREACHABLE;
-}
-
-static
-atf_error_t
-check_arch(const char *arch, void *data)
-{
- bool *found = data;
-
- if (strcmp(arch, atf_config_get("atf_arch")) == 0)
- *found = true;
-
- return atf_no_error();
-}
-
-static
-atf_error_t
-check_config(const char *var, void *data)
-{
- if (!atf_tc_has_config_var(current_tc, var))
- atf_tc_skip("Required configuration variable %s not defined", var);
+ current_tc = NULL;
+ current_resfile = NULL;
+ current_tc_fail_count = 0;
return atf_no_error();
}
-static
atf_error_t
-check_machine(const char *machine, void *data)
+atf_tc_cleanup(const atf_tc_t *tc)
{
- bool *found = data;
-
- if (strcmp(machine, atf_config_get("atf_machine")) == 0)
- *found = true;
-
- return atf_no_error();
+ if (tc->m_cleanup != NULL)
+ tc->m_cleanup(tc);
+ return atf_no_error(); /* XXX */
}
struct prog_found_pair {
@@ -827,165 +375,6 @@
}
static
-atf_error_t
-check_requirements(const atf_tc_t *tc)
-{
- atf_error_t err;
-
- err = atf_no_error();
-
- if (atf_tc_has_md_var(tc, "require.arch")) {
- const char *arches = atf_tc_get_md_var(tc, "require.arch");
- bool found = false;
-
- if (strlen(arches) == 0)
- atf_tc_fail("Invalid value in the require.arch property");
- else {
- err = atf_text_for_each_word(arches, " ", check_arch, &found);
- if (atf_is_error(err))
- goto out;
-
- if (!found)
- atf_tc_skip("Requires one of the '%s' architectures",
- arches);
- }
- }
-
- if (atf_tc_has_md_var(tc, "require.config")) {
- const char *vars = atf_tc_get_md_var(tc, "require.config");
-
- if (strlen(vars) == 0)
- atf_tc_fail("Invalid value in the require.config property");
- else {
- err = atf_text_for_each_word(vars, " ", check_config, NULL);
- if (atf_is_error(err))
- goto out;
- }
- }
-
- if (atf_tc_has_md_var(tc, "require.machine")) {
- const char *machines = atf_tc_get_md_var(tc, "require.machine");
- bool found = false;
-
- if (strlen(machines) == 0)
- atf_tc_fail("Invalid value in the require.machine property");
- else {
- err = atf_text_for_each_word(machines, " ", check_machine,
- &found);
- if (atf_is_error(err))
- goto out;
-
- if (!found)
- atf_tc_skip("Requires one of the '%s' machine types",
- machines);
- }
- }
-
- if (atf_tc_has_md_var(tc, "require.progs")) {
- const char *progs = atf_tc_get_md_var(tc, "require.progs");
-
- if (strlen(progs) == 0)
- atf_tc_fail("Invalid value in the require.progs property");
- else {
- err = atf_text_for_each_word(progs, " ", check_prog, NULL);
- if (atf_is_error(err))
- goto out;
- }
- }
-
- if (atf_tc_has_md_var(tc, "require.user")) {
- const char *u = atf_tc_get_md_var(tc, "require.user");
-
- if (strcmp(u, "root") == 0) {
- if (!atf_user_is_root())
- atf_tc_skip("Requires root privileges");
- } else if (strcmp(u, "unprivileged") == 0) {
- if (atf_user_is_root())
- atf_tc_skip("Requires an unprivileged user");
- } else
- atf_tc_fail("Invalid value in the require.user property");
- }
-
- INV(!atf_is_error(err));
-out:
- return err;
-}
-
-static
-void
-cleanup_child(void *v)
-{
- const struct child_data *cd = v;
- atf_error_t err;
-
- err = prepare_child(cd);
- if (atf_is_error(err)) {
- atf_reset_exit_checks();
- exit(EXIT_FAILURE);
- } else {
- atf_reset_exit_checks();
- cd->tc->m_cleanup(cd->tc);
- exit(EXIT_SUCCESS);
- }
-
- UNREACHABLE;
-}
-
-static
-void
-fatal_atf_error(const char *prefix, atf_error_t err)
-{
- char buf[1024];
-
- INV(atf_is_error(err));
-
- atf_error_format(err, buf, sizeof(buf));
- atf_error_free(err);
-
- fprintf(stderr, "%s: %s", prefix, buf);
-
- abort();
-}
-
-static
-void
-fatal_libc_error(const char *prefix, int err)
-{
- fprintf(stderr, "%s: %s", prefix, strerror(err));
-
- abort();
-}
-
-static
-void
-write_tcr(const atf_tcr_t *tcr)
-{
- atf_error_t err;
- int fd;
- atf_fs_path_t tcrfile;
-
- err = atf_fs_path_copy(&tcrfile, current_workdir);
- if (atf_is_error(err))
- fatal_atf_error("Cannot write test case results", err);
-
- err = atf_fs_path_append_fmt(&tcrfile, "tc-result");
- if (atf_is_error(err))
- fatal_atf_error("Cannot write test case results", err);
-
- fd = open(atf_fs_path_cstring(&tcrfile),
- O_WRONLY | O_CREAT | O_TRUNC, 0755);
- if (fd == -1)
- fatal_libc_error("Cannot write test case results", errno);
-
- err = atf_tcr_serialize(tcr, fd);
- if (atf_is_error(err))
- fatal_atf_error("Cannot write test case results", err);
-
- close(fd);
- atf_fs_path_fini(&tcrfile);
-}
-
-static
void
tc_fail(atf_dynstr_t *msg)
{
@@ -999,12 +388,12 @@
if (atf_is_error(err))
abort();
- write_tcr(&tcr);
+ atf_tcr_write(&tcr, current_resfile); /* XXX Handle errors. */
atf_tcr_fini(&tcr);
atf_dynstr_fini(msg);
- exit(EXIT_SUCCESS);
+ exit(EXIT_FAILURE);
}
static
@@ -1032,11 +421,11 @@
if (atf_is_error(err))
abort();
- write_tcr(&tcr);
+ atf_tcr_write(&tcr, current_resfile); /* XXX Handle errors. */
atf_tcr_fini(&tcr);
- exit(EXIT_SUCCESS);
+ exit(EXIT_FAILURE);
}
void
@@ -1126,7 +515,7 @@
if (atf_is_error(err))
abort();
- write_tcr(&tcr);
+ atf_tcr_write(&tcr, current_resfile); /* XXX Handle errors. */
atf_tcr_fini(&tcr);
@@ -1160,7 +549,7 @@
if (atf_is_error(err))
abort();
- write_tcr(&tcr);
+ atf_tcr_write(&tcr, current_resfile); /* XXX Handle errors. */
atf_tcr_fini(&tcr);