xref: /openbmc/telemetry/tests/src/test_sensor_cache.cpp (revision 7f06f613fff4eb4d84f74ce9d0dc5c68211f6ab1)
1 #include "mocks/sensor_mock.hpp"
2 #include "sensor_cache.hpp"
3 
4 #include <initializer_list>
5 
6 #include <gmock/gmock.h>
7 
8 using namespace testing;
9 
10 class TestSensorCache : public Test
11 {
12   public:
13     SensorCache sut;
14 };
15 
16 auto sensorIdEq(interfaces::Sensor::Id id)
17 {
18     return AllOf(Field(&interfaces::Sensor::Id::type, Eq(id.type)),
19                  Field(&interfaces::Sensor::Id::service, Eq(id.service)),
20                  Field(&interfaces::Sensor::Id::path, Eq(id.path)));
21 }
22 
23 struct IdParam
24 {
25     IdParam() = default;
26     IdParam(std::string_view service, std::string_view path) :
27         service(service), path(path)
28     {}
29 
30     std::string service;
31     std::string path;
32 };
33 
34 class TestSensorCacheP :
35     public TestSensorCache,
36     public WithParamInterface<std::vector<IdParam>>
37 {
38   public:
39     void SetUp() override
40     {
41         auto vec = GetParam();
42         ASSERT_THAT(vec, SizeIs(param.size()));
43         std::copy(vec.begin(), vec.end(), param.begin());
44     }
45 
46     template <size_t index>
47     const IdParam& id() const
48     {
49         static_assert(index < std::tuple_size_v<decltype(param)>);
50         return param[index];
51     }
52 
53   private:
54     std::array<IdParam, 2> param;
55 };
56 
57 INSTANTIATE_TEST_SUITE_P(
58     UniqueIds, TestSensorCacheP,
59     Values(std::vector<IdParam>({IdParam("service1", "path1"),
60                                  IdParam("service1", "path2")}),
61            std::vector<IdParam>({IdParam("service1", "path1"),
62                                  IdParam("service2", "path1")}),
63            std::vector<IdParam>({IdParam("service1", "path1"),
64                                  IdParam("service2", "path2")})));
65 
66 TEST_P(TestSensorCacheP, shouldReturnDifferentSensorWhenIdsAreDifferent)
67 {
68     auto sensor1 =
69         sut.makeSensor<NiceMock<SensorMock>>(id<0>().service, id<0>().path);
70     auto sensor2 =
71         sut.makeSensor<NiceMock<SensorMock>>(id<1>().service, id<1>().path);
72 
73     ASSERT_THAT(sensor1.get(), Not(Eq(sensor2.get())));
74     ASSERT_THAT(sensor1->mockId, Not(Eq(sensor2->mockId)));
75 }
76 
77 TEST_F(TestSensorCache, shouldReturnSameSensorWhenSensorWithSameIdStillExists)
78 {
79     auto sensor1 =
80         sut.makeSensor<NiceMock<SensorMock>>("sensor-service", "sensor-path");
81     auto sensor2 =
82         sut.makeSensor<NiceMock<SensorMock>>("sensor-service", "sensor-path");
83 
84     ASSERT_THAT(sensor1.get(), Eq(sensor2.get()));
85     ASSERT_THAT(sensor1->mockId, Eq(sensor2->mockId));
86 }
87 
88 TEST_F(TestSensorCache, shouldReturnDifferentSensorWhenPreviousSensorExpired)
89 {
90     auto mockId1 =
91         sut.makeSensor<NiceMock<SensorMock>>("sensor-service", "sensor-path")
92             ->mockId;
93     auto mockId2 =
94         sut.makeSensor<NiceMock<SensorMock>>("sensor-service", "sensor-path")
95             ->mockId;
96 
97     ASSERT_THAT(mockId2, Not(Eq(mockId1)));
98 }
99 
100 TEST_F(TestSensorCache, shouldCreateSensorWithCorrespondingId)
101 {
102     auto id =
103         sut.makeSensor<NiceMock<SensorMock>>("sensor-service", "sensor-path")
104             ->id();
105 
106     auto expected = SensorMock::makeId("sensor-service", "sensor-path");
107 
108     ASSERT_THAT(id, sensorIdEq(expected));
109 }
110