blob: 3dc3fd1160f19e55d7db2d50156b79d8c5710142 [file] [log] [blame]
Yao Chen967b2052017-11-07 16:36:43 -08001// Copyright (C) 2017 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
Yangster-mac94e197c2018-01-02 16:03:03 -080014
Yao Chen967b2052017-11-07 16:36:43 -080015#include "src/condition/SimpleConditionTracker.h"
Yangster-mac94e197c2018-01-02 16:03:03 -080016#include "tests/statsd_test_util.h"
Yao Chen967b2052017-11-07 16:36:43 -080017
18#include <gmock/gmock.h>
19#include <gtest/gtest.h>
20#include <stdio.h>
21#include <vector>
Yangster-mac20877162017-12-22 17:19:39 -080022#include <numeric>
Yao Chen967b2052017-11-07 16:36:43 -080023
24using std::map;
25using std::unordered_map;
26using std::vector;
27
28#ifdef __ANDROID__
29
30namespace android {
31namespace os {
32namespace statsd {
33
Yangster-mac94e197c2018-01-02 16:03:03 -080034const ConfigKey kConfigKey(0, 12345);
Yao Chenb3561512017-11-21 18:07:17 -080035
Yangster-mac20877162017-12-22 17:19:39 -080036const int ATTRIBUTION_NODE_FIELD_ID = 1;
37const int ATTRIBUTION_UID_FIELD_ID = 1;
38const int TAG_ID = 1;
39
Stefan Lafon12d01fa2017-12-04 20:56:09 -080040SimplePredicate getWakeLockHeldCondition(bool countNesting, bool defaultFalse,
Yangster-mac20877162017-12-22 17:19:39 -080041 bool outputSlicedUid, Position position) {
Stefan Lafon12d01fa2017-12-04 20:56:09 -080042 SimplePredicate simplePredicate;
Yangster-mac94e197c2018-01-02 16:03:03 -080043 simplePredicate.set_start(StringToId("WAKE_LOCK_ACQUIRE"));
44 simplePredicate.set_stop(StringToId("WAKE_LOCK_RELEASE"));
45 simplePredicate.set_stop_all(StringToId("RELEASE_ALL"));
Yao Chen967b2052017-11-07 16:36:43 -080046 if (outputSlicedUid) {
Yangster-mac20877162017-12-22 17:19:39 -080047 simplePredicate.mutable_dimensions()->set_field(TAG_ID);
48 simplePredicate.mutable_dimensions()->add_child()->set_field(ATTRIBUTION_NODE_FIELD_ID);
49 simplePredicate.mutable_dimensions()->mutable_child(0)->set_position(position);
50 simplePredicate.mutable_dimensions()->mutable_child(0)->add_child()->set_field(
51 ATTRIBUTION_UID_FIELD_ID);
Yao Chen967b2052017-11-07 16:36:43 -080052 }
53
Stefan Lafon12d01fa2017-12-04 20:56:09 -080054 simplePredicate.set_count_nesting(countNesting);
55 simplePredicate.set_initial_value(defaultFalse ? SimplePredicate_InitialValue_FALSE
56 : SimplePredicate_InitialValue_UNKNOWN);
57 return simplePredicate;
Yao Chen967b2052017-11-07 16:36:43 -080058}
59
Yangster-mac20877162017-12-22 17:19:39 -080060void writeAttributionNodesToEvent(LogEvent* event, const std::vector<int> &uids) {
Yao Chen9c1debe2018-02-19 14:39:19 -080061 std::vector<AttributionNodeInternal> nodes;
Yangster-mac20877162017-12-22 17:19:39 -080062 for (size_t i = 0; i < uids.size(); ++i) {
Yao Chen9c1debe2018-02-19 14:39:19 -080063 AttributionNodeInternal node;
Yangster-mac20877162017-12-22 17:19:39 -080064 node.set_uid(uids[i]);
65 nodes.push_back(node);
66 }
67 event->write(nodes); // attribution chain.
68}
69
70void makeWakeLockEvent(
71 LogEvent* event, const std::vector<int> &uids, const string& wl, int acquire) {
72 writeAttributionNodesToEvent(event, uids);
Yao Chen80235402017-11-13 20:42:25 -080073 event->write(wl);
74 event->write(acquire);
Yao Chen967b2052017-11-07 16:36:43 -080075 event->init();
76}
77
Yangster-mac94e197c2018-01-02 16:03:03 -080078std::map<int64_t, std::vector<HashableDimensionKey>> getWakeLockQueryKey(
Yangster-mac20877162017-12-22 17:19:39 -080079 const Position position,
80 const std::vector<int> &uids, const string& conditionName) {
Yangster-mac93694462018-01-22 20:49:31 -080081 std::map<int64_t, std::vector<HashableDimensionKey>> outputKeyMap;
Yangster-mac20877162017-12-22 17:19:39 -080082 std::vector<int> uid_indexes;
Yao Chen8a8d16c2018-02-08 14:50:40 -080083 int pos[] = {1, 1, 1};
84 int depth = 2;
85 Field field(1, pos, depth);
Yangster-mac20877162017-12-22 17:19:39 -080086 switch(position) {
87 case Position::FIRST:
88 uid_indexes.push_back(0);
89 break;
90 case Position::LAST:
91 uid_indexes.push_back(uids.size() - 1);
Yao Chen8a8d16c2018-02-08 14:50:40 -080092 field.setField(0x02018001);
Yangster-mac20877162017-12-22 17:19:39 -080093 break;
94 case Position::ANY:
95 uid_indexes.resize(uids.size());
96 std::iota(uid_indexes.begin(), uid_indexes.end(), 0);
Yao Chen8a8d16c2018-02-08 14:50:40 -080097 field.setField(0x02010001);
Yangster-mac20877162017-12-22 17:19:39 -080098 break;
99 default:
100 break;
101 }
102
103 for (const int idx : uid_indexes) {
Yao Chen8a8d16c2018-02-08 14:50:40 -0800104 Value value((int32_t)uids[idx]);
105 HashableDimensionKey dim;
106 dim.addValue(FieldValue(field, value));
107 outputKeyMap[StringToId(conditionName)].push_back(dim);
Yangster-mac20877162017-12-22 17:19:39 -0800108 }
109 return outputKeyMap;
Yao Chen967b2052017-11-07 16:36:43 -0800110}
111
112TEST(SimpleConditionTrackerTest, TestNonSlicedCondition) {
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800113 SimplePredicate simplePredicate;
Yangster-mac94e197c2018-01-02 16:03:03 -0800114 simplePredicate.set_start(StringToId("SCREEN_TURNED_ON"));
115 simplePredicate.set_stop(StringToId("SCREEN_TURNED_OFF"));
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800116 simplePredicate.set_count_nesting(false);
117 simplePredicate.set_initial_value(SimplePredicate_InitialValue_UNKNOWN);
Yao Chen967b2052017-11-07 16:36:43 -0800118
Yangster-mac94e197c2018-01-02 16:03:03 -0800119 unordered_map<int64_t, int> trackerNameIndexMap;
120 trackerNameIndexMap[StringToId("SCREEN_TURNED_ON")] = 0;
121 trackerNameIndexMap[StringToId("SCREEN_TURNED_OFF")] = 1;
Yao Chen967b2052017-11-07 16:36:43 -0800122
Yangster-mac94e197c2018-01-02 16:03:03 -0800123 SimpleConditionTracker conditionTracker(kConfigKey, StringToId("SCREEN_IS_ON"), 0 /*tracker index*/,
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800124 simplePredicate, trackerNameIndexMap);
Yao Chen967b2052017-11-07 16:36:43 -0800125
126 LogEvent event(1 /*tagId*/, 0 /*timestamp*/);
127
128 vector<MatchingState> matcherState;
129 matcherState.push_back(MatchingState::kNotMatched);
130 matcherState.push_back(MatchingState::kNotMatched);
131
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800132 vector<sp<ConditionTracker>> allPredicates;
Yao Chen967b2052017-11-07 16:36:43 -0800133 vector<ConditionState> conditionCache(1, ConditionState::kNotEvaluated);
134 vector<bool> changedCache(1, false);
135
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800136 conditionTracker.evaluateCondition(event, matcherState, allPredicates, conditionCache,
Yao Chen967b2052017-11-07 16:36:43 -0800137 changedCache);
138 // not matched start or stop. condition doesn't change
139 EXPECT_EQ(ConditionState::kUnknown, conditionCache[0]);
140 EXPECT_FALSE(changedCache[0]);
141
142 // prepare a case for match start.
143 matcherState.clear();
144 matcherState.push_back(MatchingState::kMatched);
145 matcherState.push_back(MatchingState::kNotMatched);
146 conditionCache[0] = ConditionState::kNotEvaluated;
147 changedCache[0] = false;
148
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800149 conditionTracker.evaluateCondition(event, matcherState, allPredicates, conditionCache,
Yao Chen967b2052017-11-07 16:36:43 -0800150 changedCache);
151 // now condition should change to true.
152 EXPECT_EQ(ConditionState::kTrue, conditionCache[0]);
153 EXPECT_TRUE(changedCache[0]);
154
Yao Chend41c4222017-11-15 19:26:14 -0800155 // match nothing.
156 matcherState.clear();
157 matcherState.push_back(MatchingState::kNotMatched);
158 matcherState.push_back(MatchingState::kNotMatched);
159 conditionCache[0] = ConditionState::kNotEvaluated;
160 changedCache[0] = false;
161
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800162 conditionTracker.evaluateCondition(event, matcherState, allPredicates, conditionCache,
Yao Chend41c4222017-11-15 19:26:14 -0800163 changedCache);
164 EXPECT_EQ(ConditionState::kTrue, conditionCache[0]);
165 EXPECT_FALSE(changedCache[0]);
166
Yao Chen967b2052017-11-07 16:36:43 -0800167 // the case for match stop.
168 matcherState.clear();
169 matcherState.push_back(MatchingState::kNotMatched);
170 matcherState.push_back(MatchingState::kMatched);
171 conditionCache[0] = ConditionState::kNotEvaluated;
172 changedCache[0] = false;
173
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800174 conditionTracker.evaluateCondition(event, matcherState, allPredicates, conditionCache,
Yao Chen967b2052017-11-07 16:36:43 -0800175 changedCache);
176
177 // condition changes to false.
178 EXPECT_EQ(ConditionState::kFalse, conditionCache[0]);
179 EXPECT_TRUE(changedCache[0]);
180
181 // match stop again.
182 matcherState.clear();
183 matcherState.push_back(MatchingState::kNotMatched);
184 matcherState.push_back(MatchingState::kMatched);
185 conditionCache[0] = ConditionState::kNotEvaluated;
186 changedCache[0] = false;
187
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800188 conditionTracker.evaluateCondition(event, matcherState, allPredicates, conditionCache,
Yao Chen967b2052017-11-07 16:36:43 -0800189 changedCache);
190 // condition should still be false. not changed.
191 EXPECT_EQ(ConditionState::kFalse, conditionCache[0]);
192 EXPECT_FALSE(changedCache[0]);
193}
194
195TEST(SimpleConditionTrackerTest, TestNonSlicedConditionNestCounting) {
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800196 SimplePredicate simplePredicate;
Yangster-mac94e197c2018-01-02 16:03:03 -0800197 simplePredicate.set_start(StringToId("SCREEN_TURNED_ON"));
198 simplePredicate.set_stop(StringToId("SCREEN_TURNED_OFF"));
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800199 simplePredicate.set_count_nesting(true);
Yao Chen967b2052017-11-07 16:36:43 -0800200
Yangster-mac94e197c2018-01-02 16:03:03 -0800201 unordered_map<int64_t, int> trackerNameIndexMap;
202 trackerNameIndexMap[StringToId("SCREEN_TURNED_ON")] = 0;
203 trackerNameIndexMap[StringToId("SCREEN_TURNED_OFF")] = 1;
Yao Chen967b2052017-11-07 16:36:43 -0800204
Yangster-mac94e197c2018-01-02 16:03:03 -0800205 SimpleConditionTracker conditionTracker(kConfigKey, StringToId("SCREEN_IS_ON"),
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800206 0 /*condition tracker index*/, simplePredicate,
Yao Chenb3561512017-11-21 18:07:17 -0800207 trackerNameIndexMap);
Yao Chen967b2052017-11-07 16:36:43 -0800208
209 LogEvent event(1 /*tagId*/, 0 /*timestamp*/);
210
211 // one matched start
212 vector<MatchingState> matcherState;
213 matcherState.push_back(MatchingState::kMatched);
214 matcherState.push_back(MatchingState::kNotMatched);
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800215 vector<sp<ConditionTracker>> allPredicates;
Yao Chen967b2052017-11-07 16:36:43 -0800216 vector<ConditionState> conditionCache(1, ConditionState::kNotEvaluated);
217 vector<bool> changedCache(1, false);
218
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800219 conditionTracker.evaluateCondition(event, matcherState, allPredicates, conditionCache,
Yao Chen967b2052017-11-07 16:36:43 -0800220 changedCache);
221
222 EXPECT_EQ(ConditionState::kTrue, conditionCache[0]);
223 EXPECT_TRUE(changedCache[0]);
224
225 // prepare for another matched start.
226 matcherState.clear();
227 matcherState.push_back(MatchingState::kMatched);
228 matcherState.push_back(MatchingState::kNotMatched);
229 conditionCache[0] = ConditionState::kNotEvaluated;
230 changedCache[0] = false;
231
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800232 conditionTracker.evaluateCondition(event, matcherState, allPredicates, conditionCache,
Yao Chen967b2052017-11-07 16:36:43 -0800233 changedCache);
234
235 EXPECT_EQ(ConditionState::kTrue, conditionCache[0]);
236 EXPECT_FALSE(changedCache[0]);
237
238 // ONE MATCHED STOP
239 matcherState.clear();
240 matcherState.push_back(MatchingState::kNotMatched);
241 matcherState.push_back(MatchingState::kMatched);
242 conditionCache[0] = ConditionState::kNotEvaluated;
243 changedCache[0] = false;
244
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800245 conditionTracker.evaluateCondition(event, matcherState, allPredicates, conditionCache,
Yao Chen967b2052017-11-07 16:36:43 -0800246 changedCache);
247 // result should still be true
248 EXPECT_EQ(ConditionState::kTrue, conditionCache[0]);
249 EXPECT_FALSE(changedCache[0]);
250
251 // ANOTHER MATCHED STOP
252 matcherState.clear();
253 matcherState.push_back(MatchingState::kNotMatched);
254 matcherState.push_back(MatchingState::kMatched);
255 conditionCache[0] = ConditionState::kNotEvaluated;
256 changedCache[0] = false;
257
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800258 conditionTracker.evaluateCondition(event, matcherState, allPredicates, conditionCache,
Yao Chen967b2052017-11-07 16:36:43 -0800259 changedCache);
260 // result should still be true
261 EXPECT_EQ(ConditionState::kFalse, conditionCache[0]);
262 EXPECT_TRUE(changedCache[0]);
263}
264
265TEST(SimpleConditionTrackerTest, TestSlicedCondition) {
Yangster-mac20877162017-12-22 17:19:39 -0800266 for (Position position :
267 { Position::ANY, Position::FIRST, Position::LAST}) {
Yao Chen8a8d16c2018-02-08 14:50:40 -0800268 vector<Matcher> dimensionInCondition;
Yangster-mac93694462018-01-22 20:49:31 -0800269 std::unordered_set<HashableDimensionKey> dimensionKeys;
270
Yangster-mac20877162017-12-22 17:19:39 -0800271 SimplePredicate simplePredicate = getWakeLockHeldCondition(
272 true /*nesting*/, true /*default to false*/, true /*output slice by uid*/,
273 position);
274 string conditionName = "WL_HELD_BY_UID2";
Yao Chen967b2052017-11-07 16:36:43 -0800275
Yangster-mac94e197c2018-01-02 16:03:03 -0800276 unordered_map<int64_t, int> trackerNameIndexMap;
277 trackerNameIndexMap[StringToId("WAKE_LOCK_ACQUIRE")] = 0;
278 trackerNameIndexMap[StringToId("WAKE_LOCK_RELEASE")] = 1;
279 trackerNameIndexMap[StringToId("RELEASE_ALL")] = 2;
Yao Chen967b2052017-11-07 16:36:43 -0800280
Yangster-mac94e197c2018-01-02 16:03:03 -0800281 SimpleConditionTracker conditionTracker(kConfigKey, StringToId(conditionName),
Yangster-mac20877162017-12-22 17:19:39 -0800282 0 /*condition tracker index*/, simplePredicate,
283 trackerNameIndexMap);
284 std::vector<int> uids = {111, 222, 333};
Yao Chen967b2052017-11-07 16:36:43 -0800285
Yangster-mac20877162017-12-22 17:19:39 -0800286 LogEvent event(1 /*tagId*/, 0 /*timestamp*/);
287 makeWakeLockEvent(&event, uids, "wl1", 1);
Yao Chen967b2052017-11-07 16:36:43 -0800288
Yangster-mac20877162017-12-22 17:19:39 -0800289 // one matched start
290 vector<MatchingState> matcherState;
291 matcherState.push_back(MatchingState::kMatched);
292 matcherState.push_back(MatchingState::kNotMatched);
293 matcherState.push_back(MatchingState::kNotMatched);
294 vector<sp<ConditionTracker>> allPredicates;
295 vector<ConditionState> conditionCache(1, ConditionState::kNotEvaluated);
296 vector<bool> changedCache(1, false);
Yao Chen967b2052017-11-07 16:36:43 -0800297
Yangster-mac20877162017-12-22 17:19:39 -0800298 conditionTracker.evaluateCondition(event, matcherState, allPredicates, conditionCache,
299 changedCache);
Yao Chen967b2052017-11-07 16:36:43 -0800300
Yangster-mac20877162017-12-22 17:19:39 -0800301 if (position == Position::FIRST ||
302 position == Position::LAST) {
303 EXPECT_EQ(1UL, conditionTracker.mSlicedConditionState.size());
304 } else {
305 EXPECT_EQ(uids.size(), conditionTracker.mSlicedConditionState.size());
306 }
307 EXPECT_TRUE(changedCache[0]);
Yao Chen967b2052017-11-07 16:36:43 -0800308
Yangster-mac20877162017-12-22 17:19:39 -0800309 // Now test query
310 const auto queryKey = getWakeLockQueryKey(position, uids, conditionName);
311 conditionCache[0] = ConditionState::kNotEvaluated;
Yao Chen967b2052017-11-07 16:36:43 -0800312
Yangster-mac93694462018-01-22 20:49:31 -0800313 conditionTracker.isConditionMet(queryKey, allPredicates, dimensionInCondition,
314 conditionCache, dimensionKeys);
Yangster-mac20877162017-12-22 17:19:39 -0800315 EXPECT_EQ(ConditionState::kTrue, conditionCache[0]);
Yao Chen967b2052017-11-07 16:36:43 -0800316
Yangster-mac20877162017-12-22 17:19:39 -0800317 // another wake lock acquired by this uid
318 LogEvent event2(1 /*tagId*/, 0 /*timestamp*/);
319 makeWakeLockEvent(&event2, uids, "wl2", 1);
320 matcherState.clear();
321 matcherState.push_back(MatchingState::kMatched);
322 matcherState.push_back(MatchingState::kNotMatched);
323 conditionCache[0] = ConditionState::kNotEvaluated;
324 changedCache[0] = false;
325 conditionTracker.evaluateCondition(event2, matcherState, allPredicates, conditionCache,
326 changedCache);
327 EXPECT_FALSE(changedCache[0]);
328 if (position == Position::FIRST ||
329 position == Position::LAST) {
330 EXPECT_EQ(1UL, conditionTracker.mSlicedConditionState.size());
331 } else {
332 EXPECT_EQ(uids.size(), conditionTracker.mSlicedConditionState.size());
333 }
Yao Chen967b2052017-11-07 16:36:43 -0800334
Yangster-mac20877162017-12-22 17:19:39 -0800335 // wake lock 1 release
336 LogEvent event3(1 /*tagId*/, 0 /*timestamp*/);
337 makeWakeLockEvent(&event3, uids, "wl1", 0); // now release it.
338 matcherState.clear();
339 matcherState.push_back(MatchingState::kNotMatched);
340 matcherState.push_back(MatchingState::kMatched);
341 conditionCache[0] = ConditionState::kNotEvaluated;
342 changedCache[0] = false;
343 conditionTracker.evaluateCondition(event3, matcherState, allPredicates, conditionCache,
344 changedCache);
345 // nothing changes, because wake lock 2 is still held for this uid
346 EXPECT_FALSE(changedCache[0]);
347 if (position == Position::FIRST ||
348 position == Position::LAST) {
349 EXPECT_EQ(1UL, conditionTracker.mSlicedConditionState.size());
350 } else {
351 EXPECT_EQ(uids.size(), conditionTracker.mSlicedConditionState.size());
352 }
Yao Chen967b2052017-11-07 16:36:43 -0800353
Yangster-mac20877162017-12-22 17:19:39 -0800354 LogEvent event4(1 /*tagId*/, 0 /*timestamp*/);
355 makeWakeLockEvent(&event4, uids, "wl2", 0); // now release it.
356 matcherState.clear();
357 matcherState.push_back(MatchingState::kNotMatched);
358 matcherState.push_back(MatchingState::kMatched);
359 conditionCache[0] = ConditionState::kNotEvaluated;
360 changedCache[0] = false;
361 conditionTracker.evaluateCondition(event4, matcherState, allPredicates, conditionCache,
362 changedCache);
363 EXPECT_EQ(0UL, conditionTracker.mSlicedConditionState.size());
364 EXPECT_TRUE(changedCache[0]);
Yao Chen967b2052017-11-07 16:36:43 -0800365
Yangster-mac20877162017-12-22 17:19:39 -0800366 // query again
367 conditionCache[0] = ConditionState::kNotEvaluated;
Yangster-mac93694462018-01-22 20:49:31 -0800368 conditionTracker.isConditionMet(queryKey, allPredicates, dimensionInCondition,
369 conditionCache, dimensionKeys);
Yangster-mac20877162017-12-22 17:19:39 -0800370 EXPECT_EQ(ConditionState::kFalse, conditionCache[0]);
371
372 }
373
Yao Chen967b2052017-11-07 16:36:43 -0800374}
375
376TEST(SimpleConditionTrackerTest, TestSlicedWithNoOutputDim) {
Yao Chen8a8d16c2018-02-08 14:50:40 -0800377 vector<Matcher> dimensionInCondition;
Yangster-mac93694462018-01-22 20:49:31 -0800378 std::unordered_set<HashableDimensionKey> dimensionKeys;
379
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800380 SimplePredicate simplePredicate = getWakeLockHeldCondition(
Yangster-mac20877162017-12-22 17:19:39 -0800381 true /*nesting*/, true /*default to false*/, false /*slice output by uid*/,
382 Position::ANY /* position */);
Yao Chen967b2052017-11-07 16:36:43 -0800383 string conditionName = "WL_HELD";
384
Yangster-mac94e197c2018-01-02 16:03:03 -0800385 unordered_map<int64_t, int> trackerNameIndexMap;
386 trackerNameIndexMap[StringToId("WAKE_LOCK_ACQUIRE")] = 0;
387 trackerNameIndexMap[StringToId("WAKE_LOCK_RELEASE")] = 1;
388 trackerNameIndexMap[StringToId("RELEASE_ALL")] = 2;
Yao Chen967b2052017-11-07 16:36:43 -0800389
Yangster-mac94e197c2018-01-02 16:03:03 -0800390 SimpleConditionTracker conditionTracker(kConfigKey, StringToId(conditionName),
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800391 0 /*condition tracker index*/, simplePredicate,
Yao Chenb3561512017-11-21 18:07:17 -0800392 trackerNameIndexMap);
Yangster-mac20877162017-12-22 17:19:39 -0800393
394 std::vector<int> uid_list1 = {111, 1111, 11111};
Yao Chen967b2052017-11-07 16:36:43 -0800395 string uid1_wl1 = "wl1_1";
Yangster-mac20877162017-12-22 17:19:39 -0800396 std::vector<int> uid_list2 = {222, 2222, 22222};
Yao Chen967b2052017-11-07 16:36:43 -0800397 string uid2_wl1 = "wl2_1";
398
399 LogEvent event(1 /*tagId*/, 0 /*timestamp*/);
Yangster-mac20877162017-12-22 17:19:39 -0800400 makeWakeLockEvent(&event, uid_list1, uid1_wl1, 1);
Yao Chen967b2052017-11-07 16:36:43 -0800401
402 // one matched start for uid1
403 vector<MatchingState> matcherState;
404 matcherState.push_back(MatchingState::kMatched);
405 matcherState.push_back(MatchingState::kNotMatched);
Yao Chen99752052017-11-27 11:40:45 -0800406 matcherState.push_back(MatchingState::kNotMatched);
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800407 vector<sp<ConditionTracker>> allPredicates;
Yao Chen967b2052017-11-07 16:36:43 -0800408 vector<ConditionState> conditionCache(1, ConditionState::kNotEvaluated);
409 vector<bool> changedCache(1, false);
410
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800411 conditionTracker.evaluateCondition(event, matcherState, allPredicates, conditionCache,
Yao Chen967b2052017-11-07 16:36:43 -0800412 changedCache);
413
414 EXPECT_EQ(1UL, conditionTracker.mSlicedConditionState.size());
415 EXPECT_TRUE(changedCache[0]);
416
417 // Now test query
Yangster-mac20877162017-12-22 17:19:39 -0800418 ConditionKey queryKey;
Yao Chen967b2052017-11-07 16:36:43 -0800419 conditionCache[0] = ConditionState::kNotEvaluated;
420
Yangster-mac93694462018-01-22 20:49:31 -0800421 conditionTracker.isConditionMet(queryKey, allPredicates, dimensionInCondition,
422 conditionCache, dimensionKeys);
Yao Chen967b2052017-11-07 16:36:43 -0800423 EXPECT_EQ(ConditionState::kTrue, conditionCache[0]);
424
425 // another wake lock acquired by this uid
426 LogEvent event2(1 /*tagId*/, 0 /*timestamp*/);
Yangster-mac20877162017-12-22 17:19:39 -0800427 makeWakeLockEvent(&event2, uid_list2, uid2_wl1, 1);
Yao Chen967b2052017-11-07 16:36:43 -0800428 matcherState.clear();
429 matcherState.push_back(MatchingState::kMatched);
430 matcherState.push_back(MatchingState::kNotMatched);
431 conditionCache[0] = ConditionState::kNotEvaluated;
432 changedCache[0] = false;
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800433 conditionTracker.evaluateCondition(event2, matcherState, allPredicates, conditionCache,
Yao Chen967b2052017-11-07 16:36:43 -0800434 changedCache);
435 EXPECT_FALSE(changedCache[0]);
436
437 // uid1 wake lock 1 release
438 LogEvent event3(1 /*tagId*/, 0 /*timestamp*/);
Yangster-mac20877162017-12-22 17:19:39 -0800439 makeWakeLockEvent(&event3, uid_list1, uid1_wl1, 0); // now release it.
Yao Chen967b2052017-11-07 16:36:43 -0800440 matcherState.clear();
441 matcherState.push_back(MatchingState::kNotMatched);
442 matcherState.push_back(MatchingState::kMatched);
443 conditionCache[0] = ConditionState::kNotEvaluated;
444 changedCache[0] = false;
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800445 conditionTracker.evaluateCondition(event3, matcherState, allPredicates, conditionCache,
Yao Chen967b2052017-11-07 16:36:43 -0800446 changedCache);
447 // nothing changes, because uid2 is still holding wl.
448 EXPECT_FALSE(changedCache[0]);
449
450 LogEvent event4(1 /*tagId*/, 0 /*timestamp*/);
Yangster-mac20877162017-12-22 17:19:39 -0800451 makeWakeLockEvent(&event4, uid_list2, uid2_wl1, 0); // now release it.
Yao Chen967b2052017-11-07 16:36:43 -0800452 matcherState.clear();
453 matcherState.push_back(MatchingState::kNotMatched);
454 matcherState.push_back(MatchingState::kMatched);
455 conditionCache[0] = ConditionState::kNotEvaluated;
456 changedCache[0] = false;
Stefan Lafon12d01fa2017-12-04 20:56:09 -0800457 conditionTracker.evaluateCondition(event4, matcherState, allPredicates, conditionCache,
Yao Chen967b2052017-11-07 16:36:43 -0800458 changedCache);
459 EXPECT_EQ(0UL, conditionTracker.mSlicedConditionState.size());
460 EXPECT_TRUE(changedCache[0]);
461
462 // query again
463 conditionCache[0] = ConditionState::kNotEvaluated;
Yangster-mac93694462018-01-22 20:49:31 -0800464 dimensionKeys.clear();
465 conditionTracker.isConditionMet(queryKey, allPredicates, dimensionInCondition,
466 conditionCache, dimensionKeys);
Yao Chen967b2052017-11-07 16:36:43 -0800467 EXPECT_EQ(ConditionState::kFalse, conditionCache[0]);
468}
469
470TEST(SimpleConditionTrackerTest, TestStopAll) {
Yangster-mac20877162017-12-22 17:19:39 -0800471 for (Position position :
472 {Position::ANY, Position::FIRST, Position::LAST}) {
Yao Chen8a8d16c2018-02-08 14:50:40 -0800473 vector<Matcher> dimensionInCondition;
Yangster-mac93694462018-01-22 20:49:31 -0800474 std::unordered_set<HashableDimensionKey> dimensionKeys;
Yangster-mac20877162017-12-22 17:19:39 -0800475 SimplePredicate simplePredicate = getWakeLockHeldCondition(
476 true /*nesting*/, true /*default to false*/, true /*output slice by uid*/,
477 position);
478 string conditionName = "WL_HELD_BY_UID3";
Yao Chen967b2052017-11-07 16:36:43 -0800479
Yangster-mac94e197c2018-01-02 16:03:03 -0800480 unordered_map<int64_t, int> trackerNameIndexMap;
481 trackerNameIndexMap[StringToId("WAKE_LOCK_ACQUIRE")] = 0;
482 trackerNameIndexMap[StringToId("WAKE_LOCK_RELEASE")] = 1;
483 trackerNameIndexMap[StringToId("RELEASE_ALL")] = 2;
Yao Chen967b2052017-11-07 16:36:43 -0800484
Yangster-mac94e197c2018-01-02 16:03:03 -0800485 SimpleConditionTracker conditionTracker(kConfigKey, StringToId(conditionName),
Yangster-mac20877162017-12-22 17:19:39 -0800486 0 /*condition tracker index*/, simplePredicate,
487 trackerNameIndexMap);
Yao Chen967b2052017-11-07 16:36:43 -0800488
Yangster-mac20877162017-12-22 17:19:39 -0800489 std::vector<int> uid_list1 = {111, 1111, 11111};
490 std::vector<int> uid_list2 = {222, 2222, 22222};
Yao Chen967b2052017-11-07 16:36:43 -0800491
Yangster-mac20877162017-12-22 17:19:39 -0800492 LogEvent event(1 /*tagId*/, 0 /*timestamp*/);
493 makeWakeLockEvent(&event, uid_list1, "wl1", 1);
Yao Chen967b2052017-11-07 16:36:43 -0800494
Yangster-mac20877162017-12-22 17:19:39 -0800495 // one matched start
496 vector<MatchingState> matcherState;
497 matcherState.push_back(MatchingState::kMatched);
498 matcherState.push_back(MatchingState::kNotMatched);
499 matcherState.push_back(MatchingState::kNotMatched);
500 vector<sp<ConditionTracker>> allPredicates;
501 vector<ConditionState> conditionCache(1, ConditionState::kNotEvaluated);
502 vector<bool> changedCache(1, false);
Yao Chen967b2052017-11-07 16:36:43 -0800503
Yangster-mac20877162017-12-22 17:19:39 -0800504 conditionTracker.evaluateCondition(event, matcherState, allPredicates, conditionCache,
505 changedCache);
506 if (position == Position::FIRST ||
507 position == Position::LAST) {
508 EXPECT_EQ(1UL, conditionTracker.mSlicedConditionState.size());
509 } else {
510 EXPECT_EQ(uid_list1.size(), conditionTracker.mSlicedConditionState.size());
511 }
512 EXPECT_TRUE(changedCache[0]);
Yao Chen967b2052017-11-07 16:36:43 -0800513
Yangster-mac20877162017-12-22 17:19:39 -0800514 // Now test query
515 const auto queryKey = getWakeLockQueryKey(position, uid_list1, conditionName);
516 conditionCache[0] = ConditionState::kNotEvaluated;
Yao Chen967b2052017-11-07 16:36:43 -0800517
Yangster-mac93694462018-01-22 20:49:31 -0800518 conditionTracker.isConditionMet(queryKey, allPredicates, dimensionInCondition,
519 conditionCache, dimensionKeys);
Yangster-mac20877162017-12-22 17:19:39 -0800520 EXPECT_EQ(ConditionState::kTrue, conditionCache[0]);
Yao Chen967b2052017-11-07 16:36:43 -0800521
Yangster-mac20877162017-12-22 17:19:39 -0800522 // another wake lock acquired by uid2
523 LogEvent event2(1 /*tagId*/, 0 /*timestamp*/);
524 makeWakeLockEvent(&event2, uid_list2, "wl2", 1);
525 matcherState.clear();
526 matcherState.push_back(MatchingState::kMatched);
527 matcherState.push_back(MatchingState::kNotMatched);
528 matcherState.push_back(MatchingState::kNotMatched);
529 conditionCache[0] = ConditionState::kNotEvaluated;
530 changedCache[0] = false;
531 conditionTracker.evaluateCondition(event2, matcherState, allPredicates, conditionCache,
532 changedCache);
533 if (position == Position::FIRST ||
534 position == Position::LAST) {
535 EXPECT_EQ(2UL, conditionTracker.mSlicedConditionState.size());
536 } else {
537 EXPECT_EQ(uid_list1.size() + uid_list2.size(),
538 conditionTracker.mSlicedConditionState.size());
539 }
540 EXPECT_TRUE(changedCache[0]);
Yao Chen967b2052017-11-07 16:36:43 -0800541
Yangster-mac20877162017-12-22 17:19:39 -0800542 // TEST QUERY
543 const auto queryKey2 = getWakeLockQueryKey(position, uid_list2, conditionName);
544 conditionCache[0] = ConditionState::kNotEvaluated;
Yangster-mac93694462018-01-22 20:49:31 -0800545 conditionTracker.isConditionMet(queryKey, allPredicates, dimensionInCondition,
546 conditionCache, dimensionKeys);
Yao Chen967b2052017-11-07 16:36:43 -0800547
Yangster-mac20877162017-12-22 17:19:39 -0800548 EXPECT_EQ(ConditionState::kTrue, conditionCache[0]);
Yao Chen967b2052017-11-07 16:36:43 -0800549
550
Yangster-mac20877162017-12-22 17:19:39 -0800551 // stop all event
552 LogEvent event3(2 /*tagId*/, 0 /*timestamp*/);
553 matcherState.clear();
554 matcherState.push_back(MatchingState::kNotMatched);
555 matcherState.push_back(MatchingState::kNotMatched);
556 matcherState.push_back(MatchingState::kMatched);
Yao Chen967b2052017-11-07 16:36:43 -0800557
Yangster-mac20877162017-12-22 17:19:39 -0800558 conditionCache[0] = ConditionState::kNotEvaluated;
559 changedCache[0] = false;
560 conditionTracker.evaluateCondition(event3, matcherState, allPredicates, conditionCache,
561 changedCache);
562 EXPECT_TRUE(changedCache[0]);
563 EXPECT_EQ(0UL, conditionTracker.mSlicedConditionState.size());
Yao Chen967b2052017-11-07 16:36:43 -0800564
Yangster-mac20877162017-12-22 17:19:39 -0800565 // TEST QUERY
566 const auto queryKey3 = getWakeLockQueryKey(position, uid_list1, conditionName);
567 conditionCache[0] = ConditionState::kNotEvaluated;
Yangster-mac93694462018-01-22 20:49:31 -0800568 conditionTracker.isConditionMet(queryKey, allPredicates, dimensionInCondition,
569 conditionCache, dimensionKeys);
Yangster-mac20877162017-12-22 17:19:39 -0800570 EXPECT_EQ(ConditionState::kFalse, conditionCache[0]);
Yao Chen967b2052017-11-07 16:36:43 -0800571
Yangster-mac20877162017-12-22 17:19:39 -0800572 // TEST QUERY
573 const auto queryKey4 = getWakeLockQueryKey(position, uid_list2, conditionName);
574 conditionCache[0] = ConditionState::kNotEvaluated;
Yangster-mac93694462018-01-22 20:49:31 -0800575 conditionTracker.isConditionMet(queryKey, allPredicates, dimensionInCondition,
576 conditionCache, dimensionKeys);
Yangster-mac20877162017-12-22 17:19:39 -0800577 EXPECT_EQ(ConditionState::kFalse, conditionCache[0]);
578 }
Yao Chen967b2052017-11-07 16:36:43 -0800579}
580
581} // namespace statsd
582} // namespace os
583} // namespace android
584#else
585GTEST_LOG_(INFO) << "This test does nothing.\n";
586#endif