Home | History | Annotate | Download | only in cts
      1 /*
      2  * Copyright (C) 2018 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.am.ActiveInstrumentationProto;
     20 import com.android.server.am.ActiveServicesProto;
     21 import com.android.server.am.ActiveServicesProto.ServicesByUser;
     22 import com.android.server.am.ActivityManagerServiceDumpBroadcastsProto;
     23 import com.android.server.am.ActivityManagerServiceDumpProcessesProto;
     24 import com.android.server.am.ActivityManagerServiceDumpProcessesProto.LruProcesses;
     25 import com.android.server.am.ActivityManagerServiceDumpServicesProto;
     26 import com.android.server.am.AppErrorsProto;
     27 import com.android.server.am.AppTimeTrackerProto;
     28 import com.android.server.am.BroadcastQueueProto;
     29 import com.android.server.am.BroadcastQueueProto.BroadcastSummary;
     30 import com.android.server.am.BroadcastRecordProto;
     31 import com.android.server.am.ConnectionRecordProto;
     32 import com.android.server.am.GrantUriProto;
     33 import com.android.server.am.ImportanceTokenProto;
     34 import com.android.server.am.NeededUriGrantsProto;
     35 import com.android.server.am.ProcessRecordProto;
     36 import com.android.server.am.ServiceRecordProto;
     37 import com.android.server.am.UidRecordProto;
     38 import com.android.server.am.UriPermissionOwnerProto;
     39 import com.android.server.am.VrControllerProto;
     40 
     41 /**
     42  * Test to check that the activity manager service properly outputs its dump state.
     43  *
     44  * make -j32 CtsIncidentHostTestCases
     45  * cts-tradefed run singleCommand cts-dev -d --module CtsIncidentHostTestCases
     46  */
     47 public class ActivityManagerIncidentTest extends ProtoDumpTestCase {
     48 
     49     private static final String TEST_BROADCAST = "com.android.mybroadcast";
     50     private static final String SYSTEM_PROC = "system";
     51     private static final int SYSTEM_UID = 1000;
     52 
     53     /**
     54      * Tests activity manager dumps broadcasts.
     55      */
     56     public void testDumpBroadcasts() throws Exception {
     57         getDevice().executeShellCommand("am broadcast -a " + TEST_BROADCAST);
     58         Thread.sleep(100);
     59         final ActivityManagerServiceDumpBroadcastsProto dump = getDump(
     60                 ActivityManagerServiceDumpBroadcastsProto.parser(),
     61                 "dumpsys activity --proto broadcasts");
     62 
     63         assertTrue(dump.getReceiverListCount() > 0);
     64         assertTrue(dump.getBroadcastQueueCount() > 0);
     65         assertTrue(dump.getStickyBroadcastsCount() > 0);
     66 
     67         boolean found = false;
     68 mybroadcast:
     69         for (BroadcastQueueProto queue : dump.getBroadcastQueueList()) {
     70             for (BroadcastRecordProto record : queue.getHistoricalBroadcastsList()) {
     71                 if (record.getIntentAction().equals(TEST_BROADCAST)) {
     72                     found = true;
     73                     break mybroadcast;
     74                 }
     75             }
     76             for (BroadcastSummary summary : queue.getHistoricalBroadcastsSummaryList()) {
     77                 if (summary.getIntent().getAction().equals(TEST_BROADCAST)) {
     78                     found = true;
     79                     break mybroadcast;
     80                 }
     81             }
     82         }
     83         assertTrue(found);
     84         ActivityManagerServiceDumpBroadcastsProto.MainHandler mainHandler = dump.getHandler();
     85         assertTrue(mainHandler.getHandler().contains(
     86             "com.android.server.am.ActivityManagerService"));
     87     }
     88 
     89     /**
     90      * Tests activity manager dumps services.
     91      */
     92     public void testDumpServices() throws Exception {
     93         final ActivityManagerServiceDumpServicesProto dump = getDump(
     94                 ActivityManagerServiceDumpServicesProto.parser(),
     95                 "dumpsys activity --proto service");
     96         ActiveServicesProto activeServices = dump.getActiveServices();
     97         assertTrue(activeServices.getServicesByUsersCount() > 0);
     98 
     99         for (ServicesByUser perUserServices : activeServices.getServicesByUsersList()) {
    100             assertTrue(perUserServices.getServiceRecordsCount() > 0);
    101             for (ServiceRecordProto service : perUserServices.getServiceRecordsList()) {
    102                 assertFalse(service.getShortName().isEmpty());
    103                 assertFalse(service.getPackageName().isEmpty());
    104                 assertFalse(service.getProcessName().isEmpty());
    105                 assertFalse(service.getAppinfo().getBaseDir().isEmpty());
    106                 assertFalse(service.getAppinfo().getDataDir().isEmpty());
    107             }
    108         }
    109 
    110         verifyActivityManagerServiceDumpServicesProto(dump, PRIVACY_NONE);
    111     }
    112 
    113     static void verifyActivityManagerServiceDumpServicesProto(ActivityManagerServiceDumpServicesProto dump, final int filterLevel) throws Exception {
    114         for (ServicesByUser sbu : dump.getActiveServices().getServicesByUsersList()) {
    115             for (ServiceRecordProto srp : sbu.getServiceRecordsList()) {
    116                 verifyServiceRecordProto(srp, filterLevel);
    117             }
    118         }
    119     }
    120 
    121     private static void verifyServiceRecordProto(ServiceRecordProto srp, final int filterLevel) throws Exception {
    122         if (filterLevel == PRIVACY_AUTO) {
    123             assertTrue(srp.getAppinfo().getBaseDir().isEmpty());
    124             assertTrue(srp.getAppinfo().getResDir().isEmpty());
    125             assertTrue(srp.getAppinfo().getDataDir().isEmpty());
    126         } else {
    127             assertFalse(srp.getAppinfo().getBaseDir().isEmpty());
    128             assertFalse(srp.getAppinfo().getDataDir().isEmpty());
    129         }
    130         for (ServiceRecordProto.StartItem si : srp.getDeliveredStartsList()) {
    131             verifyServiceRecordProtoStartItem(si, filterLevel);
    132         }
    133         for (ServiceRecordProto.StartItem si : srp.getPendingStartsList()) {
    134             verifyServiceRecordProtoStartItem(si, filterLevel);
    135         }
    136         for (ConnectionRecordProto crp : srp.getConnectionsList()) {
    137             verifyConnectionRecordProto(crp, filterLevel);
    138         }
    139     }
    140 
    141     private static void verifyServiceRecordProtoStartItem(ServiceRecordProto.StartItem si, final int filterLevel) throws Exception {
    142         verifyNeededUriGrantsProto(si.getNeededGrants(), filterLevel);
    143         verifyUriPermissionOwnerProto(si.getUriPermissions(), filterLevel);
    144     }
    145 
    146     private static void verifyNeededUriGrantsProto(NeededUriGrantsProto nugp, final int filterLevel) throws Exception {
    147         for (GrantUriProto gup : nugp.getGrantsList()) {
    148             verifyGrantUriProto(gup, filterLevel);
    149         }
    150     }
    151 
    152     private static void verifyUriPermissionOwnerProto(UriPermissionOwnerProto upop, final int filterLevel) throws Exception {
    153         if (filterLevel == PRIVACY_AUTO) {
    154             assertTrue(upop.getOwner().isEmpty());
    155         }
    156         for (GrantUriProto gup : upop.getReadPermsList()) {
    157             verifyGrantUriProto(gup, filterLevel);
    158         }
    159         for (GrantUriProto gup : upop.getWritePermsList()) {
    160             verifyGrantUriProto(gup, filterLevel);
    161         }
    162     }
    163 
    164     private static void verifyGrantUriProto(GrantUriProto gup, final int filterLevel) throws Exception {
    165         if (filterLevel == PRIVACY_AUTO) {
    166             assertTrue(gup.getUri().isEmpty());
    167         }
    168     }
    169 
    170     private static void verifyConnectionRecordProto(ConnectionRecordProto crp, final int filterLevel) throws Exception {
    171         for (ConnectionRecordProto.Flag f : crp.getFlagsList()) {
    172             assertTrue(ConnectionRecordProto.Flag.getDescriptor().getValues().contains(f.getValueDescriptor()));
    173         }
    174     }
    175 
    176     /**
    177      * Tests activity manager dumps processes.
    178      */
    179     public void testDumpProcesses() throws Exception {
    180         final ActivityManagerServiceDumpProcessesProto dump = getDump(
    181                 ActivityManagerServiceDumpProcessesProto.parser(),
    182                 "dumpsys activity --proto processes");
    183 
    184         assertTrue(dump.getProcsCount() > 0);
    185         boolean procFound = false;
    186         for (ProcessRecordProto proc : dump.getProcsList()) {
    187             if (proc.getProcessName().equals(SYSTEM_PROC) && proc.getUid() == SYSTEM_UID) {
    188                 procFound = true;
    189                 break;
    190             }
    191         }
    192         assertTrue(procFound);
    193 
    194         assertTrue(dump.getActiveUidsCount() > 0);
    195         boolean uidFound = false;
    196         for (UidRecordProto uid : dump.getActiveUidsList()) {
    197             if (uid.getUid() == SYSTEM_UID) {
    198                 uidFound = true;
    199                 break;
    200             }
    201         }
    202         assertTrue(uidFound);
    203 
    204         LruProcesses lruProcs = dump.getLruProcs();
    205         assertTrue(lruProcs.getSize() == lruProcs.getListCount());
    206         assertTrue(dump.getUidObserversCount() > 0);
    207         assertTrue(dump.getAdjSeq() > 0);
    208         assertTrue(dump.getLruSeq() > 0);
    209 
    210         verifyActivityManagerServiceDumpProcessesProto(dump, PRIVACY_NONE);
    211     }
    212 
    213     static void verifyActivityManagerServiceDumpProcessesProto(ActivityManagerServiceDumpProcessesProto dump, final int filterLevel) throws Exception {
    214         for (ActiveInstrumentationProto aip : dump.getActiveInstrumentationsList()) {
    215             verifyActiveInstrumentationProto(aip, filterLevel);
    216         }
    217         for (UidRecordProto urp : dump.getActiveUidsList()) {
    218             verifyUidRecordProto(urp, filterLevel);
    219         }
    220         for (UidRecordProto urp : dump.getValidateUidsList()) {
    221             verifyUidRecordProto(urp, filterLevel);
    222         }
    223         for (ImportanceTokenProto itp : dump.getImportantProcsList()) {
    224             verifyImportanceTokenProto(itp, filterLevel);
    225         }
    226         verifyAppErrorsProto(dump.getAppErrors(), filterLevel);
    227         verifyVrControllerProto(dump.getVrController(), filterLevel);
    228         verifyAppTimeTrackerProto(dump.getCurrentTracker(), filterLevel);
    229         if (filterLevel == PRIVACY_AUTO) {
    230             assertTrue(dump.getMemWatchProcesses().getDump().getFile().isEmpty());
    231         }
    232     }
    233 
    234     private static void verifyActiveInstrumentationProto(ActiveInstrumentationProto aip, final int filterLevel) throws Exception {
    235         if (filterLevel == PRIVACY_AUTO) {
    236             assertTrue(aip.getArguments().isEmpty());
    237         }
    238     }
    239 
    240     private static void verifyUidRecordProto(UidRecordProto urp, final int filterLevel) throws Exception {
    241         for (UidRecordProto.Change c : urp.getLastReportedChangesList()) {
    242             assertTrue(UidRecordProto.Change.getDescriptor().getValues().contains(c.getValueDescriptor()));
    243         }
    244         assertTrue(urp.getNumProcs() >= 0);
    245     }
    246 
    247     private static void verifyImportanceTokenProto(ImportanceTokenProto itp, final int filterLevel) throws Exception {
    248         if (filterLevel == PRIVACY_AUTO) {
    249             // The entire message is tagged as EXPLICIT, so even the pid should be stripped out.
    250             assertTrue(itp.getPid() == 0);
    251             assertTrue(itp.getToken().isEmpty());
    252             assertTrue(itp.getReason().isEmpty());
    253         }
    254     }
    255 
    256     private static void verifyAppErrorsProto(AppErrorsProto aep, final int filterLevel) throws Exception {
    257         assertTrue(aep.getNowUptimeMs() >= 0);
    258         if (filterLevel == PRIVACY_AUTO) {
    259             for (AppErrorsProto.BadProcess bp : aep.getBadProcessesList()) {
    260                 for (AppErrorsProto.BadProcess.Entry e : bp.getEntriesList()) {
    261                     assertTrue(e.getLongMsg().isEmpty());
    262                     assertTrue(e.getStack().isEmpty());
    263                 }
    264             }
    265         }
    266     }
    267 
    268     private static void verifyVrControllerProto(VrControllerProto vcp, final int filterLevel) throws Exception {
    269         for (VrControllerProto.VrMode vm : vcp.getVrModeList()) {
    270             assertTrue(VrControllerProto.VrMode.getDescriptor().getValues().contains(vm.getValueDescriptor()));
    271         }
    272     }
    273 
    274     private static void verifyAppTimeTrackerProto(AppTimeTrackerProto attp, final int filterLevel) throws Exception {
    275         assertTrue(attp.getTotalDurationMs() >= 0);
    276         for (AppTimeTrackerProto.PackageTime pt : attp.getPackageTimesList()) {
    277             assertTrue(pt.getDurationMs() >= 0);
    278         }
    279     }
    280 }
    281