blob: a43bf12de427b0b1b12402f52079ab0fca88f9d3 [file] [log] [blame]
#include "config.h"
#include "mockups.hpp"
#include "utils.hpp"
#include <chrono>
#include <filesystem>
#include <fstream>
#include <memory>
#include <optional>
#include <string>
#include <string_view>
#include <thread>
#include <gtest/gtest.h>
namespace boot_time_monitor
{
namespace
{
namespace fs = std::filesystem;
TEST(DoesUtilWorkTest, Works)
{
Util u;
auto curUpTime = u.getUpTimeInMs();
auto curWallTime = u.getWallTimeInMs();
std::this_thread::sleep_for(std::chrono::seconds(2));
ASSERT_NE(curUpTime, std::nullopt);
ASSERT_GT(curUpTime.value(), 0);
EXPECT_GT(u.getUpTimeInMs().value_or(-1), curUpTime);
EXPECT_GT(u.getWallTimeInMs(), curWallTime);
}
TEST(ValidNameTest, Valid)
{
Util u;
EXPECT_TRUE(u.isValidName("0129"));
EXPECT_TRUE(u.isValidName("ABCZ"));
EXPECT_TRUE(u.isValidName("abcz"));
EXPECT_TRUE(u.isValidName("____"));
EXPECT_TRUE(u.isValidName("A_a_1_"));
EXPECT_FALSE(u.isValidName("A-_a_1_"));
EXPECT_FALSE(u.isValidName("A_a*_1_"));
EXPECT_FALSE(u.isValidName("A_a_1@_"));
EXPECT_FALSE(u.isValidName("A#_a_1_"));
EXPECT_FALSE(u.isValidName("A_a _1_"));
}
TEST(getPathTest, Works)
{
Util u;
EXPECT_EQ(u.getCPPath("host0", false),
std::string(bootTimeDataDir) + "host0_checkpoints.csv");
EXPECT_EQ(u.getCPPath("bmc", false),
std::string(bootTimeDataDir) + "bmc_checkpoints.csv");
EXPECT_EQ(u.getCPPath("_N_o_d_e_", false),
std::string(bootTimeDataDir) + "_N_o_d_e__checkpoints.csv");
EXPECT_EQ(u.getCPPath("host0", true),
std::string(bootTimeDataDir) + "host0_checkpoints.csv.completed");
EXPECT_EQ(u.getCPPath("bmc", true),
std::string(bootTimeDataDir) + "bmc_checkpoints.csv.completed");
EXPECT_EQ(u.getCPPath("_N_o_d_e_", true),
std::string(bootTimeDataDir) +
"_N_o_d_e__checkpoints.csv.completed");
EXPECT_EQ(u.getDurPath("host0", false),
std::string(bootTimeDataDir) + "host0_durations.csv");
EXPECT_EQ(u.getDurPath("bmc", false),
std::string(bootTimeDataDir) + "bmc_durations.csv");
EXPECT_EQ(u.getDurPath("_N_o_d_e_", false),
std::string(bootTimeDataDir) + "_N_o_d_e__durations.csv");
EXPECT_EQ(u.getDurPath("host0", true),
std::string(bootTimeDataDir) + "host0_durations.csv.completed");
EXPECT_EQ(u.getDurPath("bmc", true),
std::string(bootTimeDataDir) + "bmc_durations.csv.completed");
EXPECT_EQ(u.getDurPath("_N_o_d_e_", true),
std::string(bootTimeDataDir) +
"_N_o_d_e__durations.csv.completed");
}
TEST(DoesFileUtilWork, CheckpointWorks)
{
constexpr std::string_view cpName = "temp_cp";
const std::string cpCompleted = std::string{cpName} + kCompletedSuffix;
// Clean previous test result
fs::remove(cpName);
fs::remove(cpCompleted);
FileUtil cpUtil(cpName);
EXPECT_TRUE(cpUtil.isEmpty());
cpUtil.addCheckpoint("checkpoint_10", 10, 20);
cpUtil.addCheckpoint("checkpoint_30", 30, 50);
EXPECT_FALSE(cpUtil.isEmpty());
// Completed data should be empty
EXPECT_TRUE(cpUtil.loadCheckpoints(true)->empty());
auto vec = cpUtil.loadCheckpoints(false);
EXPECT_EQ(vec->size(), 2);
EXPECT_EQ((*vec)[0].name, "checkpoint_10");
EXPECT_EQ((*vec)[0].wallTime, 10);
EXPECT_EQ((*vec)[0].monoTime, 20);
EXPECT_EQ((*vec)[1].name, "checkpoint_30");
EXPECT_EQ((*vec)[1].wallTime, 30);
EXPECT_EQ((*vec)[1].monoTime, 50);
cpUtil.completeCurrent();
// Current data should be empty
EXPECT_TRUE(cpUtil.loadCheckpoints(false)->empty());
EXPECT_TRUE(cpUtil.isEmpty());
// Check completed data
vec = cpUtil.loadCheckpoints(true);
EXPECT_EQ(vec->size(), 2);
EXPECT_EQ((*vec)[0].name, "checkpoint_10");
EXPECT_EQ((*vec)[0].wallTime, 10);
EXPECT_EQ((*vec)[0].monoTime, 20);
EXPECT_EQ((*vec)[1].name, "checkpoint_30");
EXPECT_EQ((*vec)[1].wallTime, 30);
EXPECT_EQ((*vec)[1].monoTime, 50);
// Check file content
std::string input = "";
std::ifstream ifs(cpCompleted);
ASSERT_TRUE(ifs.good());
ifs >> input;
EXPECT_EQ(input, "checkpoint_10,10,20");
ifs >> input;
EXPECT_EQ(input, "checkpoint_30,30,50");
EXPECT_FALSE(ifs >> input);
ifs.close();
}
TEST(DoesFileUtilWork, DurationWorks)
{
constexpr std::string_view durName = "temp_dur";
const std::string durCompleted = std::string{durName} + kCompletedSuffix;
// Clean previous test result
fs::remove(durName);
fs::remove(durCompleted);
FileUtil durUtil(durName);
EXPECT_TRUE(durUtil.isEmpty());
durUtil.addDuration("duration_1000", 1000);
durUtil.addDuration("duration_3000", 3000);
EXPECT_FALSE(durUtil.isEmpty());
// Completed data should be empty
EXPECT_TRUE(durUtil.loadDurations(true)->empty());
auto vec = durUtil.loadDurations(false);
EXPECT_EQ(vec->size(), 2);
EXPECT_EQ((*vec)[0].name, "duration_1000");
EXPECT_EQ((*vec)[0].duration, 1000);
EXPECT_EQ((*vec)[1].name, "duration_3000");
EXPECT_EQ((*vec)[1].duration, 3000);
durUtil.completeCurrent();
// Current data should be empty
EXPECT_TRUE(durUtil.loadDurations(false)->empty());
EXPECT_TRUE(durUtil.isEmpty());
// Check completed data
vec = durUtil.loadDurations(true);
EXPECT_EQ(vec->size(), 2);
EXPECT_EQ((*vec)[0].name, "duration_1000");
EXPECT_EQ((*vec)[0].duration, 1000);
EXPECT_EQ((*vec)[1].name, "duration_3000");
EXPECT_EQ((*vec)[1].duration, 3000);
// Check file content
std::string input = "";
std::ifstream ifs(durCompleted);
ASSERT_TRUE(ifs.good());
ifs >> input;
EXPECT_EQ(input, "duration_1000,1000");
ifs >> input;
EXPECT_EQ(input, "duration_3000,3000");
EXPECT_FALSE(ifs >> input);
ifs.close();
}
} // namespace
} // namespace boot_time_monitor