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