Blame engine/atf_result_test.cpp

Packit 209faa
// Copyright 2010 The Kyua Authors.
Packit 209faa
// All rights reserved.
Packit 209faa
//
Packit 209faa
// Redistribution and use in source and binary forms, with or without
Packit 209faa
// modification, are permitted provided that the following conditions are
Packit 209faa
// met:
Packit 209faa
//
Packit 209faa
// * Redistributions of source code must retain the above copyright
Packit 209faa
//   notice, this list of conditions and the following disclaimer.
Packit 209faa
// * Redistributions in binary form must reproduce the above copyright
Packit 209faa
//   notice, this list of conditions and the following disclaimer in the
Packit 209faa
//   documentation and/or other materials provided with the distribution.
Packit 209faa
// * Neither the name of Google Inc. nor the names of its contributors
Packit 209faa
//   may be used to endorse or promote products derived from this software
Packit 209faa
//   without specific prior written permission.
Packit 209faa
//
Packit 209faa
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit 209faa
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit 209faa
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit 209faa
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit 209faa
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit 209faa
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit 209faa
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit 209faa
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit 209faa
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit 209faa
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit 209faa
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit 209faa
Packit 209faa
#include "engine/atf_result.hpp"
Packit 209faa
Packit 209faa
extern "C" {
Packit 209faa
#include <signal.h>
Packit 209faa
}
Packit 209faa
Packit 209faa
#include <cstdlib>
Packit 209faa
#include <fstream>
Packit 209faa
#include <sstream>
Packit 209faa
#include <stdexcept>
Packit 209faa
Packit 209faa
#include <atf-c++.hpp>
Packit 209faa
Packit 209faa
#include "engine/exceptions.hpp"
Packit 209faa
#include "model/test_result.hpp"
Packit 209faa
#include "utils/format/macros.hpp"
Packit 209faa
#include "utils/fs/path.hpp"
Packit 209faa
#include "utils/process/status.hpp"
Packit 209faa
Packit 209faa
namespace fs = utils::fs;
Packit 209faa
namespace process = utils::process;
Packit 209faa
Packit 209faa
using utils::none;
Packit 209faa
using utils::optional;
Packit 209faa
Packit 209faa
Packit 209faa
namespace {
Packit 209faa
Packit 209faa
Packit 209faa
/// Performs a test for results::parse() that should succeed.
Packit 209faa
///
Packit 209faa
/// \param exp_type The expected type of the result.
Packit 209faa
/// \param exp_argument The expected argument in the result, if any.
Packit 209faa
/// \param exp_reason The expected reason describing the result, if any.
Packit 209faa
/// \param text The literal input to parse; can include multiple lines.
Packit 209faa
static void
Packit 209faa
parse_ok_test(const engine::atf_result::types& exp_type,
Packit 209faa
              const optional< int >& exp_argument,
Packit 209faa
              const char* exp_reason, const char* text)
Packit 209faa
{
Packit 209faa
    std::istringstream input(text);
Packit 209faa
    const engine::atf_result actual = engine::atf_result::parse(input);
Packit 209faa
    ATF_REQUIRE(exp_type == actual.type());
Packit 209faa
    ATF_REQUIRE_EQ(exp_argument, actual.argument());
Packit 209faa
    if (exp_reason != NULL) {
Packit 209faa
        ATF_REQUIRE(actual.reason());
Packit 209faa
        ATF_REQUIRE_EQ(exp_reason, actual.reason().get());
Packit 209faa
    } else {
Packit 209faa
        ATF_REQUIRE(!actual.reason());
Packit 209faa
    }
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
/// Wrapper around parse_ok_test to define a test case.
Packit 209faa
///
Packit 209faa
/// \param name The name of the test case; will be prefixed with
Packit 209faa
///     "atf_result__parse__".
Packit 209faa
/// \param exp_type The expected type of the result.
Packit 209faa
/// \param exp_argument The expected argument in the result, if any.
Packit 209faa
/// \param exp_reason The expected reason describing the result, if any.
Packit 209faa
/// \param input The literal input to parse.
Packit 209faa
#define PARSE_OK(name, exp_type, exp_argument, exp_reason, input) \
Packit 209faa
    ATF_TEST_CASE_WITHOUT_HEAD(atf_result__parse__ ## name); \
Packit 209faa
    ATF_TEST_CASE_BODY(atf_result__parse__ ## name) \
Packit 209faa
    { \
Packit 209faa
        parse_ok_test(exp_type, exp_argument, exp_reason, input); \
Packit 209faa
    }
Packit 209faa
Packit 209faa
Packit 209faa
/// Performs a test for results::parse() that should fail.
Packit 209faa
///
Packit 209faa
/// \param reason_regexp The reason to match against the broken reason.
Packit 209faa
/// \param text The literal input to parse; can include multiple lines.
Packit 209faa
static void
Packit 209faa
parse_broken_test(const char* reason_regexp, const char* text)
Packit 209faa
{
Packit 209faa
    std::istringstream input(text);
Packit 209faa
    ATF_REQUIRE_THROW_RE(engine::format_error, reason_regexp,
Packit 209faa
                         engine::atf_result::parse(input));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
/// Wrapper around parse_broken_test to define a test case.
Packit 209faa
///
Packit 209faa
/// \param name The name of the test case; will be prefixed with
Packit 209faa
///    "atf_result__parse__".
Packit 209faa
/// \param reason_regexp The reason to match against the broken reason.
Packit 209faa
/// \param input The literal input to parse.
Packit 209faa
#define PARSE_BROKEN(name, reason_regexp, input) \
Packit 209faa
    ATF_TEST_CASE_WITHOUT_HEAD(atf_result__parse__ ## name); \
Packit 209faa
    ATF_TEST_CASE_BODY(atf_result__parse__ ## name) \
Packit 209faa
    { \
Packit 209faa
        parse_broken_test(reason_regexp, input); \
Packit 209faa
    }
Packit 209faa
Packit 209faa
Packit 209faa
}  // anonymous namespace
Packit 209faa
Packit 209faa
Packit 209faa
PARSE_BROKEN(empty,
Packit 209faa
             "Empty.*no new line",
Packit 209faa
             "");
Packit 209faa
PARSE_BROKEN(no_newline__unknown,
Packit 209faa
             "Empty.*no new line",
Packit 209faa
             "foo");
Packit 209faa
PARSE_BROKEN(no_newline__known,
Packit 209faa
             "Empty.*no new line",
Packit 209faa
             "passed");
Packit 209faa
PARSE_BROKEN(multiline__no_newline,
Packit 209faa
             "multiple lines.*foo<<NEWLINE>>bar",
Packit 209faa
             "failed: foo\nbar");
Packit 209faa
PARSE_BROKEN(multiline__with_newline,
Packit 209faa
             "multiple lines.*foo<<NEWLINE>>bar",
Packit 209faa
             "failed: foo\nbar\n");
Packit 209faa
PARSE_BROKEN(unknown_status__no_reason,
Packit 209faa
             "Unknown.*result.*'cba'",
Packit 209faa
             "cba\n");
Packit 209faa
PARSE_BROKEN(unknown_status__with_reason,
Packit 209faa
             "Unknown.*result.*'hgf'",
Packit 209faa
             "hgf: foo\n");
Packit 209faa
PARSE_BROKEN(missing_reason__no_delim,
Packit 209faa
             "failed.*followed by.*reason",
Packit 209faa
             "failed\n");
Packit 209faa
PARSE_BROKEN(missing_reason__bad_delim,
Packit 209faa
             "failed.*followed by.*reason",
Packit 209faa
             "failed:\n");
Packit 209faa
PARSE_BROKEN(missing_reason__empty,
Packit 209faa
             "failed.*followed by.*reason",
Packit 209faa
             "failed: \n");
Packit 209faa
Packit 209faa
Packit 209faa
PARSE_OK(broken__ok,
Packit 209faa
         engine::atf_result::broken, none, "a b c",
Packit 209faa
         "broken: a b c\n");
Packit 209faa
PARSE_OK(broken__blanks,
Packit 209faa
         engine::atf_result::broken, none, "   ",
Packit 209faa
         "broken:    \n");
Packit 209faa
Packit 209faa
Packit 209faa
PARSE_OK(expected_death__ok,
Packit 209faa
         engine::atf_result::expected_death, none, "a b c",
Packit 209faa
         "expected_death: a b c\n");
Packit 209faa
PARSE_OK(expected_death__blanks,
Packit 209faa
         engine::atf_result::expected_death, none, "   ",
Packit 209faa
         "expected_death:    \n");
Packit 209faa
Packit 209faa
Packit 209faa
PARSE_OK(expected_exit__ok__any,
Packit 209faa
         engine::atf_result::expected_exit, none, "any exit code",
Packit 209faa
         "expected_exit: any exit code\n");
Packit 209faa
PARSE_OK(expected_exit__ok__specific,
Packit 209faa
         engine::atf_result::expected_exit, optional< int >(712),
Packit 209faa
         "some known exit code",
Packit 209faa
         "expected_exit(712): some known exit code\n");
Packit 209faa
PARSE_BROKEN(expected_exit__bad_int,
Packit 209faa
             "Invalid integer.*45a3",
Packit 209faa
             "expected_exit(45a3): this is broken\n");
Packit 209faa
Packit 209faa
Packit 209faa
PARSE_OK(expected_failure__ok,
Packit 209faa
         engine::atf_result::expected_failure, none, "a b c",
Packit 209faa
         "expected_failure: a b c\n");
Packit 209faa
PARSE_OK(expected_failure__blanks,
Packit 209faa
         engine::atf_result::expected_failure, none, "   ",
Packit 209faa
         "expected_failure:    \n");
Packit 209faa
Packit 209faa
Packit 209faa
PARSE_OK(expected_signal__ok__any,
Packit 209faa
         engine::atf_result::expected_signal, none, "any signal code",
Packit 209faa
         "expected_signal: any signal code\n");
Packit 209faa
PARSE_OK(expected_signal__ok__specific,
Packit 209faa
         engine::atf_result::expected_signal, optional< int >(712),
Packit 209faa
         "some known signal code",
Packit 209faa
         "expected_signal(712): some known signal code\n");
Packit 209faa
PARSE_BROKEN(expected_signal__bad_int,
Packit 209faa
             "Invalid integer.*45a3",
Packit 209faa
             "expected_signal(45a3): this is broken\n");
Packit 209faa
Packit 209faa
Packit 209faa
PARSE_OK(expected_timeout__ok,
Packit 209faa
         engine::atf_result::expected_timeout, none, "a b c",
Packit 209faa
         "expected_timeout: a b c\n");
Packit 209faa
PARSE_OK(expected_timeout__blanks,
Packit 209faa
         engine::atf_result::expected_timeout, none, "   ",
Packit 209faa
         "expected_timeout:    \n");
Packit 209faa
Packit 209faa
Packit 209faa
PARSE_OK(failed__ok,
Packit 209faa
         engine::atf_result::failed, none, "a b c",
Packit 209faa
         "failed: a b c\n");
Packit 209faa
PARSE_OK(failed__blanks,
Packit 209faa
         engine::atf_result::failed, none, "   ",
Packit 209faa
         "failed:    \n");
Packit 209faa
Packit 209faa
Packit 209faa
PARSE_OK(passed__ok,
Packit 209faa
         engine::atf_result::passed, none, NULL,
Packit 209faa
         "passed\n");
Packit 209faa
PARSE_BROKEN(passed__reason,
Packit 209faa
             "cannot have a reason",
Packit 209faa
             "passed a b c\n");
Packit 209faa
Packit 209faa
Packit 209faa
PARSE_OK(skipped__ok,
Packit 209faa
         engine::atf_result::skipped, none, "a b c",
Packit 209faa
         "skipped: a b c\n");
Packit 209faa
PARSE_OK(skipped__blanks,
Packit 209faa
         engine::atf_result::skipped, none, "   ",
Packit 209faa
         "skipped:    \n");
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__load__ok);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__load__ok)
Packit 209faa
{
Packit 209faa
    std::ofstream output("result.txt");
Packit 209faa
    ATF_REQUIRE(output);
Packit 209faa
    output << "skipped: a b c\n";
Packit 209faa
    output.close();
Packit 209faa
Packit 209faa
    const engine::atf_result result = engine::atf_result::load(
Packit 209faa
        utils::fs::path("result.txt"));
Packit 209faa
    ATF_REQUIRE(engine::atf_result::skipped == result.type());
Packit 209faa
    ATF_REQUIRE(!result.argument());
Packit 209faa
    ATF_REQUIRE(result.reason());
Packit 209faa
    ATF_REQUIRE_EQ("a b c", result.reason().get());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__load__missing_file);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__load__missing_file)
Packit 209faa
{
Packit 209faa
    ATF_REQUIRE_THROW_RE(
Packit 209faa
        std::runtime_error, "Cannot open",
Packit 209faa
        engine::atf_result::load(utils::fs::path("result.txt")));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__load__format_error);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__load__format_error)
Packit 209faa
{
Packit 209faa
    std::ofstream output("abc.txt");
Packit 209faa
    ATF_REQUIRE(output);
Packit 209faa
    output << "passed: foo\n";
Packit 209faa
    output.close();
Packit 209faa
Packit 209faa
    ATF_REQUIRE_THROW_RE(engine::format_error, "cannot have a reason",
Packit 209faa
                         engine::atf_result::load(utils::fs::path("abc.txt")));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__broken__ok);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__apply__broken__ok)
Packit 209faa
{
Packit 209faa
    const engine::atf_result in_result(engine::atf_result::broken,
Packit 209faa
                                       "Passthrough");
Packit 209faa
    const process::status status = process::status::fake_exited(EXIT_SUCCESS);
Packit 209faa
    ATF_REQUIRE_EQ(in_result, in_result.apply(utils::make_optional(status)));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__timed_out);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__apply__timed_out)
