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