Home | History | Annotate | Download | only in atom
      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