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