Home | History | Annotate | Download | only in cts
      1 /*
      2  * Copyright (C) 2012 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 android.ui.cts;
     18 
     19 import android.platform.test.annotations.AppModeFull;
     20 import android.platform.test.annotations.AppModeInstant;
     21 
     22 import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
     23 import com.android.compatibility.common.util.MetricsStore;
     24 import com.android.compatibility.common.util.ReportLog;
     25 import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;
     26 import com.android.tradefed.build.IBuildInfo;
     27 import com.android.tradefed.device.ITestDevice;
     28 import com.android.tradefed.result.CollectingTestListener;
     29 import com.android.tradefed.result.TestDescription;
     30 import com.android.tradefed.result.TestRunResult;
     31 import com.android.tradefed.testtype.DeviceTestCase;
     32 import com.android.tradefed.testtype.IAbi;
     33 import com.android.tradefed.testtype.IAbiReceiver;
     34 import com.android.tradefed.testtype.IBuildReceiver;
     35 import com.android.tradefed.util.AbiUtils;
     36 
     37 import org.xmlpull.v1.XmlPullParserException;
     38 
     39 import java.io.File;
     40 import java.io.IOException;
     41 import java.util.Map;
     42 
     43 /**
     44  * Measure time to taskswitching between two Apps: A & B
     45  * Actual test is done in device, but this host side code installs all necessary APKs
     46  * and starts device test which is in CtsDeviceTaskswitchingControl.
     47  */
     48 public class TaskSwitchingTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
     49     private static final String TAG = "TaskSwitchingTest";
     50     private final static String RUNNER = "android.support.test.runner.AndroidJUnitRunner";
     51     private static final String RESULT_KEY = "COMPATIBILITY_TEST_RESULT";
     52     private IBuildInfo mBuild;
     53     private ITestDevice mDevice;
     54     private ReportLog mReport = null;
     55     private IAbi mAbi;
     56 
     57     static final String[] PACKAGES = {
     58         "android.taskswitching.control.cts",
     59         "android.taskswitching.appa",
     60         "android.taskswitching.appb"
     61     };
     62     static final String[] APKS = {
     63         "CtsDeviceTaskSwitchingControl.apk",
     64         "CtsDeviceTaskSwitchingAppA.apk",
     65         "CtsDeviceTaskSwitchingAppB.apk"
     66     };
     67 
     68     @Override
     69     public void setAbi(IAbi abi) {
     70         mAbi = abi;
     71     }
     72 
     73     @Override
     74     public void setBuild(IBuildInfo buildInfo) {
     75         mBuild = buildInfo;
     76     }
     77 
     78     @Override
     79     protected void setUp() throws Exception {
     80         super.setUp();
     81         mDevice = getDevice();
     82     }
     83 
     84     private void installPackages(boolean instant) throws Exception {
     85         CompatibilityBuildHelper buildHelper = new CompatibilityBuildHelper(mBuild);
     86         for (int i = 0; i < PACKAGES.length; i++) {
     87             String[] options = {AbiUtils.createAbiFlag(mAbi.getName()),
     88                     instant && !PACKAGES[i].contains("control") ? "--instant" : ""};
     89             mDevice.uninstallPackage(PACKAGES[i]);
     90             File app = buildHelper.getTestFile(APKS[i]);
     91             mDevice.installPackage(app, false, options);
     92         }
     93     }
     94 
     95 
     96     @Override
     97     protected void tearDown() throws Exception {
     98         for (int i = 0; i < PACKAGES.length; i++) {
     99             mDevice.uninstallPackage(PACKAGES[i]);
    100         }
    101         super.tearDown();
    102     }
    103 
    104     @AppModeInstant
    105     public void testTaskSwitchingInstant() throws Exception {
    106         installPackages(true);
    107         doTestTaskSwitching();
    108     }
    109 
    110     @AppModeFull
    111     public void testTaskSwitchingFull() throws Exception {
    112         installPackages(false);
    113         doTestTaskSwitching();
    114     }
    115 
    116     private void doTestTaskSwitching() throws Exception {
    117         RemoteAndroidTestRunner testRunner = new RemoteAndroidTestRunner(PACKAGES[0], RUNNER,
    118                 mDevice.getIDevice());
    119         LocalListener listener = new LocalListener();
    120         mDevice.runInstrumentationTests(testRunner, listener);
    121         TestRunResult result = listener.getCurrentRunResults();
    122         if (result.isRunFailure()) {
    123             fail(result.getRunFailureMessage());
    124         }
    125         assertNotNull("no performance data", mReport);
    126         MetricsStore.storeResult(mBuild, mAbi.getName(),
    127                 String.format("%s#%s", getClass().getName(), "testTaskSwitching"), mReport);
    128 
    129     }
    130 
    131     public class LocalListener extends CollectingTestListener {
    132         @Override
    133         public void testEnded(TestDescription test, Map<String, String> testMetrics) {
    134             // necessary as testMetrics passed from CollectingTestListerner is empty
    135             if (testMetrics.containsKey(RESULT_KEY)) {
    136                 try {
    137                     mReport = ReportLog.parse(testMetrics.get(RESULT_KEY));
    138                 } catch (XmlPullParserException | IOException e) {
    139                     e.printStackTrace();
    140                 }
    141             }
    142             super.testEnded(test, testMetrics);
    143         }
    144     }
    145 }
    146