Home | History | Annotate | Download | only in systemui
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
      5  * except in compliance with the License. You may obtain a copy of the License at
      6  *
      7  *      http://www.apache.org/licenses/LICENSE-2.0
      8  *
      9  * Unless required by applicable law or agreed to in writing, software distributed under the
     10  * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     11  * KIND, either express or implied. See the License for the specific language governing
     12  * permissions and limitations under the License.
     13  */
     14 
     15 package android.host.systemui;
     16 
     17 import com.android.tradefed.device.DeviceNotAvailableException;
     18 import com.android.tradefed.testtype.DeviceTestCase;
     19 
     20 public class BaseTileServiceTest extends DeviceTestCase {
     21     // Constants for generating commands below.
     22     protected static final String PACKAGE = "android.systemui.cts";
     23     private static final String ACTION_SHOW_DIALOG = "android.sysui.testtile.action.SHOW_DIALOG";
     24 
     25     // Commands used on the device.
     26     private static final String ADD_TILE   = "cmd statusbar add-tile ";
     27     private static final String REM_TILE   = "cmd statusbar remove-tile ";
     28     private static final String CLICK_TILE = "cmd statusbar click-tile ";
     29 
     30     private static final String OPEN_NOTIFICATIONS = "cmd statusbar expand-notifications";
     31     private static final String OPEN_SETTINGS      = "cmd statusbar expand-settings";
     32     private static final String COLLAPSE           = "cmd statusbar collapse";
     33 
     34     private static final String SHOW_DIALOG = "am broadcast -a " + ACTION_SHOW_DIALOG;
     35 
     36     public static final String REQUEST_SUPPORTED = "cmd statusbar check-support";
     37     public static final String TEST_PREFIX = "TileTest_";
     38 
     39     // Time between checks for logs we expect.
     40     private static final long CHECK_DELAY = 500;
     41     // Number of times to check before failing.
     42     private static final long CHECK_RETRIES = 30;
     43 
     44     private final String mService;
     45     private final String mComponent;
     46 
     47     public BaseTileServiceTest() {
     48         this("");
     49     }
     50 
     51     public BaseTileServiceTest(String service) {
     52         mService = service;
     53         mComponent = PACKAGE + "/." + mService;
     54     }
     55 
     56     @Override
     57     protected void setUp() throws Exception {
     58         super.setUp();
     59 
     60         clearLogcat();
     61     }
     62 
     63     @Override
     64     protected void tearDown() throws Exception {
     65         super.tearDown();
     66 
     67         if (!supported()) return;
     68         collapse();
     69         remTile();
     70         // Try to wait for a onTileRemoved.
     71         waitFor("onTileRemoved");
     72     }
     73 
     74     protected void showDialog() throws Exception {
     75         execute(SHOW_DIALOG);
     76     }
     77 
     78     protected void addTile() throws Exception {
     79         execute(ADD_TILE + mComponent);
     80     }
     81 
     82     protected void remTile() throws Exception {
     83         execute(REM_TILE + mComponent);
     84     }
     85 
     86     protected void clickTile() throws Exception {
     87         execute(CLICK_TILE + mComponent);
     88     }
     89 
     90     protected void openNotifications() throws Exception {
     91         execute(OPEN_NOTIFICATIONS);
     92     }
     93 
     94     protected void openSettings() throws Exception {
     95         execute(OPEN_SETTINGS);
     96     }
     97 
     98     protected void collapse() throws Exception {
     99         execute(COLLAPSE);
    100     }
    101 
    102     private void execute(String cmd) throws Exception {
    103         getDevice().executeShellCommand(cmd);
    104         // All of the status bar commands tend to have animations associated
    105         // everything seems to be happier if you give them time to finish.
    106         Thread.sleep(100);
    107     }
    108 
    109     protected boolean waitFor(String str) throws DeviceNotAvailableException, InterruptedException {
    110         final String searchStr = TEST_PREFIX + str;
    111         int ct = 0;
    112         while (!hasLog(searchStr) && (ct++ < CHECK_RETRIES)) {
    113             Thread.sleep(CHECK_DELAY);
    114         }
    115         return hasLog(searchStr);
    116     }
    117 
    118     protected boolean hasLog(String str) throws DeviceNotAvailableException {
    119         String logs = getDevice().executeAdbCommand("logcat", "-v", "brief", "-d", mService + ":I",
    120                 "*:S");
    121         return logs.contains(str);
    122     }
    123 
    124     private void clearLogcat() throws DeviceNotAvailableException {
    125         getDevice().executeAdbCommand("logcat", "-c");
    126     }
    127 
    128     protected boolean supported() throws DeviceNotAvailableException {
    129         return supportedHardware() && supportedSoftware();
    130     }
    131 
    132     private boolean supportedSoftware() throws DeviceNotAvailableException {
    133         String supported = getDevice().executeShellCommand(REQUEST_SUPPORTED);
    134         return Boolean.parseBoolean(supported);
    135     }
    136 
    137     private boolean supportedHardware() throws DeviceNotAvailableException {
    138         String features = getDevice().executeShellCommand("pm list features");
    139         return !features.contains("android.hardware.type.television") &&
    140                !features.contains("android.hardware.type.watch");
    141     }
    142 }
    143