| #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 |