blob: 356e40b9b99d12c809f505df209f003813383a34 [file] [log] [blame]
Yao Chencaf339d2017-10-06 16:01:10 -07001// 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
Yao Chencaf339d2017-10-06 16:01:10 -070015#include <gtest/gtest.h>
Joe Onorato9fc9edf2017-10-15 20:08:52 -070016
17#include "src/condition/ConditionTracker.h"
18#include "src/matchers/LogMatchingTracker.h"
19#include "src/metrics/CountMetricProducer.h"
Yangster1d4d6862017-10-31 12:58:51 -070020#include "src/metrics/GaugeMetricProducer.h"
Joe Onorato9fc9edf2017-10-15 20:08:52 -070021#include "src/metrics/MetricProducer.h"
Chenjie Yub3dda412017-10-24 13:41:59 -070022#include "src/metrics/ValueMetricProducer.h"
Joe Onorato9fc9edf2017-10-15 20:08:52 -070023#include "src/metrics/metrics_manager_util.h"
Yangster-mac94e197c2018-01-02 16:03:03 -080024#include "statsd_test_util.h"
Yao Chencaf339d2017-10-06 16:01:10 -070025
26#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h"
27
28#include <stdio.h>
29#include <set>
30#include <unordered_map>
31#include <vector>
32
33using namespace android::os::statsd;
34using android::sp;
35using std::set;
36using std::unordered_map;
37using std::vector;
Stefan Lafon12d01fa2017-12-04 20:56:09 -080038using android::os::statsd::Predicate;
Yao Chencaf339d2017-10-06 16:01:10 -070039
40#ifdef __ANDROID__
41
Yangster-mac94e197c2018-01-02 16:03:03 -080042const ConfigKey kConfigKey(0, 12345);
Jeffrey Huang38d70262020-03-19 17:28:59 -070043const long kAlertId = 3;
Yao Chenb3561512017-11-21 18:07:17 -080044
Chenjie Yu85ed8382017-12-14 16:48:54 -080045const long timeBaseSec = 1000;
46
Yao Chencaf339d2017-10-06 16:01:10 -070047StatsdConfig buildGoodConfig() {
48 StatsdConfig config;
Yangster-mac94e197c2018-01-02 16:03:03 -080049 config.set_id(12345);
Yao Chencaf339d2017-10-06 16:01:10 -070050
Stefan Lafonb8c9aa82017-12-03 14:27:25 -080051 AtomMatcher* eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -080052 eventMatcher->set_id(StringToId("SCREEN_IS_ON"));
Yao Chencaf339d2017-10-06 16:01:10 -070053
Stefan Lafonb8c9aa82017-12-03 14:27:25 -080054 SimpleAtomMatcher* simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
Yangster-mac20877162017-12-22 17:19:39 -080055 simpleAtomMatcher->set_atom_id(2 /*SCREEN_STATE_CHANGE*/);
56 simpleAtomMatcher->add_field_value_matcher()->set_field(
Yao Chencaf339d2017-10-06 16:01:10 -070057 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE*/);
Yangster-mac20877162017-12-22 17:19:39 -080058 simpleAtomMatcher->mutable_field_value_matcher(0)->set_eq_int(
Yao Chencaf339d2017-10-06 16:01:10 -070059 2 /*SCREEN_STATE_CHANGE__DISPLAY_STATE__STATE_ON*/);
60
Stefan Lafonb8c9aa82017-12-03 14:27:25 -080061 eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -080062 eventMatcher->set_id(StringToId("SCREEN_IS_OFF"));
Yao Chencaf339d2017-10-06 16:01:10 -070063
Stefan Lafonb8c9aa82017-12-03 14:27:25 -080064 simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
Yangster-mac20877162017-12-22 17:19:39 -080065 simpleAtomMatcher->set_atom_id(2 /*SCREEN_STATE_CHANGE*/);
66 simpleAtomMatcher->add_field_value_matcher()->set_field(
Yao Chencaf339d2017-10-06 16:01:10 -070067 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE*/);
Yangster-mac20877162017-12-22 17:19:39 -080068 simpleAtomMatcher->mutable_field_value_matcher(0)->set_eq_int(
Yao Chencaf339d2017-10-06 16:01:10 -070069 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE__STATE_OFF*/);
70
Stefan Lafonb8c9aa82017-12-03 14:27:25 -080071 eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -080072 eventMatcher->set_id(StringToId("SCREEN_ON_OR_OFF"));
Yao Chencaf339d2017-10-06 16:01:10 -070073
Stefan Lafonb8c9aa82017-12-03 14:27:25 -080074 AtomMatcher_Combination* combination = eventMatcher->mutable_combination();
Yao Chencaf339d2017-10-06 16:01:10 -070075 combination->set_operation(LogicalOperation::OR);
Yangster-mac94e197c2018-01-02 16:03:03 -080076 combination->add_matcher(StringToId("SCREEN_IS_ON"));
77 combination->add_matcher(StringToId("SCREEN_IS_OFF"));
Yao Chencaf339d2017-10-06 16:01:10 -070078
Yangster-mace2cd6d52017-11-09 20:38:30 -080079 CountMetric* metric = config.add_count_metric();
Yangster-mac94e197c2018-01-02 16:03:03 -080080 metric->set_id(3);
81 metric->set_what(StringToId("SCREEN_IS_ON"));
Yangster-macb8144812018-01-04 10:56:23 -080082 metric->set_bucket(ONE_MINUTE);
Yangster-mac468ff042018-01-17 12:26:34 -080083 metric->mutable_dimensions_in_what()->set_field(2 /*SCREEN_STATE_CHANGE*/);
84 metric->mutable_dimensions_in_what()->add_child()->set_field(1);
Yangster-mace2cd6d52017-11-09 20:38:30 -080085
Yangster-mac94e197c2018-01-02 16:03:03 -080086 config.add_no_report_metric(3);
87
Yangster-mace2cd6d52017-11-09 20:38:30 -080088 auto alert = config.add_alert();
Jeffrey Huang38d70262020-03-19 17:28:59 -070089 alert->set_id(kAlertId);
Yangster-mac94e197c2018-01-02 16:03:03 -080090 alert->set_metric_id(3);
Yangster-maca7fb12d2018-01-03 17:17:20 -080091 alert->set_num_buckets(10);
Yangster-mace2cd6d52017-11-09 20:38:30 -080092 alert->set_refractory_period_secs(100);
93 alert->set_trigger_if_sum_gt(100);
Yao Chencaf339d2017-10-06 16:01:10 -070094 return config;
95}
96
97StatsdConfig buildCircleMatchers() {
98 StatsdConfig config;
Yangster-mac94e197c2018-01-02 16:03:03 -080099 config.set_id(12345);
Yao Chencaf339d2017-10-06 16:01:10 -0700100
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800101 AtomMatcher* eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800102 eventMatcher->set_id(StringToId("SCREEN_IS_ON"));
Yao Chencaf339d2017-10-06 16:01:10 -0700103
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800104 SimpleAtomMatcher* simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
Yangster-mac20877162017-12-22 17:19:39 -0800105 simpleAtomMatcher->set_atom_id(2 /*SCREEN_STATE_CHANGE*/);
106 simpleAtomMatcher->add_field_value_matcher()->set_field(
Yao Chencaf339d2017-10-06 16:01:10 -0700107 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE*/);
Yangster-mac20877162017-12-22 17:19:39 -0800108 simpleAtomMatcher->mutable_field_value_matcher(0)->set_eq_int(
Yao Chencaf339d2017-10-06 16:01:10 -0700109 2 /*SCREEN_STATE_CHANGE__DISPLAY_STATE__STATE_ON*/);
110
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800111 eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800112 eventMatcher->set_id(StringToId("SCREEN_ON_OR_OFF"));
Yao Chencaf339d2017-10-06 16:01:10 -0700113
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800114 AtomMatcher_Combination* combination = eventMatcher->mutable_combination();
Yao Chencaf339d2017-10-06 16:01:10 -0700115 combination->set_operation(LogicalOperation::OR);
Yangster-mac94e197c2018-01-02 16:03:03 -0800116 combination->add_matcher(StringToId("SCREEN_IS_ON"));
Yao Chencaf339d2017-10-06 16:01:10 -0700117 // Circle dependency
Yangster-mac94e197c2018-01-02 16:03:03 -0800118 combination->add_matcher(StringToId("SCREEN_ON_OR_OFF"));
Yao Chencaf339d2017-10-06 16:01:10 -0700119
120 return config;
121}
122
Yangster-mace2cd6d52017-11-09 20:38:30 -0800123StatsdConfig buildAlertWithUnknownMetric() {
124 StatsdConfig config;
Yangster-mac94e197c2018-01-02 16:03:03 -0800125 config.set_id(12345);
Yangster-mace2cd6d52017-11-09 20:38:30 -0800126
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800127 AtomMatcher* eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800128 eventMatcher->set_id(StringToId("SCREEN_IS_ON"));
Yangster-mace2cd6d52017-11-09 20:38:30 -0800129
130 CountMetric* metric = config.add_count_metric();
Yangster-mac94e197c2018-01-02 16:03:03 -0800131 metric->set_id(3);
132 metric->set_what(StringToId("SCREEN_IS_ON"));
Yangster-macb8144812018-01-04 10:56:23 -0800133 metric->set_bucket(ONE_MINUTE);
Yangster-mac468ff042018-01-17 12:26:34 -0800134 metric->mutable_dimensions_in_what()->set_field(2 /*SCREEN_STATE_CHANGE*/);
135 metric->mutable_dimensions_in_what()->add_child()->set_field(1);
Yangster-mace2cd6d52017-11-09 20:38:30 -0800136
137 auto alert = config.add_alert();
Yangster-mac94e197c2018-01-02 16:03:03 -0800138 alert->set_id(3);
139 alert->set_metric_id(2);
Yangster-maca7fb12d2018-01-03 17:17:20 -0800140 alert->set_num_buckets(10);
Yangster-mace2cd6d52017-11-09 20:38:30 -0800141 alert->set_refractory_period_secs(100);
142 alert->set_trigger_if_sum_gt(100);
143 return config;
144}
145
Yao Chencaf339d2017-10-06 16:01:10 -0700146StatsdConfig buildMissingMatchers() {
147 StatsdConfig config;
Yangster-mac94e197c2018-01-02 16:03:03 -0800148 config.set_id(12345);
Yao Chencaf339d2017-10-06 16:01:10 -0700149
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800150 AtomMatcher* eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800151 eventMatcher->set_id(StringToId("SCREEN_IS_ON"));
Yao Chencaf339d2017-10-06 16:01:10 -0700152
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800153 SimpleAtomMatcher* simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
Yangster-mac20877162017-12-22 17:19:39 -0800154 simpleAtomMatcher->set_atom_id(2 /*SCREEN_STATE_CHANGE*/);
155 simpleAtomMatcher->add_field_value_matcher()->set_field(
Yao Chencaf339d2017-10-06 16:01:10 -0700156 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE*/);
Yangster-mac20877162017-12-22 17:19:39 -0800157 simpleAtomMatcher->mutable_field_value_matcher(0)->set_eq_int(
Yao Chencaf339d2017-10-06 16:01:10 -0700158 2 /*SCREEN_STATE_CHANGE__DISPLAY_STATE__STATE_ON*/);
159
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800160 eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800161 eventMatcher->set_id(StringToId("SCREEN_ON_OR_OFF"));
Yao Chencaf339d2017-10-06 16:01:10 -0700162
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800163 AtomMatcher_Combination* combination = eventMatcher->mutable_combination();
Yao Chencaf339d2017-10-06 16:01:10 -0700164 combination->set_operation(LogicalOperation::OR);
Yangster-mac94e197c2018-01-02 16:03:03 -0800165 combination->add_matcher(StringToId("SCREEN_IS_ON"));
Yao Chencaf339d2017-10-06 16:01:10 -0700166 // undefined matcher
Yangster-mac94e197c2018-01-02 16:03:03 -0800167 combination->add_matcher(StringToId("ABC"));
Yao Chencaf339d2017-10-06 16:01:10 -0700168
169 return config;
170}
171
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800172StatsdConfig buildMissingPredicate() {
Yao Chen10535b92017-11-27 11:31:55 -0800173 StatsdConfig config;
Yangster-mac94e197c2018-01-02 16:03:03 -0800174 config.set_id(12345);
Yao Chen10535b92017-11-27 11:31:55 -0800175
176 CountMetric* metric = config.add_count_metric();
Yangster-mac94e197c2018-01-02 16:03:03 -0800177 metric->set_id(3);
178 metric->set_what(StringToId("SCREEN_EVENT"));
Yangster-macb8144812018-01-04 10:56:23 -0800179 metric->set_bucket(ONE_MINUTE);
Yangster-mac94e197c2018-01-02 16:03:03 -0800180 metric->set_condition(StringToId("SOME_CONDITION"));
Yao Chen10535b92017-11-27 11:31:55 -0800181
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800182 AtomMatcher* eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800183 eventMatcher->set_id(StringToId("SCREEN_EVENT"));
Yao Chen10535b92017-11-27 11:31:55 -0800184
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800185 SimpleAtomMatcher* simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
Yangster-mac20877162017-12-22 17:19:39 -0800186 simpleAtomMatcher->set_atom_id(2);
Yao Chen10535b92017-11-27 11:31:55 -0800187
188 return config;
189}
190
Yao Chen5154a3792017-10-30 22:57:06 -0700191StatsdConfig buildDimensionMetricsWithMultiTags() {
192 StatsdConfig config;
Yangster-mac94e197c2018-01-02 16:03:03 -0800193 config.set_id(12345);
Yao Chen5154a3792017-10-30 22:57:06 -0700194
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800195 AtomMatcher* eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800196 eventMatcher->set_id(StringToId("BATTERY_VERY_LOW"));
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800197 SimpleAtomMatcher* simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
Yangster-mac20877162017-12-22 17:19:39 -0800198 simpleAtomMatcher->set_atom_id(2);
Yao Chen5154a3792017-10-30 22:57:06 -0700199
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800200 eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800201 eventMatcher->set_id(StringToId("BATTERY_VERY_VERY_LOW"));
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800202 simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
Yangster-mac20877162017-12-22 17:19:39 -0800203 simpleAtomMatcher->set_atom_id(3);
Yao Chen5154a3792017-10-30 22:57:06 -0700204
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800205 eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800206 eventMatcher->set_id(StringToId("BATTERY_LOW"));
Yao Chen5154a3792017-10-30 22:57:06 -0700207
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800208 AtomMatcher_Combination* combination = eventMatcher->mutable_combination();
Yao Chen5154a3792017-10-30 22:57:06 -0700209 combination->set_operation(LogicalOperation::OR);
Yangster-mac94e197c2018-01-02 16:03:03 -0800210 combination->add_matcher(StringToId("BATTERY_VERY_LOW"));
211 combination->add_matcher(StringToId("BATTERY_VERY_VERY_LOW"));
Yao Chen5154a3792017-10-30 22:57:06 -0700212
213 // Count process state changes, slice by uid, while SCREEN_IS_OFF
214 CountMetric* metric = config.add_count_metric();
Yangster-mac94e197c2018-01-02 16:03:03 -0800215 metric->set_id(3);
216 metric->set_what(StringToId("BATTERY_LOW"));
Yangster-macb8144812018-01-04 10:56:23 -0800217 metric->set_bucket(ONE_MINUTE);
Yangster-mac20877162017-12-22 17:19:39 -0800218 // This case is interesting. We want to dimension across two atoms.
Yangster-mac468ff042018-01-17 12:26:34 -0800219 metric->mutable_dimensions_in_what()->add_child()->set_field(1);
Yao Chen5154a3792017-10-30 22:57:06 -0700220
Yangster-mace2cd6d52017-11-09 20:38:30 -0800221 auto alert = config.add_alert();
Jeffrey Huang38d70262020-03-19 17:28:59 -0700222 alert->set_id(kAlertId);
Yangster-mac94e197c2018-01-02 16:03:03 -0800223 alert->set_metric_id(3);
Yangster-maca7fb12d2018-01-03 17:17:20 -0800224 alert->set_num_buckets(10);
Yangster-mace2cd6d52017-11-09 20:38:30 -0800225 alert->set_refractory_period_secs(100);
226 alert->set_trigger_if_sum_gt(100);
Yao Chen5154a3792017-10-30 22:57:06 -0700227 return config;
228}
229
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800230StatsdConfig buildCirclePredicates() {
Yao Chencaf339d2017-10-06 16:01:10 -0700231 StatsdConfig config;
Yangster-mac94e197c2018-01-02 16:03:03 -0800232 config.set_id(12345);
Yao Chencaf339d2017-10-06 16:01:10 -0700233
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800234 AtomMatcher* eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800235 eventMatcher->set_id(StringToId("SCREEN_IS_ON"));
Yao Chencaf339d2017-10-06 16:01:10 -0700236
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800237 SimpleAtomMatcher* simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
Yangster-mac20877162017-12-22 17:19:39 -0800238 simpleAtomMatcher->set_atom_id(2 /*SCREEN_STATE_CHANGE*/);
239 simpleAtomMatcher->add_field_value_matcher()->set_field(
Yao Chencaf339d2017-10-06 16:01:10 -0700240 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE*/);
Yangster-mac20877162017-12-22 17:19:39 -0800241 simpleAtomMatcher->mutable_field_value_matcher(0)->set_eq_int(
Yao Chencaf339d2017-10-06 16:01:10 -0700242 2 /*SCREEN_STATE_CHANGE__DISPLAY_STATE__STATE_ON*/);
243
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800244 eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800245 eventMatcher->set_id(StringToId("SCREEN_IS_OFF"));
Yao Chencaf339d2017-10-06 16:01:10 -0700246
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800247 simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
Yangster-mac20877162017-12-22 17:19:39 -0800248 simpleAtomMatcher->set_atom_id(2 /*SCREEN_STATE_CHANGE*/);
249 simpleAtomMatcher->add_field_value_matcher()->set_field(
Yao Chencaf339d2017-10-06 16:01:10 -0700250 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE*/);
Yangster-mac20877162017-12-22 17:19:39 -0800251 simpleAtomMatcher->mutable_field_value_matcher(0)->set_eq_int(
Yao Chencaf339d2017-10-06 16:01:10 -0700252 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE__STATE_OFF*/);
253
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800254 auto condition = config.add_predicate();
Yangster-mac94e197c2018-01-02 16:03:03 -0800255 condition->set_id(StringToId("SCREEN_IS_ON"));
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800256 SimplePredicate* simplePredicate = condition->mutable_simple_predicate();
Yangster-mac94e197c2018-01-02 16:03:03 -0800257 simplePredicate->set_start(StringToId("SCREEN_IS_ON"));
258 simplePredicate->set_stop(StringToId("SCREEN_IS_OFF"));
Yao Chencaf339d2017-10-06 16:01:10 -0700259
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800260 condition = config.add_predicate();
Yangster-mac94e197c2018-01-02 16:03:03 -0800261 condition->set_id(StringToId("SCREEN_IS_EITHER_ON_OFF"));
Yao Chencaf339d2017-10-06 16:01:10 -0700262
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800263 Predicate_Combination* combination = condition->mutable_combination();
Yao Chencaf339d2017-10-06 16:01:10 -0700264 combination->set_operation(LogicalOperation::OR);
Yangster-mac94e197c2018-01-02 16:03:03 -0800265 combination->add_predicate(StringToId("SCREEN_IS_ON"));
266 combination->add_predicate(StringToId("SCREEN_IS_EITHER_ON_OFF"));
Yao Chencaf339d2017-10-06 16:01:10 -0700267
268 return config;
269}
270
271TEST(MetricsManagerTest, TestGoodConfig) {
Yangster-mac20877162017-12-22 17:19:39 -0800272 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700273 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800274 sp<AlarmMonitor> anomalyAlarmMonitor;
275 sp<AlarmMonitor> periodicAlarmMonitor;
Yao Chencaf339d2017-10-06 16:01:10 -0700276 StatsdConfig config = buildGoodConfig();
277 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800278 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yao Chencaf339d2017-10-06 16:01:10 -0700279 vector<sp<ConditionTracker>> allConditionTrackers;
280 vector<sp<MetricProducer>> allMetricProducers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800281 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800282 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yao Chencaf339d2017-10-06 16:01:10 -0700283 unordered_map<int, std::vector<int>> conditionToMetricMap;
284 unordered_map<int, std::vector<int>> trackerToMetricMap;
285 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700286 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
287 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700288 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700289 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800290 std::set<int64_t> noReportMetricIds;
Yao Chencaf339d2017-10-06 16:01:10 -0700291
Chenjie Yue2219202018-06-08 10:07:51 -0700292 EXPECT_TRUE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
293 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
294 allAtomMatchers, allConditionTrackers, allMetricProducers,
295 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700296 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700297 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700298 alertTrackerMap, metricsWithActivation,
299 noReportMetricIds));
Yangster-mace2cd6d52017-11-09 20:38:30 -0800300 EXPECT_EQ(1u, allMetricProducers.size());
301 EXPECT_EQ(1u, allAnomalyTrackers.size());
Yangster-mac94e197c2018-01-02 16:03:03 -0800302 EXPECT_EQ(1u, noReportMetricIds.size());
Jeffrey Huang38d70262020-03-19 17:28:59 -0700303 EXPECT_EQ(1u, alertTrackerMap.size());
304 EXPECT_NE(alertTrackerMap.find(kAlertId), alertTrackerMap.end());
305 EXPECT_EQ(alertTrackerMap.find(kAlertId)->second, 0);
Yao Chencaf339d2017-10-06 16:01:10 -0700306}
307
Yao Chen5154a3792017-10-30 22:57:06 -0700308TEST(MetricsManagerTest, TestDimensionMetricsWithMultiTags) {
Yangster-mac20877162017-12-22 17:19:39 -0800309 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700310 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800311 sp<AlarmMonitor> anomalyAlarmMonitor;
312 sp<AlarmMonitor> periodicAlarmMonitor;
Yao Chen5154a3792017-10-30 22:57:06 -0700313 StatsdConfig config = buildDimensionMetricsWithMultiTags();
314 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800315 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yao Chen5154a3792017-10-30 22:57:06 -0700316 vector<sp<ConditionTracker>> allConditionTrackers;
317 vector<sp<MetricProducer>> allMetricProducers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800318 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800319 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yao Chen5154a3792017-10-30 22:57:06 -0700320 unordered_map<int, std::vector<int>> conditionToMetricMap;
321 unordered_map<int, std::vector<int>> trackerToMetricMap;
322 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700323 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
324 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700325 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700326 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800327 std::set<int64_t> noReportMetricIds;
Yao Chen5154a3792017-10-30 22:57:06 -0700328
Chenjie Yue2219202018-06-08 10:07:51 -0700329 EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
330 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
331 allAtomMatchers, allConditionTrackers, allMetricProducers,
332 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700333 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700334 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700335 alertTrackerMap, metricsWithActivation,
336 noReportMetricIds));
Yao Chen5154a3792017-10-30 22:57:06 -0700337}
338
Yao Chencaf339d2017-10-06 16:01:10 -0700339TEST(MetricsManagerTest, TestCircleLogMatcherDependency) {
Yangster-mac20877162017-12-22 17:19:39 -0800340 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700341 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800342 sp<AlarmMonitor> anomalyAlarmMonitor;
343 sp<AlarmMonitor> periodicAlarmMonitor;
Yao Chencaf339d2017-10-06 16:01:10 -0700344 StatsdConfig config = buildCircleMatchers();
345 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800346 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yao Chencaf339d2017-10-06 16:01:10 -0700347 vector<sp<ConditionTracker>> allConditionTrackers;
348 vector<sp<MetricProducer>> allMetricProducers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800349 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800350 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yao Chencaf339d2017-10-06 16:01:10 -0700351 unordered_map<int, std::vector<int>> conditionToMetricMap;
352 unordered_map<int, std::vector<int>> trackerToMetricMap;
353 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700354 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
355 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700356 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700357 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800358 std::set<int64_t> noReportMetricIds;
Yao Chencaf339d2017-10-06 16:01:10 -0700359
Chenjie Yue2219202018-06-08 10:07:51 -0700360 EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
361 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
362 allAtomMatchers, allConditionTrackers, allMetricProducers,
363 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700364 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700365 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700366 alertTrackerMap, metricsWithActivation,
367 noReportMetricIds));
Yao Chencaf339d2017-10-06 16:01:10 -0700368}
369
370TEST(MetricsManagerTest, TestMissingMatchers) {
Yangster-mac20877162017-12-22 17:19:39 -0800371 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700372 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800373 sp<AlarmMonitor> anomalyAlarmMonitor;
374 sp<AlarmMonitor> periodicAlarmMonitor;
Yao Chencaf339d2017-10-06 16:01:10 -0700375 StatsdConfig config = buildMissingMatchers();
376 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800377 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yao Chencaf339d2017-10-06 16:01:10 -0700378 vector<sp<ConditionTracker>> allConditionTrackers;
379 vector<sp<MetricProducer>> allMetricProducers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800380 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800381 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yao Chencaf339d2017-10-06 16:01:10 -0700382 unordered_map<int, std::vector<int>> conditionToMetricMap;
383 unordered_map<int, std::vector<int>> trackerToMetricMap;
384 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700385 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
386 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700387 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700388 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800389 std::set<int64_t> noReportMetricIds;
Chenjie Yue2219202018-06-08 10:07:51 -0700390 EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
391 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
392 allAtomMatchers, allConditionTrackers, allMetricProducers,
393 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700394 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700395 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700396 alertTrackerMap, metricsWithActivation,
397 noReportMetricIds));
Yao Chencaf339d2017-10-06 16:01:10 -0700398}
399
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800400TEST(MetricsManagerTest, TestMissingPredicate) {
Yangster-mac20877162017-12-22 17:19:39 -0800401 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700402 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800403 sp<AlarmMonitor> anomalyAlarmMonitor;
404 sp<AlarmMonitor> periodicAlarmMonitor;
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800405 StatsdConfig config = buildMissingPredicate();
Yao Chen10535b92017-11-27 11:31:55 -0800406 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800407 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yao Chen10535b92017-11-27 11:31:55 -0800408 vector<sp<ConditionTracker>> allConditionTrackers;
409 vector<sp<MetricProducer>> allMetricProducers;
410 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800411 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yao Chen10535b92017-11-27 11:31:55 -0800412 unordered_map<int, std::vector<int>> conditionToMetricMap;
413 unordered_map<int, std::vector<int>> trackerToMetricMap;
414 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700415 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
416 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700417 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700418 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800419 std::set<int64_t> noReportMetricIds;
Chenjie Yue2219202018-06-08 10:07:51 -0700420 EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
421 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
422 allAtomMatchers, allConditionTrackers, allMetricProducers,
423 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700424 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700425 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700426 alertTrackerMap, metricsWithActivation, noReportMetricIds));
Yao Chen10535b92017-11-27 11:31:55 -0800427}
428
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800429TEST(MetricsManagerTest, TestCirclePredicateDependency) {
Yangster-mac20877162017-12-22 17:19:39 -0800430 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700431 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800432 sp<AlarmMonitor> anomalyAlarmMonitor;
433 sp<AlarmMonitor> periodicAlarmMonitor;
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800434 StatsdConfig config = buildCirclePredicates();
Yao Chencaf339d2017-10-06 16:01:10 -0700435 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800436 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yao Chencaf339d2017-10-06 16:01:10 -0700437 vector<sp<ConditionTracker>> allConditionTrackers;
438 vector<sp<MetricProducer>> allMetricProducers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800439 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800440 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yao Chencaf339d2017-10-06 16:01:10 -0700441 unordered_map<int, std::vector<int>> conditionToMetricMap;
442 unordered_map<int, std::vector<int>> trackerToMetricMap;
443 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700444 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
445 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700446 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700447 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800448 std::set<int64_t> noReportMetricIds;
Yao Chencaf339d2017-10-06 16:01:10 -0700449
Chenjie Yue2219202018-06-08 10:07:51 -0700450 EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
451 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
452 allAtomMatchers, allConditionTrackers, allMetricProducers,
453 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700454 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700455 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700456 alertTrackerMap, metricsWithActivation,
457 noReportMetricIds));
Yangster-mace2cd6d52017-11-09 20:38:30 -0800458}
459
460TEST(MetricsManagerTest, testAlertWithUnknownMetric) {
Yangster-mac20877162017-12-22 17:19:39 -0800461 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700462 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800463 sp<AlarmMonitor> anomalyAlarmMonitor;
464 sp<AlarmMonitor> periodicAlarmMonitor;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800465 StatsdConfig config = buildAlertWithUnknownMetric();
466 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800467 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800468 vector<sp<ConditionTracker>> allConditionTrackers;
469 vector<sp<MetricProducer>> allMetricProducers;
470 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800471 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800472 unordered_map<int, std::vector<int>> conditionToMetricMap;
473 unordered_map<int, std::vector<int>> trackerToMetricMap;
474 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700475 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
476 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700477 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700478 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800479 std::set<int64_t> noReportMetricIds;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800480
Chenjie Yue2219202018-06-08 10:07:51 -0700481 EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
482 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
483 allAtomMatchers, allConditionTrackers, allMetricProducers,
484 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700485 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700486 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700487 alertTrackerMap, metricsWithActivation,
488 noReportMetricIds));
Yao Chencaf339d2017-10-06 16:01:10 -0700489}
490
491#else
492GTEST_LOG_(INFO) << "This test does nothing.\n";
493#endif