Path: blob/main/contrib/kyua/store/layout_test.cpp
39478 views
// Copyright 2014 The Kyua Authors.1// All rights reserved.2//3// Redistribution and use in source and binary forms, with or without4// modification, are permitted provided that the following conditions are5// met:6//7// * Redistributions of source code must retain the above copyright8// notice, this list of conditions and the following disclaimer.9// * Redistributions in binary form must reproduce the above copyright10// notice, this list of conditions and the following disclaimer in the11// documentation and/or other materials provided with the distribution.12// * Neither the name of Google Inc. nor the names of its contributors13// may be used to endorse or promote products derived from this software14// without specific prior written permission.15//16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.2728#include "store/layout.hpp"2930extern "C" {31#include <unistd.h>32}3334#include <iostream>3536#include <atf-c++.hpp>3738#include "store/exceptions.hpp"39#include "store/layout.hpp"40#include "utils/datetime.hpp"41#include "utils/env.hpp"42#include "utils/fs/operations.hpp"43#include "utils/fs/path.hpp"4445namespace datetime = utils::datetime;46namespace fs = utils::fs;47namespace layout = store::layout;484950ATF_TEST_CASE_WITHOUT_HEAD(find_results__latest);51ATF_TEST_CASE_BODY(find_results__latest)52{53const fs::path store_dir = layout::query_store_dir();54fs::mkdir_p(store_dir, 0755);5556const std::string test_suite = layout::test_suite_for_path(57fs::current_path());58const std::string base = (store_dir / (59"results." + test_suite + ".")).str();6061atf::utils::create_file(base + "20140613-194515-000000.db", "");62ATF_REQUIRE_EQ(base + "20140613-194515-000000.db",63layout::find_results("LATEST").str());6465atf::utils::create_file(base + "20140614-194515-123456.db", "");66ATF_REQUIRE_EQ(base + "20140614-194515-123456.db",67layout::find_results("LATEST").str());6869atf::utils::create_file(base + "20130614-194515-999999.db", "");70ATF_REQUIRE_EQ(base + "20140614-194515-123456.db",71layout::find_results("LATEST").str());72}737475ATF_TEST_CASE_WITHOUT_HEAD(find_results__directory);76ATF_TEST_CASE_BODY(find_results__directory)77{78const fs::path store_dir = layout::query_store_dir();79fs::mkdir_p(store_dir, 0755);8081const fs::path dir1("dir1/foo");82fs::mkdir_p(dir1, 0755);83const fs::path dir2("dir1/bar");84fs::mkdir_p(dir2, 0755);8586const std::string base1 = (store_dir / (87"results." + layout::test_suite_for_path(dir1) + ".")).str();88const std::string base2 = (store_dir / (89"results." + layout::test_suite_for_path(dir2) + ".")).str();9091atf::utils::create_file(base1 + "20140613-194515-000000.db", "");92ATF_REQUIRE_EQ(base1 + "20140613-194515-000000.db",93layout::find_results(dir1.str()).str());9495atf::utils::create_file(base2 + "20140615-111111-000000.db", "");96ATF_REQUIRE_EQ(base2 + "20140615-111111-000000.db",97layout::find_results(dir2.str()).str());9899atf::utils::create_file(base1 + "20140614-194515-123456.db", "");100ATF_REQUIRE_EQ(base1 + "20140614-194515-123456.db",101layout::find_results(dir1.str()).str());102103atf::utils::create_file(base1 + "20130614-194515-999999.db", "");104ATF_REQUIRE_EQ(base1 + "20140614-194515-123456.db",105layout::find_results(dir1.str()).str());106}107108109ATF_TEST_CASE_WITHOUT_HEAD(find_results__file);110ATF_TEST_CASE_BODY(find_results__file)111{112const fs::path store_dir = layout::query_store_dir();113fs::mkdir_p(store_dir, 0755);114115atf::utils::create_file("a-file.db", "");116ATF_REQUIRE_EQ(fs::path("a-file.db").to_absolute(),117layout::find_results("a-file.db"));118}119120121ATF_TEST_CASE_WITHOUT_HEAD(find_results__id);122ATF_TEST_CASE_BODY(find_results__id)123{124const fs::path store_dir = layout::query_store_dir();125fs::mkdir_p(store_dir, 0755);126127const fs::path dir1("dir1/foo");128fs::mkdir_p(dir1, 0755);129const fs::path dir2("dir1/bar");130fs::mkdir_p(dir2, 0755);131132const std::string id1 = layout::test_suite_for_path(dir1);133const std::string base1 = (store_dir / ("results." + id1 + ".")).str();134const std::string id2 = layout::test_suite_for_path(dir2);135const std::string base2 = (store_dir / ("results." + id2 + ".")).str();136137atf::utils::create_file(base1 + "20140613-194515-000000.db", "");138ATF_REQUIRE_EQ(base1 + "20140613-194515-000000.db",139layout::find_results(id1).str());140141atf::utils::create_file(base2 + "20140615-111111-000000.db", "");142ATF_REQUIRE_EQ(base2 + "20140615-111111-000000.db",143layout::find_results(id2).str());144145atf::utils::create_file(base1 + "20140614-194515-123456.db", "");146ATF_REQUIRE_EQ(base1 + "20140614-194515-123456.db",147layout::find_results(id1).str());148149atf::utils::create_file(base1 + "20130614-194515-999999.db", "");150ATF_REQUIRE_EQ(base1 + "20140614-194515-123456.db",151layout::find_results(id1).str());152}153154155ATF_TEST_CASE_WITHOUT_HEAD(find_results__id_with_timestamp);156ATF_TEST_CASE_BODY(find_results__id_with_timestamp)157{158const fs::path store_dir = layout::query_store_dir();159fs::mkdir_p(store_dir, 0755);160161const fs::path dir1("dir1/foo");162fs::mkdir_p(dir1, 0755);163const fs::path dir2("dir1/bar");164fs::mkdir_p(dir2, 0755);165166const std::string id1 = layout::test_suite_for_path(dir1);167const std::string base1 = (store_dir / ("results." + id1 + ".")).str();168const std::string id2 = layout::test_suite_for_path(dir2);169const std::string base2 = (store_dir / ("results." + id2 + ".")).str();170171atf::utils::create_file(base1 + "20140613-194515-000000.db", "");172atf::utils::create_file(base2 + "20140615-111111-000000.db", "");173atf::utils::create_file(base1 + "20140614-194515-123456.db", "");174atf::utils::create_file(base1 + "20130614-194515-999999.db", "");175176ATF_REQUIRE_MATCH(177"_dir1_foo.20140613-194515-000000.db$",178layout::find_results(id1 + ".20140613-194515-000000").str());179180ATF_REQUIRE_MATCH(181"_dir1_foo.20140614-194515-123456.db$",182layout::find_results(id1 + ".20140614-194515-123456").str());183184ATF_REQUIRE_MATCH(185"_dir1_bar.20140615-111111-000000.db$",186layout::find_results(id2 + ".20140615-111111-000000").str());187}188189190ATF_TEST_CASE_WITHOUT_HEAD(find_results__not_found);191ATF_TEST_CASE_BODY(find_results__not_found)192{193ATF_REQUIRE_THROW_RE(194store::error,195"No previous results file found for test suite foo_bar",196layout::find_results("foo_bar"));197198const fs::path store_dir = layout::query_store_dir();199fs::mkdir_p(store_dir, 0755);200ATF_REQUIRE_THROW_RE(201store::error,202"No previous results file found for test suite foo_bar",203layout::find_results("foo_bar"));204205const char* candidates[] = {206"results.foo.20140613-194515-012345.db", // Bad test suite.207"results.foo_bar.20140613-194515-012345", // Missing extension.208"foo_bar.20140613-194515-012345.db", // Missing prefix.209"results.foo_bar.2010613-194515-012345.db", // Bad date.210"results.foo_bar.20140613-19515-012345.db", // Bad time.211"results.foo_bar.20140613-194515-01245.db", // Bad microseconds.212NULL,213};214for (const char** candidate = candidates; *candidate != NULL; ++candidate) {215std::cout << "Current candidate: " << *candidate << '\n';216atf::utils::create_file((store_dir / *candidate).str(), "");217ATF_REQUIRE_THROW_RE(218store::error,219"No previous results file found for test suite foo_bar",220layout::find_results("foo_bar"));221}222223atf::utils::create_file(224(store_dir / "results.foo_bar.20140613-194515-012345.db").str(), "");225layout::find_results("foo_bar"); // Expected not to throw.226}227228229ATF_TEST_CASE_WITHOUT_HEAD(new_db__new);230ATF_TEST_CASE_BODY(new_db__new)231{232datetime::set_mock_now(2014, 6, 13, 19, 45, 15, 5000);233ATF_REQUIRE(!fs::exists(fs::path(".kyua/store")));234const layout::results_id_file_pair results = layout::new_db(235"NEW", fs::path("/some/path/to/the/suite"));236ATF_REQUIRE( fs::exists(fs::path(".kyua/store")));237ATF_REQUIRE( fs::is_directory(fs::path(".kyua/store")));238239const std::string id = "some_path_to_the_suite.20140613-194515-005000";240ATF_REQUIRE_EQ(id, results.first);241ATF_REQUIRE_EQ(layout::query_store_dir() / ("results." + id + ".db"),242results.second);243}244245246ATF_TEST_CASE_WITHOUT_HEAD(new_db__explicit);247ATF_TEST_CASE_BODY(new_db__explicit)248{249ATF_REQUIRE(!fs::exists(fs::path(".kyua/store")));250const layout::results_id_file_pair results = layout::new_db(251"foo/results-file.db", fs::path("unused"));252ATF_REQUIRE(!fs::exists(fs::path(".kyua/store")));253ATF_REQUIRE(!fs::exists(fs::path("foo")));254255ATF_REQUIRE(results.first.empty());256ATF_REQUIRE_EQ(fs::path("foo/results-file.db"), results.second);257}258259260ATF_TEST_CASE_WITHOUT_HEAD(new_db_for_migration);261ATF_TEST_CASE_BODY(new_db_for_migration)262{263ATF_REQUIRE(!fs::exists(fs::path(".kyua/store")));264const fs::path results_file = layout::new_db_for_migration(265fs::path("/some/root"),266datetime::timestamp::from_values(2014, 7, 30, 10, 5, 20, 76500));267ATF_REQUIRE( fs::exists(fs::path(".kyua/store")));268ATF_REQUIRE( fs::is_directory(fs::path(".kyua/store")));269270ATF_REQUIRE_EQ(271layout::query_store_dir() /272"results.some_root.20140730-100520-076500.db",273results_file);274}275276277ATF_TEST_CASE_WITHOUT_HEAD(query_store_dir__home_absolute);278ATF_TEST_CASE_BODY(query_store_dir__home_absolute)279{280const fs::path home = fs::current_path() / "homedir";281utils::setenv("HOME", home.str());282const fs::path store_dir = layout::query_store_dir();283ATF_REQUIRE(store_dir.is_absolute());284ATF_REQUIRE_EQ(home / ".kyua/store", store_dir);285}286287288ATF_TEST_CASE_WITHOUT_HEAD(query_store_dir__home_relative);289ATF_TEST_CASE_BODY(query_store_dir__home_relative)290{291const fs::path home("homedir");292utils::setenv("HOME", home.str());293const fs::path store_dir = layout::query_store_dir();294ATF_REQUIRE(store_dir.is_absolute());295ATF_REQUIRE_MATCH((home / ".kyua/store").str(), store_dir.str());296}297298299ATF_TEST_CASE_WITHOUT_HEAD(query_store_dir__no_home);300ATF_TEST_CASE_BODY(query_store_dir__no_home)301{302utils::unsetenv("HOME");303ATF_REQUIRE_EQ(fs::current_path(), layout::query_store_dir());304}305306307ATF_TEST_CASE_WITHOUT_HEAD(test_suite_for_path__absolute);308ATF_TEST_CASE_BODY(test_suite_for_path__absolute)309{310ATF_REQUIRE_EQ("dir1_dir2_dir3",311layout::test_suite_for_path(fs::path("/dir1/dir2/dir3")));312ATF_REQUIRE_EQ("dir1",313layout::test_suite_for_path(fs::path("/dir1")));314ATF_REQUIRE_EQ("dir1_dir2",315layout::test_suite_for_path(fs::path("/dir1///dir2")));316}317318319ATF_TEST_CASE_WITHOUT_HEAD(test_suite_for_path__relative);320ATF_TEST_CASE_BODY(test_suite_for_path__relative)321{322const std::string test_suite = layout::test_suite_for_path(323fs::path("foo/bar"));324ATF_REQUIRE_MATCH("_foo_bar$", test_suite);325ATF_REQUIRE_MATCH("^[^_]", test_suite);326}327328329ATF_INIT_TEST_CASES(tcs)330{331ATF_ADD_TEST_CASE(tcs, find_results__latest);332ATF_ADD_TEST_CASE(tcs, find_results__directory);333ATF_ADD_TEST_CASE(tcs, find_results__file);334ATF_ADD_TEST_CASE(tcs, find_results__id);335ATF_ADD_TEST_CASE(tcs, find_results__id_with_timestamp);336ATF_ADD_TEST_CASE(tcs, find_results__not_found);337338ATF_ADD_TEST_CASE(tcs, new_db__new);339ATF_ADD_TEST_CASE(tcs, new_db__explicit);340341ATF_ADD_TEST_CASE(tcs, new_db_for_migration);342343ATF_ADD_TEST_CASE(tcs, query_store_dir__home_absolute);344ATF_ADD_TEST_CASE(tcs, query_store_dir__home_relative);345ATF_ADD_TEST_CASE(tcs, query_store_dir__no_home);346347ATF_ADD_TEST_CASE(tcs, test_suite_for_path__absolute);348ATF_ADD_TEST_CASE(tcs, test_suite_for_path__relative);349}350351352