blob: 8e67a2eae608603c1929c666b0c3075ee22d78d9 [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));
}
class TestPersistentJsonStorageWithSymlink : public TestPersistentJsonStorage
{
public:
TestPersistentJsonStorageWithSymlink()
{
std::ofstream file(dummyReportPath);
file << "{}";
file.close();
std::filesystem::create_directories(std::filesystem::path(directory) /
"report");
std::filesystem::create_symlink(dummyReportPath,
std::filesystem::path(directory) /
"report/symlink.json");
}
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;
};
const std::filesystem::path
TestPersistentJsonStorageWithSymlink::dummyReportPath =
std::filesystem::temp_directory_path() / "report";
TEST_F(TestPersistentJsonStorageWithSymlink, symlinksAreNotListed)
{
ASSERT_THAT(sut.list(), UnorderedElementsAre());
}
TEST_F(TestPersistentJsonStorageWithSymlink, throwsWhenStoreTargetIsSymlink)
{
ASSERT_THROW(
sut.store(FilePath("report/symlink.json"), nlohmann::json("data")),
std::runtime_error);
ASSERT_THAT(sut.list(), UnorderedElementsAre());
}
TEST_F(TestPersistentJsonStorageWithSymlink, returnsNulloptWhenFileIsSymlink)
{
ASSERT_THAT(sut.load(FilePath("report/symlink.json")), Eq(std::nullopt));
}
TEST_F(TestPersistentJsonStorageWithSymlink,
returnsFalseWhenTryingToDeleteSymlink)
{
EXPECT_THAT(sut.remove(FilePath("report/symlink.json")), Eq(false));
EXPECT_TRUE(std::filesystem::exists(std::filesystem::path(directory) /
"report/symlink.json"));
EXPECT_TRUE(std::filesystem::exists(dummyReportPath));
}