xref: /freebsd/contrib/kyua/model/test_case_test.cpp (revision 257e70f1d5ee61037c8c59b116538d3b6b1427a2)
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)
ATF_TEST_CASE_BODY(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)
ATF_TEST_CASE_BODY(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)
ATF_TEST_CASE_BODY(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)
ATF_TEST_CASE_BODY(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);
ATF_TEST_CASE_BODY(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);
ATF_TEST_CASE_BODY(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);
ATF_TEST_CASE_BODY(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);
ATF_TEST_CASE_BODY(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 
ATF_INIT_TEST_CASES(tcs)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