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