xref: /freebsd/contrib/kyua/store/layout_test.cpp (revision b0d29bc47dba79f6f38e67eabadfb4b32ffd9390)
1*b0d29bc4SBrooks Davis // Copyright 2014 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 "store/layout.hpp"
30*b0d29bc4SBrooks Davis 
31*b0d29bc4SBrooks Davis extern "C" {
32*b0d29bc4SBrooks Davis #include <unistd.h>
33*b0d29bc4SBrooks Davis }
34*b0d29bc4SBrooks Davis 
35*b0d29bc4SBrooks Davis #include <iostream>
36*b0d29bc4SBrooks Davis 
37*b0d29bc4SBrooks Davis #include <atf-c++.hpp>
38*b0d29bc4SBrooks Davis 
39*b0d29bc4SBrooks Davis #include "store/exceptions.hpp"
40*b0d29bc4SBrooks Davis #include "store/layout.hpp"
41*b0d29bc4SBrooks Davis #include "utils/datetime.hpp"
42*b0d29bc4SBrooks Davis #include "utils/env.hpp"
43*b0d29bc4SBrooks Davis #include "utils/fs/operations.hpp"
44*b0d29bc4SBrooks Davis #include "utils/fs/path.hpp"
45*b0d29bc4SBrooks Davis 
46*b0d29bc4SBrooks Davis namespace datetime = utils::datetime;
47*b0d29bc4SBrooks Davis namespace fs = utils::fs;
48*b0d29bc4SBrooks Davis namespace layout = store::layout;
49*b0d29bc4SBrooks Davis 
50*b0d29bc4SBrooks Davis 
51*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(find_results__latest);
ATF_TEST_CASE_BODY(find_results__latest)52*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(find_results__latest)
53*b0d29bc4SBrooks Davis {
54*b0d29bc4SBrooks Davis     const fs::path store_dir = layout::query_store_dir();
55*b0d29bc4SBrooks Davis     fs::mkdir_p(store_dir, 0755);
56*b0d29bc4SBrooks Davis 
57*b0d29bc4SBrooks Davis     const std::string test_suite = layout::test_suite_for_path(
58*b0d29bc4SBrooks Davis         fs::current_path());
59*b0d29bc4SBrooks Davis     const std::string base = (store_dir / (
60*b0d29bc4SBrooks Davis         "results." + test_suite + ".")).str();
61*b0d29bc4SBrooks Davis 
62*b0d29bc4SBrooks Davis     atf::utils::create_file(base + "20140613-194515-000000.db", "");
63*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(base + "20140613-194515-000000.db",
64*b0d29bc4SBrooks Davis                    layout::find_results("LATEST").str());
65*b0d29bc4SBrooks Davis 
66*b0d29bc4SBrooks Davis     atf::utils::create_file(base + "20140614-194515-123456.db", "");
67*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(base + "20140614-194515-123456.db",
68*b0d29bc4SBrooks Davis                    layout::find_results("LATEST").str());
69*b0d29bc4SBrooks Davis 
70*b0d29bc4SBrooks Davis     atf::utils::create_file(base + "20130614-194515-999999.db", "");
71*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(base + "20140614-194515-123456.db",
72*b0d29bc4SBrooks Davis                    layout::find_results("LATEST").str());
73*b0d29bc4SBrooks Davis }
74*b0d29bc4SBrooks Davis 
75*b0d29bc4SBrooks Davis 
76*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(find_results__directory);
ATF_TEST_CASE_BODY(find_results__directory)77*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(find_results__directory)
78*b0d29bc4SBrooks Davis {
79*b0d29bc4SBrooks Davis     const fs::path store_dir = layout::query_store_dir();
80*b0d29bc4SBrooks Davis     fs::mkdir_p(store_dir, 0755);
81*b0d29bc4SBrooks Davis 
82*b0d29bc4SBrooks Davis     const fs::path dir1("dir1/foo");
83*b0d29bc4SBrooks Davis     fs::mkdir_p(dir1, 0755);
84*b0d29bc4SBrooks Davis     const fs::path dir2("dir1/bar");
85*b0d29bc4SBrooks Davis     fs::mkdir_p(dir2, 0755);
86*b0d29bc4SBrooks Davis 
87*b0d29bc4SBrooks Davis     const std::string base1 = (store_dir / (
88*b0d29bc4SBrooks Davis         "results." + layout::test_suite_for_path(dir1) + ".")).str();
89*b0d29bc4SBrooks Davis     const std::string base2 = (store_dir / (
90*b0d29bc4SBrooks Davis         "results." + layout::test_suite_for_path(dir2) + ".")).str();
91*b0d29bc4SBrooks Davis 
92*b0d29bc4SBrooks Davis     atf::utils::create_file(base1 + "20140613-194515-000000.db", "");
93*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(base1 + "20140613-194515-000000.db",
94*b0d29bc4SBrooks Davis                    layout::find_results(dir1.str()).str());
95*b0d29bc4SBrooks Davis 
96*b0d29bc4SBrooks Davis     atf::utils::create_file(base2 + "20140615-111111-000000.db", "");
97*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(base2 + "20140615-111111-000000.db",
98*b0d29bc4SBrooks Davis                    layout::find_results(dir2.str()).str());
99*b0d29bc4SBrooks Davis 
100*b0d29bc4SBrooks Davis     atf::utils::create_file(base1 + "20140614-194515-123456.db", "");
101*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(base1 + "20140614-194515-123456.db",
102*b0d29bc4SBrooks Davis                    layout::find_results(dir1.str()).str());
103*b0d29bc4SBrooks Davis 
104*b0d29bc4SBrooks Davis     atf::utils::create_file(base1 + "20130614-194515-999999.db", "");
105*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(base1 + "20140614-194515-123456.db",
106*b0d29bc4SBrooks Davis                    layout::find_results(dir1.str()).str());
107*b0d29bc4SBrooks Davis }
108*b0d29bc4SBrooks Davis 
109*b0d29bc4SBrooks Davis 
110*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(find_results__file);
ATF_TEST_CASE_BODY(find_results__file)111*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(find_results__file)
112*b0d29bc4SBrooks Davis {
113*b0d29bc4SBrooks Davis     const fs::path store_dir = layout::query_store_dir();
114*b0d29bc4SBrooks Davis     fs::mkdir_p(store_dir, 0755);
115*b0d29bc4SBrooks Davis 
116*b0d29bc4SBrooks Davis     atf::utils::create_file("a-file.db", "");
117*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("a-file.db").to_absolute(),
118*b0d29bc4SBrooks Davis                    layout::find_results("a-file.db"));
119*b0d29bc4SBrooks Davis }
120*b0d29bc4SBrooks Davis 
121*b0d29bc4SBrooks Davis 
122*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(find_results__id);
ATF_TEST_CASE_BODY(find_results__id)123*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(find_results__id)
124*b0d29bc4SBrooks Davis {
125*b0d29bc4SBrooks Davis     const fs::path store_dir = layout::query_store_dir();
126*b0d29bc4SBrooks Davis     fs::mkdir_p(store_dir, 0755);
127*b0d29bc4SBrooks Davis 
128*b0d29bc4SBrooks Davis     const fs::path dir1("dir1/foo");
129*b0d29bc4SBrooks Davis     fs::mkdir_p(dir1, 0755);
130*b0d29bc4SBrooks Davis     const fs::path dir2("dir1/bar");
131*b0d29bc4SBrooks Davis     fs::mkdir_p(dir2, 0755);
132*b0d29bc4SBrooks Davis 
133*b0d29bc4SBrooks Davis     const std::string id1 = layout::test_suite_for_path(dir1);
134*b0d29bc4SBrooks Davis     const std::string base1 = (store_dir / ("results." + id1 + ".")).str();
135*b0d29bc4SBrooks Davis     const std::string id2 = layout::test_suite_for_path(dir2);
136*b0d29bc4SBrooks Davis     const std::string base2 = (store_dir / ("results." + id2 + ".")).str();
137*b0d29bc4SBrooks Davis 
138*b0d29bc4SBrooks Davis     atf::utils::create_file(base1 + "20140613-194515-000000.db", "");
139*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(base1 + "20140613-194515-000000.db",
140*b0d29bc4SBrooks Davis                    layout::find_results(id1).str());
141*b0d29bc4SBrooks Davis 
142*b0d29bc4SBrooks Davis     atf::utils::create_file(base2 + "20140615-111111-000000.db", "");
143*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(base2 + "20140615-111111-000000.db",
144*b0d29bc4SBrooks Davis                    layout::find_results(id2).str());
145*b0d29bc4SBrooks Davis 
146*b0d29bc4SBrooks Davis     atf::utils::create_file(base1 + "20140614-194515-123456.db", "");
147*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(base1 + "20140614-194515-123456.db",
148*b0d29bc4SBrooks Davis                    layout::find_results(id1).str());
149*b0d29bc4SBrooks Davis 
150*b0d29bc4SBrooks Davis     atf::utils::create_file(base1 + "20130614-194515-999999.db", "");
151*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(base1 + "20140614-194515-123456.db",
152*b0d29bc4SBrooks Davis                    layout::find_results(id1).str());
153*b0d29bc4SBrooks Davis }
154*b0d29bc4SBrooks Davis 
155*b0d29bc4SBrooks Davis 
156*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(find_results__id_with_timestamp);
ATF_TEST_CASE_BODY(find_results__id_with_timestamp)157*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(find_results__id_with_timestamp)
158*b0d29bc4SBrooks Davis {
159*b0d29bc4SBrooks Davis     const fs::path store_dir = layout::query_store_dir();
160*b0d29bc4SBrooks Davis     fs::mkdir_p(store_dir, 0755);
161*b0d29bc4SBrooks Davis 
162*b0d29bc4SBrooks Davis     const fs::path dir1("dir1/foo");
163*b0d29bc4SBrooks Davis     fs::mkdir_p(dir1, 0755);
164*b0d29bc4SBrooks Davis     const fs::path dir2("dir1/bar");
165*b0d29bc4SBrooks Davis     fs::mkdir_p(dir2, 0755);
166*b0d29bc4SBrooks Davis 
167*b0d29bc4SBrooks Davis     const std::string id1 = layout::test_suite_for_path(dir1);
168*b0d29bc4SBrooks Davis     const std::string base1 = (store_dir / ("results." + id1 + ".")).str();
169*b0d29bc4SBrooks Davis     const std::string id2 = layout::test_suite_for_path(dir2);
170*b0d29bc4SBrooks Davis     const std::string base2 = (store_dir / ("results." + id2 + ".")).str();
171*b0d29bc4SBrooks Davis 
172*b0d29bc4SBrooks Davis     atf::utils::create_file(base1 + "20140613-194515-000000.db", "");
173*b0d29bc4SBrooks Davis     atf::utils::create_file(base2 + "20140615-111111-000000.db", "");
174*b0d29bc4SBrooks Davis     atf::utils::create_file(base1 + "20140614-194515-123456.db", "");
175*b0d29bc4SBrooks Davis     atf::utils::create_file(base1 + "20130614-194515-999999.db", "");
176*b0d29bc4SBrooks Davis 
177*b0d29bc4SBrooks Davis     ATF_REQUIRE_MATCH(
178*b0d29bc4SBrooks Davis         "_dir1_foo.20140613-194515-000000.db$",
179*b0d29bc4SBrooks Davis         layout::find_results(id1 + ".20140613-194515-000000").str());
180*b0d29bc4SBrooks Davis 
181*b0d29bc4SBrooks Davis     ATF_REQUIRE_MATCH(
182*b0d29bc4SBrooks Davis         "_dir1_foo.20140614-194515-123456.db$",
183*b0d29bc4SBrooks Davis         layout::find_results(id1 + ".20140614-194515-123456").str());
184*b0d29bc4SBrooks Davis 
185*b0d29bc4SBrooks Davis     ATF_REQUIRE_MATCH(
186*b0d29bc4SBrooks Davis         "_dir1_bar.20140615-111111-000000.db$",
187*b0d29bc4SBrooks Davis         layout::find_results(id2 + ".20140615-111111-000000").str());
188*b0d29bc4SBrooks Davis }
189*b0d29bc4SBrooks Davis 
190*b0d29bc4SBrooks Davis 
191*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(find_results__not_found);
ATF_TEST_CASE_BODY(find_results__not_found)192*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(find_results__not_found)
193*b0d29bc4SBrooks Davis {
194*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW_RE(
195*b0d29bc4SBrooks Davis         store::error,
196*b0d29bc4SBrooks Davis         "No previous results file found for test suite foo_bar",
197*b0d29bc4SBrooks Davis         layout::find_results("foo_bar"));
198*b0d29bc4SBrooks Davis 
199*b0d29bc4SBrooks Davis     const fs::path store_dir = layout::query_store_dir();
200*b0d29bc4SBrooks Davis     fs::mkdir_p(store_dir, 0755);
201*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW_RE(
202*b0d29bc4SBrooks Davis         store::error,
203*b0d29bc4SBrooks Davis         "No previous results file found for test suite foo_bar",
204*b0d29bc4SBrooks Davis         layout::find_results("foo_bar"));
205*b0d29bc4SBrooks Davis 
206*b0d29bc4SBrooks Davis     const char* candidates[] = {
207*b0d29bc4SBrooks Davis         "results.foo.20140613-194515-012345.db",  // Bad test suite.
208*b0d29bc4SBrooks Davis         "results.foo_bar.20140613-194515-012345",  // Missing extension.
209*b0d29bc4SBrooks Davis         "foo_bar.20140613-194515-012345.db",  // Missing prefix.
210*b0d29bc4SBrooks Davis         "results.foo_bar.2010613-194515-012345.db",  // Bad date.
211*b0d29bc4SBrooks Davis         "results.foo_bar.20140613-19515-012345.db",  // Bad time.
212*b0d29bc4SBrooks Davis         "results.foo_bar.20140613-194515-01245.db",  // Bad microseconds.
213*b0d29bc4SBrooks Davis         NULL,
214*b0d29bc4SBrooks Davis     };
215*b0d29bc4SBrooks Davis     for (const char** candidate = candidates; *candidate != NULL; ++candidate) {
216*b0d29bc4SBrooks Davis         std::cout << "Current candidate: " << *candidate << '\n';
217*b0d29bc4SBrooks Davis         atf::utils::create_file((store_dir / *candidate).str(), "");
218*b0d29bc4SBrooks Davis         ATF_REQUIRE_THROW_RE(
219*b0d29bc4SBrooks Davis             store::error,
220*b0d29bc4SBrooks Davis             "No previous results file found for test suite foo_bar",
221*b0d29bc4SBrooks Davis             layout::find_results("foo_bar"));
222*b0d29bc4SBrooks Davis     }
223*b0d29bc4SBrooks Davis 
224*b0d29bc4SBrooks Davis     atf::utils::create_file(
225*b0d29bc4SBrooks Davis         (store_dir / "results.foo_bar.20140613-194515-012345.db").str(), "");
226*b0d29bc4SBrooks Davis     layout::find_results("foo_bar");  // Expected not to throw.
227*b0d29bc4SBrooks Davis }
228*b0d29bc4SBrooks Davis 
229*b0d29bc4SBrooks Davis 
230*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(new_db__new);
ATF_TEST_CASE_BODY(new_db__new)231*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(new_db__new)
232*b0d29bc4SBrooks Davis {
233*b0d29bc4SBrooks Davis     datetime::set_mock_now(2014, 6, 13, 19, 45, 15, 5000);
234*b0d29bc4SBrooks Davis     ATF_REQUIRE(!fs::exists(fs::path(".kyua/store")));
235*b0d29bc4SBrooks Davis     const layout::results_id_file_pair results = layout::new_db(
236*b0d29bc4SBrooks Davis         "NEW", fs::path("/some/path/to/the/suite"));
237*b0d29bc4SBrooks Davis     ATF_REQUIRE( fs::exists(fs::path(".kyua/store")));
238*b0d29bc4SBrooks Davis     ATF_REQUIRE( fs::is_directory(fs::path(".kyua/store")));
239*b0d29bc4SBrooks Davis 
240*b0d29bc4SBrooks Davis     const std::string id = "some_path_to_the_suite.20140613-194515-005000";
241*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(id, results.first);
242*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(layout::query_store_dir() / ("results." + id + ".db"),
243*b0d29bc4SBrooks Davis                    results.second);
244*b0d29bc4SBrooks Davis }
245*b0d29bc4SBrooks Davis 
246*b0d29bc4SBrooks Davis 
247*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(new_db__explicit);
ATF_TEST_CASE_BODY(new_db__explicit)248*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(new_db__explicit)
249*b0d29bc4SBrooks Davis {
250*b0d29bc4SBrooks Davis     ATF_REQUIRE(!fs::exists(fs::path(".kyua/store")));
251*b0d29bc4SBrooks Davis     const layout::results_id_file_pair results = layout::new_db(
252*b0d29bc4SBrooks Davis         "foo/results-file.db", fs::path("unused"));
253*b0d29bc4SBrooks Davis     ATF_REQUIRE(!fs::exists(fs::path(".kyua/store")));
254*b0d29bc4SBrooks Davis     ATF_REQUIRE(!fs::exists(fs::path("foo")));
255*b0d29bc4SBrooks Davis 
256*b0d29bc4SBrooks Davis     ATF_REQUIRE(results.first.empty());
257*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("foo/results-file.db"), results.second);
258*b0d29bc4SBrooks Davis }
259*b0d29bc4SBrooks Davis 
260*b0d29bc4SBrooks Davis 
261*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(new_db_for_migration);
ATF_TEST_CASE_BODY(new_db_for_migration)262*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(new_db_for_migration)
263*b0d29bc4SBrooks Davis {
264*b0d29bc4SBrooks Davis     ATF_REQUIRE(!fs::exists(fs::path(".kyua/store")));
265*b0d29bc4SBrooks Davis     const fs::path results_file = layout::new_db_for_migration(
266*b0d29bc4SBrooks Davis         fs::path("/some/root"),
267*b0d29bc4SBrooks Davis         datetime::timestamp::from_values(2014, 7, 30, 10, 5, 20, 76500));
268*b0d29bc4SBrooks Davis     ATF_REQUIRE( fs::exists(fs::path(".kyua/store")));
269*b0d29bc4SBrooks Davis     ATF_REQUIRE( fs::is_directory(fs::path(".kyua/store")));
270*b0d29bc4SBrooks Davis 
271*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
272*b0d29bc4SBrooks Davis         layout::query_store_dir() /
273*b0d29bc4SBrooks Davis         "results.some_root.20140730-100520-076500.db",
274*b0d29bc4SBrooks Davis         results_file);
275*b0d29bc4SBrooks Davis }
276*b0d29bc4SBrooks Davis 
277*b0d29bc4SBrooks Davis 
278*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(query_store_dir__home_absolute);
ATF_TEST_CASE_BODY(query_store_dir__home_absolute)279*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(query_store_dir__home_absolute)
280*b0d29bc4SBrooks Davis {
281*b0d29bc4SBrooks Davis     const fs::path home = fs::current_path() / "homedir";
282*b0d29bc4SBrooks Davis     utils::setenv("HOME", home.str());
283*b0d29bc4SBrooks Davis     const fs::path store_dir = layout::query_store_dir();
284*b0d29bc4SBrooks Davis     ATF_REQUIRE(store_dir.is_absolute());
285*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(home / ".kyua/store", store_dir);
286*b0d29bc4SBrooks Davis }
287*b0d29bc4SBrooks Davis 
288*b0d29bc4SBrooks Davis 
289*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(query_store_dir__home_relative);
ATF_TEST_CASE_BODY(query_store_dir__home_relative)290*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(query_store_dir__home_relative)
291*b0d29bc4SBrooks Davis {
292*b0d29bc4SBrooks Davis     const fs::path home("homedir");
293*b0d29bc4SBrooks Davis     utils::setenv("HOME", home.str());
294*b0d29bc4SBrooks Davis     const fs::path store_dir = layout::query_store_dir();
295*b0d29bc4SBrooks Davis     ATF_REQUIRE(store_dir.is_absolute());
296*b0d29bc4SBrooks Davis     ATF_REQUIRE_MATCH((home / ".kyua/store").str(), store_dir.str());
297*b0d29bc4SBrooks Davis }
298*b0d29bc4SBrooks Davis 
299*b0d29bc4SBrooks Davis 
300*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(query_store_dir__no_home);
ATF_TEST_CASE_BODY(query_store_dir__no_home)301*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(query_store_dir__no_home)
302*b0d29bc4SBrooks Davis {
303*b0d29bc4SBrooks Davis     utils::unsetenv("HOME");
304*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::current_path(), layout::query_store_dir());
305*b0d29bc4SBrooks Davis }
306*b0d29bc4SBrooks Davis 
307*b0d29bc4SBrooks Davis 
308*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test_suite_for_path__absolute);
ATF_TEST_CASE_BODY(test_suite_for_path__absolute)309*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test_suite_for_path__absolute)
310*b0d29bc4SBrooks Davis {
311*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("dir1_dir2_dir3",
312*b0d29bc4SBrooks Davis                    layout::test_suite_for_path(fs::path("/dir1/dir2/dir3")));
313*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("dir1",
314*b0d29bc4SBrooks Davis                    layout::test_suite_for_path(fs::path("/dir1")));
315*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("dir1_dir2",
316*b0d29bc4SBrooks Davis                    layout::test_suite_for_path(fs::path("/dir1///dir2")));
317*b0d29bc4SBrooks Davis }
318*b0d29bc4SBrooks Davis 
319*b0d29bc4SBrooks Davis 
320*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test_suite_for_path__relative);
ATF_TEST_CASE_BODY(test_suite_for_path__relative)321*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test_suite_for_path__relative)
322*b0d29bc4SBrooks Davis {
323*b0d29bc4SBrooks Davis     const std::string test_suite = layout::test_suite_for_path(
324*b0d29bc4SBrooks Davis         fs::path("foo/bar"));
325*b0d29bc4SBrooks Davis     ATF_REQUIRE_MATCH("_foo_bar$", test_suite);
326*b0d29bc4SBrooks Davis     ATF_REQUIRE_MATCH("^[^_]", test_suite);
327*b0d29bc4SBrooks Davis }
328*b0d29bc4SBrooks Davis 
329*b0d29bc4SBrooks Davis 
ATF_INIT_TEST_CASES(tcs)330*b0d29bc4SBrooks Davis ATF_INIT_TEST_CASES(tcs)
331*b0d29bc4SBrooks Davis {
332*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, find_results__latest);
333*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, find_results__directory);
334*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, find_results__file);
335*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, find_results__id);
336*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, find_results__id_with_timestamp);
337*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, find_results__not_found);
338*b0d29bc4SBrooks Davis 
339*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, new_db__new);
340*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, new_db__explicit);
341*b0d29bc4SBrooks Davis 
342*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, new_db_for_migration);
343*b0d29bc4SBrooks Davis 
344*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, query_store_dir__home_absolute);
345*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, query_store_dir__home_relative);
346*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, query_store_dir__no_home);
347*b0d29bc4SBrooks Davis 
348*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, test_suite_for_path__absolute);
349*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, test_suite_for_path__relative);
350*b0d29bc4SBrooks Davis }
351