xref: /openbmc/telemetry/tests/src/test_metric.cpp (revision 405c1e4b)
1 #include "helpers.hpp"
2 #include "metric.hpp"
3 #include "mocks/sensor_mock.hpp"
4 #include "utils/conv_container.hpp"
5 #include "utils/conversion.hpp"
6 #include "utils/tstring.hpp"
7 
8 #include <gmock/gmock.h>
9 
10 using namespace testing;
11 namespace tstring = utils::tstring;
12 
13 using Timestamp = uint64_t;
14 
15 class TestMetric : public Test
16 {
17   public:
18     std::shared_ptr<SensorMock> sensorMock =
19         std::make_shared<NiceMock<SensorMock>>();
20 
21     std::shared_ptr<Metric> sut = std::make_shared<Metric>(
22         sensorMock, OperationType::avg, "id", "metadata");
23 };
24 
25 TEST_F(TestMetric, subscribesForSensorDuringInitialization)
26 {
27     EXPECT_CALL(*sensorMock,
28                 registerForUpdates(Truly([sut = sut.get()](const auto& a0) {
29                     return a0.lock().get() == sut;
30                 })));
31 
32     sut->initialize();
33 }
34 
35 TEST_F(TestMetric, containsEmptyReadingAfterCreated)
36 {
37     ASSERT_THAT(sut->getReading(), MetricValue({"id", "metadata", 0., 0u}));
38 }
39 
40 class TestMetricAfterInitialization : public TestMetric
41 {
42   public:
43     TestMetricAfterInitialization()
44     {
45         sut->initialize();
46     }
47 };
48 
49 TEST_F(TestMetricAfterInitialization, containsEmptyReading)
50 {
51     ASSERT_THAT(sut->getReading(), MetricValue({"id", "metadata", 0., 0u}));
52 }
53 
54 TEST_F(TestMetricAfterInitialization, updatesMetricValuesOnSensorUpdate)
55 {
56     sut->sensorUpdated(*sensorMock, Timestamp{18}, 31.2);
57 
58     ASSERT_THAT(sut->getReading(),
59                 Eq(MetricValue{"id", "metadata", 31.2, 18u}));
60 }
61 
62 TEST_F(TestMetricAfterInitialization,
63        throwsWhenUpdateIsPerformedOnUnknownSensor)
64 {
65     auto sensor = std::make_shared<StrictMock<SensorMock>>();
66     EXPECT_THROW(sut->sensorUpdated(*sensor, Timestamp{10}), std::out_of_range);
67     EXPECT_THROW(sut->sensorUpdated(*sensor, Timestamp{10}, 20.0),
68                  std::out_of_range);
69 }
70 
71 TEST_F(TestMetricAfterInitialization, containsIdInConfigurationDump)
72 {
73     const auto conf = sut->dumpConfiguration();
74 
75     EXPECT_THAT(conf.at_label<utils::tstring::Id>(), Eq("id"));
76     EXPECT_THAT(conf.to_json().at(tstring::Id::str()),
77                 Eq(nlohmann::json("id")));
78 }
79 
80 TEST_F(TestMetricAfterInitialization, containsOpInJsonDump)
81 {
82     const auto conf = sut->dumpConfiguration();
83 
84     EXPECT_THAT(conf.at_label<utils::tstring::OperationType>(),
85                 Eq(OperationType::avg));
86     EXPECT_THAT(conf.to_json().at(tstring::OperationType::str()),
87                 Eq(nlohmann::json(utils::toUnderlying(OperationType::avg))));
88 }
89 
90 TEST_F(TestMetricAfterInitialization, containsMetadataInJsonDump)
91 {
92     const auto conf = sut->dumpConfiguration();
93 
94     EXPECT_THAT(conf.at_label<utils::tstring::MetricMetadata>(),
95                 Eq("metadata"));
96     EXPECT_THAT(conf.to_json().at(tstring::MetricMetadata::str()),
97                 Eq(nlohmann::json("metadata")));
98 }
99 
100 TEST_F(TestMetricAfterInitialization, containsSensorPathInJsonDump)
101 {
102     ON_CALL(*sensorMock, id())
103         .WillByDefault(Return(SensorMock::makeId("service1", "path1")));
104 
105     const auto conf = sut->dumpConfiguration();
106 
107     EXPECT_THAT(conf.at_label<utils::tstring::SensorPath>(),
108                 Eq(LabeledSensorParameters("service1", "path1")));
109     EXPECT_THAT(
110         conf.to_json().at(tstring::SensorPath::str()),
111         Eq(nlohmann::json({{"service", "service1"}, {"path", "path1"}})));
112 }
113