Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 1 | // Copyright (C) 2017 The Android Open Source Project |
| 2 | // |
| 3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 | // you may not use this file except in compliance with the License. |
| 5 | // You may obtain a copy of the License at |
| 6 | // |
| 7 | // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 | // |
| 9 | // Unless required by applicable law or agreed to in writing, software |
| 10 | // distributed under the License is distributed on an "AS IS" BASIS, |
| 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 | // See the License for the specific language governing permissions and |
| 13 | // limitations under the License. |
| 14 | |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 15 | #include <gtest/gtest.h> |
Tej Singh | 3be093b | 2020-03-04 20:08:38 -0800 | [diff] [blame] | 16 | #include <private/android_filesystem_config.h> |
| 17 | #include <stdio.h> |
Joe Onorato | 9fc9edf | 2017-10-15 20:08:52 -0700 | [diff] [blame] | 18 | |
Tej Singh | 3be093b | 2020-03-04 20:08:38 -0800 | [diff] [blame] | 19 | #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 Onorato | 9fc9edf | 2017-10-15 20:08:52 -0700 | [diff] [blame] | 25 | #include "src/condition/ConditionTracker.h" |
| 26 | #include "src/matchers/LogMatchingTracker.h" |
| 27 | #include "src/metrics/CountMetricProducer.h" |
Yangster | 1d4d686 | 2017-10-31 12:58:51 -0700 | [diff] [blame] | 28 | #include "src/metrics/GaugeMetricProducer.h" |
Joe Onorato | 9fc9edf | 2017-10-15 20:08:52 -0700 | [diff] [blame] | 29 | #include "src/metrics/MetricProducer.h" |
Chenjie Yu | b3dda41 | 2017-10-24 13:41:59 -0700 | [diff] [blame] | 30 | #include "src/metrics/ValueMetricProducer.h" |
Joe Onorato | 9fc9edf | 2017-10-15 20:08:52 -0700 | [diff] [blame] | 31 | #include "src/metrics/metrics_manager_util.h" |
Muhammad Qureshi | b1eee0be | 2020-05-15 05:46:38 -0700 | [diff] [blame] | 32 | #include "src/state/StateManager.h" |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 33 | #include "statsd_test_util.h" |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 34 | |
Tej Singh | 3be093b | 2020-03-04 20:08:38 -0800 | [diff] [blame] | 35 | using namespace testing; |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 36 | using android::sp; |
Tej Singh | 3be093b | 2020-03-04 20:08:38 -0800 | [diff] [blame] | 37 | using android::os::statsd::Predicate; |
| 38 | using std::map; |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 39 | using std::set; |
| 40 | using std::unordered_map; |
| 41 | using std::vector; |
| 42 | |
| 43 | #ifdef __ANDROID__ |
| 44 | |
Tej Singh | 3be093b | 2020-03-04 20:08:38 -0800 | [diff] [blame] | 45 | namespace android { |
| 46 | namespace os { |
| 47 | namespace statsd { |
| 48 | |
| 49 | namespace { |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 50 | const ConfigKey kConfigKey(0, 12345); |
Jeffrey Huang | 38d7026 | 2020-03-19 17:28:59 -0700 | [diff] [blame] | 51 | const long kAlertId = 3; |
Yao Chen | b356151 | 2017-11-21 18:07:17 -0800 | [diff] [blame] | 52 | |
Chenjie Yu | 85ed838 | 2017-12-14 16:48:54 -0800 | [diff] [blame] | 53 | const long timeBaseSec = 1000; |
| 54 | |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 55 | StatsdConfig buildGoodConfig() { |
| 56 | StatsdConfig config; |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 57 | config.set_id(12345); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 58 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 59 | AtomMatcher* eventMatcher = config.add_atom_matcher(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 60 | eventMatcher->set_id(StringToId("SCREEN_IS_ON")); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 61 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 62 | SimpleAtomMatcher* simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher(); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 63 | simpleAtomMatcher->set_atom_id(2 /*SCREEN_STATE_CHANGE*/); |
| 64 | simpleAtomMatcher->add_field_value_matcher()->set_field( |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 65 | 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE*/); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 66 | simpleAtomMatcher->mutable_field_value_matcher(0)->set_eq_int( |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 67 | 2 /*SCREEN_STATE_CHANGE__DISPLAY_STATE__STATE_ON*/); |
| 68 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 69 | eventMatcher = config.add_atom_matcher(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 70 | eventMatcher->set_id(StringToId("SCREEN_IS_OFF")); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 71 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 72 | simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher(); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 73 | simpleAtomMatcher->set_atom_id(2 /*SCREEN_STATE_CHANGE*/); |
| 74 | simpleAtomMatcher->add_field_value_matcher()->set_field( |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 75 | 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE*/); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 76 | simpleAtomMatcher->mutable_field_value_matcher(0)->set_eq_int( |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 77 | 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE__STATE_OFF*/); |
| 78 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 79 | eventMatcher = config.add_atom_matcher(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 80 | eventMatcher->set_id(StringToId("SCREEN_ON_OR_OFF")); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 81 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 82 | AtomMatcher_Combination* combination = eventMatcher->mutable_combination(); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 83 | combination->set_operation(LogicalOperation::OR); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 84 | combination->add_matcher(StringToId("SCREEN_IS_ON")); |
| 85 | combination->add_matcher(StringToId("SCREEN_IS_OFF")); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 86 | |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 87 | CountMetric* metric = config.add_count_metric(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 88 | metric->set_id(3); |
| 89 | metric->set_what(StringToId("SCREEN_IS_ON")); |
Yangster-mac | b814481 | 2018-01-04 10:56:23 -0800 | [diff] [blame] | 90 | metric->set_bucket(ONE_MINUTE); |
Yangster-mac | 468ff04 | 2018-01-17 12:26:34 -0800 | [diff] [blame] | 91 | metric->mutable_dimensions_in_what()->set_field(2 /*SCREEN_STATE_CHANGE*/); |
| 92 | metric->mutable_dimensions_in_what()->add_child()->set_field(1); |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 93 | |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 94 | config.add_no_report_metric(3); |
| 95 | |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 96 | auto alert = config.add_alert(); |
Jeffrey Huang | 38d7026 | 2020-03-19 17:28:59 -0700 | [diff] [blame] | 97 | alert->set_id(kAlertId); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 98 | alert->set_metric_id(3); |
Yangster-mac | a7fb12d | 2018-01-03 17:17:20 -0800 | [diff] [blame] | 99 | alert->set_num_buckets(10); |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 100 | alert->set_refractory_period_secs(100); |
| 101 | alert->set_trigger_if_sum_gt(100); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 102 | return config; |
| 103 | } |
| 104 | |
| 105 | StatsdConfig buildCircleMatchers() { |
| 106 | StatsdConfig config; |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 107 | config.set_id(12345); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 108 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 109 | AtomMatcher* eventMatcher = config.add_atom_matcher(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 110 | eventMatcher->set_id(StringToId("SCREEN_IS_ON")); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 111 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 112 | SimpleAtomMatcher* simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher(); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 113 | simpleAtomMatcher->set_atom_id(2 /*SCREEN_STATE_CHANGE*/); |
| 114 | simpleAtomMatcher->add_field_value_matcher()->set_field( |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 115 | 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE*/); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 116 | simpleAtomMatcher->mutable_field_value_matcher(0)->set_eq_int( |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 117 | 2 /*SCREEN_STATE_CHANGE__DISPLAY_STATE__STATE_ON*/); |
| 118 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 119 | eventMatcher = config.add_atom_matcher(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 120 | eventMatcher->set_id(StringToId("SCREEN_ON_OR_OFF")); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 121 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 122 | AtomMatcher_Combination* combination = eventMatcher->mutable_combination(); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 123 | combination->set_operation(LogicalOperation::OR); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 124 | combination->add_matcher(StringToId("SCREEN_IS_ON")); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 125 | // Circle dependency |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 126 | combination->add_matcher(StringToId("SCREEN_ON_OR_OFF")); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 127 | |
| 128 | return config; |
| 129 | } |
| 130 | |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 131 | StatsdConfig buildAlertWithUnknownMetric() { |
| 132 | StatsdConfig config; |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 133 | config.set_id(12345); |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 134 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 135 | AtomMatcher* eventMatcher = config.add_atom_matcher(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 136 | eventMatcher->set_id(StringToId("SCREEN_IS_ON")); |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 137 | |
| 138 | CountMetric* metric = config.add_count_metric(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 139 | metric->set_id(3); |
| 140 | metric->set_what(StringToId("SCREEN_IS_ON")); |
Yangster-mac | b814481 | 2018-01-04 10:56:23 -0800 | [diff] [blame] | 141 | metric->set_bucket(ONE_MINUTE); |
Yangster-mac | 468ff04 | 2018-01-17 12:26:34 -0800 | [diff] [blame] | 142 | metric->mutable_dimensions_in_what()->set_field(2 /*SCREEN_STATE_CHANGE*/); |
| 143 | metric->mutable_dimensions_in_what()->add_child()->set_field(1); |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 144 | |
| 145 | auto alert = config.add_alert(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 146 | alert->set_id(3); |
| 147 | alert->set_metric_id(2); |
Yangster-mac | a7fb12d | 2018-01-03 17:17:20 -0800 | [diff] [blame] | 148 | alert->set_num_buckets(10); |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 149 | alert->set_refractory_period_secs(100); |
| 150 | alert->set_trigger_if_sum_gt(100); |
| 151 | return config; |
| 152 | } |
| 153 | |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 154 | StatsdConfig buildMissingMatchers() { |
| 155 | StatsdConfig config; |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 156 | config.set_id(12345); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 157 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 158 | AtomMatcher* eventMatcher = config.add_atom_matcher(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 159 | eventMatcher->set_id(StringToId("SCREEN_IS_ON")); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 160 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 161 | SimpleAtomMatcher* simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher(); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 162 | simpleAtomMatcher->set_atom_id(2 /*SCREEN_STATE_CHANGE*/); |
| 163 | simpleAtomMatcher->add_field_value_matcher()->set_field( |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 164 | 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE*/); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 165 | simpleAtomMatcher->mutable_field_value_matcher(0)->set_eq_int( |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 166 | 2 /*SCREEN_STATE_CHANGE__DISPLAY_STATE__STATE_ON*/); |
| 167 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 168 | eventMatcher = config.add_atom_matcher(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 169 | eventMatcher->set_id(StringToId("SCREEN_ON_OR_OFF")); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 170 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 171 | AtomMatcher_Combination* combination = eventMatcher->mutable_combination(); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 172 | combination->set_operation(LogicalOperation::OR); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 173 | combination->add_matcher(StringToId("SCREEN_IS_ON")); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 174 | // undefined matcher |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 175 | combination->add_matcher(StringToId("ABC")); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 176 | |
| 177 | return config; |
| 178 | } |
| 179 | |
Stefan Lafon | 12d01fa | 2017-12-04 20:56:09 -0800 | [diff] [blame] | 180 | StatsdConfig buildMissingPredicate() { |
Yao Chen | 10535b9 | 2017-11-27 11:31:55 -0800 | [diff] [blame] | 181 | StatsdConfig config; |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 182 | config.set_id(12345); |
Yao Chen | 10535b9 | 2017-11-27 11:31:55 -0800 | [diff] [blame] | 183 | |
| 184 | CountMetric* metric = config.add_count_metric(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 185 | metric->set_id(3); |
| 186 | metric->set_what(StringToId("SCREEN_EVENT")); |
Yangster-mac | b814481 | 2018-01-04 10:56:23 -0800 | [diff] [blame] | 187 | metric->set_bucket(ONE_MINUTE); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 188 | metric->set_condition(StringToId("SOME_CONDITION")); |
Yao Chen | 10535b9 | 2017-11-27 11:31:55 -0800 | [diff] [blame] | 189 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 190 | AtomMatcher* eventMatcher = config.add_atom_matcher(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 191 | eventMatcher->set_id(StringToId("SCREEN_EVENT")); |
Yao Chen | 10535b9 | 2017-11-27 11:31:55 -0800 | [diff] [blame] | 192 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 193 | SimpleAtomMatcher* simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher(); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 194 | simpleAtomMatcher->set_atom_id(2); |
Yao Chen | 10535b9 | 2017-11-27 11:31:55 -0800 | [diff] [blame] | 195 | |
| 196 | return config; |
| 197 | } |
| 198 | |
Yao Chen | 5154a379 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 199 | StatsdConfig buildDimensionMetricsWithMultiTags() { |
| 200 | StatsdConfig config; |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 201 | config.set_id(12345); |
Yao Chen | 5154a379 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 202 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 203 | AtomMatcher* eventMatcher = config.add_atom_matcher(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 204 | eventMatcher->set_id(StringToId("BATTERY_VERY_LOW")); |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 205 | SimpleAtomMatcher* simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher(); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 206 | simpleAtomMatcher->set_atom_id(2); |
Yao Chen | 5154a379 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 207 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 208 | eventMatcher = config.add_atom_matcher(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 209 | eventMatcher->set_id(StringToId("BATTERY_VERY_VERY_LOW")); |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 210 | simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher(); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 211 | simpleAtomMatcher->set_atom_id(3); |
Yao Chen | 5154a379 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 212 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 213 | eventMatcher = config.add_atom_matcher(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 214 | eventMatcher->set_id(StringToId("BATTERY_LOW")); |
Yao Chen | 5154a379 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 215 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 216 | AtomMatcher_Combination* combination = eventMatcher->mutable_combination(); |
Yao Chen | 5154a379 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 217 | combination->set_operation(LogicalOperation::OR); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 218 | combination->add_matcher(StringToId("BATTERY_VERY_LOW")); |
| 219 | combination->add_matcher(StringToId("BATTERY_VERY_VERY_LOW")); |
Yao Chen | 5154a379 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 220 | |
| 221 | // Count process state changes, slice by uid, while SCREEN_IS_OFF |
| 222 | CountMetric* metric = config.add_count_metric(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 223 | metric->set_id(3); |
| 224 | metric->set_what(StringToId("BATTERY_LOW")); |
Yangster-mac | b814481 | 2018-01-04 10:56:23 -0800 | [diff] [blame] | 225 | metric->set_bucket(ONE_MINUTE); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 226 | // This case is interesting. We want to dimension across two atoms. |
Yangster-mac | 468ff04 | 2018-01-17 12:26:34 -0800 | [diff] [blame] | 227 | metric->mutable_dimensions_in_what()->add_child()->set_field(1); |
Yao Chen | 5154a379 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 228 | |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 229 | auto alert = config.add_alert(); |
Jeffrey Huang | 38d7026 | 2020-03-19 17:28:59 -0700 | [diff] [blame] | 230 | alert->set_id(kAlertId); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 231 | alert->set_metric_id(3); |
Yangster-mac | a7fb12d | 2018-01-03 17:17:20 -0800 | [diff] [blame] | 232 | alert->set_num_buckets(10); |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 233 | alert->set_refractory_period_secs(100); |
| 234 | alert->set_trigger_if_sum_gt(100); |
Yao Chen | 5154a379 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 235 | return config; |
| 236 | } |
| 237 | |
Stefan Lafon | 12d01fa | 2017-12-04 20:56:09 -0800 | [diff] [blame] | 238 | StatsdConfig buildCirclePredicates() { |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 239 | StatsdConfig config; |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 240 | config.set_id(12345); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 241 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 242 | AtomMatcher* eventMatcher = config.add_atom_matcher(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 243 | eventMatcher->set_id(StringToId("SCREEN_IS_ON")); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 244 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 245 | SimpleAtomMatcher* simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher(); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 246 | simpleAtomMatcher->set_atom_id(2 /*SCREEN_STATE_CHANGE*/); |
| 247 | simpleAtomMatcher->add_field_value_matcher()->set_field( |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 248 | 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE*/); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 249 | simpleAtomMatcher->mutable_field_value_matcher(0)->set_eq_int( |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 250 | 2 /*SCREEN_STATE_CHANGE__DISPLAY_STATE__STATE_ON*/); |
| 251 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 252 | eventMatcher = config.add_atom_matcher(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 253 | eventMatcher->set_id(StringToId("SCREEN_IS_OFF")); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 254 | |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 255 | simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher(); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 256 | simpleAtomMatcher->set_atom_id(2 /*SCREEN_STATE_CHANGE*/); |
| 257 | simpleAtomMatcher->add_field_value_matcher()->set_field( |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 258 | 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE*/); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 259 | simpleAtomMatcher->mutable_field_value_matcher(0)->set_eq_int( |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 260 | 1 /*SCREEN_STATE_CHANGE__DISPLAY_STATE__STATE_OFF*/); |
| 261 | |
Stefan Lafon | 12d01fa | 2017-12-04 20:56:09 -0800 | [diff] [blame] | 262 | auto condition = config.add_predicate(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 263 | condition->set_id(StringToId("SCREEN_IS_ON")); |
Stefan Lafon | 12d01fa | 2017-12-04 20:56:09 -0800 | [diff] [blame] | 264 | SimplePredicate* simplePredicate = condition->mutable_simple_predicate(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 265 | simplePredicate->set_start(StringToId("SCREEN_IS_ON")); |
| 266 | simplePredicate->set_stop(StringToId("SCREEN_IS_OFF")); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 267 | |
Stefan Lafon | 12d01fa | 2017-12-04 20:56:09 -0800 | [diff] [blame] | 268 | condition = config.add_predicate(); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 269 | condition->set_id(StringToId("SCREEN_IS_EITHER_ON_OFF")); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 270 | |
Stefan Lafon | 12d01fa | 2017-12-04 20:56:09 -0800 | [diff] [blame] | 271 | Predicate_Combination* combination = condition->mutable_combination(); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 272 | combination->set_operation(LogicalOperation::OR); |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 273 | combination->add_predicate(StringToId("SCREEN_IS_ON")); |
| 274 | combination->add_predicate(StringToId("SCREEN_IS_EITHER_ON_OFF")); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 275 | |
| 276 | return config; |
| 277 | } |
| 278 | |
tsaichristine | 6e2e92d | 2020-05-18 14:39:45 -0700 | [diff] [blame] | 279 | StatsdConfig 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 Singh | 3be093b | 2020-03-04 20:08:38 -0800 | [diff] [blame] | 377 | bool 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 | |
tsaichristine | 6e2e92d | 2020-05-18 14:39:45 -0700 | [diff] [blame] | 382 | TEST(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 Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 430 | TEST(MetricsManagerTest, TestGoodConfig) { |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 431 | UidMap uidMap; |
Chenjie Yu | e221920 | 2018-06-08 10:07:51 -0700 | [diff] [blame] | 432 | sp<StatsPullerManager> pullerManager = new StatsPullerManager(); |
Yangster-mac | 932ecec | 2018-02-01 10:23:52 -0800 | [diff] [blame] | 433 | sp<AlarmMonitor> anomalyAlarmMonitor; |
| 434 | sp<AlarmMonitor> periodicAlarmMonitor; |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 435 | StatsdConfig config = buildGoodConfig(); |
| 436 | set<int> allTagIds; |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 437 | vector<sp<LogMatchingTracker>> allAtomMatchers; |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 438 | vector<sp<ConditionTracker>> allConditionTrackers; |
| 439 | vector<sp<MetricProducer>> allMetricProducers; |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 440 | std::vector<sp<AnomalyTracker>> allAnomalyTrackers; |
Yangster-mac | 932ecec | 2018-02-01 10:23:52 -0800 | [diff] [blame] | 441 | std::vector<sp<AlarmTracker>> allAlarmTrackers; |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 442 | unordered_map<int, std::vector<int>> conditionToMetricMap; |
| 443 | unordered_map<int, std::vector<int>> trackerToMetricMap; |
| 444 | unordered_map<int, std::vector<int>> trackerToConditionMap; |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 445 | unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap; |
| 446 | unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap; |
Jeffrey Huang | 38d7026 | 2020-03-19 17:28:59 -0700 | [diff] [blame] | 447 | unordered_map<int64_t, int> alertTrackerMap; |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 448 | vector<int> metricsWithActivation; |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 449 | std::set<int64_t> noReportMetricIds; |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 450 | |
Chenjie Yu | e221920 | 2018-06-08 10:07:51 -0700 | [diff] [blame] | 451 | EXPECT_TRUE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor, |
| 452 | periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds, |
| 453 | allAtomMatchers, allConditionTrackers, allMetricProducers, |
| 454 | allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, |
Yangster-mac | 849dfdc2 | 2018-10-12 15:41:45 -0700 | [diff] [blame] | 455 | trackerToMetricMap, trackerToConditionMap, |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 456 | activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, |
Jeffrey Huang | 38d7026 | 2020-03-19 17:28:59 -0700 | [diff] [blame] | 457 | alertTrackerMap, metricsWithActivation, |
| 458 | noReportMetricIds)); |
Muhammad Qureshi | dff78d6 | 2020-05-11 13:37:43 -0700 | [diff] [blame] | 459 | ASSERT_EQ(1u, allMetricProducers.size()); |
| 460 | ASSERT_EQ(1u, allAnomalyTrackers.size()); |
| 461 | ASSERT_EQ(1u, noReportMetricIds.size()); |
| 462 | ASSERT_EQ(1u, alertTrackerMap.size()); |
Jeffrey Huang | 38d7026 | 2020-03-19 17:28:59 -0700 | [diff] [blame] | 463 | EXPECT_NE(alertTrackerMap.find(kAlertId), alertTrackerMap.end()); |
| 464 | EXPECT_EQ(alertTrackerMap.find(kAlertId)->second, 0); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 465 | } |
| 466 | |
Yao Chen | 5154a379 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 467 | TEST(MetricsManagerTest, TestDimensionMetricsWithMultiTags) { |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 468 | UidMap uidMap; |
Chenjie Yu | e221920 | 2018-06-08 10:07:51 -0700 | [diff] [blame] | 469 | sp<StatsPullerManager> pullerManager = new StatsPullerManager(); |
Yangster-mac | 932ecec | 2018-02-01 10:23:52 -0800 | [diff] [blame] | 470 | sp<AlarmMonitor> anomalyAlarmMonitor; |
| 471 | sp<AlarmMonitor> periodicAlarmMonitor; |
Yao Chen | 5154a379 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 472 | StatsdConfig config = buildDimensionMetricsWithMultiTags(); |
| 473 | set<int> allTagIds; |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 474 | vector<sp<LogMatchingTracker>> allAtomMatchers; |
Yao Chen | 5154a379 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 475 | vector<sp<ConditionTracker>> allConditionTrackers; |
| 476 | vector<sp<MetricProducer>> allMetricProducers; |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 477 | std::vector<sp<AnomalyTracker>> allAnomalyTrackers; |
Yangster-mac | 932ecec | 2018-02-01 10:23:52 -0800 | [diff] [blame] | 478 | std::vector<sp<AlarmTracker>> allAlarmTrackers; |
Yao Chen | 5154a379 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 479 | unordered_map<int, std::vector<int>> conditionToMetricMap; |
| 480 | unordered_map<int, std::vector<int>> trackerToMetricMap; |
| 481 | unordered_map<int, std::vector<int>> trackerToConditionMap; |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 482 | unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap; |
| 483 | unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap; |
Jeffrey Huang | 38d7026 | 2020-03-19 17:28:59 -0700 | [diff] [blame] | 484 | unordered_map<int64_t, int> alertTrackerMap; |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 485 | vector<int> metricsWithActivation; |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 486 | std::set<int64_t> noReportMetricIds; |
Yao Chen | 5154a379 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 487 | |
Chenjie Yu | e221920 | 2018-06-08 10:07:51 -0700 | [diff] [blame] | 488 | EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor, |
| 489 | periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds, |
| 490 | allAtomMatchers, allConditionTrackers, allMetricProducers, |
| 491 | allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, |
Yangster-mac | 849dfdc2 | 2018-10-12 15:41:45 -0700 | [diff] [blame] | 492 | trackerToMetricMap, trackerToConditionMap, |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 493 | activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, |
Jeffrey Huang | 38d7026 | 2020-03-19 17:28:59 -0700 | [diff] [blame] | 494 | alertTrackerMap, metricsWithActivation, |
| 495 | noReportMetricIds)); |
Yao Chen | 5154a379 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 496 | } |
| 497 | |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 498 | TEST(MetricsManagerTest, TestCircleLogMatcherDependency) { |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 499 | UidMap uidMap; |
Chenjie Yu | e221920 | 2018-06-08 10:07:51 -0700 | [diff] [blame] | 500 | sp<StatsPullerManager> pullerManager = new StatsPullerManager(); |
Yangster-mac | 932ecec | 2018-02-01 10:23:52 -0800 | [diff] [blame] | 501 | sp<AlarmMonitor> anomalyAlarmMonitor; |
| 502 | sp<AlarmMonitor> periodicAlarmMonitor; |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 503 | StatsdConfig config = buildCircleMatchers(); |
| 504 | set<int> allTagIds; |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 505 | vector<sp<LogMatchingTracker>> allAtomMatchers; |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 506 | vector<sp<ConditionTracker>> allConditionTrackers; |
| 507 | vector<sp<MetricProducer>> allMetricProducers; |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 508 | std::vector<sp<AnomalyTracker>> allAnomalyTrackers; |
Yangster-mac | 932ecec | 2018-02-01 10:23:52 -0800 | [diff] [blame] | 509 | std::vector<sp<AlarmTracker>> allAlarmTrackers; |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 510 | unordered_map<int, std::vector<int>> conditionToMetricMap; |
| 511 | unordered_map<int, std::vector<int>> trackerToMetricMap; |
| 512 | unordered_map<int, std::vector<int>> trackerToConditionMap; |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 513 | unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap; |
| 514 | unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap; |
Jeffrey Huang | 38d7026 | 2020-03-19 17:28:59 -0700 | [diff] [blame] | 515 | unordered_map<int64_t, int> alertTrackerMap; |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 516 | vector<int> metricsWithActivation; |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 517 | std::set<int64_t> noReportMetricIds; |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 518 | |
Chenjie Yu | e221920 | 2018-06-08 10:07:51 -0700 | [diff] [blame] | 519 | EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor, |
| 520 | periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds, |
| 521 | allAtomMatchers, allConditionTrackers, allMetricProducers, |
| 522 | allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, |
Yangster-mac | 849dfdc2 | 2018-10-12 15:41:45 -0700 | [diff] [blame] | 523 | trackerToMetricMap, trackerToConditionMap, |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 524 | activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, |
Jeffrey Huang | 38d7026 | 2020-03-19 17:28:59 -0700 | [diff] [blame] | 525 | alertTrackerMap, metricsWithActivation, |
| 526 | noReportMetricIds)); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 527 | } |
| 528 | |
| 529 | TEST(MetricsManagerTest, TestMissingMatchers) { |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 530 | UidMap uidMap; |
Chenjie Yu | e221920 | 2018-06-08 10:07:51 -0700 | [diff] [blame] | 531 | sp<StatsPullerManager> pullerManager = new StatsPullerManager(); |
Yangster-mac | 932ecec | 2018-02-01 10:23:52 -0800 | [diff] [blame] | 532 | sp<AlarmMonitor> anomalyAlarmMonitor; |
| 533 | sp<AlarmMonitor> periodicAlarmMonitor; |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 534 | StatsdConfig config = buildMissingMatchers(); |
| 535 | set<int> allTagIds; |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 536 | vector<sp<LogMatchingTracker>> allAtomMatchers; |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 537 | vector<sp<ConditionTracker>> allConditionTrackers; |
| 538 | vector<sp<MetricProducer>> allMetricProducers; |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 539 | std::vector<sp<AnomalyTracker>> allAnomalyTrackers; |
Yangster-mac | 932ecec | 2018-02-01 10:23:52 -0800 | [diff] [blame] | 540 | std::vector<sp<AlarmTracker>> allAlarmTrackers; |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 541 | unordered_map<int, std::vector<int>> conditionToMetricMap; |
| 542 | unordered_map<int, std::vector<int>> trackerToMetricMap; |
| 543 | unordered_map<int, std::vector<int>> trackerToConditionMap; |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 544 | unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap; |
| 545 | unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap; |
Jeffrey Huang | 38d7026 | 2020-03-19 17:28:59 -0700 | [diff] [blame] | 546 | unordered_map<int64_t, int> alertTrackerMap; |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 547 | vector<int> metricsWithActivation; |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 548 | std::set<int64_t> noReportMetricIds; |
Chenjie Yu | e221920 | 2018-06-08 10:07:51 -0700 | [diff] [blame] | 549 | EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor, |
| 550 | periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds, |
| 551 | allAtomMatchers, allConditionTrackers, allMetricProducers, |
| 552 | allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, |
Yangster-mac | 849dfdc2 | 2018-10-12 15:41:45 -0700 | [diff] [blame] | 553 | trackerToMetricMap, trackerToConditionMap, |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 554 | activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, |
Jeffrey Huang | 38d7026 | 2020-03-19 17:28:59 -0700 | [diff] [blame] | 555 | alertTrackerMap, metricsWithActivation, |
| 556 | noReportMetricIds)); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 557 | } |
| 558 | |
Stefan Lafon | 12d01fa | 2017-12-04 20:56:09 -0800 | [diff] [blame] | 559 | TEST(MetricsManagerTest, TestMissingPredicate) { |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 560 | UidMap uidMap; |
Chenjie Yu | e221920 | 2018-06-08 10:07:51 -0700 | [diff] [blame] | 561 | sp<StatsPullerManager> pullerManager = new StatsPullerManager(); |
Yangster-mac | 932ecec | 2018-02-01 10:23:52 -0800 | [diff] [blame] | 562 | sp<AlarmMonitor> anomalyAlarmMonitor; |
| 563 | sp<AlarmMonitor> periodicAlarmMonitor; |
Stefan Lafon | 12d01fa | 2017-12-04 20:56:09 -0800 | [diff] [blame] | 564 | StatsdConfig config = buildMissingPredicate(); |
Yao Chen | 10535b9 | 2017-11-27 11:31:55 -0800 | [diff] [blame] | 565 | set<int> allTagIds; |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 566 | vector<sp<LogMatchingTracker>> allAtomMatchers; |
Yao Chen | 10535b9 | 2017-11-27 11:31:55 -0800 | [diff] [blame] | 567 | vector<sp<ConditionTracker>> allConditionTrackers; |
| 568 | vector<sp<MetricProducer>> allMetricProducers; |
| 569 | std::vector<sp<AnomalyTracker>> allAnomalyTrackers; |
Yangster-mac | 932ecec | 2018-02-01 10:23:52 -0800 | [diff] [blame] | 570 | std::vector<sp<AlarmTracker>> allAlarmTrackers; |
Yao Chen | 10535b9 | 2017-11-27 11:31:55 -0800 | [diff] [blame] | 571 | unordered_map<int, std::vector<int>> conditionToMetricMap; |
| 572 | unordered_map<int, std::vector<int>> trackerToMetricMap; |
| 573 | unordered_map<int, std::vector<int>> trackerToConditionMap; |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 574 | unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap; |
| 575 | unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap; |
Jeffrey Huang | 38d7026 | 2020-03-19 17:28:59 -0700 | [diff] [blame] | 576 | unordered_map<int64_t, int> alertTrackerMap; |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 577 | vector<int> metricsWithActivation; |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 578 | std::set<int64_t> noReportMetricIds; |
Chenjie Yu | e221920 | 2018-06-08 10:07:51 -0700 | [diff] [blame] | 579 | EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor, |
| 580 | periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds, |
| 581 | allAtomMatchers, allConditionTrackers, allMetricProducers, |
| 582 | allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, |
Yangster-mac | 849dfdc2 | 2018-10-12 15:41:45 -0700 | [diff] [blame] | 583 | trackerToMetricMap, trackerToConditionMap, |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 584 | activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, |
Jeffrey Huang | 38d7026 | 2020-03-19 17:28:59 -0700 | [diff] [blame] | 585 | alertTrackerMap, metricsWithActivation, noReportMetricIds)); |
Yao Chen | 10535b9 | 2017-11-27 11:31:55 -0800 | [diff] [blame] | 586 | } |
| 587 | |
Stefan Lafon | 12d01fa | 2017-12-04 20:56:09 -0800 | [diff] [blame] | 588 | TEST(MetricsManagerTest, TestCirclePredicateDependency) { |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 589 | UidMap uidMap; |
Chenjie Yu | e221920 | 2018-06-08 10:07:51 -0700 | [diff] [blame] | 590 | sp<StatsPullerManager> pullerManager = new StatsPullerManager(); |
Yangster-mac | 932ecec | 2018-02-01 10:23:52 -0800 | [diff] [blame] | 591 | sp<AlarmMonitor> anomalyAlarmMonitor; |
| 592 | sp<AlarmMonitor> periodicAlarmMonitor; |
Stefan Lafon | 12d01fa | 2017-12-04 20:56:09 -0800 | [diff] [blame] | 593 | StatsdConfig config = buildCirclePredicates(); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 594 | set<int> allTagIds; |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 595 | vector<sp<LogMatchingTracker>> allAtomMatchers; |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 596 | vector<sp<ConditionTracker>> allConditionTrackers; |
| 597 | vector<sp<MetricProducer>> allMetricProducers; |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 598 | std::vector<sp<AnomalyTracker>> allAnomalyTrackers; |
Yangster-mac | 932ecec | 2018-02-01 10:23:52 -0800 | [diff] [blame] | 599 | std::vector<sp<AlarmTracker>> allAlarmTrackers; |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 600 | unordered_map<int, std::vector<int>> conditionToMetricMap; |
| 601 | unordered_map<int, std::vector<int>> trackerToMetricMap; |
| 602 | unordered_map<int, std::vector<int>> trackerToConditionMap; |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 603 | unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap; |
| 604 | unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap; |
Jeffrey Huang | 38d7026 | 2020-03-19 17:28:59 -0700 | [diff] [blame] | 605 | unordered_map<int64_t, int> alertTrackerMap; |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 606 | vector<int> metricsWithActivation; |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 607 | std::set<int64_t> noReportMetricIds; |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 608 | |
Chenjie Yu | e221920 | 2018-06-08 10:07:51 -0700 | [diff] [blame] | 609 | EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor, |
| 610 | periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds, |
| 611 | allAtomMatchers, allConditionTrackers, allMetricProducers, |
| 612 | allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, |
Yangster-mac | 849dfdc2 | 2018-10-12 15:41:45 -0700 | [diff] [blame] | 613 | trackerToMetricMap, trackerToConditionMap, |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 614 | activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, |
Jeffrey Huang | 38d7026 | 2020-03-19 17:28:59 -0700 | [diff] [blame] | 615 | alertTrackerMap, metricsWithActivation, |
| 616 | noReportMetricIds)); |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 617 | } |
| 618 | |
| 619 | TEST(MetricsManagerTest, testAlertWithUnknownMetric) { |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 620 | UidMap uidMap; |
Chenjie Yu | e221920 | 2018-06-08 10:07:51 -0700 | [diff] [blame] | 621 | sp<StatsPullerManager> pullerManager = new StatsPullerManager(); |
Yangster-mac | 932ecec | 2018-02-01 10:23:52 -0800 | [diff] [blame] | 622 | sp<AlarmMonitor> anomalyAlarmMonitor; |
| 623 | sp<AlarmMonitor> periodicAlarmMonitor; |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 624 | StatsdConfig config = buildAlertWithUnknownMetric(); |
| 625 | set<int> allTagIds; |
Stefan Lafon | b8c9aa8 | 2017-12-03 14:27:25 -0800 | [diff] [blame] | 626 | vector<sp<LogMatchingTracker>> allAtomMatchers; |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 627 | vector<sp<ConditionTracker>> allConditionTrackers; |
| 628 | vector<sp<MetricProducer>> allMetricProducers; |
| 629 | std::vector<sp<AnomalyTracker>> allAnomalyTrackers; |
Yangster-mac | 932ecec | 2018-02-01 10:23:52 -0800 | [diff] [blame] | 630 | std::vector<sp<AlarmTracker>> allAlarmTrackers; |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 631 | unordered_map<int, std::vector<int>> conditionToMetricMap; |
| 632 | unordered_map<int, std::vector<int>> trackerToMetricMap; |
| 633 | unordered_map<int, std::vector<int>> trackerToConditionMap; |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 634 | unordered_map<int, std::vector<int>> activationAtomTrackerToMetricMap; |
| 635 | unordered_map<int, std::vector<int>> deactivationAtomTrackerToMetricMap; |
Jeffrey Huang | 38d7026 | 2020-03-19 17:28:59 -0700 | [diff] [blame] | 636 | unordered_map<int64_t, int> alertTrackerMap; |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 637 | vector<int> metricsWithActivation; |
Yangster-mac | 94e197c | 2018-01-02 16:03:03 -0800 | [diff] [blame] | 638 | std::set<int64_t> noReportMetricIds; |
Yangster-mac | e2cd6d5 | 2017-11-09 20:38:30 -0800 | [diff] [blame] | 639 | |
Chenjie Yu | e221920 | 2018-06-08 10:07:51 -0700 | [diff] [blame] | 640 | EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor, |
| 641 | periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds, |
| 642 | allAtomMatchers, allConditionTrackers, allMetricProducers, |
| 643 | allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, |
Yangster-mac | 849dfdc2 | 2018-10-12 15:41:45 -0700 | [diff] [blame] | 644 | trackerToMetricMap, trackerToConditionMap, |
Muhammad Qureshi | 3a5ebf5 | 2019-03-28 12:38:21 -0700 | [diff] [blame] | 645 | activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, |
Jeffrey Huang | 38d7026 | 2020-03-19 17:28:59 -0700 | [diff] [blame] | 646 | alertTrackerMap, metricsWithActivation, |
| 647 | noReportMetricIds)); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 648 | } |
| 649 | |
Tej Singh | 3be093b | 2020-03-04 20:08:38 -0800 | [diff] [blame] | 650 | TEST(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 Singh | 3eb9ced | 2020-04-20 22:04:38 -0700 | [diff] [blame] | 678 | EXPECT_CALL(*pullerManager, UnregisterPullUidProvider(kConfigKey, _)).Times(1); |
Tej Singh | 3be093b | 2020-03-04 20:08:38 -0800 | [diff] [blame] | 679 | |
| 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 Qureshi | f681646 | 2020-05-13 15:13:33 -0700 | [diff] [blame] | 741 | TEST(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 Qureshi | b1eee0be | 2020-05-15 05:46:38 -0700 | [diff] [blame] | 765 | TEST(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 Singh | 3be093b | 2020-03-04 20:08:38 -0800 | [diff] [blame] | 793 | } // namespace statsd |
| 794 | } // namespace os |
| 795 | } // namespace android |
| 796 | |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 797 | #else |
| 798 | GTEST_LOG_(INFO) << "This test does nothing.\n"; |
| 799 | #endif |