1 1.1 jmmv // Copyright 2012 Google Inc. 2 1.1 jmmv // All rights reserved. 3 1.1 jmmv // 4 1.1 jmmv // Redistribution and use in source and binary forms, with or without 5 1.1 jmmv // modification, are permitted provided that the following conditions are 6 1.1 jmmv // met: 7 1.1 jmmv // 8 1.1 jmmv // * Redistributions of source code must retain the above copyright 9 1.1 jmmv // notice, this list of conditions and the following disclaimer. 10 1.1 jmmv // * Redistributions in binary form must reproduce the above copyright 11 1.1 jmmv // notice, this list of conditions and the following disclaimer in the 12 1.1 jmmv // documentation and/or other materials provided with the distribution. 13 1.1 jmmv // * Neither the name of Google Inc. nor the names of its contributors 14 1.1 jmmv // may be used to endorse or promote products derived from this software 15 1.1 jmmv // without specific prior written permission. 16 1.1 jmmv // 17 1.1 jmmv // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 1.1 jmmv // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 1.1 jmmv // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 1.1 jmmv // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 1.1 jmmv // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 1.1 jmmv // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 1.1 jmmv // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 1.1 jmmv // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 1.1 jmmv // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 1.1 jmmv // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 1.1 jmmv // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 1.1 jmmv 29 1.1 jmmv #include "engine/metadata.hpp" 30 1.1 jmmv 31 1.1 jmmv #include <sstream> 32 1.1 jmmv 33 1.1 jmmv #include <atf-c++.hpp> 34 1.1 jmmv 35 1.1 jmmv #include "engine/config.hpp" 36 1.1 jmmv #include "utils/config/tree.ipp" 37 1.1 jmmv #include "utils/datetime.hpp" 38 1.1 jmmv #include "utils/env.hpp" 39 1.1 jmmv #include "utils/fs/operations.hpp" 40 1.1 jmmv #include "utils/fs/path.hpp" 41 1.1 jmmv #include "utils/memory.hpp" 42 1.1 jmmv #include "utils/passwd.hpp" 43 1.1 jmmv #include "utils/units.hpp" 44 1.1 jmmv 45 1.1 jmmv namespace config = utils::config; 46 1.1 jmmv namespace datetime = utils::datetime; 47 1.1 jmmv namespace fs = utils::fs; 48 1.1 jmmv namespace passwd = utils::passwd; 49 1.1 jmmv namespace units = utils::units; 50 1.1 jmmv 51 1.1 jmmv 52 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(defaults); 53 1.1 jmmv ATF_TEST_CASE_BODY(defaults) 54 1.1 jmmv { 55 1.1 jmmv const engine::metadata md = engine::metadata_builder().build(); 56 1.1 jmmv ATF_REQUIRE(md.allowed_architectures().empty()); 57 1.1 jmmv ATF_REQUIRE(md.allowed_platforms().empty()); 58 1.1 jmmv ATF_REQUIRE(md.allowed_platforms().empty()); 59 1.1 jmmv ATF_REQUIRE(md.custom().empty()); 60 1.1 jmmv ATF_REQUIRE(md.description().empty()); 61 1.1 jmmv ATF_REQUIRE(!md.has_cleanup()); 62 1.1 jmmv ATF_REQUIRE(md.required_configs().empty()); 63 1.1 jmmv ATF_REQUIRE(md.required_files().empty()); 64 1.1 jmmv ATF_REQUIRE_EQ(units::bytes(0), md.required_memory()); 65 1.1 jmmv ATF_REQUIRE(md.required_programs().empty()); 66 1.1 jmmv ATF_REQUIRE(md.required_user().empty()); 67 1.1 jmmv ATF_REQUIRE(engine::default_timeout == md.timeout()); 68 1.1 jmmv } 69 1.1 jmmv 70 1.1 jmmv 71 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(add); 72 1.1 jmmv ATF_TEST_CASE_BODY(add) 73 1.1 jmmv { 74 1.1 jmmv engine::strings_set architectures; 75 1.1 jmmv architectures.insert("1-architecture"); 76 1.1 jmmv architectures.insert("2-architecture"); 77 1.1 jmmv 78 1.1 jmmv engine::strings_set platforms; 79 1.1 jmmv platforms.insert("1-platform"); 80 1.1 jmmv platforms.insert("2-platform"); 81 1.1 jmmv 82 1.1 jmmv engine::properties_map custom; 83 1.1 jmmv custom["1-custom"] = "first"; 84 1.1 jmmv custom["2-custom"] = "second"; 85 1.1 jmmv 86 1.1 jmmv engine::strings_set configs; 87 1.1 jmmv configs.insert("1-config"); 88 1.1 jmmv configs.insert("2-config"); 89 1.1 jmmv 90 1.1 jmmv engine::paths_set files; 91 1.1 jmmv files.insert(fs::path("1-file")); 92 1.1 jmmv files.insert(fs::path("2-file")); 93 1.1 jmmv 94 1.1 jmmv engine::paths_set programs; 95 1.1 jmmv programs.insert(fs::path("1-program")); 96 1.1 jmmv programs.insert(fs::path("2-program")); 97 1.1 jmmv 98 1.1 jmmv const engine::metadata md = engine::metadata_builder() 99 1.1 jmmv .add_allowed_architecture("1-architecture") 100 1.1 jmmv .add_allowed_platform("1-platform") 101 1.1 jmmv .add_custom("1-custom", "first") 102 1.1 jmmv .add_custom("2-custom", "second") 103 1.1 jmmv .add_required_config("1-config") 104 1.1 jmmv .add_required_file(fs::path("1-file")) 105 1.1 jmmv .add_required_program(fs::path("1-program")) 106 1.1 jmmv .add_allowed_architecture("2-architecture") 107 1.1 jmmv .add_allowed_platform("2-platform") 108 1.1 jmmv .add_required_config("2-config") 109 1.1 jmmv .add_required_file(fs::path("2-file")) 110 1.1 jmmv .add_required_program(fs::path("2-program")) 111 1.1 jmmv .build(); 112 1.1 jmmv 113 1.1 jmmv ATF_REQUIRE(architectures == md.allowed_architectures()); 114 1.1 jmmv ATF_REQUIRE(platforms == md.allowed_platforms()); 115 1.1 jmmv ATF_REQUIRE(custom == md.custom()); 116 1.1 jmmv ATF_REQUIRE(configs == md.required_configs()); 117 1.1 jmmv ATF_REQUIRE(files == md.required_files()); 118 1.1 jmmv ATF_REQUIRE(programs == md.required_programs()); 119 1.1 jmmv } 120 1.1 jmmv 121 1.1 jmmv 122 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(copy); 123 1.1 jmmv ATF_TEST_CASE_BODY(copy) 124 1.1 jmmv { 125 1.1 jmmv const engine::metadata md1 = engine::metadata_builder() 126 1.1 jmmv .add_allowed_architecture("1-architecture") 127 1.1 jmmv .add_allowed_platform("1-platform") 128 1.1 jmmv .build(); 129 1.1 jmmv 130 1.1 jmmv const engine::metadata md2 = engine::metadata_builder(md1) 131 1.1 jmmv .add_allowed_architecture("2-architecture") 132 1.1 jmmv .build(); 133 1.1 jmmv 134 1.1 jmmv ATF_REQUIRE_EQ(1, md1.allowed_architectures().size()); 135 1.1 jmmv ATF_REQUIRE_EQ(2, md2.allowed_architectures().size()); 136 1.1 jmmv ATF_REQUIRE_EQ(1, md1.allowed_platforms().size()); 137 1.1 jmmv ATF_REQUIRE_EQ(1, md2.allowed_platforms().size()); 138 1.1 jmmv } 139 1.1 jmmv 140 1.1 jmmv 141 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(override_all_with_setters); 142 1.1 jmmv ATF_TEST_CASE_BODY(override_all_with_setters) 143 1.1 jmmv { 144 1.1 jmmv engine::strings_set architectures; 145 1.1 jmmv architectures.insert("the-architecture"); 146 1.1 jmmv 147 1.1 jmmv engine::strings_set platforms; 148 1.1 jmmv platforms.insert("the-platforms"); 149 1.1 jmmv 150 1.1 jmmv engine::properties_map custom; 151 1.1 jmmv custom["first"] = "hello"; 152 1.1 jmmv custom["second"] = "bye"; 153 1.1 jmmv 154 1.1 jmmv const std::string description = "Some long text"; 155 1.1 jmmv 156 1.1 jmmv engine::strings_set configs; 157 1.1 jmmv configs.insert("the-configs"); 158 1.1 jmmv 159 1.1 jmmv engine::paths_set files; 160 1.1 jmmv files.insert(fs::path("the-files")); 161 1.1 jmmv 162 1.1 jmmv const units::bytes memory(12345); 163 1.1 jmmv 164 1.1 jmmv engine::paths_set programs; 165 1.1 jmmv programs.insert(fs::path("the-programs")); 166 1.1 jmmv 167 1.1 jmmv const std::string user = "root"; 168 1.1 jmmv 169 1.1 jmmv const datetime::delta timeout(123, 0); 170 1.1 jmmv 171 1.1 jmmv const engine::metadata md = engine::metadata_builder() 172 1.1 jmmv .set_allowed_architectures(architectures) 173 1.1 jmmv .set_allowed_platforms(platforms) 174 1.1 jmmv .set_custom(custom) 175 1.1 jmmv .set_description(description) 176 1.1 jmmv .set_has_cleanup(true) 177 1.1 jmmv .set_required_configs(configs) 178 1.1 jmmv .set_required_files(files) 179 1.1 jmmv .set_required_memory(memory) 180 1.1 jmmv .set_required_programs(programs) 181 1.1 jmmv .set_required_user(user) 182 1.1 jmmv .set_timeout(timeout) 183 1.1 jmmv .build(); 184 1.1 jmmv 185 1.1 jmmv ATF_REQUIRE(architectures == md.allowed_architectures()); 186 1.1 jmmv ATF_REQUIRE(platforms == md.allowed_platforms()); 187 1.1 jmmv ATF_REQUIRE(custom == md.custom()); 188 1.1 jmmv ATF_REQUIRE_EQ(description, md.description()); 189 1.1 jmmv ATF_REQUIRE(md.has_cleanup()); 190 1.1 jmmv ATF_REQUIRE(configs == md.required_configs()); 191 1.1 jmmv ATF_REQUIRE(files == md.required_files()); 192 1.1 jmmv ATF_REQUIRE_EQ(memory, md.required_memory()); 193 1.1 jmmv ATF_REQUIRE(programs == md.required_programs()); 194 1.1 jmmv ATF_REQUIRE_EQ(user, md.required_user()); 195 1.1 jmmv ATF_REQUIRE(timeout == md.timeout()); 196 1.1 jmmv } 197 1.1 jmmv 198 1.1 jmmv 199 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(override_all_with_set_string); 200 1.1 jmmv ATF_TEST_CASE_BODY(override_all_with_set_string) 201 1.1 jmmv { 202 1.1 jmmv engine::strings_set architectures; 203 1.1 jmmv architectures.insert("a1"); 204 1.1 jmmv architectures.insert("a2"); 205 1.1 jmmv 206 1.1 jmmv engine::strings_set platforms; 207 1.1 jmmv platforms.insert("p1"); 208 1.1 jmmv platforms.insert("p2"); 209 1.1 jmmv 210 1.1 jmmv engine::properties_map custom; 211 1.1 jmmv custom["user-defined"] = "the-value"; 212 1.1 jmmv 213 1.1 jmmv const std::string description = "Another long text"; 214 1.1 jmmv 215 1.1 jmmv engine::strings_set configs; 216 1.1 jmmv configs.insert("config-var"); 217 1.1 jmmv 218 1.1 jmmv engine::paths_set files; 219 1.1 jmmv files.insert(fs::path("plain")); 220 1.1 jmmv files.insert(fs::path("/absolute/path")); 221 1.1 jmmv 222 1.1 jmmv const units::bytes memory(1024 * 1024); 223 1.1 jmmv 224 1.1 jmmv engine::paths_set programs; 225 1.1 jmmv programs.insert(fs::path("program")); 226 1.1 jmmv programs.insert(fs::path("/absolute/prog")); 227 1.1 jmmv 228 1.1 jmmv const std::string user = "unprivileged"; 229 1.1 jmmv 230 1.1 jmmv const datetime::delta timeout(45, 0); 231 1.1 jmmv 232 1.1 jmmv const engine::metadata md = engine::metadata_builder() 233 1.1 jmmv .set_string("allowed_architectures", "a1 a2") 234 1.1 jmmv .set_string("allowed_platforms", "p1 p2") 235 1.1 jmmv .set_string("custom.user-defined", "the-value") 236 1.1 jmmv .set_string("description", "Another long text") 237 1.1 jmmv .set_string("has_cleanup", "true") 238 1.1 jmmv .set_string("required_configs", "config-var") 239 1.1 jmmv .set_string("required_files", "plain /absolute/path") 240 1.1 jmmv .set_string("required_memory", "1M") 241 1.1 jmmv .set_string("required_programs", "program /absolute/prog") 242 1.1 jmmv .set_string("required_user", "unprivileged") 243 1.1 jmmv .set_string("timeout", "45") 244 1.1 jmmv .build(); 245 1.1 jmmv 246 1.1 jmmv ATF_REQUIRE(architectures == md.allowed_architectures()); 247 1.1 jmmv ATF_REQUIRE(platforms == md.allowed_platforms()); 248 1.1 jmmv ATF_REQUIRE(custom == md.custom()); 249 1.1 jmmv ATF_REQUIRE_EQ(description, md.description()); 250 1.1 jmmv ATF_REQUIRE(md.has_cleanup()); 251 1.1 jmmv ATF_REQUIRE(configs == md.required_configs()); 252 1.1 jmmv ATF_REQUIRE(files == md.required_files()); 253 1.1 jmmv ATF_REQUIRE_EQ(memory, md.required_memory()); 254 1.1 jmmv ATF_REQUIRE(programs == md.required_programs()); 255 1.1 jmmv ATF_REQUIRE_EQ(user, md.required_user()); 256 1.1 jmmv ATF_REQUIRE(timeout == md.timeout()); 257 1.1 jmmv } 258 1.1 jmmv 259 1.1 jmmv 260 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(operators_eq_and_ne__empty); 261 1.1 jmmv ATF_TEST_CASE_BODY(operators_eq_and_ne__empty) 262 1.1 jmmv { 263 1.1 jmmv const engine::metadata md1 = engine::metadata_builder().build(); 264 1.1 jmmv const engine::metadata md2 = engine::metadata_builder().build(); 265 1.1 jmmv ATF_REQUIRE( md1 == md2); 266 1.1 jmmv ATF_REQUIRE(!(md1 != md2)); 267 1.1 jmmv } 268 1.1 jmmv 269 1.1 jmmv 270 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(operators_eq_and_ne__copy); 271 1.1 jmmv ATF_TEST_CASE_BODY(operators_eq_and_ne__copy) 272 1.1 jmmv { 273 1.1 jmmv const engine::metadata md1 = engine::metadata_builder() 274 1.1 jmmv .add_custom("X-foo", "bar") 275 1.1 jmmv .build(); 276 1.1 jmmv const engine::metadata md2 = md1; 277 1.1 jmmv ATF_REQUIRE( md1 == md2); 278 1.1 jmmv ATF_REQUIRE(!(md1 != md2)); 279 1.1 jmmv } 280 1.1 jmmv 281 1.1 jmmv 282 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(operators_eq_and_ne__equal); 283 1.1 jmmv ATF_TEST_CASE_BODY(operators_eq_and_ne__equal) 284 1.1 jmmv { 285 1.1 jmmv const engine::metadata md1 = engine::metadata_builder() 286 1.1 jmmv .add_allowed_architecture("a") 287 1.1 jmmv .add_allowed_architecture("b") 288 1.1 jmmv .add_custom("X-foo", "bar") 289 1.1 jmmv .build(); 290 1.1 jmmv const engine::metadata md2 = engine::metadata_builder() 291 1.1 jmmv .add_allowed_architecture("b") 292 1.1 jmmv .add_allowed_architecture("a") 293 1.1 jmmv .add_custom("X-foo", "bar") 294 1.1 jmmv .build(); 295 1.1 jmmv ATF_REQUIRE( md1 == md2); 296 1.1 jmmv ATF_REQUIRE(!(md1 != md2)); 297 1.1 jmmv } 298 1.1 jmmv 299 1.1 jmmv 300 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(operators_eq_and_ne__different); 301 1.1 jmmv ATF_TEST_CASE_BODY(operators_eq_and_ne__different) 302 1.1 jmmv { 303 1.1 jmmv const engine::metadata md1 = engine::metadata_builder() 304 1.1 jmmv .add_custom("X-foo", "bar") 305 1.1 jmmv .build(); 306 1.1 jmmv const engine::metadata md2 = engine::metadata_builder() 307 1.1 jmmv .add_custom("X-foo", "bar") 308 1.1 jmmv .add_custom("X-baz", "foo bar") 309 1.1 jmmv .build(); 310 1.1 jmmv ATF_REQUIRE(!(md1 == md2)); 311 1.1 jmmv ATF_REQUIRE( md1 != md2); 312 1.1 jmmv } 313 1.1 jmmv 314 1.1 jmmv 315 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(output__defaults); 316 1.1 jmmv ATF_TEST_CASE_BODY(output__defaults) 317 1.1 jmmv { 318 1.1 jmmv std::ostringstream str; 319 1.1 jmmv str << engine::metadata_builder().build(); 320 1.1 jmmv ATF_REQUIRE_EQ("metadata{allowed_architectures='', allowed_platforms='', " 321 1.1 jmmv "description='', has_cleanup='false', required_configs='', " 322 1.1 jmmv "required_files='', required_memory='0', " 323 1.1 jmmv "required_programs='', required_user='', timeout='300'}", 324 1.1 jmmv str.str()); 325 1.1 jmmv } 326 1.1 jmmv 327 1.1 jmmv 328 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(output__some_values); 329 1.1 jmmv ATF_TEST_CASE_BODY(output__some_values) 330 1.1 jmmv { 331 1.1 jmmv std::ostringstream str; 332 1.1 jmmv str << engine::metadata_builder() 333 1.1 jmmv .add_allowed_architecture("abc") 334 1.1 jmmv .add_required_file(fs::path("foo")) 335 1.1 jmmv .add_required_file(fs::path("bar")) 336 1.1 jmmv .set_required_memory(units::bytes(1024)) 337 1.1 jmmv .build(); 338 1.1 jmmv ATF_REQUIRE_EQ( 339 1.1 jmmv "metadata{allowed_architectures='abc', allowed_platforms='', " 340 1.1 jmmv "description='', has_cleanup='false', required_configs='', " 341 1.1.1.2 jmmv "required_files='bar foo', required_memory='1.00K', " 342 1.1 jmmv "required_programs='', required_user='', timeout='300'}", 343 1.1 jmmv str.str()); 344 1.1 jmmv } 345 1.1 jmmv 346 1.1 jmmv 347 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__none); 348 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__none) 349 1.1 jmmv { 350 1.1 jmmv const engine::metadata md = engine::metadata_builder().build(); 351 1.1 jmmv ATF_REQUIRE(engine::check_reqs(md, engine::empty_config(), "").empty()); 352 1.1 jmmv } 353 1.1 jmmv 354 1.1 jmmv 355 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__allowed_architectures__one_ok); 356 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__allowed_architectures__one_ok) 357 1.1 jmmv { 358 1.1 jmmv const engine::metadata md = engine::metadata_builder() 359 1.1 jmmv .add_allowed_architecture("x86_64") 360 1.1 jmmv .build(); 361 1.1 jmmv 362 1.1 jmmv config::tree user_config = engine::default_config(); 363 1.1 jmmv user_config.set_string("architecture", "x86_64"); 364 1.1 jmmv user_config.set_string("platform", ""); 365 1.1 jmmv ATF_REQUIRE(engine::check_reqs(md, user_config, "").empty()); 366 1.1 jmmv } 367 1.1 jmmv 368 1.1 jmmv 369 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__allowed_architectures__one_fail); 370 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__allowed_architectures__one_fail) 371 1.1 jmmv { 372 1.1 jmmv const engine::metadata md = engine::metadata_builder() 373 1.1 jmmv .add_allowed_architecture("x86_64") 374 1.1 jmmv .build(); 375 1.1 jmmv 376 1.1 jmmv config::tree user_config = engine::default_config(); 377 1.1 jmmv user_config.set_string("architecture", "i386"); 378 1.1 jmmv user_config.set_string("platform", ""); 379 1.1 jmmv ATF_REQUIRE_MATCH("Current architecture 'i386' not supported", 380 1.1 jmmv engine::check_reqs(md, user_config, "")); 381 1.1 jmmv } 382 1.1 jmmv 383 1.1 jmmv 384 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__allowed_architectures__many_ok); 385 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__allowed_architectures__many_ok) 386 1.1 jmmv { 387 1.1 jmmv const engine::metadata md = engine::metadata_builder() 388 1.1 jmmv .add_allowed_architecture("x86_64") 389 1.1 jmmv .add_allowed_architecture("i386") 390 1.1 jmmv .add_allowed_architecture("powerpc") 391 1.1 jmmv .build(); 392 1.1 jmmv 393 1.1 jmmv config::tree user_config = engine::default_config(); 394 1.1 jmmv user_config.set_string("architecture", "i386"); 395 1.1 jmmv user_config.set_string("platform", ""); 396 1.1 jmmv ATF_REQUIRE(engine::check_reqs(md, user_config, "").empty()); 397 1.1 jmmv } 398 1.1 jmmv 399 1.1 jmmv 400 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__allowed_architectures__many_fail); 401 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__allowed_architectures__many_fail) 402 1.1 jmmv { 403 1.1 jmmv const engine::metadata md = engine::metadata_builder() 404 1.1 jmmv .add_allowed_architecture("x86_64") 405 1.1 jmmv .add_allowed_architecture("i386") 406 1.1 jmmv .add_allowed_architecture("powerpc") 407 1.1 jmmv .build(); 408 1.1 jmmv 409 1.1 jmmv config::tree user_config = engine::default_config(); 410 1.1 jmmv user_config.set_string("architecture", "arm"); 411 1.1 jmmv user_config.set_string("platform", ""); 412 1.1 jmmv ATF_REQUIRE_MATCH("Current architecture 'arm' not supported", 413 1.1 jmmv engine::check_reqs(md, user_config, "")); 414 1.1 jmmv } 415 1.1 jmmv 416 1.1 jmmv 417 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__allowed_platforms__one_ok); 418 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__allowed_platforms__one_ok) 419 1.1 jmmv { 420 1.1 jmmv const engine::metadata md = engine::metadata_builder() 421 1.1 jmmv .add_allowed_platform("amd64") 422 1.1 jmmv .build(); 423 1.1 jmmv 424 1.1 jmmv config::tree user_config = engine::default_config(); 425 1.1 jmmv user_config.set_string("architecture", ""); 426 1.1 jmmv user_config.set_string("platform", "amd64"); 427 1.1 jmmv ATF_REQUIRE(engine::check_reqs(md, user_config, "").empty()); 428 1.1 jmmv } 429 1.1 jmmv 430 1.1 jmmv 431 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__allowed_platforms__one_fail); 432 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__allowed_platforms__one_fail) 433 1.1 jmmv { 434 1.1 jmmv const engine::metadata md = engine::metadata_builder() 435 1.1 jmmv .add_allowed_platform("amd64") 436 1.1 jmmv .build(); 437 1.1 jmmv 438 1.1 jmmv config::tree user_config = engine::default_config(); 439 1.1 jmmv user_config.set_string("architecture", ""); 440 1.1 jmmv user_config.set_string("platform", "i386"); 441 1.1 jmmv ATF_REQUIRE_MATCH("Current platform 'i386' not supported", 442 1.1 jmmv engine::check_reqs(md, user_config, "")); 443 1.1 jmmv } 444 1.1 jmmv 445 1.1 jmmv 446 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__allowed_platforms__many_ok); 447 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__allowed_platforms__many_ok) 448 1.1 jmmv { 449 1.1 jmmv const engine::metadata md = engine::metadata_builder() 450 1.1 jmmv .add_allowed_platform("amd64") 451 1.1 jmmv .add_allowed_platform("i386") 452 1.1 jmmv .add_allowed_platform("macppc") 453 1.1 jmmv .build(); 454 1.1 jmmv 455 1.1 jmmv config::tree user_config = engine::default_config(); 456 1.1 jmmv user_config.set_string("architecture", ""); 457 1.1 jmmv user_config.set_string("platform", "i386"); 458 1.1 jmmv ATF_REQUIRE(engine::check_reqs(md, user_config, "").empty()); 459 1.1 jmmv } 460 1.1 jmmv 461 1.1 jmmv 462 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__allowed_platforms__many_fail); 463 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__allowed_platforms__many_fail) 464 1.1 jmmv { 465 1.1 jmmv const engine::metadata md = engine::metadata_builder() 466 1.1 jmmv .add_allowed_platform("amd64") 467 1.1 jmmv .add_allowed_platform("i386") 468 1.1 jmmv .add_allowed_platform("macppc") 469 1.1 jmmv .build(); 470 1.1 jmmv 471 1.1 jmmv config::tree user_config = engine::default_config(); 472 1.1 jmmv user_config.set_string("architecture", ""); 473 1.1 jmmv user_config.set_string("platform", "shark"); 474 1.1 jmmv ATF_REQUIRE_MATCH("Current platform 'shark' not supported", 475 1.1 jmmv engine::check_reqs(md, user_config, "")); 476 1.1 jmmv } 477 1.1 jmmv 478 1.1 jmmv 479 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_configs__one_ok); 480 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__required_configs__one_ok) 481 1.1 jmmv { 482 1.1 jmmv const engine::metadata md = engine::metadata_builder() 483 1.1 jmmv .add_required_config("my-var") 484 1.1 jmmv .build(); 485 1.1 jmmv 486 1.1 jmmv config::tree user_config = engine::default_config(); 487 1.1 jmmv user_config.set_string("test_suites.suite.aaa", "value1"); 488 1.1 jmmv user_config.set_string("test_suites.suite.my-var", "value2"); 489 1.1 jmmv user_config.set_string("test_suites.suite.zzz", "value3"); 490 1.1 jmmv ATF_REQUIRE(engine::check_reqs(md, user_config, "suite").empty()); 491 1.1 jmmv } 492 1.1 jmmv 493 1.1 jmmv 494 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_configs__one_fail); 495 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__required_configs__one_fail) 496 1.1 jmmv { 497 1.1 jmmv const engine::metadata md = engine::metadata_builder() 498 1.1 jmmv .add_required_config("unprivileged_user") 499 1.1 jmmv .build(); 500 1.1 jmmv 501 1.1 jmmv config::tree user_config = engine::default_config(); 502 1.1 jmmv user_config.set_string("test_suites.suite.aaa", "value1"); 503 1.1 jmmv user_config.set_string("test_suites.suite.my-var", "value2"); 504 1.1 jmmv user_config.set_string("test_suites.suite.zzz", "value3"); 505 1.1 jmmv ATF_REQUIRE_MATCH("Required configuration property 'unprivileged_user' not " 506 1.1 jmmv "defined", 507 1.1 jmmv engine::check_reqs(md, user_config, "suite")); 508 1.1 jmmv } 509 1.1 jmmv 510 1.1 jmmv 511 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_configs__many_ok); 512 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__required_configs__many_ok) 513 1.1 jmmv { 514 1.1 jmmv const engine::metadata md = engine::metadata_builder() 515 1.1 jmmv .add_required_config("foo") 516 1.1 jmmv .add_required_config("bar") 517 1.1 jmmv .add_required_config("baz") 518 1.1 jmmv .build(); 519 1.1 jmmv 520 1.1 jmmv config::tree user_config = engine::default_config(); 521 1.1 jmmv user_config.set_string("test_suites.suite.aaa", "value1"); 522 1.1 jmmv user_config.set_string("test_suites.suite.foo", "value2"); 523 1.1 jmmv user_config.set_string("test_suites.suite.bar", "value3"); 524 1.1 jmmv user_config.set_string("test_suites.suite.baz", "value4"); 525 1.1 jmmv user_config.set_string("test_suites.suite.zzz", "value5"); 526 1.1 jmmv ATF_REQUIRE(engine::check_reqs(md, user_config, "suite").empty()); 527 1.1 jmmv } 528 1.1 jmmv 529 1.1 jmmv 530 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_configs__many_fail); 531 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__required_configs__many_fail) 532 1.1 jmmv { 533 1.1 jmmv const engine::metadata md = engine::metadata_builder() 534 1.1 jmmv .add_required_config("foo") 535 1.1 jmmv .add_required_config("bar") 536 1.1 jmmv .add_required_config("baz") 537 1.1 jmmv .build(); 538 1.1 jmmv 539 1.1 jmmv config::tree user_config = engine::default_config(); 540 1.1 jmmv user_config.set_string("test_suites.suite.aaa", "value1"); 541 1.1 jmmv user_config.set_string("test_suites.suite.foo", "value2"); 542 1.1 jmmv user_config.set_string("test_suites.suite.zzz", "value3"); 543 1.1 jmmv ATF_REQUIRE_MATCH("Required configuration property 'bar' not defined", 544 1.1 jmmv engine::check_reqs(md, user_config, "suite")); 545 1.1 jmmv } 546 1.1 jmmv 547 1.1 jmmv 548 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_configs__special); 549 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__required_configs__special) 550 1.1 jmmv { 551 1.1 jmmv const engine::metadata md = engine::metadata_builder() 552 1.1 jmmv .add_required_config("unprivileged-user") 553 1.1 jmmv .build(); 554 1.1 jmmv 555 1.1 jmmv config::tree user_config = engine::default_config(); 556 1.1 jmmv ATF_REQUIRE_MATCH("Required configuration property 'unprivileged-user' " 557 1.1 jmmv "not defined", 558 1.1 jmmv engine::check_reqs(md, user_config, "")); 559 1.1 jmmv user_config.set< engine::user_node >( 560 1.1 jmmv "unprivileged_user", passwd::user("foo", 1, 2)); 561 1.1 jmmv ATF_REQUIRE(engine::check_reqs(md, user_config, "foo").empty()); 562 1.1 jmmv } 563 1.1 jmmv 564 1.1 jmmv 565 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_user__root__ok); 566 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__required_user__root__ok) 567 1.1 jmmv { 568 1.1 jmmv const engine::metadata md = engine::metadata_builder() 569 1.1 jmmv .set_required_user("root") 570 1.1 jmmv .build(); 571 1.1 jmmv 572 1.1 jmmv config::tree user_config = engine::default_config(); 573 1.1 jmmv ATF_REQUIRE(!user_config.is_set("unprivileged_user")); 574 1.1 jmmv 575 1.1 jmmv passwd::set_current_user_for_testing(passwd::user("", 0, 1)); 576 1.1 jmmv ATF_REQUIRE(engine::check_reqs(md, user_config, "").empty()); 577 1.1 jmmv } 578 1.1 jmmv 579 1.1 jmmv 580 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_user__root__fail); 581 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__required_user__root__fail) 582 1.1 jmmv { 583 1.1 jmmv const engine::metadata md = engine::metadata_builder() 584 1.1 jmmv .set_required_user("root") 585 1.1 jmmv .build(); 586 1.1 jmmv 587 1.1 jmmv passwd::set_current_user_for_testing(passwd::user("", 123, 1)); 588 1.1 jmmv ATF_REQUIRE_MATCH("Requires root privileges", 589 1.1 jmmv engine::check_reqs(md, engine::empty_config(), "")); 590 1.1 jmmv } 591 1.1 jmmv 592 1.1 jmmv 593 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_user__unprivileged__same); 594 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__required_user__unprivileged__same) 595 1.1 jmmv { 596 1.1 jmmv const engine::metadata md = engine::metadata_builder() 597 1.1 jmmv .set_required_user("unprivileged") 598 1.1 jmmv .build(); 599 1.1 jmmv 600 1.1 jmmv config::tree user_config = engine::default_config(); 601 1.1 jmmv ATF_REQUIRE(!user_config.is_set("unprivileged_user")); 602 1.1 jmmv 603 1.1 jmmv passwd::set_current_user_for_testing(passwd::user("", 123, 1)); 604 1.1 jmmv ATF_REQUIRE(engine::check_reqs(md, user_config, "").empty()); 605 1.1 jmmv } 606 1.1 jmmv 607 1.1 jmmv 608 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_user__unprivileged__ok); 609 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__required_user__unprivileged__ok) 610 1.1 jmmv { 611 1.1 jmmv const engine::metadata md = engine::metadata_builder() 612 1.1 jmmv .set_required_user("unprivileged") 613 1.1 jmmv .build(); 614 1.1 jmmv 615 1.1 jmmv config::tree user_config = engine::default_config(); 616 1.1 jmmv user_config.set< engine::user_node >( 617 1.1 jmmv "unprivileged_user", passwd::user("", 123, 1)); 618 1.1 jmmv 619 1.1 jmmv passwd::set_current_user_for_testing(passwd::user("", 0, 1)); 620 1.1 jmmv ATF_REQUIRE(engine::check_reqs(md, user_config, "").empty()); 621 1.1 jmmv } 622 1.1 jmmv 623 1.1 jmmv 624 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_user__unprivileged__fail); 625 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__required_user__unprivileged__fail) 626 1.1 jmmv { 627 1.1 jmmv const engine::metadata md = engine::metadata_builder() 628 1.1 jmmv .set_required_user("unprivileged") 629 1.1 jmmv .build(); 630 1.1 jmmv 631 1.1 jmmv config::tree user_config = engine::default_config(); 632 1.1 jmmv ATF_REQUIRE(!user_config.is_set("unprivileged_user")); 633 1.1 jmmv 634 1.1 jmmv passwd::set_current_user_for_testing(passwd::user("", 0, 1)); 635 1.1 jmmv ATF_REQUIRE_MATCH("Requires.*unprivileged.*unprivileged-user", 636 1.1 jmmv engine::check_reqs(md, user_config, "")); 637 1.1 jmmv } 638 1.1 jmmv 639 1.1 jmmv 640 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_files__ok); 641 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__required_files__ok) 642 1.1 jmmv { 643 1.1 jmmv const engine::metadata md = engine::metadata_builder() 644 1.1 jmmv .add_required_file(fs::current_path() / "test-file") 645 1.1 jmmv .build(); 646 1.1 jmmv 647 1.1 jmmv atf::utils::create_file("test-file", ""); 648 1.1 jmmv 649 1.1 jmmv ATF_REQUIRE(engine::check_reqs(md, engine::empty_config(), "").empty()); 650 1.1 jmmv } 651 1.1 jmmv 652 1.1 jmmv 653 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_files__fail); 654 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__required_files__fail) 655 1.1 jmmv { 656 1.1 jmmv const engine::metadata md = engine::metadata_builder() 657 1.1 jmmv .add_required_file(fs::path("/non-existent/file")) 658 1.1 jmmv .build(); 659 1.1 jmmv 660 1.1 jmmv ATF_REQUIRE_MATCH("'/non-existent/file' not found$", 661 1.1 jmmv engine::check_reqs(md, engine::empty_config(), "")); 662 1.1 jmmv } 663 1.1 jmmv 664 1.1 jmmv 665 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_memory__ok); 666 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__required_memory__ok) 667 1.1 jmmv { 668 1.1 jmmv const engine::metadata md = engine::metadata_builder() 669 1.1 jmmv .set_required_memory(units::bytes::parse("1m")) 670 1.1 jmmv .build(); 671 1.1 jmmv 672 1.1 jmmv ATF_REQUIRE(engine::check_reqs(md, engine::empty_config(), "").empty()); 673 1.1 jmmv } 674 1.1 jmmv 675 1.1 jmmv 676 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_memory__fail); 677 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__required_memory__fail) 678 1.1 jmmv { 679 1.1 jmmv const engine::metadata md = engine::metadata_builder() 680 1.1 jmmv .set_required_memory(units::bytes::parse("100t")) 681 1.1 jmmv .build(); 682 1.1 jmmv 683 1.1 jmmv if (utils::physical_memory() == 0) 684 1.1 jmmv skip("Don't know how to query the amount of physical memory"); 685 1.1 jmmv ATF_REQUIRE_MATCH("Requires 100.00T .*memory", 686 1.1 jmmv engine::check_reqs(md, engine::empty_config(), "")); 687 1.1 jmmv } 688 1.1 jmmv 689 1.1 jmmv 690 1.1 jmmv ATF_TEST_CASE(check_reqs__required_programs__ok); 691 1.1 jmmv ATF_TEST_CASE_HEAD(check_reqs__required_programs__ok) 692 1.1 jmmv { 693 1.1 jmmv set_md_var("require.progs", "/bin/ls /bin/mv"); 694 1.1 jmmv } 695 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__required_programs__ok) 696 1.1 jmmv { 697 1.1 jmmv const engine::metadata md = engine::metadata_builder() 698 1.1 jmmv .add_required_program(fs::path("/bin/ls")) 699 1.1 jmmv .add_required_program(fs::path("foo")) 700 1.1 jmmv .add_required_program(fs::path("/bin/mv")) 701 1.1 jmmv .build(); 702 1.1 jmmv 703 1.1 jmmv fs::mkdir(fs::path("bin"), 0755); 704 1.1 jmmv atf::utils::create_file("bin/foo", ""); 705 1.1 jmmv utils::setenv("PATH", (fs::current_path() / "bin").str()); 706 1.1 jmmv 707 1.1 jmmv ATF_REQUIRE(engine::check_reqs(md, engine::empty_config(), "").empty()); 708 1.1 jmmv } 709 1.1 jmmv 710 1.1 jmmv 711 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_programs__fail_absolute); 712 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__required_programs__fail_absolute) 713 1.1 jmmv { 714 1.1 jmmv const engine::metadata md = engine::metadata_builder() 715 1.1 jmmv .add_required_program(fs::path("/non-existent/program")) 716 1.1 jmmv .build(); 717 1.1 jmmv 718 1.1 jmmv ATF_REQUIRE_MATCH("'/non-existent/program' not found$", 719 1.1 jmmv engine::check_reqs(md, engine::empty_config(), "")); 720 1.1 jmmv } 721 1.1 jmmv 722 1.1 jmmv 723 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_programs__fail_relative); 724 1.1 jmmv ATF_TEST_CASE_BODY(check_reqs__required_programs__fail_relative) 725 1.1 jmmv { 726 1.1 jmmv const engine::metadata md = engine::metadata_builder() 727 1.1 jmmv .add_required_program(fs::path("foo")) 728 1.1 jmmv .add_required_program(fs::path("bar")) 729 1.1 jmmv .build(); 730 1.1 jmmv 731 1.1 jmmv fs::mkdir(fs::path("bin"), 0755); 732 1.1 jmmv atf::utils::create_file("bin/foo", ""); 733 1.1 jmmv utils::setenv("PATH", (fs::current_path() / "bin").str()); 734 1.1 jmmv 735 1.1 jmmv ATF_REQUIRE_MATCH("'bar' not found in PATH$", 736 1.1 jmmv engine::check_reqs(md, engine::empty_config(), "")); 737 1.1 jmmv } 738 1.1 jmmv 739 1.1 jmmv 740 1.1 jmmv ATF_INIT_TEST_CASES(tcs) 741 1.1 jmmv { 742 1.1 jmmv ATF_ADD_TEST_CASE(tcs, defaults); 743 1.1 jmmv ATF_ADD_TEST_CASE(tcs, add); 744 1.1 jmmv ATF_ADD_TEST_CASE(tcs, copy); 745 1.1 jmmv ATF_ADD_TEST_CASE(tcs, override_all_with_setters); 746 1.1 jmmv ATF_ADD_TEST_CASE(tcs, override_all_with_set_string); 747 1.1 jmmv 748 1.1 jmmv ATF_ADD_TEST_CASE(tcs, operators_eq_and_ne__empty); 749 1.1 jmmv ATF_ADD_TEST_CASE(tcs, operators_eq_and_ne__copy); 750 1.1 jmmv ATF_ADD_TEST_CASE(tcs, operators_eq_and_ne__equal); 751 1.1 jmmv ATF_ADD_TEST_CASE(tcs, operators_eq_and_ne__different); 752 1.1 jmmv 753 1.1 jmmv ATF_ADD_TEST_CASE(tcs, output__defaults); 754 1.1 jmmv ATF_ADD_TEST_CASE(tcs, output__some_values); 755 1.1 jmmv 756 1.1 jmmv // TODO(jmmv): Add tests for error conditions (invalid keys and invalid 757 1.1 jmmv // values). 758 1.1 jmmv 759 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__none); 760 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__allowed_architectures__one_ok); 761 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__allowed_architectures__one_fail); 762 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__allowed_architectures__many_ok); 763 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__allowed_architectures__many_fail); 764 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__allowed_platforms__one_ok); 765 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__allowed_platforms__one_fail); 766 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__allowed_platforms__many_ok); 767 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__allowed_platforms__many_fail); 768 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__required_configs__one_ok); 769 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__required_configs__one_fail); 770 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__required_configs__many_ok); 771 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__required_configs__many_fail); 772 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__required_configs__special); 773 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__required_user__root__ok); 774 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__required_user__root__fail); 775 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__required_user__unprivileged__same); 776 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__required_user__unprivileged__ok); 777 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__required_user__unprivileged__fail); 778 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__required_files__ok); 779 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__required_files__fail); 780 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__required_memory__ok); 781 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__required_memory__fail); 782 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__required_programs__ok); 783 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__required_programs__fail_absolute); 784 1.1 jmmv ATF_ADD_TEST_CASE(tcs, check_reqs__required_programs__fail_relative); 785 1.1 jmmv } 786