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