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