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