Packit 209faa
{
Packit 209faa
    const engine::atf_result timed_out(engine::atf_result::broken,
Packit 209faa
                                       "Some arbitrary error");
Packit 209faa
    ATF_REQUIRE_EQ(engine::atf_result(engine::atf_result::broken,
Packit 209faa
                                      "Test case body timed out"),
Packit 209faa
                   timed_out.apply(none));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_death__ok);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__apply__expected_death__ok)
Packit 209faa
{
Packit 209faa
    const engine::atf_result in_result(engine::atf_result::expected_death,
Packit 209faa
                                       "Passthrough");
Packit 209faa
    const process::status status = process::status::fake_signaled(SIGINT, true);
Packit 209faa
    ATF_REQUIRE_EQ(in_result, in_result.apply(utils::make_optional(status)));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_exit__ok);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__apply__expected_exit__ok)
Packit 209faa
{
Packit 209faa
    const process::status success = process::status::fake_exited(EXIT_SUCCESS);
Packit 209faa
    const process::status failure = process::status::fake_exited(EXIT_FAILURE);
Packit 209faa
Packit 209faa
    const engine::atf_result any_code(engine::atf_result::expected_exit, none,
Packit 209faa
                                      "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(any_code, any_code.apply(utils::make_optional(success)));
Packit 209faa
    ATF_REQUIRE_EQ(any_code, any_code.apply(utils::make_optional(failure)));
Packit 209faa
Packit 209faa
    const engine::atf_result a_code(engine::atf_result::expected_exit,
Packit 209faa
                            utils::make_optional(EXIT_FAILURE), "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(a_code, a_code.apply(utils::make_optional(failure)));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_exit__failed);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__apply__expected_exit__failed)
Packit 209faa
{
Packit 209faa
    const process::status success = process::status::fake_exited(EXIT_SUCCESS);
Packit 209faa
Packit 209faa
    const engine::atf_result a_code(engine::atf_result::expected_exit,
Packit 209faa
                            utils::make_optional(EXIT_FAILURE), "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(
Packit 209faa
        engine::atf_result(engine::atf_result::failed,
Packit 209faa
                           "Test case expected to exit with code 1 but got "
Packit 209faa
                           "code 0"),
Packit 209faa
        a_code.apply(utils::make_optional(success)));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_exit__broken);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__apply__expected_exit__broken)
Packit 209faa
{
Packit 209faa
    const process::status sig3 = process::status::fake_signaled(3, false);
Packit 209faa
Packit 209faa
    const engine::atf_result any_code(engine::atf_result::expected_exit, none,
Packit 209faa
                                      "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(
Packit 209faa
        engine::atf_result(engine::atf_result::broken,
Packit 209faa
                           "Expected clean exit but received signal 3"),
Packit 209faa
        any_code.apply(utils::make_optional(sig3)));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_failure__ok);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__apply__expected_failure__ok)
Packit 209faa
{
Packit 209faa
    const process::status status = process::status::fake_exited(EXIT_SUCCESS);
Packit 209faa
    const engine::atf_result xfailure(engine::atf_result::expected_failure,
Packit 209faa
                                      "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(xfailure, xfailure.apply(utils::make_optional(status)));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_failure__broken);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__apply__expected_failure__broken)
Packit 209faa
{
Packit 209faa
    const process::status failure = process::status::fake_exited(EXIT_FAILURE);
Packit 209faa
    const process::status sig3 = process::status::fake_signaled(3, true);
Packit 209faa
    const process::status sig4 = process::status::fake_signaled(4, false);
Packit 209faa
Packit 209faa
    const engine::atf_result xfailure(engine::atf_result::expected_failure,
Packit 209faa
                                      "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(
Packit 209faa
        engine::atf_result(engine::atf_result::broken,
Packit 209faa
                           "Expected failure should have reported success but "
Packit 209faa
                           "exited with code 1"),
Packit 209faa
        xfailure.apply(utils::make_optional(failure)));
Packit 209faa
    ATF_REQUIRE_EQ(
Packit 209faa
        engine::atf_result(engine::atf_result::broken,
Packit 209faa
                           "Expected failure should have reported success but "
Packit 209faa
                           "received signal 3 (core dumped)"),
Packit 209faa
        xfailure.apply(utils::make_optional(sig3)));
Packit 209faa
    ATF_REQUIRE_EQ(
Packit 209faa
        engine::atf_result(engine::atf_result::broken,
Packit 209faa
                           "Expected failure should have reported success but "
Packit 209faa
                           "received signal 4"),
Packit 209faa
        xfailure.apply(utils::make_optional(sig4)));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_signal__ok);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__apply__expected_signal__ok)
Packit 209faa
{
Packit 209faa
    const process::status sig1 = process::status::fake_signaled(1, false);
Packit 209faa
    const process::status sig3 = process::status::fake_signaled(3, true);
Packit 209faa
Packit 209faa
    const engine::atf_result any_sig(engine::atf_result::expected_signal, none,
Packit 209faa
                                     "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(any_sig, any_sig.apply(utils::make_optional(sig1)));
Packit 209faa
    ATF_REQUIRE_EQ(any_sig, any_sig.apply(utils::make_optional(sig3)));
Packit 209faa
Packit 209faa
    const engine::atf_result a_sig(engine::atf_result::expected_signal,
Packit 209faa
                           utils::make_optional(3), "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(a_sig, a_sig.apply(utils::make_optional(sig3)));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_signal__failed);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__apply__expected_signal__failed)
Packit 209faa
{
Packit 209faa
    const process::status sig5 = process::status::fake_signaled(5, false);
Packit 209faa
Packit 209faa
    const engine::atf_result a_sig(engine::atf_result::expected_signal,
Packit 209faa
                           utils::make_optional(4), "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(
Packit 209faa
        engine::atf_result(engine::atf_result::failed,
Packit 209faa
                           "Test case expected to receive signal 4 but got 5"),
Packit 209faa
        a_sig.apply(utils::make_optional(sig5)));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_signal__broken);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__apply__expected_signal__broken)
Packit 209faa
{
Packit 209faa
    const process::status success = process::status::fake_exited(EXIT_SUCCESS);
Packit 209faa
Packit 209faa
    const engine::atf_result any_sig(engine::atf_result::expected_signal, none,
Packit 209faa
                                     "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(
Packit 209faa
        engine::atf_result(engine::atf_result::broken,
Packit 209faa
                           "Expected signal but exited with code 0"),
Packit 209faa
        any_sig.apply(utils::make_optional(success)));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_timeout__ok);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__apply__expected_timeout__ok)
Packit 209faa
{
Packit 209faa
    const engine::atf_result timeout(engine::atf_result::expected_timeout,
Packit 209faa
                                     "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(timeout, timeout.apply(none));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__expected_timeout__broken);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__apply__expected_timeout__broken)
Packit 209faa
{
Packit 209faa
    const process::status status = process::status::fake_exited(EXIT_SUCCESS);
Packit 209faa
    const engine::atf_result timeout(engine::atf_result::expected_timeout,
Packit 209faa
                                     "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(
Packit 209faa
        engine::atf_result(engine::atf_result::broken,
Packit 209faa
                           "Expected timeout but exited with code 0"),
Packit 209faa
        timeout.apply(utils::make_optional(status)));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__failed__ok);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__apply__failed__ok)
Packit 209faa
{
Packit 209faa
    const process::status status = process::status::fake_exited(EXIT_FAILURE);
Packit 209faa
    const engine::atf_result failed(engine::atf_result::failed, "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(failed, failed.apply(utils::make_optional(status)));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__failed__broken);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__apply__failed__broken)
Packit 209faa
{
Packit 209faa
    const process::status success = process::status::fake_exited(EXIT_SUCCESS);
Packit 209faa
    const process::status sig3 = process::status::fake_signaled(3, true);
Packit 209faa
    const process::status sig4 = process::status::fake_signaled(4, false);
Packit 209faa
Packit 209faa
    const engine::atf_result failed(engine::atf_result::failed, "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(
Packit 209faa
        engine::atf_result(engine::atf_result::broken,
Packit 209faa
                           "Failed test case should have reported failure but "
Packit 209faa
                           "exited with code 0"),
Packit 209faa
        failed.apply(utils::make_optional(success)));
Packit 209faa
    ATF_REQUIRE_EQ(
Packit 209faa
        engine::atf_result(engine::atf_result::broken,
Packit 209faa
                           "Failed test case should have reported failure but "
Packit 209faa
                           "received signal 3 (core dumped)"),
Packit 209faa
        failed.apply(utils::make_optional(sig3)));
Packit 209faa
    ATF_REQUIRE_EQ(
Packit 209faa
        engine::atf_result(engine::atf_result::broken,
Packit 209faa
                           "Failed test case should have reported failure but "
Packit 209faa
                           "received signal 4"),
Packit 209faa
        failed.apply(utils::make_optional(sig4)));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__passed__ok);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__apply__passed__ok)
Packit 209faa
{
Packit 209faa
    const process::status status = process::status::fake_exited(EXIT_SUCCESS);
Packit 209faa
    const engine::atf_result passed(engine::atf_result::passed);
Packit 209faa
    ATF_REQUIRE_EQ(passed, passed.apply(utils::make_optional(status)));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__passed__broken);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__apply__passed__broken)
Packit 209faa
{
Packit 209faa
    const process::status failure = process::status::fake_exited(EXIT_FAILURE);
Packit 209faa
    const process::status sig3 = process::status::fake_signaled(3, true);
Packit 209faa
    const process::status sig4 = process::status::fake_signaled(4, false);
Packit 209faa
Packit 209faa
    const engine::atf_result passed(engine::atf_result::passed);
Packit 209faa
    ATF_REQUIRE_EQ(
Packit 209faa
        engine::atf_result(engine::atf_result::broken,
Packit 209faa
                           "Passed test case should have reported success but "
Packit 209faa
                           "exited with code 1"),
Packit 209faa
        passed.apply(utils::make_optional(failure)));
Packit 209faa
    ATF_REQUIRE_EQ(
Packit 209faa
        engine::atf_result(engine::atf_result::broken,
Packit 209faa
                           "Passed test case should have reported success but "
Packit 209faa
                           "received signal 3 (core dumped)"),
Packit 209faa
        passed.apply(utils::make_optional(sig3)));
Packit 209faa
    ATF_REQUIRE_EQ(
Packit 209faa
        engine::atf_result(engine::atf_result::broken,
Packit 209faa
                           "Passed test case should have reported success but "
Packit 209faa
                           "received signal 4"),
Packit 209faa
        passed.apply(utils::make_optional(sig4)));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__skipped__ok);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__apply__skipped__ok)
Packit 209faa
{
Packit 209faa
    const process::status status = process::status::fake_exited(EXIT_SUCCESS);
Packit 209faa
    const engine::atf_result skipped(engine::atf_result::skipped, "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(skipped, skipped.apply(utils::make_optional(status)));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__apply__skipped__broken);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__apply__skipped__broken)
Packit 209faa
{
Packit 209faa
    const process::status failure = process::status::fake_exited(EXIT_FAILURE);
Packit 209faa
    const process::status sig3 = process::status::fake_signaled(3, true);
Packit 209faa
    const process::status sig4 = process::status::fake_signaled(4, false);
Packit 209faa
Packit 209faa
    const engine::atf_result skipped(engine::atf_result::skipped, "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(
Packit 209faa
        engine::atf_result(engine::atf_result::broken,
Packit 209faa
                           "Skipped test case should have reported success but "
Packit 209faa
                           "exited with code 1"),
Packit 209faa
        skipped.apply(utils::make_optional(failure)));
Packit 209faa
    ATF_REQUIRE_EQ(
Packit 209faa
        engine::atf_result(engine::atf_result::broken,
Packit 209faa
                           "Skipped test case should have reported success but "
Packit 209faa
                           "received signal 3 (core dumped)"),
Packit 209faa
        skipped.apply(utils::make_optional(sig3)));
Packit 209faa
    ATF_REQUIRE_EQ(
Packit 209faa
        engine::atf_result(engine::atf_result::broken,
Packit 209faa
                           "Skipped test case should have reported success but "
Packit 209faa
                           "received signal 4"),
Packit 209faa
        skipped.apply(utils::make_optional(sig4)));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__externalize__broken);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__externalize__broken)
Packit 209faa
{
Packit 209faa
    const engine::atf_result raw(engine::atf_result::broken, "The reason");
Packit 209faa
    const model::test_result expected(model::test_result_broken,
Packit 209faa
                                      "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(expected, raw.externalize());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__externalize__expected_death);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__externalize__expected_death)
Packit 209faa
{
Packit 209faa
    const engine::atf_result raw(engine::atf_result::expected_death,
Packit 209faa
                                 "The reason");
Packit 209faa
    const model::test_result expected(model::test_result_expected_failure,
Packit 209faa
                                      "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(expected, raw.externalize());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__externalize__expected_exit);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__externalize__expected_exit)
Packit 209faa
{
Packit 209faa
    const engine::atf_result raw(engine::atf_result::expected_exit,
Packit 209faa
                                 "The reason");
Packit 209faa
    const model::test_result expected(model::test_result_expected_failure,
Packit 209faa
                                      "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(expected, raw.externalize());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__externalize__expected_failure);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__externalize__expected_failure)
Packit 209faa
{
Packit 209faa
    const engine::atf_result raw(engine::atf_result::expected_failure,
Packit 209faa
                                 "The reason");
Packit 209faa
    const model::test_result expected(model::test_result_expected_failure,
Packit 209faa
                                      "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(expected, raw.externalize());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__externalize__expected_signal);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__externalize__expected_signal)
Packit 209faa
{
Packit 209faa
    const engine::atf_result raw(engine::atf_result::expected_signal,
Packit 209faa
                                 "The reason");
Packit 209faa
    const model::test_result expected(model::test_result_expected_failure,
Packit 209faa
                                      "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(expected, raw.externalize());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__externalize__expected_timeout);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__externalize__expected_timeout)
Packit 209faa
{
Packit 209faa
    const engine::atf_result raw(engine::atf_result::expected_timeout,
Packit 209faa
                                 "The reason");
Packit 209faa
    const model::test_result expected(model::test_result_expected_failure,
Packit 209faa
                                      "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(expected, raw.externalize());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__externalize__failed);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__externalize__failed)
Packit 209faa
{
Packit 209faa
    const engine::atf_result raw(engine::atf_result::failed, "The reason");
Packit 209faa
    const model::test_result expected(model::test_result_failed,
Packit 209faa
                                      "The reason");
Packit 209faa
    ATF_REQUIRE(expected == raw.externalize());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__externalize__passed);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__externalize__passed)
Packit 209faa
{
Packit 209faa
    const engine::atf_result raw(engine::atf_result::passed);
Packit 209faa
    const model::test_result expected(model::test_result_passed);
Packit 209faa
    ATF_REQUIRE_EQ(expected, raw.externalize());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(atf_result__externalize__skipped);
Packit 209faa
ATF_TEST_CASE_BODY(atf_result__externalize__skipped)
Packit 209faa
{
Packit 209faa
    const engine::atf_result raw(engine::atf_result::skipped, "The reason");
Packit 209faa
    const model::test_result expected(model::test_result_skipped,
Packit 209faa
                                      "The reason");
Packit 209faa
    ATF_REQUIRE_EQ(expected, raw.externalize());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(calculate_atf_result__missing_file);
Packit 209faa
ATF_TEST_CASE_BODY(calculate_atf_result__missing_file)
Packit 209faa
{
Packit 209faa
    using process::status;
Packit 209faa
Packit 209faa
    const status body_status = status::fake_exited(EXIT_SUCCESS);
Packit 209faa
    const model::test_result expected(
Packit 209faa
        model::test_result_broken,
Packit 209faa
        "Premature exit; test case exited with code 0");
Packit 209faa
    ATF_REQUIRE_EQ(expected, engine::calculate_atf_result(
Packit 209faa
        utils::make_optional(body_status), fs::path("foo")));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(calculate_atf_result__bad_file);
Packit 209faa
ATF_TEST_CASE_BODY(calculate_atf_result__bad_file)
Packit 209faa
{
Packit 209faa
    using process::status;
Packit 209faa
Packit 209faa
    const status body_status = status::fake_exited(EXIT_SUCCESS);
Packit 209faa
    atf::utils::create_file("foo", "invalid\n");
Packit 209faa
    const model::test_result expected(model::test_result_broken,
Packit 209faa
                                      "Unknown test result 'invalid'");
Packit 209faa
    ATF_REQUIRE_EQ(expected, engine::calculate_atf_result(
Packit 209faa
        utils::make_optional(body_status), fs::path("foo")));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(calculate_atf_result__body_ok);
Packit 209faa
ATF_TEST_CASE_BODY(calculate_atf_result__body_ok)
Packit 209faa
{
Packit 209faa
    using process::status;
Packit 209faa
Packit 209faa
    atf::utils::create_file("result.txt", "skipped: Something\n");
Packit 209faa
    const status body_status = status::fake_exited(EXIT_SUCCESS);
Packit 209faa
    ATF_REQUIRE_EQ(
Packit 209faa
        model::test_result(model::test_result_skipped, "Something"),
Packit 209faa
        engine::calculate_atf_result(utils::make_optional(body_status),
Packit 209faa
                                     fs::path("result.txt")));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(calculate_atf_result__body_bad);
Packit 209faa
ATF_TEST_CASE_BODY(calculate_atf_result__body_bad)
Packit 209faa
{
Packit 209faa
    using process::status;
Packit 209faa
Packit 209faa
    atf::utils::create_file("result.txt", "skipped: Something\n");
Packit 209faa
    const status body_status = status::fake_exited(EXIT_FAILURE);
Packit 209faa
    ATF_REQUIRE_EQ(
Packit 209faa
        model::test_result(model::test_result_broken, "Skipped test case "
Packit 209faa
                           "should have reported success but exited with "
Packit 209faa
                           "code 1"),
Packit 209faa
        engine::calculate_atf_result(utils::make_optional(body_status),
Packit 209faa
                                     fs::path("result.txt")));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_INIT_TEST_CASES(tcs)
Packit 209faa
{
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__empty);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__no_newline__unknown);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__no_newline__known);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__multiline__no_newline);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__multiline__with_newline);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__unknown_status__no_reason);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__unknown_status__with_reason);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__missing_reason__no_delim);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__missing_reason__bad_delim);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__missing_reason__empty);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__broken__ok);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__broken__blanks);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_death__ok);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_death__blanks);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_exit__ok__any);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_exit__ok__specific);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_exit__bad_int);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_failure__ok);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_failure__blanks);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_signal__ok__any);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_signal__ok__specific);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_signal__bad_int);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_timeout__ok);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__expected_timeout__blanks);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__failed__ok);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__failed__blanks);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__passed__ok);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__passed__reason);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__skipped__ok);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__parse__skipped__blanks);
Packit 209faa
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__load__ok);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__load__missing_file);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__load__format_error);
Packit 209faa
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__apply__broken__ok);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__apply__timed_out);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_death__ok);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_exit__ok);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_exit__failed);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_exit__broken);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_failure__ok);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_failure__broken);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_signal__ok);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_signal__failed);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_signal__broken);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_timeout__ok);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__apply__expected_timeout__broken);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__apply__failed__ok);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__apply__failed__broken);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__apply__passed__ok);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__apply__passed__broken);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__apply__skipped__ok);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__apply__skipped__broken);
Packit 209faa
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__externalize__broken);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__externalize__expected_death);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__externalize__expected_exit);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__externalize__expected_failure);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__externalize__expected_signal);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__externalize__expected_timeout);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__externalize__failed);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__externalize__passed);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, atf_result__externalize__skipped);
Packit 209faa
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, calculate_atf_result__missing_file);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, calculate_atf_result__bad_file);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, calculate_atf_result__body_ok);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, calculate_atf_result__body_bad);
Packit 209faa
}