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