1203955Srdivacky// Copyright 2010 The Kyua Authors.
2193326Sed// All rights reserved.
3193326Sed//
4193326Sed// Redistribution and use in source and binary forms, with or without
5193326Sed// modification, are permitted provided that the following conditions are
6193326Sed// met:
7193326Sed//
8193326Sed// * Redistributions of source code must retain the above copyright
9193326Sed//   notice, this list of conditions and the following disclaimer.
10193326Sed// * Redistributions in binary form must reproduce the above copyright
11193326Sed//   notice, this list of conditions and the following disclaimer in the
12193326Sed//   documentation and/or other materials provided with the distribution.
13193326Sed// * Neither the name of Google Inc. nor the names of its contributors
14193326Sed//   may be used to endorse or promote products derived from this software
15193326Sed//   without specific prior written permission.
16198092Srdivacky//
17193326Sed// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18221345Sdim// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19234353Sdim// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20193326Sed// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21193326Sed// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22193326Sed// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23193326Sed// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24193326Sed// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25193326Sed// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26203955Srdivacky// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27226633Sdim// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28203955Srdivacky
29203955Srdivacky#include "cli/cmd_about.hpp"
30203955Srdivacky
31203955Srdivacky#if defined(HAVE_CONFIG_H)
32203955Srdivacky#   include "config.h"
33203955Srdivacky#endif
34226633Sdim
35226633Sdim#include <cstdlib>
36224145Sdim
37226633Sdim#include <atf-c++.hpp>
38224145Sdim
39224145Sdim#include "cli/common.ipp"
40224145Sdim#include "engine/config.hpp"
41224145Sdim#include "utils/cmdline/exceptions.hpp"
42224145Sdim#include "utils/cmdline/parser.hpp"
43226633Sdim#include "utils/cmdline/ui_mock.hpp"
44224145Sdim#include "utils/config/tree.ipp"
45226633Sdim#include "utils/env.hpp"
46224145Sdim#include "utils/fs/operations.hpp"
47234353Sdim#include "utils/fs/path.hpp"
48193326Sed
49193326Sednamespace cmdline = utils::cmdline;
50193326Sednamespace fs = utils::fs;
51
52using cli::cmd_about;
53
54
55ATF_TEST_CASE_WITHOUT_HEAD(all_topics__ok);
56ATF_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
104ATF_TEST_CASE_WITHOUT_HEAD(all_topics__missing_docs);
105ATF_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
129ATF_TEST_CASE_WITHOUT_HEAD(topic_authors__ok);
130ATF_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
174ATF_TEST_CASE_WITHOUT_HEAD(topic_authors__missing_doc);
175ATF_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
197ATF_TEST_CASE_WITHOUT_HEAD(topic_license__ok);
198ATF_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
221ATF_TEST_CASE_WITHOUT_HEAD(topic_license__missing_doc);
222ATF_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
244ATF_TEST_CASE_WITHOUT_HEAD(topic_version__ok);
245ATF_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
262ATF_TEST_CASE_WITHOUT_HEAD(invalid_args);
263ATF_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
279ATF_TEST_CASE_WITHOUT_HEAD(invalid_topic);
280ATF_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
295ATF_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