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