blob: 78c80bc8307cedc2831cf7e22cf1658ee1ccf111 [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"
22#include "stats_event.h"
tsaichristine10978642019-09-10 14:12:49 -070023#include "tests/statsd_test_util.h"
24
25#ifdef __ANDROID__
26
27namespace android {
28namespace os {
29namespace statsd {
30
tsaichristinea3d2ed82020-03-19 20:53:36 -070031const int32_t timestampNs = 1000;
32
tsaichristine10978642019-09-10 14:12:49 -070033/**
34 * Mock StateListener class for testing.
35 * Stores primary key and state pairs.
36 */
37class TestStateListener : public virtual StateListener {
38public:
39 TestStateListener(){};
40
41 virtual ~TestStateListener(){};
42
43 struct Update {
44 Update(const HashableDimensionKey& key, int state) : mKey(key), mState(state){};
45 HashableDimensionKey mKey;
46 int mState;
47 };
48
49 std::vector<Update> updates;
50
tsaichristine8d73dc92019-12-06 02:11:02 -080051 void onStateChanged(const int64_t eventTimeNs, const int32_t atomId,
52 const HashableDimensionKey& primaryKey, int oldState, int newState) {
tsaichristine10978642019-09-10 14:12:49 -070053 updates.emplace_back(primaryKey, newState);
54 }
55};
56
tsaichristine69000e62019-10-18 17:34:52 -070057int getStateInt(StateManager& mgr, int atomId, const HashableDimensionKey& queryKey) {
58 FieldValue output;
59 mgr.getStateValue(atomId, queryKey, &output);
60 return output.mValue.int_value;
61}
62
tsaichristinea3d2ed82020-03-19 20:53:36 -070063// START: build event functions.
64// Incorrect event - missing fields
tsaichristine8dca82e2020-04-07 09:40:03 -070065std::unique_ptr<LogEvent> buildIncorrectOverlayEvent(int uid, const std::string& packageName,
tsaichristinea3d2ed82020-03-19 20:53:36 -070066 int state) {
67 AStatsEvent* statsEvent = AStatsEvent_obtain();
68 AStatsEvent_setAtomId(statsEvent, util::OVERLAY_STATE_CHANGED);
69 AStatsEvent_overwriteTimestamp(statsEvent, 1000);
70
71 AStatsEvent_writeInt32(statsEvent, uid);
72 AStatsEvent_writeString(statsEvent, packageName.c_str());
73 // Missing field 3 - using_alert_window.
74 AStatsEvent_writeInt32(statsEvent, state);
tsaichristinea3d2ed82020-03-19 20:53:36 -070075
76 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -070077 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristinea3d2ed82020-03-19 20:53:36 -070078 return logEvent;
79}
80
81// Incorrect event - exclusive state has wrong type
82std::unique_ptr<LogEvent> buildOverlayEventBadStateType(int uid, const std::string& packageName) {
83 AStatsEvent* statsEvent = AStatsEvent_obtain();
84 AStatsEvent_setAtomId(statsEvent, util::OVERLAY_STATE_CHANGED);
85 AStatsEvent_overwriteTimestamp(statsEvent, 1000);
86
87 AStatsEvent_writeInt32(statsEvent, uid);
88 AStatsEvent_writeString(statsEvent, packageName.c_str());
89 AStatsEvent_writeInt32(statsEvent, true); // using_alert_window
90 AStatsEvent_writeString(statsEvent, "string"); // exclusive state: string instead of int
tsaichristinea3d2ed82020-03-19 20:53:36 -070091
92 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -070093 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristinea3d2ed82020-03-19 20:53:36 -070094 return logEvent;
95}
tsaichristine10978642019-09-10 14:12:49 -070096// END: build event functions.
97
tsaichristine10978642019-09-10 14:12:49 -070098TEST(StateListenerTest, TestStateListenerWeakPointer) {
99 sp<TestStateListener> listener = new TestStateListener();
100 wp<TestStateListener> wListener = listener;
101 listener = nullptr; // let go of listener
102 EXPECT_TRUE(wListener.promote() == nullptr);
103}
104
105TEST(StateManagerTest, TestStateManagerGetInstance) {
106 sp<TestStateListener> listener1 = new TestStateListener();
107 StateManager& mgr = StateManager::getInstance();
tsaichristinec876b492019-12-10 13:47:05 -0800108 mgr.clear();
tsaichristine10978642019-09-10 14:12:49 -0700109
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700110 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener1);
tsaichristine10978642019-09-10 14:12:49 -0700111 EXPECT_EQ(1, mgr.getStateTrackersCount());
112 EXPECT_EQ(1, StateManager::getInstance().getStateTrackersCount());
113}
114
115/**
116 * Test registering listeners to StateTrackers
117 *
118 * - StateManager will create a new StateTracker if it doesn't already exist
119 * and then register the listener to the StateTracker.
120 * - If a listener is already registered to a StateTracker, it is not added again.
121 * - StateTrackers are only created for atoms that are state atoms.
122 */
123TEST(StateTrackerTest, TestRegisterListener) {
124 sp<TestStateListener> listener1 = new TestStateListener();
125 sp<TestStateListener> listener2 = new TestStateListener();
126 StateManager mgr;
127
128 // Register listener to non-existing StateTracker
129 EXPECT_EQ(0, mgr.getStateTrackersCount());
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700130 EXPECT_TRUE(mgr.registerListener(util::SCREEN_STATE_CHANGED, listener1));
tsaichristine10978642019-09-10 14:12:49 -0700131 EXPECT_EQ(1, mgr.getStateTrackersCount());
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700132 EXPECT_EQ(1, mgr.getListenersCount(util::SCREEN_STATE_CHANGED));
tsaichristine10978642019-09-10 14:12:49 -0700133
134 // Register listener to existing StateTracker
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700135 EXPECT_TRUE(mgr.registerListener(util::SCREEN_STATE_CHANGED, listener2));
tsaichristine10978642019-09-10 14:12:49 -0700136 EXPECT_EQ(1, mgr.getStateTrackersCount());
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700137 EXPECT_EQ(2, mgr.getListenersCount(util::SCREEN_STATE_CHANGED));
tsaichristine10978642019-09-10 14:12:49 -0700138
139 // Register already registered listener to existing StateTracker
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700140 EXPECT_TRUE(mgr.registerListener(util::SCREEN_STATE_CHANGED, listener2));
tsaichristine10978642019-09-10 14:12:49 -0700141 EXPECT_EQ(1, mgr.getStateTrackersCount());
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700142 EXPECT_EQ(2, mgr.getListenersCount(util::SCREEN_STATE_CHANGED));
tsaichristine10978642019-09-10 14:12:49 -0700143
144 // Register listener to non-state atom
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700145 EXPECT_FALSE(mgr.registerListener(util::BATTERY_LEVEL_CHANGED, listener2));
tsaichristine10978642019-09-10 14:12:49 -0700146 EXPECT_EQ(1, mgr.getStateTrackersCount());
147}
148
149/**
150 * Test unregistering listeners from StateTrackers
151 *
152 * - StateManager will unregister listeners from a StateTracker only if the
153 * StateTracker exists and the listener is registered to the StateTracker.
154 * - Once all listeners are removed from a StateTracker, the StateTracker
155 * is also removed.
156 */
157TEST(StateTrackerTest, TestUnregisterListener) {
158 sp<TestStateListener> listener1 = new TestStateListener();
159 sp<TestStateListener> listener2 = new TestStateListener();
160 StateManager mgr;
161
162 // Unregister listener from non-existing StateTracker
163 EXPECT_EQ(0, mgr.getStateTrackersCount());
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700164 mgr.unregisterListener(util::SCREEN_STATE_CHANGED, listener1);
tsaichristine10978642019-09-10 14:12:49 -0700165 EXPECT_EQ(0, mgr.getStateTrackersCount());
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700166 EXPECT_EQ(-1, mgr.getListenersCount(util::SCREEN_STATE_CHANGED));
tsaichristine10978642019-09-10 14:12:49 -0700167
168 // Unregister non-registered listener from existing StateTracker
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700169 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener1);
tsaichristine10978642019-09-10 14:12:49 -0700170 EXPECT_EQ(1, mgr.getStateTrackersCount());
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700171 EXPECT_EQ(1, mgr.getListenersCount(util::SCREEN_STATE_CHANGED));
172 mgr.unregisterListener(util::SCREEN_STATE_CHANGED, listener2);
tsaichristine10978642019-09-10 14:12:49 -0700173 EXPECT_EQ(1, mgr.getStateTrackersCount());
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700174 EXPECT_EQ(1, mgr.getListenersCount(util::SCREEN_STATE_CHANGED));
tsaichristine10978642019-09-10 14:12:49 -0700175
176 // Unregister second-to-last listener from StateTracker
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700177 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener2);
178 mgr.unregisterListener(util::SCREEN_STATE_CHANGED, listener1);
tsaichristine10978642019-09-10 14:12:49 -0700179 EXPECT_EQ(1, mgr.getStateTrackersCount());
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700180 EXPECT_EQ(1, mgr.getListenersCount(util::SCREEN_STATE_CHANGED));
tsaichristine10978642019-09-10 14:12:49 -0700181
182 // Unregister last listener from StateTracker
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700183 mgr.unregisterListener(util::SCREEN_STATE_CHANGED, listener2);
tsaichristine10978642019-09-10 14:12:49 -0700184 EXPECT_EQ(0, mgr.getStateTrackersCount());
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700185 EXPECT_EQ(-1, mgr.getListenersCount(util::SCREEN_STATE_CHANGED));
tsaichristine10978642019-09-10 14:12:49 -0700186}
tsaichristinea3d2ed82020-03-19 20:53:36 -0700187
188/**
189 * Test a binary state atom with nested counting.
190 *
191 * To go from an "ON" state to an "OFF" state with nested counting, we must see
192 * an equal number of "OFF" events as "ON" events.
193 * For example, ACQUIRE, ACQUIRE, RELEASE will still be in the ACQUIRE state.
194 * ACQUIRE, ACQUIRE, RELEASE, RELEASE will be in the RELEASE state.
195 */
196TEST(StateTrackerTest, TestStateChangeNested) {
197 sp<TestStateListener> listener = new TestStateListener();
198 StateManager mgr;
199 mgr.registerListener(util::WAKELOCK_STATE_CHANGED, listener);
200
201 std::vector<int> attributionUids1 = {1000};
202 std::vector<string> attributionTags1 = {"tag"};
203
204 std::unique_ptr<LogEvent> event1 = CreateAcquireWakelockEvent(timestampNs, attributionUids1,
205 attributionTags1, "wakelockName");
206 mgr.onLogEvent(*event1);
207 EXPECT_EQ(1, listener->updates.size());
208 EXPECT_EQ(1000, listener->updates[0].mKey.getValues()[0].mValue.int_value);
209 EXPECT_EQ(1, listener->updates[0].mState);
210 listener->updates.clear();
211
212 std::unique_ptr<LogEvent> event2 = CreateAcquireWakelockEvent(
213 timestampNs + 1000, attributionUids1, attributionTags1, "wakelockName");
214 mgr.onLogEvent(*event2);
215 EXPECT_EQ(0, listener->updates.size());
216
217 std::unique_ptr<LogEvent> event3 = CreateReleaseWakelockEvent(
218 timestampNs + 2000, attributionUids1, attributionTags1, "wakelockName");
219 mgr.onLogEvent(*event3);
220 EXPECT_EQ(0, listener->updates.size());
221
222 std::unique_ptr<LogEvent> event4 = CreateReleaseWakelockEvent(
223 timestampNs + 3000, attributionUids1, attributionTags1, "wakelockName");
224 mgr.onLogEvent(*event4);
225 EXPECT_EQ(1, listener->updates.size());
226 EXPECT_EQ(1000, listener->updates[0].mKey.getValues()[0].mValue.int_value);
227 EXPECT_EQ(0, listener->updates[0].mState);
228}
229
230/**
231 * Test a state atom with a reset state.
232 *
233 * If the reset state value is seen, every state in the map is set to the default
234 * state and every listener is notified.
235 */
236TEST(StateTrackerTest, TestStateChangeReset) {
237 sp<TestStateListener> listener = new TestStateListener();
238 StateManager mgr;
239 mgr.registerListener(util::BLE_SCAN_STATE_CHANGED, listener);
240
241 std::vector<int> attributionUids1 = {1000};
242 std::vector<string> attributionTags1 = {"tag1"};
243 std::vector<int> attributionUids2 = {2000};
244
245 std::unique_ptr<LogEvent> event1 =
246 CreateBleScanStateChangedEvent(timestampNs, attributionUids1, attributionTags1,
247 BleScanStateChanged::ON, false, false, false);
248 mgr.onLogEvent(*event1);
249 EXPECT_EQ(1, listener->updates.size());
250 EXPECT_EQ(1000, listener->updates[0].mKey.getValues()[0].mValue.int_value);
251 EXPECT_EQ(BleScanStateChanged::ON, listener->updates[0].mState);
252 listener->updates.clear();
253
254 std::unique_ptr<LogEvent> event2 =
255 CreateBleScanStateChangedEvent(timestampNs + 1000, attributionUids2, attributionTags1,
256 BleScanStateChanged::ON, false, false, false);
257 mgr.onLogEvent(*event2);
258 EXPECT_EQ(1, listener->updates.size());
259 EXPECT_EQ(2000, listener->updates[0].mKey.getValues()[0].mValue.int_value);
260 EXPECT_EQ(BleScanStateChanged::ON, listener->updates[0].mState);
261 listener->updates.clear();
262
263 std::unique_ptr<LogEvent> event3 =
264 CreateBleScanStateChangedEvent(timestampNs + 2000, attributionUids2, attributionTags1,
265 BleScanStateChanged::RESET, false, false, false);
266 mgr.onLogEvent(*event3);
267 EXPECT_EQ(2, listener->updates.size());
268 EXPECT_EQ(BleScanStateChanged::OFF, listener->updates[0].mState);
269 EXPECT_EQ(BleScanStateChanged::OFF, listener->updates[1].mState);
270}
271
272/**
273 * Test StateManager's onLogEvent and StateListener's onStateChanged correctly
274 * updates listener for states without primary keys.
275 */
276TEST(StateTrackerTest, TestStateChangeNoPrimaryFields) {
277 sp<TestStateListener> listener1 = new TestStateListener();
278 StateManager mgr;
279 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener1);
280
281 // log event
282 std::unique_ptr<LogEvent> event = CreateScreenStateChangedEvent(
283 timestampNs, android::view::DisplayStateEnum::DISPLAY_STATE_ON);
284 mgr.onLogEvent(*event);
285
286 // check listener was updated
287 EXPECT_EQ(1, listener1->updates.size());
288 EXPECT_EQ(DEFAULT_DIMENSION_KEY, listener1->updates[0].mKey);
289 EXPECT_EQ(2, listener1->updates[0].mState);
290
291 // check StateTracker was updated by querying for state
292 HashableDimensionKey queryKey = DEFAULT_DIMENSION_KEY;
293 EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_ON,
294 getStateInt(mgr, util::SCREEN_STATE_CHANGED, queryKey));
295}
296
297/**
298 * Test StateManager's onLogEvent and StateListener's onStateChanged correctly
299 * updates listener for states with one primary key.
300 */
301TEST(StateTrackerTest, TestStateChangeOnePrimaryField) {
302 sp<TestStateListener> listener1 = new TestStateListener();
303 StateManager mgr;
304 mgr.registerListener(util::UID_PROCESS_STATE_CHANGED, listener1);
305
306 // log event
307 std::unique_ptr<LogEvent> event = CreateUidProcessStateChangedEvent(
308 timestampNs, 1000 /*uid*/, android::app::ProcessStateEnum::PROCESS_STATE_TOP);
309 mgr.onLogEvent(*event);
310
311 // check listener was updated
312 EXPECT_EQ(1, listener1->updates.size());
313 EXPECT_EQ(1000, listener1->updates[0].mKey.getValues()[0].mValue.int_value);
314 EXPECT_EQ(1002, listener1->updates[0].mState);
315
316 // check StateTracker was updated by querying for state
317 HashableDimensionKey queryKey;
318 getUidProcessKey(1000 /* uid */, &queryKey);
319 EXPECT_EQ(android::app::ProcessStateEnum::PROCESS_STATE_TOP,
320 getStateInt(mgr, util::UID_PROCESS_STATE_CHANGED, queryKey));
321}
322
323TEST(StateTrackerTest, TestStateChangePrimaryFieldAttrChain) {
324 sp<TestStateListener> listener1 = new TestStateListener();
325 StateManager mgr;
326 mgr.registerListener(util::WAKELOCK_STATE_CHANGED, listener1);
327
328 // Log event.
329 std::vector<int> attributionUids = {1001};
330 std::vector<string> attributionTags = {"tag1"};
331
332 std::unique_ptr<LogEvent> event = CreateAcquireWakelockEvent(timestampNs, attributionUids,
333 attributionTags, "wakelockName");
334 mgr.onLogEvent(*event);
335 EXPECT_EQ(1, mgr.getStateTrackersCount());
336 EXPECT_EQ(1, mgr.getListenersCount(util::WAKELOCK_STATE_CHANGED));
337
338 // Check listener was updated.
339 EXPECT_EQ(1, listener1->updates.size());
340 EXPECT_EQ(3, listener1->updates[0].mKey.getValues().size());
341 EXPECT_EQ(1001, listener1->updates[0].mKey.getValues()[0].mValue.int_value);
342 EXPECT_EQ(1, listener1->updates[0].mKey.getValues()[1].mValue.int_value);
343 EXPECT_EQ("wakelockName", listener1->updates[0].mKey.getValues()[2].mValue.str_value);
344 EXPECT_EQ(WakelockStateChanged::ACQUIRE, listener1->updates[0].mState);
345
346 // Check StateTracker was updated by querying for state.
347 HashableDimensionKey queryKey;
348 getPartialWakelockKey(1001 /* uid */, "wakelockName", &queryKey);
349 EXPECT_EQ(WakelockStateChanged::ACQUIRE,
350 getStateInt(mgr, util::WAKELOCK_STATE_CHANGED, queryKey));
351
352 // No state stored for this query key.
353 HashableDimensionKey queryKey2;
354 getPartialWakelockKey(1002 /* uid */, "tag1", &queryKey2);
355 EXPECT_EQ(WakelockStateChanged::RELEASE,
356 getStateInt(mgr, util::WAKELOCK_STATE_CHANGED, queryKey2));
357
358 // Partial query fails.
359 HashableDimensionKey queryKey3;
360 getPartialWakelockKey(1001 /* uid */, &queryKey3);
361 EXPECT_EQ(WakelockStateChanged::RELEASE,
362 getStateInt(mgr, util::WAKELOCK_STATE_CHANGED, queryKey3));
363}
364
365/**
366 * Test StateManager's onLogEvent and StateListener's onStateChanged correctly
367 * updates listener for states with multiple primary keys.
368 */
369TEST(StateTrackerTest, TestStateChangeMultiplePrimaryFields) {
370 sp<TestStateListener> listener1 = new TestStateListener();
371 StateManager mgr;
372 mgr.registerListener(util::OVERLAY_STATE_CHANGED, listener1);
373
374 // log event
375 std::unique_ptr<LogEvent> event = CreateOverlayStateChangedEvent(
376 timestampNs, 1000 /* uid */, "package1", true /*using_alert_window*/,
377 OverlayStateChanged::ENTERED);
378 mgr.onLogEvent(*event);
379
380 // check listener was updated
381 EXPECT_EQ(1, listener1->updates.size());
382 EXPECT_EQ(1000, listener1->updates[0].mKey.getValues()[0].mValue.int_value);
383 EXPECT_EQ(1, listener1->updates[0].mState);
384
385 // check StateTracker was updated by querying for state
386 HashableDimensionKey queryKey;
387 getOverlayKey(1000 /* uid */, "package1", &queryKey);
388 EXPECT_EQ(OverlayStateChanged::ENTERED,
389 getStateInt(mgr, util::OVERLAY_STATE_CHANGED, queryKey));
390}
391
392/**
393 * Test StateManager's onLogEvent and StateListener's onStateChanged
394 * when there is an error extracting state from log event. Listener is not
395 * updated of state change.
396 */
397TEST(StateTrackerTest, TestStateChangeEventError) {
398 sp<TestStateListener> listener1 = new TestStateListener();
399 StateManager mgr;
400 mgr.registerListener(util::OVERLAY_STATE_CHANGED, listener1);
401
402 // log event
403 std::shared_ptr<LogEvent> event1 =
404 buildIncorrectOverlayEvent(1000 /* uid */, "package1", 1 /* state */);
405 std::shared_ptr<LogEvent> event2 = buildOverlayEventBadStateType(1001 /* uid */, "package2");
406
407 // check listener was updated
408 mgr.onLogEvent(*event1);
409 EXPECT_EQ(0, listener1->updates.size());
410 mgr.onLogEvent(*event2);
411 EXPECT_EQ(0, listener1->updates.size());
412}
413
414TEST(StateTrackerTest, TestStateQuery) {
415 sp<TestStateListener> listener1 = new TestStateListener();
416 sp<TestStateListener> listener2 = new TestStateListener();
417 sp<TestStateListener> listener3 = new TestStateListener();
418 sp<TestStateListener> listener4 = new TestStateListener();
419 StateManager mgr;
420 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener1);
421 mgr.registerListener(util::UID_PROCESS_STATE_CHANGED, listener2);
422 mgr.registerListener(util::OVERLAY_STATE_CHANGED, listener3);
423 mgr.registerListener(util::WAKELOCK_STATE_CHANGED, listener4);
424
425 std::unique_ptr<LogEvent> event1 = CreateUidProcessStateChangedEvent(
426 timestampNs, 1000 /*uid*/,
427 android::app::ProcessStateEnum::PROCESS_STATE_TOP); // state value: 1002
428 std::unique_ptr<LogEvent> event2 = CreateUidProcessStateChangedEvent(
429 timestampNs + 1000, 1001 /*uid*/,
430 android::app::ProcessStateEnum::PROCESS_STATE_FOREGROUND_SERVICE); // state value:
431 // 1003
432 std::unique_ptr<LogEvent> event3 = CreateUidProcessStateChangedEvent(
433 timestampNs + 2000, 1002 /*uid*/,
434 android::app::ProcessStateEnum::PROCESS_STATE_PERSISTENT); // state value: 1000
435 std::unique_ptr<LogEvent> event4 = CreateUidProcessStateChangedEvent(
436 timestampNs + 3000, 1001 /*uid*/,
437 android::app::ProcessStateEnum::PROCESS_STATE_TOP); // state value: 1002
438 std::unique_ptr<LogEvent> event5 = CreateScreenStateChangedEvent(
439 timestampNs + 4000, android::view::DisplayStateEnum::DISPLAY_STATE_ON);
440 std::unique_ptr<LogEvent> event6 = CreateOverlayStateChangedEvent(
441 timestampNs + 5000, 1000 /*uid*/, "package1", true /*using_alert_window*/,
442 OverlayStateChanged::ENTERED);
443 std::unique_ptr<LogEvent> event7 = CreateOverlayStateChangedEvent(
444 timestampNs + 6000, 1000 /*uid*/, "package2", true /*using_alert_window*/,
445 OverlayStateChanged::EXITED);
446
447 std::vector<int> attributionUids = {1005};
448 std::vector<string> attributionTags = {"tag"};
449
450 std::unique_ptr<LogEvent> event8 = CreateAcquireWakelockEvent(
451 timestampNs + 7000, attributionUids, attributionTags, "wakelock1");
452 std::unique_ptr<LogEvent> event9 = CreateReleaseWakelockEvent(
453 timestampNs + 8000, attributionUids, attributionTags, "wakelock2");
454
455 mgr.onLogEvent(*event1);
456 mgr.onLogEvent(*event2);
457 mgr.onLogEvent(*event3);
458 mgr.onLogEvent(*event5);
459 mgr.onLogEvent(*event5);
460 mgr.onLogEvent(*event6);
461 mgr.onLogEvent(*event7);
462 mgr.onLogEvent(*event8);
463 mgr.onLogEvent(*event9);
464
465 // Query for UidProcessState of uid 1001
466 HashableDimensionKey queryKey1;
467 getUidProcessKey(1001, &queryKey1);
468 EXPECT_EQ(android::app::ProcessStateEnum::PROCESS_STATE_FOREGROUND_SERVICE,
469 getStateInt(mgr, util::UID_PROCESS_STATE_CHANGED, queryKey1));
470
471 // Query for UidProcessState of uid 1004 - not in state map
472 HashableDimensionKey queryKey2;
473 getUidProcessKey(1004, &queryKey2);
474 EXPECT_EQ(-1, getStateInt(mgr, util::UID_PROCESS_STATE_CHANGED,
475 queryKey2)); // default state
476
477 // Query for UidProcessState of uid 1001 - after change in state
478 mgr.onLogEvent(*event4);
479 EXPECT_EQ(android::app::ProcessStateEnum::PROCESS_STATE_TOP,
480 getStateInt(mgr, util::UID_PROCESS_STATE_CHANGED, queryKey1));
481
482 // Query for ScreenState
483 EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_ON,
484 getStateInt(mgr, util::SCREEN_STATE_CHANGED, DEFAULT_DIMENSION_KEY));
485
486 // Query for OverlayState of uid 1000, package name "package2"
487 HashableDimensionKey queryKey3;
488 getOverlayKey(1000, "package2", &queryKey3);
489 EXPECT_EQ(OverlayStateChanged::EXITED,
490 getStateInt(mgr, util::OVERLAY_STATE_CHANGED, queryKey3));
491
492 // Query for WakelockState of uid 1005, tag 2
493 HashableDimensionKey queryKey4;
494 getPartialWakelockKey(1005, "wakelock2", &queryKey4);
495 EXPECT_EQ(WakelockStateChanged::RELEASE,
496 getStateInt(mgr, util::WAKELOCK_STATE_CHANGED, queryKey4));
497
498 // Query for WakelockState of uid 1005, tag 1
499 HashableDimensionKey queryKey5;
500 getPartialWakelockKey(1005, "wakelock1", &queryKey5);
501 EXPECT_EQ(WakelockStateChanged::ACQUIRE,
502 getStateInt(mgr, util::WAKELOCK_STATE_CHANGED, queryKey5));
503}
tsaichristine10978642019-09-10 14:12:49 -0700504
505} // namespace statsd
506} // namespace os
507} // namespace android
508#else
509GTEST_LOG_(INFO) << "This test does nothing.\n";
510#endif