blob: 6259757fe0929fe62a98b7fb8cbcbcd69d1bf609 [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>
Tej Singh3be093b2020-03-04 20:08:38 -080016#include <private/android_filesystem_config.h>
17#include <stdio.h>
Joe Onorato9fc9edf2017-10-15 20:08:52 -070018
Tej Singh3be093b2020-03-04 20:08:38 -080019#include <set>
20#include <unordered_map>
21#include <vector>
22
23#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h"
24#include "metrics/metrics_test_helper.h"
Joe Onorato9fc9edf2017-10-15 20:08:52 -070025#include "src/condition/ConditionTracker.h"
26#include "src/matchers/LogMatchingTracker.h"
27#include "src/metrics/CountMetricProducer.h"
Yangster1d4d6862017-10-31 12:58:51 -070028#include "src/metrics/GaugeMetricProducer.h"
Joe Onorato9fc9edf2017-10-15 20:08:52 -070029#include "src/metrics/MetricProducer.h"
Chenjie Yub3dda412017-10-24 13:41:59 -070030#include "src/metrics/ValueMetricProducer.h"
Joe Onorato9fc9edf2017-10-15 20:08:52 -070031#include "src/metrics/metrics_manager_util.h"
Muhammad Qureshib1eee0be2020-05-15 05:46:38 -070032#include "src/state/StateManager.h"
Yangster-mac94e197c2018-01-02 16:03:03 -080033#include "statsd_test_util.h"
Yao Chencaf339d2017-10-06 16:01:10 -070034
Tej Singh3be093b2020-03-04 20:08:38 -080035using namespace testing;
Yao Chencaf339d2017-10-06 16:01:10 -070036using android::sp;
Tej Singh3be093b2020-03-04 20:08:38 -080037using android::os::statsd::Predicate;
38using std::map;
Yao Chencaf339d2017-10-06 16:01:10 -070039using std::set;
40using std::unordered_map;
41using std::vector;
42
43#ifdef __ANDROID__
44
Tej Singh3be093b2020-03-04 20:08:38 -080045namespace android {
46namespace os {
47namespace statsd {
48
49namespace {
Yangster-mac94e197c2018-01-02 16:03:03 -080050const ConfigKey kConfigKey(0, 12345);
Jeffrey Huang38d70262020-03-19 17:28:59 -070051const long kAlertId = 3;
Yao Chenb3561512017-11-21 18:07:17 -080052
Chenjie Yu85ed8382017-12-14 16:48:54 -080053const long timeBaseSec = 1000;
54
Yao Chencaf339d2017-10-06 16:01:10 -070055StatsdConfig buildGoodConfig() {
56 StatsdConfig config;
Yangster-mac94e197c2018-01-02 16:03:03 -080057 config.set_id(12345);
Yao Chencaf339d2017-10-06 16:01:10 -070058
Stefan Lafonb8c9aa82017-12-03 14:27:25 -080059 AtomMatcher* eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -080060 eventMatcher->set_id(StringToId("SCREEN_IS_ON"));
Yao Chencaf339d2017-10-06 16:01:10 -070061
Stefan Lafonb8c9aa82017-12-03 14:27:25 -080062 SimpleAtomMatcher* simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
Yangster-mac20877162017-12-22 17:19:39 -080063 simpleAtomMatcher->set_atom_id(2 /*SCREEN_STATE_CHANGE*/);
64 simpleAtomMatcher->add_field_value_matcher()->set_field(
Yao Chencaf339d2017-10-06 16:01:10 -070065 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE*/);
Yangster-mac20877162017-12-22 17:19:39 -080066 simpleAtomMatcher->mutable_field_value_matcher(0)->set_eq_int(
Yao Chencaf339d2017-10-06 16:01:10 -070067 2 /*SCREEN_STATE_CHANGE__DISPLAY_STATE__STATE_ON*/);
68
Stefan Lafonb8c9aa82017-12-03 14:27:25 -080069 eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -080070 eventMatcher->set_id(StringToId("SCREEN_IS_OFF"));
Yao Chencaf339d2017-10-06 16:01:10 -070071
Stefan Lafonb8c9aa82017-12-03 14:27:25 -080072 simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
Yangster-mac20877162017-12-22 17:19:39 -080073 simpleAtomMatcher->set_atom_id(2 /*SCREEN_STATE_CHANGE*/);
74 simpleAtomMatcher->add_field_value_matcher()->set_field(
Yao Chencaf339d2017-10-06 16:01:10 -070075 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE*/);
Yangster-mac20877162017-12-22 17:19:39 -080076 simpleAtomMatcher->mutable_field_value_matcher(0)->set_eq_int(
Yao Chencaf339d2017-10-06 16:01:10 -070077 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE__STATE_OFF*/);
78
Stefan Lafonb8c9aa82017-12-03 14:27:25 -080079 eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -080080 eventMatcher->set_id(StringToId("SCREEN_ON_OR_OFF"));
Yao Chencaf339d2017-10-06 16:01:10 -070081
Stefan Lafonb8c9aa82017-12-03 14:27:25 -080082 AtomMatcher_Combination* combination = eventMatcher->mutable_combination();
Yao Chencaf339d2017-10-06 16:01:10 -070083 combination->set_operation(LogicalOperation::OR);
Yangster-mac94e197c2018-01-02 16:03:03 -080084 combination->add_matcher(StringToId("SCREEN_IS_ON"));
85 combination->add_matcher(StringToId("SCREEN_IS_OFF"));
Yao Chencaf339d2017-10-06 16:01:10 -070086
Yangster-mace2cd6d52017-11-09 20:38:30 -080087 CountMetric* metric = config.add_count_metric();
Yangster-mac94e197c2018-01-02 16:03:03 -080088 metric->set_id(3);
89 metric->set_what(StringToId("SCREEN_IS_ON"));
Yangster-macb8144812018-01-04 10:56:23 -080090 metric->set_bucket(ONE_MINUTE);
Yangster-mac468ff042018-01-17 12:26:34 -080091 metric->mutable_dimensions_in_what()->set_field(2 /*SCREEN_STATE_CHANGE*/);
92 metric->mutable_dimensions_in_what()->add_child()->set_field(1);
Yangster-mace2cd6d52017-11-09 20:38:30 -080093
Yangster-mac94e197c2018-01-02 16:03:03 -080094 config.add_no_report_metric(3);
95
Yangster-mace2cd6d52017-11-09 20:38:30 -080096 auto alert = config.add_alert();
Jeffrey Huang38d70262020-03-19 17:28:59 -070097 alert->set_id(kAlertId);
Yangster-mac94e197c2018-01-02 16:03:03 -080098 alert->set_metric_id(3);
Yangster-maca7fb12d2018-01-03 17:17:20 -080099 alert->set_num_buckets(10);
Yangster-mace2cd6d52017-11-09 20:38:30 -0800100 alert->set_refractory_period_secs(100);
101 alert->set_trigger_if_sum_gt(100);
Yao Chencaf339d2017-10-06 16:01:10 -0700102 return config;
103}
104
105StatsdConfig buildCircleMatchers() {
106 StatsdConfig config;
Yangster-mac94e197c2018-01-02 16:03:03 -0800107 config.set_id(12345);
Yao Chencaf339d2017-10-06 16:01:10 -0700108
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800109 AtomMatcher* eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800110 eventMatcher->set_id(StringToId("SCREEN_IS_ON"));
Yao Chencaf339d2017-10-06 16:01:10 -0700111
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800112 SimpleAtomMatcher* simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
Yangster-mac20877162017-12-22 17:19:39 -0800113 simpleAtomMatcher->set_atom_id(2 /*SCREEN_STATE_CHANGE*/);
114 simpleAtomMatcher->add_field_value_matcher()->set_field(
Yao Chencaf339d2017-10-06 16:01:10 -0700115 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE*/);
Yangster-mac20877162017-12-22 17:19:39 -0800116 simpleAtomMatcher->mutable_field_value_matcher(0)->set_eq_int(
Yao Chencaf339d2017-10-06 16:01:10 -0700117 2 /*SCREEN_STATE_CHANGE__DISPLAY_STATE__STATE_ON*/);
118
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800119 eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800120 eventMatcher->set_id(StringToId("SCREEN_ON_OR_OFF"));
Yao Chencaf339d2017-10-06 16:01:10 -0700121
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800122 AtomMatcher_Combination* combination = eventMatcher->mutable_combination();
Yao Chencaf339d2017-10-06 16:01:10 -0700123 combination->set_operation(LogicalOperation::OR);
Yangster-mac94e197c2018-01-02 16:03:03 -0800124 combination->add_matcher(StringToId("SCREEN_IS_ON"));
Yao Chencaf339d2017-10-06 16:01:10 -0700125 // Circle dependency
Yangster-mac94e197c2018-01-02 16:03:03 -0800126 combination->add_matcher(StringToId("SCREEN_ON_OR_OFF"));
Yao Chencaf339d2017-10-06 16:01:10 -0700127
128 return config;
129}
130
Yangster-mace2cd6d52017-11-09 20:38:30 -0800131StatsdConfig buildAlertWithUnknownMetric() {
132 StatsdConfig config;
Yangster-mac94e197c2018-01-02 16:03:03 -0800133 config.set_id(12345);
Yangster-mace2cd6d52017-11-09 20:38:30 -0800134
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800135 AtomMatcher* eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800136 eventMatcher->set_id(StringToId("SCREEN_IS_ON"));
Yangster-mace2cd6d52017-11-09 20:38:30 -0800137
138 CountMetric* metric = config.add_count_metric();
Yangster-mac94e197c2018-01-02 16:03:03 -0800139 metric->set_id(3);
140 metric->set_what(StringToId("SCREEN_IS_ON"));
Yangster-macb8144812018-01-04 10:56:23 -0800141 metric->set_bucket(ONE_MINUTE);
Yangster-mac468ff042018-01-17 12:26:34 -0800142 metric->mutable_dimensions_in_what()->set_field(2 /*SCREEN_STATE_CHANGE*/);
143 metric->mutable_dimensions_in_what()->add_child()->set_field(1);
Yangster-mace2cd6d52017-11-09 20:38:30 -0800144
145 auto alert = config.add_alert();
Yangster-mac94e197c2018-01-02 16:03:03 -0800146 alert->set_id(3);
147 alert->set_metric_id(2);
Yangster-maca7fb12d2018-01-03 17:17:20 -0800148 alert->set_num_buckets(10);
Yangster-mace2cd6d52017-11-09 20:38:30 -0800149 alert->set_refractory_period_secs(100);
150 alert->set_trigger_if_sum_gt(100);
151 return config;
152}
153
Yao Chencaf339d2017-10-06 16:01:10 -0700154StatsdConfig buildMissingMatchers() {
155 StatsdConfig config;
Yangster-mac94e197c2018-01-02 16:03:03 -0800156 config.set_id(12345);
Yao Chencaf339d2017-10-06 16:01:10 -0700157
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800158 AtomMatcher* eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800159 eventMatcher->set_id(StringToId("SCREEN_IS_ON"));
Yao Chencaf339d2017-10-06 16:01:10 -0700160
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800161 SimpleAtomMatcher* simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
Yangster-mac20877162017-12-22 17:19:39 -0800162 simpleAtomMatcher->set_atom_id(2 /*SCREEN_STATE_CHANGE*/);
163 simpleAtomMatcher->add_field_value_matcher()->set_field(
Yao Chencaf339d2017-10-06 16:01:10 -0700164 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE*/);
Yangster-mac20877162017-12-22 17:19:39 -0800165 simpleAtomMatcher->mutable_field_value_matcher(0)->set_eq_int(
Yao Chencaf339d2017-10-06 16:01:10 -0700166 2 /*SCREEN_STATE_CHANGE__DISPLAY_STATE__STATE_ON*/);
167
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800168 eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800169 eventMatcher->set_id(StringToId("SCREEN_ON_OR_OFF"));
Yao Chencaf339d2017-10-06 16:01:10 -0700170
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800171 AtomMatcher_Combination* combination = eventMatcher->mutable_combination();
Yao Chencaf339d2017-10-06 16:01:10 -0700172 combination->set_operation(LogicalOperation::OR);
Yangster-mac94e197c2018-01-02 16:03:03 -0800173 combination->add_matcher(StringToId("SCREEN_IS_ON"));
Yao Chencaf339d2017-10-06 16:01:10 -0700174 // undefined matcher
Yangster-mac94e197c2018-01-02 16:03:03 -0800175 combination->add_matcher(StringToId("ABC"));
Yao Chencaf339d2017-10-06 16:01:10 -0700176
177 return config;
178}
179
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800180StatsdConfig buildMissingPredicate() {
Yao Chen10535b92017-11-27 11:31:55 -0800181 StatsdConfig config;
Yangster-mac94e197c2018-01-02 16:03:03 -0800182 config.set_id(12345);
Yao Chen10535b92017-11-27 11:31:55 -0800183
184 CountMetric* metric = config.add_count_metric();
Yangster-mac94e197c2018-01-02 16:03:03 -0800185 metric->set_id(3);
186 metric->set_what(StringToId("SCREEN_EVENT"));
Yangster-macb8144812018-01-04 10:56:23 -0800187 metric->set_bucket(ONE_MINUTE);
Yangster-mac94e197c2018-01-02 16:03:03 -0800188 metric->set_condition(StringToId("SOME_CONDITION"));
Yao Chen10535b92017-11-27 11:31:55 -0800189
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800190 AtomMatcher* eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800191 eventMatcher->set_id(StringToId("SCREEN_EVENT"));
Yao Chen10535b92017-11-27 11:31:55 -0800192
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800193 SimpleAtomMatcher* simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
Yangster-mac20877162017-12-22 17:19:39 -0800194 simpleAtomMatcher->set_atom_id(2);
Yao Chen10535b92017-11-27 11:31:55 -0800195
196 return config;
197}
198
Yao Chen5154a3792017-10-30 22:57:06 -0700199StatsdConfig buildDimensionMetricsWithMultiTags() {
200 StatsdConfig config;
Yangster-mac94e197c2018-01-02 16:03:03 -0800201 config.set_id(12345);
Yao Chen5154a3792017-10-30 22:57:06 -0700202
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800203 AtomMatcher* eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800204 eventMatcher->set_id(StringToId("BATTERY_VERY_LOW"));
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800205 SimpleAtomMatcher* simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
Yangster-mac20877162017-12-22 17:19:39 -0800206 simpleAtomMatcher->set_atom_id(2);
Yao Chen5154a3792017-10-30 22:57:06 -0700207
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800208 eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800209 eventMatcher->set_id(StringToId("BATTERY_VERY_VERY_LOW"));
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800210 simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
Yangster-mac20877162017-12-22 17:19:39 -0800211 simpleAtomMatcher->set_atom_id(3);
Yao Chen5154a3792017-10-30 22:57:06 -0700212
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800213 eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800214 eventMatcher->set_id(StringToId("BATTERY_LOW"));
Yao Chen5154a3792017-10-30 22:57:06 -0700215
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800216 AtomMatcher_Combination* combination = eventMatcher->mutable_combination();
Yao Chen5154a3792017-10-30 22:57:06 -0700217 combination->set_operation(LogicalOperation::OR);
Yangster-mac94e197c2018-01-02 16:03:03 -0800218 combination->add_matcher(StringToId("BATTERY_VERY_LOW"));
219 combination->add_matcher(StringToId("BATTERY_VERY_VERY_LOW"));
Yao Chen5154a3792017-10-30 22:57:06 -0700220
221 // Count process state changes, slice by uid, while SCREEN_IS_OFF
222 CountMetric* metric = config.add_count_metric();
Yangster-mac94e197c2018-01-02 16:03:03 -0800223 metric->set_id(3);
224 metric->set_what(StringToId("BATTERY_LOW"));
Yangster-macb8144812018-01-04 10:56:23 -0800225 metric->set_bucket(ONE_MINUTE);
Yangster-mac20877162017-12-22 17:19:39 -0800226 // This case is interesting. We want to dimension across two atoms.
Yangster-mac468ff042018-01-17 12:26:34 -0800227 metric->mutable_dimensions_in_what()->add_child()->set_field(1);
Yao Chen5154a3792017-10-30 22:57:06 -0700228
Yangster-mace2cd6d52017-11-09 20:38:30 -0800229 auto alert = config.add_alert();
Jeffrey Huang38d70262020-03-19 17:28:59 -0700230 alert->set_id(kAlertId);
Yangster-mac94e197c2018-01-02 16:03:03 -0800231 alert->set_metric_id(3);
Yangster-maca7fb12d2018-01-03 17:17:20 -0800232 alert->set_num_buckets(10);
Yangster-mace2cd6d52017-11-09 20:38:30 -0800233 alert->set_refractory_period_secs(100);
234 alert->set_trigger_if_sum_gt(100);
Yao Chen5154a3792017-10-30 22:57:06 -0700235 return config;
236}
237
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800238StatsdConfig buildCirclePredicates() {
Yao Chencaf339d2017-10-06 16:01:10 -0700239 StatsdConfig config;
Yangster-mac94e197c2018-01-02 16:03:03 -0800240 config.set_id(12345);
Yao Chencaf339d2017-10-06 16:01:10 -0700241
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800242 AtomMatcher* eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800243 eventMatcher->set_id(StringToId("SCREEN_IS_ON"));
Yao Chencaf339d2017-10-06 16:01:10 -0700244
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800245 SimpleAtomMatcher* simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
Yangster-mac20877162017-12-22 17:19:39 -0800246 simpleAtomMatcher->set_atom_id(2 /*SCREEN_STATE_CHANGE*/);
247 simpleAtomMatcher->add_field_value_matcher()->set_field(
Yao Chencaf339d2017-10-06 16:01:10 -0700248 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE*/);
Yangster-mac20877162017-12-22 17:19:39 -0800249 simpleAtomMatcher->mutable_field_value_matcher(0)->set_eq_int(
Yao Chencaf339d2017-10-06 16:01:10 -0700250 2 /*SCREEN_STATE_CHANGE__DISPLAY_STATE__STATE_ON*/);
251
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800252 eventMatcher = config.add_atom_matcher();
Yangster-mac94e197c2018-01-02 16:03:03 -0800253 eventMatcher->set_id(StringToId("SCREEN_IS_OFF"));
Yao Chencaf339d2017-10-06 16:01:10 -0700254
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800255 simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
Yangster-mac20877162017-12-22 17:19:39 -0800256 simpleAtomMatcher->set_atom_id(2 /*SCREEN_STATE_CHANGE*/);
257 simpleAtomMatcher->add_field_value_matcher()->set_field(
Yao Chencaf339d2017-10-06 16:01:10 -0700258 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE*/);
Yangster-mac20877162017-12-22 17:19:39 -0800259 simpleAtomMatcher->mutable_field_value_matcher(0)->set_eq_int(
Yao Chencaf339d2017-10-06 16:01:10 -0700260 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE__STATE_OFF*/);
261
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800262 auto condition = config.add_predicate();
Yangster-mac94e197c2018-01-02 16:03:03 -0800263 condition->set_id(StringToId("SCREEN_IS_ON"));
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800264 SimplePredicate* simplePredicate = condition->mutable_simple_predicate();
Yangster-mac94e197c2018-01-02 16:03:03 -0800265 simplePredicate->set_start(StringToId("SCREEN_IS_ON"));
266 simplePredicate->set_stop(StringToId("SCREEN_IS_OFF"));
Yao Chencaf339d2017-10-06 16:01:10 -0700267
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800268 condition = config.add_predicate();
Yangster-mac94e197c2018-01-02 16:03:03 -0800269 condition->set_id(StringToId("SCREEN_IS_EITHER_ON_OFF"));
Yao Chencaf339d2017-10-06 16:01:10 -0700270
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800271 Predicate_Combination* combination = condition->mutable_combination();
Yao Chencaf339d2017-10-06 16:01:10 -0700272 combination->set_operation(LogicalOperation::OR);
Yangster-mac94e197c2018-01-02 16:03:03 -0800273 combination->add_predicate(StringToId("SCREEN_IS_ON"));
274 combination->add_predicate(StringToId("SCREEN_IS_EITHER_ON_OFF"));
Yao Chencaf339d2017-10-06 16:01:10 -0700275
276 return config;
277}
278
tsaichristine6e2e92d2020-05-18 14:39:45 -0700279StatsdConfig buildConfigWithDifferentPredicates() {
280 StatsdConfig config;
281 config.set_id(12345);
282
283 auto pulledAtomMatcher =
284 CreateSimpleAtomMatcher("SUBSYSTEM_SLEEP", util::SUBSYSTEM_SLEEP_STATE);
285 *config.add_atom_matcher() = pulledAtomMatcher;
286 auto screenOnAtomMatcher = CreateScreenTurnedOnAtomMatcher();
287 *config.add_atom_matcher() = screenOnAtomMatcher;
288 auto screenOffAtomMatcher = CreateScreenTurnedOffAtomMatcher();
289 *config.add_atom_matcher() = screenOffAtomMatcher;
290 auto batteryNoneAtomMatcher = CreateBatteryStateNoneMatcher();
291 *config.add_atom_matcher() = batteryNoneAtomMatcher;
292 auto batteryUsbAtomMatcher = CreateBatteryStateUsbMatcher();
293 *config.add_atom_matcher() = batteryUsbAtomMatcher;
294
295 // Simple condition with InitialValue set to default (unknown).
296 auto screenOnUnknownPredicate = CreateScreenIsOnPredicate();
297 *config.add_predicate() = screenOnUnknownPredicate;
298
299 // Simple condition with InitialValue set to false.
300 auto screenOnFalsePredicate = config.add_predicate();
301 screenOnFalsePredicate->set_id(StringToId("ScreenIsOnInitialFalse"));
302 SimplePredicate* simpleScreenOnFalsePredicate =
303 screenOnFalsePredicate->mutable_simple_predicate();
304 simpleScreenOnFalsePredicate->set_start(screenOnAtomMatcher.id());
305 simpleScreenOnFalsePredicate->set_stop(screenOffAtomMatcher.id());
306 simpleScreenOnFalsePredicate->set_initial_value(SimplePredicate_InitialValue_FALSE);
307
308 // Simple condition with InitialValue set to false.
309 auto onBatteryFalsePredicate = config.add_predicate();
310 onBatteryFalsePredicate->set_id(StringToId("OnBatteryInitialFalse"));
311 SimplePredicate* simpleOnBatteryFalsePredicate =
312 onBatteryFalsePredicate->mutable_simple_predicate();
313 simpleOnBatteryFalsePredicate->set_start(batteryNoneAtomMatcher.id());
314 simpleOnBatteryFalsePredicate->set_stop(batteryUsbAtomMatcher.id());
315 simpleOnBatteryFalsePredicate->set_initial_value(SimplePredicate_InitialValue_FALSE);
316
317 // Combination condition with both simple condition InitialValues set to false.
318 auto screenOnFalseOnBatteryFalsePredicate = config.add_predicate();
319 screenOnFalseOnBatteryFalsePredicate->set_id(StringToId("ScreenOnFalseOnBatteryFalse"));
320 screenOnFalseOnBatteryFalsePredicate->mutable_combination()->set_operation(
321 LogicalOperation::AND);
322 addPredicateToPredicateCombination(*screenOnFalsePredicate,
323 screenOnFalseOnBatteryFalsePredicate);
324 addPredicateToPredicateCombination(*onBatteryFalsePredicate,
325 screenOnFalseOnBatteryFalsePredicate);
326
327 // Combination condition with one simple condition InitialValue set to unknown and one set to
328 // false.
329 auto screenOnUnknownOnBatteryFalsePredicate = config.add_predicate();
330 screenOnUnknownOnBatteryFalsePredicate->set_id(StringToId("ScreenOnUnknowneOnBatteryFalse"));
331 screenOnUnknownOnBatteryFalsePredicate->mutable_combination()->set_operation(
332 LogicalOperation::AND);
333 addPredicateToPredicateCombination(screenOnUnknownPredicate,
334 screenOnUnknownOnBatteryFalsePredicate);
335 addPredicateToPredicateCombination(*onBatteryFalsePredicate,
336 screenOnUnknownOnBatteryFalsePredicate);
337
338 // Simple condition metric with initial value false.
339 ValueMetric* metric1 = config.add_value_metric();
340 metric1->set_id(StringToId("ValueSubsystemSleepWhileScreenOnInitialFalse"));
341 metric1->set_what(pulledAtomMatcher.id());
342 *metric1->mutable_value_field() =
343 CreateDimensions(util::SUBSYSTEM_SLEEP_STATE, {4 /* time sleeping field */});
344 metric1->set_bucket(FIVE_MINUTES);
345 metric1->set_condition(screenOnFalsePredicate->id());
346
347 // Simple condition metric with initial value unknown.
348 ValueMetric* metric2 = config.add_value_metric();
349 metric2->set_id(StringToId("ValueSubsystemSleepWhileScreenOnInitialUnknown"));
350 metric2->set_what(pulledAtomMatcher.id());
351 *metric2->mutable_value_field() =
352 CreateDimensions(util::SUBSYSTEM_SLEEP_STATE, {4 /* time sleeping field */});
353 metric2->set_bucket(FIVE_MINUTES);
354 metric2->set_condition(screenOnUnknownPredicate.id());
355
356 // Combination condition metric with initial values false and false.
357 ValueMetric* metric3 = config.add_value_metric();
358 metric3->set_id(StringToId("ValueSubsystemSleepWhileScreenOnFalseDeviceUnpluggedFalse"));
359 metric3->set_what(pulledAtomMatcher.id());
360 *metric3->mutable_value_field() =
361 CreateDimensions(util::SUBSYSTEM_SLEEP_STATE, {4 /* time sleeping field */});
362 metric3->set_bucket(FIVE_MINUTES);
363 metric3->set_condition(screenOnFalseOnBatteryFalsePredicate->id());
364
365 // Combination condition metric with initial values unknown and false.
366 ValueMetric* metric4 = config.add_value_metric();
367 metric4->set_id(StringToId("ValueSubsystemSleepWhileScreenOnUnknownDeviceUnpluggedFalse"));
368 metric4->set_what(pulledAtomMatcher.id());
369 *metric4->mutable_value_field() =
370 CreateDimensions(util::SUBSYSTEM_SLEEP_STATE, {4 /* time sleeping field */});
371 metric4->set_bucket(FIVE_MINUTES);
372 metric4->set_condition(screenOnUnknownOnBatteryFalsePredicate->id());
373
374 return config;
375}
376
Tej Singh3be093b2020-03-04 20:08:38 -0800377bool isSubset(const set<int32_t>& set1, const set<int32_t>& set2) {
378 return std::includes(set2.begin(), set2.end(), set1.begin(), set1.end());
379}
380} // anonymous namespace
381
tsaichristine6e2e92d2020-05-18 14:39:45 -0700382TEST(MetricsManagerTest, TestInitialConditions) {
383 UidMap uidMap;
384 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
385 sp<AlarmMonitor> anomalyAlarmMonitor;
386 sp<AlarmMonitor> periodicAlarmMonitor;
387 StatsdConfig config = buildConfigWithDifferentPredicates();
388 set<int> allTagIds;
389 vector<sp<LogMatchingTracker>> allAtomMatchers;
390 vector<sp<ConditionTracker>> allConditionTrackers;
391 vector<sp<MetricProducer>> allMetricProducers;
392 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
393 std::vector<sp<AlarmTracker>> allAlarmTrackers;
394 unordered_map<int, std::vector<int>> conditionToMetricMap;
395 unordered_map<int, std::vector<int>> trackerToMetricMap;
396 unordered_map<int, std::vector<int>> trackerToConditionMap;
397 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
398 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
399 unordered_map<int64_t, int> alertTrackerMap;
400 vector<int> metricsWithActivation;
401 std::set<int64_t> noReportMetricIds;
402
403 EXPECT_TRUE(initStatsdConfig(
404 kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor,
405 timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers, allConditionTrackers,
406 allMetricProducers, allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
407 trackerToMetricMap, trackerToConditionMap, activationAtomTrackerToMetricMap,
408 deactivationAtomTrackerToMetricMap, alertTrackerMap, metricsWithActivation,
409 noReportMetricIds));
410 ASSERT_EQ(4u, allMetricProducers.size());
411 ASSERT_EQ(5u, allConditionTrackers.size());
412
413 ConditionKey queryKey;
414 vector<ConditionState> conditionCache(5, ConditionState::kNotEvaluated);
415
416 allConditionTrackers[3]->isConditionMet(queryKey, allConditionTrackers, false, conditionCache);
417 allConditionTrackers[4]->isConditionMet(queryKey, allConditionTrackers, false, conditionCache);
418 EXPECT_EQ(ConditionState::kUnknown, conditionCache[0]);
419 EXPECT_EQ(ConditionState::kFalse, conditionCache[1]);
420 EXPECT_EQ(ConditionState::kFalse, conditionCache[2]);
421 EXPECT_EQ(ConditionState::kFalse, conditionCache[3]);
422 EXPECT_EQ(ConditionState::kUnknown, conditionCache[4]);
423
424 EXPECT_EQ(ConditionState::kFalse, allMetricProducers[0]->mCondition);
425 EXPECT_EQ(ConditionState::kUnknown, allMetricProducers[1]->mCondition);
426 EXPECT_EQ(ConditionState::kFalse, allMetricProducers[2]->mCondition);
427 EXPECT_EQ(ConditionState::kUnknown, allMetricProducers[3]->mCondition);
428}
429
Yao Chencaf339d2017-10-06 16:01:10 -0700430TEST(MetricsManagerTest, TestGoodConfig) {
Yangster-mac20877162017-12-22 17:19:39 -0800431 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700432 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800433 sp<AlarmMonitor> anomalyAlarmMonitor;
434 sp<AlarmMonitor> periodicAlarmMonitor;
Yao Chencaf339d2017-10-06 16:01:10 -0700435 StatsdConfig config = buildGoodConfig();
436 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800437 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yao Chencaf339d2017-10-06 16:01:10 -0700438 vector<sp<ConditionTracker>> allConditionTrackers;
439 vector<sp<MetricProducer>> allMetricProducers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800440 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800441 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yao Chencaf339d2017-10-06 16:01:10 -0700442 unordered_map<int, std::vector<int>> conditionToMetricMap;
443 unordered_map<int, std::vector<int>> trackerToMetricMap;
444 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700445 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
446 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700447 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700448 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800449 std::set<int64_t> noReportMetricIds;
Yao Chencaf339d2017-10-06 16:01:10 -0700450
Chenjie Yue2219202018-06-08 10:07:51 -0700451 EXPECT_TRUE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
452 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
453 allAtomMatchers, allConditionTrackers, allMetricProducers,
454 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700455 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700456 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700457 alertTrackerMap, metricsWithActivation,
458 noReportMetricIds));
Muhammad Qureshidff78d62020-05-11 13:37:43 -0700459 ASSERT_EQ(1u, allMetricProducers.size());
460 ASSERT_EQ(1u, allAnomalyTrackers.size());
461 ASSERT_EQ(1u, noReportMetricIds.size());
462 ASSERT_EQ(1u, alertTrackerMap.size());
Jeffrey Huang38d70262020-03-19 17:28:59 -0700463 EXPECT_NE(alertTrackerMap.find(kAlertId), alertTrackerMap.end());
464 EXPECT_EQ(alertTrackerMap.find(kAlertId)->second, 0);
Yao Chencaf339d2017-10-06 16:01:10 -0700465}
466
Yao Chen5154a3792017-10-30 22:57:06 -0700467TEST(MetricsManagerTest, TestDimensionMetricsWithMultiTags) {
Yangster-mac20877162017-12-22 17:19:39 -0800468 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700469 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800470 sp<AlarmMonitor> anomalyAlarmMonitor;
471 sp<AlarmMonitor> periodicAlarmMonitor;
Yao Chen5154a3792017-10-30 22:57:06 -0700472 StatsdConfig config = buildDimensionMetricsWithMultiTags();
473 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800474 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yao Chen5154a3792017-10-30 22:57:06 -0700475 vector<sp<ConditionTracker>> allConditionTrackers;
476 vector<sp<MetricProducer>> allMetricProducers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800477 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800478 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yao Chen5154a3792017-10-30 22:57:06 -0700479 unordered_map<int, std::vector<int>> conditionToMetricMap;
480 unordered_map<int, std::vector<int>> trackerToMetricMap;
481 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700482 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
483 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700484 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700485 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800486 std::set<int64_t> noReportMetricIds;
Yao Chen5154a3792017-10-30 22:57:06 -0700487
Chenjie Yue2219202018-06-08 10:07:51 -0700488 EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
489 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
490 allAtomMatchers, allConditionTrackers, allMetricProducers,
491 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700492 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700493 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700494 alertTrackerMap, metricsWithActivation,
495 noReportMetricIds));
Yao Chen5154a3792017-10-30 22:57:06 -0700496}
497
Yao Chencaf339d2017-10-06 16:01:10 -0700498TEST(MetricsManagerTest, TestCircleLogMatcherDependency) {
Yangster-mac20877162017-12-22 17:19:39 -0800499 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700500 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800501 sp<AlarmMonitor> anomalyAlarmMonitor;
502 sp<AlarmMonitor> periodicAlarmMonitor;
Yao Chencaf339d2017-10-06 16:01:10 -0700503 StatsdConfig config = buildCircleMatchers();
504 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800505 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yao Chencaf339d2017-10-06 16:01:10 -0700506 vector<sp<ConditionTracker>> allConditionTrackers;
507 vector<sp<MetricProducer>> allMetricProducers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800508 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800509 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yao Chencaf339d2017-10-06 16:01:10 -0700510 unordered_map<int, std::vector<int>> conditionToMetricMap;
511 unordered_map<int, std::vector<int>> trackerToMetricMap;
512 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700513 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
514 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700515 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700516 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800517 std::set<int64_t> noReportMetricIds;
Yao Chencaf339d2017-10-06 16:01:10 -0700518
Chenjie Yue2219202018-06-08 10:07:51 -0700519 EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
520 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
521 allAtomMatchers, allConditionTrackers, allMetricProducers,
522 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700523 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700524 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700525 alertTrackerMap, metricsWithActivation,
526 noReportMetricIds));
Yao Chencaf339d2017-10-06 16:01:10 -0700527}
528
529TEST(MetricsManagerTest, TestMissingMatchers) {
Yangster-mac20877162017-12-22 17:19:39 -0800530 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700531 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800532 sp<AlarmMonitor> anomalyAlarmMonitor;
533 sp<AlarmMonitor> periodicAlarmMonitor;
Yao Chencaf339d2017-10-06 16:01:10 -0700534 StatsdConfig config = buildMissingMatchers();
535 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800536 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yao Chencaf339d2017-10-06 16:01:10 -0700537 vector<sp<ConditionTracker>> allConditionTrackers;
538 vector<sp<MetricProducer>> allMetricProducers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800539 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800540 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yao Chencaf339d2017-10-06 16:01:10 -0700541 unordered_map<int, std::vector<int>> conditionToMetricMap;
542 unordered_map<int, std::vector<int>> trackerToMetricMap;
543 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700544 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
545 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700546 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700547 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800548 std::set<int64_t> noReportMetricIds;
Chenjie Yue2219202018-06-08 10:07:51 -0700549 EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
550 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
551 allAtomMatchers, allConditionTrackers, allMetricProducers,
552 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700553 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700554 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700555 alertTrackerMap, metricsWithActivation,
556 noReportMetricIds));
Yao Chencaf339d2017-10-06 16:01:10 -0700557}
558
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800559TEST(MetricsManagerTest, TestMissingPredicate) {
Yangster-mac20877162017-12-22 17:19:39 -0800560 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700561 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800562 sp<AlarmMonitor> anomalyAlarmMonitor;
563 sp<AlarmMonitor> periodicAlarmMonitor;
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800564 StatsdConfig config = buildMissingPredicate();
Yao Chen10535b92017-11-27 11:31:55 -0800565 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800566 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yao Chen10535b92017-11-27 11:31:55 -0800567 vector<sp<ConditionTracker>> allConditionTrackers;
568 vector<sp<MetricProducer>> allMetricProducers;
569 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800570 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yao Chen10535b92017-11-27 11:31:55 -0800571 unordered_map<int, std::vector<int>> conditionToMetricMap;
572 unordered_map<int, std::vector<int>> trackerToMetricMap;
573 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700574 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
575 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700576 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700577 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800578 std::set<int64_t> noReportMetricIds;
Chenjie Yue2219202018-06-08 10:07:51 -0700579 EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
580 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
581 allAtomMatchers, allConditionTrackers, allMetricProducers,
582 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700583 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700584 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700585 alertTrackerMap, metricsWithActivation, noReportMetricIds));
Yao Chen10535b92017-11-27 11:31:55 -0800586}
587
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800588TEST(MetricsManagerTest, TestCirclePredicateDependency) {
Yangster-mac20877162017-12-22 17:19:39 -0800589 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700590 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800591 sp<AlarmMonitor> anomalyAlarmMonitor;
592 sp<AlarmMonitor> periodicAlarmMonitor;
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800593 StatsdConfig config = buildCirclePredicates();
Yao Chencaf339d2017-10-06 16:01:10 -0700594 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800595 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yao Chencaf339d2017-10-06 16:01:10 -0700596 vector<sp<ConditionTracker>> allConditionTrackers;
597 vector<sp<MetricProducer>> allMetricProducers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800598 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800599 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yao Chencaf339d2017-10-06 16:01:10 -0700600 unordered_map<int, std::vector<int>> conditionToMetricMap;
601 unordered_map<int, std::vector<int>> trackerToMetricMap;
602 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700603 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
604 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700605 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700606 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800607 std::set<int64_t> noReportMetricIds;
Yao Chencaf339d2017-10-06 16:01:10 -0700608
Chenjie Yue2219202018-06-08 10:07:51 -0700609 EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
610 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
611 allAtomMatchers, allConditionTrackers, allMetricProducers,
612 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700613 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700614 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700615 alertTrackerMap, metricsWithActivation,
616 noReportMetricIds));
Yangster-mace2cd6d52017-11-09 20:38:30 -0800617}
618
619TEST(MetricsManagerTest, testAlertWithUnknownMetric) {
Yangster-mac20877162017-12-22 17:19:39 -0800620 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700621 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800622 sp<AlarmMonitor> anomalyAlarmMonitor;
623 sp<AlarmMonitor> periodicAlarmMonitor;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800624 StatsdConfig config = buildAlertWithUnknownMetric();
625 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800626 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800627 vector<sp<ConditionTracker>> allConditionTrackers;
628 vector<sp<MetricProducer>> allMetricProducers;
629 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800630 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800631 unordered_map<int, std::vector<int>> conditionToMetricMap;
632 unordered_map<int, std::vector<int>> trackerToMetricMap;
633 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700634 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
635 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700636 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700637 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800638 std::set<int64_t> noReportMetricIds;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800639
Chenjie Yue2219202018-06-08 10:07:51 -0700640 EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
641 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
642 allAtomMatchers, allConditionTrackers, allMetricProducers,
643 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700644 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700645 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700646 alertTrackerMap, metricsWithActivation,
647 noReportMetricIds));
Yao Chencaf339d2017-10-06 16:01:10 -0700648}
649
Tej Singh3be093b2020-03-04 20:08:38 -0800650TEST(MetricsManagerTest, TestLogSources) {
651 string app1 = "app1";
652 set<int32_t> app1Uids = {1111, 11111};
653 string app2 = "app2";
654 set<int32_t> app2Uids = {2222};
655 string app3 = "app3";
656 set<int32_t> app3Uids = {3333, 1111};
657
658 map<string, set<int32_t>> pkgToUids;
659 pkgToUids[app1] = app1Uids;
660 pkgToUids[app2] = app2Uids;
661 pkgToUids[app3] = app3Uids;
662
663 int32_t atom1 = 10;
664 int32_t atom2 = 20;
665 int32_t atom3 = 30;
666 sp<MockUidMap> uidMap = new StrictMock<MockUidMap>();
667 EXPECT_CALL(*uidMap, getAppUid(_))
668 .Times(4)
669 .WillRepeatedly(Invoke([&pkgToUids](const string& pkg) {
670 const auto& it = pkgToUids.find(pkg);
671 if (it != pkgToUids.end()) {
672 return it->second;
673 }
674 return set<int32_t>();
675 }));
676 sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
677 EXPECT_CALL(*pullerManager, RegisterPullUidProvider(kConfigKey, _)).Times(1);
Tej Singh3eb9ced2020-04-20 22:04:38 -0700678 EXPECT_CALL(*pullerManager, UnregisterPullUidProvider(kConfigKey, _)).Times(1);
Tej Singh3be093b2020-03-04 20:08:38 -0800679
680 sp<AlarmMonitor> anomalyAlarmMonitor;
681 sp<AlarmMonitor> periodicAlarmMonitor;
682
683 StatsdConfig config = buildGoodConfig();
684 config.add_allowed_log_source("AID_SYSTEM");
685 config.add_allowed_log_source(app1);
686 config.add_default_pull_packages("AID_SYSTEM");
687 config.add_default_pull_packages("AID_ROOT");
688
689 const set<int32_t> defaultPullUids = {AID_SYSTEM, AID_ROOT};
690
691 PullAtomPackages* pullAtomPackages = config.add_pull_atom_packages();
692 pullAtomPackages->set_atom_id(atom1);
693 pullAtomPackages->add_packages(app1);
694 pullAtomPackages->add_packages(app3);
695
696 pullAtomPackages = config.add_pull_atom_packages();
697 pullAtomPackages->set_atom_id(atom2);
698 pullAtomPackages->add_packages(app2);
699 pullAtomPackages->add_packages("AID_STATSD");
700
701 MetricsManager metricsManager(kConfigKey, config, timeBaseSec, timeBaseSec, uidMap,
702 pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor);
703
704 EXPECT_TRUE(metricsManager.isConfigValid());
705
706 ASSERT_EQ(metricsManager.mAllowedUid.size(), 1);
707 EXPECT_EQ(metricsManager.mAllowedUid[0], AID_SYSTEM);
708
709 ASSERT_EQ(metricsManager.mAllowedPkg.size(), 1);
710 EXPECT_EQ(metricsManager.mAllowedPkg[0], app1);
711
712 ASSERT_EQ(metricsManager.mAllowedLogSources.size(), 3);
713 EXPECT_TRUE(isSubset({AID_SYSTEM}, metricsManager.mAllowedLogSources));
714 EXPECT_TRUE(isSubset(app1Uids, metricsManager.mAllowedLogSources));
715
716 ASSERT_EQ(metricsManager.mDefaultPullUids.size(), 2);
717 EXPECT_TRUE(isSubset(defaultPullUids, metricsManager.mDefaultPullUids));
718 ;
719
720 vector<int32_t> atom1Uids = metricsManager.getPullAtomUids(atom1);
721 ASSERT_EQ(atom1Uids.size(), 5);
722 set<int32_t> expectedAtom1Uids;
723 expectedAtom1Uids.insert(defaultPullUids.begin(), defaultPullUids.end());
724 expectedAtom1Uids.insert(app1Uids.begin(), app1Uids.end());
725 expectedAtom1Uids.insert(app3Uids.begin(), app3Uids.end());
726 EXPECT_TRUE(isSubset(expectedAtom1Uids, set<int32_t>(atom1Uids.begin(), atom1Uids.end())));
727
728 vector<int32_t> atom2Uids = metricsManager.getPullAtomUids(atom2);
729 ASSERT_EQ(atom2Uids.size(), 4);
730 set<int32_t> expectedAtom2Uids;
731 expectedAtom1Uids.insert(defaultPullUids.begin(), defaultPullUids.end());
732 expectedAtom1Uids.insert(app2Uids.begin(), app2Uids.end());
733 expectedAtom1Uids.insert(AID_STATSD);
734 EXPECT_TRUE(isSubset(expectedAtom2Uids, set<int32_t>(atom2Uids.begin(), atom2Uids.end())));
735
736 vector<int32_t> atom3Uids = metricsManager.getPullAtomUids(atom3);
737 ASSERT_EQ(atom3Uids.size(), 2);
738 EXPECT_TRUE(isSubset(defaultPullUids, set<int32_t>(atom3Uids.begin(), atom3Uids.end())));
739}
740
Muhammad Qureshif6816462020-05-13 15:13:33 -0700741TEST(MetricsManagerTest, TestCheckLogCredentialsWhitelistedAtom) {
742 sp<UidMap> uidMap;
743 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
744 sp<AlarmMonitor> anomalyAlarmMonitor;
745 sp<AlarmMonitor> periodicAlarmMonitor;
746
747 StatsdConfig config = buildGoodConfig();
748 config.add_whitelisted_atom_ids(3);
749 config.add_whitelisted_atom_ids(4);
750
751 MetricsManager metricsManager(kConfigKey, config, timeBaseSec, timeBaseSec, uidMap,
752 pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor);
753
754 LogEvent event(0 /* uid */, 0 /* pid */);
755 CreateNoValuesLogEvent(&event, 10 /* atom id */, 0 /* timestamp */);
756 EXPECT_FALSE(metricsManager.checkLogCredentials(event));
757
758 CreateNoValuesLogEvent(&event, 3 /* atom id */, 0 /* timestamp */);
759 EXPECT_TRUE(metricsManager.checkLogCredentials(event));
760
761 CreateNoValuesLogEvent(&event, 4 /* atom id */, 0 /* timestamp */);
762 EXPECT_TRUE(metricsManager.checkLogCredentials(event));
763}
764
Muhammad Qureshib1eee0be2020-05-15 05:46:38 -0700765TEST(MetricsManagerTest, TestWhitelistedAtomStateTracker) {
766 sp<UidMap> uidMap;
767 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
768 sp<AlarmMonitor> anomalyAlarmMonitor;
769 sp<AlarmMonitor> periodicAlarmMonitor;
770
771 StatsdConfig config = buildGoodConfig();
772 config.add_allowed_log_source("AID_SYSTEM");
773 config.add_whitelisted_atom_ids(3);
774 config.add_whitelisted_atom_ids(4);
775
776 State state;
777 state.set_id(1);
778 state.set_atom_id(3);
779
780 *config.add_state() = state;
781
782 config.mutable_count_metric(0)->add_slice_by_state(state.id());
783
784 StateManager::getInstance().clear();
785
786 MetricsManager metricsManager(kConfigKey, config, timeBaseSec, timeBaseSec, uidMap,
787 pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor);
788
789 EXPECT_EQ(0, StateManager::getInstance().getStateTrackersCount());
790 EXPECT_FALSE(metricsManager.isConfigValid());
791}
792
Tej Singh3be093b2020-03-04 20:08:38 -0800793} // namespace statsd
794} // namespace os
795} // namespace android
796
Yao Chencaf339d2017-10-06 16:01:10 -0700797#else
798GTEST_LOG_(INFO) << "This test does nothing.\n";
799#endif