Yangster | f2bee6f | 2017-11-29 12:01:05 -0800 | [diff] [blame] | 1 | // Copyright (C) 2017 The Android Open Source Project |
| 2 | // |
| 3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 | // you may not use this file except in compliance with the License. |
| 5 | // You may obtain a copy of the License at |
| 6 | // |
| 7 | // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 | // |
| 9 | // Unless required by applicable law or agreed to in writing, software |
| 10 | // distributed under the License is distributed on an "AS IS" BASIS, |
| 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 | // See the License for the specific language governing permissions and |
| 13 | // limitations under the License. |
| 14 | |
| 15 | #include "src/metrics/DurationMetricProducer.h" |
Yangster-mac | b814481 | 2018-01-04 10:56:23 -0800 | [diff] [blame] | 16 | #include "src/stats_log_util.h" |
Yangster | f2bee6f | 2017-11-29 12:01:05 -0800 | [diff] [blame] | 17 | #include "metrics_test_helper.h" |
| 18 | #include "src/condition/ConditionWizard.h" |
| 19 | |
| 20 | #include <gmock/gmock.h> |
| 21 | #include <gtest/gtest.h> |
| 22 | #include <stdio.h> |
| 23 | #include <set> |
| 24 | #include <unordered_map> |
| 25 | #include <vector> |
| 26 | |
| 27 | using namespace android::os::statsd; |
| 28 | using namespace testing; |
| 29 | using android::sp; |
| 30 | using std::set; |
| 31 | using std::unordered_map; |
| 32 | using std::vector; |
| 33 | |
| 34 | #ifdef __ANDROID__ |
| 35 | |
| 36 | namespace android { |
| 37 | namespace os { |
| 38 | namespace statsd { |
| 39 | |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 40 | const ConfigKey kConfigKey(0, 12345); |
Yangster | f2bee6f | 2017-11-29 12:01:05 -0800 | [diff] [blame] | 41 | |
| 42 | TEST(DurationMetricTrackerTest, TestNoCondition) { |
| 43 | sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>(); |
| 44 | uint64_t bucketStartTimeNs = 10000000000; |
Yangster-mac | b814481 | 2018-01-04 10:56:23 -0800 | [diff] [blame] | 45 | int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL; |
Yangster | f2bee6f | 2017-11-29 12:01:05 -0800 | [diff] [blame] | 46 | |
| 47 | DurationMetric metric; |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 48 | metric.set_id(1); |
Yangster-mac | b814481 | 2018-01-04 10:56:23 -0800 | [diff] [blame] | 49 | metric.set_bucket(ONE_MINUTE); |
Yangster | f2bee6f | 2017-11-29 12:01:05 -0800 | [diff] [blame] | 50 | metric.set_aggregation_type(DurationMetric_AggregationType_SUM); |
| 51 | |
| 52 | int tagId = 1; |
| 53 | LogEvent event1(tagId, bucketStartTimeNs + 1); |
| 54 | LogEvent event2(tagId, bucketStartTimeNs + bucketSizeNs + 2); |
| 55 | |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 56 | FieldMatcher dimensions; |
Yangster | f2bee6f | 2017-11-29 12:01:05 -0800 | [diff] [blame] | 57 | DurationMetricProducer durationProducer( |
| 58 | kConfigKey, metric, -1 /*no condition*/, 1 /* start index */, 2 /* stop index */, |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 59 | 3 /* stop_all index */, false /*nesting*/, wizard, dimensions, bucketStartTimeNs); |
Yangster | f2bee6f | 2017-11-29 12:01:05 -0800 | [diff] [blame] | 60 | |
Chenjie Yu | a7259ab | 2017-12-10 08:31:05 -0800 | [diff] [blame] | 61 | durationProducer.onMatchedLogEvent(1 /* start index*/, event1); |
| 62 | durationProducer.onMatchedLogEvent(2 /* stop index*/, event2); |
Yangster | f2bee6f | 2017-11-29 12:01:05 -0800 | [diff] [blame] | 63 | durationProducer.flushIfNeededLocked(bucketStartTimeNs + 2 * bucketSizeNs + 1); |
| 64 | EXPECT_EQ(1UL, durationProducer.mPastBuckets.size()); |
Yangster-mac | 9369446 | 2018-01-22 20:49:31 -0800 | [diff] [blame^] | 65 | EXPECT_TRUE(durationProducer.mPastBuckets.find(DEFAULT_METRIC_DIMENSION_KEY) != |
Yangster | f2bee6f | 2017-11-29 12:01:05 -0800 | [diff] [blame] | 66 | durationProducer.mPastBuckets.end()); |
Yangster-mac | 9369446 | 2018-01-22 20:49:31 -0800 | [diff] [blame^] | 67 | const auto& buckets = durationProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY]; |
Yangster | f2bee6f | 2017-11-29 12:01:05 -0800 | [diff] [blame] | 68 | EXPECT_EQ(2UL, buckets.size()); |
| 69 | EXPECT_EQ(bucketStartTimeNs, buckets[0].mBucketStartNs); |
| 70 | EXPECT_EQ(bucketStartTimeNs + bucketSizeNs, buckets[0].mBucketEndNs); |
| 71 | EXPECT_EQ(bucketSizeNs - 1ULL, buckets[0].mDuration); |
| 72 | EXPECT_EQ(bucketStartTimeNs + bucketSizeNs, buckets[1].mBucketStartNs); |
| 73 | EXPECT_EQ(bucketStartTimeNs + 2 * bucketSizeNs, buckets[1].mBucketEndNs); |
| 74 | EXPECT_EQ(2ULL, buckets[1].mDuration); |
| 75 | } |
| 76 | |
| 77 | TEST(DurationMetricTrackerTest, TestNonSlicedCondition) { |
| 78 | sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>(); |
| 79 | uint64_t bucketStartTimeNs = 10000000000; |
Yangster-mac | b814481 | 2018-01-04 10:56:23 -0800 | [diff] [blame] | 80 | int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL; |
Yangster | f2bee6f | 2017-11-29 12:01:05 -0800 | [diff] [blame] | 81 | |
| 82 | DurationMetric metric; |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 83 | metric.set_id(1); |
Yangster-mac | b814481 | 2018-01-04 10:56:23 -0800 | [diff] [blame] | 84 | metric.set_bucket(ONE_MINUTE); |
Yangster | f2bee6f | 2017-11-29 12:01:05 -0800 | [diff] [blame] | 85 | metric.set_aggregation_type(DurationMetric_AggregationType_SUM); |
| 86 | |
| 87 | int tagId = 1; |
| 88 | LogEvent event1(tagId, bucketStartTimeNs + 1); |
| 89 | LogEvent event2(tagId, bucketStartTimeNs + 2); |
| 90 | LogEvent event3(tagId, bucketStartTimeNs + bucketSizeNs + 1); |
| 91 | LogEvent event4(tagId, bucketStartTimeNs + bucketSizeNs + 3); |
| 92 | |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 93 | FieldMatcher dimensions; |
Yangster | f2bee6f | 2017-11-29 12:01:05 -0800 | [diff] [blame] | 94 | DurationMetricProducer durationProducer( |
Yao Chen | f60e0ba | 2017-11-29 15:06:41 -0800 | [diff] [blame] | 95 | kConfigKey, metric, 0 /* condition index */, 1 /* start index */, 2 /* stop index */, |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 96 | 3 /* stop_all index */, false /*nesting*/, wizard, dimensions, bucketStartTimeNs); |
Yangster | f2bee6f | 2017-11-29 12:01:05 -0800 | [diff] [blame] | 97 | EXPECT_FALSE(durationProducer.mCondition); |
| 98 | EXPECT_FALSE(durationProducer.isConditionSliced()); |
| 99 | |
Chenjie Yu | a7259ab | 2017-12-10 08:31:05 -0800 | [diff] [blame] | 100 | durationProducer.onMatchedLogEvent(1 /* start index*/, event1); |
| 101 | durationProducer.onMatchedLogEvent(2 /* stop index*/, event2); |
Yangster | f2bee6f | 2017-11-29 12:01:05 -0800 | [diff] [blame] | 102 | durationProducer.flushIfNeededLocked(bucketStartTimeNs + bucketSizeNs + 1); |
Yao Chen | f60e0ba | 2017-11-29 15:06:41 -0800 | [diff] [blame] | 103 | EXPECT_EQ(0UL, durationProducer.mPastBuckets.size()); |
Yangster | f2bee6f | 2017-11-29 12:01:05 -0800 | [diff] [blame] | 104 | |
Chenjie Yu | a7259ab | 2017-12-10 08:31:05 -0800 | [diff] [blame] | 105 | durationProducer.onMatchedLogEvent(1 /* start index*/, event3); |
Yangster | f2bee6f | 2017-11-29 12:01:05 -0800 | [diff] [blame] | 106 | durationProducer.onConditionChanged(true /* condition */, bucketStartTimeNs + bucketSizeNs + 2); |
Chenjie Yu | a7259ab | 2017-12-10 08:31:05 -0800 | [diff] [blame] | 107 | durationProducer.onMatchedLogEvent(2 /* stop index*/, event4); |
Yangster | f2bee6f | 2017-11-29 12:01:05 -0800 | [diff] [blame] | 108 | durationProducer.flushIfNeededLocked(bucketStartTimeNs + 2 * bucketSizeNs + 1); |
| 109 | EXPECT_EQ(1UL, durationProducer.mPastBuckets.size()); |
Yangster-mac | 9369446 | 2018-01-22 20:49:31 -0800 | [diff] [blame^] | 110 | EXPECT_TRUE(durationProducer.mPastBuckets.find(DEFAULT_METRIC_DIMENSION_KEY) != |
Yangster | f2bee6f | 2017-11-29 12:01:05 -0800 | [diff] [blame] | 111 | durationProducer.mPastBuckets.end()); |
Yangster-mac | 9369446 | 2018-01-22 20:49:31 -0800 | [diff] [blame^] | 112 | const auto& buckets2 = durationProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY]; |
Yangster | f2bee6f | 2017-11-29 12:01:05 -0800 | [diff] [blame] | 113 | EXPECT_EQ(1UL, buckets2.size()); |
| 114 | EXPECT_EQ(bucketStartTimeNs + bucketSizeNs, buckets2[0].mBucketStartNs); |
| 115 | EXPECT_EQ(bucketStartTimeNs + 2 * bucketSizeNs, buckets2[0].mBucketEndNs); |
| 116 | EXPECT_EQ(1ULL, buckets2[0].mDuration); |
| 117 | } |
| 118 | |
| 119 | } // namespace statsd |
| 120 | } // namespace os |
| 121 | } // namespace android |
| 122 | #else |
| 123 | GTEST_LOG_(INFO) << "This test does nothing.\n"; |
| 124 | #endif |