xref: /openbmc/dbus-sensors/tests/test_Utils.cpp (revision d3204145)
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