1e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu/* 2e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * Copyright (C) 2012 The Android Open Source Project 3e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * 4e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * Licensed under the Apache License, Version 2.0 (the "License"); 5e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * you may not use this file except in compliance with the License. 6e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * You may obtain a copy of the License at 7e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * 8e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * http://www.apache.org/licenses/LICENSE-2.0 9e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * 10e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * Unless required by applicable law or agreed to in writing, software 11e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * distributed under the License is distributed on an "AS IS" BASIS, 12e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * See the License for the specific language governing permissions and 14e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * limitations under the License. 15e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu */ 16e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 17e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhupackage com.android.uiautomator.testrunner; 18e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 19e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuimport android.content.Context; 20e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuimport android.os.Bundle; 21e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuimport android.os.RemoteException; 22e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuimport android.os.ServiceManager; 23e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuimport android.os.SystemClock; 24e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuimport android.view.inputmethod.InputMethodInfo; 25e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 26e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuimport com.android.internal.view.IInputMethodManager; 27e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuimport com.android.uiautomator.core.UiDevice; 28e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 29e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuimport junit.framework.TestCase; 30e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 31e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuimport java.util.List; 32e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 33e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu/** 34e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * UI automation test should extend this class. This class provides access 35e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * to the following: 36e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * {@link UiDevice} instance 37e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * {@link Bundle} for command line parameters. 38dbba713661688a285e701a006ce2d199296ac328Guang Zhu * @since API Level 16 39e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu */ 40e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhupublic class UiAutomatorTestCase extends TestCase { 41e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 42e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu private static final String DISABLE_IME = "disable_ime"; 43e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu private static final String DUMMY_IME_PACKAGE = "com.android.testing.dummyime"; 44e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu private UiDevice mUiDevice; 45e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu private Bundle mParams; 46e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu private IAutomationSupport mAutomationSupport; 47e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu private boolean mShouldDisableIme = false; 48e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 49e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu @Override 50e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu protected void setUp() throws Exception { 51e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu super.setUp(); 52e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu mShouldDisableIme = "true".equals(mParams.getString(DISABLE_IME)); 53e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu if (mShouldDisableIme) { 54e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu setDummyIme(); 55e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 56e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 57e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 58e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu @Override 59e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu protected void tearDown() throws Exception { 60e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu if (mShouldDisableIme) { 61e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu restoreActiveIme(); 62e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 63e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu super.tearDown(); 64e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 65e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 66e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu /** 67e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * Get current instance of {@link UiDevice}. Works similar to calling the static 68e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * {@link UiDevice#getInstance()} from anywhere in the test classes. 69dbba713661688a285e701a006ce2d199296ac328Guang Zhu * @since API Level 16 70e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu */ 71e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu public UiDevice getUiDevice() { 72e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu return mUiDevice; 73e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 74e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 75e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu /** 76e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * Get command line parameters. On the command line when passing <code>-e key value</code> 77e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * pairs, the {@link Bundle} will have the key value pairs conveniently available to the 78e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * tests. 79dbba713661688a285e701a006ce2d199296ac328Guang Zhu * @since API Level 16 80e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu */ 81e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu public Bundle getParams() { 82e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu return mParams; 83e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 84e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 85e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu /** 86e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * Provides support for running tests to report interim status 87e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * 881893caed0ad4e73b0676f206282d490c2d345316Thanh Le * @return IAutomationSupport 89dbba713661688a285e701a006ce2d199296ac328Guang Zhu * @since API Level 16 90e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu */ 91e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu public IAutomationSupport getAutomationSupport() { 92e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu return mAutomationSupport; 93e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 94e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 95e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu /** 96e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * package private 97e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * @param uiDevice 98e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu */ 99e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu void setUiDevice(UiDevice uiDevice) { 100e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu mUiDevice = uiDevice; 101e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 102e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 103e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu /** 104e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * package private 105e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * @param params 106e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu */ 107e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu void setParams(Bundle params) { 108e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu mParams = params; 109e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 110e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 111e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu void setAutomationSupport(IAutomationSupport automationSupport) { 112e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu mAutomationSupport = automationSupport; 113e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 114e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 115e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu /** 116e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * Calls {@link SystemClock#sleep(long)} to sleep 117e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * @param ms is in milliseconds. 118dbba713661688a285e701a006ce2d199296ac328Guang Zhu * @since API Level 16 119e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu */ 120e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu public void sleep(long ms) { 121e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu SystemClock.sleep(ms); 122e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 123e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 124f612e6a05f47b28ae0f5715545658c08dd759dd7Guang Zhu private void setDummyIme() throws RemoteException { 125e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu IInputMethodManager im = IInputMethodManager.Stub.asInterface(ServiceManager 126e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu .getService(Context.INPUT_METHOD_SERVICE)); 127e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu List<InputMethodInfo> infos = im.getInputMethodList(); 128e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu String id = null; 129e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu for (InputMethodInfo info : infos) { 130e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu if (DUMMY_IME_PACKAGE.equals(info.getComponent().getPackageName())) { 131e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu id = info.getId(); 132e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 133e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 134e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu if (id == null) { 135e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu throw new RuntimeException(String.format( 136e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu "Required testing fixture missing: IME package (%s)", DUMMY_IME_PACKAGE)); 137e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 138e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu im.setInputMethod(null, id); 139e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 140e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 141f612e6a05f47b28ae0f5715545658c08dd759dd7Guang Zhu private void restoreActiveIme() throws RemoteException { 142e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu // TODO: figure out a way to restore active IME 143e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu // Currently retrieving active IME requires querying secure settings provider, which is hard 144e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu // to do without a Context; so the caveat here is that to make the post test device usable, 145e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu // the active IME needs to be manually switched. 146e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 147e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu} 148