1// 2// Automated Testing Framework (atf) 3// 4// Copyright (c) 2010 The NetBSD Foundation, Inc. 5// All rights reserved. 6// 7// Redistribution and use in source and binary forms, with or without 8// modification, are permitted provided that the following conditions 9// are met: 10// 1. Redistributions of source code must retain the above copyright 11// notice, this list of conditions and the following disclaimer. 12// 2. Redistributions in binary form must reproduce the above copyright 13// notice, this list of conditions and the following disclaimer in the 14// documentation and/or other materials provided with the distribution. 15// 16// THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 17// CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 18// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20// IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 21// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 23// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 26// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27// IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28// 29 30#include <map> 31 32#include "atf-c++/tests.hpp" 33 34#include "atf-c++/detail/fs.hpp" 35#include "atf-c++/detail/process.hpp" 36 37namespace atf { 38namespace atf_run { 39 40struct test_case_result { 41 std::string m_state; 42 int m_value; 43 std::string m_reason; 44 45public: 46 test_case_result(void) : 47 m_state("UNINITIALIZED"), 48 m_value(-1), 49 m_reason("") 50 { 51 } 52 53 test_case_result(const std::string& p_state, const int p_value, 54 const std::string& p_reason) : 55 m_state(p_state), 56 m_value(p_value), 57 m_reason(p_reason) 58 { 59 } 60 61 const std::string& 62 state(void) const 63 { 64 return m_state; 65 } 66 67 int 68 value(void) const 69 { 70 return m_value; 71 } 72 73 const std::string& 74 reason(void) const 75 { 76 return m_reason; 77 } 78}; 79 80namespace detail { 81 82class atf_tp_reader { 83 std::istream& m_is; 84 85 void validate_and_insert(const std::string&, const std::string&, 86 const size_t, 87 std::map< std::string, std::string >&); 88 89protected: 90 virtual void got_tc(const std::string&, 91 const std::map< std::string, std::string >&); 92 virtual void got_eof(void); 93 94public: 95 atf_tp_reader(std::istream&); 96 virtual ~atf_tp_reader(void); 97 98 void read(void); 99}; 100 101test_case_result parse_test_case_result(const std::string&); 102 103} // namespace detail 104 105class atf_tps_writer { 106 std::ostream& m_os; 107 108 std::string m_tpname, m_tcname; 109 110public: 111 atf_tps_writer(std::ostream&); 112 113 void info(const std::string&, const std::string&); 114 void ntps(size_t); 115 116 void start_tp(const std::string&, size_t); 117 void end_tp(const std::string&); 118 119 void start_tc(const std::string&); 120 void stdout_tc(const std::string&); 121 void stderr_tc(const std::string&); 122 void end_tc(const std::string&, const std::string&); 123}; 124 125typedef std::map< std::string, atf::tests::vars_map > test_cases_map; 126 127struct metadata { 128 test_cases_map test_cases; 129 130 metadata(void) 131 { 132 } 133 134 metadata(const test_cases_map& p_test_cases) : 135 test_cases(p_test_cases) 136 { 137 } 138}; 139 140class atf_tps_writer; 141 142metadata get_metadata(const atf::fs::path&, const atf::tests::vars_map&); 143test_case_result read_test_case_result(const atf::fs::path&); 144std::pair< std::string, atf::process::status > run_test_case( 145 const atf::fs::path&, const std::string&, const std::string&, 146 const atf::tests::vars_map&, const atf::tests::vars_map&, 147 const atf::fs::path&, const atf::fs::path&, atf_tps_writer&); 148 149} // namespace atf_run 150} // namespace atf 151