Home | History | Annotate | Download | only in cts
      1 /*
      2  * Copyright (C) 2016 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 
     17 package com.android.server.cts;
     18 
     19 import com.android.server.AlarmClockMetadataProto;
     20 import com.android.server.AlarmManagerServiceDumpProto;
     21 import com.android.server.AlarmProto;
     22 import com.android.server.BatchProto;
     23 import com.android.server.BroadcastStatsProto;
     24 import com.android.server.ConstantsProto;
     25 import com.android.server.FilterStatsProto;
     26 import com.android.server.ForceAppStandbyTrackerProto;
     27 import com.android.server.ForceAppStandbyTrackerProto.RunAnyInBackgroundRestrictedPackages;
     28 import com.android.server.IdleDispatchEntryProto;
     29 import com.android.server.InFlightProto;
     30 import com.android.server.WakeupEventProto;
     31 import java.util.List;
     32 
     33 /**
     34  * Test to check that the alarm manager service properly outputs its dump state.
     35  */
     36 public class AlarmManagerIncidentTest extends ProtoDumpTestCase {
     37     public void testAlarmManagerServiceDump() throws Exception {
     38         final AlarmManagerServiceDumpProto dump =
     39                 getDump(AlarmManagerServiceDumpProto.parser(), "dumpsys alarm --proto");
     40 
     41         verifyAlarmManagerServiceDumpProto(dump, PRIVACY_NONE);
     42     }
     43 
     44     static void verifyAlarmManagerServiceDumpProto(AlarmManagerServiceDumpProto dump, final int filterLevel) throws Exception {
     45         // Times should be positive.
     46         assertTrue(0 < dump.getCurrentTime());
     47         assertTrue(0 < dump.getElapsedRealtime());
     48         // Can be 0 if the time hasn't been changed yet.
     49         assertTrue(0 <= dump.getLastTimeChangeClockTime());
     50         assertTrue(0 <= dump.getLastTimeChangeRealtime());
     51 
     52         // ConstantsProto
     53         ConstantsProto settings = dump.getSettings();
     54         assertTrue(0 < settings.getMinFuturityDurationMs());
     55         assertTrue(0 < settings.getMinIntervalDurationMs());
     56         assertTrue(0 < settings.getListenerTimeoutDurationMs());
     57         assertTrue(0 < settings.getAllowWhileIdleShortDurationMs());
     58         assertTrue(0 < settings.getAllowWhileIdleLongDurationMs());
     59         assertTrue(0 < settings.getAllowWhileIdleWhitelistDurationMs());
     60 
     61         // ForceAppStandbyTrackerProto
     62         ForceAppStandbyTrackerProto forceAppStandbyTracker = dump.getForceAppStandbyTracker();
     63         for (int uid : forceAppStandbyTracker.getForegroundUidsList()) {
     64             // 0 is technically a valid UID.
     65             assertTrue(0 <= uid);
     66         }
     67         for (int aid : forceAppStandbyTracker.getPowerSaveWhitelistAppIdsList()) {
     68             assertTrue(0 <= aid);
     69         }
     70         for (int aid : forceAppStandbyTracker.getTempPowerSaveWhitelistAppIdsList()) {
     71             assertTrue(0 <= aid);
     72         }
     73         for (RunAnyInBackgroundRestrictedPackages r : forceAppStandbyTracker.getRunAnyInBackgroundRestrictedPackagesList()) {
     74             assertTrue(0 <= r.getUid());
     75         }
     76 
     77         if (!dump.getIsInteractive()) {
     78             // These are only valid if is_interactive is false.
     79             assertTrue(0 < dump.getTimeSinceNonInteractiveMs());
     80             assertTrue(0 < dump.getMaxWakeupDelayMs());
     81             assertTrue(0 < dump.getTimeSinceLastDispatchMs());
     82             // time_until_next_non_wakeup_delivery_ms could be negative if the delivery time is in the past.
     83         }
     84 
     85         assertTrue(0 < dump.getTimeUntilNextWakeupMs());
     86         assertTrue(0 < dump.getTimeSinceLastWakeupMs());
     87         assertTrue(0 < dump.getTimeSinceLastWakeupSetMs());
     88         assertTrue(0 <= dump.getTimeChangeEventCount());
     89 
     90         for (int aid : dump.getDeviceIdleUserWhitelistAppIdsList()) {
     91             assertTrue(0 <= aid);
     92         }
     93 
     94         // AlarmClockMetadataProto
     95         for (AlarmClockMetadataProto ac : dump.getNextAlarmClockMetadataList()) {
     96             assertTrue(0 <= ac.getUser());
     97             assertTrue(0 < ac.getTriggerTimeMs());
     98         }
     99 
    100         for (BatchProto b : dump.getPendingAlarmBatchesList()) {
    101             final long start = b.getStartRealtime();
    102             final long end = b.getEndRealtime();
    103             assertTrue("Batch start time (" + start+ ") is negative", 0 <= start);
    104             assertTrue("Batch end time (" + end + ") is negative", 0 <= end);
    105             assertTrue("Batch start time (" + start + ") is after its end time (" + end + ")",
    106                 start <= end);
    107             testAlarmProtoList(b.getAlarmsList(), filterLevel);
    108         }
    109 
    110         testAlarmProtoList(dump.getPendingUserBlockedBackgroundAlarmsList(), filterLevel);
    111 
    112         testAlarmProto(dump.getPendingIdleUntil(), filterLevel);
    113 
    114         testAlarmProtoList(dump.getPendingWhileIdleAlarmsList(), filterLevel);
    115 
    116         testAlarmProto(dump.getNextWakeFromIdle(), filterLevel);
    117 
    118         testAlarmProtoList(dump.getPastDueNonWakeupAlarmsList(), filterLevel);
    119 
    120         assertTrue(0 <= dump.getDelayedAlarmCount());
    121         assertTrue(0 <= dump.getTotalDelayTimeMs());
    122         assertTrue(0 <= dump.getMaxDelayDurationMs());
    123         assertTrue(0 <= dump.getMaxNonInteractiveDurationMs());
    124 
    125         assertTrue(0 <= dump.getBroadcastRefCount());
    126         assertTrue(0 <= dump.getPendingIntentSendCount());
    127         assertTrue(0 <= dump.getPendingIntentFinishCount());
    128         assertTrue(0 <= dump.getListenerSendCount());
    129         assertTrue(0 <= dump.getListenerFinishCount());
    130 
    131         for (InFlightProto f : dump.getOutstandingDeliveriesList())  {
    132             assertTrue(0 <= f.getUid());
    133             assertTrue(0 < f.getWhenElapsedMs());
    134             testBroadcastStatsProto(f.getBroadcastStats());
    135             testFilterStatsProto(f.getFilterStats(), filterLevel);
    136             if (filterLevel == PRIVACY_AUTO) {
    137                 assertTrue(f.getTag().isEmpty());
    138             }
    139         }
    140 
    141         for (AlarmManagerServiceDumpProto.LastAllowWhileIdleDispatch l : dump.getLastAllowWhileIdleDispatchTimesList()) {
    142             assertTrue(0 <= l.getUid());
    143             assertTrue(0 < l.getTimeMs());
    144         }
    145 
    146         for (AlarmManagerServiceDumpProto.TopAlarm ta : dump.getTopAlarmsList()) {
    147             assertTrue(0 <= ta.getUid());
    148             testFilterStatsProto(ta.getFilter(), filterLevel);
    149         }
    150 
    151         for (AlarmManagerServiceDumpProto.AlarmStat as : dump.getAlarmStatsList()) {
    152             testBroadcastStatsProto(as.getBroadcast());
    153             for (FilterStatsProto f : as.getFiltersList()) {
    154                 testFilterStatsProto(f, filterLevel);
    155             }
    156         }
    157 
    158         for (IdleDispatchEntryProto id : dump.getAllowWhileIdleDispatchesList()) {
    159             assertTrue(0 <= id.getUid());
    160             assertTrue(0 <= id.getEntryCreationRealtime());
    161             assertTrue(0 <= id.getArgRealtime());
    162             if (filterLevel == PRIVACY_AUTO) {
    163                 assertTrue(id.getTag().isEmpty());
    164             }
    165         }
    166 
    167         for (WakeupEventProto we : dump.getRecentWakeupHistoryList()) {
    168             assertTrue(0 <= we.getUid());
    169             assertTrue(0 <= we.getWhen());
    170         }
    171     }
    172 
    173     private static void testAlarmProtoList(List<AlarmProto> alarms, final int filterLevel) throws Exception {
    174         for (AlarmProto a : alarms) {
    175             testAlarmProto(a, filterLevel);
    176         }
    177     }
    178 
    179     private static void testAlarmProto(AlarmProto alarm, final int filterLevel) throws Exception {
    180         assertNotNull(alarm);
    181 
    182         if (filterLevel == PRIVACY_AUTO) {
    183             assertTrue(alarm.getTag().isEmpty());
    184             assertTrue(alarm.getListener().isEmpty());
    185         }
    186         // alarm.time_until_when_elapsed_ms can be negative if 'when' is in the past.
    187         assertTrue(0 <= alarm.getWindowLengthMs());
    188         assertTrue(0 <= alarm.getRepeatIntervalMs());
    189         assertTrue(0 <= alarm.getCount());
    190     }
    191 
    192     private static void testBroadcastStatsProto(BroadcastStatsProto broadcast) throws Exception {
    193         assertNotNull(broadcast);
    194 
    195         assertTrue(0 <= broadcast.getUid());
    196         assertTrue(0 <= broadcast.getTotalFlightDurationMs());
    197         assertTrue(0 <= broadcast.getCount());
    198         assertTrue(0 <= broadcast.getWakeupCount());
    199         assertTrue(0 <= broadcast.getStartTimeRealtime());
    200         // Nesting should be non-negative.
    201         assertTrue(0 <= broadcast.getNesting());
    202     }
    203 
    204     private static void testFilterStatsProto(FilterStatsProto filter, final int filterLevel) throws Exception {
    205         assertNotNull(filter);
    206 
    207         if (filterLevel == PRIVACY_AUTO) {
    208             assertTrue(filter.getTag().isEmpty());
    209         }
    210         assertTrue(0 <= filter.getLastFlightTimeRealtime());
    211         assertTrue(0 <= filter.getTotalFlightDurationMs());
    212         assertTrue(0 <= filter.getCount());
    213         assertTrue(0 <= filter.getWakeupCount());
    214         assertTrue(0 <= filter.getStartTimeRealtime());
    215         // Nesting should be non-negative.
    216         assertTrue(0 <= filter.getNesting());
    217     }
    218 }
    219 
    220