Loading cmds/statsd/src/metrics/ValueMetricProducer.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -238,6 +238,8 @@ private: FRIEND_TEST(ValueMetricProducerTest, TestInvalidBucketWhenOneConditionFailed); FRIEND_TEST(ValueMetricProducerTest, TestInvalidBucketWhenOneConditionFailed); FRIEND_TEST(ValueMetricProducerTest, TestInvalidBucketWhenInitialPullFailed); FRIEND_TEST(ValueMetricProducerTest, TestInvalidBucketWhenInitialPullFailed); FRIEND_TEST(ValueMetricProducerTest, TestInvalidBucketWhenLastPullFailed); FRIEND_TEST(ValueMetricProducerTest, TestInvalidBucketWhenLastPullFailed); FRIEND_TEST(ValueMetricProducerTest, TestResetBaseOnPullDelayExceeded); FRIEND_TEST(ValueMetricProducerTest, TestBaseSetOnConditionChange); }; }; } // namespace statsd } // namespace statsd Loading cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp +79 −23 Original line number Original line Diff line number Diff line Loading @@ -2110,7 +2110,7 @@ TEST(ValueMetricProducerTest, TestResetBaseOnPullFailBeforeConditionChange) { EXPECT_EQ(false, valueProducer.mHasGlobalBase); EXPECT_EQ(false, valueProducer.mHasGlobalBase); } } TEST(ValueMetricProducerTest, TestResetBaseOnPullTooLate) { TEST(ValueMetricProducerTest, TestResetBaseOnPullDelayExceeded) { ValueMetric metric; ValueMetric metric; metric.set_id(metricId); metric.set_id(metricId); metric.set_bucket(ONE_MINUTE); metric.set_bucket(ONE_MINUTE); Loading @@ -2133,7 +2133,7 @@ TEST(ValueMetricProducerTest, TestResetBaseOnPullTooLate) { EXPECT_CALL(*pullerManager, Pull(tagId, _)) EXPECT_CALL(*pullerManager, Pull(tagId, _)) .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->clear(); shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 1); shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 1); event->write(tagId); event->write(tagId); event->write(120); event->write(120); event->init(); event->init(); Loading @@ -2145,35 +2145,91 @@ TEST(ValueMetricProducerTest, TestResetBaseOnPullTooLate) { eventMatcherWizard, tagId, bucketStartTimeNs, eventMatcherWizard, tagId, bucketStartTimeNs, bucketStartTimeNs, pullerManager); bucketStartTimeNs, pullerManager); valueProducer.mCondition = true; valueProducer.mCondition = false; valueProducer.mHasGlobalBase = true; vector<shared_ptr<LogEvent>> allData; // Max delay is set to 0 so pull will exceed max delay. allData.clear(); valueProducer.onConditionChanged(true, bucketStartTimeNs + 1); shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 1); EXPECT_EQ(0UL, valueProducer.mCurrentSlicedBucket.size()); event->write(1); } event->write(110); TEST(ValueMetricProducerTest, TestResetBaseOnPullTooLate) { ValueMetric metric; metric.set_id(metricId); metric.set_bucket(ONE_MINUTE); metric.mutable_value_field()->set_field(tagId); metric.mutable_value_field()->add_child()->set_field(2); metric.set_condition(StringToId("SCREEN_ON")); metric.set_max_pull_delay_sec(INT_MAX); UidMap uidMap; SimpleAtomMatcher atomMatcher; atomMatcher.set_atom_id(tagId); sp<EventMatcherWizard> eventMatcherWizard = new EventMatcherWizard({new SimpleLogMatchingTracker( atomMatcherId, logEventMatcherIndex, atomMatcher, uidMap)}); sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return()); EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillRepeatedly(Return()); ValueMetricProducer valueProducer(kConfigKey, metric, 1, wizard, logEventMatcherIndex, eventMatcherWizard, tagId, bucket2StartTimeNs, bucket2StartTimeNs, pullerManager); valueProducer.mCondition = false; // Event should be skipped since it is from previous bucket. // Pull should not be called. valueProducer.onConditionChanged(true, bucketStartTimeNs); EXPECT_EQ(0UL, valueProducer.mCurrentSlicedBucket.size()); } TEST(ValueMetricProducerTest, TestBaseSetOnConditionChange) { ValueMetric metric; metric.set_id(metricId); metric.set_bucket(ONE_MINUTE); metric.mutable_value_field()->set_field(tagId); metric.mutable_value_field()->add_child()->set_field(2); metric.set_condition(StringToId("SCREEN_ON")); metric.set_max_pull_delay_sec(INT_MAX); UidMap uidMap; SimpleAtomMatcher atomMatcher; atomMatcher.set_atom_id(tagId); sp<EventMatcherWizard> eventMatcherWizard = new EventMatcherWizard({new SimpleLogMatchingTracker( atomMatcherId, logEventMatcherIndex, atomMatcher, uidMap)}); sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return()); EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillRepeatedly(Return()); EXPECT_CALL(*pullerManager, Pull(tagId, _)) .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { data->clear(); shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 1); event->write(tagId); event->write(100); event->init(); event->init(); allData.push_back(event); data->push_back(event); valueProducer.onDataPulled(allData, /** succeed */ true); return true; })); // has one slice ValueMetricProducer valueProducer(kConfigKey, metric, 1, wizard, logEventMatcherIndex, eventMatcherWizard, tagId, bucketStartTimeNs, bucketStartTimeNs, pullerManager); valueProducer.mCondition = false; valueProducer.mHasGlobalBase = false; valueProducer.onConditionChanged(true, bucketStartTimeNs + 1); valueProducer.mHasGlobalBase = true; EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size()); EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size()); ValueMetricProducer::Interval& curInterval = ValueMetricProducer::Interval& curInterval = valueProducer.mCurrentSlicedBucket.begin()->second[0]; valueProducer.mCurrentSlicedBucket.begin()->second[0]; EXPECT_EQ(true, curInterval.hasBase); EXPECT_EQ(true, curInterval.hasBase); EXPECT_EQ(110, curInterval.base.long_value); EXPECT_EQ(100, curInterval.base.long_value); EXPECT_EQ(false, curInterval.hasValue); EXPECT_EQ(false, curInterval.hasValue); EXPECT_EQ(0UL, valueProducer.mPastBuckets.size()); EXPECT_EQ(true, valueProducer.mHasGlobalBase); EXPECT_EQ(true, valueProducer.mHasGlobalBase); valueProducer.onConditionChanged(false, bucket2StartTimeNs + 1); // has one slice EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size()); EXPECT_EQ(false, curInterval.hasValue); EXPECT_EQ(false, curInterval.hasBase); EXPECT_EQ(false, valueProducer.mHasGlobalBase); } } TEST(ValueMetricProducerTest, TestInvalidBucketWhenOneConditionFailed) { TEST(ValueMetricProducerTest, TestInvalidBucketWhenOneConditionFailed) { Loading Loading
cmds/statsd/src/metrics/ValueMetricProducer.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -238,6 +238,8 @@ private: FRIEND_TEST(ValueMetricProducerTest, TestInvalidBucketWhenOneConditionFailed); FRIEND_TEST(ValueMetricProducerTest, TestInvalidBucketWhenOneConditionFailed); FRIEND_TEST(ValueMetricProducerTest, TestInvalidBucketWhenInitialPullFailed); FRIEND_TEST(ValueMetricProducerTest, TestInvalidBucketWhenInitialPullFailed); FRIEND_TEST(ValueMetricProducerTest, TestInvalidBucketWhenLastPullFailed); FRIEND_TEST(ValueMetricProducerTest, TestInvalidBucketWhenLastPullFailed); FRIEND_TEST(ValueMetricProducerTest, TestResetBaseOnPullDelayExceeded); FRIEND_TEST(ValueMetricProducerTest, TestBaseSetOnConditionChange); }; }; } // namespace statsd } // namespace statsd Loading
cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp +79 −23 Original line number Original line Diff line number Diff line Loading @@ -2110,7 +2110,7 @@ TEST(ValueMetricProducerTest, TestResetBaseOnPullFailBeforeConditionChange) { EXPECT_EQ(false, valueProducer.mHasGlobalBase); EXPECT_EQ(false, valueProducer.mHasGlobalBase); } } TEST(ValueMetricProducerTest, TestResetBaseOnPullTooLate) { TEST(ValueMetricProducerTest, TestResetBaseOnPullDelayExceeded) { ValueMetric metric; ValueMetric metric; metric.set_id(metricId); metric.set_id(metricId); metric.set_bucket(ONE_MINUTE); metric.set_bucket(ONE_MINUTE); Loading @@ -2133,7 +2133,7 @@ TEST(ValueMetricProducerTest, TestResetBaseOnPullTooLate) { EXPECT_CALL(*pullerManager, Pull(tagId, _)) EXPECT_CALL(*pullerManager, Pull(tagId, _)) .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->clear(); shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 1); shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 1); event->write(tagId); event->write(tagId); event->write(120); event->write(120); event->init(); event->init(); Loading @@ -2145,35 +2145,91 @@ TEST(ValueMetricProducerTest, TestResetBaseOnPullTooLate) { eventMatcherWizard, tagId, bucketStartTimeNs, eventMatcherWizard, tagId, bucketStartTimeNs, bucketStartTimeNs, pullerManager); bucketStartTimeNs, pullerManager); valueProducer.mCondition = true; valueProducer.mCondition = false; valueProducer.mHasGlobalBase = true; vector<shared_ptr<LogEvent>> allData; // Max delay is set to 0 so pull will exceed max delay. allData.clear(); valueProducer.onConditionChanged(true, bucketStartTimeNs + 1); shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 1); EXPECT_EQ(0UL, valueProducer.mCurrentSlicedBucket.size()); event->write(1); } event->write(110); TEST(ValueMetricProducerTest, TestResetBaseOnPullTooLate) { ValueMetric metric; metric.set_id(metricId); metric.set_bucket(ONE_MINUTE); metric.mutable_value_field()->set_field(tagId); metric.mutable_value_field()->add_child()->set_field(2); metric.set_condition(StringToId("SCREEN_ON")); metric.set_max_pull_delay_sec(INT_MAX); UidMap uidMap; SimpleAtomMatcher atomMatcher; atomMatcher.set_atom_id(tagId); sp<EventMatcherWizard> eventMatcherWizard = new EventMatcherWizard({new SimpleLogMatchingTracker( atomMatcherId, logEventMatcherIndex, atomMatcher, uidMap)}); sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return()); EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillRepeatedly(Return()); ValueMetricProducer valueProducer(kConfigKey, metric, 1, wizard, logEventMatcherIndex, eventMatcherWizard, tagId, bucket2StartTimeNs, bucket2StartTimeNs, pullerManager); valueProducer.mCondition = false; // Event should be skipped since it is from previous bucket. // Pull should not be called. valueProducer.onConditionChanged(true, bucketStartTimeNs); EXPECT_EQ(0UL, valueProducer.mCurrentSlicedBucket.size()); } TEST(ValueMetricProducerTest, TestBaseSetOnConditionChange) { ValueMetric metric; metric.set_id(metricId); metric.set_bucket(ONE_MINUTE); metric.mutable_value_field()->set_field(tagId); metric.mutable_value_field()->add_child()->set_field(2); metric.set_condition(StringToId("SCREEN_ON")); metric.set_max_pull_delay_sec(INT_MAX); UidMap uidMap; SimpleAtomMatcher atomMatcher; atomMatcher.set_atom_id(tagId); sp<EventMatcherWizard> eventMatcherWizard = new EventMatcherWizard({new SimpleLogMatchingTracker( atomMatcherId, logEventMatcherIndex, atomMatcher, uidMap)}); sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return()); EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillRepeatedly(Return()); EXPECT_CALL(*pullerManager, Pull(tagId, _)) .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { data->clear(); shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 1); event->write(tagId); event->write(100); event->init(); event->init(); allData.push_back(event); data->push_back(event); valueProducer.onDataPulled(allData, /** succeed */ true); return true; })); // has one slice ValueMetricProducer valueProducer(kConfigKey, metric, 1, wizard, logEventMatcherIndex, eventMatcherWizard, tagId, bucketStartTimeNs, bucketStartTimeNs, pullerManager); valueProducer.mCondition = false; valueProducer.mHasGlobalBase = false; valueProducer.onConditionChanged(true, bucketStartTimeNs + 1); valueProducer.mHasGlobalBase = true; EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size()); EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size()); ValueMetricProducer::Interval& curInterval = ValueMetricProducer::Interval& curInterval = valueProducer.mCurrentSlicedBucket.begin()->second[0]; valueProducer.mCurrentSlicedBucket.begin()->second[0]; EXPECT_EQ(true, curInterval.hasBase); EXPECT_EQ(true, curInterval.hasBase); EXPECT_EQ(110, curInterval.base.long_value); EXPECT_EQ(100, curInterval.base.long_value); EXPECT_EQ(false, curInterval.hasValue); EXPECT_EQ(false, curInterval.hasValue); EXPECT_EQ(0UL, valueProducer.mPastBuckets.size()); EXPECT_EQ(true, valueProducer.mHasGlobalBase); EXPECT_EQ(true, valueProducer.mHasGlobalBase); valueProducer.onConditionChanged(false, bucket2StartTimeNs + 1); // has one slice EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size()); EXPECT_EQ(false, curInterval.hasValue); EXPECT_EQ(false, curInterval.hasBase); EXPECT_EQ(false, valueProducer.mHasGlobalBase); } } TEST(ValueMetricProducerTest, TestInvalidBucketWhenOneConditionFailed) { TEST(ValueMetricProducerTest, TestInvalidBucketWhenOneConditionFailed) { Loading