blob: ba2a4cfbe8fde9376cba89351bf1e778743d006d [file] [log] [blame]
tsaichristine10978642019-09-10 14:12:49 -07001/*
2 * Copyright (C) 2019, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
tsaichristine10978642019-09-10 14:12:49 -070016#include "state/StateTracker.h"
tsaichristine10978642019-09-10 14:12:49 -070017
tsaichristinea3d2ed82020-03-19 20:53:36 -070018#include <gtest/gtest.h>
19
20#include "state/StateListener.h"
21#include "state/StateManager.h"
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -070022#include "state/StateTracker.h"
tsaichristinea3d2ed82020-03-19 20:53:36 -070023#include "stats_event.h"
tsaichristine10978642019-09-10 14:12:49 -070024#include "tests/statsd_test_util.h"
25
26#ifdef __ANDROID__
27
28namespace android {
29namespace os {
30namespace statsd {
31
tsaichristinea3d2ed82020-03-19 20:53:36 -070032const int32_t timestampNs = 1000;
33
tsaichristine10978642019-09-10 14:12:49 -070034/**
35 * Mock StateListener class for testing.
36 * Stores primary key and state pairs.
37 */
38class TestStateListener : public virtual StateListener {
39public:
40 TestStateListener(){};
41
42 virtual ~TestStateListener(){};
43
44 struct Update {
45 Update(const HashableDimensionKey& key, int state) : mKey(key), mState(state){};
46 HashableDimensionKey mKey;
47 int mState;
48 };
49
50 std::vector<Update> updates;
51
tsaichristine8d73dc92019-12-06 02:11:02 -080052 void onStateChanged(const int64_t eventTimeNs, const int32_t atomId,
53 const HashableDimensionKey& primaryKey, int oldState, int newState) {
tsaichristine10978642019-09-10 14:12:49 -070054 updates.emplace_back(primaryKey, newState);
55 }
56};
57
tsaichristine69000e62019-10-18 17:34:52 -070058int getStateInt(StateManager& mgr, int atomId, const HashableDimensionKey& queryKey) {
59 FieldValue output;
60 mgr.getStateValue(atomId, queryKey, &output);
61 return output.mValue.int_value;
62}
63
tsaichristinea3d2ed82020-03-19 20:53:36 -070064// START: build event functions.
65// Incorrect event - missing fields
tsaichristine8dca82e2020-04-07 09:40:03 -070066std::unique_ptr<LogEvent> buildIncorrectOverlayEvent(int uid, const std::string& packageName,
tsaichristinea3d2ed82020-03-19 20:53:36 -070067 int state) {
68 AStatsEvent* statsEvent = AStatsEvent_obtain();
69 AStatsEvent_setAtomId(statsEvent, util::OVERLAY_STATE_CHANGED);
70 AStatsEvent_overwriteTimestamp(statsEvent, 1000);
71
72 AStatsEvent_writeInt32(statsEvent, uid);
73 AStatsEvent_writeString(statsEvent, packageName.c_str());
74 // Missing field 3 - using_alert_window.
75 AStatsEvent_writeInt32(statsEvent, state);
tsaichristinea3d2ed82020-03-19 20:53:36 -070076
77 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -070078 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristinea3d2ed82020-03-19 20:53:36 -070079 return logEvent;
80}
81
82// Incorrect event - exclusive state has wrong type
83std::unique_ptr<LogEvent> buildOverlayEventBadStateType(int uid, const std::string& packageName) {
84 AStatsEvent* statsEvent = AStatsEvent_obtain();
85 AStatsEvent_setAtomId(statsEvent, util::OVERLAY_STATE_CHANGED);
86 AStatsEvent_overwriteTimestamp(statsEvent, 1000);
87
88 AStatsEvent_writeInt32(statsEvent, uid);
89 AStatsEvent_writeString(statsEvent, packageName.c_str());
90 AStatsEvent_writeInt32(statsEvent, true); // using_alert_window
91 AStatsEvent_writeString(statsEvent, "string"); // exclusive state: string instead of int
tsaichristinea3d2ed82020-03-19 20:53:36 -070092
93 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -070094 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristinea3d2ed82020-03-19 20:53:36 -070095 return logEvent;
96}
tsaichristine10978642019-09-10 14:12:49 -070097// END: build event functions.
98
tsaichristine10978642019-09-10 14:12:49 -070099TEST(StateListenerTest, TestStateListenerWeakPointer) {
100 sp<TestStateListener> listener = new TestStateListener();
101 wp<TestStateListener> wListener = listener;
102 listener = nullptr; // let go of listener
103 EXPECT_TRUE(wListener.promote() == nullptr);
104}
105
106TEST(StateManagerTest, TestStateManagerGetInstance) {
107 sp<TestStateListener> listener1 = new TestStateListener();
108 StateManager& mgr = StateManager::getInstance();
tsaichristinec876b492019-12-10 13:47:05 -0800109 mgr.clear();
tsaichristine10978642019-09-10 14:12:49 -0700110
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700111 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener1);
tsaichristine10978642019-09-10 14:12:49 -0700112 EXPECT_EQ(1, mgr.getStateTrackersCount());
113 EXPECT_EQ(1, StateManager::getInstance().getStateTrackersCount());
114}
115
116/**
117 * Test registering listeners to StateTrackers
118 *
119 * - StateManager will create a new StateTracker if it doesn't already exist
120 * and then register the listener to the StateTracker.
121 * - If a listener is already registered to a StateTracker, it is not added again.
122 * - StateTrackers are only created for atoms that are state atoms.
123 */
124TEST(StateTrackerTest, TestRegisterListener) {
125 sp<TestStateListener> listener1 = new TestStateListener();
126 sp<TestStateListener> listener2 = new TestStateListener();
127 StateManager mgr;
128
129 // Register listener to non-existing StateTracker
130 EXPECT_EQ(0, mgr.getStateTrackersCount());
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700131 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener1);
tsaichristine10978642019-09-10 14:12:49 -0700132 EXPECT_EQ(1, mgr.getStateTrackersCount());
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700133 EXPECT_EQ(1, mgr.getListenersCount(util::SCREEN_STATE_CHANGED));
tsaichristine10978642019-09-10 14:12:49 -0700134
135 // Register listener to existing StateTracker
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700136 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener2);
tsaichristine10978642019-09-10 14:12:49 -0700137 EXPECT_EQ(1, mgr.getStateTrackersCount());
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700138 EXPECT_EQ(2, mgr.getListenersCount(util::SCREEN_STATE_CHANGED));
tsaichristine10978642019-09-10 14:12:49 -0700139
140 // Register already registered listener to existing StateTracker
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700141 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener2);
tsaichristine10978642019-09-10 14:12:49 -0700142 EXPECT_EQ(1, mgr.getStateTrackersCount());
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700143 EXPECT_EQ(2, mgr.getListenersCount(util::SCREEN_STATE_CHANGED));
tsaichristine10978642019-09-10 14:12:49 -0700144
145 // Register listener to non-state atom
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700146 mgr.registerListener(util::BATTERY_LEVEL_CHANGED, listener2);
147 EXPECT_EQ(2, mgr.getStateTrackersCount());
tsaichristine10978642019-09-10 14:12:49 -0700148}
149
150/**
151 * Test unregistering listeners from StateTrackers
152 *
153 * - StateManager will unregister listeners from a StateTracker only if the
154 * StateTracker exists and the listener is registered to the StateTracker.
155 * - Once all listeners are removed from a StateTracker, the StateTracker
156 * is also removed.
157 */
158TEST(StateTrackerTest, TestUnregisterListener) {
159 sp<TestStateListener> listener1 = new TestStateListener();
160 sp<TestStateListener> listener2 = new TestStateListener();
161 StateManager mgr;
162
163 // Unregister listener from non-existing StateTracker
164 EXPECT_EQ(0, mgr.getStateTrackersCount());
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700165 mgr.unregisterListener(util::SCREEN_STATE_CHANGED, listener1);
tsaichristine10978642019-09-10 14:12:49 -0700166 EXPECT_EQ(0, mgr.getStateTrackersCount());
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700167 EXPECT_EQ(-1, mgr.getListenersCount(util::SCREEN_STATE_CHANGED));
tsaichristine10978642019-09-10 14:12:49 -0700168
169 // Unregister non-registered listener from existing StateTracker
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700170 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener1);
tsaichristine10978642019-09-10 14:12:49 -0700171 EXPECT_EQ(1, mgr.getStateTrackersCount());
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700172 EXPECT_EQ(1, mgr.getListenersCount(util::SCREEN_STATE_CHANGED));
173 mgr.unregisterListener(util::SCREEN_STATE_CHANGED, listener2);
tsaichristine10978642019-09-10 14:12:49 -0700174 EXPECT_EQ(1, mgr.getStateTrackersCount());
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700175 EXPECT_EQ(1, mgr.getListenersCount(util::SCREEN_STATE_CHANGED));
tsaichristine10978642019-09-10 14:12:49 -0700176
177 // Unregister second-to-last listener from StateTracker
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700178 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener2);
179 mgr.unregisterListener(util::SCREEN_STATE_CHANGED, listener1);
tsaichristine10978642019-09-10 14:12:49 -0700180 EXPECT_EQ(1, mgr.getStateTrackersCount());
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700181 EXPECT_EQ(1, mgr.getListenersCount(util::SCREEN_STATE_CHANGED));
tsaichristine10978642019-09-10 14:12:49 -0700182
183 // Unregister last listener from StateTracker
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700184 mgr.unregisterListener(util::SCREEN_STATE_CHANGED, listener2);
tsaichristine10978642019-09-10 14:12:49 -0700185 EXPECT_EQ(0, mgr.getStateTrackersCount());
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700186 EXPECT_EQ(-1, mgr.getListenersCount(util::SCREEN_STATE_CHANGED));
tsaichristine10978642019-09-10 14:12:49 -0700187}
tsaichristinea3d2ed82020-03-19 20:53:36 -0700188
189/**
190 * Test a binary state atom with nested counting.
191 *
192 * To go from an "ON" state to an "OFF" state with nested counting, we must see
193 * an equal number of "OFF" events as "ON" events.
194 * For example, ACQUIRE, ACQUIRE, RELEASE will still be in the ACQUIRE state.
195 * ACQUIRE, ACQUIRE, RELEASE, RELEASE will be in the RELEASE state.
196 */
197TEST(StateTrackerTest, TestStateChangeNested) {
198 sp<TestStateListener> listener = new TestStateListener();
199 StateManager mgr;
200 mgr.registerListener(util::WAKELOCK_STATE_CHANGED, listener);
201
202 std::vector<int> attributionUids1 = {1000};
203 std::vector<string> attributionTags1 = {"tag"};
204
205 std::unique_ptr<LogEvent> event1 = CreateAcquireWakelockEvent(timestampNs, attributionUids1,
206 attributionTags1, "wakelockName");
207 mgr.onLogEvent(*event1);
208 EXPECT_EQ(1, listener->updates.size());
209 EXPECT_EQ(1000, listener->updates[0].mKey.getValues()[0].mValue.int_value);
210 EXPECT_EQ(1, listener->updates[0].mState);
211 listener->updates.clear();
212
213 std::unique_ptr<LogEvent> event2 = CreateAcquireWakelockEvent(
214 timestampNs + 1000, attributionUids1, attributionTags1, "wakelockName");
215 mgr.onLogEvent(*event2);
216 EXPECT_EQ(0, listener->updates.size());
217
218 std::unique_ptr<LogEvent> event3 = CreateReleaseWakelockEvent(
219 timestampNs + 2000, attributionUids1, attributionTags1, "wakelockName");
220 mgr.onLogEvent(*event3);
221 EXPECT_EQ(0, listener->updates.size());
222
223 std::unique_ptr<LogEvent> event4 = CreateReleaseWakelockEvent(
224 timestampNs + 3000, attributionUids1, attributionTags1, "wakelockName");
225 mgr.onLogEvent(*event4);
226 EXPECT_EQ(1, listener->updates.size());
227 EXPECT_EQ(1000, listener->updates[0].mKey.getValues()[0].mValue.int_value);
228 EXPECT_EQ(0, listener->updates[0].mState);
229}
230
231/**
232 * Test a state atom with a reset state.
233 *
234 * If the reset state value is seen, every state in the map is set to the default
235 * state and every listener is notified.
236 */
237TEST(StateTrackerTest, TestStateChangeReset) {
238 sp<TestStateListener> listener = new TestStateListener();
239 StateManager mgr;
240 mgr.registerListener(util::BLE_SCAN_STATE_CHANGED, listener);
241
242 std::vector<int> attributionUids1 = {1000};
243 std::vector<string> attributionTags1 = {"tag1"};
244 std::vector<int> attributionUids2 = {2000};
245
246 std::unique_ptr<LogEvent> event1 =
247 CreateBleScanStateChangedEvent(timestampNs, attributionUids1, attributionTags1,
248 BleScanStateChanged::ON, false, false, false);
249 mgr.onLogEvent(*event1);
250 EXPECT_EQ(1, listener->updates.size());
251 EXPECT_EQ(1000, listener->updates[0].mKey.getValues()[0].mValue.int_value);
252 EXPECT_EQ(BleScanStateChanged::ON, listener->updates[0].mState);
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700253 FieldValue stateFieldValue;
254 mgr.getStateValue(util::BLE_SCAN_STATE_CHANGED, listener->updates[0].mKey, &stateFieldValue);
255 EXPECT_EQ(BleScanStateChanged::ON, stateFieldValue.mValue.int_value);
tsaichristinea3d2ed82020-03-19 20:53:36 -0700256 listener->updates.clear();
257
258 std::unique_ptr<LogEvent> event2 =
259 CreateBleScanStateChangedEvent(timestampNs + 1000, attributionUids2, attributionTags1,
260 BleScanStateChanged::ON, false, false, false);
261 mgr.onLogEvent(*event2);
262 EXPECT_EQ(1, listener->updates.size());
263 EXPECT_EQ(2000, listener->updates[0].mKey.getValues()[0].mValue.int_value);
264 EXPECT_EQ(BleScanStateChanged::ON, listener->updates[0].mState);
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700265 mgr.getStateValue(util::BLE_SCAN_STATE_CHANGED, listener->updates[0].mKey, &stateFieldValue);
266 EXPECT_EQ(BleScanStateChanged::ON, stateFieldValue.mValue.int_value);
tsaichristinea3d2ed82020-03-19 20:53:36 -0700267 listener->updates.clear();
268
269 std::unique_ptr<LogEvent> event3 =
270 CreateBleScanStateChangedEvent(timestampNs + 2000, attributionUids2, attributionTags1,
271 BleScanStateChanged::RESET, false, false, false);
272 mgr.onLogEvent(*event3);
273 EXPECT_EQ(2, listener->updates.size());
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700274 for (const TestStateListener::Update& update : listener->updates) {
275 EXPECT_EQ(BleScanStateChanged::OFF, update.mState);
276
277 mgr.getStateValue(util::BLE_SCAN_STATE_CHANGED, update.mKey, &stateFieldValue);
278 EXPECT_EQ(BleScanStateChanged::OFF, stateFieldValue.mValue.int_value);
279 }
tsaichristinea3d2ed82020-03-19 20:53:36 -0700280}
281
282/**
283 * Test StateManager's onLogEvent and StateListener's onStateChanged correctly
284 * updates listener for states without primary keys.
285 */
286TEST(StateTrackerTest, TestStateChangeNoPrimaryFields) {
287 sp<TestStateListener> listener1 = new TestStateListener();
288 StateManager mgr;
289 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener1);
290
291 // log event
292 std::unique_ptr<LogEvent> event = CreateScreenStateChangedEvent(
293 timestampNs, android::view::DisplayStateEnum::DISPLAY_STATE_ON);
294 mgr.onLogEvent(*event);
295
296 // check listener was updated
297 EXPECT_EQ(1, listener1->updates.size());
298 EXPECT_EQ(DEFAULT_DIMENSION_KEY, listener1->updates[0].mKey);
299 EXPECT_EQ(2, listener1->updates[0].mState);
300
301 // check StateTracker was updated by querying for state
302 HashableDimensionKey queryKey = DEFAULT_DIMENSION_KEY;
303 EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_ON,
304 getStateInt(mgr, util::SCREEN_STATE_CHANGED, queryKey));
305}
306
307/**
308 * Test StateManager's onLogEvent and StateListener's onStateChanged correctly
309 * updates listener for states with one primary key.
310 */
311TEST(StateTrackerTest, TestStateChangeOnePrimaryField) {
312 sp<TestStateListener> listener1 = new TestStateListener();
313 StateManager mgr;
314 mgr.registerListener(util::UID_PROCESS_STATE_CHANGED, listener1);
315
316 // log event
317 std::unique_ptr<LogEvent> event = CreateUidProcessStateChangedEvent(
318 timestampNs, 1000 /*uid*/, android::app::ProcessStateEnum::PROCESS_STATE_TOP);
319 mgr.onLogEvent(*event);
320
321 // check listener was updated
322 EXPECT_EQ(1, listener1->updates.size());
323 EXPECT_EQ(1000, listener1->updates[0].mKey.getValues()[0].mValue.int_value);
324 EXPECT_EQ(1002, listener1->updates[0].mState);
325
326 // check StateTracker was updated by querying for state
327 HashableDimensionKey queryKey;
328 getUidProcessKey(1000 /* uid */, &queryKey);
329 EXPECT_EQ(android::app::ProcessStateEnum::PROCESS_STATE_TOP,
330 getStateInt(mgr, util::UID_PROCESS_STATE_CHANGED, queryKey));
331}
332
333TEST(StateTrackerTest, TestStateChangePrimaryFieldAttrChain) {
334 sp<TestStateListener> listener1 = new TestStateListener();
335 StateManager mgr;
336 mgr.registerListener(util::WAKELOCK_STATE_CHANGED, listener1);
337
338 // Log event.
339 std::vector<int> attributionUids = {1001};
340 std::vector<string> attributionTags = {"tag1"};
341
342 std::unique_ptr<LogEvent> event = CreateAcquireWakelockEvent(timestampNs, attributionUids,
343 attributionTags, "wakelockName");
344 mgr.onLogEvent(*event);
345 EXPECT_EQ(1, mgr.getStateTrackersCount());
346 EXPECT_EQ(1, mgr.getListenersCount(util::WAKELOCK_STATE_CHANGED));
347
348 // Check listener was updated.
349 EXPECT_EQ(1, listener1->updates.size());
350 EXPECT_EQ(3, listener1->updates[0].mKey.getValues().size());
351 EXPECT_EQ(1001, listener1->updates[0].mKey.getValues()[0].mValue.int_value);
352 EXPECT_EQ(1, listener1->updates[0].mKey.getValues()[1].mValue.int_value);
353 EXPECT_EQ("wakelockName", listener1->updates[0].mKey.getValues()[2].mValue.str_value);
354 EXPECT_EQ(WakelockStateChanged::ACQUIRE, listener1->updates[0].mState);
355
356 // Check StateTracker was updated by querying for state.
357 HashableDimensionKey queryKey;
358 getPartialWakelockKey(1001 /* uid */, "wakelockName", &queryKey);
359 EXPECT_EQ(WakelockStateChanged::ACQUIRE,
360 getStateInt(mgr, util::WAKELOCK_STATE_CHANGED, queryKey));
361
362 // No state stored for this query key.
363 HashableDimensionKey queryKey2;
364 getPartialWakelockKey(1002 /* uid */, "tag1", &queryKey2);
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700365 EXPECT_EQ(-1 /*StateTracker::kStateUnknown*/,
tsaichristinea3d2ed82020-03-19 20:53:36 -0700366 getStateInt(mgr, util::WAKELOCK_STATE_CHANGED, queryKey2));
367
368 // Partial query fails.
369 HashableDimensionKey queryKey3;
370 getPartialWakelockKey(1001 /* uid */, &queryKey3);
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700371 EXPECT_EQ(-1 /*StateTracker::kStateUnknown*/,
tsaichristinea3d2ed82020-03-19 20:53:36 -0700372 getStateInt(mgr, util::WAKELOCK_STATE_CHANGED, queryKey3));
373}
374
375/**
376 * Test StateManager's onLogEvent and StateListener's onStateChanged correctly
377 * updates listener for states with multiple primary keys.
378 */
379TEST(StateTrackerTest, TestStateChangeMultiplePrimaryFields) {
380 sp<TestStateListener> listener1 = new TestStateListener();
381 StateManager mgr;
382 mgr.registerListener(util::OVERLAY_STATE_CHANGED, listener1);
383
384 // log event
385 std::unique_ptr<LogEvent> event = CreateOverlayStateChangedEvent(
386 timestampNs, 1000 /* uid */, "package1", true /*using_alert_window*/,
387 OverlayStateChanged::ENTERED);
388 mgr.onLogEvent(*event);
389
390 // check listener was updated
391 EXPECT_EQ(1, listener1->updates.size());
392 EXPECT_EQ(1000, listener1->updates[0].mKey.getValues()[0].mValue.int_value);
393 EXPECT_EQ(1, listener1->updates[0].mState);
394
395 // check StateTracker was updated by querying for state
396 HashableDimensionKey queryKey;
397 getOverlayKey(1000 /* uid */, "package1", &queryKey);
398 EXPECT_EQ(OverlayStateChanged::ENTERED,
399 getStateInt(mgr, util::OVERLAY_STATE_CHANGED, queryKey));
400}
401
402/**
403 * Test StateManager's onLogEvent and StateListener's onStateChanged
404 * when there is an error extracting state from log event. Listener is not
405 * updated of state change.
406 */
407TEST(StateTrackerTest, TestStateChangeEventError) {
408 sp<TestStateListener> listener1 = new TestStateListener();
409 StateManager mgr;
410 mgr.registerListener(util::OVERLAY_STATE_CHANGED, listener1);
411
412 // log event
413 std::shared_ptr<LogEvent> event1 =
414 buildIncorrectOverlayEvent(1000 /* uid */, "package1", 1 /* state */);
415 std::shared_ptr<LogEvent> event2 = buildOverlayEventBadStateType(1001 /* uid */, "package2");
416
417 // check listener was updated
418 mgr.onLogEvent(*event1);
419 EXPECT_EQ(0, listener1->updates.size());
420 mgr.onLogEvent(*event2);
421 EXPECT_EQ(0, listener1->updates.size());
422}
423
424TEST(StateTrackerTest, TestStateQuery) {
425 sp<TestStateListener> listener1 = new TestStateListener();
426 sp<TestStateListener> listener2 = new TestStateListener();
427 sp<TestStateListener> listener3 = new TestStateListener();
428 sp<TestStateListener> listener4 = new TestStateListener();
429 StateManager mgr;
430 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener1);
431 mgr.registerListener(util::UID_PROCESS_STATE_CHANGED, listener2);
432 mgr.registerListener(util::OVERLAY_STATE_CHANGED, listener3);
433 mgr.registerListener(util::WAKELOCK_STATE_CHANGED, listener4);
434
435 std::unique_ptr<LogEvent> event1 = CreateUidProcessStateChangedEvent(
436 timestampNs, 1000 /*uid*/,
437 android::app::ProcessStateEnum::PROCESS_STATE_TOP); // state value: 1002
438 std::unique_ptr<LogEvent> event2 = CreateUidProcessStateChangedEvent(
439 timestampNs + 1000, 1001 /*uid*/,
440 android::app::ProcessStateEnum::PROCESS_STATE_FOREGROUND_SERVICE); // state value:
441 // 1003
442 std::unique_ptr<LogEvent> event3 = CreateUidProcessStateChangedEvent(
443 timestampNs + 2000, 1002 /*uid*/,
444 android::app::ProcessStateEnum::PROCESS_STATE_PERSISTENT); // state value: 1000
445 std::unique_ptr<LogEvent> event4 = CreateUidProcessStateChangedEvent(
446 timestampNs + 3000, 1001 /*uid*/,
447 android::app::ProcessStateEnum::PROCESS_STATE_TOP); // state value: 1002
448 std::unique_ptr<LogEvent> event5 = CreateScreenStateChangedEvent(
449 timestampNs + 4000, android::view::DisplayStateEnum::DISPLAY_STATE_ON);
450 std::unique_ptr<LogEvent> event6 = CreateOverlayStateChangedEvent(
451 timestampNs + 5000, 1000 /*uid*/, "package1", true /*using_alert_window*/,
452 OverlayStateChanged::ENTERED);
453 std::unique_ptr<LogEvent> event7 = CreateOverlayStateChangedEvent(
454 timestampNs + 6000, 1000 /*uid*/, "package2", true /*using_alert_window*/,
455 OverlayStateChanged::EXITED);
456
457 std::vector<int> attributionUids = {1005};
458 std::vector<string> attributionTags = {"tag"};
459
460 std::unique_ptr<LogEvent> event8 = CreateAcquireWakelockEvent(
461 timestampNs + 7000, attributionUids, attributionTags, "wakelock1");
462 std::unique_ptr<LogEvent> event9 = CreateReleaseWakelockEvent(
463 timestampNs + 8000, attributionUids, attributionTags, "wakelock2");
464
465 mgr.onLogEvent(*event1);
466 mgr.onLogEvent(*event2);
467 mgr.onLogEvent(*event3);
468 mgr.onLogEvent(*event5);
469 mgr.onLogEvent(*event5);
470 mgr.onLogEvent(*event6);
471 mgr.onLogEvent(*event7);
472 mgr.onLogEvent(*event8);
473 mgr.onLogEvent(*event9);
474
475 // Query for UidProcessState of uid 1001
476 HashableDimensionKey queryKey1;
477 getUidProcessKey(1001, &queryKey1);
478 EXPECT_EQ(android::app::ProcessStateEnum::PROCESS_STATE_FOREGROUND_SERVICE,
479 getStateInt(mgr, util::UID_PROCESS_STATE_CHANGED, queryKey1));
480
481 // Query for UidProcessState of uid 1004 - not in state map
482 HashableDimensionKey queryKey2;
483 getUidProcessKey(1004, &queryKey2);
484 EXPECT_EQ(-1, getStateInt(mgr, util::UID_PROCESS_STATE_CHANGED,
485 queryKey2)); // default state
486
487 // Query for UidProcessState of uid 1001 - after change in state
488 mgr.onLogEvent(*event4);
489 EXPECT_EQ(android::app::ProcessStateEnum::PROCESS_STATE_TOP,
490 getStateInt(mgr, util::UID_PROCESS_STATE_CHANGED, queryKey1));
491
492 // Query for ScreenState
493 EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_ON,
494 getStateInt(mgr, util::SCREEN_STATE_CHANGED, DEFAULT_DIMENSION_KEY));
495
496 // Query for OverlayState of uid 1000, package name "package2"
497 HashableDimensionKey queryKey3;
498 getOverlayKey(1000, "package2", &queryKey3);
499 EXPECT_EQ(OverlayStateChanged::EXITED,
500 getStateInt(mgr, util::OVERLAY_STATE_CHANGED, queryKey3));
501
502 // Query for WakelockState of uid 1005, tag 2
503 HashableDimensionKey queryKey4;
504 getPartialWakelockKey(1005, "wakelock2", &queryKey4);
505 EXPECT_EQ(WakelockStateChanged::RELEASE,
506 getStateInt(mgr, util::WAKELOCK_STATE_CHANGED, queryKey4));
507
508 // Query for WakelockState of uid 1005, tag 1
509 HashableDimensionKey queryKey5;
510 getPartialWakelockKey(1005, "wakelock1", &queryKey5);
511 EXPECT_EQ(WakelockStateChanged::ACQUIRE,
512 getStateInt(mgr, util::WAKELOCK_STATE_CHANGED, queryKey5));
513}
tsaichristine10978642019-09-10 14:12:49 -0700514
515} // namespace statsd
516} // namespace os
517} // namespace android
518#else
519GTEST_LOG_(INFO) << "This test does nothing.\n";
520#endif