Home | History | Annotate | Download | only in rule
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
      5  * use this file except in compliance with the License. You may obtain a copy of
      6  * 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, WITHOUT
     12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
     13  * License for the specific language governing permissions and limitations under
     14  * the License.
     15  */
     16 package com.android.launcher3.util.rule;
     17 
     18 import android.content.ComponentName;
     19 import android.content.pm.ActivityInfo;
     20 import android.os.ParcelFileDescriptor;
     21 import android.support.test.InstrumentationRegistry;
     22 
     23 import org.junit.rules.TestRule;
     24 import org.junit.runner.Description;
     25 import org.junit.runners.model.Statement;
     26 
     27 import java.io.FileInputStream;
     28 import java.io.IOException;
     29 
     30 /**
     31  * Test rule which executes a shell command at the start of the test.
     32  */
     33 public class ShellCommandRule implements TestRule {
     34 
     35     private final String mCmd;
     36 
     37     public ShellCommandRule(String cmd) {
     38         mCmd = cmd;
     39     }
     40 
     41     @Override
     42     public Statement apply(Statement base, Description description) {
     43         return new MyStatement(base, mCmd);
     44     }
     45 
     46     public static void runShellCommand(String command) throws IOException {
     47         ParcelFileDescriptor pfd = InstrumentationRegistry.getInstrumentation().getUiAutomation()
     48                 .executeShellCommand(command);
     49 
     50         // Read the input stream fully.
     51         FileInputStream fis = new ParcelFileDescriptor.AutoCloseInputStream(pfd);
     52         while (fis.read() != -1);
     53         fis.close();
     54     }
     55 
     56     private static class MyStatement extends Statement {
     57         private final Statement mBase;
     58         private final String mCmd;
     59 
     60         public MyStatement(Statement base, String cmd) {
     61             mBase = base;
     62             mCmd = cmd;
     63         }
     64 
     65         @Override
     66         public void evaluate() throws Throwable {
     67             runShellCommand(mCmd);
     68             mBase.evaluate();
     69         }
     70     }
     71 
     72     /**
     73      * Grants the launcher permission to bind widgets.
     74      */
     75     public static ShellCommandRule grandWidgetBind() {
     76         return new ShellCommandRule("appwidget grantbind --package "
     77                 + InstrumentationRegistry.getTargetContext().getPackageName());
     78     }
     79 
     80     /**
     81      * Sets the target launcher as default launcher.
     82      */
     83     public static ShellCommandRule setDefaultLauncher() {
     84         ActivityInfo launcher = InstrumentationRegistry.getTargetContext().getPackageManager()
     85                 .queryIntentActivities(LauncherActivityRule.getHomeIntent(), 0).get(0)
     86                 .activityInfo;
     87         return new ShellCommandRule("cmd package set-home-activity " +
     88                 new ComponentName(launcher.packageName, launcher.name).flattenToString());
     89     }
     90 }
     91