blob: cec00195cec1e3a3d536262e3dd3a36680f40fb7 [file] [log] [blame]
#include "helpers.hpp"
#include "persistent_json_storage.hpp"
#include <fstream>
#include "gmock/gmock.h"
#include "gtest/gtest.h"
using namespace testing;
class TestPersistentJsonStorage : public Test
{
public:
using FilePath = interfaces::JsonStorage::FilePath;
using DirectoryPath = interfaces::JsonStorage::DirectoryPath;
static void SetUpTestSuite()
{
ASSERT_FALSE(std::filesystem::exists(directory));
}
void TearDown() override
{
if (std::filesystem::exists(directory))
{
std::filesystem::remove_all(directory);
}
}
const FilePath fileName = FilePath("report/1/file.txt");
static const DirectoryPath directory;
PersistentJsonStorage sut{directory};
};
const interfaces::JsonStorage::DirectoryPath
TestPersistentJsonStorage::directory =
interfaces::JsonStorage::DirectoryPath(
std::filesystem::temp_directory_path() / "telemetry-tests");
TEST_F(TestPersistentJsonStorage, storesJsonData)
{
nlohmann::json data = nlohmann::json::object();
data["name"] = "kevin";
data["lastname"] = "mc calister";
sut.store(fileName, data);
ASSERT_THAT(sut.load(fileName), Eq(data));
}
TEST_F(TestPersistentJsonStorage, emptyListWhenNoReportsCreated)
{
EXPECT_THAT(sut.list(), SizeIs(0u));
}
TEST_F(TestPersistentJsonStorage, listSavedReports)
{
sut.store(FilePath("report/domain-1/name-1/conf-1.json"),
nlohmann::json("data-1a"));
sut.store(FilePath("report/domain-1/name-2/conf-1.json"),
nlohmann::json("data-2a"));
sut.store(FilePath("report/domain-1/name-2/conf-2.json"),
nlohmann::json("data-2b"));
sut.store(FilePath("report/domain-2/name-1/conf-1.json"),
nlohmann::json("data-3a"));
EXPECT_THAT(
sut.list(),
UnorderedElementsAre(FilePath("report/domain-1/name-1/conf-1.json"),
FilePath("report/domain-1/name-2/conf-1.json"),
FilePath("report/domain-1/name-2/conf-2.json"),
FilePath("report/domain-2/name-1/conf-1.json")));
}
TEST_F(TestPersistentJsonStorage, listSavedReportsWithoutRemovedOnes)
{
sut.store(FilePath("report/domain-1/name-1/conf-1.json"),
nlohmann::json("data-1a"));
sut.store(FilePath("report/domain-1/name-2/conf-1.json"),
nlohmann::json("data-2a"));
sut.store(FilePath("report/domain-1/name-2/conf-2.json"),
nlohmann::json("data-2b"));
sut.store(FilePath("report/domain-2/name-1/conf-1.json"),
nlohmann::json("data-3a"));
sut.remove(FilePath("report/domain-1/name-1/conf-1.json"));
sut.remove(FilePath("report/domain-1/name-2/conf-2.json"));
EXPECT_THAT(
sut.list(),
UnorderedElementsAre(FilePath("report/domain-1/name-2/conf-1.json"),
FilePath("report/domain-2/name-1/conf-1.json")));
}
TEST_F(TestPersistentJsonStorage, removesStoredJson)
{
nlohmann::json data = nlohmann::json::object();
data["name"] = "kevin";
data["lastname"] = "mc calister";
sut.store(fileName, data);
ASSERT_THAT(sut.remove(fileName), Eq(true));
ASSERT_THAT(sut.load(fileName), Eq(std::nullopt));
}
TEST_F(TestPersistentJsonStorage, returnsFalseWhenDeletingNonExistingFile)
{
ASSERT_THAT(sut.remove(fileName), Eq(false));
}
TEST_F(TestPersistentJsonStorage, returnsNulloptWhenFileDoesntExist)
{
ASSERT_THAT(sut.load(fileName), Eq(std::nullopt));
}
struct TestFileSymlink
{
static interfaces::JsonStorage::FilePath
setupSymlinks(const std::filesystem::path& originalFile,
const interfaces::JsonStorage::DirectoryPath& directory)
{
auto linkPath = std::filesystem::path(directory) /
"report/symlink.json";
std::filesystem::create_directories(std::filesystem::path(directory) /
"report");
std::filesystem::create_symlink(originalFile, linkPath);
return interfaces::JsonStorage::FilePath(linkPath);
}
};
struct TestDirectorySymlink
{
static interfaces::JsonStorage::FilePath
setupSymlinks(const std::filesystem::path& originalFile,
const interfaces::JsonStorage::DirectoryPath& directory)
{
auto linkPath = std::filesystem::path(directory) / "reportLink";
std::filesystem::create_directories(std::filesystem::path(directory) /
"report");
std::filesystem::create_directory_symlink(originalFile.parent_path(),
linkPath);
return interfaces::JsonStorage::FilePath(linkPath /
originalFile.filename());
}
};
template <typename T>
class TestPersistentJsonStorageWithSymlink : public TestPersistentJsonStorage
{
public:
TestPersistentJsonStorageWithSymlink()
{
std::ofstream file(dummyReportPath);
file << "{}";
file.close();
linkPath = T::setupSymlinks(dummyReportPath, directory);
}
static void SetUpTestSuite()
{
TestPersistentJsonStorage::SetUpTestSuite();
ASSERT_FALSE(std::filesystem::exists(dummyReportPath));
}
void TearDown() override
{
TestPersistentJsonStorage::TearDown();
if (std::filesystem::exists(dummyReportPath))
{
std::filesystem::remove(dummyReportPath);
}
}
static const std::filesystem::path dummyReportPath;
interfaces::JsonStorage::FilePath linkPath;
};
template <typename T>
const std::filesystem::path
TestPersistentJsonStorageWithSymlink<T>::dummyReportPath =
std::filesystem::temp_directory_path() / "report.json";
using SymlinkTypes = Types<TestFileSymlink, TestDirectorySymlink>;
TYPED_TEST_SUITE(TestPersistentJsonStorageWithSymlink, SymlinkTypes);
TYPED_TEST(TestPersistentJsonStorageWithSymlink, symlinksAreNotListed)
{
ASSERT_THAT(TestPersistentJsonStorage::sut.list(), UnorderedElementsAre());
}
TYPED_TEST(TestPersistentJsonStorageWithSymlink, throwsWhenStoreTargetIsSymlink)
{
ASSERT_THROW(TestPersistentJsonStorage::sut.store(TestFixture::linkPath,
nlohmann::json("data")),
std::runtime_error);
ASSERT_THAT(TestPersistentJsonStorage::sut.list(), UnorderedElementsAre());
}
TYPED_TEST(TestPersistentJsonStorageWithSymlink,
returnsNulloptWhenFileIsSymlink)
{
ASSERT_THAT(TestPersistentJsonStorage::sut.load(TestFixture::linkPath),
Eq(std::nullopt));
}
TYPED_TEST(TestPersistentJsonStorageWithSymlink,
returnsFalseWhenTryingToDeleteSymlink)
{
EXPECT_THAT(TestPersistentJsonStorage::sut.remove(TestFixture::linkPath),
Eq(false));
EXPECT_TRUE(std::filesystem::exists(TestFixture::linkPath));
EXPECT_TRUE(std::filesystem::exists(TestFixture::dummyReportPath));
}