xref: /freebsd/contrib/kyua/engine/atf_result_test.cpp (revision b0d29bc47dba79f6f38e67eabadfb4b32ffd9390)
1*b0d29bc4SBrooks Davis // Copyright 2010 The Kyua Authors.
2*b0d29bc4SBrooks Davis // All rights reserved.
3*b0d29bc4SBrooks Davis //
4*b0d29bc4SBrooks Davis // Redistribution and use in source and binary forms, with or without
5*b0d29bc4SBrooks Davis // modification, are permitted provided that the following conditions are
6*b0d29bc4SBrooks Davis // met:
7*b0d29bc4SBrooks Davis //
8*b0d29bc4SBrooks Davis // * Redistributions of source code must retain the above copyright
9*b0d29bc4SBrooks Davis //   notice, this list of conditions and the following disclaimer.
10*b0d29bc4SBrooks Davis // * Redistributions in binary form must reproduce the above copyright
11*b0d29bc4SBrooks Davis //   notice, this list of conditions and the following disclaimer in the
12*b0d29bc4SBrooks Davis //   documentation and/or other materials provided with the distribution.
13*b0d29bc4SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors
14*b0d29bc4SBrooks Davis //   may be used to endorse or promote products derived from this software
15*b0d29bc4SBrooks Davis //   without specific prior written permission.
16*b0d29bc4SBrooks Davis //
17*b0d29bc4SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*b0d29bc4SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*b0d29bc4SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*b0d29bc4SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*b0d29bc4SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*b0d29bc4SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*b0d29bc4SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*b0d29bc4SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*b0d29bc4SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*b0d29bc4SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*b0d29bc4SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*b0d29bc4SBrooks Davis 
29*b0d29bc4SBrooks Davis #include "engine/atf_result.hpp"
30*b0d29bc4SBrooks Davis 
31*b0d29bc4SBrooks Davis extern "C" {
32*b0d29bc4SBrooks Davis #include <signal.h>
33*b0d29bc4SBrooks Davis }
34*b0d29bc4SBrooks Davis 
35*b0d29bc4SBrooks Davis #include <cstdlib>
36*b0d29bc4SBrooks Davis #include <fstream>
37*b0d29bc4SBrooks Davis #include <sstream>
38*b0d29bc4SBrooks Davis #include <stdexcept>
39*b0d29bc4SBrooks Davis 
40*b0d29bc4SBrooks Davis #include <atf-c++.hpp>
41*b0d29bc4SBrooks Davis 
42*b0d29bc4SBrooks Davis #include "engine/exceptions.hpp"
43*b0d29bc4SBrooks Davis #include "model/test_result.hpp"
44*b0d29bc4SBrooks Davis #include "utils/format/macros.hpp"
45*b0d29bc4SBrooks Davis #include "utils/fs/path.hpp"
46*b0d29bc4SBrooks Davis #include "utils/process/status.hpp"
47*b0d29bc4SBrooks Davis 
48*b0d29bc4SBrooks Davis namespace fs = utils::fs;
49*b0d29bc4SBrooks Davis namespace process = utils::process;
50*b0d29bc4SBrooks Davis 
51*b0d29bc4SBrooks Davis using utils::none;
52*b0d29bc4SBrooks Davis using utils::optional;
53*b0d29bc4SBrooks Davis 
54*b0d29bc4SBrooks Davis 
55*b0d29bc4SBrooks Davis namespace {
56*b0d29bc4SBrooks Davis 
57*b0d29bc4SBrooks Davis 
58*b0d29bc4SBrooks Davis /// Performs a test for results::parse() that should succeed.
59*b0d29bc4SBrooks Davis ///
60*b0d29bc4SBrooks Davis /// \param exp_type The expected type of the result.
61*b0d29bc4SBrooks Davis /// \param exp_argument The expected argument in the result, if any.
62*b0d29bc4SBrooks Davis /// \param exp_reason The expected reason describing the result, if any.
63*b0d29bc4SBrooks Davis /// \param text The literal input to parse; can include multiple lines.
64*b0d29bc4SBrooks Davis static void
parse_ok_test(const engine::atf_result::types & exp_type,const optional<int> & exp_argument,const char * exp_reason,const char * text)65*b0d29bc4SBrooks Davis parse_ok_test(const engine::atf_result::types& exp_type,
66*b0d29bc4SBrooks Davis               const optional< int >& exp_argument,
67*b0d29bc4SBrooks Davis               const char* exp_reason, const char* text)
68*b0d29bc4SBrooks Davis {
69*b0d29bc4SBrooks Davis     std::istringstream input(text);
70*b0d29bc4SBrooks Davis     const engine::atf_result actual = engine::atf_result::parse(input);
71*b0d29bc4SBrooks Davis     ATF_REQUIRE(exp_type == actual.type());
72*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(exp_argument, actual.argument());
73*b0d29bc4SBrooks Davis     if (exp_reason != NULL) {
74*b0d29bc4SBrooks Davis         ATF_REQUIRE(actual.reason());
75*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(exp_reason, actual.reason().get());
76*b0d29bc4SBrooks Davis     } else {
77*b0d29bc4SBrooks Davis         ATF_REQUIRE(!actual.reason());
78*b0d29bc4SBrooks Davis     }
79*b0d29bc4SBrooks Davis }
80*b0d29bc4SBrooks Davis 
81*b0d29bc4SBrooks Davis 
82*b0d29bc4SBrooks Davis /// Wrapper around parse_ok_test to define a test case.
83*b0d29bc4SBrooks Davis ///
84*b0d29bc4SBrooks Davis /// \param name The name of the test case; will be prefixed with
85*b0d29bc4SBrooks Davis ///     "atf_result__parse__".
86*b0d29bc4SBrooks Davis /// \param exp_type The expected type of the result.
87*b0d29bc4SBrooks Davis /// \param exp_argument The expected argument in the result, if any.
88*b0d29bc4SBrooks Davis /// \param exp_reason The expected reason describing the result, if any.
89*b0d29bc4SBrooks Davis /// \param input The literal input to parse.
90*b0d29bc4SBrooks Davis #define PARSE_OK(name, exp_type, exp_argument, exp_reason, input) \
91*b0d29bc4SBrooks Davis     ATF_TEST_CASE_WITHOUT_HEAD(atf_result__parse__ ## name); \
92*b0d29bc4SBrooks Davis     ATF_TEST_CASE_BODY(atf_result__parse__ ## name) \
93*b0d29bc4SBrooks Davis     { \
94*b0d29bc4SBrooks Davis         parse_ok_test(exp_type, exp_argument, exp_reason, input); \
95*b0d29bc4SBrooks Davis     }
96*b0d29bc4SBrooks Davis 
97*b0d29bc4SBrooks Davis 
98*b0d29bc4SBrooks Davis /// Performs a test for results::parse() that should fail.
99*b0d29bc4SBrooks Davis ///
100*b0d29bc4SBrooks Davis /// \param reason_regexp The reason to match against the broken reason.
101*b0d29bc4SBrooks Davis /// \param text The literal input to parse; can include multiple lines.
102*b0d29bc4SBrooks Davis static void
parse_broken_test(const char * reason_regexp,const char * text)103*b0d29bc4SBrooks Davis parse_broken_test(const char* reason_regexp, const char* text)
104*b0d29bc4SBrooks Davis {
105*b0d29bc4SBrooks Davis     std::istringstream input(text);
106*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW_RE(engine::format_error, reason_regexp,
107*b0d29bc4SBrooks Davis                          engine::atf_result::parse(input));
108*b0d29bc4SBrooks Davis }
109*b0d29bc4SBrooks Davis 
110*b0d29bc4SBrooks Davis 
111*b0d29bc4SBrooks Davis /// Wrapper around parse_broken_test to define a test case.
112*b0d29bc4SBrooks Davis ///
113*b0d29bc4SBrooks Davis /// \param name The name of the test case; will be prefixed with
114*b0d29bc4SBrooks Davis ///    "atf_result__parse__".
115*b0d29bc4SBrooks Davis /// \param reason_regexp The reason to match against the broken reason.
116*b0d29bc4SBrooks Davis /// \param input The literal input to parse.
117*b0d29bc4SBrooks Davis #define PARSE_BROKEN(name, reason_regexp, input) \
118*b0d29bc4SBrooks Davis     ATF_TEST_CASE_WITHOUT_HEAD(atf_result__parse__ ## name); \
119*b0d29bc4SBrooks Davis     ATF_TEST_CASE_BODY(atf_result__parse__ ## name) \
120*b0d29bc4SBrooks Davis     { \
121*b0d29bc4SBrooks Davis         parse_broken_test(reason_regexp, input); \
122*b0d29bc4SBrooks Davis     }
123*b0d29bc4SBrooks Davis 
124*b0d29bc4SBrooks Davis 
125*b0d29bc4SBrooks Davis }  // anonymous namespace
126*b0d29bc4SBrooks Davis 
127*b0d29bc4SBrooks Davis 
128*b0d29bc4SBrooks Davis PARSE_BROKEN(empty,
129*b0d29bc4SBrooks Davis              "Empty.*no new line",
130*b0d29bc4SBrooks Davis              "");
131*b0d29bc4SBrooks Davis PARSE_BROKEN(no_newline__unknown,
132*b0d29bc4SBrooks Davis              "Empty.*no new line",
133*b0d29bc4SBrooks Davis              "foo");
134*b0d29bc4SBrooks Davis PARSE_BROKEN(no_newline__known,
135*b0d29bc4SBrooks Davis              "Empty.*no new line",
136*b0d29bc4SBrooks Davis              "passed");
137*b0d29bc4SBrooks Davis PARSE_BROKEN(multiline__no_newline,
138*b0d29bc4SBrooks Davis              "multiple lines.*foo<<NEWLINE>>bar",
139*b0d29bc4SBrooks Davis              "failed: foo\nbar");
140*b0d29bc4SBrooks Davis PARSE_BROKEN(multiline__with_newline,
141*b0d29bc4SBrooks Davis              "multiple lines.*foo<<NEWLINE>>bar",
142*b0d29bc4SBrooks Davis              "failed: foo\nbar\n");
143*b0d29bc4SBrooks Davis PARSE_BROKEN(unknown_status__no_reason,
144*b0d29bc4SBrooks Davis              "Unknown.*result.*'cba'",
145*b0d29bc4SBrooks Davis              "cba\n");
146*b0d29bc4SBrooks Davis PARSE_BROKEN(unknown_status__with_reason,
147*b0d29bc4SBrooks Davis              "Unknown.*result.*'hgf'",
148*b0d29bc4SBrooks Davis              "hgf: foo\n");
149*b0d29bc4SBrooks Davis PARSE_BROKEN(missing_reason__no_delim,
150*b0d29bc4SBrooks Davis              "failed.*followed by.*reason",
151*b0d29bc4SBrooks Davis              "failed\n");
152*b0d29bc4SBrooks Davis PARSE_BROKEN(missing_reason__bad_delim,
153*b0d29bc4SBrooks Davis              "failed.*followed by.*reason",
154*b0d29bc4SBrooks Davis              "failed:\n");
155*b0d29bc4SBrooks Davis PARSE_BROKEN(missing_reason__empty,
156*b0d29bc4SBrooks Davis              "failed.*followed by.*reason",
157*b0d29bc4SBrooks Davis              "failed: \n");
158*b0d29bc4SBrooks Davis 
159*b0d29bc4SBrooks Davis 
160*b0d29bc4SBrooks Davis PARSE_OK(broken__ok,
161*b0d29bc4SBrooks Davis          engine::atf_result::broken, none, "a b c",
162*b0d29bc4SBrooks Davis          "broken: a b c\n");
163*b0d29bc4SBrooks Davis PARSE_OK(broken__blanks,
164*b0d29bc4SBrooks Davis          engine::atf_result::broken, none, "   ",
165*b0d29bc4SBrooks Davis          "broken:    \n");
166*b0d29bc4SBrooks Davis 
167*b0d29bc4SBrooks Davis 
168*b0d29bc4SBrooks Davis PARSE_OK(expected_death__ok,
169*b0d29bc4SBrooks Davis          engine::atf_result::expected_death, none, "a b c",
170*b0d29bc4SBrooks Davis          "expected_death: a b c\n");
171*b0d29bc4SBrooks Davis PARSE_OK(expected_death__blanks,
172*b0d29bc4SBrooks Davis          engine::atf_result::expected_death, none, "   ",
173*b0d29bc4SBrooks Davis          "expected_death:    \n");
174*b0d29bc4SBrooks Davis 
175*b0d29bc4SBrooks Davis 
176*b0d29bc4SBrooks Davis PARSE_OK(expected_exit__ok__any,
177*b0d29bc4SBrooks Davis          engine::atf_result::expected_exit, none, "any exit code",
178*b0d29bc4SBrooks Davis          "expected_exit: any exit code\n");
179*b0d29bc4SBrooks Davis PARSE_OK(expected_exit__ok__specific,
180*b0d29bc4SBrooks Davis          engine::atf_result::expected_exit, optional< int >(712),
181*b0d29bc4SBrooks Davis          "some known exit code",
182*b0d29bc4SBrooks Davis          "expected_exit(712): some known exit code\n");
183*b0d29bc4SBrooks Davis PARSE_BROKEN(expected_exit__bad_int,
184*b0d29bc4SBrooks Davis              "Invalid integer.*45a3",
185*b0d29bc4SBrooks Davis              "expected_exit(45a3): this is broken\n");
186*b0d29bc4SBrooks Davis 
187*b0d29bc4SBrooks Davis 
188*b0d29bc4SBrooks Davis PARSE_OK(expected_failure__ok,
189*b0d29bc4SBrooks Davis          engine::atf_result::expected_failure, none, "a b c",
190*b0d29bc4SBrooks Davis          "expected_failure: a b c\n");
191*b0d29bc4SBrooks Davis PARSE_OK(expected_failure__blanks,
192*b0d29bc4SBrooks Davis          engine::atf_result::expected_failure, none, "   ",
193*b0d29bc4SBrooks Davis          "expected_failure:    \n");
194*b0d29bc4SBrooks Davis 
195*b0d29bc4SBrooks Davis 
196*b0d29bc4SBrooks Davis PARSE_OK(expected_signal__ok__any,
197*b0d29bc4SBrooks Davis          engine::atf_result::expected_signal, none, "any signal code",
198*b0d29bc4SBrooks Davis          "expected_signal: any signal code\n");
199*b0d29bc4SBrooks Davis PARSE_OK(expected_signal__ok__specific,
200*b0d29bc4SBrooks Davis          engine::atf_result::expected_signal, optional< int >(712),
201*b0d29bc4SBrooks Davis          "some known signal code",
202*b0d29bc4SBrooks Davis          "expected_signal(712): some known signal code\n");
203*b0d29bc4SBrooks Davis PARSE_BROKEN(expected_signal__bad_int,
204*b0d29bc4SBrooks Davis              "Invalid integer.*45a3",
205*b0d29bc4SBrooks Davis              "expected_signal(45a3): this is broken\n");
206*b0d29bc4SBrooks Davis 
207*b0d29bc4SBrooks Davis 
208*b0d29bc4SBrooks Davis PARSE_OK(expected_timeout__ok,
209*b0d29bc4SBrooks Davis          engine::atf_result::expected_timeout, none, "a b c",
210*b0d29bc4SBrooks Davis          "expected_timeout: a b c\n");
211*b0d29bc4SBrooks Davis PARSE_OK(expected_timeout__blanks,
212*b0d29bc4SBrooks Davis          engine::atf_result::expected_timeout, none, "   ",
213*b0d29bc4SBrooks Davis          "expected_timeout:    \n");
214*b0d29bc4SBrooks Davis 
215*b0d29bc4SBrooks Davis 
216*b0d29bc4SBrooks Davis PARSE_OK(failed__ok,
217*b0d29bc4SBrooks Davis          engine::atf_result::failed, none, "a b c",
218*b0d29bc4SBrooks Davis          "failed: a b c\n");
219*b0d29bc4SBrooks Davis PARSE_OK(failed__blanks,
220*b0d29bc4SBrooks Davis          engine::atf_result::failed, none, "   ",
221*b0d29bc4SBrooks Davis          "failed:    \n");
222*b0d29bc4SBrooks Davis 
223*b0d29bc4SBrooks Davis 
224*b0d29bc4SBrooks Davis PARSE_OK(passed__ok,
225*b0d29bc4SBrooks Davis          engine::atf_result::passed, none, NULL,
226*b0d29bc4SBrooks Davis          "passed\n");
227*b0d29bc4SBrooks Davis PARSE_BROKEN(passed__reason,
228*b0d29bc4SBrooks Davis              "cannot have a reason",
229*b0d29bc4SBrooks Davis              "passed a b c\n");
230*b0d29bc4SBrooks Davis 
231*b0d29bc4SBrooks Davis 
232*b0d29bc4SBrooks Davis PARSE_OK(skipped__ok,
233*b0d29bc4SBrooks Davis          engine::atf_result::skipped, none, "a b c",
234*b0d29bc4SBrooks Davis          "skipped: a b c\n");
235*b0d29bc4SBrooks Davis PARSE_OK(skipped__blanks,
236*b0d29bc4SBrooks Davis          engine::atf_result::skipped, none, "   ",
237*b0d29bc4SBrooks Davis          "skipped:    \n");
238*b0d29bc4SBrooks Davis 
239*b0d29bc4SBrooks Davis 
240*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__load__ok);
ATF_TEST_CASE_BODY(atf_result__load__ok)241*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__load__ok)
242*b0d29bc4SBrooks Davis {
243*b0d29bc4SBrooks Davis     std::ofstream output("result.txt");
244*b0d29bc4SBrooks Davis     ATF_REQUIRE(output);
245*b0d29bc4SBrooks Davis     output << "skipped: a b c\n";
246*b0d29bc4SBrooks Davis     output.close();
247*b0d29bc4SBrooks Davis 
248*b0d29bc4SBrooks Davis     const engine::atf_result result = engine::atf_result::load(
249*b0d29bc4SBrooks Davis         utils::fs::path("result.txt"));
250*b0d29bc4SBrooks Davis     ATF_REQUIRE(engine::atf_result::skipped == result.type());
251*b0d29bc4SBrooks Davis     ATF_REQUIRE(!result.argument());
252*b0d29bc4SBrooks Davis     ATF_REQUIRE(result.reason());
253*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("a b c", result.reason().get());
254*b0d29bc4SBrooks Davis }
255*b0d29bc4SBrooks Davis 
256*b0d29bc4SBrooks Davis 
257*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__load__missing_file);
ATF_TEST_CASE_BODY(atf_result__load__missing_file)258*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__load__missing_file)
259*b0d29bc4SBrooks Davis {
260*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW_RE(
261*b0d29bc4SBrooks Davis         std::runtime_error, "Cannot open",
262*b0d29bc4SBrooks Davis         engine::atf_result::load(utils::fs::path("result.txt")));
263*b0d29bc4SBrooks Davis }
264*b0d29bc4SBrooks Davis 
265*b0d29bc4SBrooks Davis 
266*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__load__format_error);
ATF_TEST_CASE_BODY(atf_result__load__format_error)267*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__load__format_error)
268*b0d29bc4SBrooks Davis {
269*b0d29bc4SBrooks Davis     std::ofstream output("abc.txt");
270*b0d29bc4SBrooks Davis     ATF_REQUIRE(output);
271*b0d29bc4SBrooks Davis     output << "passed: foo\n";
272*b0d29bc4SBrooks Davis     output.close();
273*b0d29bc4SBrooks Davis 
274*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW_RE(engine::format_error, "cannot have a reason",
275*b0d29bc4SBrooks Davis                          engine::atf_result::load(utils::fs::path("abc.txt")));
276*b0d29bc4SBrooks Davis }
277*b0d29bc4SBrooks Davis 
278*b0d29bc4SBrooks Davis 
279*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__broken__ok);
ATF_TEST_CASE_BODY(atf_result__apply__broken__ok)280*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__apply__broken__ok)
281*b0d29bc4SBrooks Davis {
282*b0d29bc4SBrooks Davis     const engine::atf_result in_result(engine::atf_result::broken,
283*b0d29bc4SBrooks Davis                                        "Passthrough");
284*b0d29bc4SBrooks Davis     const process::status status = process::status::fake_exited(EXIT_SUCCESS);
285*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(in_result, in_result.apply(utils::make_optional(status)));
286*b0d29bc4SBrooks Davis }
287*b0d29bc4SBrooks Davis 
288*b0d29bc4SBrooks Davis 
289*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__timed_out);
ATF_TEST_CASE_BODY(atf_result__apply__timed_out)290*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__apply__timed_out)
291*b0d29bc4SBrooks Davis {
292*b0d29bc4SBrooks Davis     const engine::atf_result timed_out(engine::atf_result::broken,
293*b0d29bc4SBrooks Davis                                        "Some arbitrary error");
294*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(engine::atf_result(engine::atf_result::broken,
295*b0d29bc4SBrooks Davis                                       "Test case body timed out"),
296*b0d29bc4SBrooks Davis                    timed_out.apply(none));
297*b0d29bc4SBrooks Davis }
298*b0d29bc4SBrooks Davis 
299*b0d29bc4SBrooks Davis 
300*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_death__ok);
ATF_TEST_CASE_BODY(atf_result__apply__expected_death__ok)301*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__apply__expected_death__ok)
302*b0d29bc4SBrooks Davis {
303*b0d29bc4SBrooks Davis     const engine::atf_result in_result(engine::atf_result::expected_death,
304*b0d29bc4SBrooks Davis                                        "Passthrough");
305*b0d29bc4SBrooks Davis     const process::status status = process::status::fake_signaled(SIGINT, true);
306*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(in_result, in_result.apply(utils::make_optional(status)));
307*b0d29bc4SBrooks Davis }
308*b0d29bc4SBrooks Davis 
309*b0d29bc4SBrooks Davis 
310*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_exit__ok);
ATF_TEST_CASE_BODY(atf_result__apply__expected_exit__ok)311*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__apply__expected_exit__ok)
312*b0d29bc4SBrooks Davis {
313*b0d29bc4SBrooks Davis     const process::status success = process::status::fake_exited(EXIT_SUCCESS);
314*b0d29bc4SBrooks Davis     const process::status failure = process::status::fake_exited(EXIT_FAILURE);
315*b0d29bc4SBrooks Davis 
316*b0d29bc4SBrooks Davis     const engine::atf_result any_code(engine::atf_result::expected_exit, none,
317*b0d29bc4SBrooks Davis                                       "The reason");
318*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(any_code, any_code.apply(utils::make_optional(success)));
319*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(any_code, any_code.apply(utils::make_optional(failure)));
320*b0d29bc4SBrooks Davis 
321*b0d29bc4SBrooks Davis     const engine::atf_result a_code(engine::atf_result::expected_exit,
322*b0d29bc4SBrooks Davis                             utils::make_optional(EXIT_FAILURE), "The reason");
323*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(a_code, a_code.apply(utils::make_optional(failure)));
324*b0d29bc4SBrooks Davis }
325*b0d29bc4SBrooks Davis 
326*b0d29bc4SBrooks Davis 
327*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_exit__failed);
ATF_TEST_CASE_BODY(atf_result__apply__expected_exit__failed)328*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__apply__expected_exit__failed)
329*b0d29bc4SBrooks Davis {
330*b0d29bc4SBrooks Davis     const process::status success = process::status::fake_exited(EXIT_SUCCESS);
331*b0d29bc4SBrooks Davis 
332*b0d29bc4SBrooks Davis     const engine::atf_result a_code(engine::atf_result::expected_exit,
333*b0d29bc4SBrooks Davis                             utils::make_optional(EXIT_FAILURE), "The reason");
334*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
335*b0d29bc4SBrooks Davis         engine::atf_result(engine::atf_result::failed,
336*b0d29bc4SBrooks Davis                            "Test case expected to exit with code 1 but got "
337*b0d29bc4SBrooks Davis                            "code 0"),
338*b0d29bc4SBrooks Davis         a_code.apply(utils::make_optional(success)));
339*b0d29bc4SBrooks Davis }
340*b0d29bc4SBrooks Davis 
341*b0d29bc4SBrooks Davis 
342*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_exit__broken);
ATF_TEST_CASE_BODY(atf_result__apply__expected_exit__broken)343*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__apply__expected_exit__broken)
344*b0d29bc4SBrooks Davis {
345*b0d29bc4SBrooks Davis     const process::status sig3 = process::status::fake_signaled(3, false);
346*b0d29bc4SBrooks Davis 
347*b0d29bc4SBrooks Davis     const engine::atf_result any_code(engine::atf_result::expected_exit, none,
348*b0d29bc4SBrooks Davis                                       "The reason");
349*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
350*b0d29bc4SBrooks Davis         engine::atf_result(engine::atf_result::broken,
351*b0d29bc4SBrooks Davis                            "Expected clean exit but received signal 3"),
352*b0d29bc4SBrooks Davis         any_code.apply(utils::make_optional(sig3)));
353*b0d29bc4SBrooks Davis }
354*b0d29bc4SBrooks Davis 
355*b0d29bc4SBrooks Davis 
356*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_failure__ok);
ATF_TEST_CASE_BODY(atf_result__apply__expected_failure__ok)357*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__apply__expected_failure__ok)
358*b0d29bc4SBrooks Davis {
359*b0d29bc4SBrooks Davis     const process::status status = process::status::fake_exited(EXIT_SUCCESS);
360*b0d29bc4SBrooks Davis     const engine::atf_result xfailure(engine::atf_result::expected_failure,
361*b0d29bc4SBrooks Davis                                       "The reason");
362*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(xfailure, xfailure.apply(utils::make_optional(status)));
363*b0d29bc4SBrooks Davis }
364*b0d29bc4SBrooks Davis 
365*b0d29bc4SBrooks Davis 
366*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_failure__broken);
ATF_TEST_CASE_BODY(atf_result__apply__expected_failure__broken)367*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__apply__expected_failure__broken)
368*b0d29bc4SBrooks Davis {
369*b0d29bc4SBrooks Davis     const process::status failure = process::status::fake_exited(EXIT_FAILURE);
370*b0d29bc4SBrooks Davis     const process::status sig3 = process::status::fake_signaled(3, true);
371*b0d29bc4SBrooks Davis     const process::status sig4 = process::status::fake_signaled(4, false);
372*b0d29bc4SBrooks Davis 
373*b0d29bc4SBrooks Davis     const engine::atf_result xfailure(engine::atf_result::expected_failure,
374*b0d29bc4SBrooks Davis                                       "The reason");
375*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
376*b0d29bc4SBrooks Davis         engine::atf_result(engine::atf_result::broken,
377*b0d29bc4SBrooks Davis                            "Expected failure should have reported success but "
378*b0d29bc4SBrooks Davis                            "exited with code 1"),
379*b0d29bc4SBrooks Davis         xfailure.apply(utils::make_optional(failure)));
380*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
381*b0d29bc4SBrooks Davis         engine::atf_result(engine::atf_result::broken,
382*b0d29bc4SBrooks Davis                            "Expected failure should have reported success but "
383*b0d29bc4SBrooks Davis                            "received signal 3 (core dumped)"),
384*b0d29bc4SBrooks Davis         xfailure.apply(utils::make_optional(sig3)));
385*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
386*b0d29bc4SBrooks Davis         engine::atf_result(engine::atf_result::broken,
387*b0d29bc4SBrooks Davis                            "Expected failure should have reported success but "
388*b0d29bc4SBrooks Davis                            "received signal 4"),
389*b0d29bc4SBrooks Davis         xfailure.apply(utils::make_optional(sig4)));
390*b0d29bc4SBrooks Davis }
391*b0d29bc4SBrooks Davis 
392*b0d29bc4SBrooks Davis 
393*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_signal__ok);
ATF_TEST_CASE_BODY(atf_result__apply__expected_signal__ok)394*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__apply__expected_signal__ok)
395*b0d29bc4SBrooks Davis {
396*b0d29bc4SBrooks Davis     const process::status sig1 = process::status::fake_signaled(1, false);
397*b0d29bc4SBrooks Davis     const process::status sig3 = process::status::fake_signaled(3, true);
398*b0d29bc4SBrooks Davis 
399*b0d29bc4SBrooks Davis     const engine::atf_result any_sig(engine::atf_result::expected_signal, none,
400*b0d29bc4SBrooks Davis                                      "The reason");
401*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(any_sig, any_sig.apply(utils::make_optional(sig1)));
402*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(any_sig, any_sig.apply(utils::make_optional(sig3)));
403*b0d29bc4SBrooks Davis 
404*b0d29bc4SBrooks Davis     const engine::atf_result a_sig(engine::atf_result::expected_signal,
405*b0d29bc4SBrooks Davis                            utils::make_optional(3), "The reason");
406*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(a_sig, a_sig.apply(utils::make_optional(sig3)));
407*b0d29bc4SBrooks Davis }
408*b0d29bc4SBrooks Davis 
409*b0d29bc4SBrooks Davis 
410*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_signal__failed);
ATF_TEST_CASE_BODY(atf_result__apply__expected_signal__failed)411*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__apply__expected_signal__failed)
412*b0d29bc4SBrooks Davis {
413*b0d29bc4SBrooks Davis     const process::status sig5 = process::status::fake_signaled(5, false);
414*b0d29bc4SBrooks Davis 
415*b0d29bc4SBrooks Davis     const engine::atf_result a_sig(engine::atf_result::expected_signal,
416*b0d29bc4SBrooks Davis                            utils::make_optional(4), "The reason");
417*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
418*b0d29bc4SBrooks Davis         engine::atf_result(engine::atf_result::failed,
419*b0d29bc4SBrooks Davis                            "Test case expected to receive signal 4 but got 5"),
420*b0d29bc4SBrooks Davis         a_sig.apply(utils::make_optional(sig5)));
421*b0d29bc4SBrooks Davis }
422*b0d29bc4SBrooks Davis 
423*b0d29bc4SBrooks Davis 
424*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_signal__broken);
ATF_TEST_CASE_BODY(atf_result__apply__expected_signal__broken)425*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__apply__expected_signal__broken)
426*b0d29bc4SBrooks Davis {
427*b0d29bc4SBrooks Davis     const process::status success = process::status::fake_exited(EXIT_SUCCESS);
428*b0d29bc4SBrooks Davis 
429*b0d29bc4SBrooks Davis     const engine::atf_result any_sig(engine::atf_result::expected_signal, none,
430*b0d29bc4SBrooks Davis                                      "The reason");
431*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
432*b0d29bc4SBrooks Davis         engine::atf_result(engine::atf_result::broken,
433*b0d29bc4SBrooks Davis                            "Expected signal but exited with code 0"),
434*b0d29bc4SBrooks Davis         any_sig.apply(utils::make_optional(success)));
435*b0d29bc4SBrooks Davis }
436*b0d29bc4SBrooks Davis 
437*b0d29bc4SBrooks Davis 
438*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_timeout__ok);
ATF_TEST_CASE_BODY(atf_result__apply__expected_timeout__ok)439*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__apply__expected_timeout__ok)
440*b0d29bc4SBrooks Davis {
441*b0d29bc4SBrooks Davis     const engine::atf_result timeout(engine::atf_result::expected_timeout,
442*b0d29bc4SBrooks Davis                                      "The reason");
443*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(timeout, timeout.apply(none));
444*b0d29bc4SBrooks Davis }
445*b0d29bc4SBrooks Davis 
446*b0d29bc4SBrooks Davis 
447*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_timeout__broken);
ATF_TEST_CASE_BODY(atf_result__apply__expected_timeout__broken)448*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__apply__expected_timeout__broken)
449*b0d29bc4SBrooks Davis {
450*b0d29bc4SBrooks Davis     const process::status status = process::status::fake_exited(EXIT_SUCCESS);
451*b0d29bc4SBrooks Davis     const engine::atf_result timeout(engine::atf_result::expected_timeout,
452*b0d29bc4SBrooks Davis                                      "The reason");
453*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
454*b0d29bc4SBrooks Davis         engine::atf_result(engine::atf_result::broken,
455*b0d29bc4SBrooks Davis                            "Expected timeout but exited with code 0"),
456*b0d29bc4SBrooks Davis         timeout.apply(utils::make_optional(status)));
457*b0d29bc4SBrooks Davis }
458*b0d29bc4SBrooks Davis 
459*b0d29bc4SBrooks Davis 
460*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__failed__ok);
ATF_TEST_CASE_BODY(atf_result__apply__failed__ok)461*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__apply__failed__ok)
462*b0d29bc4SBrooks Davis {
463*b0d29bc4SBrooks Davis     const process::status status = process::status::fake_exited(EXIT_FAILURE);
464*b0d29bc4SBrooks Davis     const engine::atf_result failed(engine::atf_result::failed, "The reason");
465*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(failed, failed.apply(utils::make_optional(status)));
466*b0d29bc4SBrooks Davis }
467*b0d29bc4SBrooks Davis 
468*b0d29bc4SBrooks Davis 
469*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__failed__broken);
ATF_TEST_CASE_BODY(atf_result__apply__failed__broken)470*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__apply__failed__broken)
471*b0d29bc4SBrooks Davis {
472*b0d29bc4SBrooks Davis     const process::status success = process::status::fake_exited(EXIT_SUCCESS);
473*b0d29bc4SBrooks Davis     const process::status sig3 = process::status::fake_signaled(3, true);
474*b0d29bc4SBrooks Davis     const process::status sig4 = process::status::fake_signaled(4, false);
475*b0d29bc4SBrooks Davis 
476*b0d29bc4SBrooks Davis     const engine::atf_result failed(engine::atf_result::failed, "The reason");
477*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
478*b0d29bc4SBrooks Davis         engine::atf_result(engine::atf_result::broken,
479*b0d29bc4SBrooks Davis                            "Failed test case should have reported failure but "
480*b0d29bc4SBrooks Davis                            "exited with code 0"),
481*b0d29bc4SBrooks Davis         failed.apply(utils::make_optional(success)));
482*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
483*b0d29bc4SBrooks Davis         engine::atf_result(engine::atf_result::broken,
484*b0d29bc4SBrooks Davis                            "Failed test case should have reported failure but "
485*b0d29bc4SBrooks Davis                            "received signal 3 (core dumped)"),
486*b0d29bc4SBrooks Davis         failed.apply(utils::make_optional(sig3)));
487*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
488*b0d29bc4SBrooks Davis         engine::atf_result(engine::atf_result::broken,
489*b0d29bc4SBrooks Davis                            "Failed test case should have reported failure but "
490*b0d29bc4SBrooks Davis                            "received signal 4"),
491*b0d29bc4SBrooks Davis         failed.apply(utils::make_optional(sig4)));
492*b0d29bc4SBrooks Davis }
493*b0d29bc4SBrooks Davis 
494*b0d29bc4SBrooks Davis 
495*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__passed__ok);
ATF_TEST_CASE_BODY(atf_result__apply__passed__ok)496*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__apply__passed__ok)
497*b0d29bc4SBrooks Davis {
498*b0d29bc4SBrooks Davis     const process::status status = process::status::fake_exited(EXIT_SUCCESS);
499*b0d29bc4SBrooks Davis     const engine::atf_result passed(engine::atf_result::passed);
500*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(passed, passed.apply(utils::make_optional(status)));
501*b0d29bc4SBrooks Davis }
502*b0d29bc4SBrooks Davis 
503*b0d29bc4SBrooks Davis 
504*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__passed__broken);
ATF_TEST_CASE_BODY(atf_result__apply__passed__broken)505*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__apply__passed__broken)
506*b0d29bc4SBrooks Davis {
507*b0d29bc4SBrooks Davis     const process::status failure = process::status::fake_exited(EXIT_FAILURE);
508*b0d29bc4SBrooks Davis     const process::status sig3 = process::status::fake_signaled(3, true);
509*b0d29bc4SBrooks Davis     const process::status sig4 = process::status::fake_signaled(4, false);
510*b0d29bc4SBrooks Davis 
511*b0d29bc4SBrooks Davis     const engine::atf_result passed(engine::atf_result::passed);
512*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
513*b0d29bc4SBrooks Davis         engine::atf_result(engine::atf_result::broken,
514*b0d29bc4SBrooks Davis                            "Passed test case should have reported success but "
515*b0d29bc4SBrooks Davis                            "exited with code 1"),
516*b0d29bc4SBrooks Davis         passed.apply(utils::make_optional(failure)));
517*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
518*b0d29bc4SBrooks Davis         engine::atf_result(engine::atf_result::broken,
519*b0d29bc4SBrooks Davis                            "Passed test case should have reported success but "
520*b0d29bc4SBrooks Davis                            "received signal 3 (core dumped)"),
521*b0d29bc4SBrooks Davis         passed.apply(utils::make_optional(sig3)));
522*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
523*b0d29bc4SBrooks Davis         engine::atf_result(engine::atf_result::broken,
524*b0d29bc4SBrooks Davis                            "Passed test case should have reported success but "
525*b0d29bc4SBrooks Davis                            "received signal 4"),
526*b0d29bc4SBrooks Davis         passed.apply(utils::make_optional(sig4)));
527*b0d29bc4SBrooks Davis }
528*b0d29bc4SBrooks Davis 
529*b0d29bc4SBrooks Davis 
530*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__skipped__ok);
ATF_TEST_CASE_BODY(atf_result__apply__skipped__ok)531*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__apply__skipped__ok)
532*b0d29bc4SBrooks Davis {
533*b0d29bc4SBrooks Davis     const process::status status = process::status::fake_exited(EXIT_SUCCESS);
534*b0d29bc4SBrooks Davis     const engine::atf_result skipped(engine::atf_result::skipped, "The reason");
535*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(skipped, skipped.apply(utils::make_optional(status)));
536*b0d29bc4SBrooks Davis }
537*b0d29bc4SBrooks Davis 
538*b0d29bc4SBrooks Davis 
539*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__skipped__broken);
ATF_TEST_CASE_BODY(atf_result__apply__skipped__broken)540*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__apply__skipped__broken)
541*b0d29bc4SBrooks Davis {
542*b0d29bc4SBrooks Davis     const process::status failure = process::status::fake_exited(EXIT_FAILURE);
543*b0d29bc4SBrooks Davis     const process::status sig3 = process::status::fake_signaled(3, true);
544*b0d29bc4SBrooks Davis     const process::status sig4 = process::status::fake_signaled(4, false);
545*b0d29bc4SBrooks Davis 
546*b0d29bc4SBrooks Davis     const engine::atf_result skipped(engine::atf_result::skipped, "The reason");
547*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
548*b0d29bc4SBrooks Davis         engine::atf_result(engine::atf_result::broken,
549*b0d29bc4SBrooks Davis                            "Skipped test case should have reported success but "
550*b0d29bc4SBrooks Davis                            "exited with code 1"),
551*b0d29bc4SBrooks Davis         skipped.apply(utils::make_optional(failure)));
552*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
553*b0d29bc4SBrooks Davis         engine::atf_result(engine::atf_result::broken,
554*b0d29bc4SBrooks Davis                            "Skipped test case should have reported success but "
555*b0d29bc4SBrooks Davis                            "received signal 3 (core dumped)"),
556*b0d29bc4SBrooks Davis         skipped.apply(utils::make_optional(sig3)));
557*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
558*b0d29bc4SBrooks Davis         engine::atf_result(engine::atf_result::broken,
559*b0d29bc4SBrooks Davis                            "Skipped test case should have reported success but "
560*b0d29bc4SBrooks Davis                            "received signal 4"),
561*b0d29bc4SBrooks Davis         skipped.apply(utils::make_optional(sig4)));
562*b0d29bc4SBrooks Davis }
563*b0d29bc4SBrooks Davis 
564*b0d29bc4SBrooks Davis 
565*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__externalize__broken);
ATF_TEST_CASE_BODY(atf_result__externalize__broken)566*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__externalize__broken)
567*b0d29bc4SBrooks Davis {
568*b0d29bc4SBrooks Davis     const engine::atf_result raw(engine::atf_result::broken, "The reason");
569*b0d29bc4SBrooks Davis     const model::test_result expected(model::test_result_broken,
570*b0d29bc4SBrooks Davis                                       "The reason");
571*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(expected, raw.externalize());
572*b0d29bc4SBrooks Davis }
573*b0d29bc4SBrooks Davis 
574*b0d29bc4SBrooks Davis 
575*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__externalize__expected_death);
ATF_TEST_CASE_BODY(atf_result__externalize__expected_death)576*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__externalize__expected_death)
577*b0d29bc4SBrooks Davis {
578*b0d29bc4SBrooks Davis     const engine::atf_result raw(engine::atf_result::expected_death,
579*b0d29bc4SBrooks Davis                                  "The reason");
580*b0d29bc4SBrooks Davis     const model::test_result expected(model::test_result_expected_failure,
581*b0d29bc4SBrooks Davis                                       "The reason");
582*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(expected, raw.externalize());
583*b0d29bc4SBrooks Davis }
584*b0d29bc4SBrooks Davis 
585*b0d29bc4SBrooks Davis 
586*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__externalize__expected_exit);
ATF_TEST_CASE_BODY(atf_result__externalize__expected_exit)587*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__externalize__expected_exit)
588*b0d29bc4SBrooks Davis {
589*b0d29bc4SBrooks Davis     const engine::atf_result raw(engine::atf_result::expected_exit,
590*b0d29bc4SBrooks Davis                                  "The reason");
591*b0d29bc4SBrooks Davis     const model::test_result expected(model::test_result_expected_failure,
592*b0d29bc4SBrooks Davis                                       "The reason");
593*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(expected, raw.externalize());
594*b0d29bc4SBrooks Davis }
595*b0d29bc4SBrooks Davis 
596*b0d29bc4SBrooks Davis 
597*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__externalize__expected_failure);
ATF_TEST_CASE_BODY(atf_result__externalize__expected_failure)598*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__externalize__expected_failure)
599*b0d29bc4SBrooks Davis {
600*b0d29bc4SBrooks Davis     const engine::atf_result raw(engine::atf_result::expected_failure,
601*b0d29bc4SBrooks Davis                                  "The reason");
602*b0d29bc4SBrooks Davis     const model::test_result expected(model::test_result_expected_failure,
603*b0d29bc4SBrooks Davis                                       "The reason");
604*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(expected, raw.externalize());
605*b0d29bc4SBrooks Davis }
606*b0d29bc4SBrooks Davis 
607*b0d29bc4SBrooks Davis 
608*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__externalize__expected_signal);
ATF_TEST_CASE_BODY(atf_result__externalize__expected_signal)609*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__externalize__expected_signal)
610*b0d29bc4SBrooks Davis {
611*b0d29bc4SBrooks Davis     const engine::atf_result raw(engine::atf_result::expected_signal,
612*b0d29bc4SBrooks Davis                                  "The reason");
613*b0d29bc4SBrooks Davis     const model::test_result expected(model::test_result_expected_failure,
614*b0d29bc4SBrooks Davis                                       "The reason");
615*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(expected, raw.externalize());
616*b0d29bc4SBrooks Davis }
617*b0d29bc4SBrooks Davis 
618*b0d29bc4SBrooks Davis 
619*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__externalize__expected_timeout);
ATF_TEST_CASE_BODY(atf_result__externalize__expected_timeout)620*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__externalize__expected_timeout)
621*b0d29bc4SBrooks Davis {
622*b0d29bc4SBrooks Davis     const engine::atf_result raw(engine::atf_result::expected_timeout,
623*b0d29bc4SBrooks Davis                                  "The reason");
624*b0d29bc4SBrooks Davis     const model::test_result expected(model::test_result_expected_failure,
625*b0d29bc4SBrooks Davis                                       "The reason");
626*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(expected, raw.externalize());
627*b0d29bc4SBrooks Davis }
628*b0d29bc4SBrooks Davis 
629*b0d29bc4SBrooks Davis 
630*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__externalize__failed);
ATF_TEST_CASE_BODY(atf_result__externalize__failed)631*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__externalize__failed)
632*b0d29bc4SBrooks Davis {
633*b0d29bc4SBrooks Davis     const engine::atf_result raw(engine::atf_result::failed, "The reason");
634*b0d29bc4SBrooks Davis     const model::test_result expected(model::test_result_failed,
635*b0d29bc4SBrooks Davis                                       "The reason");
636*b0d29bc4SBrooks Davis     ATF_REQUIRE(expected == raw.externalize());
637*b0d29bc4SBrooks Davis }
638*b0d29bc4SBrooks Davis 
639*b0d29bc4SBrooks Davis 
640*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__externalize__passed);
ATF_TEST_CASE_BODY(atf_result__externalize__passed)641*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__externalize__passed)
642*b0d29bc4SBrooks Davis {
643*b0d29bc4SBrooks Davis     const engine::atf_result raw(engine::atf_result::passed);
644*b0d29bc4SBrooks Davis     const model::test_result expected(model::test_result_passed);
645*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(expected, raw.externalize());
646*b0d29bc4SBrooks Davis }
647*b0d29bc4SBrooks Davis 
648*b0d29bc4SBrooks Davis 
649*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(atf_result__externalize__skipped);
ATF_TEST_CASE_BODY(atf_result__externalize__skipped)650*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(atf_result__externalize__skipped)
651*b0d29bc4SBrooks Davis {
652*b0d29bc4SBrooks Davis     const engine::atf_result raw(engine::atf_result::skipped, "The reason");
653*b0d29bc4SBrooks Davis     const model::test_result expected(model::test_result_skipped,
654*b0d29bc4SBrooks Davis                                       "The reason");
655*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(expected, raw.externalize());
656*b0d29bc4SBrooks Davis }
657*b0d29bc4SBrooks Davis 
658*b0d29bc4SBrooks Davis 
659*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(calculate_atf_result__missing_file);
ATF_TEST_CASE_BODY(calculate_atf_result__missing_file)660*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(calculate_atf_result__missing_file)
661*b0d29bc4SBrooks Davis {
662*b0d29bc4SBrooks Davis     using process::status;
663*b0d29bc4SBrooks Davis 
664*b0d29bc4SBrooks Davis     const status body_status = status::fake_exited(EXIT_SUCCESS);
665*b0d29bc4SBrooks Davis     const model::test_result expected(
666*b0d29bc4SBrooks Davis         model::test_result_broken,
667*b0d29bc4SBrooks Davis         "Premature exit; test case exited with code 0");
668*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(expected, engine::calculate_atf_result(
669*b0d29bc4SBrooks Davis         utils::make_optional(body_status), fs::path("foo")));
670*b0d29bc4SBrooks Davis }
671*b0d29bc4SBrooks Davis 
672*b0d29bc4SBrooks Davis 
673*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(calculate_atf_result__bad_file);
ATF_TEST_CASE_BODY(calculate_atf_result__bad_file)674*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(calculate_atf_result__bad_file)
675*b0d29bc4SBrooks Davis {
676*b0d29bc4SBrooks Davis     using process::status;
677*b0d29bc4SBrooks Davis 
678*b0d29bc4SBrooks Davis     const status body_status = status::fake_exited(EXIT_SUCCESS);
679*b0d29bc4SBrooks Davis     atf::utils::create_file("foo", "invalid\n");
680*b0d29bc4SBrooks Davis     const model::test_result expected(model::test_result_broken,
681*b0d29bc4SBrooks Davis                                       "Unknown test result 'invalid'");
682*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(expected, engine::calculate_atf_result(
683*b0d29bc4SBrooks Davis         utils::make_optional(body_status), fs::path("foo")));
684*b0d29bc4SBrooks Davis }
685*b0d29bc4SBrooks Davis 
686*b0d29bc4SBrooks Davis 
687*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(calculate_atf_result__body_ok);
ATF_TEST_CASE_BODY(calculate_atf_result__body_ok)688*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(calculate_atf_result__body_ok)
689*b0d29bc4SBrooks Davis {
690*b0d29bc4SBrooks Davis     using process::status;
691*b0d29bc4SBrooks Davis 
692*b0d29bc4SBrooks Davis     atf::utils::create_file("result.txt", "skipped: Something\n");
693*b0d29bc4SBrooks Davis     const status body_status = status::fake_exited(EXIT_SUCCESS);
694*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
695*b0d29bc4SBrooks Davis         model::test_result(model::test_result_skipped, "Something"),
696*b0d29bc4SBrooks Davis         engine::calculate_atf_result(utils::make_optional(body_status),
697*b0d29bc4SBrooks Davis                                      fs::path("result.txt")));
698*b0d29bc4SBrooks Davis }
699*b0d29bc4SBrooks Davis 
700*b0d29bc4SBrooks Davis 
701*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(calculate_atf_result__body_bad);
ATF_TEST_CASE_BODY(calculate_atf_result__body_bad)702*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(calculate_atf_result__body_bad)
703*b0d29bc4SBrooks Davis {
704*b0d29bc4SBrooks Davis     using process::status;
705*b0d29bc4SBrooks Davis 
706*b0d29bc4SBrooks Davis     atf::utils::create_file("result.txt", "skipped: Something\n");
707*b0d29bc4SBrooks Davis     const status body_status = status::fake_exited(EXIT_FAILURE);
708*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
709*b0d29bc4SBrooks Davis         model::test_result(model::test_result_broken, "Skipped test case "
710*b0d29bc4SBrooks Davis                            "should have reported success but exited with "
711*b0d29bc4SBrooks Davis                            "code 1"),
712*b0d29bc4SBrooks Davis         engine::calculate_atf_result(utils::make_optional(body_status),
713*b0d29bc4SBrooks Davis                                      fs::path("result.txt")));
714*b0d29bc4SBrooks Davis }
715*b0d29bc4SBrooks Davis 
716*b0d29bc4SBrooks Davis 
ATF_INIT_TEST_CASES(tcs)717*b0d29bc4SBrooks Davis ATF_INIT_TEST_CASES(tcs)
718*b0d29bc4SBrooks Davis {
719*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__empty);
720*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__no_newline__unknown);
721*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__no_newline__known);
722*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__multiline__no_newline);
723*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__multiline__with_newline);
724*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__unknown_status__no_reason);
725*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__unknown_status__with_reason);
726*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__missing_reason__no_delim);
727*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__missing_reason__bad_delim);
728*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__missing_reason__empty);
729*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__broken__ok);
730*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__broken__blanks);
731*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_death__ok);
732*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_death__blanks);
733*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_exit__ok__any);
734*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_exit__ok__specific);
735*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_exit__bad_int);
736*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_failure__ok);
737*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_failure__blanks);
738*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_signal__ok__any);
739*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_signal__ok__specific);
740*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_signal__bad_int);
741*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_timeout__ok);
742*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_timeout__blanks);
743*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__failed__ok);
744*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__failed__blanks);
745*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__passed__ok);
746*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__passed__reason);
747*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__skipped__ok);
748*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__parse__skipped__blanks);
749*b0d29bc4SBrooks Davis 
750*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__load__ok);
751*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__load__missing_file);
752*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__load__format_error);
753*b0d29bc4SBrooks Davis 
754*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__apply__broken__ok);
755*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__apply__timed_out);
756*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_death__ok);
757*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_exit__ok);
758*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_exit__failed);
759*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_exit__broken);
760*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_failure__ok);
761*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_failure__broken);
762*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_signal__ok);
763*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_signal__failed);
764*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_signal__broken);
765*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_timeout__ok);
766*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_timeout__broken);
767*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__apply__failed__ok);
768*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__apply__failed__broken);
769*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__apply__passed__ok);
770*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__apply__passed__broken);
771*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__apply__skipped__ok);
772*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__apply__skipped__broken);
773*b0d29bc4SBrooks Davis 
774*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__externalize__broken);
775*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__externalize__expected_death);
776*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__externalize__expected_exit);
777*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__externalize__expected_failure);
778*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__externalize__expected_signal);
779*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__externalize__expected_timeout);
780*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__externalize__failed);
781*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__externalize__passed);
782*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, atf_result__externalize__skipped);
783*b0d29bc4SBrooks Davis 
784*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, calculate_atf_result__missing_file);
785*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, calculate_atf_result__bad_file);
786*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, calculate_atf_result__body_ok);
787*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, calculate_atf_result__body_bad);
788*b0d29bc4SBrooks Davis }
789