xref: /openbmc/phosphor-led-sysfs/test/sysfs.cpp (revision b6779846)
1 /**
2  * Copyright © 2019 IBM Corporation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "sysfs.hpp"
18 
19 #include <sys/param.h>
20 
21 #include <cerrno>
22 #include <cstdlib>
23 #include <fstream>
24 
25 #include <gtest/gtest.h>
26 
27 namespace fs = std::filesystem;
28 
29 constexpr unsigned long maxBrightnessVal = 128;
30 
31 class FakeSysfsLed : public phosphor::led::SysfsLed
32 {
33   public:
34     FakeSysfsLed(FakeSysfsLed& other) = delete;
35     FakeSysfsLed(FakeSysfsLed&& other) = delete;
36     FakeSysfsLed& operator=(FakeSysfsLed& other) = delete;
37     FakeSysfsLed&& operator=(FakeSysfsLed&& other) = delete;
38 
39     static FakeSysfsLed create()
40     {
41         static constexpr auto tmplt = "/tmp/FakeSysfsLed.XXXXXX";
42         std::array<char, MAXPATHLEN> buffer = {0};
43 
44         strncpy(buffer.data(), tmplt, buffer.size() - 1);
45         char* dir = mkdtemp(buffer.data());
46         if (dir == nullptr)
47         {
48             throw std::system_error(errno, std::system_category());
49         }
50 
51         return FakeSysfsLed(fs::path(dir));
52     }
53 
54     ~FakeSysfsLed() override
55     {
56         fs::remove_all(root);
57     }
58 
59   private:
60     explicit FakeSysfsLed(fs::path&& path) : SysfsLed(std::move(path))
61     {
62         static constexpr auto attrs = {attrBrightness, attrTrigger, attrDelayOn,
63                                        attrDelayOff};
64         for (const auto& attr : attrs)
65         {
66             fs::path p = root / attr;
67             std::ofstream f(p, std::ios::out);
68             f.exceptions(std::ofstream::failbit);
69         }
70 
71         fs::path p = root / attrMaxBrightness;
72         std::ofstream f(p, std::ios::out);
73         f.exceptions(std::ofstream::failbit);
74         f << maxBrightnessVal;
75     }
76 };
77 
78 TEST(Sysfs, getBrightness)
79 {
80     constexpr unsigned long brightness = 127;
81     FakeSysfsLed fsl = FakeSysfsLed::create();
82 
83     fsl.setBrightness(brightness);
84     ASSERT_EQ(brightness, fsl.getBrightness());
85 }
86 
87 TEST(Sysfs, getMaxBrightness)
88 {
89     FakeSysfsLed fsl = FakeSysfsLed::create();
90 
91     ASSERT_EQ(maxBrightnessVal, fsl.getMaxBrightness());
92 }
93 
94 TEST(Sysfs, getTrigger)
95 {
96     FakeSysfsLed fsl = FakeSysfsLed::create();
97 
98     // We need to set the complete attribute value in UT, Because the LED driver
99     // is not called in UT to automatically set `none` to `[none] xxx yyy`
100     fsl.setTrigger("[none] timer heartbeat default-on");
101     ASSERT_EQ("none", fsl.getTrigger());
102 }
103 
104 TEST(Sysfs, getTriggerBlink)
105 {
106     FakeSysfsLed fsl = FakeSysfsLed::create();
107     fsl.setTrigger("none [timer] heartbeat default-on");
108     ASSERT_EQ("timer", fsl.getTrigger());
109 }
110 
111 TEST(Sysfs, getDelayOn)
112 {
113     constexpr unsigned long delayOn = 250;
114     FakeSysfsLed fsl = FakeSysfsLed::create();
115 
116     fsl.setDelayOn(delayOn);
117     ASSERT_EQ(delayOn, fsl.getDelayOn());
118 }
119 
120 TEST(Sysfs, getDelayOff)
121 {
122     constexpr unsigned long delayOff = 750;
123     FakeSysfsLed fsl = FakeSysfsLed::create();
124 
125     fsl.setDelayOff(delayOff);
126     ASSERT_EQ(delayOff, fsl.getDelayOff());
127 }
128