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 
17 package com.android.server.cts;
18 
19 import static org.junit.Assume.assumeTrue;
20 
21 import android.service.usb.UsbAccessoryProto;
22 import android.service.usb.UsbDebuggingManagerProto;
23 import android.service.usb.UsbDeviceFilterProto;
24 import android.service.usb.UsbDeviceManagerProto;
25 import android.service.usb.UsbDeviceProto;
26 import android.service.usb.UsbHandlerProto;
27 import android.service.usb.UsbHostManagerProto;
28 import android.service.usb.UsbProfileGroupSettingsManagerProto;
29 import android.service.usb.UsbServiceDumpProto;
30 import android.service.usb.UsbSettingsDevicePreferenceProto;
31 import android.service.usb.UsbSettingsManagerProto;
32 import com.android.tradefed.device.DeviceNotAvailableException;
33 import com.android.tradefed.device.ITestDevice;
34 
35 /**
36  * Tests for the UsbService proto dump.
37  */
38 public class UsbIncidentTest extends ProtoDumpTestCase {
39 
40     /** Value of PackageManager.FEATURE_USB_HOST */
41     private static final String FEATURE_USB_HOST = "android.hardware.usb.host";
42 
43     /** Value of PackageManager.FEATURE_USB_ACCESSORY */
44     private static final String FEATURE_USB_ACCESSORY = "android.hardware.usb.accessory";
45 
hasUsbFunctionality(ITestDevice device)46     public static boolean hasUsbFunctionality(ITestDevice device) throws DeviceNotAvailableException {
47         boolean hasUsbHost = device.hasFeature(FEATURE_USB_HOST);
48         boolean hasUsbAccessory = device.hasFeature(FEATURE_USB_ACCESSORY);
49         return hasUsbHost || hasUsbAccessory;
50     }
51 
testUsbServiceDump()52     public void testUsbServiceDump() throws Exception {
53         // Devices that don't support USB functionality won't dump a USB service proto.
54         assumeTrue("Device doesn't support USB functionality.", hasUsbFunctionality(getDevice()));
55 
56         final UsbServiceDumpProto dump = getDump(UsbServiceDumpProto.parser(),
57                 "dumpsys usb --proto");
58 
59         verifyUsbServiceDumpProto(dump, PRIVACY_NONE);
60     }
61 
verifyUsbServiceDumpProto(UsbServiceDumpProto dump, final int filterLevel)62     static void verifyUsbServiceDumpProto(UsbServiceDumpProto dump, final int filterLevel) throws Exception {
63         verifyUsbDeviceManagerProto(dump.getDeviceManager(), filterLevel);
64         verifyUsbHostManagerProto(dump.getHostManager(), filterLevel);
65         verifyUsbSettingsManagerProto(dump.getSettingsManager(), filterLevel);
66     }
67 
verifyUsbDeviceManagerProto(UsbDeviceManagerProto udmp, final int filterLevel)68     private static void verifyUsbDeviceManagerProto(UsbDeviceManagerProto udmp, final int filterLevel) throws Exception {
69         verifyUsbHandlerProto(udmp.getHandler(), filterLevel);
70         verifyUsbDebuggingManagerProto(udmp.getDebuggingManager(), filterLevel);
71     }
72 
verifyUsbHandlerProto(UsbHandlerProto uhp, final int filterLevel)73     private static void verifyUsbHandlerProto(UsbHandlerProto uhp, final int filterLevel) throws Exception {
74         for (UsbHandlerProto.Function f : uhp.getCurrentFunctionsList()) {
75             assertTrue(UsbHandlerProto.Function.getDescriptor().getValues().contains(f.getValueDescriptor()));
76         }
77         for (UsbHandlerProto.Function f : uhp.getScreenUnlockedFunctionsList()) {
78             assertTrue(UsbHandlerProto.Function.getDescriptor().getValues().contains(f.getValueDescriptor()));
79         }
80         verifyUsbAccessoryProto(uhp.getCurrentAccessory(), filterLevel);
81     }
82 
verifyUsbAccessoryProto(UsbAccessoryProto uap, final int filterLevel)83     private static void verifyUsbAccessoryProto(UsbAccessoryProto uap, final int filterLevel) throws Exception {
84         if (filterLevel < PRIVACY_LOCAL) {
85             assertTrue(uap.getSerial().isEmpty());
86             if (filterLevel == PRIVACY_AUTO) {
87                 assertTrue(uap.getUri().isEmpty());
88             }
89         }
90     }
91 
verifyUsbDebuggingManagerProto(UsbDebuggingManagerProto udmp, final int filterLevel)92     private static void verifyUsbDebuggingManagerProto(UsbDebuggingManagerProto udmp, final int filterLevel) throws Exception {
93         if (filterLevel < PRIVACY_LOCAL) {
94             assertTrue(udmp.getSystemKeys().isEmpty());
95             assertTrue(udmp.getUserKeys().isEmpty());
96             if (filterLevel < PRIVACY_EXPLICIT) {
97                 assertTrue(udmp.getLastKeyReceived().isEmpty());
98             }
99         }
100     }
101 
verifyUsbHostManagerProto(UsbHostManagerProto uhmp, final int filterLevel)102     private static void verifyUsbHostManagerProto(UsbHostManagerProto uhmp, final int filterLevel) throws Exception {
103         for (UsbDeviceProto udp : uhmp.getDevicesList()) {
104             verifyUsbDeviceProto(udp, filterLevel);
105         }
106     }
107 
verifyUsbDeviceProto(UsbDeviceProto udp, final int filterLevel)108     private static void verifyUsbDeviceProto(UsbDeviceProto udp, final int filterLevel) throws Exception {
109         if (filterLevel < PRIVACY_LOCAL) {
110             assertTrue(udp.getSerialNumber().isEmpty());
111         }
112     }
113 
verifyUsbSettingsManagerProto(UsbSettingsManagerProto usmp, final int filterLevel)114     private static void verifyUsbSettingsManagerProto(UsbSettingsManagerProto usmp, final int filterLevel) throws Exception {
115         for (UsbProfileGroupSettingsManagerProto upgsmp : usmp.getProfileGroupSettingsList()) {
116             verifyUsbProfileGroupSettingsManagerProto(upgsmp, filterLevel);
117         }
118     }
119 
verifyUsbProfileGroupSettingsManagerProto(UsbProfileGroupSettingsManagerProto pgsp, final int filterLevel)120     private static void verifyUsbProfileGroupSettingsManagerProto(UsbProfileGroupSettingsManagerProto pgsp, final int filterLevel) throws Exception {
121         for (UsbSettingsDevicePreferenceProto usdp : pgsp.getDevicePreferencesList()) {
122             verifyUsbDeviceFilterProto(usdp.getFilter(), filterLevel);
123         }
124     }
125 
verifyUsbDeviceFilterProto(UsbDeviceFilterProto udfp, final int filterLevel)126     private static void verifyUsbDeviceFilterProto(UsbDeviceFilterProto udfp, final int filterLevel) throws Exception {
127         if (filterLevel == PRIVACY_AUTO) {
128             assertTrue(udfp.getSerialNumber().isEmpty());
129         }
130     }
131 }
132