1 // Copyright 2010 The Kyua Authors.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above copyright
11 // notice, this list of conditions and the following disclaimer in the
12 // documentation and/or other materials provided with the distribution.
13 // * Neither the name of Google Inc. nor the names of its contributors
14 // may be used to endorse or promote products derived from this software
15 // without specific prior written permission.
16 //
17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29 #include "cli/cmd_about.hpp"
30
31 #if defined(HAVE_CONFIG_H)
32 # include "config.h"
33 #endif
34
35 #include <cstdlib>
36
37 #include <atf-c++.hpp>
38
39 #include "cli/common.ipp"
40 #include "engine/config.hpp"
41 #include "utils/cmdline/exceptions.hpp"
42 #include "utils/cmdline/parser.hpp"
43 #include "utils/cmdline/ui_mock.hpp"
44 #include "utils/config/tree.ipp"
45 #include "utils/env.hpp"
46 #include "utils/fs/operations.hpp"
47 #include "utils/fs/path.hpp"
48
49 namespace cmdline = utils::cmdline;
50 namespace fs = utils::fs;
51
52 using cli::cmd_about;
53
54
55 ATF_TEST_CASE_WITHOUT_HEAD(all_topics__ok);
ATF_TEST_CASE_BODY(all_topics__ok)56 ATF_TEST_CASE_BODY(all_topics__ok)
57 {
58 cmdline::args_vector args;
59 args.push_back("about");
60
61 fs::mkdir(fs::path("fake-docs"), 0755);
62 atf::utils::create_file("fake-docs/AUTHORS",
63 "Content of AUTHORS\n"
64 "* First author\n"
65 " * garbage\n"
66 "* Second author\n");
67 atf::utils::create_file("fake-docs/CONTRIBUTORS",
68 "Content of CONTRIBUTORS\n"
69 "* First contributor\n"
70 " * garbage\n"
71 "* Second contributor\n");
72 atf::utils::create_file("fake-docs/LICENSE", "Content of LICENSE\n");
73
74 utils::setenv("KYUA_DOCDIR", "fake-docs");
75 cmd_about cmd;
76 cmdline::ui_mock ui;
77 ATF_REQUIRE_EQ(EXIT_SUCCESS, cmd.main(&ui, args, engine::default_config()));
78
79 ATF_REQUIRE(atf::utils::grep_string(PACKAGE_NAME, ui.out_log()[0]));
80 ATF_REQUIRE(atf::utils::grep_string(PACKAGE_VERSION, ui.out_log()[0]));
81
82 ATF_REQUIRE(!atf::utils::grep_collection("Content of AUTHORS",
83 ui.out_log()));
84 ATF_REQUIRE(atf::utils::grep_collection("\\* First author", ui.out_log()));
85 ATF_REQUIRE(!atf::utils::grep_collection("garbage", ui.out_log()));
86 ATF_REQUIRE(atf::utils::grep_collection("\\* Second author", ui.out_log()));
87
88 ATF_REQUIRE(!atf::utils::grep_collection("Content of CONTRIBUTORS",
89 ui.out_log()));
90 ATF_REQUIRE(atf::utils::grep_collection("\\* First contributor",
91 ui.out_log()));
92 ATF_REQUIRE(!atf::utils::grep_collection("garbage", ui.out_log()));
93 ATF_REQUIRE(atf::utils::grep_collection("\\* Second contributor",
94 ui.out_log()));
95
96 ATF_REQUIRE(atf::utils::grep_collection("Content of LICENSE",
97 ui.out_log()));
98
99 ATF_REQUIRE(atf::utils::grep_collection("Homepage", ui.out_log()));
100 ATF_REQUIRE(ui.err_log().empty());
101 }
102
103
104 ATF_TEST_CASE_WITHOUT_HEAD(all_topics__missing_docs);
ATF_TEST_CASE_BODY(all_topics__missing_docs)105 ATF_TEST_CASE_BODY(all_topics__missing_docs)
106 {
107 cmdline::args_vector args;
108 args.push_back("about");
109
110 utils::setenv("KYUA_DOCDIR", "fake-docs");
111 cmd_about cmd;
112 cmdline::ui_mock ui;
113 ATF_REQUIRE_EQ(EXIT_FAILURE, cmd.main(&ui, args, engine::default_config()));
114
115 ATF_REQUIRE(atf::utils::grep_string(PACKAGE_NAME, ui.out_log()[0]));
116 ATF_REQUIRE(atf::utils::grep_string(PACKAGE_VERSION, ui.out_log()[0]));
117
118 ATF_REQUIRE(atf::utils::grep_collection("Homepage", ui.out_log()));
119
120 ATF_REQUIRE(atf::utils::grep_collection("Failed to open.*AUTHORS",
121 ui.err_log()));
122 ATF_REQUIRE(atf::utils::grep_collection("Failed to open.*CONTRIBUTORS",
123 ui.err_log()));
124 ATF_REQUIRE(atf::utils::grep_collection("Failed to open.*LICENSE",
125 ui.err_log()));
126 }
127
128
129 ATF_TEST_CASE_WITHOUT_HEAD(topic_authors__ok);
ATF_TEST_CASE_BODY(topic_authors__ok)130 ATF_TEST_CASE_BODY(topic_authors__ok)
131 {
132 cmdline::args_vector args;
133 args.push_back("about");
134 args.push_back("authors");
135
136 fs::mkdir(fs::path("fake-docs"), 0755);
137 atf::utils::create_file("fake-docs/AUTHORS",
138 "Content of AUTHORS\n"
139 "* First author\n"
140 " * garbage\n"
141 "* Second author\n");
142 atf::utils::create_file("fake-docs/CONTRIBUTORS",
143 "Content of CONTRIBUTORS\n"
144 "* First contributor\n"
145 " * garbage\n"
146 "* Second contributor\n");
147
148 utils::setenv("KYUA_DOCDIR", "fake-docs");
149 cmd_about cmd;
150 cmdline::ui_mock ui;
151 ATF_REQUIRE_EQ(EXIT_SUCCESS, cmd.main(&ui, args, engine::default_config()));
152 ATF_REQUIRE(!atf::utils::grep_string(PACKAGE_NAME, ui.out_log()[0]));
153
154 ATF_REQUIRE(!atf::utils::grep_collection("Content of AUTHORS",
155 ui.out_log()));
156 ATF_REQUIRE(atf::utils::grep_collection("\\* First author", ui.out_log()));
157 ATF_REQUIRE(!atf::utils::grep_collection("garbage", ui.out_log()));
158 ATF_REQUIRE(atf::utils::grep_collection("\\* Second author", ui.out_log()));
159
160 ATF_REQUIRE(!atf::utils::grep_collection("Content of CONTRIBUTORS",
161 ui.out_log()));
162 ATF_REQUIRE(atf::utils::grep_collection("\\* First contributor",
163 ui.out_log()));
164 ATF_REQUIRE(!atf::utils::grep_collection("garbage", ui.out_log()));
165 ATF_REQUIRE(atf::utils::grep_collection("\\* Second contributor",
166 ui.out_log()));
167
168 ATF_REQUIRE(!atf::utils::grep_collection("LICENSE", ui.out_log()));
169 ATF_REQUIRE(!atf::utils::grep_collection("Homepage", ui.out_log()));
170 ATF_REQUIRE(ui.err_log().empty());
171 }
172
173
174 ATF_TEST_CASE_WITHOUT_HEAD(topic_authors__missing_doc);
ATF_TEST_CASE_BODY(topic_authors__missing_doc)175 ATF_TEST_CASE_BODY(topic_authors__missing_doc)
176 {
177 cmdline::args_vector args;
178 args.push_back("about");
179 args.push_back("authors");
180
181 utils::setenv("KYUA_DOCDIR", "fake-docs");
182 cmd_about cmd;
183 cmdline::ui_mock ui;
184 ATF_REQUIRE_EQ(EXIT_FAILURE, cmd.main(&ui, args, engine::default_config()));
185
186 ATF_REQUIRE_EQ(0, ui.out_log().size());
187
188 ATF_REQUIRE(atf::utils::grep_collection("Failed to open.*AUTHORS",
189 ui.err_log()));
190 ATF_REQUIRE(atf::utils::grep_collection("Failed to open.*CONTRIBUTORS",
191 ui.err_log()));
192 ATF_REQUIRE(!atf::utils::grep_collection("Failed to open.*LICENSE",
193 ui.err_log()));
194 }
195
196
197 ATF_TEST_CASE_WITHOUT_HEAD(topic_license__ok);
ATF_TEST_CASE_BODY(topic_license__ok)198 ATF_TEST_CASE_BODY(topic_license__ok)
199 {
200 cmdline::args_vector args;
201 args.push_back("about");
202 args.push_back("license");
203
204 fs::mkdir(fs::path("fake-docs"), 0755);
205 atf::utils::create_file("fake-docs/LICENSE", "Content of LICENSE\n");
206
207 utils::setenv("KYUA_DOCDIR", "fake-docs");
208 cmd_about cmd;
209 cmdline::ui_mock ui;
210 ATF_REQUIRE_EQ(EXIT_SUCCESS, cmd.main(&ui, args, engine::default_config()));
211 ATF_REQUIRE(!atf::utils::grep_string(PACKAGE_NAME, ui.out_log()[0]));
212 ATF_REQUIRE(!atf::utils::grep_collection("AUTHORS", ui.out_log()));
213 ATF_REQUIRE(!atf::utils::grep_collection("CONTRIBUTORS", ui.out_log()));
214 ATF_REQUIRE(atf::utils::grep_collection("Content of LICENSE",
215 ui.out_log()));
216 ATF_REQUIRE(!atf::utils::grep_collection("Homepage", ui.out_log()));
217 ATF_REQUIRE(ui.err_log().empty());
218 }
219
220
221 ATF_TEST_CASE_WITHOUT_HEAD(topic_license__missing_doc);
ATF_TEST_CASE_BODY(topic_license__missing_doc)222 ATF_TEST_CASE_BODY(topic_license__missing_doc)
223 {
224 cmdline::args_vector args;
225 args.push_back("about");
226 args.push_back("license");
227
228 utils::setenv("KYUA_DOCDIR", "fake-docs");
229 cmd_about cmd;
230 cmdline::ui_mock ui;
231 ATF_REQUIRE_EQ(EXIT_FAILURE, cmd.main(&ui, args, engine::default_config()));
232
233 ATF_REQUIRE_EQ(0, ui.out_log().size());
234
235 ATF_REQUIRE(!atf::utils::grep_collection("Failed to open.*AUTHORS",
236 ui.err_log()));
237 ATF_REQUIRE(!atf::utils::grep_collection("Failed to open.*CONTRIBUTORS",
238 ui.err_log()));
239 ATF_REQUIRE(atf::utils::grep_collection("Failed to open.*LICENSE",
240 ui.err_log()));
241 }
242
243
244 ATF_TEST_CASE_WITHOUT_HEAD(topic_version__ok);
ATF_TEST_CASE_BODY(topic_version__ok)245 ATF_TEST_CASE_BODY(topic_version__ok)
246 {
247 cmdline::args_vector args;
248 args.push_back("about");
249 args.push_back("version");
250
251 utils::setenv("KYUA_DOCDIR", "fake-docs");
252 cmd_about cmd;
253 cmdline::ui_mock ui;
254 ATF_REQUIRE_EQ(EXIT_SUCCESS, cmd.main(&ui, args, engine::default_config()));
255 ATF_REQUIRE_EQ(1, ui.out_log().size());
256 ATF_REQUIRE(atf::utils::grep_string(PACKAGE_NAME, ui.out_log()[0]));
257 ATF_REQUIRE(atf::utils::grep_string(PACKAGE_VERSION, ui.out_log()[0]));
258 ATF_REQUIRE(ui.err_log().empty());
259 }
260
261
262 ATF_TEST_CASE_WITHOUT_HEAD(invalid_args);
ATF_TEST_CASE_BODY(invalid_args)263 ATF_TEST_CASE_BODY(invalid_args)
264 {
265 cmdline::args_vector args;
266 args.push_back("about");
267 args.push_back("first");
268 args.push_back("second");
269
270 cmd_about cmd;
271 cmdline::ui_mock ui;
272 ATF_REQUIRE_THROW_RE(cmdline::usage_error, "Too many arguments",
273 cmd.main(&ui, args, engine::default_config()));
274 ATF_REQUIRE(ui.out_log().empty());
275 ATF_REQUIRE(ui.err_log().empty());
276 }
277
278
279 ATF_TEST_CASE_WITHOUT_HEAD(invalid_topic);
ATF_TEST_CASE_BODY(invalid_topic)280 ATF_TEST_CASE_BODY(invalid_topic)
281 {
282 cmdline::args_vector args;
283 args.push_back("about");
284 args.push_back("foo");
285
286 cmd_about cmd;
287 cmdline::ui_mock ui;
288 ATF_REQUIRE_THROW_RE(cmdline::usage_error, "Invalid about topic 'foo'",
289 cmd.main(&ui, args, engine::default_config()));
290 ATF_REQUIRE(ui.out_log().empty());
291 ATF_REQUIRE(ui.err_log().empty());
292 }
293
294
ATF_INIT_TEST_CASES(tcs)295 ATF_INIT_TEST_CASES(tcs)
296 {
297 ATF_ADD_TEST_CASE(tcs, all_topics__ok);
298 ATF_ADD_TEST_CASE(tcs, all_topics__missing_docs);
299 ATF_ADD_TEST_CASE(tcs, topic_authors__ok);
300 ATF_ADD_TEST_CASE(tcs, topic_authors__missing_doc);
301 ATF_ADD_TEST_CASE(tcs, topic_license__ok);
302 ATF_ADD_TEST_CASE(tcs, topic_license__missing_doc);
303 ATF_ADD_TEST_CASE(tcs, topic_version__ok);
304 ATF_ADD_TEST_CASE(tcs, invalid_args);
305 ATF_ADD_TEST_CASE(tcs, invalid_topic);
306 }
307