xref: /minix3/external/bsd/bind/dist/unit/atf-src/atf-run/test_program_test.cpp (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek //
2*00b67f09SDavid van Moolenbroek // Automated Testing Framework (atf)
3*00b67f09SDavid van Moolenbroek //
4*00b67f09SDavid van Moolenbroek // Copyright (c) 2010 The NetBSD Foundation, Inc.
5*00b67f09SDavid van Moolenbroek // All rights reserved.
6*00b67f09SDavid van Moolenbroek //
7*00b67f09SDavid van Moolenbroek // Redistribution and use in source and binary forms, with or without
8*00b67f09SDavid van Moolenbroek // modification, are permitted provided that the following conditions
9*00b67f09SDavid van Moolenbroek // are met:
10*00b67f09SDavid van Moolenbroek // 1. Redistributions of source code must retain the above copyright
11*00b67f09SDavid van Moolenbroek //    notice, this list of conditions and the following disclaimer.
12*00b67f09SDavid van Moolenbroek // 2. Redistributions in binary form must reproduce the above copyright
13*00b67f09SDavid van Moolenbroek //    notice, this list of conditions and the following disclaimer in the
14*00b67f09SDavid van Moolenbroek //    documentation and/or other materials provided with the distribution.
15*00b67f09SDavid van Moolenbroek //
16*00b67f09SDavid van Moolenbroek // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17*00b67f09SDavid van Moolenbroek // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18*00b67f09SDavid van Moolenbroek // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19*00b67f09SDavid van Moolenbroek // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20*00b67f09SDavid van Moolenbroek // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21*00b67f09SDavid van Moolenbroek // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*00b67f09SDavid van Moolenbroek // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23*00b67f09SDavid van Moolenbroek // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*00b67f09SDavid van Moolenbroek // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25*00b67f09SDavid van Moolenbroek // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26*00b67f09SDavid van Moolenbroek // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27*00b67f09SDavid van Moolenbroek // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*00b67f09SDavid van Moolenbroek //
29*00b67f09SDavid van Moolenbroek 
30*00b67f09SDavid van Moolenbroek #include <fstream>
31*00b67f09SDavid van Moolenbroek #include <iostream>
32*00b67f09SDavid van Moolenbroek 
33*00b67f09SDavid van Moolenbroek #include "atf-c++/macros.hpp"
34*00b67f09SDavid van Moolenbroek 
35*00b67f09SDavid van Moolenbroek #include "atf-c++/detail/parser.hpp"
36*00b67f09SDavid van Moolenbroek #include "atf-c++/detail/test_helpers.hpp"
37*00b67f09SDavid van Moolenbroek #include "atf-c++/detail/text.hpp"
38*00b67f09SDavid van Moolenbroek 
39*00b67f09SDavid van Moolenbroek #include "test-program.hpp"
40*00b67f09SDavid van Moolenbroek 
41*00b67f09SDavid van Moolenbroek namespace impl = atf::atf_run;
42*00b67f09SDavid van Moolenbroek namespace detail = atf::atf_run::detail;
43*00b67f09SDavid van Moolenbroek 
44*00b67f09SDavid van Moolenbroek using atf::tests::vars_map;
45*00b67f09SDavid van Moolenbroek 
46*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
47*00b67f09SDavid van Moolenbroek // Auxiliary functions.
48*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
49*00b67f09SDavid van Moolenbroek 
50*00b67f09SDavid van Moolenbroek static
51*00b67f09SDavid van Moolenbroek atf::fs::path
get_helper(const atf::tests::tc & tc,const char * name)52*00b67f09SDavid van Moolenbroek get_helper(const atf::tests::tc& tc, const char* name)
53*00b67f09SDavid van Moolenbroek {
54*00b67f09SDavid van Moolenbroek     return atf::fs::path(tc.get_config_var("srcdir")) / name;
55*00b67f09SDavid van Moolenbroek }
56*00b67f09SDavid van Moolenbroek 
57*00b67f09SDavid van Moolenbroek static
58*00b67f09SDavid van Moolenbroek void
check_property(const vars_map & props,const char * name,const char * value)59*00b67f09SDavid van Moolenbroek check_property(const vars_map& props, const char* name, const char* value)
60*00b67f09SDavid van Moolenbroek {
61*00b67f09SDavid van Moolenbroek     const vars_map::const_iterator iter = props.find(name);
62*00b67f09SDavid van Moolenbroek     ATF_REQUIRE(iter != props.end());
63*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_EQ(value, (*iter).second);
64*00b67f09SDavid van Moolenbroek }
65*00b67f09SDavid van Moolenbroek 
66*00b67f09SDavid van Moolenbroek static void
check_result(const char * exp_state,const int exp_value,const char * exp_reason,const impl::test_case_result & tcr)67*00b67f09SDavid van Moolenbroek check_result(const char* exp_state, const int exp_value, const char* exp_reason,
68*00b67f09SDavid van Moolenbroek              const impl::test_case_result& tcr)
69*00b67f09SDavid van Moolenbroek {
70*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_EQ(exp_state, tcr.state());
71*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_EQ(exp_value, tcr.value());
72*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_EQ(exp_reason, tcr.reason());
73*00b67f09SDavid van Moolenbroek }
74*00b67f09SDavid van Moolenbroek 
75*00b67f09SDavid van Moolenbroek static
76*00b67f09SDavid van Moolenbroek void
write_test_case_result(const char * results_path,const std::string & contents)77*00b67f09SDavid van Moolenbroek write_test_case_result(const char *results_path, const std::string& contents)
78*00b67f09SDavid van Moolenbroek {
79*00b67f09SDavid van Moolenbroek     std::ofstream results_file(results_path);
80*00b67f09SDavid van Moolenbroek     ATF_REQUIRE(results_file);
81*00b67f09SDavid van Moolenbroek 
82*00b67f09SDavid van Moolenbroek     results_file << contents;
83*00b67f09SDavid van Moolenbroek }
84*00b67f09SDavid van Moolenbroek 
85*00b67f09SDavid van Moolenbroek static
86*00b67f09SDavid van Moolenbroek void
print_indented(const std::string & str)87*00b67f09SDavid van Moolenbroek print_indented(const std::string& str)
88*00b67f09SDavid van Moolenbroek {
89*00b67f09SDavid van Moolenbroek     std::vector< std::string > ws = atf::text::split(str, "\n");
90*00b67f09SDavid van Moolenbroek     for (std::vector< std::string >::const_iterator iter = ws.begin();
91*00b67f09SDavid van Moolenbroek          iter != ws.end(); iter++)
92*00b67f09SDavid van Moolenbroek         std::cout << ">>" << *iter << "<<\n";
93*00b67f09SDavid van Moolenbroek }
94*00b67f09SDavid van Moolenbroek 
95*00b67f09SDavid van Moolenbroek // XXX Should this string handling and verbosity level be part of the
96*00b67f09SDavid van Moolenbroek // ATF_REQUIRE_EQ macro?  It may be hard to predict sometimes that a
97*00b67f09SDavid van Moolenbroek // string can have newlines in it, and so the error message generated
98*00b67f09SDavid van Moolenbroek // at the moment will be bogus if there are some.
99*00b67f09SDavid van Moolenbroek static
100*00b67f09SDavid van Moolenbroek void
check_match(const atf::tests::tc & tc,const std::string & str,const std::string & exp)101*00b67f09SDavid van Moolenbroek check_match(const atf::tests::tc& tc, const std::string& str,
102*00b67f09SDavid van Moolenbroek             const std::string& exp)
103*00b67f09SDavid van Moolenbroek {
104*00b67f09SDavid van Moolenbroek     if (!atf::text::match(str, exp)) {
105*00b67f09SDavid van Moolenbroek         std::cout << "String match check failed.\n"
106*00b67f09SDavid van Moolenbroek                   << "Adding >> and << to delimit the string boundaries "
107*00b67f09SDavid van Moolenbroek                      "below.\n";
108*00b67f09SDavid van Moolenbroek         std::cout << "GOT:\n";
109*00b67f09SDavid van Moolenbroek         print_indented(str);
110*00b67f09SDavid van Moolenbroek         std::cout << "EXPECTED:\n";
111*00b67f09SDavid van Moolenbroek         print_indented(exp);
112*00b67f09SDavid van Moolenbroek         tc.fail("Constructed string differs from the expected one");
113*00b67f09SDavid van Moolenbroek     }
114*00b67f09SDavid van Moolenbroek }
115*00b67f09SDavid van Moolenbroek 
116*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
117*00b67f09SDavid van Moolenbroek // Tests for the "tp" reader.
118*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
119*00b67f09SDavid van Moolenbroek 
120*00b67f09SDavid van Moolenbroek class tp_reader : protected detail::atf_tp_reader {
121*00b67f09SDavid van Moolenbroek     void
got_tc(const std::string & ident,const std::map<std::string,std::string> & md)122*00b67f09SDavid van Moolenbroek     got_tc(const std::string& ident,
123*00b67f09SDavid van Moolenbroek            const std::map< std::string, std::string >& md)
124*00b67f09SDavid van Moolenbroek     {
125*00b67f09SDavid van Moolenbroek         std::string call = "got_tc(" + ident + ", {";
126*00b67f09SDavid van Moolenbroek         for (std::map< std::string, std::string >::const_iterator iter =
127*00b67f09SDavid van Moolenbroek              md.begin(); iter != md.end(); iter++) {
128*00b67f09SDavid van Moolenbroek             if (iter != md.begin())
129*00b67f09SDavid van Moolenbroek                 call += ", ";
130*00b67f09SDavid van Moolenbroek             call += (*iter).first + '=' + (*iter).second;
131*00b67f09SDavid van Moolenbroek         }
132*00b67f09SDavid van Moolenbroek         call += "})";
133*00b67f09SDavid van Moolenbroek         m_calls.push_back(call);
134*00b67f09SDavid van Moolenbroek     }
135*00b67f09SDavid van Moolenbroek 
136*00b67f09SDavid van Moolenbroek     void
got_eof(void)137*00b67f09SDavid van Moolenbroek     got_eof(void)
138*00b67f09SDavid van Moolenbroek     {
139*00b67f09SDavid van Moolenbroek         m_calls.push_back("got_eof()");
140*00b67f09SDavid van Moolenbroek     }
141*00b67f09SDavid van Moolenbroek 
142*00b67f09SDavid van Moolenbroek public:
tp_reader(std::istream & is)143*00b67f09SDavid van Moolenbroek     tp_reader(std::istream& is) :
144*00b67f09SDavid van Moolenbroek         detail::atf_tp_reader(is)
145*00b67f09SDavid van Moolenbroek     {
146*00b67f09SDavid van Moolenbroek     }
147*00b67f09SDavid van Moolenbroek 
148*00b67f09SDavid van Moolenbroek     void
read(void)149*00b67f09SDavid van Moolenbroek     read(void)
150*00b67f09SDavid van Moolenbroek     {
151*00b67f09SDavid van Moolenbroek         atf_tp_reader::read();
152*00b67f09SDavid van Moolenbroek     }
153*00b67f09SDavid van Moolenbroek 
154*00b67f09SDavid van Moolenbroek     std::vector< std::string > m_calls;
155*00b67f09SDavid van Moolenbroek };
156*00b67f09SDavid van Moolenbroek 
157*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(tp_1);
ATF_TEST_CASE_BODY(tp_1)158*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(tp_1)
159*00b67f09SDavid van Moolenbroek {
160*00b67f09SDavid van Moolenbroek     const char* input =
161*00b67f09SDavid van Moolenbroek         "Content-Type: application/X-atf-tp; version=\"1\"\n"
162*00b67f09SDavid van Moolenbroek         "\n"
163*00b67f09SDavid van Moolenbroek         "ident: test_case_1\n"
164*00b67f09SDavid van Moolenbroek         "\n"
165*00b67f09SDavid van Moolenbroek         "ident: test_case_2\n"
166*00b67f09SDavid van Moolenbroek         "\n"
167*00b67f09SDavid van Moolenbroek         "ident: test_case_3\n"
168*00b67f09SDavid van Moolenbroek     ;
169*00b67f09SDavid van Moolenbroek 
170*00b67f09SDavid van Moolenbroek     const char* exp_calls[] = {
171*00b67f09SDavid van Moolenbroek         "got_tc(test_case_1, {ident=test_case_1})",
172*00b67f09SDavid van Moolenbroek         "got_tc(test_case_2, {ident=test_case_2})",
173*00b67f09SDavid van Moolenbroek         "got_tc(test_case_3, {ident=test_case_3})",
174*00b67f09SDavid van Moolenbroek         "got_eof()",
175*00b67f09SDavid van Moolenbroek         NULL
176*00b67f09SDavid van Moolenbroek     };
177*00b67f09SDavid van Moolenbroek 
178*00b67f09SDavid van Moolenbroek     const char* exp_errors[] = {
179*00b67f09SDavid van Moolenbroek         NULL
180*00b67f09SDavid van Moolenbroek     };
181*00b67f09SDavid van Moolenbroek 
182*00b67f09SDavid van Moolenbroek     do_parser_test< tp_reader >(input, exp_calls, exp_errors);
183*00b67f09SDavid van Moolenbroek }
184*00b67f09SDavid van Moolenbroek 
185*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(tp_2);
ATF_TEST_CASE_BODY(tp_2)186*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(tp_2)
187*00b67f09SDavid van Moolenbroek {
188*00b67f09SDavid van Moolenbroek     const char* input =
189*00b67f09SDavid van Moolenbroek         "Content-Type: application/X-atf-tp; version=\"1\"\n"
190*00b67f09SDavid van Moolenbroek         "\n"
191*00b67f09SDavid van Moolenbroek         "ident: test_case_1\n"
192*00b67f09SDavid van Moolenbroek         "descr: This is the description\n"
193*00b67f09SDavid van Moolenbroek         "timeout: 300\n"
194*00b67f09SDavid van Moolenbroek         "\n"
195*00b67f09SDavid van Moolenbroek         "ident: test_case_2\n"
196*00b67f09SDavid van Moolenbroek         "\n"
197*00b67f09SDavid van Moolenbroek         "ident: test_case_3\n"
198*00b67f09SDavid van Moolenbroek         "X-prop1: A custom property\n"
199*00b67f09SDavid van Moolenbroek         "descr: Third test case\n"
200*00b67f09SDavid van Moolenbroek     ;
201*00b67f09SDavid van Moolenbroek 
202*00b67f09SDavid van Moolenbroek     // NO_CHECK_STYLE_BEGIN
203*00b67f09SDavid van Moolenbroek     const char* exp_calls[] = {
204*00b67f09SDavid van Moolenbroek         "got_tc(test_case_1, {descr=This is the description, ident=test_case_1, timeout=300})",
205*00b67f09SDavid van Moolenbroek         "got_tc(test_case_2, {ident=test_case_2})",
206*00b67f09SDavid van Moolenbroek         "got_tc(test_case_3, {X-prop1=A custom property, descr=Third test case, ident=test_case_3})",
207*00b67f09SDavid van Moolenbroek         "got_eof()",
208*00b67f09SDavid van Moolenbroek         NULL
209*00b67f09SDavid van Moolenbroek     };
210*00b67f09SDavid van Moolenbroek     // NO_CHECK_STYLE_END
211*00b67f09SDavid van Moolenbroek 
212*00b67f09SDavid van Moolenbroek     const char* exp_errors[] = {
213*00b67f09SDavid van Moolenbroek         NULL
214*00b67f09SDavid van Moolenbroek     };
215*00b67f09SDavid van Moolenbroek 
216*00b67f09SDavid van Moolenbroek     do_parser_test< tp_reader >(input, exp_calls, exp_errors);
217*00b67f09SDavid van Moolenbroek }
218*00b67f09SDavid van Moolenbroek 
219*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(tp_3);
ATF_TEST_CASE_BODY(tp_3)220*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(tp_3)
221*00b67f09SDavid van Moolenbroek {
222*00b67f09SDavid van Moolenbroek     const char* input =
223*00b67f09SDavid van Moolenbroek         "Content-Type: application/X-atf-tp; version=\"1\"\n"
224*00b67f09SDavid van Moolenbroek         "\n"
225*00b67f09SDavid van Moolenbroek         "ident: single_test\n"
226*00b67f09SDavid van Moolenbroek         "descr: Some description\n"
227*00b67f09SDavid van Moolenbroek         "timeout: 300\n"
228*00b67f09SDavid van Moolenbroek         "require.arch: thearch\n"
229*00b67f09SDavid van Moolenbroek         "require.config: foo-bar\n"
230*00b67f09SDavid van Moolenbroek         "require.files: /a/1 /b/2\n"
231*00b67f09SDavid van Moolenbroek         "require.machine: themachine\n"
232*00b67f09SDavid van Moolenbroek         "require.progs: /bin/cp mv\n"
233*00b67f09SDavid van Moolenbroek         "require.user: root\n"
234*00b67f09SDavid van Moolenbroek     ;
235*00b67f09SDavid van Moolenbroek 
236*00b67f09SDavid van Moolenbroek     // NO_CHECK_STYLE_BEGIN
237*00b67f09SDavid van Moolenbroek     const char* exp_calls[] = {
238*00b67f09SDavid van Moolenbroek         "got_tc(single_test, {descr=Some description, ident=single_test, require.arch=thearch, require.config=foo-bar, require.files=/a/1 /b/2, require.machine=themachine, require.progs=/bin/cp mv, require.user=root, timeout=300})",
239*00b67f09SDavid van Moolenbroek         "got_eof()",
240*00b67f09SDavid van Moolenbroek         NULL
241*00b67f09SDavid van Moolenbroek     };
242*00b67f09SDavid van Moolenbroek     // NO_CHECK_STYLE_END
243*00b67f09SDavid van Moolenbroek 
244*00b67f09SDavid van Moolenbroek     const char* exp_errors[] = {
245*00b67f09SDavid van Moolenbroek         NULL
246*00b67f09SDavid van Moolenbroek     };
247*00b67f09SDavid van Moolenbroek 
248*00b67f09SDavid van Moolenbroek     do_parser_test< tp_reader >(input, exp_calls, exp_errors);
249*00b67f09SDavid van Moolenbroek }
250*00b67f09SDavid van Moolenbroek 
251*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(tp_4);
ATF_TEST_CASE_BODY(tp_4)252*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(tp_4)
253*00b67f09SDavid van Moolenbroek {
254*00b67f09SDavid van Moolenbroek     const char* input =
255*00b67f09SDavid van Moolenbroek         "Content-Type: application/X-atf-tp; version=\"1\"\n"
256*00b67f09SDavid van Moolenbroek         "\n"
257*00b67f09SDavid van Moolenbroek         "ident:   single_test    \n"
258*00b67f09SDavid van Moolenbroek         "descr:      Some description	\n"
259*00b67f09SDavid van Moolenbroek     ;
260*00b67f09SDavid van Moolenbroek 
261*00b67f09SDavid van Moolenbroek     const char* exp_calls[] = {
262*00b67f09SDavid van Moolenbroek         "got_tc(single_test, {descr=Some description, ident=single_test})",
263*00b67f09SDavid van Moolenbroek         "got_eof()",
264*00b67f09SDavid van Moolenbroek         NULL
265*00b67f09SDavid van Moolenbroek     };
266*00b67f09SDavid van Moolenbroek 
267*00b67f09SDavid van Moolenbroek     const char* exp_errors[] = {
268*00b67f09SDavid van Moolenbroek         NULL
269*00b67f09SDavid van Moolenbroek     };
270*00b67f09SDavid van Moolenbroek 
271*00b67f09SDavid van Moolenbroek     do_parser_test< tp_reader >(input, exp_calls, exp_errors);
272*00b67f09SDavid van Moolenbroek }
273*00b67f09SDavid van Moolenbroek 
274*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(tp_50);
ATF_TEST_CASE_BODY(tp_50)275*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(tp_50)
276*00b67f09SDavid van Moolenbroek {
277*00b67f09SDavid van Moolenbroek     const char* input =
278*00b67f09SDavid van Moolenbroek         "Content-Type: application/X-atf-tp; version=\"1\"\n"
279*00b67f09SDavid van Moolenbroek         "\n"
280*00b67f09SDavid van Moolenbroek     ;
281*00b67f09SDavid van Moolenbroek 
282*00b67f09SDavid van Moolenbroek     const char* exp_calls[] = {
283*00b67f09SDavid van Moolenbroek         NULL
284*00b67f09SDavid van Moolenbroek     };
285*00b67f09SDavid van Moolenbroek 
286*00b67f09SDavid van Moolenbroek     const char* exp_errors[] = {
287*00b67f09SDavid van Moolenbroek         "3: Unexpected token `<<EOF>>'; expected property name",
288*00b67f09SDavid van Moolenbroek         NULL
289*00b67f09SDavid van Moolenbroek     };
290*00b67f09SDavid van Moolenbroek 
291*00b67f09SDavid van Moolenbroek     do_parser_test< tp_reader >(input, exp_calls, exp_errors);
292*00b67f09SDavid van Moolenbroek }
293*00b67f09SDavid van Moolenbroek 
294*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(tp_51);
ATF_TEST_CASE_BODY(tp_51)295*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(tp_51)
296*00b67f09SDavid van Moolenbroek {
297*00b67f09SDavid van Moolenbroek     const char* input =
298*00b67f09SDavid van Moolenbroek         "Content-Type: application/X-atf-tp; version=\"1\"\n"
299*00b67f09SDavid van Moolenbroek         "\n"
300*00b67f09SDavid van Moolenbroek         "\n"
301*00b67f09SDavid van Moolenbroek         "\n"
302*00b67f09SDavid van Moolenbroek         "\n"
303*00b67f09SDavid van Moolenbroek     ;
304*00b67f09SDavid van Moolenbroek 
305*00b67f09SDavid van Moolenbroek     const char* exp_calls[] = {
306*00b67f09SDavid van Moolenbroek         NULL
307*00b67f09SDavid van Moolenbroek     };
308*00b67f09SDavid van Moolenbroek 
309*00b67f09SDavid van Moolenbroek     const char* exp_errors[] = {
310*00b67f09SDavid van Moolenbroek         "3: Unexpected token `<<NEWLINE>>'; expected property name",
311*00b67f09SDavid van Moolenbroek         NULL
312*00b67f09SDavid van Moolenbroek     };
313*00b67f09SDavid van Moolenbroek 
314*00b67f09SDavid van Moolenbroek     do_parser_test< tp_reader >(input, exp_calls, exp_errors);
315*00b67f09SDavid van Moolenbroek }
316*00b67f09SDavid van Moolenbroek 
317*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(tp_52);
ATF_TEST_CASE_BODY(tp_52)318*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(tp_52)
319*00b67f09SDavid van Moolenbroek {
320*00b67f09SDavid van Moolenbroek     const char* input =
321*00b67f09SDavid van Moolenbroek         "Content-Type: application/X-atf-tp; version=\"1\"\n"
322*00b67f09SDavid van Moolenbroek         "\n"
323*00b67f09SDavid van Moolenbroek         "ident: test1\n"
324*00b67f09SDavid van Moolenbroek         "ident: test2\n"
325*00b67f09SDavid van Moolenbroek     ;
326*00b67f09SDavid van Moolenbroek 
327*00b67f09SDavid van Moolenbroek     const char* exp_calls[] = {
328*00b67f09SDavid van Moolenbroek         "got_tc(test1, {ident=test1})",
329*00b67f09SDavid van Moolenbroek         "got_eof()",
330*00b67f09SDavid van Moolenbroek         NULL
331*00b67f09SDavid van Moolenbroek     };
332*00b67f09SDavid van Moolenbroek 
333*00b67f09SDavid van Moolenbroek     const char* exp_errors[] = {
334*00b67f09SDavid van Moolenbroek         NULL
335*00b67f09SDavid van Moolenbroek     };
336*00b67f09SDavid van Moolenbroek 
337*00b67f09SDavid van Moolenbroek     do_parser_test< tp_reader >(input, exp_calls, exp_errors);
338*00b67f09SDavid van Moolenbroek }
339*00b67f09SDavid van Moolenbroek 
340*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(tp_53);
ATF_TEST_CASE_BODY(tp_53)341*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(tp_53)
342*00b67f09SDavid van Moolenbroek {
343*00b67f09SDavid van Moolenbroek     const char* input =
344*00b67f09SDavid van Moolenbroek         "Content-Type: application/X-atf-tp; version=\"1\"\n"
345*00b67f09SDavid van Moolenbroek         "\n"
346*00b67f09SDavid van Moolenbroek         "descr: Out of order\n"
347*00b67f09SDavid van Moolenbroek         "ident: test1\n"
348*00b67f09SDavid van Moolenbroek     ;
349*00b67f09SDavid van Moolenbroek 
350*00b67f09SDavid van Moolenbroek     const char* exp_calls[] = {
351*00b67f09SDavid van Moolenbroek         NULL
352*00b67f09SDavid van Moolenbroek     };
353*00b67f09SDavid van Moolenbroek 
354*00b67f09SDavid van Moolenbroek     const char* exp_errors[] = {
355*00b67f09SDavid van Moolenbroek         "3: First property of a test case must be 'ident'",
356*00b67f09SDavid van Moolenbroek         NULL
357*00b67f09SDavid van Moolenbroek     };
358*00b67f09SDavid van Moolenbroek 
359*00b67f09SDavid van Moolenbroek     do_parser_test< tp_reader >(input, exp_calls, exp_errors);
360*00b67f09SDavid van Moolenbroek }
361*00b67f09SDavid van Moolenbroek 
362*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(tp_54);
ATF_TEST_CASE_BODY(tp_54)363*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(tp_54)
364*00b67f09SDavid van Moolenbroek {
365*00b67f09SDavid van Moolenbroek     const char* input =
366*00b67f09SDavid van Moolenbroek         "Content-Type: application/X-atf-tp; version=\"1\"\n"
367*00b67f09SDavid van Moolenbroek         "\n"
368*00b67f09SDavid van Moolenbroek         "ident:\n"
369*00b67f09SDavid van Moolenbroek     ;
370*00b67f09SDavid van Moolenbroek 
371*00b67f09SDavid van Moolenbroek     const char* exp_calls[] = {
372*00b67f09SDavid van Moolenbroek         NULL
373*00b67f09SDavid van Moolenbroek     };
374*00b67f09SDavid van Moolenbroek 
375*00b67f09SDavid van Moolenbroek     const char* exp_errors[] = {
376*00b67f09SDavid van Moolenbroek         "3: The value for 'ident' cannot be empty",
377*00b67f09SDavid van Moolenbroek         NULL
378*00b67f09SDavid van Moolenbroek     };
379*00b67f09SDavid van Moolenbroek 
380*00b67f09SDavid van Moolenbroek     do_parser_test< tp_reader >(input, exp_calls, exp_errors);
381*00b67f09SDavid van Moolenbroek }
382*00b67f09SDavid van Moolenbroek 
383*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(tp_55);
ATF_TEST_CASE_BODY(tp_55)384*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(tp_55)
385*00b67f09SDavid van Moolenbroek {
386*00b67f09SDavid van Moolenbroek     const char* input =
387*00b67f09SDavid van Moolenbroek         "Content-Type: application/X-atf-tp; version=\"1\"\n"
388*00b67f09SDavid van Moolenbroek         "\n"
389*00b67f09SDavid van Moolenbroek         "ident: +*,\n"
390*00b67f09SDavid van Moolenbroek     ;
391*00b67f09SDavid van Moolenbroek 
392*00b67f09SDavid van Moolenbroek     const char* exp_calls[] = {
393*00b67f09SDavid van Moolenbroek         NULL
394*00b67f09SDavid van Moolenbroek     };
395*00b67f09SDavid van Moolenbroek 
396*00b67f09SDavid van Moolenbroek     const char* exp_errors[] = {
397*00b67f09SDavid van Moolenbroek         "3: The identifier must match ^[_A-Za-z0-9]+$; was '+*,'",
398*00b67f09SDavid van Moolenbroek         NULL
399*00b67f09SDavid van Moolenbroek     };
400*00b67f09SDavid van Moolenbroek 
401*00b67f09SDavid van Moolenbroek     do_parser_test< tp_reader >(input, exp_calls, exp_errors);
402*00b67f09SDavid van Moolenbroek }
403*00b67f09SDavid van Moolenbroek 
404*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(tp_56);
ATF_TEST_CASE_BODY(tp_56)405*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(tp_56)
406*00b67f09SDavid van Moolenbroek {
407*00b67f09SDavid van Moolenbroek     const char* input =
408*00b67f09SDavid van Moolenbroek         "Content-Type: application/X-atf-tp; version=\"1\"\n"
409*00b67f09SDavid van Moolenbroek         "\n"
410*00b67f09SDavid van Moolenbroek         "ident: test\n"
411*00b67f09SDavid van Moolenbroek         "timeout: hello\n"
412*00b67f09SDavid van Moolenbroek     ;
413*00b67f09SDavid van Moolenbroek 
414*00b67f09SDavid van Moolenbroek     const char* exp_calls[] = {
415*00b67f09SDavid van Moolenbroek         NULL
416*00b67f09SDavid van Moolenbroek     };
417*00b67f09SDavid van Moolenbroek 
418*00b67f09SDavid van Moolenbroek     const char* exp_errors[] = {
419*00b67f09SDavid van Moolenbroek         "4: The timeout property requires an integer value",
420*00b67f09SDavid van Moolenbroek         NULL
421*00b67f09SDavid van Moolenbroek     };
422*00b67f09SDavid van Moolenbroek 
423*00b67f09SDavid van Moolenbroek     do_parser_test< tp_reader >(input, exp_calls, exp_errors);
424*00b67f09SDavid van Moolenbroek }
425*00b67f09SDavid van Moolenbroek 
426*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(tp_57);
ATF_TEST_CASE_BODY(tp_57)427*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(tp_57)
428*00b67f09SDavid van Moolenbroek {
429*00b67f09SDavid van Moolenbroek     const char* input =
430*00b67f09SDavid van Moolenbroek         "Content-Type: application/X-atf-tp; version=\"1\"\n"
431*00b67f09SDavid van Moolenbroek         "\n"
432*00b67f09SDavid van Moolenbroek         "ident: test\n"
433*00b67f09SDavid van Moolenbroek         "unknown: property\n"
434*00b67f09SDavid van Moolenbroek     ;
435*00b67f09SDavid van Moolenbroek 
436*00b67f09SDavid van Moolenbroek     const char* exp_calls[] = {
437*00b67f09SDavid van Moolenbroek         NULL
438*00b67f09SDavid van Moolenbroek     };
439*00b67f09SDavid van Moolenbroek 
440*00b67f09SDavid van Moolenbroek     const char* exp_errors[] = {
441*00b67f09SDavid van Moolenbroek         "4: Unknown property 'unknown'",
442*00b67f09SDavid van Moolenbroek         NULL
443*00b67f09SDavid van Moolenbroek     };
444*00b67f09SDavid van Moolenbroek 
445*00b67f09SDavid van Moolenbroek     do_parser_test< tp_reader >(input, exp_calls, exp_errors);
446*00b67f09SDavid van Moolenbroek }
447*00b67f09SDavid van Moolenbroek 
448*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(tp_58);
ATF_TEST_CASE_BODY(tp_58)449*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(tp_58)
450*00b67f09SDavid van Moolenbroek {
451*00b67f09SDavid van Moolenbroek     const char* input =
452*00b67f09SDavid van Moolenbroek         "Content-Type: application/X-atf-tp; version=\"1\"\n"
453*00b67f09SDavid van Moolenbroek         "\n"
454*00b67f09SDavid van Moolenbroek         "ident: test\n"
455*00b67f09SDavid van Moolenbroek         "X-foo:\n"
456*00b67f09SDavid van Moolenbroek     ;
457*00b67f09SDavid van Moolenbroek 
458*00b67f09SDavid van Moolenbroek     const char* exp_calls[] = {
459*00b67f09SDavid van Moolenbroek         NULL
460*00b67f09SDavid van Moolenbroek     };
461*00b67f09SDavid van Moolenbroek 
462*00b67f09SDavid van Moolenbroek     const char* exp_errors[] = {
463*00b67f09SDavid van Moolenbroek         "4: The value for 'X-foo' cannot be empty",
464*00b67f09SDavid van Moolenbroek         NULL
465*00b67f09SDavid van Moolenbroek     };
466*00b67f09SDavid van Moolenbroek 
467*00b67f09SDavid van Moolenbroek     do_parser_test< tp_reader >(input, exp_calls, exp_errors);
468*00b67f09SDavid van Moolenbroek }
469*00b67f09SDavid van Moolenbroek 
470*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(tp_59);
ATF_TEST_CASE_BODY(tp_59)471*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(tp_59)
472*00b67f09SDavid van Moolenbroek {
473*00b67f09SDavid van Moolenbroek     const char* input =
474*00b67f09SDavid van Moolenbroek         "Content-Type: application/X-atf-tp; version=\"1\"\n"
475*00b67f09SDavid van Moolenbroek         "\n"
476*00b67f09SDavid van Moolenbroek         "\n"
477*00b67f09SDavid van Moolenbroek         "ident: test\n"
478*00b67f09SDavid van Moolenbroek         "timeout: 300\n"
479*00b67f09SDavid van Moolenbroek     ;
480*00b67f09SDavid van Moolenbroek 
481*00b67f09SDavid van Moolenbroek     const char* exp_calls[] = {
482*00b67f09SDavid van Moolenbroek         NULL
483*00b67f09SDavid van Moolenbroek     };
484*00b67f09SDavid van Moolenbroek 
485*00b67f09SDavid van Moolenbroek     const char* exp_errors[] = {
486*00b67f09SDavid van Moolenbroek         "3: Unexpected token `<<NEWLINE>>'; expected property name",
487*00b67f09SDavid van Moolenbroek         NULL
488*00b67f09SDavid van Moolenbroek     };
489*00b67f09SDavid van Moolenbroek 
490*00b67f09SDavid van Moolenbroek     do_parser_test< tp_reader >(input, exp_calls, exp_errors);
491*00b67f09SDavid van Moolenbroek }
492*00b67f09SDavid van Moolenbroek 
493*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(tp_60);
ATF_TEST_CASE_BODY(tp_60)494*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(tp_60)
495*00b67f09SDavid van Moolenbroek {
496*00b67f09SDavid van Moolenbroek     const char* input =
497*00b67f09SDavid van Moolenbroek         "Content-Type: application/X-atf-tp; version=\"1\"\n"
498*00b67f09SDavid van Moolenbroek         "\n"
499*00b67f09SDavid van Moolenbroek         "ident: test\n"
500*00b67f09SDavid van Moolenbroek         "require.memory: 12345D\n"
501*00b67f09SDavid van Moolenbroek     ;
502*00b67f09SDavid van Moolenbroek 
503*00b67f09SDavid van Moolenbroek     const char* exp_calls[] = {
504*00b67f09SDavid van Moolenbroek         NULL
505*00b67f09SDavid van Moolenbroek     };
506*00b67f09SDavid van Moolenbroek 
507*00b67f09SDavid van Moolenbroek     const char* exp_errors[] = {
508*00b67f09SDavid van Moolenbroek         "4: The require.memory property requires an integer value representing"
509*00b67f09SDavid van Moolenbroek         " an amount of bytes",
510*00b67f09SDavid van Moolenbroek         NULL
511*00b67f09SDavid van Moolenbroek     };
512*00b67f09SDavid van Moolenbroek 
513*00b67f09SDavid van Moolenbroek     do_parser_test< tp_reader >(input, exp_calls, exp_errors);
514*00b67f09SDavid van Moolenbroek }
515*00b67f09SDavid van Moolenbroek 
516*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
517*00b67f09SDavid van Moolenbroek // Tests for the "tps" writer.
518*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
519*00b67f09SDavid van Moolenbroek 
520*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(atf_tps_writer);
ATF_TEST_CASE_HEAD(atf_tps_writer)521*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(atf_tps_writer)
522*00b67f09SDavid van Moolenbroek {
523*00b67f09SDavid van Moolenbroek     set_md_var("descr", "Verifies the application/X-atf-tps writer");
524*00b67f09SDavid van Moolenbroek }
ATF_TEST_CASE_BODY(atf_tps_writer)525*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(atf_tps_writer)
526*00b67f09SDavid van Moolenbroek {
527*00b67f09SDavid van Moolenbroek     std::ostringstream expss;
528*00b67f09SDavid van Moolenbroek     std::ostringstream ss;
529*00b67f09SDavid van Moolenbroek     const char *ts_regex = "[0-9]+\\.[0-9]{1,6}, ";
530*00b67f09SDavid van Moolenbroek 
531*00b67f09SDavid van Moolenbroek #define RESET \
532*00b67f09SDavid van Moolenbroek     expss.str(""); \
533*00b67f09SDavid van Moolenbroek     ss.str("")
534*00b67f09SDavid van Moolenbroek 
535*00b67f09SDavid van Moolenbroek #define CHECK \
536*00b67f09SDavid van Moolenbroek     check_match(*this, ss.str(), expss.str())
537*00b67f09SDavid van Moolenbroek 
538*00b67f09SDavid van Moolenbroek     {
539*00b67f09SDavid van Moolenbroek         RESET;
540*00b67f09SDavid van Moolenbroek 
541*00b67f09SDavid van Moolenbroek         impl::atf_tps_writer w(ss);
542*00b67f09SDavid van Moolenbroek         expss << "Content-Type: application/X-atf-tps; version=\"3\"\n\n";
543*00b67f09SDavid van Moolenbroek         CHECK;
544*00b67f09SDavid van Moolenbroek     }
545*00b67f09SDavid van Moolenbroek 
546*00b67f09SDavid van Moolenbroek     {
547*00b67f09SDavid van Moolenbroek         RESET;
548*00b67f09SDavid van Moolenbroek 
549*00b67f09SDavid van Moolenbroek         impl::atf_tps_writer w(ss);
550*00b67f09SDavid van Moolenbroek         expss << "Content-Type: application/X-atf-tps; version=\"3\"\n\n";
551*00b67f09SDavid van Moolenbroek         CHECK;
552*00b67f09SDavid van Moolenbroek 
553*00b67f09SDavid van Moolenbroek         w.info("foo", "bar");
554*00b67f09SDavid van Moolenbroek         expss << "info: foo, bar\n";
555*00b67f09SDavid van Moolenbroek         CHECK;
556*00b67f09SDavid van Moolenbroek 
557*00b67f09SDavid van Moolenbroek         w.info("baz", "second info");
558*00b67f09SDavid van Moolenbroek         expss << "info: baz, second info\n";
559*00b67f09SDavid van Moolenbroek         CHECK;
560*00b67f09SDavid van Moolenbroek     }
561*00b67f09SDavid van Moolenbroek 
562*00b67f09SDavid van Moolenbroek     {
563*00b67f09SDavid van Moolenbroek         RESET;
564*00b67f09SDavid van Moolenbroek 
565*00b67f09SDavid van Moolenbroek         impl::atf_tps_writer w(ss);
566*00b67f09SDavid van Moolenbroek         expss << "Content-Type: application/X-atf-tps; version=\"3\"\n\n";
567*00b67f09SDavid van Moolenbroek         CHECK;
568*00b67f09SDavid van Moolenbroek 
569*00b67f09SDavid van Moolenbroek         w.ntps(0);
570*00b67f09SDavid van Moolenbroek         expss << "tps-count: 0\n";
571*00b67f09SDavid van Moolenbroek         CHECK;
572*00b67f09SDavid van Moolenbroek     }
573*00b67f09SDavid van Moolenbroek 
574*00b67f09SDavid van Moolenbroek     {
575*00b67f09SDavid van Moolenbroek         RESET;
576*00b67f09SDavid van Moolenbroek 
577*00b67f09SDavid van Moolenbroek         impl::atf_tps_writer w(ss);
578*00b67f09SDavid van Moolenbroek         expss << "Content-Type: application/X-atf-tps; version=\"3\"\n\n";
579*00b67f09SDavid van Moolenbroek         CHECK;
580*00b67f09SDavid van Moolenbroek 
581*00b67f09SDavid van Moolenbroek         w.ntps(123);
582*00b67f09SDavid van Moolenbroek         expss << "tps-count: 123\n";
583*00b67f09SDavid van Moolenbroek         CHECK;
584*00b67f09SDavid van Moolenbroek     }
585*00b67f09SDavid van Moolenbroek 
586*00b67f09SDavid van Moolenbroek     {
587*00b67f09SDavid van Moolenbroek         RESET;
588*00b67f09SDavid van Moolenbroek 
589*00b67f09SDavid van Moolenbroek         impl::atf_tps_writer w(ss);
590*00b67f09SDavid van Moolenbroek         expss << "Content-Type: application/X-atf-tps; version=\"3\"\n\n";
591*00b67f09SDavid van Moolenbroek         CHECK;
592*00b67f09SDavid van Moolenbroek 
593*00b67f09SDavid van Moolenbroek         w.ntps(2);
594*00b67f09SDavid van Moolenbroek         expss << "tps-count: 2\n";
595*00b67f09SDavid van Moolenbroek         CHECK;
596*00b67f09SDavid van Moolenbroek 
597*00b67f09SDavid van Moolenbroek         w.start_tp("foo", 0);
598*00b67f09SDavid van Moolenbroek         expss << "tp-start: " << ts_regex << "foo, 0\n";
599*00b67f09SDavid van Moolenbroek         CHECK;
600*00b67f09SDavid van Moolenbroek 
601*00b67f09SDavid van Moolenbroek         w.end_tp("");
602*00b67f09SDavid van Moolenbroek         expss << "tp-end: " << ts_regex << "foo\n";
603*00b67f09SDavid van Moolenbroek         CHECK;
604*00b67f09SDavid van Moolenbroek 
605*00b67f09SDavid van Moolenbroek         w.start_tp("bar", 0);
606*00b67f09SDavid van Moolenbroek         expss << "tp-start: " << ts_regex << "bar, 0\n";
607*00b67f09SDavid van Moolenbroek         CHECK;
608*00b67f09SDavid van Moolenbroek 
609*00b67f09SDavid van Moolenbroek         w.end_tp("failed program");
610*00b67f09SDavid van Moolenbroek         expss << "tp-end: " << ts_regex << "bar, failed program\n";
611*00b67f09SDavid van Moolenbroek         CHECK;
612*00b67f09SDavid van Moolenbroek     }
613*00b67f09SDavid van Moolenbroek 
614*00b67f09SDavid van Moolenbroek     {
615*00b67f09SDavid van Moolenbroek         RESET;
616*00b67f09SDavid van Moolenbroek 
617*00b67f09SDavid van Moolenbroek         impl::atf_tps_writer w(ss);
618*00b67f09SDavid van Moolenbroek         expss << "Content-Type: application/X-atf-tps; version=\"3\"\n\n";
619*00b67f09SDavid van Moolenbroek         CHECK;
620*00b67f09SDavid van Moolenbroek 
621*00b67f09SDavid van Moolenbroek         w.ntps(1);
622*00b67f09SDavid van Moolenbroek         expss << "tps-count: 1\n";
623*00b67f09SDavid van Moolenbroek         CHECK;
624*00b67f09SDavid van Moolenbroek 
625*00b67f09SDavid van Moolenbroek         w.start_tp("foo", 1);
626*00b67f09SDavid van Moolenbroek         expss << "tp-start: " << ts_regex << "foo, 1\n";
627*00b67f09SDavid van Moolenbroek         CHECK;
628*00b67f09SDavid van Moolenbroek 
629*00b67f09SDavid van Moolenbroek         w.start_tc("brokentc");
630*00b67f09SDavid van Moolenbroek         expss << "tc-start: " << ts_regex << "brokentc\n";
631*00b67f09SDavid van Moolenbroek         CHECK;
632*00b67f09SDavid van Moolenbroek 
633*00b67f09SDavid van Moolenbroek         w.end_tp("aborted");
634*00b67f09SDavid van Moolenbroek         expss << "tp-end: " << ts_regex << "foo, aborted\n";
635*00b67f09SDavid van Moolenbroek         CHECK;
636*00b67f09SDavid van Moolenbroek     }
637*00b67f09SDavid van Moolenbroek 
638*00b67f09SDavid van Moolenbroek     {
639*00b67f09SDavid van Moolenbroek         RESET;
640*00b67f09SDavid van Moolenbroek 
641*00b67f09SDavid van Moolenbroek         impl::atf_tps_writer w(ss);
642*00b67f09SDavid van Moolenbroek         expss << "Content-Type: application/X-atf-tps; version=\"3\"\n\n";
643*00b67f09SDavid van Moolenbroek         CHECK;
644*00b67f09SDavid van Moolenbroek 
645*00b67f09SDavid van Moolenbroek         w.ntps(1);
646*00b67f09SDavid van Moolenbroek         expss << "tps-count: 1\n";
647*00b67f09SDavid van Moolenbroek         CHECK;
648*00b67f09SDavid van Moolenbroek 
649*00b67f09SDavid van Moolenbroek         w.start_tp("thetp", 3);
650*00b67f09SDavid van Moolenbroek         expss << "tp-start: " << ts_regex << "thetp, 3\n";
651*00b67f09SDavid van Moolenbroek         CHECK;
652*00b67f09SDavid van Moolenbroek 
653*00b67f09SDavid van Moolenbroek         w.start_tc("passtc");
654*00b67f09SDavid van Moolenbroek         expss << "tc-start: " << ts_regex << "passtc\n";
655*00b67f09SDavid van Moolenbroek         CHECK;
656*00b67f09SDavid van Moolenbroek 
657*00b67f09SDavid van Moolenbroek         w.end_tc("passed", "");
658*00b67f09SDavid van Moolenbroek         expss << "tc-end: " << ts_regex << "passtc, passed\n";
659*00b67f09SDavid van Moolenbroek         CHECK;
660*00b67f09SDavid van Moolenbroek 
661*00b67f09SDavid van Moolenbroek         w.start_tc("failtc");
662*00b67f09SDavid van Moolenbroek         expss << "tc-start: " << ts_regex << "failtc\n";
663*00b67f09SDavid van Moolenbroek         CHECK;
664*00b67f09SDavid van Moolenbroek 
665*00b67f09SDavid van Moolenbroek         w.end_tc("failed", "The reason");
666*00b67f09SDavid van Moolenbroek         expss << "tc-end: " << ts_regex << "failtc, failed, The reason\n";
667*00b67f09SDavid van Moolenbroek         CHECK;
668*00b67f09SDavid van Moolenbroek 
669*00b67f09SDavid van Moolenbroek         w.start_tc("skiptc");
670*00b67f09SDavid van Moolenbroek         expss << "tc-start: " << ts_regex << "skiptc\n";
671*00b67f09SDavid van Moolenbroek         CHECK;
672*00b67f09SDavid van Moolenbroek 
673*00b67f09SDavid van Moolenbroek         w.end_tc("skipped", "The reason");
674*00b67f09SDavid van Moolenbroek         expss << "tc-end: " << ts_regex << "skiptc, skipped, The reason\n";
675*00b67f09SDavid van Moolenbroek         CHECK;
676*00b67f09SDavid van Moolenbroek 
677*00b67f09SDavid van Moolenbroek         w.end_tp("");
678*00b67f09SDavid van Moolenbroek         expss << "tp-end: " << ts_regex << "thetp\n";
679*00b67f09SDavid van Moolenbroek         CHECK;
680*00b67f09SDavid van Moolenbroek     }
681*00b67f09SDavid van Moolenbroek 
682*00b67f09SDavid van Moolenbroek     {
683*00b67f09SDavid van Moolenbroek         RESET;
684*00b67f09SDavid van Moolenbroek 
685*00b67f09SDavid van Moolenbroek         impl::atf_tps_writer w(ss);
686*00b67f09SDavid van Moolenbroek         expss << "Content-Type: application/X-atf-tps; version=\"3\"\n\n";
687*00b67f09SDavid van Moolenbroek         CHECK;
688*00b67f09SDavid van Moolenbroek 
689*00b67f09SDavid van Moolenbroek         w.ntps(1);
690*00b67f09SDavid van Moolenbroek         expss << "tps-count: 1\n";
691*00b67f09SDavid van Moolenbroek         CHECK;
692*00b67f09SDavid van Moolenbroek 
693*00b67f09SDavid van Moolenbroek         w.start_tp("thetp", 1);
694*00b67f09SDavid van Moolenbroek         expss << "tp-start: " << ts_regex << "thetp, 1\n";
695*00b67f09SDavid van Moolenbroek         CHECK;
696*00b67f09SDavid van Moolenbroek 
697*00b67f09SDavid van Moolenbroek         w.start_tc("thetc");
698*00b67f09SDavid van Moolenbroek         expss << "tc-start: " << ts_regex << "thetc\n";
699*00b67f09SDavid van Moolenbroek         CHECK;
700*00b67f09SDavid van Moolenbroek 
701*00b67f09SDavid van Moolenbroek         w.stdout_tc("a line");
702*00b67f09SDavid van Moolenbroek         expss << "tc-so:a line\n";
703*00b67f09SDavid van Moolenbroek         CHECK;
704*00b67f09SDavid van Moolenbroek 
705*00b67f09SDavid van Moolenbroek         w.stdout_tc("another line");
706*00b67f09SDavid van Moolenbroek         expss << "tc-so:another line\n";
707*00b67f09SDavid van Moolenbroek         CHECK;
708*00b67f09SDavid van Moolenbroek 
709*00b67f09SDavid van Moolenbroek         w.stderr_tc("an error message");
710*00b67f09SDavid van Moolenbroek         expss << "tc-se:an error message\n";
711*00b67f09SDavid van Moolenbroek         CHECK;
712*00b67f09SDavid van Moolenbroek 
713*00b67f09SDavid van Moolenbroek         w.end_tc("passed", "");
714*00b67f09SDavid van Moolenbroek         expss << "tc-end: " << ts_regex << "thetc, passed\n";
715*00b67f09SDavid van Moolenbroek         CHECK;
716*00b67f09SDavid van Moolenbroek 
717*00b67f09SDavid van Moolenbroek         w.end_tp("");
718*00b67f09SDavid van Moolenbroek         expss << "tp-end: " << ts_regex << "thetp\n";
719*00b67f09SDavid van Moolenbroek         CHECK;
720*00b67f09SDavid van Moolenbroek     }
721*00b67f09SDavid van Moolenbroek 
722*00b67f09SDavid van Moolenbroek     {
723*00b67f09SDavid van Moolenbroek         RESET;
724*00b67f09SDavid van Moolenbroek 
725*00b67f09SDavid van Moolenbroek         impl::atf_tps_writer w(ss);
726*00b67f09SDavid van Moolenbroek         expss << "Content-Type: application/X-atf-tps; version=\"3\"\n\n";
727*00b67f09SDavid van Moolenbroek         CHECK;
728*00b67f09SDavid van Moolenbroek 
729*00b67f09SDavid van Moolenbroek         w.ntps(1);
730*00b67f09SDavid van Moolenbroek         expss << "tps-count: 1\n";
731*00b67f09SDavid van Moolenbroek         CHECK;
732*00b67f09SDavid van Moolenbroek 
733*00b67f09SDavid van Moolenbroek         w.start_tp("thetp", 0);
734*00b67f09SDavid van Moolenbroek         expss << "tp-start: " << ts_regex << "thetp, 0\n";
735*00b67f09SDavid van Moolenbroek         CHECK;
736*00b67f09SDavid van Moolenbroek 
737*00b67f09SDavid van Moolenbroek         w.end_tp("");
738*00b67f09SDavid van Moolenbroek         expss << "tp-end: " << ts_regex << "thetp\n";
739*00b67f09SDavid van Moolenbroek         CHECK;
740*00b67f09SDavid van Moolenbroek 
741*00b67f09SDavid van Moolenbroek         w.info("foo", "bar");
742*00b67f09SDavid van Moolenbroek         expss << "info: foo, bar\n";
743*00b67f09SDavid van Moolenbroek         CHECK;
744*00b67f09SDavid van Moolenbroek 
745*00b67f09SDavid van Moolenbroek         w.info("baz", "second value");
746*00b67f09SDavid van Moolenbroek         expss << "info: baz, second value\n";
747*00b67f09SDavid van Moolenbroek         CHECK;
748*00b67f09SDavid van Moolenbroek     }
749*00b67f09SDavid van Moolenbroek 
750*00b67f09SDavid van Moolenbroek #undef CHECK
751*00b67f09SDavid van Moolenbroek #undef RESET
752*00b67f09SDavid van Moolenbroek }
753*00b67f09SDavid van Moolenbroek 
754*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
755*00b67f09SDavid van Moolenbroek // Tests for the free functions.
756*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
757*00b67f09SDavid van Moolenbroek 
758*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(get_metadata_bad);
ATF_TEST_CASE_HEAD(get_metadata_bad)759*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(get_metadata_bad) {}
ATF_TEST_CASE_BODY(get_metadata_bad)760*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(get_metadata_bad) {
761*00b67f09SDavid van Moolenbroek     const atf::fs::path executable = get_helper(*this, "bad_metadata_helper");
762*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(atf::parser::parse_errors,
763*00b67f09SDavid van Moolenbroek                     impl::get_metadata(executable, vars_map()));
764*00b67f09SDavid van Moolenbroek }
765*00b67f09SDavid van Moolenbroek 
766*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(get_metadata_zero_tcs);
ATF_TEST_CASE_HEAD(get_metadata_zero_tcs)767*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(get_metadata_zero_tcs) {}
ATF_TEST_CASE_BODY(get_metadata_zero_tcs)768*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(get_metadata_zero_tcs) {
769*00b67f09SDavid van Moolenbroek     const atf::fs::path executable = get_helper(*this, "zero_tcs_helper");
770*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(atf::parser::parse_errors,
771*00b67f09SDavid van Moolenbroek                     impl::get_metadata(executable, vars_map()));
772*00b67f09SDavid van Moolenbroek }
773*00b67f09SDavid van Moolenbroek 
774*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(get_metadata_several_tcs);
ATF_TEST_CASE_HEAD(get_metadata_several_tcs)775*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(get_metadata_several_tcs) {}
ATF_TEST_CASE_BODY(get_metadata_several_tcs)776*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(get_metadata_several_tcs) {
777*00b67f09SDavid van Moolenbroek     const atf::fs::path executable = get_helper(*this, "several_tcs_helper");
778*00b67f09SDavid van Moolenbroek     const impl::metadata md = impl::get_metadata(executable, vars_map());
779*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_EQ(3, md.test_cases.size());
780*00b67f09SDavid van Moolenbroek 
781*00b67f09SDavid van Moolenbroek     {
782*00b67f09SDavid van Moolenbroek         const impl::test_cases_map::const_iterator iter =
783*00b67f09SDavid van Moolenbroek             md.test_cases.find("first");
784*00b67f09SDavid van Moolenbroek         ATF_REQUIRE(iter != md.test_cases.end());
785*00b67f09SDavid van Moolenbroek 
786*00b67f09SDavid van Moolenbroek         ATF_REQUIRE_EQ(4, (*iter).second.size());
787*00b67f09SDavid van Moolenbroek         check_property((*iter).second, "descr", "Description 1");
788*00b67f09SDavid van Moolenbroek         check_property((*iter).second, "has.cleanup", "false");
789*00b67f09SDavid van Moolenbroek         check_property((*iter).second, "ident", "first");
790*00b67f09SDavid van Moolenbroek         check_property((*iter).second, "timeout", "300");
791*00b67f09SDavid van Moolenbroek     }
792*00b67f09SDavid van Moolenbroek 
793*00b67f09SDavid van Moolenbroek     {
794*00b67f09SDavid van Moolenbroek         const impl::test_cases_map::const_iterator iter =
795*00b67f09SDavid van Moolenbroek             md.test_cases.find("second");
796*00b67f09SDavid van Moolenbroek         ATF_REQUIRE(iter != md.test_cases.end());
797*00b67f09SDavid van Moolenbroek 
798*00b67f09SDavid van Moolenbroek         ATF_REQUIRE_EQ(5, (*iter).second.size());
799*00b67f09SDavid van Moolenbroek         check_property((*iter).second, "descr", "Description 2");
800*00b67f09SDavid van Moolenbroek         check_property((*iter).second, "has.cleanup", "true");
801*00b67f09SDavid van Moolenbroek         check_property((*iter).second, "ident", "second");
802*00b67f09SDavid van Moolenbroek         check_property((*iter).second, "timeout", "500");
803*00b67f09SDavid van Moolenbroek         check_property((*iter).second, "X-property", "Custom property");
804*00b67f09SDavid van Moolenbroek     }
805*00b67f09SDavid van Moolenbroek 
806*00b67f09SDavid van Moolenbroek     {
807*00b67f09SDavid van Moolenbroek         const impl::test_cases_map::const_iterator iter =
808*00b67f09SDavid van Moolenbroek             md.test_cases.find("third");
809*00b67f09SDavid van Moolenbroek         ATF_REQUIRE(iter != md.test_cases.end());
810*00b67f09SDavid van Moolenbroek 
811*00b67f09SDavid van Moolenbroek         ATF_REQUIRE_EQ(3, (*iter).second.size());
812*00b67f09SDavid van Moolenbroek         check_property((*iter).second, "has.cleanup", "false");
813*00b67f09SDavid van Moolenbroek         check_property((*iter).second, "ident", "third");
814*00b67f09SDavid van Moolenbroek         check_property((*iter).second, "timeout", "300");
815*00b67f09SDavid van Moolenbroek     }
816*00b67f09SDavid van Moolenbroek }
817*00b67f09SDavid van Moolenbroek 
818*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(parse_test_case_result_expected_death);
ATF_TEST_CASE_BODY(parse_test_case_result_expected_death)819*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(parse_test_case_result_expected_death) {
820*00b67f09SDavid van Moolenbroek     check_result("expected_death", -1, "foo bar",
821*00b67f09SDavid van Moolenbroek                  detail::parse_test_case_result("expected_death: foo bar"));
822*00b67f09SDavid van Moolenbroek 
823*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
824*00b67f09SDavid van Moolenbroek                     detail::parse_test_case_result("expected_death"));
825*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
826*00b67f09SDavid van Moolenbroek                     detail::parse_test_case_result("expected_death(3): foo"));
827*00b67f09SDavid van Moolenbroek }
828*00b67f09SDavid van Moolenbroek 
829*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(parse_test_case_result_expected_exit);
ATF_TEST_CASE_BODY(parse_test_case_result_expected_exit)830*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(parse_test_case_result_expected_exit) {
831*00b67f09SDavid van Moolenbroek     check_result("expected_exit", -1, "foo bar",
832*00b67f09SDavid van Moolenbroek                  detail::parse_test_case_result("expected_exit: foo bar"));
833*00b67f09SDavid van Moolenbroek     check_result("expected_exit", -1, "foo bar",
834*00b67f09SDavid van Moolenbroek                  detail::parse_test_case_result("expected_exit(): foo bar"));
835*00b67f09SDavid van Moolenbroek     check_result("expected_exit", 5, "foo bar",
836*00b67f09SDavid van Moolenbroek                  detail::parse_test_case_result("expected_exit(5): foo bar"));
837*00b67f09SDavid van Moolenbroek 
838*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
839*00b67f09SDavid van Moolenbroek                     detail::parse_test_case_result("expected_exit"));
840*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
841*00b67f09SDavid van Moolenbroek                     detail::parse_test_case_result("expected_exit("));
842*00b67f09SDavid van Moolenbroek }
843*00b67f09SDavid van Moolenbroek 
844*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(parse_test_case_result_expected_failure);
ATF_TEST_CASE_BODY(parse_test_case_result_expected_failure)845*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(parse_test_case_result_expected_failure) {
846*00b67f09SDavid van Moolenbroek     check_result("expected_failure", -1, "foo bar",
847*00b67f09SDavid van Moolenbroek                  detail::parse_test_case_result("expected_failure: foo bar"));
848*00b67f09SDavid van Moolenbroek 
849*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
850*00b67f09SDavid van Moolenbroek                     detail::parse_test_case_result("expected_failure"));
851*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
852*00b67f09SDavid van Moolenbroek                     detail::parse_test_case_result("expected_failure(3): foo"));
853*00b67f09SDavid van Moolenbroek }
854*00b67f09SDavid van Moolenbroek 
855*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(parse_test_case_result_expected_signal);
ATF_TEST_CASE_BODY(parse_test_case_result_expected_signal)856*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(parse_test_case_result_expected_signal) {
857*00b67f09SDavid van Moolenbroek     check_result("expected_signal", -1, "foo bar",
858*00b67f09SDavid van Moolenbroek                  detail::parse_test_case_result("expected_signal: foo bar"));
859*00b67f09SDavid van Moolenbroek     check_result("expected_signal", -1, "foo bar",
860*00b67f09SDavid van Moolenbroek                  detail::parse_test_case_result("expected_signal(): foo bar"));
861*00b67f09SDavid van Moolenbroek     check_result("expected_signal", 5, "foo bar",
862*00b67f09SDavid van Moolenbroek                  detail::parse_test_case_result("expected_signal(5): foo bar"));
863*00b67f09SDavid van Moolenbroek 
864*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
865*00b67f09SDavid van Moolenbroek                     detail::parse_test_case_result("expected_signal"));
866*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
867*00b67f09SDavid van Moolenbroek                     detail::parse_test_case_result("expected_signal("));
868*00b67f09SDavid van Moolenbroek }
869*00b67f09SDavid van Moolenbroek 
870*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(parse_test_case_result_expected_timeout);
ATF_TEST_CASE_BODY(parse_test_case_result_expected_timeout)871*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(parse_test_case_result_expected_timeout) {
872*00b67f09SDavid van Moolenbroek     check_result("expected_timeout", -1, "foo bar",
873*00b67f09SDavid van Moolenbroek                  detail::parse_test_case_result("expected_timeout: foo bar"));
874*00b67f09SDavid van Moolenbroek 
875*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
876*00b67f09SDavid van Moolenbroek                     detail::parse_test_case_result("expected_timeout"));
877*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
878*00b67f09SDavid van Moolenbroek                     detail::parse_test_case_result("expected_timeout(3): foo"));
879*00b67f09SDavid van Moolenbroek }
880*00b67f09SDavid van Moolenbroek 
881*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(parse_test_case_result_failed);
ATF_TEST_CASE_BODY(parse_test_case_result_failed)882*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(parse_test_case_result_failed) {
883*00b67f09SDavid van Moolenbroek     check_result("failed", -1, "foo bar",
884*00b67f09SDavid van Moolenbroek                  detail::parse_test_case_result("failed: foo bar"));
885*00b67f09SDavid van Moolenbroek 
886*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
887*00b67f09SDavid van Moolenbroek                     detail::parse_test_case_result("failed"));
888*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
889*00b67f09SDavid van Moolenbroek                     detail::parse_test_case_result("failed(3): foo"));
890*00b67f09SDavid van Moolenbroek }
891*00b67f09SDavid van Moolenbroek 
892*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(parse_test_case_result_passed);
ATF_TEST_CASE_BODY(parse_test_case_result_passed)893*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(parse_test_case_result_passed) {
894*00b67f09SDavid van Moolenbroek     check_result("passed", -1, "",
895*00b67f09SDavid van Moolenbroek                  detail::parse_test_case_result("passed"));
896*00b67f09SDavid van Moolenbroek 
897*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
898*00b67f09SDavid van Moolenbroek                     detail::parse_test_case_result("passed: foo"));
899*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
900*00b67f09SDavid van Moolenbroek                     detail::parse_test_case_result("passed(3): foo"));
901*00b67f09SDavid van Moolenbroek }
902*00b67f09SDavid van Moolenbroek 
903*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(parse_test_case_result_skipped);
ATF_TEST_CASE_BODY(parse_test_case_result_skipped)904*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(parse_test_case_result_skipped) {
905*00b67f09SDavid van Moolenbroek     check_result("skipped", -1, "foo bar",
906*00b67f09SDavid van Moolenbroek                  detail::parse_test_case_result("skipped: foo bar"));
907*00b67f09SDavid van Moolenbroek 
908*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
909*00b67f09SDavid van Moolenbroek                     detail::parse_test_case_result("skipped"));
910*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
911*00b67f09SDavid van Moolenbroek                     detail::parse_test_case_result("skipped(3): foo"));
912*00b67f09SDavid van Moolenbroek }
913*00b67f09SDavid van Moolenbroek 
914*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(parse_test_case_result_unknown);
ATF_TEST_CASE_BODY(parse_test_case_result_unknown)915*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(parse_test_case_result_unknown) {
916*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
917*00b67f09SDavid van Moolenbroek                     detail::parse_test_case_result("foo"));
918*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
919*00b67f09SDavid van Moolenbroek                     detail::parse_test_case_result("bar: foo"));
920*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
921*00b67f09SDavid van Moolenbroek                     detail::parse_test_case_result("baz: foo"));
922*00b67f09SDavid van Moolenbroek }
923*00b67f09SDavid van Moolenbroek 
924*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(read_test_case_result_failed);
ATF_TEST_CASE_BODY(read_test_case_result_failed)925*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(read_test_case_result_failed) {
926*00b67f09SDavid van Moolenbroek     write_test_case_result("resfile", "failed: foo bar\n");
927*00b67f09SDavid van Moolenbroek     const impl::test_case_result tcr = impl::read_test_case_result(
928*00b67f09SDavid van Moolenbroek         atf::fs::path("resfile"));
929*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_EQ("failed", tcr.state());
930*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_EQ("foo bar", tcr.reason());
931*00b67f09SDavid van Moolenbroek }
932*00b67f09SDavid van Moolenbroek 
933*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(read_test_case_result_skipped);
ATF_TEST_CASE_BODY(read_test_case_result_skipped)934*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(read_test_case_result_skipped) {
935*00b67f09SDavid van Moolenbroek     write_test_case_result("resfile", "skipped: baz bar\n");
936*00b67f09SDavid van Moolenbroek     const impl::test_case_result tcr = impl::read_test_case_result(
937*00b67f09SDavid van Moolenbroek         atf::fs::path("resfile"));
938*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_EQ("skipped", tcr.state());
939*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_EQ("baz bar", tcr.reason());
940*00b67f09SDavid van Moolenbroek }
941*00b67f09SDavid van Moolenbroek 
942*00b67f09SDavid van Moolenbroek 
943*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(read_test_case_result_no_file);
ATF_TEST_CASE_HEAD(read_test_case_result_no_file)944*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(read_test_case_result_no_file) {}
ATF_TEST_CASE_BODY(read_test_case_result_no_file)945*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(read_test_case_result_no_file) {
946*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
947*00b67f09SDavid van Moolenbroek                     impl::read_test_case_result(atf::fs::path("resfile")));
948*00b67f09SDavid van Moolenbroek }
949*00b67f09SDavid van Moolenbroek 
950*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(read_test_case_result_empty_file);
ATF_TEST_CASE_BODY(read_test_case_result_empty_file)951*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(read_test_case_result_empty_file) {
952*00b67f09SDavid van Moolenbroek     write_test_case_result("resfile", "");
953*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
954*00b67f09SDavid van Moolenbroek                     impl::read_test_case_result(atf::fs::path("resfile")));
955*00b67f09SDavid van Moolenbroek }
956*00b67f09SDavid van Moolenbroek 
957*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(read_test_case_result_invalid);
ATF_TEST_CASE_BODY(read_test_case_result_invalid)958*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(read_test_case_result_invalid) {
959*00b67f09SDavid van Moolenbroek     write_test_case_result("resfile", "passed: hello\n");
960*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
961*00b67f09SDavid van Moolenbroek                     impl::read_test_case_result(atf::fs::path("resfile")));
962*00b67f09SDavid van Moolenbroek }
963*00b67f09SDavid van Moolenbroek 
964*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(read_test_case_result_multiline);
ATF_TEST_CASE_BODY(read_test_case_result_multiline)965*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(read_test_case_result_multiline) {
966*00b67f09SDavid van Moolenbroek     write_test_case_result("resfile", "skipped: foo\nbar\n");
967*00b67f09SDavid van Moolenbroek     const impl::test_case_result tcr = impl::read_test_case_result(
968*00b67f09SDavid van Moolenbroek         atf::fs::path("resfile"));
969*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_EQ("skipped", tcr.state());
970*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_EQ("foo<<NEWLINE UNEXPECTED>>bar", tcr.reason());
971*00b67f09SDavid van Moolenbroek }
972*00b67f09SDavid van Moolenbroek 
973*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
974*00b67f09SDavid van Moolenbroek // Main.
975*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
976*00b67f09SDavid van Moolenbroek 
ATF_INIT_TEST_CASES(tcs)977*00b67f09SDavid van Moolenbroek ATF_INIT_TEST_CASES(tcs)
978*00b67f09SDavid van Moolenbroek {
979*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, tp_1);
980*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, tp_2);
981*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, tp_3);
982*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, tp_4);
983*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, tp_50);
984*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, tp_51);
985*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, tp_52);
986*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, tp_53);
987*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, tp_54);
988*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, tp_55);
989*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, tp_56);
990*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, tp_57);
991*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, tp_58);
992*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, tp_59);
993*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, tp_60);
994*00b67f09SDavid van Moolenbroek 
995*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, atf_tps_writer);
996*00b67f09SDavid van Moolenbroek 
997*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, get_metadata_bad);
998*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, get_metadata_zero_tcs);
999*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, get_metadata_several_tcs);
1000*00b67f09SDavid van Moolenbroek 
1001*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, parse_test_case_result_expected_death);
1002*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, parse_test_case_result_expected_exit);
1003*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, parse_test_case_result_expected_failure);
1004*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, parse_test_case_result_expected_signal);
1005*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, parse_test_case_result_expected_timeout);
1006*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, parse_test_case_result_failed);
1007*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, parse_test_case_result_passed);
1008*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, parse_test_case_result_skipped);
1009*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, parse_test_case_result_unknown);
1010*00b67f09SDavid van Moolenbroek 
1011*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, read_test_case_result_failed);
1012*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, read_test_case_result_skipped);
1013*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, read_test_case_result_no_file);
1014*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, read_test_case_result_empty_file);
1015*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, read_test_case_result_multiline);
1016*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, read_test_case_result_invalid);
1017*00b67f09SDavid van Moolenbroek 
1018*00b67f09SDavid van Moolenbroek     // TODO: Add tests for run_test_case once all the missing functionality
1019*00b67f09SDavid van Moolenbroek     // is implemented.
1020*00b67f09SDavid van Moolenbroek }
1021