1c243e490SMarcel Moolenaar // Copyright (c) 2007 The NetBSD Foundation, Inc.
2c243e490SMarcel Moolenaar // All rights reserved.
3c243e490SMarcel Moolenaar //
4c243e490SMarcel Moolenaar // Redistribution and use in source and binary forms, with or without
5c243e490SMarcel Moolenaar // modification, are permitted provided that the following conditions
6c243e490SMarcel Moolenaar // are met:
7c243e490SMarcel Moolenaar // 1. Redistributions of source code must retain the above copyright
8c243e490SMarcel Moolenaar // notice, this list of conditions and the following disclaimer.
9c243e490SMarcel Moolenaar // 2. Redistributions in binary form must reproduce the above copyright
10c243e490SMarcel Moolenaar // notice, this list of conditions and the following disclaimer in the
11c243e490SMarcel Moolenaar // documentation and/or other materials provided with the distribution.
12c243e490SMarcel Moolenaar //
13c243e490SMarcel Moolenaar // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
14c243e490SMarcel Moolenaar // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
15c243e490SMarcel Moolenaar // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
16c243e490SMarcel Moolenaar // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17c243e490SMarcel Moolenaar // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
18c243e490SMarcel Moolenaar // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19c243e490SMarcel Moolenaar // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
20c243e490SMarcel Moolenaar // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21c243e490SMarcel Moolenaar // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
22c243e490SMarcel Moolenaar // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23c243e490SMarcel Moolenaar // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
24c243e490SMarcel Moolenaar // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25*0677dfd1SJulio Merino
26*0677dfd1SJulio Merino #include "atf-c++/tests.hpp"
27c243e490SMarcel Moolenaar
28c243e490SMarcel Moolenaar extern "C" {
29c243e490SMarcel Moolenaar #include <sys/types.h>
30c243e490SMarcel Moolenaar #include <sys/stat.h>
31c243e490SMarcel Moolenaar
32c243e490SMarcel Moolenaar #include <fcntl.h>
33c243e490SMarcel Moolenaar #include <unistd.h>
34c243e490SMarcel Moolenaar }
35c243e490SMarcel Moolenaar
36c243e490SMarcel Moolenaar #include <fstream>
37*0677dfd1SJulio Merino #include <iostream>
38c243e490SMarcel Moolenaar #include <sstream>
39c243e490SMarcel Moolenaar
40*0677dfd1SJulio Merino #include <atf-c++.hpp>
41c243e490SMarcel Moolenaar
42*0677dfd1SJulio Merino #include "atf-c++/detail/text.hpp"
43c243e490SMarcel Moolenaar
44c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
45c243e490SMarcel Moolenaar // Tests for the "atf_tp_writer" class.
46c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
47c243e490SMarcel Moolenaar
48c243e490SMarcel Moolenaar static
49c243e490SMarcel Moolenaar void
print_indented(const std::string & str)50c243e490SMarcel Moolenaar print_indented(const std::string& str)
51c243e490SMarcel Moolenaar {
52c243e490SMarcel Moolenaar std::vector< std::string > ws = atf::text::split(str, "\n");
53c243e490SMarcel Moolenaar for (std::vector< std::string >::const_iterator iter = ws.begin();
54c243e490SMarcel Moolenaar iter != ws.end(); iter++)
55c243e490SMarcel Moolenaar std::cout << ">>" << *iter << "<<\n";
56c243e490SMarcel Moolenaar }
57c243e490SMarcel Moolenaar
58c243e490SMarcel Moolenaar // XXX Should this string handling and verbosity level be part of the
59c243e490SMarcel Moolenaar // ATF_REQUIRE_EQ macro? It may be hard to predict sometimes that a
60c243e490SMarcel Moolenaar // string can have newlines in it, and so the error message generated
61c243e490SMarcel Moolenaar // at the moment will be bogus if there are some.
62c243e490SMarcel Moolenaar static
63c243e490SMarcel Moolenaar void
check_equal(const atf::tests::tc & tc,const std::string & str,const std::string & exp)64c243e490SMarcel Moolenaar check_equal(const atf::tests::tc& tc, const std::string& str,
65c243e490SMarcel Moolenaar const std::string& exp)
66c243e490SMarcel Moolenaar {
67c243e490SMarcel Moolenaar if (str != exp) {
68c243e490SMarcel Moolenaar std::cout << "String equality check failed.\n"
69c243e490SMarcel Moolenaar "Adding >> and << to delimit the string boundaries below.\n";
70c243e490SMarcel Moolenaar std::cout << "GOT:\n";
71c243e490SMarcel Moolenaar print_indented(str);
72c243e490SMarcel Moolenaar std::cout << "EXPECTED:\n";
73c243e490SMarcel Moolenaar print_indented(exp);
74c243e490SMarcel Moolenaar tc.fail("Constructed string differs from the expected one");
75c243e490SMarcel Moolenaar }
76c243e490SMarcel Moolenaar }
77c243e490SMarcel Moolenaar
78c243e490SMarcel Moolenaar ATF_TEST_CASE(atf_tp_writer);
ATF_TEST_CASE_HEAD(atf_tp_writer)79c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(atf_tp_writer)
80c243e490SMarcel Moolenaar {
81c243e490SMarcel Moolenaar set_md_var("descr", "Verifies the application/X-atf-tp writer");
82c243e490SMarcel Moolenaar }
ATF_TEST_CASE_BODY(atf_tp_writer)83c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(atf_tp_writer)
84c243e490SMarcel Moolenaar {
85c243e490SMarcel Moolenaar std::ostringstream expss;
86c243e490SMarcel Moolenaar std::ostringstream ss;
87c243e490SMarcel Moolenaar
88c243e490SMarcel Moolenaar #define RESET \
89c243e490SMarcel Moolenaar expss.str(""); \
90c243e490SMarcel Moolenaar ss.str("")
91c243e490SMarcel Moolenaar
92c243e490SMarcel Moolenaar #define CHECK \
93c243e490SMarcel Moolenaar check_equal(*this, ss.str(), expss.str())
94c243e490SMarcel Moolenaar
95c243e490SMarcel Moolenaar {
96c243e490SMarcel Moolenaar RESET;
97c243e490SMarcel Moolenaar
98c243e490SMarcel Moolenaar atf::tests::detail::atf_tp_writer w(ss);
99c243e490SMarcel Moolenaar expss << "Content-Type: application/X-atf-tp; version=\"1\"\n\n";
100c243e490SMarcel Moolenaar CHECK;
101c243e490SMarcel Moolenaar }
102c243e490SMarcel Moolenaar
103c243e490SMarcel Moolenaar {
104c243e490SMarcel Moolenaar RESET;
105c243e490SMarcel Moolenaar
106c243e490SMarcel Moolenaar atf::tests::detail::atf_tp_writer w(ss);
107c243e490SMarcel Moolenaar expss << "Content-Type: application/X-atf-tp; version=\"1\"\n\n";
108c243e490SMarcel Moolenaar CHECK;
109c243e490SMarcel Moolenaar
110c243e490SMarcel Moolenaar w.start_tc("test1");
111c243e490SMarcel Moolenaar expss << "ident: test1\n";
112c243e490SMarcel Moolenaar CHECK;
113c243e490SMarcel Moolenaar
114c243e490SMarcel Moolenaar w.end_tc();
115c243e490SMarcel Moolenaar CHECK;
116c243e490SMarcel Moolenaar }
117c243e490SMarcel Moolenaar
118c243e490SMarcel Moolenaar {
119c243e490SMarcel Moolenaar RESET;
120c243e490SMarcel Moolenaar
121c243e490SMarcel Moolenaar atf::tests::detail::atf_tp_writer w(ss);
122c243e490SMarcel Moolenaar expss << "Content-Type: application/X-atf-tp; version=\"1\"\n\n";
123c243e490SMarcel Moolenaar CHECK;
124c243e490SMarcel Moolenaar
125c243e490SMarcel Moolenaar w.start_tc("test1");
126c243e490SMarcel Moolenaar expss << "ident: test1\n";
127c243e490SMarcel Moolenaar CHECK;
128c243e490SMarcel Moolenaar
129c243e490SMarcel Moolenaar w.end_tc();
130c243e490SMarcel Moolenaar CHECK;
131c243e490SMarcel Moolenaar
132c243e490SMarcel Moolenaar w.start_tc("test2");
133c243e490SMarcel Moolenaar expss << "\nident: test2\n";
134c243e490SMarcel Moolenaar CHECK;
135c243e490SMarcel Moolenaar
136c243e490SMarcel Moolenaar w.end_tc();
137c243e490SMarcel Moolenaar CHECK;
138c243e490SMarcel Moolenaar }
139c243e490SMarcel Moolenaar
140c243e490SMarcel Moolenaar {
141c243e490SMarcel Moolenaar RESET;
142c243e490SMarcel Moolenaar
143c243e490SMarcel Moolenaar atf::tests::detail::atf_tp_writer w(ss);
144c243e490SMarcel Moolenaar expss << "Content-Type: application/X-atf-tp; version=\"1\"\n\n";
145c243e490SMarcel Moolenaar CHECK;
146c243e490SMarcel Moolenaar
147c243e490SMarcel Moolenaar w.start_tc("test1");
148c243e490SMarcel Moolenaar expss << "ident: test1\n";
149c243e490SMarcel Moolenaar CHECK;
150c243e490SMarcel Moolenaar
151c243e490SMarcel Moolenaar w.tc_meta_data("descr", "the description");
152c243e490SMarcel Moolenaar expss << "descr: the description\n";
153c243e490SMarcel Moolenaar CHECK;
154c243e490SMarcel Moolenaar
155c243e490SMarcel Moolenaar w.end_tc();
156c243e490SMarcel Moolenaar CHECK;
157c243e490SMarcel Moolenaar
158c243e490SMarcel Moolenaar w.start_tc("test2");
159c243e490SMarcel Moolenaar expss << "\nident: test2\n";
160c243e490SMarcel Moolenaar CHECK;
161c243e490SMarcel Moolenaar
162c243e490SMarcel Moolenaar w.tc_meta_data("descr", "second test case");
163c243e490SMarcel Moolenaar expss << "descr: second test case\n";
164c243e490SMarcel Moolenaar CHECK;
165c243e490SMarcel Moolenaar
166c243e490SMarcel Moolenaar w.tc_meta_data("require.progs", "/bin/cp");
167c243e490SMarcel Moolenaar expss << "require.progs: /bin/cp\n";
168c243e490SMarcel Moolenaar CHECK;
169c243e490SMarcel Moolenaar
170c243e490SMarcel Moolenaar w.tc_meta_data("X-custom", "foo bar baz");
171c243e490SMarcel Moolenaar expss << "X-custom: foo bar baz\n";
172c243e490SMarcel Moolenaar CHECK;
173c243e490SMarcel Moolenaar
174c243e490SMarcel Moolenaar w.end_tc();
175c243e490SMarcel Moolenaar CHECK;
176c243e490SMarcel Moolenaar }
177c243e490SMarcel Moolenaar
178c243e490SMarcel Moolenaar #undef CHECK
179c243e490SMarcel Moolenaar #undef RESET
180c243e490SMarcel Moolenaar }
181c243e490SMarcel Moolenaar
182c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
183c243e490SMarcel Moolenaar // Main.
184c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
185c243e490SMarcel Moolenaar
ATF_INIT_TEST_CASES(tcs)186c243e490SMarcel Moolenaar ATF_INIT_TEST_CASES(tcs)
187c243e490SMarcel Moolenaar {
188c243e490SMarcel Moolenaar // Add tests for the "atf_tp_writer" class.
189c243e490SMarcel Moolenaar ATF_ADD_TEST_CASE(tcs, atf_tp_writer);
190c243e490SMarcel Moolenaar }
191