xref: /openbmc/dbus-sensors/src/tests/test_Utils.cpp (revision 6198435dc2bc6e07b46e32465876815d4ea86437)
1d7be555eSGeorge Liu #include "Utils.hpp"
2d7be555eSGeorge Liu 
3*6198435dSGeorge Liu #include <phosphor-logging/lg2.hpp>
4*6198435dSGeorge Liu 
5d7be555eSGeorge Liu #include <array>
6d7be555eSGeorge Liu #include <cstddef>
7d7be555eSGeorge Liu #include <cstdint>
8d7be555eSGeorge Liu #include <cstdlib>
9d7be555eSGeorge Liu #include <filesystem>
10d7be555eSGeorge Liu #include <fstream>
11d7be555eSGeorge Liu #include <new>
12d7be555eSGeorge Liu #include <string>
13d7be555eSGeorge Liu #include <vector>
14d7be555eSGeorge Liu 
15d7be555eSGeorge Liu #include <gtest/gtest.h>
16d7be555eSGeorge Liu 
17d7be555eSGeorge Liu class TestUtils : public testing::Test
18d7be555eSGeorge Liu {
19d7be555eSGeorge Liu   public:
20d7be555eSGeorge Liu     std::string testDir;
212e466967SEd Tanous     std::filesystem::path hwmonDir;
222e466967SEd Tanous     std::filesystem::path peciDir;
TestUtils()23d7be555eSGeorge Liu     TestUtils()
24d7be555eSGeorge Liu     {
25d7be555eSGeorge Liu         // Create test environment
26d7be555eSGeorge Liu         auto dir = std::to_array("./testDirXXXXXX");
27d7be555eSGeorge Liu         testDir = mkdtemp(dir.data());
28d7be555eSGeorge Liu 
29d7be555eSGeorge Liu         if (testDir.empty())
30d7be555eSGeorge Liu         {
31d7be555eSGeorge Liu             throw std::bad_alloc();
32d7be555eSGeorge Liu         }
332e466967SEd Tanous         hwmonDir = std::filesystem::path(testDir) / "hwmon";
342e466967SEd Tanous         std::filesystem::create_directory(hwmonDir);
35d7be555eSGeorge Liu         auto hwmon10 = hwmonDir / "hwmon10";
362e466967SEd Tanous         std::filesystem::create_directory(hwmonDir / "hwmon10");
37d7be555eSGeorge Liu         {
38d7be555eSGeorge Liu             std::ofstream temp1Input{hwmon10 / "temp1_input"};
39d7be555eSGeorge Liu             std::ofstream temp1Min{hwmon10 / "temp1_min"};
40d7be555eSGeorge Liu             std::ofstream temp1Max{hwmon10 / "temp1_max"};
41d7be555eSGeorge Liu             std::ofstream temp2Input{hwmon10 / "temp2_input"};
42d7be555eSGeorge Liu         }
43d7be555eSGeorge Liu         createPECIDir();
44d7be555eSGeorge Liu     }
45d7be555eSGeorge Liu 
~TestUtils()46d7be555eSGeorge Liu     ~TestUtils() override
47d7be555eSGeorge Liu     {
482e466967SEd Tanous         std::filesystem::remove_all(testDir);
49d7be555eSGeorge Liu     }
50d7be555eSGeorge Liu 
51d7be555eSGeorge Liu     TestUtils(const TestUtils&) = delete;
52d7be555eSGeorge Liu     TestUtils(TestUtils&&) = delete;
53d7be555eSGeorge Liu     TestUtils& operator=(const TestUtils&) = delete;
54d7be555eSGeorge Liu     TestUtils& operator=(TestUtils&&) = delete;
55d7be555eSGeorge Liu 
createPECIDir()56d7be555eSGeorge Liu     void createPECIDir()
57d7be555eSGeorge Liu     {
582e466967SEd Tanous         peciDir = std::filesystem::path(testDir) / "peci";
59d7be555eSGeorge Liu         auto peci0 = peciDir /
60d7be555eSGeorge Liu                      "peci-0/device/0-30/peci-cputemp.0/hwmon/hwmon25";
612e466967SEd Tanous         std::filesystem::create_directories(peci0);
62d7be555eSGeorge Liu         {
63d7be555eSGeorge Liu             std::ofstream temp0Input{peci0 / "temp0_input"};
64d7be555eSGeorge Liu             std::ofstream temp1Input{peci0 / "temp1_input"};
65d7be555eSGeorge Liu             std::ofstream temp2Input{peci0 / "temp2_input"};
66d7be555eSGeorge Liu             std::ofstream name{peci0 / "name"};
67d7be555eSGeorge Liu         }
68d7be555eSGeorge Liu         auto devDir = peciDir / "peci-0/peci_dev/peci-0";
692e466967SEd Tanous         std::filesystem::create_directories(devDir);
702e466967SEd Tanous         std::filesystem::create_directory_symlink("../../../peci-0",
712e466967SEd Tanous                                                   devDir / "device");
722e466967SEd Tanous         std::filesystem::create_directory_symlink("device/0-30",
732e466967SEd Tanous                                                   peciDir / "peci-0/0-30");
74d7be555eSGeorge Liu 
75d7be555eSGeorge Liu         // Let's keep this for debugging purpose
762e466967SEd Tanous         for (auto p = std::filesystem::recursive_directory_iterator(
772e466967SEd Tanous                  peciDir,
782e466967SEd Tanous                  std::filesystem::directory_options::follow_directory_symlink);
792e466967SEd Tanous              p != std::filesystem::recursive_directory_iterator(); ++p)
80d7be555eSGeorge Liu         {
81d7be555eSGeorge Liu             std::string path = p->path().string();
82*6198435dSGeorge Liu             lg2::info("{PATH}", "PATH", path);
83d7be555eSGeorge Liu             if (p.depth() >= 6)
84d7be555eSGeorge Liu             {
85d7be555eSGeorge Liu                 p.disable_recursion_pending();
86d7be555eSGeorge Liu             }
87d7be555eSGeorge Liu         }
88d7be555eSGeorge Liu     }
89d7be555eSGeorge Liu };
90d7be555eSGeorge Liu 
TEST_F(TestUtils,findFiles_non_exist)91d7be555eSGeorge Liu TEST_F(TestUtils, findFiles_non_exist)
92d7be555eSGeorge Liu {
932e466967SEd Tanous     std::vector<std::filesystem::path> foundPaths;
94d7be555eSGeorge Liu     auto ret = findFiles("non-exist", "", foundPaths);
95d7be555eSGeorge Liu 
96d7be555eSGeorge Liu     EXPECT_FALSE(ret);
97d7be555eSGeorge Liu     EXPECT_TRUE(foundPaths.empty());
98d7be555eSGeorge Liu }
99d7be555eSGeorge Liu 
TEST_F(TestUtils,findFiles_in_hwmon_no_match)100d7be555eSGeorge Liu TEST_F(TestUtils, findFiles_in_hwmon_no_match)
101d7be555eSGeorge Liu {
1022e466967SEd Tanous     std::vector<std::filesystem::path> foundPaths;
103d7be555eSGeorge Liu     auto ret = findFiles(hwmonDir, R"(in\d+_input)", foundPaths);
104d7be555eSGeorge Liu 
105d7be555eSGeorge Liu     EXPECT_TRUE(ret);
106d7be555eSGeorge Liu     EXPECT_EQ(foundPaths.size(), 0U);
107d7be555eSGeorge Liu }
108d7be555eSGeorge Liu 
TEST_F(TestUtils,findFiles_in_hwmon_match)109d7be555eSGeorge Liu TEST_F(TestUtils, findFiles_in_hwmon_match)
110d7be555eSGeorge Liu {
1112e466967SEd Tanous     std::vector<std::filesystem::path> foundPaths;
112d7be555eSGeorge Liu     auto ret = findFiles(hwmonDir, R"(temp\d+_input)", foundPaths);
113d7be555eSGeorge Liu 
114d7be555eSGeorge Liu     EXPECT_TRUE(ret);
115d7be555eSGeorge Liu     EXPECT_EQ(foundPaths.size(), 2U);
116d7be555eSGeorge Liu }
117d7be555eSGeorge Liu 
TEST_F(TestUtils,findFiles_in_peci_no_match)118d7be555eSGeorge Liu TEST_F(TestUtils, findFiles_in_peci_no_match)
119d7be555eSGeorge Liu {
1202e466967SEd Tanous     std::vector<std::filesystem::path> foundPaths;
121d7be555eSGeorge Liu     auto ret =
122d7be555eSGeorge Liu         findFiles(peciDir, R"(peci-\d+/\d+-.+/peci-.+/hwmon/hwmon\d+/aaa$)",
123d7be555eSGeorge Liu                   foundPaths, 6);
124d7be555eSGeorge Liu 
125d7be555eSGeorge Liu     EXPECT_TRUE(ret);
126d7be555eSGeorge Liu     EXPECT_TRUE(foundPaths.empty());
127d7be555eSGeorge Liu }
128d7be555eSGeorge Liu 
TEST_F(TestUtils,findFiles_in_peci_match)129d7be555eSGeorge Liu TEST_F(TestUtils, findFiles_in_peci_match)
130d7be555eSGeorge Liu {
1312e466967SEd Tanous     std::vector<std::filesystem::path> foundPaths;
132d7be555eSGeorge Liu     auto ret =
133d7be555eSGeorge Liu         findFiles(peciDir, R"(peci-\d+/\d+-.+/peci-.+/hwmon/hwmon\d+/name$)",
134d7be555eSGeorge Liu                   foundPaths, 6);
135d7be555eSGeorge Liu     EXPECT_TRUE(ret);
136d7be555eSGeorge Liu     EXPECT_EQ(foundPaths.size(), 1U);
137d7be555eSGeorge Liu 
138d7be555eSGeorge Liu     foundPaths.clear();
139d7be555eSGeorge Liu 
140d7be555eSGeorge Liu     ret = findFiles(peciDir,
141d7be555eSGeorge Liu                     R"(peci-\d+/\d+-.+/peci-.+/hwmon/hwmon\d+/temp\d+_input)",
142d7be555eSGeorge Liu                     foundPaths, 6);
143d7be555eSGeorge Liu     EXPECT_TRUE(ret);
144d7be555eSGeorge Liu     EXPECT_EQ(foundPaths.size(), 3U);
145d7be555eSGeorge Liu }
146d7be555eSGeorge Liu 
TEST_F(TestUtils,findFiles_hwmonPath_end_with_slash)147d7be555eSGeorge Liu TEST_F(TestUtils, findFiles_hwmonPath_end_with_slash)
148d7be555eSGeorge Liu {
149d7be555eSGeorge Liu     std::string p = hwmonDir.string() + "/";
1502e466967SEd Tanous     std::vector<std::filesystem::path> foundPaths;
151d7be555eSGeorge Liu     auto ret = findFiles(p, R"(temp\d+_input)", foundPaths);
152d7be555eSGeorge Liu 
153d7be555eSGeorge Liu     EXPECT_TRUE(ret);
154d7be555eSGeorge Liu     EXPECT_EQ(foundPaths.size(), 2U);
155d7be555eSGeorge Liu }
156d7be555eSGeorge Liu 
TEST_F(TestUtils,findFiles_peciPath_end_with_slash)157d7be555eSGeorge Liu TEST_F(TestUtils, findFiles_peciPath_end_with_slash)
158d7be555eSGeorge Liu {
159d7be555eSGeorge Liu     std::string p = peciDir.string() + "/";
1602e466967SEd Tanous     std::vector<std::filesystem::path> foundPaths;
161d7be555eSGeorge Liu     auto ret =
162d7be555eSGeorge Liu         findFiles(p, R"(peci-\d+/\d+-.+/peci-.+/hwmon/hwmon\d+/temp\d+_input)",
163d7be555eSGeorge Liu                   foundPaths, 6);
164d7be555eSGeorge Liu 
165d7be555eSGeorge Liu     EXPECT_TRUE(ret);
166d7be555eSGeorge Liu     EXPECT_EQ(foundPaths.size(), 3U);
167d7be555eSGeorge Liu }
168d7be555eSGeorge Liu 
TEST_F(TestUtils,findFiles_in_sub_peci_match)169d7be555eSGeorge Liu TEST_F(TestUtils, findFiles_in_sub_peci_match)
170d7be555eSGeorge Liu {
1712e466967SEd Tanous     std::vector<std::filesystem::path> foundPaths;
172d7be555eSGeorge Liu     auto ret =
173d7be555eSGeorge Liu         findFiles(peciDir / "peci-0", R"(\d+-.+/peci-.+/hwmon/hwmon\d+/name$)",
174d7be555eSGeorge Liu                   foundPaths, 5);
175d7be555eSGeorge Liu     EXPECT_TRUE(ret);
176d7be555eSGeorge Liu     EXPECT_EQ(foundPaths.size(), 1U);
177d7be555eSGeorge Liu 
178d7be555eSGeorge Liu     foundPaths.clear();
179d7be555eSGeorge Liu 
180d7be555eSGeorge Liu     ret = findFiles(peciDir / "peci-0",
181d7be555eSGeorge Liu                     R"(\d+-.+/peci-.+/hwmon/hwmon\d+/temp\d+_input)",
182d7be555eSGeorge Liu                     foundPaths, 5);
183d7be555eSGeorge Liu     EXPECT_TRUE(ret);
184d7be555eSGeorge Liu     EXPECT_EQ(foundPaths.size(), 3U);
185d7be555eSGeorge Liu }
186d7be555eSGeorge Liu 
TEST(GetDeviceBusAddrTest,DevNameInvalid)187d7be555eSGeorge Liu TEST(GetDeviceBusAddrTest, DevNameInvalid)
188d7be555eSGeorge Liu {
189d7be555eSGeorge Liu     size_t bus = 0;
190d7be555eSGeorge Liu     size_t addr = 0;
191d7be555eSGeorge Liu     std::string devName;
192d7be555eSGeorge Liu 
193d7be555eSGeorge Liu     auto ret = getDeviceBusAddr(devName, bus, addr);
194d7be555eSGeorge Liu     EXPECT_FALSE(ret);
195d7be555eSGeorge Liu 
196d7be555eSGeorge Liu     devName = "NoHyphen";
197d7be555eSGeorge Liu     ret = getDeviceBusAddr(devName, bus, addr);
198d7be555eSGeorge Liu     EXPECT_FALSE(ret);
199d7be555eSGeorge Liu 
200d7be555eSGeorge Liu     devName = "pwm-fan";
201d7be555eSGeorge Liu     ret = getDeviceBusAddr(devName, bus, addr);
202d7be555eSGeorge Liu     EXPECT_FALSE(ret);
203d7be555eSGeorge Liu }
204d7be555eSGeorge Liu 
TEST(GetDeviceBusAddrTest,BusInvalid)205d7be555eSGeorge Liu TEST(GetDeviceBusAddrTest, BusInvalid)
206d7be555eSGeorge Liu {
207d7be555eSGeorge Liu     size_t bus = 0;
208d7be555eSGeorge Liu     size_t addr = 0;
209d7be555eSGeorge Liu     std::string devName = "FF-00FF";
210d7be555eSGeorge Liu 
211d7be555eSGeorge Liu     auto ret = getDeviceBusAddr(devName, bus, addr);
212d7be555eSGeorge Liu     EXPECT_FALSE(ret);
213d7be555eSGeorge Liu }
214d7be555eSGeorge Liu 
TEST(GetDeviceBusAddrTest,AddrInvalid)215d7be555eSGeorge Liu TEST(GetDeviceBusAddrTest, AddrInvalid)
216d7be555eSGeorge Liu {
217d7be555eSGeorge Liu     size_t bus = 0;
218d7be555eSGeorge Liu     size_t addr = 0;
219d7be555eSGeorge Liu     std::string devName = "12-fan";
220d7be555eSGeorge Liu 
221d7be555eSGeorge Liu     auto ret = getDeviceBusAddr(devName, bus, addr);
222d7be555eSGeorge Liu     EXPECT_FALSE(ret);
223d7be555eSGeorge Liu }
224d7be555eSGeorge Liu 
TEST(GetDeviceBusAddrTest,I3CBusAddrValid)225d7be555eSGeorge Liu TEST(GetDeviceBusAddrTest, I3CBusAddrValid)
226d7be555eSGeorge Liu {
227d7be555eSGeorge Liu     uint64_t bus = 0;
228d7be555eSGeorge Liu     uint64_t provisionedId = 0;
229d7be555eSGeorge Liu     std::string devName = "0-22400000001";
230d7be555eSGeorge Liu 
231d7be555eSGeorge Liu     auto ret = getDeviceBusAddr(devName, bus, provisionedId);
232d7be555eSGeorge Liu     EXPECT_TRUE(ret);
233d7be555eSGeorge Liu     EXPECT_EQ(bus, 0);
234d7be555eSGeorge Liu     EXPECT_EQ(provisionedId, 0x22400000001);
235d7be555eSGeorge Liu }
236d7be555eSGeorge Liu 
TEST(GetDeviceBusAddrTest,AllValid)237d7be555eSGeorge Liu TEST(GetDeviceBusAddrTest, AllValid)
238d7be555eSGeorge Liu {
239d7be555eSGeorge Liu     size_t bus = 0;
240d7be555eSGeorge Liu     size_t addr = 0;
241d7be555eSGeorge Liu     std::string devName = "12-00af";
242d7be555eSGeorge Liu 
243d7be555eSGeorge Liu     auto ret = getDeviceBusAddr(devName, bus, addr);
244d7be555eSGeorge Liu     EXPECT_TRUE(ret);
245d7be555eSGeorge Liu     EXPECT_EQ(bus, 12);
246d7be555eSGeorge Liu     EXPECT_EQ(addr, 0xaf);
247d7be555eSGeorge Liu }
248