Module Name: src Committed By: jmmv Date: Wed Oct 20 09:17:24 UTC 2010
Modified Files: src/external/bsd/atf/dist/atf-c: tc.c src/external/bsd/atf/dist/atf-c++: tests.cpp tests.hpp src/external/bsd/atf/dist/atf-report: atf-report.cpp tests-results.css tests-results.xsl src/external/bsd/atf/dist/atf-run: atf-run.cpp test-program.cpp test-program.hpp src/external/bsd/atf/dist/atf-version: atf-version.cpp Removed Files: src/external/bsd/atf/dist/atf-c: dynstr.c dynstr.h dynstr_test.c env.c env.h env_test.c fs.c fs.h fs_test.c list.c list.h list_test.c map.c map.h map_test.c process.c process.h process_helpers.c process_test.c sanity.c sanity.h sanity_test.c test_helpers.c test_helpers.h test_helpers_test.c text.c text.h text_test.c tp_main.c user.c user.h user_test.c src/external/bsd/atf/dist/atf-c++: application.cpp application.hpp application_test.cpp env.cpp env.hpp env_test.cpp exceptions.cpp exceptions.hpp exceptions_test.cpp expand.cpp expand.hpp expand_test.cpp fs.cpp fs.hpp fs_test.cpp io.cpp io.hpp io_test.cpp parser.cpp parser.hpp parser_test.cpp process.cpp process.hpp process_test.cpp sanity.hpp sanity_test.cpp signals.cpp signals.hpp signals_test.cpp test_helpers.cpp test_helpers.hpp text.cpp text.hpp text_test.cpp ui.cpp ui.hpp ui_test.cpp user.cpp user.hpp user_test.cpp src/external/bsd/atf/dist/atf-check: Atffile atf-check.1 atf-check.cpp integration_test.sh Log Message: Resolve import conflicts. To generate a diff of this commit: cvs rdiff -u -r1.4 -r0 src/external/bsd/atf/dist/atf-c/dynstr.c cvs rdiff -u -r1.1.1.2 -r0 src/external/bsd/atf/dist/atf-c/dynstr.h \ src/external/bsd/atf/dist/atf-c/text.c \ src/external/bsd/atf/dist/atf-c/text.h cvs rdiff -u -r1.1.1.1 -r0 src/external/bsd/atf/dist/atf-c/dynstr_test.c \ src/external/bsd/atf/dist/atf-c/env.c \ src/external/bsd/atf/dist/atf-c/env.h \ src/external/bsd/atf/dist/atf-c/env_test.c \ src/external/bsd/atf/dist/atf-c/fs_test.c \ src/external/bsd/atf/dist/atf-c/list_test.c \ src/external/bsd/atf/dist/atf-c/map_test.c \ src/external/bsd/atf/dist/atf-c/process_helpers.c \ src/external/bsd/atf/dist/atf-c/process_test.c \ src/external/bsd/atf/dist/atf-c/sanity.c \ src/external/bsd/atf/dist/atf-c/sanity.h \ src/external/bsd/atf/dist/atf-c/sanity_test.c \ src/external/bsd/atf/dist/atf-c/test_helpers.c \ src/external/bsd/atf/dist/atf-c/test_helpers.h \ src/external/bsd/atf/dist/atf-c/test_helpers_test.c \ src/external/bsd/atf/dist/atf-c/text_test.c \ src/external/bsd/atf/dist/atf-c/user.c \ src/external/bsd/atf/dist/atf-c/user.h \ src/external/bsd/atf/dist/atf-c/user_test.c cvs rdiff -u -r1.5 -r0 src/external/bsd/atf/dist/atf-c/fs.c cvs rdiff -u -r1.1.1.4 -r0 src/external/bsd/atf/dist/atf-c/fs.h \ src/external/bsd/atf/dist/atf-c/map.c cvs rdiff -u -r1.1.1.3 -r0 src/external/bsd/atf/dist/atf-c/list.c \ src/external/bsd/atf/dist/atf-c/list.h \ src/external/bsd/atf/dist/atf-c/map.h \ src/external/bsd/atf/dist/atf-c/process.c \ src/external/bsd/atf/dist/atf-c/process.h cvs rdiff -u -r1.6 -r1.7 src/external/bsd/atf/dist/atf-c/tc.c cvs rdiff -u -r1.1.1.5 -r0 src/external/bsd/atf/dist/atf-c/tp_main.c cvs rdiff -u -r1.1.1.4 -r0 src/external/bsd/atf/dist/atf-c++/application.cpp \ src/external/bsd/atf/dist/atf-c++/application.hpp \ src/external/bsd/atf/dist/atf-c++/fs.cpp \ src/external/bsd/atf/dist/atf-c++/fs.hpp \ src/external/bsd/atf/dist/atf-c++/process.hpp cvs rdiff -u -r1.1.1.1 -r0 \ src/external/bsd/atf/dist/atf-c++/application_test.cpp \ src/external/bsd/atf/dist/atf-c++/env.cpp \ src/external/bsd/atf/dist/atf-c++/env.hpp \ src/external/bsd/atf/dist/atf-c++/env_test.cpp \ src/external/bsd/atf/dist/atf-c++/exceptions.hpp \ src/external/bsd/atf/dist/atf-c++/exceptions_test.cpp \ src/external/bsd/atf/dist/atf-c++/expand_test.cpp \ src/external/bsd/atf/dist/atf-c++/fs_test.cpp \ src/external/bsd/atf/dist/atf-c++/parser_test.cpp \ src/external/bsd/atf/dist/atf-c++/process_test.cpp \ src/external/bsd/atf/dist/atf-c++/sanity.hpp \ src/external/bsd/atf/dist/atf-c++/sanity_test.cpp \ src/external/bsd/atf/dist/atf-c++/signals_test.cpp \ src/external/bsd/atf/dist/atf-c++/test_helpers.cpp \ src/external/bsd/atf/dist/atf-c++/test_helpers.hpp \ src/external/bsd/atf/dist/atf-c++/text_test.cpp \ src/external/bsd/atf/dist/atf-c++/ui.hpp \ src/external/bsd/atf/dist/atf-c++/ui_test.cpp \ src/external/bsd/atf/dist/atf-c++/user.cpp \ src/external/bsd/atf/dist/atf-c++/user.hpp \ src/external/bsd/atf/dist/atf-c++/user_test.cpp cvs rdiff -u -r1.1.1.2 -r0 src/external/bsd/atf/dist/atf-c++/exceptions.cpp \ src/external/bsd/atf/dist/atf-c++/expand.cpp \ src/external/bsd/atf/dist/atf-c++/expand.hpp \ src/external/bsd/atf/dist/atf-c++/signals.cpp \ src/external/bsd/atf/dist/atf-c++/signals.hpp \ src/external/bsd/atf/dist/atf-c++/text.cpp \ src/external/bsd/atf/dist/atf-c++/text.hpp \ src/external/bsd/atf/dist/atf-c++/ui.cpp cvs rdiff -u -r1.2 -r0 src/external/bsd/atf/dist/atf-c++/io.cpp \ src/external/bsd/atf/dist/atf-c++/io.hpp \ src/external/bsd/atf/dist/atf-c++/io_test.cpp cvs rdiff -u -r1.1.1.3 -r0 src/external/bsd/atf/dist/atf-c++/parser.cpp \ src/external/bsd/atf/dist/atf-c++/parser.hpp \ src/external/bsd/atf/dist/atf-c++/process.cpp cvs rdiff -u -r1.4 -r1.5 src/external/bsd/atf/dist/atf-c++/tests.cpp cvs rdiff -u -r1.3 -r1.4 src/external/bsd/atf/dist/atf-c++/tests.hpp cvs rdiff -u -r1.1.1.1 -r0 src/external/bsd/atf/dist/atf-check/Atffile \ src/external/bsd/atf/dist/atf-check/integration_test.sh cvs rdiff -u -r1.3 -r0 src/external/bsd/atf/dist/atf-check/atf-check.1 cvs rdiff -u -r1.1.1.2 -r0 src/external/bsd/atf/dist/atf-check/atf-check.cpp cvs rdiff -u -r1.4 -r1.5 src/external/bsd/atf/dist/atf-report/atf-report.cpp cvs rdiff -u -r1.2 -r1.3 \ src/external/bsd/atf/dist/atf-report/tests-results.css cvs rdiff -u -r1.3 -r1.4 \ src/external/bsd/atf/dist/atf-report/tests-results.xsl cvs rdiff -u -r1.5 -r1.6 src/external/bsd/atf/dist/atf-run/atf-run.cpp cvs rdiff -u -r1.4 -r1.5 src/external/bsd/atf/dist/atf-run/test-program.cpp cvs rdiff -u -r1.3 -r1.4 src/external/bsd/atf/dist/atf-run/test-program.hpp cvs rdiff -u -r1.4 -r1.5 \ src/external/bsd/atf/dist/atf-version/atf-version.cpp 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.6 src/external/bsd/atf/dist/atf-c/tc.c:1.7 --- src/external/bsd/atf/dist/atf-c/tc.c:1.6 Sat Jul 3 08:11:25 2010 +++ src/external/bsd/atf/dist/atf-c/tc.c Wed Oct 20 09:17:22 2010 @@ -27,7 +27,11 @@ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include <sys/types.h> +#include <sys/stat.h> + #include <errno.h> +#include <fcntl.h> #include <stdarg.h> #include <stdbool.h> #include <stdio.h> @@ -36,12 +40,14 @@ #include <unistd.h> #include "atf-c/defs.h" -#include "atf-c/env.h" #include "atf-c/error.h" -#include "atf-c/fs.h" -#include "atf-c/sanity.h" #include "atf-c/tc.h" -#include "atf-c/text.h" + +#include "detail/env.h" +#include "detail/fs.h" +#include "detail/map.h" +#include "detail/sanity.h" +#include "detail/text.h" /* --------------------------------------------------------------------- * Auxiliary functions. @@ -58,7 +64,7 @@ struct context { const atf_tc_t *tc; - const atf_fs_path_t *resfile; + const char *resfile; size_t fail_count; enum expect_type expect; @@ -69,14 +75,13 @@ int expect_signo; }; -static void context_init(struct context *, const atf_tc_t *, - const atf_fs_path_t *); +static void context_init(struct context *, const atf_tc_t *, const char *); static void check_fatal_error(atf_error_t); static void report_fatal_error(const char *, ...) ATF_DEFS_ATTRIBUTE_NORETURN; -static atf_error_t write_resfile(FILE *, const char *, const int, +static atf_error_t write_resfile(const int, const char *, const int, const atf_dynstr_t *); -static void create_resfile(const atf_fs_path_t *, const char *, const int, +static void create_resfile(const char *, const char *, const int, atf_dynstr_t *); static void error_in_expect(struct context *, const char *, ...) ATF_DEFS_ATTRIBUTE_NORETURN; @@ -101,8 +106,7 @@ static atf_error_t check_prog(struct context *, const char *, void *); static void -context_init(struct context *ctx, const atf_tc_t *tc, - const atf_fs_path_t *resfile) +context_init(struct context *ctx, const atf_tc_t *tc, const char *resfile) { ctx->tc = tc; ctx->resfile = resfile; @@ -149,27 +153,35 @@ * because the caller needs to clean up the reason object before terminating. */ static atf_error_t -write_resfile(FILE *file, const char *result, const int arg, +write_resfile(const int fd, const char *result, const int arg, const atf_dynstr_t *reason) { + char buffer[1024]; + int ret; + if (arg == -1 && reason == NULL) { - if (fprintf(file, "%s\n", result) <= 0) + if (snprintf(buffer, sizeof(buffer), "%s\n", result) <= 0) goto err; } else if (arg == -1 && reason != NULL) { - if (fprintf(file, "%s: %s\n", result, atf_dynstr_cstring(reason)) <= 0) + if (snprintf(buffer, sizeof(buffer), "%s: %s\n", result, + atf_dynstr_cstring(reason)) <= 0) goto err; } else if (arg != -1 && reason != NULL) { - if (fprintf(file, "%s(%d): %s\n", result, arg, - atf_dynstr_cstring(reason)) <= 0) + if (snprintf(buffer, sizeof(buffer), "%s(%d): %s\n", result, + arg, atf_dynstr_cstring(reason)) <= 0) goto err; - } else + } else { UNREACHABLE; + } - return atf_no_error(); + while ((ret = write(fd, buffer, strlen(buffer))) == -1 && errno == EINTR) + ; /* Retry. */ + if (ret != -1) + return atf_no_error(); err: - return atf_libc_error(errno, "Failed to write results file; result %s, " - "reason %s", result, + return atf_libc_error( + errno, "Failed to write results file; result %s, reason %s", result, reason == NULL ? "null" : atf_dynstr_cstring(reason)); } @@ -181,23 +193,24 @@ * not return any error code. */ static void -create_resfile(const atf_fs_path_t *resfile, const char *result, const int arg, +create_resfile(const char *resfile, const char *result, const int arg, atf_dynstr_t *reason) { atf_error_t err; - if (strcmp("/dev/stdout", atf_fs_path_cstring(resfile)) == 0) { - err = write_resfile(stdout, result, arg, reason); - } else if (strcmp("/dev/stderr", atf_fs_path_cstring(resfile)) == 0) { - err = write_resfile(stderr, result, arg, reason); + if (strcmp("/dev/stdout", resfile) == 0) { + err = write_resfile(STDOUT_FILENO, result, arg, reason); + } else if (strcmp("/dev/stderr", resfile) == 0) { + err = write_resfile(STDERR_FILENO, result, arg, reason); } else { - FILE *file = fopen(atf_fs_path_cstring(resfile), "w"); - if (file == NULL) { + const int fd = open(resfile, O_WRONLY | O_CREAT | O_TRUNC, + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + if (fd == -1) { err = atf_libc_error(errno, "Cannot create results file '%s'", - atf_fs_path_cstring(resfile)); + resfile); } else { - err = write_resfile(file, result, arg, reason); - fclose(file); + err = write_resfile(fd, result, arg, reason); + close(fd); } } @@ -504,6 +517,17 @@ * The "atf_tc" type. * --------------------------------------------------------------------- */ +struct atf_tc_impl { + const char *m_ident; + + atf_map_t m_vars; + atf_map_t m_config; + + atf_tc_head_t m_head; + atf_tc_body_t m_body; + atf_tc_cleanup_t m_cleanup; +}; + /* * Constructors/destructors. */ @@ -511,20 +535,29 @@ atf_error_t atf_tc_init(atf_tc_t *tc, const char *ident, atf_tc_head_t head, atf_tc_body_t body, atf_tc_cleanup_t cleanup, - const atf_map_t *config) + const char *const *config) { atf_error_t err; - tc->m_ident = ident; - tc->m_head = head; - tc->m_body = body; - tc->m_cleanup = cleanup; - tc->m_config = config; + tc->pimpl = malloc(sizeof(struct atf_tc_impl)); + if (tc->pimpl == NULL) { + err = atf_no_memory_error(); + goto err; + } + + tc->pimpl->m_ident = ident; + tc->pimpl->m_head = head; + tc->pimpl->m_body = body; + tc->pimpl->m_cleanup = cleanup; - err = atf_map_init(&tc->m_vars); + err = atf_map_init_charpp(&tc->pimpl->m_config, config); if (atf_is_error(err)) goto err; + err = atf_map_init(&tc->pimpl->m_vars); + if (atf_is_error(err)) + goto err_vars; + err = atf_tc_set_md_var(tc, "ident", ident); if (atf_is_error(err)) goto err_map; @@ -536,8 +569,8 @@ } /* XXX Should the head be able to return error codes? */ - if (tc->m_head != NULL) - tc->m_head(tc); + if (tc->pimpl->m_head != NULL) + tc->pimpl->m_head(tc); if (strcmp(atf_tc_get_md_var(tc, "ident"), ident) != 0) { report_fatal_error("Test case head modified the read-only 'ident' " @@ -549,14 +582,16 @@ return err; err_map: - atf_map_fini(&tc->m_vars); + atf_map_fini(&tc->pimpl->m_vars); +err_vars: + atf_map_fini(&tc->pimpl->m_config); err: return err; } atf_error_t atf_tc_init_pack(atf_tc_t *tc, const atf_tc_pack_t *pack, - const atf_map_t *config) + const char *const *config) { return atf_tc_init(tc, pack->m_ident, pack->m_head, pack->m_body, pack->m_cleanup, config); @@ -565,7 +600,8 @@ void atf_tc_fini(atf_tc_t *tc) { - atf_map_fini(&tc->m_vars); + atf_map_fini(&tc->pimpl->m_vars); + free(tc->pimpl); } /* @@ -575,7 +611,7 @@ const char * atf_tc_get_ident(const atf_tc_t *tc) { - return tc->m_ident; + return tc->pimpl->m_ident; } const char * @@ -585,7 +621,7 @@ atf_map_citer_t iter; PRE(atf_tc_has_config_var(tc, name)); - iter = atf_map_find_c(tc->m_config, name); + iter = atf_map_find_c(&tc->pimpl->m_config, name); val = atf_map_citer_data(iter); INV(val != NULL); @@ -613,34 +649,27 @@ atf_map_citer_t iter; PRE(atf_tc_has_md_var(tc, name)); - iter = atf_map_find_c(&tc->m_vars, name); + iter = atf_map_find_c(&tc->pimpl->m_vars, name); val = atf_map_citer_data(iter); INV(val != NULL); return val; } -const atf_map_t * +char ** atf_tc_get_md_vars(const atf_tc_t *tc) { - return &tc->m_vars; + return atf_map_to_charpp(&tc->pimpl->m_vars); } bool atf_tc_has_config_var(const atf_tc_t *tc, const char *name) { - bool found; atf_map_citer_t end, iter; - if (tc->m_config == NULL) - found = false; - else { - iter = atf_map_find_c(tc->m_config, name); - end = atf_map_end_c(tc->m_config); - found = !atf_equal_map_citer_map_citer(iter, end); - } - - return found; + iter = atf_map_find_c(&tc->pimpl->m_config, name); + end = atf_map_end_c(&tc->pimpl->m_config); + return !atf_equal_map_citer_map_citer(iter, end); } bool @@ -648,8 +677,8 @@ { atf_map_citer_t end, iter; - iter = atf_map_find_c(&tc->m_vars, name); - end = atf_map_end_c(&tc->m_vars); + iter = atf_map_find_c(&tc->pimpl->m_vars, name); + end = atf_map_end_c(&tc->pimpl->m_vars); return !atf_equal_map_citer_map_citer(iter, end); } @@ -669,7 +698,7 @@ va_end(ap); if (!atf_is_error(err)) - err = atf_map_insert(&tc->m_vars, name, value, true); + err = atf_map_insert(&tc->pimpl->m_vars, name, value, true); else free(value); @@ -899,11 +928,11 @@ static struct context Current; atf_error_t -atf_tc_run(const atf_tc_t *tc, const atf_fs_path_t *resfile) +atf_tc_run(const atf_tc_t *tc, const char *resfile) { context_init(&Current, tc, resfile); - tc->m_body(tc); + tc->pimpl->m_body(tc); validate_expect(&Current); @@ -929,8 +958,8 @@ atf_error_t atf_tc_cleanup(const atf_tc_t *tc) { - if (tc->m_cleanup != NULL) - tc->m_cleanup(tc); + if (tc->pimpl->m_cleanup != NULL) + tc->pimpl->m_cleanup(tc); return atf_no_error(); /* XXX */ } Index: src/external/bsd/atf/dist/atf-c++/tests.cpp diff -u src/external/bsd/atf/dist/atf-c++/tests.cpp:1.4 src/external/bsd/atf/dist/atf-c++/tests.cpp:1.5 --- src/external/bsd/atf/dist/atf-c++/tests.cpp:1.4 Tue Jul 6 18:03:37 2010 +++ src/external/bsd/atf/dist/atf-c++/tests.cpp Wed Oct 20 09:17:23 2010 @@ -51,18 +51,19 @@ extern "C" { #include "atf-c/error.h" +#include "atf-c/tc.h" +#include "atf-c/utils.h" } -#include "atf-c++/application.hpp" -#include "atf-c++/env.hpp" -#include "atf-c++/exceptions.hpp" -#include "atf-c++/fs.hpp" -#include "atf-c++/io.hpp" -#include "atf-c++/parser.hpp" -#include "atf-c++/sanity.hpp" -#include "atf-c++/tests.hpp" -#include "atf-c++/text.hpp" -#include "atf-c++/user.hpp" +#include "tests.hpp" + +#include "detail/application.hpp" +#include "detail/env.hpp" +#include "detail/exceptions.hpp" +#include "detail/fs.hpp" +#include "detail/parser.hpp" +#include "detail/sanity.hpp" +#include "detail/text.hpp" namespace impl = atf::tests; namespace detail = atf::tests::detail; @@ -88,8 +89,8 @@ detail::atf_tp_writer::start_tc(const std::string& ident) { if (!m_is_first) - m_os << std::endl; - m_os << "ident: " << ident << std::endl; + m_os << "\n"; + m_os << "ident: " << ident << "\n"; m_os.flush(); } @@ -105,7 +106,7 @@ const std::string& value) { PRE(name != "ident"); - m_os << name << ": " << value << std::endl; + m_os << name << ": " << value << "\n"; m_os.flush(); } @@ -116,67 +117,62 @@ static std::map< atf_tc_t*, impl::tc* > wraps; static std::map< const atf_tc_t*, const impl::tc* > cwraps; -void -impl::tc::wrap_head(atf_tc_t *tc) -{ - try { +struct impl::tc_impl : atf::utils::noncopyable { + std::string m_ident; + atf_tc_t m_tc; + bool m_has_cleanup; + + tc_impl(const std::string& ident, const bool has_cleanup) : + m_ident(ident), + m_has_cleanup(has_cleanup) + { + } + + static void + wrap_head(atf_tc_t *tc) + { std::map< atf_tc_t*, impl::tc* >::iterator iter = wraps.find(tc); INV(iter != wraps.end()); (*iter).second->head(); - } catch (const std::exception& e) { - std::cerr << "Caught unhandled exception: " + std::string(e.what()); - std::abort(); - } catch (...) { - std::cerr << "Caught unknown exception"; - std::abort(); } -} -void -impl::tc::wrap_body(const atf_tc_t *tc) -{ - try { + static void + wrap_body(const atf_tc_t *tc) + { std::map< const atf_tc_t*, const impl::tc* >::const_iterator iter = cwraps.find(tc); INV(iter != cwraps.end()); - (*iter).second->body(); - } catch (const std::exception& e) { - fail("Caught unhandled exception: " + std::string(e.what())); - } catch (...) { - fail("Caught unknown exception"); + try { + (*iter).second->body(); + } catch (const std::exception& e) { + (*iter).second->fail("Caught unhandled exception: " + std::string( + e.what())); + } catch (...) { + (*iter).second->fail("Caught unknown exception"); + } } -} -void -impl::tc::wrap_cleanup(const atf_tc_t *tc) -{ - try { + static void + wrap_cleanup(const atf_tc_t *tc) + { std::map< const atf_tc_t*, const impl::tc* >::const_iterator iter = cwraps.find(tc); INV(iter != cwraps.end()); (*iter).second->cleanup(); - } catch (const std::exception& e) { - std::cerr << "Caught unhandled exception: " + std::string(e.what()); - std::abort(); - } catch (...) { - std::cerr << "Caught unknown exception"; - std::abort(); } -} +}; impl::tc::tc(const std::string& ident, const bool has_cleanup) : - m_ident(ident), - m_has_cleanup(has_cleanup) + pimpl(new tc_impl(ident, has_cleanup)) { } impl::tc::~tc(void) { - cwraps.erase(&m_tc); - wraps.erase(&m_tc); + cwraps.erase(&pimpl->m_tc); + wraps.erase(&pimpl->m_tc); - atf_tc_fini(&m_tc); - atf_map_fini(&m_config); + atf_tc_fini(&pimpl->m_tc); } void @@ -184,66 +180,60 @@ { atf_error_t err; - err = atf_map_init(&m_config); - if (atf_is_error(err)) - throw_atf_error(err); - + utils::auto_array< const char * > array( + new const char*[(config.size() * 2) + 1]); + const char **ptr = array.get(); for (vars_map::const_iterator iter = config.begin(); iter != config.end(); iter++) { - const char *var = (*iter).first.c_str(); - const char *val = (*iter).second.c_str(); - - err = atf_map_insert(&m_config, var, ::strdup(val), true); - if (atf_is_error(err)) { - atf_map_fini(&m_config); - throw_atf_error(err); - } - } - - wraps[&m_tc] = this; - cwraps[&m_tc] = this; - - err = atf_tc_init(&m_tc, m_ident.c_str(), wrap_head, wrap_body, - m_has_cleanup ? wrap_cleanup : NULL, &m_config); - if (atf_is_error(err)) { - atf_map_fini(&m_config); + *ptr = (*iter).first.c_str(); + *(ptr + 1) = (*iter).second.c_str(); + ptr += 2; + } + *ptr = NULL; + + wraps[&pimpl->m_tc] = this; + cwraps[&pimpl->m_tc] = this; + + err = atf_tc_init(&pimpl->m_tc, pimpl->m_ident.c_str(), pimpl->wrap_head, + pimpl->wrap_body, pimpl->m_has_cleanup ? pimpl->wrap_cleanup : NULL, + array.get()); + if (atf_is_error(err)) throw_atf_error(err); - } } bool impl::tc::has_config_var(const std::string& var) const { - return atf_tc_has_config_var(&m_tc, var.c_str()); + return atf_tc_has_config_var(&pimpl->m_tc, var.c_str()); } bool impl::tc::has_md_var(const std::string& var) const { - return atf_tc_has_md_var(&m_tc, var.c_str()); + return atf_tc_has_md_var(&pimpl->m_tc, var.c_str()); } const std::string impl::tc::get_config_var(const std::string& var) const { - return atf_tc_get_config_var(&m_tc, var.c_str()); + return atf_tc_get_config_var(&pimpl->m_tc, var.c_str()); } const std::string impl::tc::get_config_var(const std::string& var, const std::string& defval) const { - return atf_tc_get_config_var_wd(&m_tc, var.c_str(), defval.c_str()); + return atf_tc_get_config_var_wd(&pimpl->m_tc, var.c_str(), defval.c_str()); } const std::string impl::tc::get_md_var(const std::string& var) const { - return atf_tc_get_md_var(&m_tc, var.c_str()); + return atf_tc_get_md_var(&pimpl->m_tc, var.c_str()); } const impl::vars_map @@ -252,10 +242,14 @@ { vars_map vars; - atf_map_citer_t iter; - atf_map_for_each_c(iter, atf_tc_get_md_vars(&m_tc)) { - vars.insert(vars_map::value_type(atf_map_citer_key(iter), - static_cast< const char * >(atf_map_citer_data(iter)))); + char **array = atf_tc_get_md_vars(&pimpl->m_tc); + try { + char **ptr; + for (ptr = array; *ptr != NULL; ptr += 2) + vars[*ptr] = *(ptr + 1); + } catch (...) { + atf_utils_free_charpp(array); + throw; } return vars; @@ -264,16 +258,16 @@ void impl::tc::set_md_var(const std::string& var, const std::string& val) { - atf_error_t err = atf_tc_set_md_var(&m_tc, var.c_str(), val.c_str()); + atf_error_t err = atf_tc_set_md_var(&pimpl->m_tc, var.c_str(), val.c_str()); if (atf_is_error(err)) throw_atf_error(err); } void -impl::tc::run(const fs::path& resfile) +impl::tc::run(const std::string& resfile) const { - atf_error_t err = atf_tc_run(&m_tc, resfile.c_path()); + atf_error_t err = atf_tc_run(&pimpl->m_tc, resfile.c_str()); if (atf_is_error(err)) throw_atf_error(err); } @@ -282,7 +276,7 @@ impl::tc::run_cleanup(void) const { - atf_error_t err = atf_tc_cleanup(&m_tc); + atf_error_t err = atf_tc_cleanup(&pimpl->m_tc); if (atf_is_error(err)) throw_atf_error(err); } @@ -640,7 +634,7 @@ try { switch (fields.second) { case BODY: - tc->run(m_resfile); + tc->run(m_resfile.str()); break; case CLEANUP: tc->run_cleanup(); Index: src/external/bsd/atf/dist/atf-c++/tests.hpp diff -u src/external/bsd/atf/dist/atf-c++/tests.hpp:1.3 src/external/bsd/atf/dist/atf-c++/tests.hpp:1.4 --- src/external/bsd/atf/dist/atf-c++/tests.hpp:1.3 Sat Jul 3 08:11:25 2010 +++ src/external/bsd/atf/dist/atf-c++/tests.hpp Wed Oct 20 09:17:23 2010 @@ -31,13 +31,9 @@ #define _ATF_CXX_TESTS_HPP_ #include <map> +#include <memory> #include <string> -extern "C" { -#include <atf-c/tc.h> -} - -#include <atf-c++/fs.hpp> #include <atf-c++/utils.hpp> namespace atf { @@ -70,11 +66,10 @@ // The "tc" class. // ------------------------------------------------------------------------ +struct tc_impl; + class tc : utils::noncopyable { - std::string m_ident; - atf_map_t m_config; - atf_tc_t m_tc; - bool m_has_cleanup; + std::auto_ptr< tc_impl > pimpl; protected: virtual void head(void); @@ -83,9 +78,7 @@ void require_prog(const std::string&) const; - static void wrap_head(atf_tc_t *); - static void wrap_body(const atf_tc_t *); - static void wrap_cleanup(const atf_tc_t *); + friend struct tc_impl; public: tc(const std::string&, const bool); @@ -102,7 +95,7 @@ bool has_md_var(const std::string&) const; void set_md_var(const std::string&, const std::string&); - void run(const fs::path&) const; + void run(const std::string&) const; void run_cleanup(void) const; // To be called from the child process only. Index: src/external/bsd/atf/dist/atf-report/atf-report.cpp diff -u src/external/bsd/atf/dist/atf-report/atf-report.cpp:1.4 src/external/bsd/atf/dist/atf-report/atf-report.cpp:1.5 --- src/external/bsd/atf/dist/atf-report/atf-report.cpp:1.4 Sat Jul 3 08:11:25 2010 +++ src/external/bsd/atf/dist/atf-report/atf-report.cpp Wed Oct 20 09:17:23 2010 @@ -34,11 +34,11 @@ #include <utility> #include <vector> -#include "atf-c++/application.hpp" -#include "atf-c++/fs.hpp" -#include "atf-c++/sanity.hpp" -#include "atf-c++/text.hpp" -#include "atf-c++/ui.hpp" +#include "atf-c++/detail/application.hpp" +#include "atf-c++/detail/fs.hpp" +#include "atf-c++/detail/sanity.hpp" +#include "atf-c++/detail/text.hpp" +#include "atf-c++/detail/ui.hpp" #include "reader.hpp" @@ -126,12 +126,11 @@ write_tp_end(const std::string& reason) { if (!reason.empty()) - (*m_os) << "tp, " << m_tpname << ", bogus, " << reason - << std::endl; + (*m_os) << "tp, " << m_tpname << ", bogus, " << reason << "\n"; else if (m_failed) - (*m_os) << "tp, " << m_tpname << ", failed" << std::endl; + (*m_os) << "tp, " << m_tpname << ", failed\n"; else - (*m_os) << "tp, " << m_tpname << ", passed" << std::endl; + (*m_os) << "tp, " << m_tpname << ", passed\n"; } virtual @@ -148,7 +147,7 @@ std::string str = "tc, " + m_tpname + ", " + m_tcname + ", " + state; if (!reason.empty()) str += ", " + reason; - (*m_os) << str << std::endl; + (*m_os) << str << "\n"; if (state == "failed") m_failed = true; @@ -174,15 +173,14 @@ size_t m_tcs_passed, m_tcs_failed, m_tcs_skipped, m_tcs_expected_failures; std::string m_tcname, m_tpname; std::vector< std::string > m_failed_tcs; - std::vector< std::string > m_expected_failures_tcs; + std::map< std::string, std::string > m_expected_failures_tcs; std::vector< std::string > m_failed_tps; void write_info(const std::string& what, const std::string& val) { if (what == "tests.root") { - (*m_os) << "Tests root: " << val << std::endl - << std::endl; + (*m_os) << "Tests root: " << val << "\n\n"; } } @@ -208,7 +206,7 @@ (*m_os) << format_text(tp + " (" + to_string(m_curtp) + "/" + to_string(m_ntps) + "): " + to_string(ntcs) + " test cases") - << std::endl; + << "\n"; (*m_os).flush(); } @@ -224,10 +222,10 @@ "trust its results because " "of `" + reason + "'", m_tpname + ": ", false) - << std::endl; + << "\n"; m_failed_tps.push_back(m_tpname); } - (*m_os) << std::endl; + (*m_os) << "\n"; (*m_os).flush(); m_tpname.clear(); @@ -252,7 +250,7 @@ state == "expected_timeout") { str = "Expected failure: " + reason; m_tcs_expected_failures++; - m_expected_failures_tcs.push_back(m_tpname + ":" + m_tcname); + m_expected_failures_tcs[m_tpname + ":" + m_tcname] = reason; } else if (state == "failed") { str = "Failed: " + reason; m_tcs_failed++; @@ -269,11 +267,30 @@ // XXX Wrap text. format_text_with_tag does not currently allow // to specify the current column, which is needed because we have // already printed the tc's name. - (*m_os) << str << std::endl; + (*m_os) << str << "\n"; m_tcname = ""; } + static void + write_expected_failures(const std::map< std::string, std::string >& xfails, + std::ostream& os) + { + using atf::ui::format_text; + using atf::ui::format_text_with_tag; + + os << format_text("Test cases for known bugs:") << "\n"; + + for (std::map< std::string, std::string >::const_iterator iter = + xfails.begin(); iter != xfails.end(); iter++) { + const std::string& name = (*iter).first; + const std::string& reason = (*iter).second; + + os << format_text_with_tag(reason, " " + name + ": ", false) + << "\n"; + } + } + void write_eof(void) { @@ -284,45 +301,36 @@ if (!m_failed_tps.empty()) { (*m_os) << format_text("Failed (bogus) test programs:") - << std::endl; + << "\n"; (*m_os) << format_text_with_tag(join(m_failed_tps, ", "), - " ", false) << std::endl - << std::endl; + " ", false) << "\n\n"; } if (!m_expected_failures_tcs.empty()) { - (*m_os) << format_text("Test cases for known bugs:") << std::endl; - (*m_os) << format_text_with_tag(join(m_expected_failures_tcs, ", "), - " ", false) << std::endl - << std::endl; + write_expected_failures(m_expected_failures_tcs, *m_os); + (*m_os) << "\n"; } if (!m_failed_tcs.empty()) { - (*m_os) << format_text("Failed test cases:") << std::endl; + (*m_os) << format_text("Failed test cases:") << "\n"; (*m_os) << format_text_with_tag(join(m_failed_tcs, ", "), - " ", false) << std::endl - << std::endl; + " ", false) << "\n\n"; } (*m_os) << format_text("Summary for " + to_string(m_ntps) + - " test programs:") - << std::endl; + " test programs:") << "\n"; (*m_os) << format_text_with_tag(to_string(m_tcs_passed) + " passed test cases.", - " ", false) - << std::endl; + " ", false) << "\n"; (*m_os) << format_text_with_tag(to_string(m_tcs_failed) + " failed test cases.", - " ", false) - << std::endl; + " ", false) << "\n"; (*m_os) << format_text_with_tag(to_string(m_tcs_expected_failures) + " expected failed test cases.", - " ", false) - << std::endl; + " ", false) << "\n"; (*m_os) << format_text_with_tag(to_string(m_tcs_skipped) + " skipped test cases.", - " ", false) - << std::endl; + " ", false) << "\n"; } public: @@ -376,41 +384,39 @@ void write_info(const std::string& what, const std::string& val) { - (*m_os) << "<info class=\"" << what << "\">" << val << "</info>" - << std::endl; + (*m_os) << "<info class=\"" << what << "\">" << val << "</info>\n"; } void write_tp_start(const std::string& tp, size_t ntcs) { - (*m_os) << "<tp id=\"" << attrval(tp) << "\">" << std::endl; + (*m_os) << "<tp id=\"" << attrval(tp) << "\">\n"; } void write_tp_end(const std::string& reason) { if (!reason.empty()) - (*m_os) << "<failed>" << elemval(reason) << "</failed>" - << std::endl; - (*m_os) << "</tp>" << std::endl; + (*m_os) << "<failed>" << elemval(reason) << "</failed>\n"; + (*m_os) << "</tp>\n"; } void write_tc_start(const std::string& tcname) { - (*m_os) << "<tc id=\"" << attrval(tcname) << "\">" << std::endl; + (*m_os) << "<tc id=\"" << attrval(tcname) << "\">\n"; } void write_tc_stdout_line(const std::string& line) { - (*m_os) << "<so>" << elemval(line) << "</so>" << std::endl; + (*m_os) << "<so>" << elemval(line) << "</so>\n"; } void write_tc_stderr_line(const std::string& line) { - (*m_os) << "<se>" << elemval(line) << "</se>" << std::endl; + (*m_os) << "<se>" << elemval(line) << "</se>\n"; } void @@ -422,37 +428,33 @@ state == "expected_failure" || state == "expected_signal" || state == "expected_timeout") { (*m_os) << "<" << state << ">" << elemval(reason) - << "</" << state << ">" << std::endl; + << "</" << state << ">\n"; } else if (state == "passed") { - (*m_os) << "<passed />" << std::endl; + (*m_os) << "<passed />\n"; } else if (state == "failed") { - (*m_os) << "<failed>" << elemval(reason) - << "</failed>" << std::endl; + (*m_os) << "<failed>" << elemval(reason) << "</failed>\n"; } else if (state == "skipped") { - (*m_os) << "<skipped>" << elemval(reason) - << "</skipped>" << std::endl; + (*m_os) << "<skipped>" << elemval(reason) << "</skipped>\n"; } else UNREACHABLE; - (*m_os) << "</tc>" << std::endl; + (*m_os) << "</tc>\n"; } void write_eof(void) { - (*m_os) << "</tests-results>" << std::endl; + (*m_os) << "</tests-results>\n"; } public: xml_writer(const atf::fs::path& p) : m_os(open_outfile(p)) { - (*m_os) << "<?xml version=\"1.0\"?>" << std::endl + (*m_os) << "<?xml version=\"1.0\"?>\n" << "<!DOCTYPE tests-results PUBLIC " "\"-//NetBSD//DTD ATF Tests Results 0.1//EN\" " - "\"http://www.NetBSD.org/XML/atf/tests-results.dtd\">" - << std::endl - << std::endl - << "<tests-results>" << std::endl; + "\"http://www.NetBSD.org/XML/atf/tests-results.dtd\">\n\n" + "<tests-results>\n"; } }; Index: src/external/bsd/atf/dist/atf-report/tests-results.css diff -u src/external/bsd/atf/dist/atf-report/tests-results.css:1.2 src/external/bsd/atf/dist/atf-report/tests-results.css:1.3 --- src/external/bsd/atf/dist/atf-report/tests-results.css:1.2 Sat Sep 4 19:19:27 2010 +++ src/external/bsd/atf/dist/atf-report/tests-results.css Wed Oct 20 09:17:23 2010 @@ -159,6 +159,6 @@ background: #ffffaa; } -table.tcs-summary td.tcr-exfail { +table.tcs-summary td.tcr-xfail { background: #ffaaff; } Index: src/external/bsd/atf/dist/atf-report/tests-results.xsl diff -u src/external/bsd/atf/dist/atf-report/tests-results.xsl:1.3 src/external/bsd/atf/dist/atf-report/tests-results.xsl:1.4 --- src/external/bsd/atf/dist/atf-report/tests-results.xsl:1.3 Sat Sep 11 03:10:57 2010 +++ src/external/bsd/atf/dist/atf-report/tests-results.xsl Wed Oct 20 09:17:23 2010 @@ -49,10 +49,12 @@ select="count(tests-results/tp/tc/failed)" /> <xsl:variable name="ntcs-skipped" select="count(tests-results/tp/tc/skipped)" /> - <xsl:variable name="ntcs-exp-fail" - select="count(tests-results/tp/tc/expected_signal) + - count(tests-results/tp/tc/expected_timeout) + - count(tests-results/tp/tc/expected_failure)" /> + <xsl:variable name="ntcs-xfail" + select="count(tests-results/tp/tc/expected_death) + + count(tests-results/tp/tc/expected_exit) + + count(tests-results/tp/tc/expected_failure) + + count(tests-results/tp/tc/expected_signal) + + count(tests-results/tp/tc/expected_timeout)" /> <xsl:template match="/"> <xsl:copy> @@ -78,8 +80,8 @@ <xsl:if test="$ntcs-failed > 0"> <xsl:call-template name="failed-tcs-summary" /> </xsl:if> - <xsl:if test="$ntcs-exp-fail > 0"> - <xsl:call-template name="exp-fail-tcs-summary" /> + <xsl:if test="$ntcs-xfail > 0"> + <xsl:call-template name="xfail-tcs-summary" /> </xsl:if> <xsl:if test="$ntcs-skipped > 0"> <xsl:call-template name="skipped-tcs-summary" /> @@ -206,17 +208,17 @@ </tr> <tr class="entry"> <xsl:choose> - <xsl:when test="$ntcs-exp-fail > 0"> - <td><p><a href="#exp-fail-tcs-summary">Expected-Fail test - cases</a></p></td> + <xsl:when test="$ntcs-xfail > 0"> + <td><p><a href="#xfail-tcs-summary">Expected + failures</a></p></td> <td class="numeric-warning"> - <p><xsl:value-of select="$ntcs-exp-fail" /></p> + <p><xsl:value-of select="$ntcs-xfail" /></p> </td> </xsl:when> <xsl:otherwise> - <td><p>Expected-Fail test cases</p></td> + <td><p>Expected failures</p></td> <td class="numeric"> - <p><xsl:value-of select="$ntcs-exp-fail" /></p> + <p><xsl:value-of select="$ntcs-xfail" /></p> </td> </xsl:otherwise> </xsl:choose> @@ -280,9 +282,9 @@ </table> </xsl:template> - <xsl:template name="exp-fail-tcs-summary"> - <a name="exp-fail-tcs-summary" /> - <h2 id="exp-fail-tcs-summary">Expected-Fail test cases summary</h2> + <xsl:template name="xfail-tcs-summary"> + <a name="xfail-tcs-summary" /> + <h2 id="xfail-tcs-summary">Expected failures summary</h2> <table class="tcs-summary"> <tr> @@ -291,7 +293,7 @@ <th><p>Reason</p></th> </tr> <xsl:apply-templates select="tp" mode="summary"> - <xsl:with-param name="which">expected</xsl:with-param> + <xsl:with-param name="which">xfail</xsl:with-param> </xsl:apply-templates> </table> </xsl:template> @@ -335,12 +337,16 @@ <xsl:choose> <xsl:when test="$which = 'passed' and tc/passed">yes</xsl:when> <xsl:when test="$which = 'failed' and tc/failed">yes</xsl:when> - <xsl:when test="$which = 'expected' and - tc/expected_failure">yes</xsl:when> - <xsl:when test="$which = 'expected' and - tc/expected_timeout">yes</xsl:when> - <xsl:when test="$which = 'expected' and - tc/expected_signal">yes</xsl:when> + <xsl:when test="$which = 'xfail' and + tc/expected_death">yes</xsl:when> + <xsl:when test="$which = 'xfail' and + tc/expected_exit">yes</xsl:when> + <xsl:when test="$which = 'xfail' and + tc/expected_failure">yes</xsl:when> + <xsl:when test="$which = 'xfail' and + tc/expected_signal">yes</xsl:when> + <xsl:when test="$which = 'xfail' and + tc/expected_timeout">yes</xsl:when> <xsl:when test="$which = 'skipped' and tc/skipped">yes</xsl:when> <xsl:when test="$which = 'all'">yes</xsl:when> <xsl:otherwise>no</xsl:otherwise> @@ -369,12 +375,16 @@ <xsl:choose> <xsl:when test="$which = 'passed' and ./passed">yes</xsl:when> <xsl:when test="$which = 'failed' and ./failed">yes</xsl:when> - <xsl:when test="$which = 'expected' and - ./expected_signal">yes</xsl:when> - <xsl:when test="$which = 'expected' and - ./expected_failure">yes</xsl:when> - <xsl:when test="$which = 'expected' and - ./expected_timeout">yes</xsl:when> + <xsl:when test="$which = 'xfail' and + ./expected_death">yes</xsl:when> + <xsl:when test="$which = 'xfail' and + ./expected_exit">yes</xsl:when> + <xsl:when test="$which = 'xfail' and + ./expected_failure">yes</xsl:when> + <xsl:when test="$which = 'xfail' and + ./expected_signal">yes</xsl:when> + <xsl:when test="$which = 'xfail' and + ./expected_timeout">yes</xsl:when> <xsl:when test="$which = 'skipped' and ./skipped">yes</xsl:when> <xsl:when test="$which = 'all'">yes</xsl:when> <xsl:otherwise>no</xsl:otherwise> @@ -385,8 +395,8 @@ <tr> <td class="tc-id"> <xsl:choose> - <xsl:when test="failed|skipped|expected_failure| - expected_timeout|expected_signal"> + <xsl:when test="expected_death|expected_exit|expected_failure| + expected_signal|expected_timeout|failed|skipped"> <p><a href="#{$full-id}"><xsl:value-of select="@id" /></a></p> </xsl:when> <xsl:otherwise> @@ -394,9 +404,10 @@ </xsl:otherwise> </xsl:choose> </td> - <xsl:apply-templates select="passed|failed|skipped| - expected_failure|expected_timeout| - expected_signal" mode="tc" /> + <xsl:apply-templates select="expected_death|expected_exit| + expected_failure|expected_timeout| + expected_signal|failed|passed| + skipped" mode="tc" /> </tr> </xsl:if> </xsl:template> @@ -406,16 +417,28 @@ <td><p>N/A</p></td> </xsl:template> + <xsl:template match="expected_death" mode="tc"> + <td class="tcr-xfail"><p>Expected death</p></td> + <td><p><xsl:apply-templates /></p></td> + </xsl:template> + + <xsl:template match="expected_exit" mode="tc"> + <td class="tcr-xfail"><p>Expected exit</p></td> + <td><p><xsl:apply-templates /></p></td> + </xsl:template> + <xsl:template match="expected_failure" mode="tc"> - <td class="tcr-exfail"><p>Expected Failure</p></td> + <td class="tcr-xfail"><p>Expected failure</p></td> <td><p><xsl:apply-templates /></p></td> </xsl:template> + <xsl:template match="expected_timeout" mode="tc"> - <td class="tcr-exfail"><p>Expected Timeout</p></td> + <td class="tcr-xfail"><p>Expected timeout</p></td> <td><p><xsl:apply-templates /></p></td> </xsl:template> + <xsl:template match="expected_signal" mode="tc"> - <td class="tcr-exfail"><p>Expected Signal</p></td> + <td class="tcr-xfail"><p>Expected signal</p></td> <td><p><xsl:apply-templates /></p></td> </xsl:template> @@ -430,24 +453,18 @@ </xsl:template> <xsl:template match="tp" mode="details"> - <xsl:apply-templates select="tc[failed|skipped|expected_timeout| - expected_failure|expected_signal]" - mode="details" /> + <xsl:apply-templates select="tc[expected_death|expected_exit| + expected_failure|expected_signal| + expected_timeout|failed|skipped]" + mode="details" /> </xsl:template> <xsl:template match="failed" mode="details"> <p class="term"><strong>FAILED</strong>: <xsl:apply-templates /></p> </xsl:template> - <xsl:template match="expected_failure" mode="details"> - <p class="term"><strong>XFAIL</strong>: <xsl:apply-templates /></p> - </xsl:template> - - <xsl:template match="expected_timeout" mode="details"> - <p class="term"><strong>XFAIL</strong>: <xsl:apply-templates /></p> - </xsl:template> - - <xsl:template match="expected_signal" mode="details"> + <xsl:template match="expected_death|expected_exit|expected_failure| + expected_signal|expected_timeout" mode="details"> <p class="term"><strong>XFAIL</strong>: <xsl:apply-templates /></p> </xsl:template> @@ -465,9 +482,10 @@ <xsl:value-of select="@id" /></h2> <h3>Termination reason</h3> - <xsl:apply-templates select="failed|skipped|expected_failure| - expected_timeout|expected_signal" - mode="details" /> + <xsl:apply-templates select="expected_death|expected_exit|expected_failure| + expected_signal|expected_timeout| + failed|skipped" + mode="details" /> <xsl:if test="so"> <h3>Standard output stream</h3> Index: src/external/bsd/atf/dist/atf-run/atf-run.cpp diff -u src/external/bsd/atf/dist/atf-run/atf-run.cpp:1.5 src/external/bsd/atf/dist/atf-run/atf-run.cpp:1.6 --- src/external/bsd/atf/dist/atf-run/atf-run.cpp:1.5 Sat Jul 3 08:11:26 2010 +++ src/external/bsd/atf/dist/atf-run/atf-run.cpp Wed Oct 20 09:17:24 2010 @@ -47,19 +47,17 @@ #include <map> #include <string> -#include "atf-c++/application.hpp" +#include "atf-c++/detail/application.hpp" #include "atf-c++/config.hpp" -#include "atf-c++/env.hpp" -#include "atf-c++/exceptions.hpp" -#include "atf-c++/fs.hpp" -#include "atf-c++/io.hpp" -#include "atf-c++/parser.hpp" -#include "atf-c++/process.hpp" -#include "atf-c++/sanity.hpp" -#include "atf-c++/signals.hpp" #include "atf-c++/tests.hpp" -#include "atf-c++/text.hpp" -#include "atf-c++/user.hpp" + +#include "atf-c++/detail/env.hpp" +#include "atf-c++/detail/exceptions.hpp" +#include "atf-c++/detail/fs.hpp" +#include "atf-c++/detail/parser.hpp" +#include "atf-c++/detail/process.hpp" +#include "atf-c++/detail/sanity.hpp" +#include "atf-c++/detail/text.hpp" #include "atffile.hpp" #include "config.hpp" @@ -232,7 +230,7 @@ } else { return test_case_result("failed", -1, broken_reason); } - } catch (const std::runtime_error& e) { + } catch (const std::runtime_error&) { return test_case_result("failed", -1, broken_reason); } } @@ -290,7 +288,7 @@ try { tcr = read_test_case_result(resfile); - } catch (const std::runtime_error& e) { + } catch (const std::runtime_error&) { return test_case_result("failed", -1, "Test program received " "signal " + atf::text::to_string(s.termsig()) + (s.coredump() ? " (core dumped)" : "")); Index: src/external/bsd/atf/dist/atf-run/test-program.cpp diff -u src/external/bsd/atf/dist/atf-run/test-program.cpp:1.4 src/external/bsd/atf/dist/atf-run/test-program.cpp:1.5 --- src/external/bsd/atf/dist/atf-run/test-program.cpp:1.4 Thu Aug 26 15:28:31 2010 +++ src/external/bsd/atf/dist/atf-run/test-program.cpp Wed Oct 20 09:17:24 2010 @@ -39,16 +39,18 @@ #include <cstdlib> #include <cstring> #include <fstream> +#include <iostream> -#include "atf-c++/env.hpp" -#include "atf-c++/parser.hpp" -#include "atf-c++/process.hpp" -#include "atf-c++/sanity.hpp" -#include "atf-c++/signals.hpp" -#include "atf-c++/text.hpp" +#include "atf-c++/detail/env.hpp" +#include "atf-c++/detail/parser.hpp" +#include "atf-c++/detail/process.hpp" +#include "atf-c++/detail/sanity.hpp" +#include "atf-c++/detail/text.hpp" #include "config.hpp" #include "fs.hpp" +#include "io.hpp" +#include "signals.hpp" #include "test-program.hpp" #include "timer.hpp" @@ -57,6 +59,20 @@ namespace { +static void +check_stream(std::ostream& os) +{ + // If we receive a signal while writing to the stream, the bad bit gets set. + // Things seem to behave fine afterwards if we clear such error condition. + // However, I'm not sure if it's safe to query errno at this point. + if (os.bad()) { + if (errno == EINTR) + os.clear(); + else + throw std::runtime_error("Failed"); + } +} + namespace atf_tp { static const atf::parser::token_type eof_type = 0; @@ -112,28 +128,6 @@ } }; -class output_muxer : public atf::io::std_muxer { - impl::atf_tps_writer& m_writer; - - void - got_stdout_line(const std::string& line) - { - m_writer.stdout_tc(line); - } - - void - got_stderr_line(const std::string& line) - { - m_writer.stderr_tc(line); - } - -public: - output_muxer(impl::atf_tps_writer& writer) : - m_writer(writer) - { - } -}; - struct get_metadata_params { const atf::fs::path& executable; const atf::tests::vars_map& config; @@ -234,8 +228,8 @@ ::umask(S_IWGRP | S_IWOTH); - for (int i = 1; i <= atf::signals::last_signo; i++) - atf::signals::reset(i); + for (int i = 1; i <= impl::last_signo; i++) + impl::reset(i); atf::env::set("HOME", workdir.str()); atf::env::unset("LANG"); @@ -360,7 +354,7 @@ } else { try { value = atf::text::to_type< int >(arg); - } catch (const std::runtime_error& e) { + } catch (const std::runtime_error&) { throw std::runtime_error("The value '" + arg + "' passed to the '" + state + "' state must be an integer"); } @@ -410,7 +404,7 @@ } else if (name == "has.cleanup") { try { (void)atf::text::to_bool(value); - } catch (const std::runtime_error& e) { + } catch (const std::runtime_error&) { throw parse_error(lineno, "The has.cleanup property requires a" " boolean value"); } @@ -430,7 +424,7 @@ } else if (name == "use.fs") { try { (void)atf::text::to_bool(value); - } catch (const std::runtime_error& e) { + } catch (const std::runtime_error&) { throw parse_error(lineno, "The use.fs property requires a boolean" " value"); } @@ -538,14 +532,14 @@ void impl::atf_tps_writer::info(const std::string& what, const std::string& val) { - m_os << "info: " << what << ", " << val << std::endl; + m_os << "info: " << what << ", " << val << "\n"; m_os.flush(); } void impl::atf_tps_writer::ntps(size_t p_ntps) { - m_os << "tps-count: " << p_ntps << std::endl; + m_os << "tps-count: " << p_ntps << "\n"; m_os.flush(); } @@ -553,7 +547,7 @@ impl::atf_tps_writer::start_tp(const std::string& tp, size_t ntcs) { m_tpname = tp; - m_os << "tp-start: " << tp << ", " << ntcs << std::endl; + m_os << "tp-start: " << tp << ", " << ntcs << "\n"; m_os.flush(); } @@ -562,9 +556,9 @@ { PRE(reason.find('\n') == std::string::npos); if (reason.empty()) - m_os << "tp-end: " << m_tpname << std::endl; + m_os << "tp-end: " << m_tpname << "\n"; else - m_os << "tp-end: " << m_tpname << ", " << reason << std::endl; + m_os << "tp-end: " << m_tpname << ", " << reason << "\n"; m_os.flush(); } @@ -572,22 +566,26 @@ impl::atf_tps_writer::start_tc(const std::string& tcname) { m_tcname = tcname; - m_os << "tc-start: " << tcname << std::endl; + m_os << "tc-start: " << tcname << "\n"; m_os.flush(); } void impl::atf_tps_writer::stdout_tc(const std::string& line) { - m_os << "tc-so:" << line << std::endl; + m_os << "tc-so:" << line << "\n"; + check_stream(m_os); m_os.flush(); + check_stream(m_os); } void impl::atf_tps_writer::stderr_tc(const std::string& line) { - m_os << "tc-se:" << line << std::endl; + m_os << "tc-se:" << line << "\n"; + check_stream(m_os); m_os.flush(); + check_stream(m_os); } void @@ -597,7 +595,7 @@ std::string str = "tc-end: " + m_tcname + ", " + state; if (!reason.empty()) str += ", " + reason; - m_os << str << std::endl; + m_os << str << "\n"; m_os.flush(); } @@ -612,8 +610,7 @@ atf::process::stream_inherit(), static_cast< void * >(¶ms)); - atf::io::file_handle outfh = child.stdout_fd(); - atf::io::pistream outin(outfh); + impl::pistream outin(child.stdout_fd()); metadata_reader parser(outin); parser.read(); @@ -648,14 +645,36 @@ namespace { -static bool sigchld_received; +static volatile bool terminate_poll; static void sigchld_handler(const int signo) { - sigchld_received = true; + terminate_poll = true; } +class child_muxer : public impl::muxer { + impl::atf_tps_writer& m_writer; + + void + line_callback(const size_t index, const std::string& line) + { + switch (index) { + case 0: m_writer.stdout_tc(line); break; + case 1: m_writer.stderr_tc(line); break; + default: UNREACHABLE; + } + } + +public: + child_muxer(const int* fds, const size_t nfds, + impl::atf_tps_writer& writer) : + muxer(fds, nfds), + m_writer(writer) + { + } +}; + } // anonymous namespace std::pair< std::string, atf::process::status > @@ -679,39 +698,41 @@ atf::process::stream_capture(), static_cast< void * >(¶ms)); + terminate_poll = false; + const atf::tests::vars_map::const_iterator iter = metadata.find("timeout"); INV(iter != metadata.end()); const unsigned int timeout = atf::text::to_type< unsigned int >((*iter).second); const pid_t child_pid = child.pid(); - child_timer timeout_timer(timeout, child_pid); // Get the input stream of stdout and stderr. - atf::io::file_handle outfh = child.stdout_fd(); - atf::io::unbuffered_istream outin(outfh); - atf::io::file_handle errfh = child.stderr_fd(); - atf::io::unbuffered_istream errin(errfh); + impl::file_handle outfh = child.stdout_fd(); + impl::file_handle errfh = child.stderr_fd(); + + bool timed_out = false; // Process the test case's output and multiplex it into our output // stream as we read it. + int fds[2] = {outfh.get(), errfh.get()}; + child_muxer mux(fds, 2, writer); try { - atf::signals::signal_programmer sigchld(SIGCHLD, sigchld_handler); - - output_muxer muxer(writer); - sigchld_received = false; - muxer.read(outin, errin, sigchld_received); - outin.close(); - errin.close(); + child_timer timeout_timer(timeout, child_pid, terminate_poll); + signal_programmer sigchld(SIGCHLD, sigchld_handler); + mux.mux(terminate_poll); + timed_out = timeout_timer.fired(); } catch (...) { UNREACHABLE; } + ::killpg(child_pid, SIGTERM); + mux.flush(); atf::process::status status = child.wait(); ::killpg(child_pid, SIGKILL); std::string reason; - if (timeout_timer.fired()) { + if (timed_out) { // Don't assume the child process has been signaled due to the timeout // expiration as older versions did. The child process may have exited // but we may have timed out due to a subchild process getting stuck. Index: src/external/bsd/atf/dist/atf-run/test-program.hpp diff -u src/external/bsd/atf/dist/atf-run/test-program.hpp:1.3 src/external/bsd/atf/dist/atf-run/test-program.hpp:1.4 --- src/external/bsd/atf/dist/atf-run/test-program.hpp:1.3 Sat Jul 3 08:11:26 2010 +++ src/external/bsd/atf/dist/atf-run/test-program.hpp Wed Oct 20 09:17:24 2010 @@ -29,9 +29,10 @@ #include <map> -#include <atf-c++/fs.hpp> -#include <atf-c++/process.hpp> -#include <atf-c++/tests.hpp> +#include "atf-c++/tests.hpp" + +#include "atf-c++/detail/fs.hpp" +#include "atf-c++/detail/process.hpp" namespace atf { namespace atf_run { Index: src/external/bsd/atf/dist/atf-version/atf-version.cpp diff -u src/external/bsd/atf/dist/atf-version/atf-version.cpp:1.4 src/external/bsd/atf/dist/atf-version/atf-version.cpp:1.5 --- src/external/bsd/atf/dist/atf-version/atf-version.cpp:1.4 Sat Jul 3 08:11:26 2010 +++ src/external/bsd/atf/dist/atf-version/atf-version.cpp Wed Oct 20 09:17:24 2010 @@ -34,8 +34,8 @@ #include <cstdlib> #include <iostream> -#include "atf-c++/application.hpp" -#include "atf-c++/ui.hpp" +#include "atf-c++/detail/application.hpp" +#include "atf-c++/detail/ui.hpp" #include "revision.h"