blob: c9fe2523c577d520b10e5d95a8cd876b571d2557 [file] [log] [blame]
Yangsterf2bee6f2017-11-29 12:01:05 -08001// 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-macb8144812018-01-04 10:56:23 -080016#include "src/stats_log_util.h"
Yangsterf2bee6f2017-11-29 12:01:05 -080017#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
27using namespace android::os::statsd;
28using namespace testing;
29using android::sp;
30using std::set;
31using std::unordered_map;
32using std::vector;
33
34#ifdef __ANDROID__
35
36namespace android {
37namespace os {
38namespace statsd {
39
Yangster-mac94e197c2018-01-02 16:03:03 -080040const ConfigKey kConfigKey(0, 12345);
Yangsterf2bee6f2017-11-29 12:01:05 -080041
42TEST(DurationMetricTrackerTest, TestNoCondition) {
43 sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
44 uint64_t bucketStartTimeNs = 10000000000;
Yangster-macb8144812018-01-04 10:56:23 -080045 int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
Yangsterf2bee6f2017-11-29 12:01:05 -080046
47 DurationMetric metric;
Yangster-mac94e197c2018-01-02 16:03:03 -080048 metric.set_id(1);
Yangster-macb8144812018-01-04 10:56:23 -080049 metric.set_bucket(ONE_MINUTE);
Yangsterf2bee6f2017-11-29 12:01:05 -080050 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-mac20877162017-12-22 17:19:39 -080056 FieldMatcher dimensions;
Yangsterf2bee6f2017-11-29 12:01:05 -080057 DurationMetricProducer durationProducer(
58 kConfigKey, metric, -1 /*no condition*/, 1 /* start index */, 2 /* stop index */,
Yangster-mac20877162017-12-22 17:19:39 -080059 3 /* stop_all index */, false /*nesting*/, wizard, dimensions, bucketStartTimeNs);
Yangsterf2bee6f2017-11-29 12:01:05 -080060
Chenjie Yua7259ab2017-12-10 08:31:05 -080061 durationProducer.onMatchedLogEvent(1 /* start index*/, event1);
62 durationProducer.onMatchedLogEvent(2 /* stop index*/, event2);
Yangsterf2bee6f2017-11-29 12:01:05 -080063 durationProducer.flushIfNeededLocked(bucketStartTimeNs + 2 * bucketSizeNs + 1);
64 EXPECT_EQ(1UL, durationProducer.mPastBuckets.size());
Yangster-mac93694462018-01-22 20:49:31 -080065 EXPECT_TRUE(durationProducer.mPastBuckets.find(DEFAULT_METRIC_DIMENSION_KEY) !=
Yangsterf2bee6f2017-11-29 12:01:05 -080066 durationProducer.mPastBuckets.end());
Yangster-mac93694462018-01-22 20:49:31 -080067 const auto& buckets = durationProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY];
Yangsterf2bee6f2017-11-29 12:01:05 -080068 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
77TEST(DurationMetricTrackerTest, TestNonSlicedCondition) {
78 sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
79 uint64_t bucketStartTimeNs = 10000000000;
Yangster-macb8144812018-01-04 10:56:23 -080080 int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
Yangsterf2bee6f2017-11-29 12:01:05 -080081
82 DurationMetric metric;
Yangster-mac94e197c2018-01-02 16:03:03 -080083 metric.set_id(1);
Yangster-macb8144812018-01-04 10:56:23 -080084 metric.set_bucket(ONE_MINUTE);
Yangsterf2bee6f2017-11-29 12:01:05 -080085 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-mac20877162017-12-22 17:19:39 -080093 FieldMatcher dimensions;
Yangsterf2bee6f2017-11-29 12:01:05 -080094 DurationMetricProducer durationProducer(
Yao Chenf60e0ba2017-11-29 15:06:41 -080095 kConfigKey, metric, 0 /* condition index */, 1 /* start index */, 2 /* stop index */,
Yangster-mac20877162017-12-22 17:19:39 -080096 3 /* stop_all index */, false /*nesting*/, wizard, dimensions, bucketStartTimeNs);
Yangsterf2bee6f2017-11-29 12:01:05 -080097 EXPECT_FALSE(durationProducer.mCondition);
98 EXPECT_FALSE(durationProducer.isConditionSliced());
99
Chenjie Yua7259ab2017-12-10 08:31:05 -0800100 durationProducer.onMatchedLogEvent(1 /* start index*/, event1);
101 durationProducer.onMatchedLogEvent(2 /* stop index*/, event2);
Yangsterf2bee6f2017-11-29 12:01:05 -0800102 durationProducer.flushIfNeededLocked(bucketStartTimeNs + bucketSizeNs + 1);
Yao Chenf60e0ba2017-11-29 15:06:41 -0800103 EXPECT_EQ(0UL, durationProducer.mPastBuckets.size());
Yangsterf2bee6f2017-11-29 12:01:05 -0800104
Chenjie Yua7259ab2017-12-10 08:31:05 -0800105 durationProducer.onMatchedLogEvent(1 /* start index*/, event3);
Yangsterf2bee6f2017-11-29 12:01:05 -0800106 durationProducer.onConditionChanged(true /* condition */, bucketStartTimeNs + bucketSizeNs + 2);
Chenjie Yua7259ab2017-12-10 08:31:05 -0800107 durationProducer.onMatchedLogEvent(2 /* stop index*/, event4);
Yangsterf2bee6f2017-11-29 12:01:05 -0800108 durationProducer.flushIfNeededLocked(bucketStartTimeNs + 2 * bucketSizeNs + 1);
109 EXPECT_EQ(1UL, durationProducer.mPastBuckets.size());
Yangster-mac93694462018-01-22 20:49:31 -0800110 EXPECT_TRUE(durationProducer.mPastBuckets.find(DEFAULT_METRIC_DIMENSION_KEY) !=
Yangsterf2bee6f2017-11-29 12:01:05 -0800111 durationProducer.mPastBuckets.end());
Yangster-mac93694462018-01-22 20:49:31 -0800112 const auto& buckets2 = durationProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY];
Yangsterf2bee6f2017-11-29 12:01:05 -0800113 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
123GTEST_LOG_(INFO) << "This test does nothing.\n";
124#endif