1b0d29bc4SBrooks Davis // Copyright 2012 The Kyua Authors. 2b0d29bc4SBrooks Davis // All rights reserved. 3b0d29bc4SBrooks Davis // 4b0d29bc4SBrooks Davis // Redistribution and use in source and binary forms, with or without 5b0d29bc4SBrooks Davis // modification, are permitted provided that the following conditions are 6b0d29bc4SBrooks Davis // met: 7b0d29bc4SBrooks Davis // 8b0d29bc4SBrooks Davis // * Redistributions of source code must retain the above copyright 9b0d29bc4SBrooks Davis // notice, this list of conditions and the following disclaimer. 10b0d29bc4SBrooks Davis // * Redistributions in binary form must reproduce the above copyright 11b0d29bc4SBrooks Davis // notice, this list of conditions and the following disclaimer in the 12b0d29bc4SBrooks Davis // documentation and/or other materials provided with the distribution. 13b0d29bc4SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors 14b0d29bc4SBrooks Davis // may be used to endorse or promote products derived from this software 15b0d29bc4SBrooks Davis // without specific prior written permission. 16b0d29bc4SBrooks Davis // 17b0d29bc4SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18b0d29bc4SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19b0d29bc4SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20b0d29bc4SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21b0d29bc4SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22b0d29bc4SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23b0d29bc4SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24b0d29bc4SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25b0d29bc4SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26b0d29bc4SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27b0d29bc4SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28b0d29bc4SBrooks Davis 29b0d29bc4SBrooks Davis #include "model/metadata.hpp" 30b0d29bc4SBrooks Davis 31b0d29bc4SBrooks Davis #include <sstream> 32b0d29bc4SBrooks Davis 33b0d29bc4SBrooks Davis #include <atf-c++.hpp> 34b0d29bc4SBrooks Davis 35b0d29bc4SBrooks Davis #include "model/types.hpp" 36b0d29bc4SBrooks Davis #include "utils/datetime.hpp" 37b0d29bc4SBrooks Davis #include "utils/format/containers.ipp" 38b0d29bc4SBrooks Davis #include "utils/fs/path.hpp" 39b0d29bc4SBrooks Davis #include "utils/units.hpp" 40b0d29bc4SBrooks Davis 41b0d29bc4SBrooks Davis namespace datetime = utils::datetime; 42b0d29bc4SBrooks Davis namespace fs = utils::fs; 43b0d29bc4SBrooks Davis namespace units = utils::units; 44b0d29bc4SBrooks Davis 45b0d29bc4SBrooks Davis 46b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(defaults); 47b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(defaults) 48b0d29bc4SBrooks Davis { 49b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder().build(); 50b0d29bc4SBrooks Davis ATF_REQUIRE(md.allowed_architectures().empty()); 51b0d29bc4SBrooks Davis ATF_REQUIRE(md.allowed_platforms().empty()); 52b0d29bc4SBrooks Davis ATF_REQUIRE(md.allowed_platforms().empty()); 53b0d29bc4SBrooks Davis ATF_REQUIRE(md.custom().empty()); 54b0d29bc4SBrooks Davis ATF_REQUIRE(md.description().empty()); 55b0d29bc4SBrooks Davis ATF_REQUIRE(!md.has_cleanup()); 56b0d29bc4SBrooks Davis ATF_REQUIRE(!md.is_exclusive()); 57b0d29bc4SBrooks Davis ATF_REQUIRE(md.required_configs().empty()); 58b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(units::bytes(0), md.required_disk_space()); 59b0d29bc4SBrooks Davis ATF_REQUIRE(md.required_files().empty()); 60b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(units::bytes(0), md.required_memory()); 61b0d29bc4SBrooks Davis ATF_REQUIRE(md.required_programs().empty()); 62b0d29bc4SBrooks Davis ATF_REQUIRE(md.required_user().empty()); 63b0d29bc4SBrooks Davis ATF_REQUIRE(datetime::delta(300, 0) == md.timeout()); 64b0d29bc4SBrooks Davis } 65b0d29bc4SBrooks Davis 66b0d29bc4SBrooks Davis 67b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(add); 68b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(add) 69b0d29bc4SBrooks Davis { 70b0d29bc4SBrooks Davis model::strings_set architectures; 71b0d29bc4SBrooks Davis architectures.insert("1-architecture"); 72b0d29bc4SBrooks Davis architectures.insert("2-architecture"); 73b0d29bc4SBrooks Davis 74b0d29bc4SBrooks Davis model::strings_set platforms; 75b0d29bc4SBrooks Davis platforms.insert("1-platform"); 76b0d29bc4SBrooks Davis platforms.insert("2-platform"); 77b0d29bc4SBrooks Davis 78b0d29bc4SBrooks Davis model::properties_map custom; 79b0d29bc4SBrooks Davis custom["1-custom"] = "first"; 80b0d29bc4SBrooks Davis custom["2-custom"] = "second"; 81b0d29bc4SBrooks Davis 82b0d29bc4SBrooks Davis model::strings_set configs; 83b0d29bc4SBrooks Davis configs.insert("1-config"); 84b0d29bc4SBrooks Davis configs.insert("2-config"); 85b0d29bc4SBrooks Davis 86b0d29bc4SBrooks Davis model::paths_set files; 87b0d29bc4SBrooks Davis files.insert(fs::path("1-file")); 88b0d29bc4SBrooks Davis files.insert(fs::path("2-file")); 89b0d29bc4SBrooks Davis 90b0d29bc4SBrooks Davis model::paths_set programs; 91b0d29bc4SBrooks Davis programs.insert(fs::path("1-program")); 92b0d29bc4SBrooks Davis programs.insert(fs::path("2-program")); 93b0d29bc4SBrooks Davis 94b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder() 95b0d29bc4SBrooks Davis .add_allowed_architecture("1-architecture") 96b0d29bc4SBrooks Davis .add_allowed_platform("1-platform") 97b0d29bc4SBrooks Davis .add_custom("1-custom", "first") 98b0d29bc4SBrooks Davis .add_custom("2-custom", "second") 99b0d29bc4SBrooks Davis .add_required_config("1-config") 100b0d29bc4SBrooks Davis .add_required_file(fs::path("1-file")) 101b0d29bc4SBrooks Davis .add_required_program(fs::path("1-program")) 102b0d29bc4SBrooks Davis .add_allowed_architecture("2-architecture") 103b0d29bc4SBrooks Davis .add_allowed_platform("2-platform") 104b0d29bc4SBrooks Davis .add_required_config("2-config") 105b0d29bc4SBrooks Davis .add_required_file(fs::path("2-file")) 106b0d29bc4SBrooks Davis .add_required_program(fs::path("2-program")) 107b0d29bc4SBrooks Davis .build(); 108b0d29bc4SBrooks Davis 109b0d29bc4SBrooks Davis ATF_REQUIRE(architectures == md.allowed_architectures()); 110b0d29bc4SBrooks Davis ATF_REQUIRE(platforms == md.allowed_platforms()); 111b0d29bc4SBrooks Davis ATF_REQUIRE(custom == md.custom()); 112b0d29bc4SBrooks Davis ATF_REQUIRE(configs == md.required_configs()); 113b0d29bc4SBrooks Davis ATF_REQUIRE(files == md.required_files()); 114b0d29bc4SBrooks Davis ATF_REQUIRE(programs == md.required_programs()); 115b0d29bc4SBrooks Davis } 116b0d29bc4SBrooks Davis 117b0d29bc4SBrooks Davis 118b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(copy); 119b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(copy) 120b0d29bc4SBrooks Davis { 121b0d29bc4SBrooks Davis const model::metadata md1 = model::metadata_builder() 122b0d29bc4SBrooks Davis .add_allowed_architecture("1-architecture") 123b0d29bc4SBrooks Davis .add_allowed_platform("1-platform") 124b0d29bc4SBrooks Davis .build(); 125b0d29bc4SBrooks Davis 126b0d29bc4SBrooks Davis const model::metadata md2 = model::metadata_builder(md1) 127b0d29bc4SBrooks Davis .add_allowed_architecture("2-architecture") 128b0d29bc4SBrooks Davis .build(); 129b0d29bc4SBrooks Davis 130b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(1, md1.allowed_architectures().size()); 131b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(2, md2.allowed_architectures().size()); 132b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(1, md1.allowed_platforms().size()); 133b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(1, md2.allowed_platforms().size()); 134b0d29bc4SBrooks Davis } 135b0d29bc4SBrooks Davis 136b0d29bc4SBrooks Davis 137b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(apply_overrides); 138b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(apply_overrides) 139b0d29bc4SBrooks Davis { 140b0d29bc4SBrooks Davis const model::metadata md1 = model::metadata_builder() 141b0d29bc4SBrooks Davis .add_allowed_architecture("1-architecture") 142b0d29bc4SBrooks Davis .add_allowed_platform("1-platform") 143b0d29bc4SBrooks Davis .set_description("Explicit description") 144b0d29bc4SBrooks Davis .build(); 145b0d29bc4SBrooks Davis 146b0d29bc4SBrooks Davis const model::metadata md2 = model::metadata_builder() 147b0d29bc4SBrooks Davis .add_allowed_architecture("2-architecture") 148b0d29bc4SBrooks Davis .set_description("") 149b0d29bc4SBrooks Davis .set_timeout(datetime::delta(500, 0)) 150b0d29bc4SBrooks Davis .build(); 151b0d29bc4SBrooks Davis 152b0d29bc4SBrooks Davis const model::metadata merge_1_2 = model::metadata_builder() 153b0d29bc4SBrooks Davis .add_allowed_architecture("2-architecture") 154b0d29bc4SBrooks Davis .add_allowed_platform("1-platform") 155b0d29bc4SBrooks Davis .set_description("") 156b0d29bc4SBrooks Davis .set_timeout(datetime::delta(500, 0)) 157b0d29bc4SBrooks Davis .build(); 158b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(merge_1_2, md1.apply_overrides(md2)); 159b0d29bc4SBrooks Davis 160b0d29bc4SBrooks Davis const model::metadata merge_2_1 = model::metadata_builder() 161b0d29bc4SBrooks Davis .add_allowed_architecture("1-architecture") 162b0d29bc4SBrooks Davis .add_allowed_platform("1-platform") 163b0d29bc4SBrooks Davis .set_description("Explicit description") 164b0d29bc4SBrooks Davis .set_timeout(datetime::delta(500, 0)) 165b0d29bc4SBrooks Davis .build(); 166b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(merge_2_1, md2.apply_overrides(md1)); 167b0d29bc4SBrooks Davis } 168b0d29bc4SBrooks Davis 169b0d29bc4SBrooks Davis 170b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(override_all_with_setters); 171b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(override_all_with_setters) 172b0d29bc4SBrooks Davis { 173b0d29bc4SBrooks Davis model::strings_set architectures; 174b0d29bc4SBrooks Davis architectures.insert("the-architecture"); 175b0d29bc4SBrooks Davis 176b0d29bc4SBrooks Davis model::strings_set platforms; 177b0d29bc4SBrooks Davis platforms.insert("the-platforms"); 178b0d29bc4SBrooks Davis 179b0d29bc4SBrooks Davis model::properties_map custom; 180b0d29bc4SBrooks Davis custom["first"] = "hello"; 181b0d29bc4SBrooks Davis custom["second"] = "bye"; 182b0d29bc4SBrooks Davis 183b0d29bc4SBrooks Davis const std::string description = "Some long text"; 184b0d29bc4SBrooks Davis 185b0d29bc4SBrooks Davis model::strings_set configs; 186b0d29bc4SBrooks Davis configs.insert("the-configs"); 187b0d29bc4SBrooks Davis 188b0d29bc4SBrooks Davis model::paths_set files; 189b0d29bc4SBrooks Davis files.insert(fs::path("the-files")); 190b0d29bc4SBrooks Davis 191b0d29bc4SBrooks Davis const units::bytes disk_space(6789); 192b0d29bc4SBrooks Davis 193b0d29bc4SBrooks Davis const units::bytes memory(12345); 194b0d29bc4SBrooks Davis 195b0d29bc4SBrooks Davis model::paths_set programs; 196b0d29bc4SBrooks Davis programs.insert(fs::path("the-programs")); 197b0d29bc4SBrooks Davis 198b0d29bc4SBrooks Davis const std::string user = "root"; 199b0d29bc4SBrooks Davis 200b0d29bc4SBrooks Davis const datetime::delta timeout(123, 0); 201b0d29bc4SBrooks Davis 202b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder() 203b0d29bc4SBrooks Davis .set_allowed_architectures(architectures) 204b0d29bc4SBrooks Davis .set_allowed_platforms(platforms) 205b0d29bc4SBrooks Davis .set_custom(custom) 206b0d29bc4SBrooks Davis .set_description(description) 207b0d29bc4SBrooks Davis .set_has_cleanup(true) 208b0d29bc4SBrooks Davis .set_is_exclusive(true) 209b0d29bc4SBrooks Davis .set_required_configs(configs) 210b0d29bc4SBrooks Davis .set_required_disk_space(disk_space) 211b0d29bc4SBrooks Davis .set_required_files(files) 212b0d29bc4SBrooks Davis .set_required_memory(memory) 213b0d29bc4SBrooks Davis .set_required_programs(programs) 214b0d29bc4SBrooks Davis .set_required_user(user) 215b0d29bc4SBrooks Davis .set_timeout(timeout) 216b0d29bc4SBrooks Davis .build(); 217b0d29bc4SBrooks Davis 218b0d29bc4SBrooks Davis ATF_REQUIRE(architectures == md.allowed_architectures()); 219b0d29bc4SBrooks Davis ATF_REQUIRE(platforms == md.allowed_platforms()); 220b0d29bc4SBrooks Davis ATF_REQUIRE(custom == md.custom()); 221b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(description, md.description()); 222b0d29bc4SBrooks Davis ATF_REQUIRE(md.has_cleanup()); 223b0d29bc4SBrooks Davis ATF_REQUIRE(md.is_exclusive()); 224b0d29bc4SBrooks Davis ATF_REQUIRE(configs == md.required_configs()); 225b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(disk_space, md.required_disk_space()); 226b0d29bc4SBrooks Davis ATF_REQUIRE(files == md.required_files()); 227b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(memory, md.required_memory()); 228b0d29bc4SBrooks Davis ATF_REQUIRE(programs == md.required_programs()); 229b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(user, md.required_user()); 230b0d29bc4SBrooks Davis ATF_REQUIRE(timeout == md.timeout()); 231b0d29bc4SBrooks Davis } 232b0d29bc4SBrooks Davis 233b0d29bc4SBrooks Davis 234b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(override_all_with_set_string); 235b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(override_all_with_set_string) 236b0d29bc4SBrooks Davis { 237b0d29bc4SBrooks Davis model::strings_set architectures; 238b0d29bc4SBrooks Davis architectures.insert("a1"); 239b0d29bc4SBrooks Davis architectures.insert("a2"); 240b0d29bc4SBrooks Davis 241b0d29bc4SBrooks Davis model::strings_set platforms; 242b0d29bc4SBrooks Davis platforms.insert("p1"); 243b0d29bc4SBrooks Davis platforms.insert("p2"); 244b0d29bc4SBrooks Davis 245b0d29bc4SBrooks Davis model::properties_map custom; 246b0d29bc4SBrooks Davis custom["user-defined"] = "the-value"; 247b0d29bc4SBrooks Davis 248b0d29bc4SBrooks Davis const std::string description = "Another long text"; 249b0d29bc4SBrooks Davis 250b0d29bc4SBrooks Davis model::strings_set configs; 251b0d29bc4SBrooks Davis configs.insert("config-var"); 252b0d29bc4SBrooks Davis 253b0d29bc4SBrooks Davis model::paths_set files; 254b0d29bc4SBrooks Davis files.insert(fs::path("plain")); 255b0d29bc4SBrooks Davis files.insert(fs::path("/absolute/path")); 256b0d29bc4SBrooks Davis 257b0d29bc4SBrooks Davis const units::bytes disk_space( 258b0d29bc4SBrooks Davis static_cast< uint64_t >(16) * 1024 * 1024 * 1024); 259b0d29bc4SBrooks Davis 260b0d29bc4SBrooks Davis const units::bytes memory(1024 * 1024); 261b0d29bc4SBrooks Davis 262b0d29bc4SBrooks Davis model::paths_set programs; 263b0d29bc4SBrooks Davis programs.insert(fs::path("program")); 264b0d29bc4SBrooks Davis programs.insert(fs::path("/absolute/prog")); 265b0d29bc4SBrooks Davis 266b0d29bc4SBrooks Davis const std::string user = "unprivileged"; 267b0d29bc4SBrooks Davis 268b0d29bc4SBrooks Davis const datetime::delta timeout(45, 0); 269b0d29bc4SBrooks Davis 270b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder() 271b0d29bc4SBrooks Davis .set_string("allowed_architectures", "a1 a2") 272b0d29bc4SBrooks Davis .set_string("allowed_platforms", "p1 p2") 273b0d29bc4SBrooks Davis .set_string("custom.user-defined", "the-value") 274b0d29bc4SBrooks Davis .set_string("description", "Another long text") 275b0d29bc4SBrooks Davis .set_string("has_cleanup", "true") 276b0d29bc4SBrooks Davis .set_string("is_exclusive", "true") 277b0d29bc4SBrooks Davis .set_string("required_configs", "config-var") 278b0d29bc4SBrooks Davis .set_string("required_disk_space", "16G") 279b0d29bc4SBrooks Davis .set_string("required_files", "plain /absolute/path") 280b0d29bc4SBrooks Davis .set_string("required_memory", "1M") 281b0d29bc4SBrooks Davis .set_string("required_programs", "program /absolute/prog") 282b0d29bc4SBrooks Davis .set_string("required_user", "unprivileged") 283b0d29bc4SBrooks Davis .set_string("timeout", "45") 284b0d29bc4SBrooks Davis .build(); 285b0d29bc4SBrooks Davis 286b0d29bc4SBrooks Davis ATF_REQUIRE(architectures == md.allowed_architectures()); 287b0d29bc4SBrooks Davis ATF_REQUIRE(platforms == md.allowed_platforms()); 288b0d29bc4SBrooks Davis ATF_REQUIRE(custom == md.custom()); 289b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(description, md.description()); 290b0d29bc4SBrooks Davis ATF_REQUIRE(md.has_cleanup()); 291b0d29bc4SBrooks Davis ATF_REQUIRE(md.is_exclusive()); 292b0d29bc4SBrooks Davis ATF_REQUIRE(configs == md.required_configs()); 293b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(disk_space, md.required_disk_space()); 294b0d29bc4SBrooks Davis ATF_REQUIRE(files == md.required_files()); 295b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(memory, md.required_memory()); 296b0d29bc4SBrooks Davis ATF_REQUIRE(programs == md.required_programs()); 297b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(user, md.required_user()); 298b0d29bc4SBrooks Davis ATF_REQUIRE(timeout == md.timeout()); 299b0d29bc4SBrooks Davis } 300b0d29bc4SBrooks Davis 301b0d29bc4SBrooks Davis 302b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(to_properties); 303b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(to_properties) 304b0d29bc4SBrooks Davis { 305b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder() 306b0d29bc4SBrooks Davis .add_allowed_architecture("abc") 307b0d29bc4SBrooks Davis .add_required_file(fs::path("foo")) 308b0d29bc4SBrooks Davis .add_required_file(fs::path("bar")) 309b0d29bc4SBrooks Davis .set_required_memory(units::bytes(1024)) 310b0d29bc4SBrooks Davis .add_custom("foo", "bar") 311b0d29bc4SBrooks Davis .build(); 312b0d29bc4SBrooks Davis 313b0d29bc4SBrooks Davis model::properties_map props; 314b0d29bc4SBrooks Davis props["allowed_architectures"] = "abc"; 315b0d29bc4SBrooks Davis props["allowed_platforms"] = ""; 316b0d29bc4SBrooks Davis props["custom.foo"] = "bar"; 317b0d29bc4SBrooks Davis props["description"] = ""; 318*257e70f1SIgor Ostapenko props["execenv"] = ""; 319*257e70f1SIgor Ostapenko props["execenv_jail_params"] = ""; 320b0d29bc4SBrooks Davis props["has_cleanup"] = "false"; 321b0d29bc4SBrooks Davis props["is_exclusive"] = "false"; 322b0d29bc4SBrooks Davis props["required_configs"] = ""; 323b0d29bc4SBrooks Davis props["required_disk_space"] = "0"; 324b0d29bc4SBrooks Davis props["required_files"] = "bar foo"; 325b0d29bc4SBrooks Davis props["required_memory"] = "1.00K"; 326b0d29bc4SBrooks Davis props["required_programs"] = ""; 327b0d29bc4SBrooks Davis props["required_user"] = ""; 328b0d29bc4SBrooks Davis props["timeout"] = "300"; 329b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(props, md.to_properties()); 330b0d29bc4SBrooks Davis } 331b0d29bc4SBrooks Davis 332b0d29bc4SBrooks Davis 333b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(operators_eq_and_ne__empty); 334b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(operators_eq_and_ne__empty) 335b0d29bc4SBrooks Davis { 336b0d29bc4SBrooks Davis const model::metadata md1 = model::metadata_builder().build(); 337b0d29bc4SBrooks Davis const model::metadata md2 = model::metadata_builder().build(); 338b0d29bc4SBrooks Davis ATF_REQUIRE( md1 == md2); 339b0d29bc4SBrooks Davis ATF_REQUIRE(!(md1 != md2)); 340b0d29bc4SBrooks Davis } 341b0d29bc4SBrooks Davis 342b0d29bc4SBrooks Davis 343b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(operators_eq_and_ne__copy); 344b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(operators_eq_and_ne__copy) 345b0d29bc4SBrooks Davis { 346b0d29bc4SBrooks Davis const model::metadata md1 = model::metadata_builder() 347b0d29bc4SBrooks Davis .add_custom("foo", "bar") 348b0d29bc4SBrooks Davis .build(); 349b0d29bc4SBrooks Davis const model::metadata md2 = md1; 350b0d29bc4SBrooks Davis ATF_REQUIRE( md1 == md2); 351b0d29bc4SBrooks Davis ATF_REQUIRE(!(md1 != md2)); 352b0d29bc4SBrooks Davis } 353b0d29bc4SBrooks Davis 354b0d29bc4SBrooks Davis 355b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(operators_eq_and_ne__equal); 356b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(operators_eq_and_ne__equal) 357b0d29bc4SBrooks Davis { 358b0d29bc4SBrooks Davis const model::metadata md1 = model::metadata_builder() 359b0d29bc4SBrooks Davis .add_allowed_architecture("a") 360b0d29bc4SBrooks Davis .add_allowed_architecture("b") 361b0d29bc4SBrooks Davis .add_custom("foo", "bar") 362b0d29bc4SBrooks Davis .build(); 363b0d29bc4SBrooks Davis const model::metadata md2 = model::metadata_builder() 364b0d29bc4SBrooks Davis .add_allowed_architecture("b") 365b0d29bc4SBrooks Davis .add_allowed_architecture("a") 366b0d29bc4SBrooks Davis .add_custom("foo", "bar") 367b0d29bc4SBrooks Davis .build(); 368b0d29bc4SBrooks Davis ATF_REQUIRE( md1 == md2); 369b0d29bc4SBrooks Davis ATF_REQUIRE(!(md1 != md2)); 370b0d29bc4SBrooks Davis } 371b0d29bc4SBrooks Davis 372b0d29bc4SBrooks Davis 373b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(operators_eq_and_ne__equal_overriden_defaults); 374b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(operators_eq_and_ne__equal_overriden_defaults) 375b0d29bc4SBrooks Davis { 376b0d29bc4SBrooks Davis const model::metadata defaults = model::metadata_builder().build(); 377b0d29bc4SBrooks Davis 378b0d29bc4SBrooks Davis const model::metadata md1 = model::metadata_builder() 379b0d29bc4SBrooks Davis .add_allowed_architecture("a") 380b0d29bc4SBrooks Davis .build(); 381b0d29bc4SBrooks Davis const model::metadata md2 = model::metadata_builder() 382b0d29bc4SBrooks Davis .add_allowed_architecture("a") 383b0d29bc4SBrooks Davis .set_timeout(defaults.timeout()) 384b0d29bc4SBrooks Davis .build(); 385b0d29bc4SBrooks Davis ATF_REQUIRE( md1 == md2); 386b0d29bc4SBrooks Davis ATF_REQUIRE(!(md1 != md2)); 387b0d29bc4SBrooks Davis } 388b0d29bc4SBrooks Davis 389b0d29bc4SBrooks Davis 390b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(operators_eq_and_ne__different); 391b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(operators_eq_and_ne__different) 392b0d29bc4SBrooks Davis { 393b0d29bc4SBrooks Davis const model::metadata md1 = model::metadata_builder() 394b0d29bc4SBrooks Davis .add_custom("foo", "bar") 395b0d29bc4SBrooks Davis .build(); 396b0d29bc4SBrooks Davis const model::metadata md2 = model::metadata_builder() 397b0d29bc4SBrooks Davis .add_custom("foo", "bar") 398b0d29bc4SBrooks Davis .add_custom("baz", "foo bar") 399b0d29bc4SBrooks Davis .build(); 400b0d29bc4SBrooks Davis ATF_REQUIRE(!(md1 == md2)); 401b0d29bc4SBrooks Davis ATF_REQUIRE( md1 != md2); 402b0d29bc4SBrooks Davis } 403b0d29bc4SBrooks Davis 404b0d29bc4SBrooks Davis 405b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(output__defaults); 406b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(output__defaults) 407b0d29bc4SBrooks Davis { 408b0d29bc4SBrooks Davis std::ostringstream str; 409b0d29bc4SBrooks Davis str << model::metadata_builder().build(); 410b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("metadata{allowed_architectures='', allowed_platforms='', " 411*257e70f1SIgor Ostapenko "description='', execenv='', execenv_jail_params='', " 412*257e70f1SIgor Ostapenko "has_cleanup='false', is_exclusive='false', " 413b0d29bc4SBrooks Davis "required_configs='', " 414b0d29bc4SBrooks Davis "required_disk_space='0', required_files='', " 415b0d29bc4SBrooks Davis "required_memory='0', " 416b0d29bc4SBrooks Davis "required_programs='', required_user='', timeout='300'}", 417b0d29bc4SBrooks Davis str.str()); 418b0d29bc4SBrooks Davis } 419b0d29bc4SBrooks Davis 420b0d29bc4SBrooks Davis 421b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(output__some_values); 422b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(output__some_values) 423b0d29bc4SBrooks Davis { 424b0d29bc4SBrooks Davis std::ostringstream str; 425b0d29bc4SBrooks Davis str << model::metadata_builder() 426b0d29bc4SBrooks Davis .add_allowed_architecture("abc") 427b0d29bc4SBrooks Davis .add_required_file(fs::path("foo")) 428b0d29bc4SBrooks Davis .add_required_file(fs::path("bar")) 429b0d29bc4SBrooks Davis .set_is_exclusive(true) 430b0d29bc4SBrooks Davis .set_required_memory(units::bytes(1024)) 431b0d29bc4SBrooks Davis .build(); 432b0d29bc4SBrooks Davis ATF_REQUIRE_EQ( 433b0d29bc4SBrooks Davis "metadata{allowed_architectures='abc', allowed_platforms='', " 434*257e70f1SIgor Ostapenko "description='', execenv='', execenv_jail_params='', " 435*257e70f1SIgor Ostapenko "has_cleanup='false', is_exclusive='true', " 436b0d29bc4SBrooks Davis "required_configs='', " 437b0d29bc4SBrooks Davis "required_disk_space='0', required_files='bar foo', " 438b0d29bc4SBrooks Davis "required_memory='1.00K', " 439b0d29bc4SBrooks Davis "required_programs='', required_user='', timeout='300'}", 440b0d29bc4SBrooks Davis str.str()); 441b0d29bc4SBrooks Davis } 442b0d29bc4SBrooks Davis 443b0d29bc4SBrooks Davis 444b0d29bc4SBrooks Davis ATF_INIT_TEST_CASES(tcs) 445b0d29bc4SBrooks Davis { 446b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, defaults); 447b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, add); 448b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, copy); 449b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, apply_overrides); 450b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, override_all_with_setters); 451b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, override_all_with_set_string); 452b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, to_properties); 453b0d29bc4SBrooks Davis 454b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, operators_eq_and_ne__empty); 455b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, operators_eq_and_ne__copy); 456b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, operators_eq_and_ne__equal); 457b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, operators_eq_and_ne__equal_overriden_defaults); 458b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, operators_eq_and_ne__different); 459b0d29bc4SBrooks Davis 460b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, output__defaults); 461b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, output__some_values); 462b0d29bc4SBrooks Davis 463b0d29bc4SBrooks Davis // TODO(jmmv): Add tests for error conditions (invalid keys and invalid 464b0d29bc4SBrooks Davis // values). 465b0d29bc4SBrooks Davis } 466