1 #include <Utils.hpp> 2 3 #include <array> 4 #include <filesystem> 5 #include <fstream> 6 7 #include <gtest/gtest.h> 8 9 namespace fs = std::filesystem; 10 class TestUtils : public testing::Test 11 { 12 public: 13 std::string testDir; 14 fs::path hwmonDir; 15 fs::path peciDir; 16 TestUtils() 17 { 18 // Create test environment 19 auto dir = std::to_array("./testDirXXXXXX"); 20 testDir = mkdtemp(dir.data()); 21 22 if (testDir.empty()) 23 { 24 throw std::bad_alloc(); 25 } 26 hwmonDir = fs::path(testDir) / "hwmon"; 27 fs::create_directory(hwmonDir); 28 auto hwmon10 = hwmonDir / "hwmon10"; 29 fs::create_directory(hwmonDir / "hwmon10"); 30 std::ofstream{hwmon10 / "temp1_input"}; 31 std::ofstream{hwmon10 / "temp1_min"}; 32 std::ofstream{hwmon10 / "temp1_max"}; 33 std::ofstream{hwmon10 / "temp2_input"}; 34 createPECIDir(); 35 } 36 37 ~TestUtils() override 38 { 39 fs::remove_all(testDir); 40 } 41 42 TestUtils(const TestUtils&) = delete; 43 TestUtils(TestUtils&&) = delete; 44 TestUtils& operator=(const TestUtils&) = delete; 45 TestUtils& operator=(TestUtils&&) = delete; 46 47 void createPECIDir() 48 { 49 peciDir = fs::path(testDir) / "peci"; 50 auto peci0 = 51 peciDir / "peci-0/device/0-30/peci-cputemp.0/hwmon/hwmon25"; 52 fs::create_directories(peci0); 53 std::ofstream{peci0 / "temp0_input"}; 54 std::ofstream{peci0 / "temp1_input"}; 55 std::ofstream{peci0 / "temp2_input"}; 56 std::ofstream{peci0 / "name"}; 57 auto devDir = peciDir / "peci-0/peci_dev/peci-0"; 58 fs::create_directories(devDir); 59 fs::create_directory_symlink("../../../peci-0", devDir / "device"); 60 fs::create_directory_symlink("device/0-30", peciDir / "peci-0/0-30"); 61 62 // Let's keep this for debugging purpose 63 for (auto p = fs::recursive_directory_iterator( 64 peciDir, fs::directory_options::follow_directory_symlink); 65 p != fs::recursive_directory_iterator(); ++p) 66 { 67 std::string path = p->path().string(); 68 std::cerr << path << "\n"; 69 if (p.depth() >= 6) 70 { 71 p.disable_recursion_pending(); 72 } 73 } 74 } 75 }; 76 77 TEST_F(TestUtils, findFiles_non_exist) 78 { 79 std::vector<fs::path> foundPaths; 80 auto ret = findFiles("non-exist", "", foundPaths); 81 82 EXPECT_FALSE(ret); 83 EXPECT_TRUE(foundPaths.empty()); 84 } 85 86 TEST_F(TestUtils, findFiles_in_hwmon_no_match) 87 { 88 std::vector<fs::path> foundPaths; 89 auto ret = findFiles(hwmonDir, R"(in\d+_input)", foundPaths); 90 91 EXPECT_TRUE(ret); 92 EXPECT_EQ(foundPaths.size(), 0u); 93 } 94 95 TEST_F(TestUtils, findFiles_in_hwmon_match) 96 { 97 std::vector<fs::path> foundPaths; 98 auto ret = findFiles(hwmonDir, R"(temp\d+_input)", foundPaths); 99 100 EXPECT_TRUE(ret); 101 EXPECT_EQ(foundPaths.size(), 2u); 102 } 103 104 TEST_F(TestUtils, findFiles_in_peci_no_match) 105 { 106 std::vector<fs::path> foundPaths; 107 auto ret = 108 findFiles(peciDir, R"(peci-\d+/\d+-.+/peci-.+/hwmon/hwmon\d+/aaa$)", 109 foundPaths, 6); 110 111 EXPECT_TRUE(ret); 112 EXPECT_TRUE(foundPaths.empty()); 113 } 114 115 TEST_F(TestUtils, findFiles_in_peci_match) 116 { 117 std::vector<fs::path> foundPaths; 118 auto ret = 119 findFiles(peciDir, R"(peci-\d+/\d+-.+/peci-.+/hwmon/hwmon\d+/name$)", 120 foundPaths, 6); 121 EXPECT_TRUE(ret); 122 EXPECT_EQ(foundPaths.size(), 1u); 123 124 foundPaths.clear(); 125 126 ret = findFiles(peciDir, 127 R"(peci-\d+/\d+-.+/peci-.+/hwmon/hwmon\d+/temp\d+_input)", 128 foundPaths, 6); 129 EXPECT_TRUE(ret); 130 EXPECT_EQ(foundPaths.size(), 3u); 131 } 132 133 TEST_F(TestUtils, findFiles_hwmonPath_end_with_slash) 134 { 135 std::string p = hwmonDir.string() + "/"; 136 std::vector<fs::path> foundPaths; 137 auto ret = findFiles(p, R"(temp\d+_input)", foundPaths); 138 139 EXPECT_TRUE(ret); 140 EXPECT_EQ(foundPaths.size(), 2u); 141 } 142 143 TEST_F(TestUtils, findFiles_peciPath_end_with_slash) 144 { 145 std::string p = peciDir.string() + "/"; 146 std::vector<fs::path> foundPaths; 147 auto ret = 148 findFiles(p, R"(peci-\d+/\d+-.+/peci-.+/hwmon/hwmon\d+/temp\d+_input)", 149 foundPaths, 6); 150 151 EXPECT_TRUE(ret); 152 EXPECT_EQ(foundPaths.size(), 3u); 153 } 154 155 TEST_F(TestUtils, findFiles_in_sub_peci_match) 156 { 157 std::vector<fs::path> foundPaths; 158 auto ret = 159 findFiles(peciDir / "peci-0", R"(\d+-.+/peci-.+/hwmon/hwmon\d+/name$)", 160 foundPaths, 5); 161 EXPECT_TRUE(ret); 162 EXPECT_EQ(foundPaths.size(), 1u); 163 164 foundPaths.clear(); 165 166 ret = findFiles(peciDir / "peci-0", 167 R"(\d+-.+/peci-.+/hwmon/hwmon\d+/temp\d+_input)", 168 foundPaths, 5); 169 EXPECT_TRUE(ret); 170 EXPECT_EQ(foundPaths.size(), 3u); 171 } 172