1 /* 2 * Copyright (C) 2017 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 package android.cts.statsd.atom; 17 18 import android.os.BatteryPluggedStateEnum; // From os/enums.proto 19 import android.os.BatteryStatusEnum; // From os/enums.proto 20 import android.os.TemperatureTypeEnum; // From os/enums.proto 21 import android.platform.test.annotations.RestrictedBuildTest; 22 import android.server.DeviceIdleModeEnum; // From server/enums.proto 23 import android.view.DisplayStateEnum; // From view/enums.proto 24 25 import com.android.internal.os.StatsdConfigProto.Alert; 26 import com.android.internal.os.StatsdConfigProto.CountMetric; 27 import com.android.internal.os.StatsdConfigProto.DurationMetric; 28 import com.android.internal.os.StatsdConfigProto.FieldFilter; 29 import com.android.internal.os.StatsdConfigProto.FieldMatcher; 30 import com.android.internal.os.StatsdConfigProto.GaugeMetric; 31 import com.android.internal.os.StatsdConfigProto.IncidentdDetails; 32 import com.android.internal.os.StatsdConfigProto.StatsdConfig; 33 import com.android.internal.os.StatsdConfigProto.Subscription; 34 import com.android.internal.os.StatsdConfigProto.TimeUnit; 35 import com.android.internal.os.StatsdConfigProto.ValueMetric; 36 import com.android.os.AtomsProto.AppBreadcrumbReported; 37 import com.android.os.AtomsProto.Atom; 38 import com.android.os.AtomsProto.BatterySaverModeStateChanged; 39 import com.android.os.AtomsProto.ChargingStateChanged; 40 import com.android.os.AtomsProto.CpuTimePerFreq; 41 import com.android.os.AtomsProto.DeviceIdleModeStateChanged; 42 import com.android.os.AtomsProto.FullBatteryCapacity; 43 import com.android.os.AtomsProto.KernelWakelock; 44 import com.android.os.AtomsProto.PluggedStateChanged; 45 import com.android.os.AtomsProto.RemainingBatteryCapacity; 46 import com.android.os.AtomsProto.ScreenStateChanged; 47 import com.android.os.AtomsProto.SubsystemSleepState; 48 import com.android.os.AtomsProto.Temperature; 49 import com.android.os.StatsLog.EventMetricData; 50 import com.android.tradefed.log.LogUtil.CLog; 51 52 import java.util.Arrays; 53 import java.util.HashSet; 54 import java.util.List; 55 import java.util.Set; 56 57 /** 58 * Statsd atom tests that are done via adb (hostside). 59 */ 60 public class HostAtomTests extends AtomTestCase { 61 62 private static final String TAG = "Statsd.HostAtomTests"; 63 64 private static final String FEATURE_BLUETOOTH = "android.hardware.bluetooth"; 65 private static final String FEATURE_WIFI = "android.hardware.wifi"; 66 private static final String FEATURE_TELEPHONY = "android.hardware.telephony"; 67 private static final String FEATURE_WATCH = "android.hardware.type.watch"; 68 69 @Override 70 protected void setUp() throws Exception { 71 super.setUp(); 72 } 73 74 public void testScreenStateChangedAtom() throws Exception { 75 if (statsdDisabled()) { 76 return; 77 } 78 // Setup, make sure the screen is off. 79 turnScreenOff(); 80 Thread.sleep(WAIT_TIME_LONG); 81 82 final int atomTag = Atom.SCREEN_STATE_CHANGED_FIELD_NUMBER; 83 84 Set<Integer> screenOnStates = new HashSet<>( 85 Arrays.asList(DisplayStateEnum.DISPLAY_STATE_ON_VALUE, 86 DisplayStateEnum.DISPLAY_STATE_ON_SUSPEND_VALUE, 87 DisplayStateEnum.DISPLAY_STATE_VR_VALUE)); 88 Set<Integer> screenOffStates = new HashSet<>( 89 Arrays.asList(DisplayStateEnum.DISPLAY_STATE_OFF_VALUE, 90 DisplayStateEnum.DISPLAY_STATE_DOZE_VALUE, 91 DisplayStateEnum.DISPLAY_STATE_DOZE_SUSPEND_VALUE, 92 DisplayStateEnum.DISPLAY_STATE_UNKNOWN_VALUE)); 93 94 // Add state sets to the list in order. 95 List<Set<Integer>> stateSet = Arrays.asList(screenOnStates, screenOffStates); 96 97 createAndUploadConfig(atomTag); 98 Thread.sleep(WAIT_TIME_SHORT); 99 100 // Trigger events in same order. 101 turnScreenOn(); 102 Thread.sleep(WAIT_TIME_LONG); 103 turnScreenOff(); 104 Thread.sleep(WAIT_TIME_LONG); 105 106 // Sorted list of events in order in which they occurred. 107 List<EventMetricData> data = getEventMetricDataList(); 108 // reset screen to on 109 turnScreenOn(); 110 111 // Assert that the events happened in the expected order. 112 assertStatesOccurred(stateSet, data, WAIT_TIME_LONG, 113 atom -> atom.getScreenStateChanged().getState().getNumber()); 114 } 115 116 public void testChargingStateChangedAtom() throws Exception { 117 if (statsdDisabled()) { 118 return; 119 } 120 // Setup, set charging state to full. 121 setChargingState(5); 122 Thread.sleep(WAIT_TIME_SHORT); 123 124 final int atomTag = Atom.CHARGING_STATE_CHANGED_FIELD_NUMBER; 125 126 Set<Integer> batteryUnknownStates = new HashSet<>( 127 Arrays.asList(BatteryStatusEnum.BATTERY_STATUS_UNKNOWN_VALUE)); 128 Set<Integer> batteryChargingStates = new HashSet<>( 129 Arrays.asList(BatteryStatusEnum.BATTERY_STATUS_CHARGING_VALUE)); 130 Set<Integer> batteryDischargingStates = new HashSet<>( 131 Arrays.asList(BatteryStatusEnum.BATTERY_STATUS_DISCHARGING_VALUE)); 132 Set<Integer> batteryNotChargingStates = new HashSet<>( 133 Arrays.asList(BatteryStatusEnum.BATTERY_STATUS_NOT_CHARGING_VALUE)); 134 Set<Integer> batteryFullStates = new HashSet<>( 135 Arrays.asList(BatteryStatusEnum.BATTERY_STATUS_FULL_VALUE)); 136 137 // Add state sets to the list in order. 138 List<Set<Integer>> stateSet = Arrays.asList(batteryUnknownStates, batteryChargingStates, 139 batteryDischargingStates, batteryNotChargingStates, batteryFullStates); 140 141 createAndUploadConfig(atomTag); 142 Thread.sleep(WAIT_TIME_SHORT); 143 144 // Trigger events in same order. 145 setChargingState(1); 146 Thread.sleep(WAIT_TIME_SHORT); 147 setChargingState(2); 148 Thread.sleep(WAIT_TIME_SHORT); 149 setChargingState(3); 150 Thread.sleep(WAIT_TIME_SHORT); 151 setChargingState(4); 152 Thread.sleep(WAIT_TIME_SHORT); 153 setChargingState(5); 154 Thread.sleep(WAIT_TIME_SHORT); 155 156 // Sorted list of events in order in which they occurred. 157 List<EventMetricData> data = getEventMetricDataList(); 158 159 // Unfreeze battery state after test 160 resetBatteryStatus(); 161 Thread.sleep(WAIT_TIME_SHORT); 162 163 // Assert that the events happened in the expected order. 164 assertStatesOccurred(stateSet, data, WAIT_TIME_SHORT, 165 atom -> atom.getChargingStateChanged().getState().getNumber()); 166 } 167 168 public void testPluggedStateChangedAtom() throws Exception { 169 if (statsdDisabled()) { 170 return; 171 } 172 // Setup, unplug device. 173 unplugDevice(); 174 Thread.sleep(WAIT_TIME_SHORT); 175 176 final int atomTag = Atom.PLUGGED_STATE_CHANGED_FIELD_NUMBER; 177 178 Set<Integer> unpluggedStates = new HashSet<>( 179 Arrays.asList(BatteryPluggedStateEnum.BATTERY_PLUGGED_NONE_VALUE)); 180 Set<Integer> acStates = new HashSet<>( 181 Arrays.asList(BatteryPluggedStateEnum.BATTERY_PLUGGED_AC_VALUE)); 182 Set<Integer> usbStates = new HashSet<>( 183 Arrays.asList(BatteryPluggedStateEnum.BATTERY_PLUGGED_USB_VALUE)); 184 Set<Integer> wirelessStates = new HashSet<>( 185 Arrays.asList(BatteryPluggedStateEnum.BATTERY_PLUGGED_WIRELESS_VALUE)); 186 187 // Add state sets to the list in order. 188 List<Set<Integer>> stateSet = Arrays.asList(acStates, unpluggedStates, usbStates, 189 unpluggedStates, wirelessStates, unpluggedStates); 190 191 createAndUploadConfig(atomTag); 192 Thread.sleep(WAIT_TIME_SHORT); 193 194 // Trigger events in same order. 195 plugInAc(); 196 Thread.sleep(WAIT_TIME_SHORT); 197 unplugDevice(); 198 Thread.sleep(WAIT_TIME_SHORT); 199 plugInUsb(); 200 Thread.sleep(WAIT_TIME_SHORT); 201 unplugDevice(); 202 Thread.sleep(WAIT_TIME_SHORT); 203 plugInWireless(); 204 Thread.sleep(WAIT_TIME_SHORT); 205 unplugDevice(); 206 Thread.sleep(WAIT_TIME_SHORT); 207 208 // Sorted list of events in order in which they occurred. 209 List<EventMetricData> data = getEventMetricDataList(); 210 211 // Unfreeze battery state after test 212 resetBatteryStatus(); 213 Thread.sleep(WAIT_TIME_SHORT); 214 215 // Assert that the events happened in the expected order. 216 assertStatesOccurred(stateSet, data, WAIT_TIME_SHORT, 217 atom -> atom.getPluggedStateChanged().getState().getNumber()); 218 } 219 220 public void testBatteryLevelChangedAtom() throws Exception { 221 if (statsdDisabled()) { 222 return; 223 } 224 // Setup, set battery level to full. 225 setBatteryLevel(100); 226 Thread.sleep(WAIT_TIME_SHORT); 227 228 final int atomTag = Atom.BATTERY_LEVEL_CHANGED_FIELD_NUMBER; 229 230 Set<Integer> batteryDead = new HashSet<>(Arrays.asList(0)); 231 Set<Integer> battery25p = new HashSet<>(Arrays.asList(25)); 232 Set<Integer> battery50p = new HashSet<>(Arrays.asList(50)); 233 Set<Integer> battery75p = new HashSet<>(Arrays.asList(75)); 234 Set<Integer> batteryFull = new HashSet<>(Arrays.asList(100)); 235 236 // Add state sets to the list in order. 237 List<Set<Integer>> stateSet = Arrays.asList(batteryDead, battery25p, battery50p, 238 battery75p, batteryFull); 239 240 createAndUploadConfig(atomTag); 241 Thread.sleep(WAIT_TIME_SHORT); 242 243 // Trigger events in same order. 244 setBatteryLevel(0); 245 Thread.sleep(WAIT_TIME_SHORT); 246 setBatteryLevel(25); 247 Thread.sleep(WAIT_TIME_SHORT); 248 setBatteryLevel(50); 249 Thread.sleep(WAIT_TIME_SHORT); 250 setBatteryLevel(75); 251 Thread.sleep(WAIT_TIME_SHORT); 252 setBatteryLevel(100); 253 Thread.sleep(WAIT_TIME_SHORT); 254 255 // Sorted list of events in order in which they occurred. 256 List<EventMetricData> data = getEventMetricDataList(); 257 258 // Unfreeze battery state after test 259 resetBatteryStatus(); 260 Thread.sleep(WAIT_TIME_SHORT); 261 262 // Assert that the events happened in the expected order. 263 assertStatesOccurred(stateSet, data, WAIT_TIME_SHORT, 264 atom -> atom.getBatteryLevelChanged().getBatteryLevel()); 265 } 266 267 public void testDeviceIdleModeStateChangedAtom() throws Exception { 268 if (statsdDisabled()) { 269 return; 270 } 271 // Setup, leave doze mode. 272 leaveDozeMode(); 273 Thread.sleep(WAIT_TIME_SHORT); 274 275 final int atomTag = Atom.DEVICE_IDLE_MODE_STATE_CHANGED_FIELD_NUMBER; 276 277 Set<Integer> dozeOff = new HashSet<>( 278 Arrays.asList(DeviceIdleModeEnum.DEVICE_IDLE_MODE_OFF_VALUE)); 279 Set<Integer> dozeLight = new HashSet<>( 280 Arrays.asList(DeviceIdleModeEnum.DEVICE_IDLE_MODE_LIGHT_VALUE)); 281 Set<Integer> dozeDeep = new HashSet<>( 282 Arrays.asList(DeviceIdleModeEnum.DEVICE_IDLE_MODE_DEEP_VALUE)); 283 284 // Add state sets to the list in order. 285 List<Set<Integer>> stateSet = Arrays.asList(dozeLight, dozeDeep, dozeOff); 286 287 createAndUploadConfig(atomTag); 288 Thread.sleep(WAIT_TIME_SHORT); 289 290 // Trigger events in same order. 291 enterDozeModeLight(); 292 Thread.sleep(WAIT_TIME_SHORT); 293 enterDozeModeDeep(); 294 Thread.sleep(WAIT_TIME_SHORT); 295 leaveDozeMode(); 296 Thread.sleep(WAIT_TIME_SHORT); 297 298 // Sorted list of events in order in which they occurred. 299 List<EventMetricData> data = getEventMetricDataList();; 300 301 // Assert that the events happened in the expected order. 302 assertStatesOccurred(stateSet, data, WAIT_TIME_SHORT, 303 atom -> atom.getDeviceIdleModeStateChanged().getState().getNumber()); 304 } 305 306 public void testBatterySaverModeStateChangedAtom() throws Exception { 307 if (statsdDisabled()) { 308 return; 309 } 310 // Setup, turn off battery saver. 311 turnBatterySaverOff(); 312 Thread.sleep(WAIT_TIME_SHORT); 313 314 final int atomTag = Atom.BATTERY_SAVER_MODE_STATE_CHANGED_FIELD_NUMBER; 315 316 Set<Integer> batterySaverOn = new HashSet<>( 317 Arrays.asList(BatterySaverModeStateChanged.State.ON_VALUE)); 318 Set<Integer> batterySaverOff = new HashSet<>( 319 Arrays.asList(BatterySaverModeStateChanged.State.OFF_VALUE)); 320 321 // Add state sets to the list in order. 322 List<Set<Integer>> stateSet = Arrays.asList(batterySaverOn, batterySaverOff); 323 324 createAndUploadConfig(atomTag); 325 Thread.sleep(WAIT_TIME_SHORT); 326 327 // Trigger events in same order. 328 turnBatterySaverOn(); 329 Thread.sleep(WAIT_TIME_LONG); 330 turnBatterySaverOff(); 331 Thread.sleep(WAIT_TIME_LONG); 332 333 // Sorted list of events in order in which they occurred. 334 List<EventMetricData> data = getEventMetricDataList(); 335 336 // Assert that the events happened in the expected order. 337 assertStatesOccurred(stateSet, data, WAIT_TIME_LONG, 338 atom -> atom.getBatterySaverModeStateChanged().getState().getNumber()); 339 } 340 341 @RestrictedBuildTest 342 public void testRemainingBatteryCapacity() throws Exception { 343 if (statsdDisabled()) { 344 return; 345 } 346 if (!hasFeature(FEATURE_WATCH, false)) return; 347 StatsdConfig.Builder config = getPulledConfig(); 348 FieldMatcher.Builder dimension = FieldMatcher.newBuilder() 349 .setField(Atom.REMAINING_BATTERY_CAPACITY_FIELD_NUMBER) 350 .addChild(FieldMatcher.newBuilder() 351 .setField(RemainingBatteryCapacity.CHARGE_UAH_FIELD_NUMBER)); 352 addGaugeAtom(config, Atom.REMAINING_BATTERY_CAPACITY_FIELD_NUMBER, dimension); 353 354 turnScreenOff(); 355 356 uploadConfig(config); 357 358 Thread.sleep(WAIT_TIME_LONG); 359 turnScreenOn(); 360 Thread.sleep(WAIT_TIME_LONG); 361 362 List<Atom> data = getGaugeMetricDataList(); 363 364 assertTrue(data.size() > 0); 365 Atom atom = data.get(0); 366 assertTrue(atom.getRemainingBatteryCapacity().hasChargeUAh()); 367 assertTrue(atom.getRemainingBatteryCapacity().getChargeUAh() > 0); 368 } 369 370 @RestrictedBuildTest 371 public void testFullBatteryCapacity() throws Exception { 372 if (statsdDisabled()) { 373 return; 374 } 375 if (!hasFeature(FEATURE_WATCH, false)) return; 376 StatsdConfig.Builder config = getPulledConfig(); 377 FieldMatcher.Builder dimension = FieldMatcher.newBuilder() 378 .setField(Atom.FULL_BATTERY_CAPACITY_FIELD_NUMBER) 379 .addChild(FieldMatcher.newBuilder() 380 .setField(FullBatteryCapacity.CAPACITY_UAH_FIELD_NUMBER)); 381 addGaugeAtom(config, Atom.FULL_BATTERY_CAPACITY_FIELD_NUMBER, dimension); 382 383 turnScreenOff(); 384 385 uploadConfig(config); 386 387 Thread.sleep(WAIT_TIME_LONG); 388 turnScreenOn(); 389 Thread.sleep(WAIT_TIME_LONG); 390 391 List<Atom> data = getGaugeMetricDataList(); 392 393 assertTrue(data.size() > 0); 394 Atom atom = data.get(0); 395 assertTrue(atom.getFullBatteryCapacity().hasCapacityUAh()); 396 assertTrue(atom.getFullBatteryCapacity().getCapacityUAh() > 0); 397 } 398 399 @RestrictedBuildTest 400 public void testTemperature() throws Exception { 401 if (statsdDisabled()) { 402 return; 403 } 404 if (!hasFeature(FEATURE_WATCH, false)) return; 405 StatsdConfig.Builder config = getPulledConfig(); 406 FieldMatcher.Builder dimension = FieldMatcher.newBuilder() 407 .setField(Atom.TEMPERATURE_FIELD_NUMBER) 408 .addChild(FieldMatcher.newBuilder() 409 .setField(Temperature.SENSOR_LOCATION_FIELD_NUMBER)) 410 .addChild(FieldMatcher.newBuilder() 411 .setField(Temperature.SENSOR_NAME_FIELD_NUMBER)); 412 addGaugeAtom(config, Atom.TEMPERATURE_FIELD_NUMBER, dimension); 413 414 turnScreenOff(); 415 416 uploadConfig(config); 417 418 Thread.sleep(WAIT_TIME_LONG); 419 turnScreenOn(); 420 Thread.sleep(WAIT_TIME_LONG); 421 422 List<Atom> data = getGaugeMetricDataList(); 423 424 assertTrue(data.size() >= TemperatureTypeEnum.values().length - 1); 425 for (int i = 0; i < data.size(); i++) { 426 Temperature temp = data.get(i).getTemperature(); 427 assertTrue("Temperature atom " + i + " has no type", 428 temp.hasSensorLocation()); 429 assertTrue("Temperature reported atom " + i + " has no temperature", 430 temp.hasTemperatureDC()); 431 assertTrue("Temperature reported atom " + i + " has an unreasonably low temperature:" + 432 + temp.getTemperatureDC(), temp.getTemperatureDC() > 0); 433 assertTrue("Temperature reported atom " + i + " has an unreasonably high temperature:" + 434 + temp.getTemperatureDC(), temp.getTemperatureDC() < 800); 435 436 } 437 } 438 439 public void testKernelWakelock() throws Exception { 440 if (statsdDisabled()) { 441 return; 442 } 443 StatsdConfig.Builder config = getPulledConfig(); 444 FieldMatcher.Builder dimension = FieldMatcher.newBuilder() 445 .setField(Atom.KERNEL_WAKELOCK_FIELD_NUMBER) 446 .addChild(FieldMatcher.newBuilder() 447 .setField(KernelWakelock.NAME_FIELD_NUMBER)); 448 addGaugeAtom(config, Atom.KERNEL_WAKELOCK_FIELD_NUMBER, dimension); 449 450 turnScreenOff(); 451 452 uploadConfig(config); 453 454 Thread.sleep(WAIT_TIME_LONG); 455 turnScreenOn(); 456 Thread.sleep(WAIT_TIME_LONG); 457 458 List<Atom> data = getGaugeMetricDataList(); 459 460 Atom atom = data.get(0); 461 assertTrue(!atom.getKernelWakelock().getName().equals("")); 462 assertTrue(atom.getKernelWakelock().hasCount()); 463 assertTrue(atom.getKernelWakelock().hasVersion()); 464 assertTrue(atom.getKernelWakelock().getVersion() > 0); 465 assertTrue(atom.getKernelWakelock().hasTime()); 466 } 467 468 public void testCpuTimePerFreq() throws Exception { 469 if (statsdDisabled()) { 470 return; 471 } 472 if (!hasFeature(FEATURE_WATCH, false)) return; 473 StatsdConfig.Builder config = getPulledConfig(); 474 FieldMatcher.Builder dimension = FieldMatcher.newBuilder() 475 .setField(Atom.CPU_TIME_PER_FREQ_FIELD_NUMBER) 476 .addChild(FieldMatcher.newBuilder() 477 .setField(CpuTimePerFreq.CLUSTER_FIELD_NUMBER)); 478 addGaugeAtom(config, Atom.CPU_TIME_PER_FREQ_FIELD_NUMBER, dimension); 479 480 turnScreenOff(); 481 482 uploadConfig(config); 483 484 Thread.sleep(2000); 485 turnScreenOn(); 486 Thread.sleep(2000); 487 488 List<Atom> data = getGaugeMetricDataList(); 489 490 Atom atom = data.get(0); 491 assertTrue(atom.getCpuTimePerFreq().getCluster() >= 0); 492 assertTrue(atom.getCpuTimePerFreq().getFreqIndex() >= 0); 493 assertTrue(atom.getCpuTimePerFreq().getTimeMillis() > 0); 494 } 495 496 public void testSubsystemSleepState() throws Exception { 497 if (statsdDisabled()) { 498 return; 499 } 500 StatsdConfig.Builder config = getPulledConfig(); 501 FieldMatcher.Builder dimension = FieldMatcher.newBuilder() 502 .setField(Atom.SUBSYSTEM_SLEEP_STATE_FIELD_NUMBER) 503 .addChild(FieldMatcher.newBuilder() 504 .setField(SubsystemSleepState.SUBSYSTEM_NAME_FIELD_NUMBER)); 505 addGaugeAtom(config, Atom.SUBSYSTEM_SLEEP_STATE_FIELD_NUMBER, dimension); 506 507 turnScreenOff(); 508 509 uploadConfig(config); 510 511 Thread.sleep(WAIT_TIME_LONG); 512 turnScreenOn(); 513 Thread.sleep(WAIT_TIME_LONG); 514 515 List<Atom> dataList = getGaugeMetricDataList(); 516 517 for (Atom atom: dataList) { 518 assertTrue(!atom.getSubsystemSleepState().getSubsystemName().equals("")); 519 assertTrue(atom.getSubsystemSleepState().getCount() >= 0); 520 assertTrue(atom.getSubsystemSleepState().getTimeMillis() >= 0); 521 } 522 } 523 524 public void testModemActivityInfo() throws Exception { 525 if (statsdDisabled()) { 526 return; 527 } 528 if (!hasFeature(FEATURE_TELEPHONY, true)) return; 529 StatsdConfig.Builder config = getPulledConfig(); 530 addGaugeAtom(config, Atom.MODEM_ACTIVITY_INFO_FIELD_NUMBER, null); 531 532 turnScreenOff(); 533 534 uploadConfig(config); 535 536 Thread.sleep(WAIT_TIME_LONG); 537 turnScreenOn(); 538 Thread.sleep(WAIT_TIME_LONG); 539 540 List<Atom> dataList = getGaugeMetricDataList(); 541 542 for (Atom atom: dataList) { 543 assertTrue(atom.getModemActivityInfo().getTimestampMillis() > 0); 544 assertTrue(atom.getModemActivityInfo().getSleepTimeMillis() > 0); 545 } 546 } 547 548 public void testWifiActivityInfo() throws Exception { 549 if (statsdDisabled()) { 550 return; 551 } 552 if (!hasFeature(FEATURE_WIFI, true)) return; 553 if (!hasFeature(FEATURE_WATCH, false)) return; 554 StatsdConfig.Builder config = getPulledConfig(); 555 addGaugeAtom(config, Atom.WIFI_ACTIVITY_INFO_FIELD_NUMBER, null); 556 557 turnScreenOff(); 558 559 uploadConfig(config); 560 561 Thread.sleep(WAIT_TIME_LONG); 562 turnScreenOn(); 563 Thread.sleep(WAIT_TIME_LONG); 564 565 List<Atom> dataList = getGaugeMetricDataList(); 566 567 for (Atom atom: dataList) { 568 assertTrue(atom.getWifiActivityInfo().getTimestampMillis() > 0); 569 assertTrue(atom.getWifiActivityInfo().getStackState() >= 0); 570 assertTrue(atom.getWifiActivityInfo().getControllerIdleTimeMillis() > 0); 571 assertTrue(atom.getWifiActivityInfo().getControllerTxTimeMillis() >= 0); 572 assertTrue(atom.getWifiActivityInfo().getControllerRxTimeMillis() >= 0); 573 assertTrue(atom.getWifiActivityInfo().getControllerEnergyUsed() >= 0); 574 } 575 } 576 577 public void testBluetoothActivityInfo() throws Exception { 578 if (statsdDisabled()) { 579 return; 580 } 581 if (!hasFeature(FEATURE_BLUETOOTH, true)) return; 582 StatsdConfig.Builder config = getPulledConfig(); 583 addGaugeAtom(config, Atom.BLUETOOTH_ACTIVITY_INFO_FIELD_NUMBER, null); 584 585 turnScreenOff(); 586 587 uploadConfig(config); 588 589 Thread.sleep(WAIT_TIME_LONG); 590 turnScreenOn(); 591 Thread.sleep(WAIT_TIME_LONG); 592 593 List<Atom> dataList = getGaugeMetricDataList(); 594 595 for (Atom atom: dataList) { 596 assertTrue(atom.getBluetoothActivityInfo().getTimestampMillis() > 0); 597 assertTrue(atom.getBluetoothActivityInfo().getBluetoothStackState() >= 0); 598 assertTrue(atom.getBluetoothActivityInfo().getControllerIdleTimeMillis() > 0); 599 assertTrue(atom.getBluetoothActivityInfo().getControllerTxTimeMillis() >= 0); 600 assertTrue(atom.getBluetoothActivityInfo().getControllerRxTimeMillis() >= 0); 601 assertTrue(atom.getBluetoothActivityInfo().getEnergyUsed() >= 0); 602 } 603 } 604 605 // Explicitly tests if the adb command to log a breadcrumb is working. 606 public void testBreadcrumbAdb() throws Exception { 607 if (statsdDisabled()) { 608 return; 609 } 610 final int atomTag = Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER; 611 createAndUploadConfig(atomTag); 612 Thread.sleep(WAIT_TIME_SHORT); 613 614 doAppBreadcrumbReportedStart(1); 615 Thread.sleep(WAIT_TIME_SHORT); 616 617 List<EventMetricData> data = getEventMetricDataList(); 618 AppBreadcrumbReported atom = data.get(0).getAtom().getAppBreadcrumbReported(); 619 assertTrue(atom.getLabel() == 1); 620 assertTrue(atom.getState().getNumber() == AppBreadcrumbReported.State.START_VALUE); 621 } 622 } 623