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); 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); 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); 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); 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); 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); 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); 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); 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); 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 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