1 #include "env_mock.hpp" 2 #include "gpio_mock.hpp" 3 #include "hwmonio_mock.hpp" 4 #include "sensor.hpp" 5 6 #include <gpioplus/test/handle.hpp> 7 8 #include <memory> 9 #include <utility> 10 11 #include <gmock/gmock.h> 12 #include <gtest/gtest.h> 13 14 namespace env 15 { 16 17 // Delegate all calls to getEnv() to the mock 18 const char* EnvImpl::get(const char* key) const 19 { 20 return mockEnv.get(key); 21 } 22 23 EnvImpl env_impl; 24 25 } // namespace env 26 27 class SensorTest : public ::testing::Test 28 { 29 protected: 30 void SetUp() override 31 { 32 gpioIntf = nullptr; 33 } 34 35 std::string temp = "temp"; 36 std::string five = "5"; 37 }; 38 39 using ::testing::Eq; 40 using ::testing::Invoke; 41 using ::testing::Pair; 42 using ::testing::Return; 43 using ::testing::StrEq; 44 using ::testing::StrictMock; 45 46 TEST_F(SensorTest, BasicConstructorTest) 47 { 48 /* Constructor test with nothing in an rcList or GPIO chip. */ 49 auto sensorKey = std::make_pair(temp, five); 50 std::unique_ptr<hwmonio::HwmonIOInterface> hwmonio_mock = 51 std::make_unique<hwmonio::HwmonIOMock>(); 52 std::string path = "/"; 53 54 /* Always calls GPIOCHIP and GPIO checks, returning empty string. */ 55 EXPECT_CALL(env::mockEnv, get(StrEq("GPIOCHIP_temp5"))) 56 .WillOnce(Return("")); 57 EXPECT_CALL(env::mockEnv, get(StrEq("GPIO_temp5"))).WillOnce(Return("")); 58 59 /* Always calls GAIN and OFFSET, can use ON_CALL instead of EXPECT_CALL */ 60 EXPECT_CALL(env::mockEnv, get(StrEq("GAIN_temp5"))).WillOnce(Return("")); 61 EXPECT_CALL(env::mockEnv, get(StrEq("OFFSET_temp5"))).WillOnce(Return("")); 62 EXPECT_CALL(env::mockEnv, get(StrEq("REMOVERCS_temp5"))) 63 .WillOnce(Return("")); 64 65 auto sensor = std::make_unique<sensor::Sensor>(sensorKey, 66 hwmonio_mock.get(), path); 67 EXPECT_FALSE(sensor == nullptr); 68 } 69 70 TEST_F(SensorTest, SensorRequiresGpio) 71 { 72 /* Constructor test with only the GPIO chip set. */ 73 74 StrictMock<GpioHandleMock> gMock; 75 gpioIntf = &gMock; 76 77 /* The following piece of code can probably be copied above once it's 78 * working. 79 */ 80 auto handleMock = std::make_unique<gpioplus::test::HandleMock>(); 81 82 auto sensorKey = std::make_pair(temp, five); 83 std::unique_ptr<hwmonio::HwmonIOInterface> hwmonio_mock = 84 std::make_unique<hwmonio::HwmonIOMock>(); 85 std::string path = "/"; 86 87 EXPECT_CALL(env::mockEnv, get(StrEq("GPIOCHIP_temp5"))) 88 .WillOnce(Return("chipA")); 89 EXPECT_CALL(env::mockEnv, get(StrEq("GPIO_temp5"))).WillOnce(Return("5")); 90 91 EXPECT_CALL(gMock, build(StrEq("chipA"), StrEq("5"))) 92 .WillOnce(Invoke([&](const std::string&, const std::string&) { 93 return std::move(handleMock); 94 })); 95 96 /* Always calls GAIN and OFFSET, can use ON_CALL instead of EXPECT_CALL */ 97 EXPECT_CALL(env::mockEnv, get(StrEq("GAIN_temp5"))).WillOnce(Return("")); 98 EXPECT_CALL(env::mockEnv, get(StrEq("OFFSET_temp5"))).WillOnce(Return("")); 99 EXPECT_CALL(env::mockEnv, get(StrEq("REMOVERCS_temp5"))) 100 .WillOnce(Return("")); 101 102 auto sensor = std::make_unique<sensor::Sensor>(sensorKey, 103 hwmonio_mock.get(), path); 104 EXPECT_FALSE(sensor == nullptr); 105 } 106 107 TEST_F(SensorTest, SensorHasGainAndOffsetAdjustValue) 108 { 109 /* Construct a sensor that has a gain and offset, then verify they are used 110 * when adjusting the value. 111 */ 112 113 auto sensorKey = std::make_pair(temp, five); 114 std::unique_ptr<hwmonio::HwmonIOInterface> hwmonio_mock = 115 std::make_unique<hwmonio::HwmonIOMock>(); 116 std::string path = "/"; 117 118 /* Always calls GPIOCHIP_temp5 and GPIO checks, returning empty string. */ 119 EXPECT_CALL(env::mockEnv, get(StrEq("GPIOCHIP_temp5"))) 120 .WillOnce(Return("")); 121 EXPECT_CALL(env::mockEnv, get(StrEq("GPIO_temp5"))).WillOnce(Return("")); 122 123 EXPECT_CALL(env::mockEnv, get(StrEq("GAIN_temp5"))).WillOnce(Return("10")); 124 EXPECT_CALL(env::mockEnv, get(StrEq("OFFSET_temp5"))) 125 .WillOnce(Return("15")); 126 EXPECT_CALL(env::mockEnv, get(StrEq("REMOVERCS_temp5"))) 127 .WillOnce(Return("")); 128 129 auto sensor = std::make_unique<sensor::Sensor>(sensorKey, 130 hwmonio_mock.get(), path); 131 EXPECT_FALSE(sensor == nullptr); 132 133 double startingValue = 1.0; 134 double resultValue = sensor->adjustValue(startingValue); 135 EXPECT_DOUBLE_EQ(resultValue, 25.0); 136 } 137