Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c63d6c2a authored by Olivier Gaillard's avatar Olivier Gaillard Committed by Android (Google) Code Review
Browse files

Merge "Fix test: the event should be from the previous bucket"

parents 2d0c0e78 3061ca23
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -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
+79 −23
Original line number Original line Diff line number Diff line
@@ -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);
@@ -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();
@@ -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) {