1*b0d29bc4SBrooks Davis // Copyright 2010 The Kyua Authors. 2*b0d29bc4SBrooks Davis // All rights reserved. 3*b0d29bc4SBrooks Davis // 4*b0d29bc4SBrooks Davis // Redistribution and use in source and binary forms, with or without 5*b0d29bc4SBrooks Davis // modification, are permitted provided that the following conditions are 6*b0d29bc4SBrooks Davis // met: 7*b0d29bc4SBrooks Davis // 8*b0d29bc4SBrooks Davis // * Redistributions of source code must retain the above copyright 9*b0d29bc4SBrooks Davis // notice, this list of conditions and the following disclaimer. 10*b0d29bc4SBrooks Davis // * Redistributions in binary form must reproduce the above copyright 11*b0d29bc4SBrooks Davis // notice, this list of conditions and the following disclaimer in the 12*b0d29bc4SBrooks Davis // documentation and/or other materials provided with the distribution. 13*b0d29bc4SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors 14*b0d29bc4SBrooks Davis // may be used to endorse or promote products derived from this software 15*b0d29bc4SBrooks Davis // without specific prior written permission. 16*b0d29bc4SBrooks Davis // 17*b0d29bc4SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18*b0d29bc4SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19*b0d29bc4SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20*b0d29bc4SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21*b0d29bc4SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22*b0d29bc4SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23*b0d29bc4SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24*b0d29bc4SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25*b0d29bc4SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26*b0d29bc4SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27*b0d29bc4SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*b0d29bc4SBrooks Davis 29*b0d29bc4SBrooks Davis #include "model/test_case.hpp" 30*b0d29bc4SBrooks Davis 31*b0d29bc4SBrooks Davis #include <sstream> 32*b0d29bc4SBrooks Davis 33*b0d29bc4SBrooks Davis #include <atf-c++.hpp> 34*b0d29bc4SBrooks Davis 35*b0d29bc4SBrooks Davis #include "model/metadata.hpp" 36*b0d29bc4SBrooks Davis #include "model/test_result.hpp" 37*b0d29bc4SBrooks Davis #include "utils/datetime.hpp" 38*b0d29bc4SBrooks Davis #include "utils/format/containers.ipp" 39*b0d29bc4SBrooks Davis #include "utils/fs/path.hpp" 40*b0d29bc4SBrooks Davis #include "utils/optional.ipp" 41*b0d29bc4SBrooks Davis 42*b0d29bc4SBrooks Davis namespace datetime = utils::datetime; 43*b0d29bc4SBrooks Davis namespace fs = utils::fs; 44*b0d29bc4SBrooks Davis 45*b0d29bc4SBrooks Davis 46*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test_case__ctor_and_getters) 47*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test_case__ctor_and_getters) 48*b0d29bc4SBrooks Davis { 49*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder() 50*b0d29bc4SBrooks Davis .add_custom("first", "value") 51*b0d29bc4SBrooks Davis .build(); 52*b0d29bc4SBrooks Davis const model::test_case test_case("foo", md); 53*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("foo", test_case.name()); 54*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(md, test_case.get_metadata()); 55*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(md, test_case.get_raw_metadata()); 56*b0d29bc4SBrooks Davis } 57*b0d29bc4SBrooks Davis 58*b0d29bc4SBrooks Davis 59*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test_case__fake_result) 60*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test_case__fake_result) 61*b0d29bc4SBrooks Davis { 62*b0d29bc4SBrooks Davis const model::test_result result(model::test_result_skipped, 63*b0d29bc4SBrooks Davis "Some reason"); 64*b0d29bc4SBrooks Davis const model::test_case test_case("__foo__", "Some description", result); 65*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("__foo__", test_case.name()); 66*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(result, test_case.fake_result().get()); 67*b0d29bc4SBrooks Davis 68*b0d29bc4SBrooks Davis const model::metadata exp_metadata = model::metadata_builder() 69*b0d29bc4SBrooks Davis .set_description("Some description") 70*b0d29bc4SBrooks Davis .build(); 71*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(exp_metadata, test_case.get_metadata()); 72*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(exp_metadata, test_case.get_raw_metadata()); 73*b0d29bc4SBrooks Davis } 74*b0d29bc4SBrooks Davis 75*b0d29bc4SBrooks Davis 76*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test_case__apply_metadata_overrides__real_test_case) 77*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test_case__apply_metadata_overrides__real_test_case) 78*b0d29bc4SBrooks Davis { 79*b0d29bc4SBrooks Davis const model::metadata overrides = model::metadata_builder() 80*b0d29bc4SBrooks Davis .add_required_config("the-variable") 81*b0d29bc4SBrooks Davis .set_description("The test case") 82*b0d29bc4SBrooks Davis .build(); 83*b0d29bc4SBrooks Davis const model::test_case base_test_case("foo", overrides); 84*b0d29bc4SBrooks Davis 85*b0d29bc4SBrooks Davis const model::metadata defaults = model::metadata_builder() 86*b0d29bc4SBrooks Davis .set_description("Default description") 87*b0d29bc4SBrooks Davis .set_timeout(datetime::delta(10, 0)) 88*b0d29bc4SBrooks Davis .build(); 89*b0d29bc4SBrooks Davis 90*b0d29bc4SBrooks Davis const model::test_case test_case = base_test_case.apply_metadata_defaults( 91*b0d29bc4SBrooks Davis &defaults); 92*b0d29bc4SBrooks Davis 93*b0d29bc4SBrooks Davis const model::metadata expected = model::metadata_builder() 94*b0d29bc4SBrooks Davis .add_required_config("the-variable") 95*b0d29bc4SBrooks Davis .set_description("The test case") 96*b0d29bc4SBrooks Davis .set_timeout(datetime::delta(10, 0)) 97*b0d29bc4SBrooks Davis .build(); 98*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(expected, test_case.get_metadata()); 99*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(overrides, test_case.get_raw_metadata()); 100*b0d29bc4SBrooks Davis 101*b0d29bc4SBrooks Davis // Ensure the original (although immutable) test case was not touched. 102*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(overrides, base_test_case.get_metadata()); 103*b0d29bc4SBrooks Davis } 104*b0d29bc4SBrooks Davis 105*b0d29bc4SBrooks Davis 106*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test_case__apply_metadata_overrides__fake_test_case) 107*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test_case__apply_metadata_overrides__fake_test_case) 108*b0d29bc4SBrooks Davis { 109*b0d29bc4SBrooks Davis const model::test_result result(model::test_result_skipped, "Irrelevant"); 110*b0d29bc4SBrooks Davis const model::test_case base_test_case("__foo__", "Fake test", result); 111*b0d29bc4SBrooks Davis 112*b0d29bc4SBrooks Davis const model::metadata overrides = model::metadata_builder() 113*b0d29bc4SBrooks Davis .set_description("Fake test") 114*b0d29bc4SBrooks Davis .build(); 115*b0d29bc4SBrooks Davis 116*b0d29bc4SBrooks Davis const model::metadata defaults = model::metadata_builder() 117*b0d29bc4SBrooks Davis .add_allowed_platform("some-value") 118*b0d29bc4SBrooks Davis .set_description("Default description") 119*b0d29bc4SBrooks Davis .build(); 120*b0d29bc4SBrooks Davis 121*b0d29bc4SBrooks Davis const model::test_case test_case = base_test_case.apply_metadata_defaults( 122*b0d29bc4SBrooks Davis &defaults); 123*b0d29bc4SBrooks Davis 124*b0d29bc4SBrooks Davis const model::metadata expected = model::metadata_builder() 125*b0d29bc4SBrooks Davis .add_allowed_platform("some-value") 126*b0d29bc4SBrooks Davis .set_description("Fake test") 127*b0d29bc4SBrooks Davis .build(); 128*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(expected, test_case.get_metadata()); 129*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(overrides, test_case.get_raw_metadata()); 130*b0d29bc4SBrooks Davis } 131*b0d29bc4SBrooks Davis 132*b0d29bc4SBrooks Davis 133*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test_case__operators_eq_and_ne__copy); 134*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test_case__operators_eq_and_ne__copy) 135*b0d29bc4SBrooks Davis { 136*b0d29bc4SBrooks Davis const model::test_case tc1("name", model::metadata_builder().build()); 137*b0d29bc4SBrooks Davis const model::test_case tc2 = tc1; 138*b0d29bc4SBrooks Davis ATF_REQUIRE( tc1 == tc2); 139*b0d29bc4SBrooks Davis ATF_REQUIRE(!(tc1 != tc2)); 140*b0d29bc4SBrooks Davis } 141*b0d29bc4SBrooks Davis 142*b0d29bc4SBrooks Davis 143*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test_case__operators_eq_and_ne__not_copy); 144*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test_case__operators_eq_and_ne__not_copy) 145*b0d29bc4SBrooks Davis { 146*b0d29bc4SBrooks Davis const std::string base_name("name"); 147*b0d29bc4SBrooks Davis const model::metadata base_metadata = model::metadata_builder() 148*b0d29bc4SBrooks Davis .add_custom("foo", "bar") 149*b0d29bc4SBrooks Davis .build(); 150*b0d29bc4SBrooks Davis 151*b0d29bc4SBrooks Davis const model::test_case base_tc(base_name, base_metadata); 152*b0d29bc4SBrooks Davis 153*b0d29bc4SBrooks Davis // Construct with all same values. 154*b0d29bc4SBrooks Davis { 155*b0d29bc4SBrooks Davis const model::test_case other_tc(base_name, base_metadata); 156*b0d29bc4SBrooks Davis 157*b0d29bc4SBrooks Davis ATF_REQUIRE( base_tc == other_tc); 158*b0d29bc4SBrooks Davis ATF_REQUIRE(!(base_tc != other_tc)); 159*b0d29bc4SBrooks Davis } 160*b0d29bc4SBrooks Davis 161*b0d29bc4SBrooks Davis // Construct with all same values but different metadata objects. 162*b0d29bc4SBrooks Davis { 163*b0d29bc4SBrooks Davis const model::metadata other_metadata = model::metadata_builder() 164*b0d29bc4SBrooks Davis .add_custom("foo", "bar") 165*b0d29bc4SBrooks Davis .set_timeout(base_metadata.timeout()) 166*b0d29bc4SBrooks Davis .build(); 167*b0d29bc4SBrooks Davis const model::test_case other_tc(base_name, other_metadata); 168*b0d29bc4SBrooks Davis 169*b0d29bc4SBrooks Davis ATF_REQUIRE( base_tc == other_tc); 170*b0d29bc4SBrooks Davis ATF_REQUIRE(!(base_tc != other_tc)); 171*b0d29bc4SBrooks Davis } 172*b0d29bc4SBrooks Davis 173*b0d29bc4SBrooks Davis // Different name. 174*b0d29bc4SBrooks Davis { 175*b0d29bc4SBrooks Davis const model::test_case other_tc("other", base_metadata); 176*b0d29bc4SBrooks Davis 177*b0d29bc4SBrooks Davis ATF_REQUIRE(!(base_tc == other_tc)); 178*b0d29bc4SBrooks Davis ATF_REQUIRE( base_tc != other_tc); 179*b0d29bc4SBrooks Davis } 180*b0d29bc4SBrooks Davis 181*b0d29bc4SBrooks Davis // Different metadata. 182*b0d29bc4SBrooks Davis { 183*b0d29bc4SBrooks Davis const model::test_case other_tc(base_name, 184*b0d29bc4SBrooks Davis model::metadata_builder().build()); 185*b0d29bc4SBrooks Davis 186*b0d29bc4SBrooks Davis ATF_REQUIRE(!(base_tc == other_tc)); 187*b0d29bc4SBrooks Davis ATF_REQUIRE( base_tc != other_tc); 188*b0d29bc4SBrooks Davis } 189*b0d29bc4SBrooks Davis } 190*b0d29bc4SBrooks Davis 191*b0d29bc4SBrooks Davis 192*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test_case__output); 193*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test_case__output) 194*b0d29bc4SBrooks Davis { 195*b0d29bc4SBrooks Davis const model::test_case tc1( 196*b0d29bc4SBrooks Davis "the-name", model::metadata_builder() 197*b0d29bc4SBrooks Davis .add_allowed_platform("foo").add_custom("bar", "baz").build()); 198*b0d29bc4SBrooks Davis std::ostringstream str; 199*b0d29bc4SBrooks Davis str << tc1; 200*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ( 201*b0d29bc4SBrooks Davis "test_case{name='the-name', " 202*b0d29bc4SBrooks Davis "metadata=metadata{allowed_architectures='', allowed_platforms='foo', " 203*b0d29bc4SBrooks Davis "custom.bar='baz', description='', has_cleanup='false', " 204*b0d29bc4SBrooks Davis "is_exclusive='false', " 205*b0d29bc4SBrooks Davis "required_configs='', required_disk_space='0', required_files='', " 206*b0d29bc4SBrooks Davis "required_memory='0', " 207*b0d29bc4SBrooks Davis "required_programs='', required_user='', timeout='300'}}", 208*b0d29bc4SBrooks Davis str.str()); 209*b0d29bc4SBrooks Davis } 210*b0d29bc4SBrooks Davis 211*b0d29bc4SBrooks Davis 212*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test_cases_map__builder); 213*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test_cases_map__builder) 214*b0d29bc4SBrooks Davis { 215*b0d29bc4SBrooks Davis model::test_cases_map_builder builder; 216*b0d29bc4SBrooks Davis model::test_cases_map exp_test_cases; 217*b0d29bc4SBrooks Davis 218*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(exp_test_cases, builder.build()); 219*b0d29bc4SBrooks Davis 220*b0d29bc4SBrooks Davis builder.add("default-metadata"); 221*b0d29bc4SBrooks Davis { 222*b0d29bc4SBrooks Davis const model::test_case tc1("default-metadata", 223*b0d29bc4SBrooks Davis model::metadata_builder().build()); 224*b0d29bc4SBrooks Davis exp_test_cases.insert( 225*b0d29bc4SBrooks Davis model::test_cases_map::value_type(tc1.name(), tc1)); 226*b0d29bc4SBrooks Davis } 227*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(exp_test_cases, builder.build()); 228*b0d29bc4SBrooks Davis 229*b0d29bc4SBrooks Davis builder.add("with-metadata", 230*b0d29bc4SBrooks Davis model::metadata_builder().set_description("text").build()); 231*b0d29bc4SBrooks Davis { 232*b0d29bc4SBrooks Davis const model::test_case tc1("with-metadata", 233*b0d29bc4SBrooks Davis model::metadata_builder() 234*b0d29bc4SBrooks Davis .set_description("text").build()); 235*b0d29bc4SBrooks Davis exp_test_cases.insert( 236*b0d29bc4SBrooks Davis model::test_cases_map::value_type(tc1.name(), tc1)); 237*b0d29bc4SBrooks Davis } 238*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(exp_test_cases, builder.build()); 239*b0d29bc4SBrooks Davis 240*b0d29bc4SBrooks Davis const model::test_case tc1("fully_built", 241*b0d29bc4SBrooks Davis model::metadata_builder() 242*b0d29bc4SBrooks Davis .set_description("something else").build()); 243*b0d29bc4SBrooks Davis builder.add(tc1); 244*b0d29bc4SBrooks Davis exp_test_cases.insert(model::test_cases_map::value_type(tc1.name(), tc1)); 245*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(exp_test_cases, builder.build()); 246*b0d29bc4SBrooks Davis } 247*b0d29bc4SBrooks Davis 248*b0d29bc4SBrooks Davis 249*b0d29bc4SBrooks Davis ATF_INIT_TEST_CASES(tcs) 250*b0d29bc4SBrooks Davis { 251*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, test_case__ctor_and_getters); 252*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, test_case__fake_result); 253*b0d29bc4SBrooks Davis 254*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, test_case__apply_metadata_overrides__real_test_case); 255*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, test_case__apply_metadata_overrides__fake_test_case); 256*b0d29bc4SBrooks Davis 257*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, test_case__operators_eq_and_ne__copy); 258*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, test_case__operators_eq_and_ne__not_copy); 259*b0d29bc4SBrooks Davis 260*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, test_case__output); 261*b0d29bc4SBrooks Davis 262*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, test_cases_map__builder); 263*b0d29bc4SBrooks Davis } 264