1d780102eSjmmv //
2d780102eSjmmv // Automated Testing Framework (atf)
3d780102eSjmmv //
4d780102eSjmmv // Copyright (c) 2009 The NetBSD Foundation, Inc.
5d780102eSjmmv // All rights reserved.
6d780102eSjmmv //
7d780102eSjmmv // Redistribution and use in source and binary forms, with or without
8d780102eSjmmv // modification, are permitted provided that the following conditions
9d780102eSjmmv // are met:
10d780102eSjmmv // 1. Redistributions of source code must retain the above copyright
11d780102eSjmmv // notice, this list of conditions and the following disclaimer.
12d780102eSjmmv // 2. Redistributions in binary form must reproduce the above copyright
13d780102eSjmmv // notice, this list of conditions and the following disclaimer in the
14d780102eSjmmv // documentation and/or other materials provided with the distribution.
15d780102eSjmmv //
16d780102eSjmmv // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17d780102eSjmmv // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18d780102eSjmmv // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19d780102eSjmmv // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20d780102eSjmmv // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21d780102eSjmmv // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22d780102eSjmmv // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23d780102eSjmmv // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24d780102eSjmmv // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25d780102eSjmmv // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26d780102eSjmmv // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27d780102eSjmmv // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28d780102eSjmmv //
29d780102eSjmmv
30d780102eSjmmv extern "C" {
31d780102eSjmmv #include <sys/types.h>
32d780102eSjmmv #include <sys/stat.h>
33d780102eSjmmv }
34d780102eSjmmv
35d780102eSjmmv #include <algorithm>
36d780102eSjmmv #include <fstream>
37d780102eSjmmv #include <memory>
38d780102eSjmmv
39d780102eSjmmv #include <atf-c++.hpp>
40d780102eSjmmv
41d780102eSjmmv #include "atffile.hpp"
42d780102eSjmmv #include "exceptions.hpp"
43d780102eSjmmv #include "test_helpers.hpp"
44d780102eSjmmv
45d780102eSjmmv namespace detail = tools::detail;
46d780102eSjmmv
47d780102eSjmmv // ------------------------------------------------------------------------
48d780102eSjmmv // Auxiliary functions.
49d780102eSjmmv // ------------------------------------------------------------------------
50d780102eSjmmv
51d780102eSjmmv namespace {
52d780102eSjmmv
53d780102eSjmmv typedef std::map< std::string, std::string > vars_map;
54d780102eSjmmv
55d780102eSjmmv static
56*ee43138cSchristos std::unique_ptr< std::ofstream >
new_atffile(void)57d780102eSjmmv new_atffile(void)
58d780102eSjmmv {
59*ee43138cSchristos std::unique_ptr< std::ofstream > os(new std::ofstream("Atffile"));
60d780102eSjmmv ATF_REQUIRE(*os);
61d780102eSjmmv
62d780102eSjmmv (*os) << "Content-Type: application/X-atf-atffile; version=\"1\"\n\n";
63d780102eSjmmv return os;
64d780102eSjmmv }
65d780102eSjmmv
66d780102eSjmmv static
67d780102eSjmmv void
touch_exec(const char * name)68d780102eSjmmv touch_exec(const char* name)
69d780102eSjmmv {
70d780102eSjmmv std::ofstream os(name);
71d780102eSjmmv ATF_REQUIRE(os);
72d780102eSjmmv os.close();
73d780102eSjmmv ATF_REQUIRE(::chmod(name, S_IRWXU) != -1);
74d780102eSjmmv }
75d780102eSjmmv
76d780102eSjmmv static inline
77d780102eSjmmv bool
is_in(const std::string & value,const std::vector<std::string> & v)78d780102eSjmmv is_in(const std::string& value, const std::vector< std::string >& v)
79d780102eSjmmv {
80d780102eSjmmv return std::find(v.begin(), v.end(), value) != v.end();
81d780102eSjmmv }
82d780102eSjmmv
83d780102eSjmmv } // anonymous namespace
84d780102eSjmmv
85d780102eSjmmv // ------------------------------------------------------------------------
86d780102eSjmmv // Tests cases for the "atffile" parser.
87d780102eSjmmv // ------------------------------------------------------------------------
88d780102eSjmmv
89d780102eSjmmv class atffile_reader : protected detail::atf_atffile_reader {
90d780102eSjmmv void
got_conf(const std::string & name,const std::string & val)91d780102eSjmmv got_conf(const std::string& name, const std::string& val)
92d780102eSjmmv {
93d780102eSjmmv m_calls.push_back("got_conf(" + name + ", " + val + ")");
94d780102eSjmmv }
95d780102eSjmmv
96d780102eSjmmv void
got_prop(const std::string & name,const std::string & val)97d780102eSjmmv got_prop(const std::string& name, const std::string& val)
98d780102eSjmmv {
99d780102eSjmmv m_calls.push_back("got_prop(" + name + ", " + val + ")");
100d780102eSjmmv }
101d780102eSjmmv
102d780102eSjmmv void
got_tp(const std::string & name,bool isglob)103d780102eSjmmv got_tp(const std::string& name, bool isglob)
104d780102eSjmmv {
105d780102eSjmmv m_calls.push_back("got_tp(" + name + ", " + (isglob ? "true" : "false")
106d780102eSjmmv + ")");
107d780102eSjmmv }
108d780102eSjmmv
109d780102eSjmmv void
got_eof(void)110d780102eSjmmv got_eof(void)
111d780102eSjmmv {
112d780102eSjmmv m_calls.push_back("got_eof()");
113d780102eSjmmv }
114d780102eSjmmv
115d780102eSjmmv public:
atffile_reader(std::istream & is)116d780102eSjmmv atffile_reader(std::istream& is) :
117d780102eSjmmv detail::atf_atffile_reader(is)
118d780102eSjmmv {
119d780102eSjmmv }
120d780102eSjmmv
121d780102eSjmmv void
read(void)122d780102eSjmmv read(void)
123d780102eSjmmv {
124d780102eSjmmv atf_atffile_reader::read();
125d780102eSjmmv }
126d780102eSjmmv
127d780102eSjmmv std::vector< std::string > m_calls;
128d780102eSjmmv };
129d780102eSjmmv
130d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(atffile_1);
ATF_TEST_CASE_BODY(atffile_1)131d780102eSjmmv ATF_TEST_CASE_BODY(atffile_1)
132d780102eSjmmv {
133d780102eSjmmv const char* input =
134d780102eSjmmv "Content-Type: application/X-atf-atffile; version=\"1\"\n"
135d780102eSjmmv "\n"
136d780102eSjmmv ;
137d780102eSjmmv
138d780102eSjmmv const char* exp_calls[] = {
139d780102eSjmmv "got_eof()",
140d780102eSjmmv NULL
141d780102eSjmmv };
142d780102eSjmmv
143d780102eSjmmv const char* exp_errors[] = {
144d780102eSjmmv NULL
145d780102eSjmmv };
146d780102eSjmmv
147d780102eSjmmv do_parser_test< atffile_reader >(input, exp_calls, exp_errors);
148d780102eSjmmv }
149d780102eSjmmv
150d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(atffile_2);
ATF_TEST_CASE_BODY(atffile_2)151d780102eSjmmv ATF_TEST_CASE_BODY(atffile_2)
152d780102eSjmmv {
153d780102eSjmmv const char* input =
154d780102eSjmmv "Content-Type: application/X-atf-atffile; version=\"1\"\n"
155d780102eSjmmv "\n"
156d780102eSjmmv "# This is a comment on a line of its own.\n"
157d780102eSjmmv "# And this is another one.\n"
158d780102eSjmmv "\n"
159d780102eSjmmv " # Another after some whitespace.\n"
160d780102eSjmmv "\n"
161d780102eSjmmv "# The last one after an empty line.\n"
162d780102eSjmmv ;
163d780102eSjmmv
164d780102eSjmmv const char* exp_calls[] = {
165d780102eSjmmv "got_eof()",
166d780102eSjmmv NULL
167d780102eSjmmv };
168d780102eSjmmv
169d780102eSjmmv const char* exp_errors[] = {
170d780102eSjmmv NULL
171d780102eSjmmv };
172d780102eSjmmv
173d780102eSjmmv do_parser_test< atffile_reader >(input, exp_calls, exp_errors);
174d780102eSjmmv }
175d780102eSjmmv
176d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(atffile_3);
ATF_TEST_CASE_BODY(atffile_3)177d780102eSjmmv ATF_TEST_CASE_BODY(atffile_3)
178d780102eSjmmv {
179d780102eSjmmv const char* input =
180d780102eSjmmv "Content-Type: application/X-atf-atffile; version=\"1\"\n"
181d780102eSjmmv "\n"
182d780102eSjmmv "conf: var1=value1\n"
183d780102eSjmmv "conf: var2 = value2\n"
184d780102eSjmmv "conf: var3 = value3\n"
185d780102eSjmmv "conf: var4 = value4\n"
186d780102eSjmmv "\n"
187d780102eSjmmv "conf:var5=value5\n"
188d780102eSjmmv " conf:var6=value6\n"
189d780102eSjmmv "\n"
190d780102eSjmmv "conf: var7 = \"This is a long value.\"\n"
191d780102eSjmmv "conf: var8 = \"Single-word\"\n"
192d780102eSjmmv "conf: var9 = \" Single-word \"\n"
193d780102eSjmmv "conf: var10 = Single-word\n"
194d780102eSjmmv ;
195d780102eSjmmv
196d780102eSjmmv const char* exp_calls[] = {
197d780102eSjmmv "got_conf(var1, value1)",
198d780102eSjmmv "got_conf(var2, value2)",
199d780102eSjmmv "got_conf(var3, value3)",
200d780102eSjmmv "got_conf(var4, value4)",
201d780102eSjmmv "got_conf(var5, value5)",
202d780102eSjmmv "got_conf(var6, value6)",
203d780102eSjmmv "got_conf(var7, This is a long value.)",
204d780102eSjmmv "got_conf(var8, Single-word)",
205d780102eSjmmv "got_conf(var9, Single-word )",
206d780102eSjmmv "got_conf(var10, Single-word)",
207d780102eSjmmv "got_eof()",
208d780102eSjmmv NULL
209d780102eSjmmv };
210d780102eSjmmv
211d780102eSjmmv const char* exp_errors[] = {
212d780102eSjmmv NULL
213d780102eSjmmv };
214d780102eSjmmv
215d780102eSjmmv do_parser_test< atffile_reader >(input, exp_calls, exp_errors);
216d780102eSjmmv }
217d780102eSjmmv
218d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(atffile_4);
ATF_TEST_CASE_BODY(atffile_4)219d780102eSjmmv ATF_TEST_CASE_BODY(atffile_4)
220d780102eSjmmv {
221d780102eSjmmv const char* input =
222d780102eSjmmv "Content-Type: application/X-atf-atffile; version=\"1\"\n"
223d780102eSjmmv "\n"
224d780102eSjmmv "prop: var1=value1\n"
225d780102eSjmmv "prop: var2 = value2\n"
226d780102eSjmmv "prop: var3 = value3\n"
227d780102eSjmmv "prop: var4 = value4\n"
228d780102eSjmmv "\n"
229d780102eSjmmv "prop:var5=value5\n"
230d780102eSjmmv " prop:var6=value6\n"
231d780102eSjmmv "\n"
232d780102eSjmmv "prop: var7 = \"This is a long value.\"\n"
233d780102eSjmmv "prop: var8 = \"Single-word\"\n"
234d780102eSjmmv "prop: var9 = \" Single-word \"\n"
235d780102eSjmmv "prop: var10 = Single-word\n"
236d780102eSjmmv ;
237d780102eSjmmv
238d780102eSjmmv const char* exp_calls[] = {
239d780102eSjmmv "got_prop(var1, value1)",
240d780102eSjmmv "got_prop(var2, value2)",
241d780102eSjmmv "got_prop(var3, value3)",
242d780102eSjmmv "got_prop(var4, value4)",
243d780102eSjmmv "got_prop(var5, value5)",
244d780102eSjmmv "got_prop(var6, value6)",
245d780102eSjmmv "got_prop(var7, This is a long value.)",
246d780102eSjmmv "got_prop(var8, Single-word)",
247d780102eSjmmv "got_prop(var9, Single-word )",
248d780102eSjmmv "got_prop(var10, Single-word)",
249d780102eSjmmv "got_eof()",
250d780102eSjmmv NULL
251d780102eSjmmv };
252d780102eSjmmv
253d780102eSjmmv const char* exp_errors[] = {
254d780102eSjmmv NULL
255d780102eSjmmv };
256d780102eSjmmv
257d780102eSjmmv do_parser_test< atffile_reader >(input, exp_calls, exp_errors);
258d780102eSjmmv }
259d780102eSjmmv
260d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(atffile_5);
ATF_TEST_CASE_BODY(atffile_5)261d780102eSjmmv ATF_TEST_CASE_BODY(atffile_5)
262d780102eSjmmv {
263d780102eSjmmv const char* input =
264d780102eSjmmv "Content-Type: application/X-atf-atffile; version=\"1\"\n"
265d780102eSjmmv "\n"
266d780102eSjmmv "tp:foo\n"
267d780102eSjmmv "tp: foo\n"
268d780102eSjmmv "tp: foo\n"
269d780102eSjmmv "tp: foo\n"
270d780102eSjmmv "tp: foo\n"
271d780102eSjmmv "tp: \"name with spaces\"\n"
272d780102eSjmmv "tp: \"single-word\"\n"
273d780102eSjmmv "tp: single-word\n"
274d780102eSjmmv "\n"
275d780102eSjmmv "tp-glob:foo*?bar\n"
276d780102eSjmmv "tp-glob: foo*?bar\n"
277d780102eSjmmv "tp-glob: foo*?bar\n"
278d780102eSjmmv "tp-glob: foo*?bar\n"
279d780102eSjmmv "tp-glob: foo*?bar\n"
280d780102eSjmmv "tp-glob: \"glob * with ? spaces\"\n"
281d780102eSjmmv "tp-glob: \"single-*-word\"\n"
282d780102eSjmmv "tp-glob: single-*-word\n"
283d780102eSjmmv ;
284d780102eSjmmv
285d780102eSjmmv const char* exp_calls[] = {
286d780102eSjmmv "got_tp(foo, false)",
287d780102eSjmmv "got_tp(foo, false)",
288d780102eSjmmv "got_tp(foo, false)",
289d780102eSjmmv "got_tp(foo, false)",
290d780102eSjmmv "got_tp(foo, false)",
291d780102eSjmmv "got_tp(name with spaces, false)",
292d780102eSjmmv "got_tp(single-word, false)",
293d780102eSjmmv "got_tp(single-word, false)",
294d780102eSjmmv "got_tp(foo*?bar, true)",
295d780102eSjmmv "got_tp(foo*?bar, true)",
296d780102eSjmmv "got_tp(foo*?bar, true)",
297d780102eSjmmv "got_tp(foo*?bar, true)",
298d780102eSjmmv "got_tp(foo*?bar, true)",
299d780102eSjmmv "got_tp(glob * with ? spaces, true)",
300d780102eSjmmv "got_tp(single-*-word, true)",
301d780102eSjmmv "got_tp(single-*-word, true)",
302d780102eSjmmv "got_eof()",
303d780102eSjmmv NULL
304d780102eSjmmv };
305d780102eSjmmv
306d780102eSjmmv const char* exp_errors[] = {
307d780102eSjmmv NULL
308d780102eSjmmv };
309d780102eSjmmv
310d780102eSjmmv do_parser_test< atffile_reader >(input, exp_calls, exp_errors);
311d780102eSjmmv }
312d780102eSjmmv
313d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(atffile_6);
ATF_TEST_CASE_BODY(atffile_6)314d780102eSjmmv ATF_TEST_CASE_BODY(atffile_6)
315d780102eSjmmv {
316d780102eSjmmv const char* input =
317d780102eSjmmv "Content-Type: application/X-atf-atffile; version=\"1\"\n"
318d780102eSjmmv "\n"
319d780102eSjmmv "prop: foo = bar # A comment.\n"
320d780102eSjmmv "conf: foo = bar # A comment.\n"
321d780102eSjmmv "tp: foo # A comment.\n"
322d780102eSjmmv "tp-glob: foo # A comment.\n"
323d780102eSjmmv ;
324d780102eSjmmv
325d780102eSjmmv const char* exp_calls[] = {
326d780102eSjmmv "got_prop(foo, bar)",
327d780102eSjmmv "got_conf(foo, bar)",
328d780102eSjmmv "got_tp(foo, false)",
329d780102eSjmmv "got_tp(foo, true)",
330d780102eSjmmv "got_eof()",
331d780102eSjmmv NULL
332d780102eSjmmv };
333d780102eSjmmv
334d780102eSjmmv const char* exp_errors[] = {
335d780102eSjmmv NULL
336d780102eSjmmv };
337d780102eSjmmv
338d780102eSjmmv do_parser_test< atffile_reader >(input, exp_calls, exp_errors);
339d780102eSjmmv }
340d780102eSjmmv
341d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(atffile_50);
ATF_TEST_CASE_BODY(atffile_50)342d780102eSjmmv ATF_TEST_CASE_BODY(atffile_50)
343d780102eSjmmv {
344d780102eSjmmv const char* input =
345d780102eSjmmv "Content-Type: application/X-atf-atffile; version=\"1\"\n"
346d780102eSjmmv "\n"
347d780102eSjmmv "foo\n"
348d780102eSjmmv ;
349d780102eSjmmv
350d780102eSjmmv const char* exp_calls[] = {
351d780102eSjmmv NULL
352d780102eSjmmv };
353d780102eSjmmv
354d780102eSjmmv // NO_CHECK_STYLE_BEGIN
355d780102eSjmmv const char* exp_errors[] = {
356d780102eSjmmv "3: Unexpected token `foo'; expected conf, #, prop, tp, tp-glob, a new line or eof",
357d780102eSjmmv NULL
358d780102eSjmmv };
359d780102eSjmmv // NO_CHECK_STYLE_END
360d780102eSjmmv
361d780102eSjmmv do_parser_test< atffile_reader >(input, exp_calls, exp_errors);
362d780102eSjmmv }
363d780102eSjmmv
364d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(atffile_51);
ATF_TEST_CASE_BODY(atffile_51)365d780102eSjmmv ATF_TEST_CASE_BODY(atffile_51)
366d780102eSjmmv {
367d780102eSjmmv const char* input =
368d780102eSjmmv "Content-Type: application/X-atf-atffile; version=\"1\"\n"
369d780102eSjmmv "\n"
370d780102eSjmmv "foo bar\n"
371d780102eSjmmv "baz\n"
372d780102eSjmmv ;
373d780102eSjmmv
374d780102eSjmmv const char* exp_calls[] = {
375d780102eSjmmv NULL
376d780102eSjmmv };
377d780102eSjmmv
378d780102eSjmmv // NO_CHECK_STYLE_BEGIN
379d780102eSjmmv const char* exp_errors[] = {
380d780102eSjmmv "3: Unexpected token `foo'; expected conf, #, prop, tp, tp-glob, a new line or eof",
381d780102eSjmmv "4: Unexpected token `baz'; expected conf, #, prop, tp, tp-glob, a new line or eof",
382d780102eSjmmv NULL
383d780102eSjmmv };
384d780102eSjmmv // NO_CHECK_STYLE_END
385d780102eSjmmv
386d780102eSjmmv do_parser_test< atffile_reader >(input, exp_calls, exp_errors);
387d780102eSjmmv }
388d780102eSjmmv
389d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(atffile_52);
ATF_TEST_CASE_BODY(atffile_52)390d780102eSjmmv ATF_TEST_CASE_BODY(atffile_52)
391d780102eSjmmv {
392d780102eSjmmv const char* input =
393d780102eSjmmv "Content-Type: application/X-atf-atffile; version=\"1\"\n"
394d780102eSjmmv "\n"
395d780102eSjmmv "conf\n"
396d780102eSjmmv "conf:\n"
397d780102eSjmmv "conf: foo =\n"
398d780102eSjmmv "conf: bar = # A comment.\n"
399d780102eSjmmv "\n"
400d780102eSjmmv "prop\n"
401d780102eSjmmv "prop:\n"
402d780102eSjmmv "prop: foo =\n"
403d780102eSjmmv "prop: bar = # A comment.\n"
404d780102eSjmmv "\n"
405d780102eSjmmv "tp\n"
406d780102eSjmmv "tp:\n"
407d780102eSjmmv "tp: # A comment.\n"
408d780102eSjmmv "\n"
409d780102eSjmmv "tp-glob\n"
410d780102eSjmmv "tp-glob:\n"
411d780102eSjmmv "tp-glob: # A comment.\n"
412d780102eSjmmv ;
413d780102eSjmmv
414d780102eSjmmv const char* exp_calls[] = {
415d780102eSjmmv NULL
416d780102eSjmmv };
417d780102eSjmmv
418d780102eSjmmv const char* exp_errors[] = {
419d780102eSjmmv "3: Unexpected token `<<NEWLINE>>'; expected `:'",
420d780102eSjmmv "4: Unexpected token `<<NEWLINE>>'; expected variable name",
421d780102eSjmmv "5: Unexpected token `<<NEWLINE>>'; expected word or quoted string",
422d780102eSjmmv "6: Unexpected token `#'; expected word or quoted string",
423d780102eSjmmv "8: Unexpected token `<<NEWLINE>>'; expected `:'",
424d780102eSjmmv "9: Unexpected token `<<NEWLINE>>'; expected property name",
425d780102eSjmmv "10: Unexpected token `<<NEWLINE>>'; expected word or quoted string",
426d780102eSjmmv "11: Unexpected token `#'; expected word or quoted string",
427d780102eSjmmv "13: Unexpected token `<<NEWLINE>>'; expected `:'",
428d780102eSjmmv "14: Unexpected token `<<NEWLINE>>'; expected word or quoted string",
429d780102eSjmmv "15: Unexpected token `#'; expected word or quoted string",
430d780102eSjmmv "17: Unexpected token `<<NEWLINE>>'; expected `:'",
431d780102eSjmmv "18: Unexpected token `<<NEWLINE>>'; expected word or quoted string",
432d780102eSjmmv "19: Unexpected token `#'; expected word or quoted string",
433d780102eSjmmv NULL
434d780102eSjmmv };
435d780102eSjmmv
436d780102eSjmmv do_parser_test< atffile_reader >(input, exp_calls, exp_errors);
437d780102eSjmmv }
438d780102eSjmmv
439d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(atffile_53);
ATF_TEST_CASE_BODY(atffile_53)440d780102eSjmmv ATF_TEST_CASE_BODY(atffile_53)
441d780102eSjmmv {
442d780102eSjmmv const char* input =
443d780102eSjmmv "Content-Type: application/X-atf-atffile; version=\"1\"\n"
444d780102eSjmmv "\n"
445d780102eSjmmv "prop: foo = \"Correct value\" # With comment.\n"
446d780102eSjmmv "\n"
447d780102eSjmmv "prop: bar = # A comment.\n"
448d780102eSjmmv "\n"
449d780102eSjmmv "prop: baz = \"Last variable\"\n"
450d780102eSjmmv "\n"
451d780102eSjmmv "# End of file.\n"
452d780102eSjmmv ;
453d780102eSjmmv
454d780102eSjmmv const char* exp_calls[] = {
455d780102eSjmmv "got_prop(foo, Correct value)",
456d780102eSjmmv NULL
457d780102eSjmmv };
458d780102eSjmmv
459d780102eSjmmv const char* exp_errors[] = {
460d780102eSjmmv "5: Unexpected token `#'; expected word or quoted string",
461d780102eSjmmv NULL
462d780102eSjmmv };
463d780102eSjmmv
464d780102eSjmmv do_parser_test< atffile_reader >(input, exp_calls, exp_errors);
465d780102eSjmmv }
466d780102eSjmmv
467d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(atffile_54);
ATF_TEST_CASE_BODY(atffile_54)468d780102eSjmmv ATF_TEST_CASE_BODY(atffile_54)
469d780102eSjmmv {
470d780102eSjmmv const char* input =
471d780102eSjmmv "Content-Type: application/X-atf-atffile; version=\"1\"\n"
472d780102eSjmmv "\n"
473d780102eSjmmv "prop: foo = \"\n"
474d780102eSjmmv "prop: bar = \"text\n"
475d780102eSjmmv "prop: baz = \"te\\\"xt\n"
476d780102eSjmmv "prop: last = \"\\\"\n"
477d780102eSjmmv ;
478d780102eSjmmv
479d780102eSjmmv const char* exp_calls[] = {
480d780102eSjmmv NULL
481d780102eSjmmv };
482d780102eSjmmv
483d780102eSjmmv const char* exp_errors[] = {
484d780102eSjmmv "3: Missing double quotes before end of line",
485d780102eSjmmv "4: Missing double quotes before end of line",
486d780102eSjmmv "5: Missing double quotes before end of line",
487d780102eSjmmv "6: Missing double quotes before end of line",
488d780102eSjmmv NULL
489d780102eSjmmv };
490d780102eSjmmv
491d780102eSjmmv do_parser_test< atffile_reader >(input, exp_calls, exp_errors);
492d780102eSjmmv }
493d780102eSjmmv
494d780102eSjmmv // ------------------------------------------------------------------------
495d780102eSjmmv // Tests cases for the "atffile" class.
496d780102eSjmmv // ------------------------------------------------------------------------
497d780102eSjmmv
498d780102eSjmmv ATF_TEST_CASE(atffile_getters);
ATF_TEST_CASE_HEAD(atffile_getters)499d780102eSjmmv ATF_TEST_CASE_HEAD(atffile_getters) {}
ATF_TEST_CASE_BODY(atffile_getters)500d780102eSjmmv ATF_TEST_CASE_BODY(atffile_getters) {
501d780102eSjmmv vars_map config_vars;
502d780102eSjmmv config_vars["config-var-1"] = "value 1";
503d780102eSjmmv
504d780102eSjmmv std::vector< std::string > test_program_names;
505d780102eSjmmv test_program_names.push_back("test-program-1");
506d780102eSjmmv
507d780102eSjmmv vars_map properties;
508d780102eSjmmv properties["test-suite"] = "a test name";
509d780102eSjmmv
510d780102eSjmmv const tools::atffile atffile(config_vars, test_program_names, properties);
511d780102eSjmmv ATF_REQUIRE(config_vars == atffile.conf());
512d780102eSjmmv ATF_REQUIRE(test_program_names == atffile.tps());
513d780102eSjmmv ATF_REQUIRE(properties == atffile.props());
514d780102eSjmmv }
515d780102eSjmmv
516d780102eSjmmv // ------------------------------------------------------------------------
517d780102eSjmmv // Tests cases for the free functions.
518d780102eSjmmv // ------------------------------------------------------------------------
519d780102eSjmmv
520d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(read_ok_simple);
ATF_TEST_CASE_BODY(read_ok_simple)521d780102eSjmmv ATF_TEST_CASE_BODY(read_ok_simple) {
522*ee43138cSchristos std::unique_ptr< std::ofstream > os = new_atffile();
523d780102eSjmmv (*os) << "prop: test-suite = foo\n";
524d780102eSjmmv (*os) << "tp: tp-1\n";
525d780102eSjmmv (*os) << "conf: var1 = value1\n";
526d780102eSjmmv (*os) << "tp: tp-2\n";
527d780102eSjmmv (*os) << "tp: tp-3\n";
528d780102eSjmmv (*os) << "prop: prop1 = propvalue1\n";
529d780102eSjmmv (*os) << "conf: var2 = value2\n";
530d780102eSjmmv (*os).close();
531d780102eSjmmv
532d780102eSjmmv touch_exec("tp-1");
533d780102eSjmmv touch_exec("tp-2");
534d780102eSjmmv touch_exec("tp-3");
535d780102eSjmmv
536d780102eSjmmv const tools::atffile atffile = tools::read_atffile(
537d780102eSjmmv tools::fs::path("Atffile"));
538d780102eSjmmv ATF_REQUIRE_EQ(2, atffile.conf().size());
539d780102eSjmmv ATF_REQUIRE_EQ("value1", atffile.conf().find("var1")->second);
540d780102eSjmmv ATF_REQUIRE_EQ("value2", atffile.conf().find("var2")->second);
541d780102eSjmmv ATF_REQUIRE_EQ(3, atffile.tps().size());
542d780102eSjmmv ATF_REQUIRE(is_in("tp-1", atffile.tps()));
543d780102eSjmmv ATF_REQUIRE(is_in("tp-2", atffile.tps()));
544d780102eSjmmv ATF_REQUIRE(is_in("tp-3", atffile.tps()));
545d780102eSjmmv ATF_REQUIRE_EQ(2, atffile.props().size());
546d780102eSjmmv ATF_REQUIRE_EQ("foo", atffile.props().find("test-suite")->second);
547d780102eSjmmv ATF_REQUIRE_EQ("propvalue1", atffile.props().find("prop1")->second);
548d780102eSjmmv }
549d780102eSjmmv
550d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(read_ok_some_globs);
ATF_TEST_CASE_BODY(read_ok_some_globs)551d780102eSjmmv ATF_TEST_CASE_BODY(read_ok_some_globs) {
552*ee43138cSchristos std::unique_ptr< std::ofstream > os = new_atffile();
553d780102eSjmmv (*os) << "prop: test-suite = foo\n";
554d780102eSjmmv (*os) << "tp: foo\n";
555d780102eSjmmv (*os) << "tp-glob: *K*\n";
556d780102eSjmmv (*os) << "tp: bar\n";
557d780102eSjmmv (*os) << "tp-glob: t_*\n";
558d780102eSjmmv (*os).close();
559d780102eSjmmv
560d780102eSjmmv touch_exec("foo");
561d780102eSjmmv touch_exec("bar");
562d780102eSjmmv touch_exec("aK");
563d780102eSjmmv touch_exec("KKKKK");
564d780102eSjmmv touch_exec("t_hello");
565d780102eSjmmv touch_exec("zzzt_hello");
566d780102eSjmmv
567d780102eSjmmv const tools::atffile atffile = tools::read_atffile(
568d780102eSjmmv tools::fs::path("Atffile"));
569d780102eSjmmv ATF_REQUIRE_EQ(5, atffile.tps().size());
570d780102eSjmmv ATF_REQUIRE(is_in("foo", atffile.tps()));
571d780102eSjmmv ATF_REQUIRE(is_in("bar", atffile.tps()));
572d780102eSjmmv ATF_REQUIRE(is_in("aK", atffile.tps()));
573d780102eSjmmv ATF_REQUIRE(is_in("KKKKK", atffile.tps()));
574d780102eSjmmv ATF_REQUIRE(is_in("t_hello", atffile.tps()));
575d780102eSjmmv }
576d780102eSjmmv
577d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(read_missing_test_suite);
ATF_TEST_CASE_BODY(read_missing_test_suite)578d780102eSjmmv ATF_TEST_CASE_BODY(read_missing_test_suite) {
579*ee43138cSchristos std::unique_ptr< std::ofstream > os = new_atffile();
580d780102eSjmmv (*os).close();
581d780102eSjmmv
582d780102eSjmmv try {
583d780102eSjmmv (void)tools::read_atffile(tools::fs::path("Atffile"));
584d780102eSjmmv ATF_FAIL("Missing property 'test-suite' did not raise an error");
585d780102eSjmmv } catch (const tools::not_found_error< std::string >& e) {
586d780102eSjmmv ATF_REQUIRE_EQ("test-suite", e.get_value());
587d780102eSjmmv }
588d780102eSjmmv }
589d780102eSjmmv
590d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(read_missing_test_program);
ATF_TEST_CASE_BODY(read_missing_test_program)591d780102eSjmmv ATF_TEST_CASE_BODY(read_missing_test_program) {
592*ee43138cSchristos std::unique_ptr< std::ofstream > os = new_atffile();
593d780102eSjmmv (*os) << "tp: foo\n";
594d780102eSjmmv (*os) << "tp: bar\n";
595d780102eSjmmv (*os) << "tp: baz\n";
596d780102eSjmmv (*os).close();
597d780102eSjmmv
598d780102eSjmmv touch_exec("foo");
599d780102eSjmmv touch_exec("baz");
600d780102eSjmmv
601d780102eSjmmv try {
602d780102eSjmmv (void)tools::read_atffile(tools::fs::path("Atffile"));
603d780102eSjmmv ATF_FAIL("Missing file 'bar' did not raise an error");
604d780102eSjmmv } catch (const tools::not_found_error< tools::fs::path >& e) {
605d780102eSjmmv ATF_REQUIRE_EQ("bar", e.get_value().str());
606d780102eSjmmv }
607d780102eSjmmv }
608d780102eSjmmv
609d780102eSjmmv // ------------------------------------------------------------------------
610d780102eSjmmv // Main.
611d780102eSjmmv // ------------------------------------------------------------------------
612d780102eSjmmv
ATF_INIT_TEST_CASES(tcs)613d780102eSjmmv ATF_INIT_TEST_CASES(tcs)
614d780102eSjmmv {
615d780102eSjmmv // Add the test cases for the parser class.
616d780102eSjmmv ATF_ADD_TEST_CASE(tcs, atffile_1);
617d780102eSjmmv ATF_ADD_TEST_CASE(tcs, atffile_2);
618d780102eSjmmv ATF_ADD_TEST_CASE(tcs, atffile_3);
619d780102eSjmmv ATF_ADD_TEST_CASE(tcs, atffile_4);
620d780102eSjmmv ATF_ADD_TEST_CASE(tcs, atffile_5);
621d780102eSjmmv ATF_ADD_TEST_CASE(tcs, atffile_6);
622d780102eSjmmv ATF_ADD_TEST_CASE(tcs, atffile_50);
623d780102eSjmmv ATF_ADD_TEST_CASE(tcs, atffile_51);
624d780102eSjmmv ATF_ADD_TEST_CASE(tcs, atffile_52);
625d780102eSjmmv ATF_ADD_TEST_CASE(tcs, atffile_53);
626d780102eSjmmv ATF_ADD_TEST_CASE(tcs, atffile_54);
627d780102eSjmmv
628d780102eSjmmv // Add the test cases for the atffile class.
629d780102eSjmmv ATF_ADD_TEST_CASE(tcs, atffile_getters);
630d780102eSjmmv
631d780102eSjmmv // Add the test cases for the free functions.
632d780102eSjmmv ATF_ADD_TEST_CASE(tcs, read_ok_simple);
633d780102eSjmmv ATF_ADD_TEST_CASE(tcs, read_ok_some_globs);
634d780102eSjmmv ATF_ADD_TEST_CASE(tcs, read_missing_test_suite);
635d780102eSjmmv ATF_ADD_TEST_CASE(tcs, read_missing_test_program);
636d780102eSjmmv }
637