1 /* 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 */ 16 #include "state/StateTracker.h" 17 18 #include <gtest/gtest.h> 19 #include <private/android_filesystem_config.h> 20 21 #include "state/StateListener.h" 22 #include "state/StateManager.h" 23 #include "state/StateTracker.h" 24 #include "stats_event.h" 25 #include "tests/statsd_test_util.h" 26 27 #ifdef __ANDROID__ 28 29 namespace android { 30 namespace os { 31 namespace statsd { 32 33 const int32_t timestampNs = 1000; 34 35 /** 36 * Mock StateListener class for testing. 37 * Stores primary key and state pairs. 38 */ 39 class TestStateListener : public virtual StateListener { 40 public: 41 TestStateListener(){}; 42 43 virtual ~TestStateListener(){}; 44 45 struct Update { 46 Update(const HashableDimensionKey& key, int state) : mKey(key), mState(state){}; 47 HashableDimensionKey mKey; 48 int mState; 49 }; 50 51 std::vector<Update> updates; 52 53 void onStateChanged(const int64_t eventTimeNs, const int32_t atomId, 54 const HashableDimensionKey& primaryKey, const FieldValue& oldState, 55 const FieldValue& newState) { 56 updates.emplace_back(primaryKey, newState.mValue.int_value); 57 } 58 }; 59 60 int getStateInt(StateManager& mgr, int atomId, const HashableDimensionKey& queryKey) { 61 FieldValue output; 62 mgr.getStateValue(atomId, queryKey, &output); 63 return output.mValue.int_value; 64 } 65 66 // START: build event functions. 67 // Incorrect event - missing fields 68 std::unique_ptr<LogEvent> buildIncorrectOverlayEvent(int uid, const std::string& packageName, 69 int state) { 70 AStatsEvent* statsEvent = AStatsEvent_obtain(); 71 AStatsEvent_setAtomId(statsEvent, util::OVERLAY_STATE_CHANGED); 72 AStatsEvent_overwriteTimestamp(statsEvent, 1000); 73 74 AStatsEvent_writeInt32(statsEvent, uid); 75 AStatsEvent_writeString(statsEvent, packageName.c_str()); 76 // Missing field 3 - using_alert_window. 77 AStatsEvent_writeInt32(statsEvent, state); 78 79 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0); 80 parseStatsEventToLogEvent(statsEvent, logEvent.get()); 81 return logEvent; 82 } 83 84 // Incorrect event - exclusive state has wrong type 85 std::unique_ptr<LogEvent> buildOverlayEventBadStateType(int uid, const std::string& packageName) { 86 AStatsEvent* statsEvent = AStatsEvent_obtain(); 87 AStatsEvent_setAtomId(statsEvent, util::OVERLAY_STATE_CHANGED); 88 AStatsEvent_overwriteTimestamp(statsEvent, 1000); 89 90 AStatsEvent_writeInt32(statsEvent, uid); 91 AStatsEvent_writeString(statsEvent, packageName.c_str()); 92 AStatsEvent_writeInt32(statsEvent, true); // using_alert_window 93 AStatsEvent_writeString(statsEvent, "string"); // exclusive state: string instead of int 94 95 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0); 96 parseStatsEventToLogEvent(statsEvent, logEvent.get()); 97 return logEvent; 98 } 99 // END: build event functions. 100 101 TEST(StateListenerTest, TestStateListenerWeakPointer) { 102 sp<TestStateListener> listener = new TestStateListener(); 103 wp<TestStateListener> wListener = listener; 104 listener = nullptr; // let go of listener 105 EXPECT_TRUE(wListener.promote() == nullptr); 106 } 107 108 TEST(StateManagerTest, TestStateManagerGetInstance) { 109 sp<TestStateListener> listener1 = new TestStateListener(); 110 StateManager& mgr = StateManager::getInstance(); 111 mgr.clear(); 112 113 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener1); 114 EXPECT_EQ(1, mgr.getStateTrackersCount()); 115 EXPECT_EQ(1, StateManager::getInstance().getStateTrackersCount()); 116 } 117 118 TEST(StateManagerTest, TestOnLogEvent) { 119 sp<MockUidMap> uidMap = makeMockUidMapForPackage("com.android.systemui", {10111}); 120 sp<TestStateListener> listener1 = new TestStateListener(); 121 StateManager mgr; 122 mgr.updateLogSources(uidMap); 123 // Add StateTracker by registering a listener. 124 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener1); 125 126 // log event using AID_ROOT 127 std::unique_ptr<LogEvent> event = CreateScreenStateChangedEvent( 128 timestampNs, android::view::DisplayStateEnum::DISPLAY_STATE_ON); 129 mgr.onLogEvent(*event); 130 131 // check StateTracker was updated by querying for state 132 HashableDimensionKey queryKey = DEFAULT_DIMENSION_KEY; 133 EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_ON, 134 getStateInt(mgr, util::SCREEN_STATE_CHANGED, queryKey)); 135 136 // log event using mocked uid 137 event = CreateScreenStateChangedEvent( 138 timestampNs, android::view::DisplayStateEnum::DISPLAY_STATE_OFF, 10111); 139 mgr.onLogEvent(*event); 140 141 // check StateTracker was updated by querying for state 142 queryKey = DEFAULT_DIMENSION_KEY; 143 EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_OFF, 144 getStateInt(mgr, util::SCREEN_STATE_CHANGED, queryKey)); 145 146 // log event using non-whitelisted uid 147 event = CreateScreenStateChangedEvent(timestampNs, 148 android::view::DisplayStateEnum::DISPLAY_STATE_ON, 10112); 149 mgr.onLogEvent(*event); 150 151 // check StateTracker was NOT updated by querying for state 152 queryKey = DEFAULT_DIMENSION_KEY; 153 EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_OFF, 154 getStateInt(mgr, util::SCREEN_STATE_CHANGED, queryKey)); 155 156 // log event using AID_SYSTEM 157 event = CreateScreenStateChangedEvent( 158 timestampNs, android::view::DisplayStateEnum::DISPLAY_STATE_ON, AID_SYSTEM); 159 mgr.onLogEvent(*event); 160 161 // check StateTracker was updated by querying for state 162 queryKey = DEFAULT_DIMENSION_KEY; 163 EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_ON, 164 getStateInt(mgr, util::SCREEN_STATE_CHANGED, queryKey)); 165 } 166 167 /** 168 * Test registering listeners to StateTrackers 169 * 170 * - StateManager will create a new StateTracker if it doesn't already exist 171 * and then register the listener to the StateTracker. 172 * - If a listener is already registered to a StateTracker, it is not added again. 173 * - StateTrackers are only created for atoms that are state atoms. 174 */ 175 TEST(StateTrackerTest, TestRegisterListener) { 176 sp<TestStateListener> listener1 = new TestStateListener(); 177 sp<TestStateListener> listener2 = new TestStateListener(); 178 StateManager mgr; 179 180 // Register listener to non-existing StateTracker 181 EXPECT_EQ(0, mgr.getStateTrackersCount()); 182 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener1); 183 EXPECT_EQ(1, mgr.getStateTrackersCount()); 184 EXPECT_EQ(1, mgr.getListenersCount(util::SCREEN_STATE_CHANGED)); 185 186 // Register listener to existing StateTracker 187 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener2); 188 EXPECT_EQ(1, mgr.getStateTrackersCount()); 189 EXPECT_EQ(2, mgr.getListenersCount(util::SCREEN_STATE_CHANGED)); 190 191 // Register already registered listener to existing StateTracker 192 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener2); 193 EXPECT_EQ(1, mgr.getStateTrackersCount()); 194 EXPECT_EQ(2, mgr.getListenersCount(util::SCREEN_STATE_CHANGED)); 195 196 // Register listener to non-state atom 197 mgr.registerListener(util::BATTERY_LEVEL_CHANGED, listener2); 198 EXPECT_EQ(2, mgr.getStateTrackersCount()); 199 } 200 201 /** 202 * Test unregistering listeners from StateTrackers 203 * 204 * - StateManager will unregister listeners from a StateTracker only if the 205 * StateTracker exists and the listener is registered to the StateTracker. 206 * - Once all listeners are removed from a StateTracker, the StateTracker 207 * is also removed. 208 */ 209 TEST(StateTrackerTest, TestUnregisterListener) { 210 sp<TestStateListener> listener1 = new TestStateListener(); 211 sp<TestStateListener> listener2 = new TestStateListener(); 212 StateManager mgr; 213 214 // Unregister listener from non-existing StateTracker 215 EXPECT_EQ(0, mgr.getStateTrackersCount()); 216 mgr.unregisterListener(util::SCREEN_STATE_CHANGED, listener1); 217 EXPECT_EQ(0, mgr.getStateTrackersCount()); 218 EXPECT_EQ(-1, mgr.getListenersCount(util::SCREEN_STATE_CHANGED)); 219 220 // Unregister non-registered listener from existing StateTracker 221 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener1); 222 EXPECT_EQ(1, mgr.getStateTrackersCount()); 223 EXPECT_EQ(1, mgr.getListenersCount(util::SCREEN_STATE_CHANGED)); 224 mgr.unregisterListener(util::SCREEN_STATE_CHANGED, listener2); 225 EXPECT_EQ(1, mgr.getStateTrackersCount()); 226 EXPECT_EQ(1, mgr.getListenersCount(util::SCREEN_STATE_CHANGED)); 227 228 // Unregister second-to-last listener from StateTracker 229 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener2); 230 mgr.unregisterListener(util::SCREEN_STATE_CHANGED, listener1); 231 EXPECT_EQ(1, mgr.getStateTrackersCount()); 232 EXPECT_EQ(1, mgr.getListenersCount(util::SCREEN_STATE_CHANGED)); 233 234 // Unregister last listener from StateTracker 235 mgr.unregisterListener(util::SCREEN_STATE_CHANGED, listener2); 236 EXPECT_EQ(0, mgr.getStateTrackersCount()); 237 EXPECT_EQ(-1, mgr.getListenersCount(util::SCREEN_STATE_CHANGED)); 238 } 239 240 /** 241 * Test a binary state atom with nested counting. 242 * 243 * To go from an "ON" state to an "OFF" state with nested counting, we must see 244 * an equal number of "OFF" events as "ON" events. 245 * For example, ACQUIRE, ACQUIRE, RELEASE will still be in the ACQUIRE state. 246 * ACQUIRE, ACQUIRE, RELEASE, RELEASE will be in the RELEASE state. 247 */ 248 TEST(StateTrackerTest, TestStateChangeNested) { 249 sp<TestStateListener> listener = new TestStateListener(); 250 StateManager mgr; 251 mgr.registerListener(util::WAKELOCK_STATE_CHANGED, listener); 252 253 std::vector<int> attributionUids1 = {1000}; 254 std::vector<string> attributionTags1 = {"tag"}; 255 256 std::unique_ptr<LogEvent> event1 = CreateAcquireWakelockEvent(timestampNs, attributionUids1, 257 attributionTags1, "wakelockName"); 258 mgr.onLogEvent(*event1); 259 ASSERT_EQ(1, listener->updates.size()); 260 EXPECT_EQ(1000, listener->updates[0].mKey.getValues()[0].mValue.int_value); 261 EXPECT_EQ(1, listener->updates[0].mState); 262 listener->updates.clear(); 263 264 std::unique_ptr<LogEvent> event2 = CreateAcquireWakelockEvent( 265 timestampNs + 1000, attributionUids1, attributionTags1, "wakelockName"); 266 mgr.onLogEvent(*event2); 267 ASSERT_EQ(0, listener->updates.size()); 268 269 std::unique_ptr<LogEvent> event3 = CreateReleaseWakelockEvent( 270 timestampNs + 2000, attributionUids1, attributionTags1, "wakelockName"); 271 mgr.onLogEvent(*event3); 272 ASSERT_EQ(0, listener->updates.size()); 273 274 std::unique_ptr<LogEvent> event4 = CreateReleaseWakelockEvent( 275 timestampNs + 3000, attributionUids1, attributionTags1, "wakelockName"); 276 mgr.onLogEvent(*event4); 277 ASSERT_EQ(1, listener->updates.size()); 278 EXPECT_EQ(1000, listener->updates[0].mKey.getValues()[0].mValue.int_value); 279 EXPECT_EQ(0, listener->updates[0].mState); 280 } 281 282 /** 283 * Test a state atom with a reset state. 284 * 285 * If the reset state value is seen, every state in the map is set to the default 286 * state and every listener is notified. 287 */ 288 TEST(StateTrackerTest, TestStateChangeReset) { 289 sp<TestStateListener> listener = new TestStateListener(); 290 StateManager mgr; 291 mgr.registerListener(util::BLE_SCAN_STATE_CHANGED, listener); 292 293 std::vector<int> attributionUids1 = {1000}; 294 std::vector<string> attributionTags1 = {"tag1"}; 295 std::vector<int> attributionUids2 = {2000}; 296 297 std::unique_ptr<LogEvent> event1 = 298 CreateBleScanStateChangedEvent(timestampNs, attributionUids1, attributionTags1, 299 BleScanStateChanged::ON, false, false, false); 300 mgr.onLogEvent(*event1); 301 ASSERT_EQ(1, listener->updates.size()); 302 EXPECT_EQ(1000, listener->updates[0].mKey.getValues()[0].mValue.int_value); 303 EXPECT_EQ(BleScanStateChanged::ON, listener->updates[0].mState); 304 FieldValue stateFieldValue; 305 mgr.getStateValue(util::BLE_SCAN_STATE_CHANGED, listener->updates[0].mKey, &stateFieldValue); 306 EXPECT_EQ(BleScanStateChanged::ON, stateFieldValue.mValue.int_value); 307 listener->updates.clear(); 308 309 std::unique_ptr<LogEvent> event2 = 310 CreateBleScanStateChangedEvent(timestampNs + 1000, attributionUids2, attributionTags1, 311 BleScanStateChanged::ON, false, false, false); 312 mgr.onLogEvent(*event2); 313 ASSERT_EQ(1, listener->updates.size()); 314 EXPECT_EQ(2000, listener->updates[0].mKey.getValues()[0].mValue.int_value); 315 EXPECT_EQ(BleScanStateChanged::ON, listener->updates[0].mState); 316 mgr.getStateValue(util::BLE_SCAN_STATE_CHANGED, listener->updates[0].mKey, &stateFieldValue); 317 EXPECT_EQ(BleScanStateChanged::ON, stateFieldValue.mValue.int_value); 318 listener->updates.clear(); 319 320 std::unique_ptr<LogEvent> event3 = 321 CreateBleScanStateChangedEvent(timestampNs + 2000, attributionUids2, attributionTags1, 322 BleScanStateChanged::RESET, false, false, false); 323 mgr.onLogEvent(*event3); 324 ASSERT_EQ(2, listener->updates.size()); 325 for (const TestStateListener::Update& update : listener->updates) { 326 EXPECT_EQ(BleScanStateChanged::OFF, update.mState); 327 328 mgr.getStateValue(util::BLE_SCAN_STATE_CHANGED, update.mKey, &stateFieldValue); 329 EXPECT_EQ(BleScanStateChanged::OFF, stateFieldValue.mValue.int_value); 330 } 331 } 332 333 /** 334 * Test StateManager's onLogEvent and StateListener's onStateChanged correctly 335 * updates listener for states without primary keys. 336 */ 337 TEST(StateTrackerTest, TestStateChangeNoPrimaryFields) { 338 sp<TestStateListener> listener1 = new TestStateListener(); 339 StateManager mgr; 340 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener1); 341 342 // log event 343 std::unique_ptr<LogEvent> event = CreateScreenStateChangedEvent( 344 timestampNs, android::view::DisplayStateEnum::DISPLAY_STATE_ON); 345 mgr.onLogEvent(*event); 346 347 // check listener was updated 348 ASSERT_EQ(1, listener1->updates.size()); 349 EXPECT_EQ(DEFAULT_DIMENSION_KEY, listener1->updates[0].mKey); 350 EXPECT_EQ(2, listener1->updates[0].mState); 351 352 // check StateTracker was updated by querying for state 353 HashableDimensionKey queryKey = DEFAULT_DIMENSION_KEY; 354 EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_ON, 355 getStateInt(mgr, util::SCREEN_STATE_CHANGED, queryKey)); 356 } 357 358 /** 359 * Test StateManager's onLogEvent and StateListener's onStateChanged correctly 360 * updates listener for states with one primary key. 361 */ 362 TEST(StateTrackerTest, TestStateChangeOnePrimaryField) { 363 sp<TestStateListener> listener1 = new TestStateListener(); 364 StateManager mgr; 365 mgr.registerListener(util::UID_PROCESS_STATE_CHANGED, listener1); 366 367 // log event 368 std::unique_ptr<LogEvent> event = CreateUidProcessStateChangedEvent( 369 timestampNs, 1000 /*uid*/, android::app::ProcessStateEnum::PROCESS_STATE_TOP); 370 mgr.onLogEvent(*event); 371 372 // check listener was updated 373 ASSERT_EQ(1, listener1->updates.size()); 374 EXPECT_EQ(1000, listener1->updates[0].mKey.getValues()[0].mValue.int_value); 375 EXPECT_EQ(1002, listener1->updates[0].mState); 376 377 // check StateTracker was updated by querying for state 378 HashableDimensionKey queryKey; 379 getUidProcessKey(1000 /* uid */, &queryKey); 380 EXPECT_EQ(android::app::ProcessStateEnum::PROCESS_STATE_TOP, 381 getStateInt(mgr, util::UID_PROCESS_STATE_CHANGED, queryKey)); 382 } 383 384 TEST(StateTrackerTest, TestStateChangePrimaryFieldAttrChain) { 385 sp<TestStateListener> listener1 = new TestStateListener(); 386 StateManager mgr; 387 mgr.registerListener(util::WAKELOCK_STATE_CHANGED, listener1); 388 389 // Log event. 390 std::vector<int> attributionUids = {1001}; 391 std::vector<string> attributionTags = {"tag1"}; 392 393 std::unique_ptr<LogEvent> event = CreateAcquireWakelockEvent(timestampNs, attributionUids, 394 attributionTags, "wakelockName"); 395 mgr.onLogEvent(*event); 396 EXPECT_EQ(1, mgr.getStateTrackersCount()); 397 EXPECT_EQ(1, mgr.getListenersCount(util::WAKELOCK_STATE_CHANGED)); 398 399 // Check listener was updated. 400 ASSERT_EQ(1, listener1->updates.size()); 401 ASSERT_EQ(3, listener1->updates[0].mKey.getValues().size()); 402 EXPECT_EQ(1001, listener1->updates[0].mKey.getValues()[0].mValue.int_value); 403 EXPECT_EQ(1, listener1->updates[0].mKey.getValues()[1].mValue.int_value); 404 EXPECT_EQ("wakelockName", listener1->updates[0].mKey.getValues()[2].mValue.str_value); 405 EXPECT_EQ(WakelockStateChanged::ACQUIRE, listener1->updates[0].mState); 406 407 // Check StateTracker was updated by querying for state. 408 HashableDimensionKey queryKey; 409 getPartialWakelockKey(1001 /* uid */, "wakelockName", &queryKey); 410 EXPECT_EQ(WakelockStateChanged::ACQUIRE, 411 getStateInt(mgr, util::WAKELOCK_STATE_CHANGED, queryKey)); 412 413 // No state stored for this query key. 414 HashableDimensionKey queryKey2; 415 getPartialWakelockKey(1002 /* uid */, "tag1", &queryKey2); 416 EXPECT_EQ(-1 /*StateTracker::kStateUnknown*/, 417 getStateInt(mgr, util::WAKELOCK_STATE_CHANGED, queryKey2)); 418 419 // Partial query fails. 420 HashableDimensionKey queryKey3; 421 getPartialWakelockKey(1001 /* uid */, &queryKey3); 422 EXPECT_EQ(-1 /*StateTracker::kStateUnknown*/, 423 getStateInt(mgr, util::WAKELOCK_STATE_CHANGED, queryKey3)); 424 } 425 426 /** 427 * Test StateManager's onLogEvent and StateListener's onStateChanged correctly 428 * updates listener for states with multiple primary keys. 429 */ 430 TEST(StateTrackerTest, TestStateChangeMultiplePrimaryFields) { 431 sp<TestStateListener> listener1 = new TestStateListener(); 432 StateManager mgr; 433 mgr.registerListener(util::OVERLAY_STATE_CHANGED, listener1); 434 435 // log event 436 std::unique_ptr<LogEvent> event = CreateOverlayStateChangedEvent( 437 timestampNs, 1000 /* uid */, "package1", true /*using_alert_window*/, 438 OverlayStateChanged::ENTERED); 439 mgr.onLogEvent(*event); 440 441 // check listener was updated 442 ASSERT_EQ(1, listener1->updates.size()); 443 EXPECT_EQ(1000, listener1->updates[0].mKey.getValues()[0].mValue.int_value); 444 EXPECT_EQ(1, listener1->updates[0].mState); 445 446 // check StateTracker was updated by querying for state 447 HashableDimensionKey queryKey; 448 getOverlayKey(1000 /* uid */, "package1", &queryKey); 449 EXPECT_EQ(OverlayStateChanged::ENTERED, 450 getStateInt(mgr, util::OVERLAY_STATE_CHANGED, queryKey)); 451 } 452 453 /** 454 * Test StateManager's onLogEvent and StateListener's onStateChanged 455 * when there is an error extracting state from log event. Listener is not 456 * updated of state change. 457 */ 458 TEST(StateTrackerTest, TestStateChangeEventError) { 459 sp<TestStateListener> listener1 = new TestStateListener(); 460 StateManager mgr; 461 mgr.registerListener(util::OVERLAY_STATE_CHANGED, listener1); 462 463 // log event 464 std::shared_ptr<LogEvent> event1 = 465 buildIncorrectOverlayEvent(1000 /* uid */, "package1", 1 /* state */); 466 std::shared_ptr<LogEvent> event2 = buildOverlayEventBadStateType(1001 /* uid */, "package2"); 467 468 // check listener was updated 469 mgr.onLogEvent(*event1); 470 ASSERT_EQ(0, listener1->updates.size()); 471 mgr.onLogEvent(*event2); 472 ASSERT_EQ(0, listener1->updates.size()); 473 } 474 475 TEST(StateTrackerTest, TestStateQuery) { 476 sp<TestStateListener> listener1 = new TestStateListener(); 477 sp<TestStateListener> listener2 = new TestStateListener(); 478 sp<TestStateListener> listener3 = new TestStateListener(); 479 sp<TestStateListener> listener4 = new TestStateListener(); 480 StateManager mgr; 481 mgr.registerListener(util::SCREEN_STATE_CHANGED, listener1); 482 mgr.registerListener(util::UID_PROCESS_STATE_CHANGED, listener2); 483 mgr.registerListener(util::OVERLAY_STATE_CHANGED, listener3); 484 mgr.registerListener(util::WAKELOCK_STATE_CHANGED, listener4); 485 486 std::unique_ptr<LogEvent> event1 = CreateUidProcessStateChangedEvent( 487 timestampNs, 1000 /*uid*/, 488 android::app::ProcessStateEnum::PROCESS_STATE_TOP); // state value: 1002 489 std::unique_ptr<LogEvent> event2 = CreateUidProcessStateChangedEvent( 490 timestampNs + 1000, 1001 /*uid*/, 491 android::app::ProcessStateEnum::PROCESS_STATE_FOREGROUND_SERVICE); // state value: 492 // 1003 493 std::unique_ptr<LogEvent> event3 = CreateUidProcessStateChangedEvent( 494 timestampNs + 2000, 1002 /*uid*/, 495 android::app::ProcessStateEnum::PROCESS_STATE_PERSISTENT); // state value: 1000 496 std::unique_ptr<LogEvent> event4 = CreateUidProcessStateChangedEvent( 497 timestampNs + 3000, 1001 /*uid*/, 498 android::app::ProcessStateEnum::PROCESS_STATE_TOP); // state value: 1002 499 std::unique_ptr<LogEvent> event5 = CreateScreenStateChangedEvent( 500 timestampNs + 4000, android::view::DisplayStateEnum::DISPLAY_STATE_ON); 501 std::unique_ptr<LogEvent> event6 = CreateOverlayStateChangedEvent( 502 timestampNs + 5000, 1000 /*uid*/, "package1", true /*using_alert_window*/, 503 OverlayStateChanged::ENTERED); 504 std::unique_ptr<LogEvent> event7 = CreateOverlayStateChangedEvent( 505 timestampNs + 6000, 1000 /*uid*/, "package2", true /*using_alert_window*/, 506 OverlayStateChanged::EXITED); 507 508 std::vector<int> attributionUids = {1005}; 509 std::vector<string> attributionTags = {"tag"}; 510 511 std::unique_ptr<LogEvent> event8 = CreateAcquireWakelockEvent( 512 timestampNs + 7000, attributionUids, attributionTags, "wakelock1"); 513 std::unique_ptr<LogEvent> event9 = CreateReleaseWakelockEvent( 514 timestampNs + 8000, attributionUids, attributionTags, "wakelock2"); 515 516 mgr.onLogEvent(*event1); 517 mgr.onLogEvent(*event2); 518 mgr.onLogEvent(*event3); 519 mgr.onLogEvent(*event5); 520 mgr.onLogEvent(*event5); 521 mgr.onLogEvent(*event6); 522 mgr.onLogEvent(*event7); 523 mgr.onLogEvent(*event8); 524 mgr.onLogEvent(*event9); 525 526 // Query for UidProcessState of uid 1001 527 HashableDimensionKey queryKey1; 528 getUidProcessKey(1001, &queryKey1); 529 EXPECT_EQ(android::app::ProcessStateEnum::PROCESS_STATE_FOREGROUND_SERVICE, 530 getStateInt(mgr, util::UID_PROCESS_STATE_CHANGED, queryKey1)); 531 532 // Query for UidProcessState of uid 1004 - not in state map 533 HashableDimensionKey queryKey2; 534 getUidProcessKey(1004, &queryKey2); 535 EXPECT_EQ(-1, getStateInt(mgr, util::UID_PROCESS_STATE_CHANGED, 536 queryKey2)); // default state 537 538 // Query for UidProcessState of uid 1001 - after change in state 539 mgr.onLogEvent(*event4); 540 EXPECT_EQ(android::app::ProcessStateEnum::PROCESS_STATE_TOP, 541 getStateInt(mgr, util::UID_PROCESS_STATE_CHANGED, queryKey1)); 542 543 // Query for ScreenState 544 EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_ON, 545 getStateInt(mgr, util::SCREEN_STATE_CHANGED, DEFAULT_DIMENSION_KEY)); 546 547 // Query for OverlayState of uid 1000, package name "package2" 548 HashableDimensionKey queryKey3; 549 getOverlayKey(1000, "package2", &queryKey3); 550 EXPECT_EQ(OverlayStateChanged::EXITED, 551 getStateInt(mgr, util::OVERLAY_STATE_CHANGED, queryKey3)); 552 553 // Query for WakelockState of uid 1005, tag 2 554 HashableDimensionKey queryKey4; 555 getPartialWakelockKey(1005, "wakelock2", &queryKey4); 556 EXPECT_EQ(WakelockStateChanged::RELEASE, 557 getStateInt(mgr, util::WAKELOCK_STATE_CHANGED, queryKey4)); 558 559 // Query for WakelockState of uid 1005, tag 1 560 HashableDimensionKey queryKey5; 561 getPartialWakelockKey(1005, "wakelock1", &queryKey5); 562 EXPECT_EQ(WakelockStateChanged::ACQUIRE, 563 getStateInt(mgr, util::WAKELOCK_STATE_CHANGED, queryKey5)); 564 } 565 566 } // namespace statsd 567 } // namespace os 568 } // namespace android 569 #else 570 GTEST_LOG_(INFO) << "This test does nothing.\n"; 571 #endif 572