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