blob: ef8a34e25d730b88b4996a34251d38faaa260816 [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
Tej Singh3be093b2020-03-04 20:08:38 -0800279bool isSubset(const set<int32_t>& set1, const set<int32_t>& set2) {
280 return std::includes(set2.begin(), set2.end(), set1.begin(), set1.end());
281}
282} // anonymous namespace
283
Yao Chencaf339d2017-10-06 16:01:10 -0700284TEST(MetricsManagerTest, TestGoodConfig) {
Yangster-mac20877162017-12-22 17:19:39 -0800285 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700286 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800287 sp<AlarmMonitor> anomalyAlarmMonitor;
288 sp<AlarmMonitor> periodicAlarmMonitor;
Yao Chencaf339d2017-10-06 16:01:10 -0700289 StatsdConfig config = buildGoodConfig();
290 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800291 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yao Chencaf339d2017-10-06 16:01:10 -0700292 vector<sp<ConditionTracker>> allConditionTrackers;
293 vector<sp<MetricProducer>> allMetricProducers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800294 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800295 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yao Chencaf339d2017-10-06 16:01:10 -0700296 unordered_map<int, std::vector<int>> conditionToMetricMap;
297 unordered_map<int, std::vector<int>> trackerToMetricMap;
298 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700299 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
300 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700301 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700302 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800303 std::set<int64_t> noReportMetricIds;
Yao Chencaf339d2017-10-06 16:01:10 -0700304
Chenjie Yue2219202018-06-08 10:07:51 -0700305 EXPECT_TRUE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
306 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
307 allAtomMatchers, allConditionTrackers, allMetricProducers,
308 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700309 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700310 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700311 alertTrackerMap, metricsWithActivation,
312 noReportMetricIds));
Yangster-mace2cd6d52017-11-09 20:38:30 -0800313 EXPECT_EQ(1u, allMetricProducers.size());
314 EXPECT_EQ(1u, allAnomalyTrackers.size());
Yangster-mac94e197c2018-01-02 16:03:03 -0800315 EXPECT_EQ(1u, noReportMetricIds.size());
Jeffrey Huang38d70262020-03-19 17:28:59 -0700316 EXPECT_EQ(1u, alertTrackerMap.size());
317 EXPECT_NE(alertTrackerMap.find(kAlertId), alertTrackerMap.end());
318 EXPECT_EQ(alertTrackerMap.find(kAlertId)->second, 0);
Yao Chencaf339d2017-10-06 16:01:10 -0700319}
320
Yao Chen5154a3792017-10-30 22:57:06 -0700321TEST(MetricsManagerTest, TestDimensionMetricsWithMultiTags) {
Yangster-mac20877162017-12-22 17:19:39 -0800322 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700323 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800324 sp<AlarmMonitor> anomalyAlarmMonitor;
325 sp<AlarmMonitor> periodicAlarmMonitor;
Yao Chen5154a3792017-10-30 22:57:06 -0700326 StatsdConfig config = buildDimensionMetricsWithMultiTags();
327 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800328 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yao Chen5154a3792017-10-30 22:57:06 -0700329 vector<sp<ConditionTracker>> allConditionTrackers;
330 vector<sp<MetricProducer>> allMetricProducers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800331 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800332 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yao Chen5154a3792017-10-30 22:57:06 -0700333 unordered_map<int, std::vector<int>> conditionToMetricMap;
334 unordered_map<int, std::vector<int>> trackerToMetricMap;
335 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700336 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
337 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700338 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700339 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800340 std::set<int64_t> noReportMetricIds;
Yao Chen5154a3792017-10-30 22:57:06 -0700341
Chenjie Yue2219202018-06-08 10:07:51 -0700342 EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
343 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
344 allAtomMatchers, allConditionTrackers, allMetricProducers,
345 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700346 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700347 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700348 alertTrackerMap, metricsWithActivation,
349 noReportMetricIds));
Yao Chen5154a3792017-10-30 22:57:06 -0700350}
351
Yao Chencaf339d2017-10-06 16:01:10 -0700352TEST(MetricsManagerTest, TestCircleLogMatcherDependency) {
Yangster-mac20877162017-12-22 17:19:39 -0800353 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700354 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800355 sp<AlarmMonitor> anomalyAlarmMonitor;
356 sp<AlarmMonitor> periodicAlarmMonitor;
Yao Chencaf339d2017-10-06 16:01:10 -0700357 StatsdConfig config = buildCircleMatchers();
358 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800359 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yao Chencaf339d2017-10-06 16:01:10 -0700360 vector<sp<ConditionTracker>> allConditionTrackers;
361 vector<sp<MetricProducer>> allMetricProducers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800362 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800363 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yao Chencaf339d2017-10-06 16:01:10 -0700364 unordered_map<int, std::vector<int>> conditionToMetricMap;
365 unordered_map<int, std::vector<int>> trackerToMetricMap;
366 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700367 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
368 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700369 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700370 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800371 std::set<int64_t> noReportMetricIds;
Yao Chencaf339d2017-10-06 16:01:10 -0700372
Chenjie Yue2219202018-06-08 10:07:51 -0700373 EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
374 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
375 allAtomMatchers, allConditionTrackers, allMetricProducers,
376 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700377 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700378 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700379 alertTrackerMap, metricsWithActivation,
380 noReportMetricIds));
Yao Chencaf339d2017-10-06 16:01:10 -0700381}
382
383TEST(MetricsManagerTest, TestMissingMatchers) {
Yangster-mac20877162017-12-22 17:19:39 -0800384 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700385 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800386 sp<AlarmMonitor> anomalyAlarmMonitor;
387 sp<AlarmMonitor> periodicAlarmMonitor;
Yao Chencaf339d2017-10-06 16:01:10 -0700388 StatsdConfig config = buildMissingMatchers();
389 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800390 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yao Chencaf339d2017-10-06 16:01:10 -0700391 vector<sp<ConditionTracker>> allConditionTrackers;
392 vector<sp<MetricProducer>> allMetricProducers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800393 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800394 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yao Chencaf339d2017-10-06 16:01:10 -0700395 unordered_map<int, std::vector<int>> conditionToMetricMap;
396 unordered_map<int, std::vector<int>> trackerToMetricMap;
397 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700398 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
399 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700400 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700401 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800402 std::set<int64_t> noReportMetricIds;
Chenjie Yue2219202018-06-08 10:07:51 -0700403 EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
404 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
405 allAtomMatchers, allConditionTrackers, allMetricProducers,
406 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700407 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700408 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700409 alertTrackerMap, metricsWithActivation,
410 noReportMetricIds));
Yao Chencaf339d2017-10-06 16:01:10 -0700411}
412
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800413TEST(MetricsManagerTest, TestMissingPredicate) {
Yangster-mac20877162017-12-22 17:19:39 -0800414 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700415 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800416 sp<AlarmMonitor> anomalyAlarmMonitor;
417 sp<AlarmMonitor> periodicAlarmMonitor;
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800418 StatsdConfig config = buildMissingPredicate();
Yao Chen10535b92017-11-27 11:31:55 -0800419 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800420 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yao Chen10535b92017-11-27 11:31:55 -0800421 vector<sp<ConditionTracker>> allConditionTrackers;
422 vector<sp<MetricProducer>> allMetricProducers;
423 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800424 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yao Chen10535b92017-11-27 11:31:55 -0800425 unordered_map<int, std::vector<int>> conditionToMetricMap;
426 unordered_map<int, std::vector<int>> trackerToMetricMap;
427 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700428 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
429 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700430 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700431 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800432 std::set<int64_t> noReportMetricIds;
Chenjie Yue2219202018-06-08 10:07:51 -0700433 EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
434 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
435 allAtomMatchers, allConditionTrackers, allMetricProducers,
436 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700437 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700438 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700439 alertTrackerMap, metricsWithActivation, noReportMetricIds));
Yao Chen10535b92017-11-27 11:31:55 -0800440}
441
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800442TEST(MetricsManagerTest, TestCirclePredicateDependency) {
Yangster-mac20877162017-12-22 17:19:39 -0800443 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700444 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800445 sp<AlarmMonitor> anomalyAlarmMonitor;
446 sp<AlarmMonitor> periodicAlarmMonitor;
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800447 StatsdConfig config = buildCirclePredicates();
Yao Chencaf339d2017-10-06 16:01:10 -0700448 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800449 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yao Chencaf339d2017-10-06 16:01:10 -0700450 vector<sp<ConditionTracker>> allConditionTrackers;
451 vector<sp<MetricProducer>> allMetricProducers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800452 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800453 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yao Chencaf339d2017-10-06 16:01:10 -0700454 unordered_map<int, std::vector<int>> conditionToMetricMap;
455 unordered_map<int, std::vector<int>> trackerToMetricMap;
456 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700457 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
458 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700459 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700460 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800461 std::set<int64_t> noReportMetricIds;
Yao Chencaf339d2017-10-06 16:01:10 -0700462
Chenjie Yue2219202018-06-08 10:07:51 -0700463 EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
464 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
465 allAtomMatchers, allConditionTrackers, allMetricProducers,
466 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700467 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700468 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700469 alertTrackerMap, metricsWithActivation,
470 noReportMetricIds));
Yangster-mace2cd6d52017-11-09 20:38:30 -0800471}
472
473TEST(MetricsManagerTest, testAlertWithUnknownMetric) {
Yangster-mac20877162017-12-22 17:19:39 -0800474 UidMap uidMap;
Chenjie Yue2219202018-06-08 10:07:51 -0700475 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-mac932ecec2018-02-01 10:23:52 -0800476 sp<AlarmMonitor> anomalyAlarmMonitor;
477 sp<AlarmMonitor> periodicAlarmMonitor;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800478 StatsdConfig config = buildAlertWithUnknownMetric();
479 set<int> allTagIds;
Stefan Lafonb8c9aa82017-12-03 14:27:25 -0800480 vector<sp<LogMatchingTracker>> allAtomMatchers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800481 vector<sp<ConditionTracker>> allConditionTrackers;
482 vector<sp<MetricProducer>> allMetricProducers;
483 std::vector<sp<AnomalyTracker>> allAnomalyTrackers;
Yangster-mac932ecec2018-02-01 10:23:52 -0800484 std::vector<sp<AlarmTracker>> allAlarmTrackers;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800485 unordered_map<int, std::vector<int>> conditionToMetricMap;
486 unordered_map<int, std::vector<int>> trackerToMetricMap;
487 unordered_map<int, std::vector<int>> trackerToConditionMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700488 unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap;
489 unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap;
Jeffrey Huang38d70262020-03-19 17:28:59 -0700490 unordered_map<int64_t, int> alertTrackerMap;
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700491 vector<int> metricsWithActivation;
Yangster-mac94e197c2018-01-02 16:03:03 -0800492 std::set<int64_t> noReportMetricIds;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800493
Chenjie Yue2219202018-06-08 10:07:51 -0700494 EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
495 periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
496 allAtomMatchers, allConditionTrackers, allMetricProducers,
497 allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
Yangster-mac849dfdc22018-10-12 15:41:45 -0700498 trackerToMetricMap, trackerToConditionMap,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700499 activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
Jeffrey Huang38d70262020-03-19 17:28:59 -0700500 alertTrackerMap, metricsWithActivation,
501 noReportMetricIds));
Yao Chencaf339d2017-10-06 16:01:10 -0700502}
503
Tej Singh3be093b2020-03-04 20:08:38 -0800504TEST(MetricsManagerTest, TestLogSources) {
505 string app1 = "app1";
506 set<int32_t> app1Uids = {1111, 11111};
507 string app2 = "app2";
508 set<int32_t> app2Uids = {2222};
509 string app3 = "app3";
510 set<int32_t> app3Uids = {3333, 1111};
511
512 map<string, set<int32_t>> pkgToUids;
513 pkgToUids[app1] = app1Uids;
514 pkgToUids[app2] = app2Uids;
515 pkgToUids[app3] = app3Uids;
516
517 int32_t atom1 = 10;
518 int32_t atom2 = 20;
519 int32_t atom3 = 30;
520 sp<MockUidMap> uidMap = new StrictMock<MockUidMap>();
521 EXPECT_CALL(*uidMap, getAppUid(_))
522 .Times(4)
523 .WillRepeatedly(Invoke([&pkgToUids](const string& pkg) {
524 const auto& it = pkgToUids.find(pkg);
525 if (it != pkgToUids.end()) {
526 return it->second;
527 }
528 return set<int32_t>();
529 }));
530 sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
531 EXPECT_CALL(*pullerManager, RegisterPullUidProvider(kConfigKey, _)).Times(1);
Tej Singh3eb9ced2020-04-20 22:04:38 -0700532 EXPECT_CALL(*pullerManager, UnregisterPullUidProvider(kConfigKey, _)).Times(1);
Tej Singh3be093b2020-03-04 20:08:38 -0800533
534 sp<AlarmMonitor> anomalyAlarmMonitor;
535 sp<AlarmMonitor> periodicAlarmMonitor;
536
537 StatsdConfig config = buildGoodConfig();
538 config.add_allowed_log_source("AID_SYSTEM");
539 config.add_allowed_log_source(app1);
540 config.add_default_pull_packages("AID_SYSTEM");
541 config.add_default_pull_packages("AID_ROOT");
542
543 const set<int32_t> defaultPullUids = {AID_SYSTEM, AID_ROOT};
544
545 PullAtomPackages* pullAtomPackages = config.add_pull_atom_packages();
546 pullAtomPackages->set_atom_id(atom1);
547 pullAtomPackages->add_packages(app1);
548 pullAtomPackages->add_packages(app3);
549
550 pullAtomPackages = config.add_pull_atom_packages();
551 pullAtomPackages->set_atom_id(atom2);
552 pullAtomPackages->add_packages(app2);
553 pullAtomPackages->add_packages("AID_STATSD");
554
555 MetricsManager metricsManager(kConfigKey, config, timeBaseSec, timeBaseSec, uidMap,
556 pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor);
557
558 EXPECT_TRUE(metricsManager.isConfigValid());
559
560 ASSERT_EQ(metricsManager.mAllowedUid.size(), 1);
561 EXPECT_EQ(metricsManager.mAllowedUid[0], AID_SYSTEM);
562
563 ASSERT_EQ(metricsManager.mAllowedPkg.size(), 1);
564 EXPECT_EQ(metricsManager.mAllowedPkg[0], app1);
565
566 ASSERT_EQ(metricsManager.mAllowedLogSources.size(), 3);
567 EXPECT_TRUE(isSubset({AID_SYSTEM}, metricsManager.mAllowedLogSources));
568 EXPECT_TRUE(isSubset(app1Uids, metricsManager.mAllowedLogSources));
569
570 ASSERT_EQ(metricsManager.mDefaultPullUids.size(), 2);
571 EXPECT_TRUE(isSubset(defaultPullUids, metricsManager.mDefaultPullUids));
572 ;
573
574 vector<int32_t> atom1Uids = metricsManager.getPullAtomUids(atom1);
575 ASSERT_EQ(atom1Uids.size(), 5);
576 set<int32_t> expectedAtom1Uids;
577 expectedAtom1Uids.insert(defaultPullUids.begin(), defaultPullUids.end());
578 expectedAtom1Uids.insert(app1Uids.begin(), app1Uids.end());
579 expectedAtom1Uids.insert(app3Uids.begin(), app3Uids.end());
580 EXPECT_TRUE(isSubset(expectedAtom1Uids, set<int32_t>(atom1Uids.begin(), atom1Uids.end())));
581
582 vector<int32_t> atom2Uids = metricsManager.getPullAtomUids(atom2);
583 ASSERT_EQ(atom2Uids.size(), 4);
584 set<int32_t> expectedAtom2Uids;
585 expectedAtom1Uids.insert(defaultPullUids.begin(), defaultPullUids.end());
586 expectedAtom1Uids.insert(app2Uids.begin(), app2Uids.end());
587 expectedAtom1Uids.insert(AID_STATSD);
588 EXPECT_TRUE(isSubset(expectedAtom2Uids, set<int32_t>(atom2Uids.begin(), atom2Uids.end())));
589
590 vector<int32_t> atom3Uids = metricsManager.getPullAtomUids(atom3);
591 ASSERT_EQ(atom3Uids.size(), 2);
592 EXPECT_TRUE(isSubset(defaultPullUids, set<int32_t>(atom3Uids.begin(), atom3Uids.end())));
593}
594
Muhammad Qureshif6816462020-05-13 15:13:33 -0700595TEST(MetricsManagerTest, TestCheckLogCredentialsWhitelistedAtom) {
596 sp<UidMap> uidMap;
597 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
598 sp<AlarmMonitor> anomalyAlarmMonitor;
599 sp<AlarmMonitor> periodicAlarmMonitor;
600
601 StatsdConfig config = buildGoodConfig();
602 config.add_whitelisted_atom_ids(3);
603 config.add_whitelisted_atom_ids(4);
604
605 MetricsManager metricsManager(kConfigKey, config, timeBaseSec, timeBaseSec, uidMap,
606 pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor);
607
608 LogEvent event(0 /* uid */, 0 /* pid */);
609 CreateNoValuesLogEvent(&event, 10 /* atom id */, 0 /* timestamp */);
610 EXPECT_FALSE(metricsManager.checkLogCredentials(event));
611
612 CreateNoValuesLogEvent(&event, 3 /* atom id */, 0 /* timestamp */);
613 EXPECT_TRUE(metricsManager.checkLogCredentials(event));
614
615 CreateNoValuesLogEvent(&event, 4 /* atom id */, 0 /* timestamp */);
616 EXPECT_TRUE(metricsManager.checkLogCredentials(event));
617}
618
Muhammad Qureshib1eee0be2020-05-15 05:46:38 -0700619TEST(MetricsManagerTest, TestWhitelistedAtomStateTracker) {
620 sp<UidMap> uidMap;
621 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
622 sp<AlarmMonitor> anomalyAlarmMonitor;
623 sp<AlarmMonitor> periodicAlarmMonitor;
624
625 StatsdConfig config = buildGoodConfig();
626 config.add_allowed_log_source("AID_SYSTEM");
627 config.add_whitelisted_atom_ids(3);
628 config.add_whitelisted_atom_ids(4);
629
630 State state;
631 state.set_id(1);
632 state.set_atom_id(3);
633
634 *config.add_state() = state;
635
636 config.mutable_count_metric(0)->add_slice_by_state(state.id());
637
638 StateManager::getInstance().clear();
639
640 MetricsManager metricsManager(kConfigKey, config, timeBaseSec, timeBaseSec, uidMap,
641 pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor);
642
643 EXPECT_EQ(0, StateManager::getInstance().getStateTrackersCount());
644 EXPECT_FALSE(metricsManager.isConfigValid());
645}
646
Tej Singh3be093b2020-03-04 20:08:38 -0800647} // namespace statsd
648} // namespace os
649} // namespace android
650
Yao Chencaf339d2017-10-06 16:01:10 -0700651#else
652GTEST_LOG_(INFO) << "This test does nothing.\n";
653#endif