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