1b0d29bc4SBrooks Davis // Copyright 2010 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/test_case.hpp" 30b0d29bc4SBrooks Davis 31b0d29bc4SBrooks Davis #include <sstream> 32b0d29bc4SBrooks Davis 33b0d29bc4SBrooks Davis #include <atf-c++.hpp> 34b0d29bc4SBrooks Davis 35b0d29bc4SBrooks Davis #include "model/metadata.hpp" 36b0d29bc4SBrooks Davis #include "model/test_result.hpp" 37b0d29bc4SBrooks Davis #include "utils/datetime.hpp" 38b0d29bc4SBrooks Davis #include "utils/format/containers.ipp" 39b0d29bc4SBrooks Davis #include "utils/fs/path.hpp" 40b0d29bc4SBrooks Davis #include "utils/optional.ipp" 41b0d29bc4SBrooks Davis 42b0d29bc4SBrooks Davis namespace datetime = utils::datetime; 43b0d29bc4SBrooks Davis namespace fs = utils::fs; 44b0d29bc4SBrooks Davis 45b0d29bc4SBrooks Davis 46b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test_case__ctor_and_getters) 47b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test_case__ctor_and_getters) 48b0d29bc4SBrooks Davis { 49b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder() 50b0d29bc4SBrooks Davis .add_custom("first", "value") 51b0d29bc4SBrooks Davis .build(); 52b0d29bc4SBrooks Davis const model::test_case test_case("foo", md); 53b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("foo", test_case.name()); 54b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(md, test_case.get_metadata()); 55b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(md, test_case.get_raw_metadata()); 56b0d29bc4SBrooks Davis } 57b0d29bc4SBrooks Davis 58b0d29bc4SBrooks Davis 59b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test_case__fake_result) 60b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test_case__fake_result) 61b0d29bc4SBrooks Davis { 62b0d29bc4SBrooks Davis const model::test_result result(model::test_result_skipped, 63b0d29bc4SBrooks Davis "Some reason"); 64b0d29bc4SBrooks Davis const model::test_case test_case("__foo__", "Some description", result); 65b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("__foo__", test_case.name()); 66b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(result, test_case.fake_result().get()); 67b0d29bc4SBrooks Davis 68b0d29bc4SBrooks Davis const model::metadata exp_metadata = model::metadata_builder() 69b0d29bc4SBrooks Davis .set_description("Some description") 70b0d29bc4SBrooks Davis .build(); 71b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(exp_metadata, test_case.get_metadata()); 72b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(exp_metadata, test_case.get_raw_metadata()); 73b0d29bc4SBrooks Davis } 74b0d29bc4SBrooks Davis 75b0d29bc4SBrooks Davis 76b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test_case__apply_metadata_overrides__real_test_case) 77b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test_case__apply_metadata_overrides__real_test_case) 78b0d29bc4SBrooks Davis { 79b0d29bc4SBrooks Davis const model::metadata overrides = model::metadata_builder() 80b0d29bc4SBrooks Davis .add_required_config("the-variable") 81b0d29bc4SBrooks Davis .set_description("The test case") 82b0d29bc4SBrooks Davis .build(); 83b0d29bc4SBrooks Davis const model::test_case base_test_case("foo", overrides); 84b0d29bc4SBrooks Davis 85b0d29bc4SBrooks Davis const model::metadata defaults = model::metadata_builder() 86b0d29bc4SBrooks Davis .set_description("Default description") 87b0d29bc4SBrooks Davis .set_timeout(datetime::delta(10, 0)) 88b0d29bc4SBrooks Davis .build(); 89b0d29bc4SBrooks Davis 90b0d29bc4SBrooks Davis const model::test_case test_case = base_test_case.apply_metadata_defaults( 91b0d29bc4SBrooks Davis &defaults); 92b0d29bc4SBrooks Davis 93b0d29bc4SBrooks Davis const model::metadata expected = model::metadata_builder() 94b0d29bc4SBrooks Davis .add_required_config("the-variable") 95b0d29bc4SBrooks Davis .set_description("The test case") 96b0d29bc4SBrooks Davis .set_timeout(datetime::delta(10, 0)) 97b0d29bc4SBrooks Davis .build(); 98b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(expected, test_case.get_metadata()); 99b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(overrides, test_case.get_raw_metadata()); 100b0d29bc4SBrooks Davis 101b0d29bc4SBrooks Davis // Ensure the original (although immutable) test case was not touched. 102b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(overrides, base_test_case.get_metadata()); 103b0d29bc4SBrooks Davis } 104b0d29bc4SBrooks Davis 105b0d29bc4SBrooks Davis 106b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test_case__apply_metadata_overrides__fake_test_case) 107b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test_case__apply_metadata_overrides__fake_test_case) 108b0d29bc4SBrooks Davis { 109b0d29bc4SBrooks Davis const model::test_result result(model::test_result_skipped, "Irrelevant"); 110b0d29bc4SBrooks Davis const model::test_case base_test_case("__foo__", "Fake test", result); 111b0d29bc4SBrooks Davis 112b0d29bc4SBrooks Davis const model::metadata overrides = model::metadata_builder() 113b0d29bc4SBrooks Davis .set_description("Fake test") 114b0d29bc4SBrooks Davis .build(); 115b0d29bc4SBrooks Davis 116b0d29bc4SBrooks Davis const model::metadata defaults = model::metadata_builder() 117b0d29bc4SBrooks Davis .add_allowed_platform("some-value") 118b0d29bc4SBrooks Davis .set_description("Default description") 119b0d29bc4SBrooks Davis .build(); 120b0d29bc4SBrooks Davis 121b0d29bc4SBrooks Davis const model::test_case test_case = base_test_case.apply_metadata_defaults( 122b0d29bc4SBrooks Davis &defaults); 123b0d29bc4SBrooks Davis 124b0d29bc4SBrooks Davis const model::metadata expected = model::metadata_builder() 125b0d29bc4SBrooks Davis .add_allowed_platform("some-value") 126b0d29bc4SBrooks Davis .set_description("Fake test") 127b0d29bc4SBrooks Davis .build(); 128b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(expected, test_case.get_metadata()); 129b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(overrides, test_case.get_raw_metadata()); 130b0d29bc4SBrooks Davis } 131b0d29bc4SBrooks Davis 132b0d29bc4SBrooks Davis 133b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test_case__operators_eq_and_ne__copy); 134b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test_case__operators_eq_and_ne__copy) 135b0d29bc4SBrooks Davis { 136b0d29bc4SBrooks Davis const model::test_case tc1("name", model::metadata_builder().build()); 137b0d29bc4SBrooks Davis const model::test_case tc2 = tc1; 138b0d29bc4SBrooks Davis ATF_REQUIRE( tc1 == tc2); 139b0d29bc4SBrooks Davis ATF_REQUIRE(!(tc1 != tc2)); 140b0d29bc4SBrooks Davis } 141b0d29bc4SBrooks Davis 142b0d29bc4SBrooks Davis 143b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test_case__operators_eq_and_ne__not_copy); 144b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test_case__operators_eq_and_ne__not_copy) 145b0d29bc4SBrooks Davis { 146b0d29bc4SBrooks Davis const std::string base_name("name"); 147b0d29bc4SBrooks Davis const model::metadata base_metadata = model::metadata_builder() 148b0d29bc4SBrooks Davis .add_custom("foo", "bar") 149b0d29bc4SBrooks Davis .build(); 150b0d29bc4SBrooks Davis 151b0d29bc4SBrooks Davis const model::test_case base_tc(base_name, base_metadata); 152b0d29bc4SBrooks Davis 153b0d29bc4SBrooks Davis // Construct with all same values. 154b0d29bc4SBrooks Davis { 155b0d29bc4SBrooks Davis const model::test_case other_tc(base_name, base_metadata); 156b0d29bc4SBrooks Davis 157b0d29bc4SBrooks Davis ATF_REQUIRE( base_tc == other_tc); 158b0d29bc4SBrooks Davis ATF_REQUIRE(!(base_tc != other_tc)); 159b0d29bc4SBrooks Davis } 160b0d29bc4SBrooks Davis 161b0d29bc4SBrooks Davis // Construct with all same values but different metadata objects. 162b0d29bc4SBrooks Davis { 163b0d29bc4SBrooks Davis const model::metadata other_metadata = model::metadata_builder() 164b0d29bc4SBrooks Davis .add_custom("foo", "bar") 165b0d29bc4SBrooks Davis .set_timeout(base_metadata.timeout()) 166b0d29bc4SBrooks Davis .build(); 167b0d29bc4SBrooks Davis const model::test_case other_tc(base_name, other_metadata); 168b0d29bc4SBrooks Davis 169b0d29bc4SBrooks Davis ATF_REQUIRE( base_tc == other_tc); 170b0d29bc4SBrooks Davis ATF_REQUIRE(!(base_tc != other_tc)); 171b0d29bc4SBrooks Davis } 172b0d29bc4SBrooks Davis 173b0d29bc4SBrooks Davis // Different name. 174b0d29bc4SBrooks Davis { 175b0d29bc4SBrooks Davis const model::test_case other_tc("other", base_metadata); 176b0d29bc4SBrooks Davis 177b0d29bc4SBrooks Davis ATF_REQUIRE(!(base_tc == other_tc)); 178b0d29bc4SBrooks Davis ATF_REQUIRE( base_tc != other_tc); 179b0d29bc4SBrooks Davis } 180b0d29bc4SBrooks Davis 181b0d29bc4SBrooks Davis // Different metadata. 182b0d29bc4SBrooks Davis { 183b0d29bc4SBrooks Davis const model::test_case other_tc(base_name, 184b0d29bc4SBrooks Davis model::metadata_builder().build()); 185b0d29bc4SBrooks Davis 186b0d29bc4SBrooks Davis ATF_REQUIRE(!(base_tc == other_tc)); 187b0d29bc4SBrooks Davis ATF_REQUIRE( base_tc != other_tc); 188b0d29bc4SBrooks Davis } 189b0d29bc4SBrooks Davis } 190b0d29bc4SBrooks Davis 191b0d29bc4SBrooks Davis 192b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test_case__output); 193b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test_case__output) 194b0d29bc4SBrooks Davis { 195b0d29bc4SBrooks Davis const model::test_case tc1( 196b0d29bc4SBrooks Davis "the-name", model::metadata_builder() 197b0d29bc4SBrooks Davis .add_allowed_platform("foo").add_custom("bar", "baz").build()); 198b0d29bc4SBrooks Davis std::ostringstream str; 199b0d29bc4SBrooks Davis str << tc1; 200b0d29bc4SBrooks Davis ATF_REQUIRE_EQ( 201b0d29bc4SBrooks Davis "test_case{name='the-name', " 202b0d29bc4SBrooks Davis "metadata=metadata{allowed_architectures='', allowed_platforms='foo', " 203*257e70f1SIgor Ostapenko "custom.bar='baz', description='', execenv='', execenv_jail_params='', " 204*257e70f1SIgor Ostapenko "has_cleanup='false', " 205b0d29bc4SBrooks Davis "is_exclusive='false', " 206b0d29bc4SBrooks Davis "required_configs='', required_disk_space='0', required_files='', " 207b0d29bc4SBrooks Davis "required_memory='0', " 208b0d29bc4SBrooks Davis "required_programs='', required_user='', timeout='300'}}", 209b0d29bc4SBrooks Davis str.str()); 210b0d29bc4SBrooks Davis } 211b0d29bc4SBrooks Davis 212b0d29bc4SBrooks Davis 213b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test_cases_map__builder); 214b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test_cases_map__builder) 215b0d29bc4SBrooks Davis { 216b0d29bc4SBrooks Davis model::test_cases_map_builder builder; 217b0d29bc4SBrooks Davis model::test_cases_map exp_test_cases; 218b0d29bc4SBrooks Davis 219b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(exp_test_cases, builder.build()); 220b0d29bc4SBrooks Davis 221b0d29bc4SBrooks Davis builder.add("default-metadata"); 222b0d29bc4SBrooks Davis { 223b0d29bc4SBrooks Davis const model::test_case tc1("default-metadata", 224b0d29bc4SBrooks Davis model::metadata_builder().build()); 225b0d29bc4SBrooks Davis exp_test_cases.insert( 226b0d29bc4SBrooks Davis model::test_cases_map::value_type(tc1.name(), tc1)); 227b0d29bc4SBrooks Davis } 228b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(exp_test_cases, builder.build()); 229b0d29bc4SBrooks Davis 230b0d29bc4SBrooks Davis builder.add("with-metadata", 231b0d29bc4SBrooks Davis model::metadata_builder().set_description("text").build()); 232b0d29bc4SBrooks Davis { 233b0d29bc4SBrooks Davis const model::test_case tc1("with-metadata", 234b0d29bc4SBrooks Davis model::metadata_builder() 235b0d29bc4SBrooks Davis .set_description("text").build()); 236b0d29bc4SBrooks Davis exp_test_cases.insert( 237b0d29bc4SBrooks Davis model::test_cases_map::value_type(tc1.name(), tc1)); 238b0d29bc4SBrooks Davis } 239b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(exp_test_cases, builder.build()); 240b0d29bc4SBrooks Davis 241b0d29bc4SBrooks Davis const model::test_case tc1("fully_built", 242b0d29bc4SBrooks Davis model::metadata_builder() 243b0d29bc4SBrooks Davis .set_description("something else").build()); 244b0d29bc4SBrooks Davis builder.add(tc1); 245b0d29bc4SBrooks Davis exp_test_cases.insert(model::test_cases_map::value_type(tc1.name(), tc1)); 246b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(exp_test_cases, builder.build()); 247b0d29bc4SBrooks Davis } 248b0d29bc4SBrooks Davis 249b0d29bc4SBrooks Davis 250b0d29bc4SBrooks Davis ATF_INIT_TEST_CASES(tcs) 251b0d29bc4SBrooks Davis { 252b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, test_case__ctor_and_getters); 253b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, test_case__fake_result); 254b0d29bc4SBrooks Davis 255b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, test_case__apply_metadata_overrides__real_test_case); 256b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, test_case__apply_metadata_overrides__fake_test_case); 257b0d29bc4SBrooks Davis 258b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, test_case__operators_eq_and_ne__copy); 259b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, test_case__operators_eq_and_ne__not_copy); 260b0d29bc4SBrooks Davis 261b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, test_case__output); 262b0d29bc4SBrooks Davis 263b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, test_cases_map__builder); 264b0d29bc4SBrooks Davis } 265