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. 38e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu */ 39e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhupublic class UiAutomatorTestCase extends TestCase { 40e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 41e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu private static final String DISABLE_IME = "disable_ime"; 42e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu private static final String DUMMY_IME_PACKAGE = "com.android.testing.dummyime"; 43e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu private UiDevice mUiDevice; 44e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu private Bundle mParams; 45e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu private IAutomationSupport mAutomationSupport; 46e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu private boolean mShouldDisableIme = false; 47e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 48e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu @Override 49e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu protected void setUp() throws Exception { 50e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu super.setUp(); 51e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu mShouldDisableIme = "true".equals(mParams.getString(DISABLE_IME)); 52e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu if (mShouldDisableIme) { 53e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu setDummyIme(); 54e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 55e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 56e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 57e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu @Override 58e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu protected void tearDown() throws Exception { 59e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu if (mShouldDisableIme) { 60e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu restoreActiveIme(); 61e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 62e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu super.tearDown(); 63e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 64e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 65e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu /** 66e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * Get current instance of {@link UiDevice}. Works similar to calling the static 67e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * {@link UiDevice#getInstance()} from anywhere in the test classes. 68e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu */ 69e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu public UiDevice getUiDevice() { 70e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu return mUiDevice; 71e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 72e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 73e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu /** 74e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * Get command line parameters. On the command line when passing <code>-e key value</code> 75e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * pairs, the {@link Bundle} will have the key value pairs conveniently available to the 76e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * tests. 77e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu */ 78e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu public Bundle getParams() { 79e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu return mParams; 80e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 81e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 82e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu /** 83e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * Provides support for running tests to report interim status 84e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * 85e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * @return 86e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu */ 87e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu public IAutomationSupport getAutomationSupport() { 88e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu return mAutomationSupport; 89e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 90e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 91e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu /** 92e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * package private 93e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * @param uiDevice 94e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu */ 95e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu void setUiDevice(UiDevice uiDevice) { 96e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu mUiDevice = uiDevice; 97e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 98e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 99e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu /** 100e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * package private 101e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * @param params 102e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu */ 103e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu void setParams(Bundle params) { 104e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu mParams = params; 105e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 106e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 107e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu void setAutomationSupport(IAutomationSupport automationSupport) { 108e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu mAutomationSupport = automationSupport; 109e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 110e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 111e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu /** 112e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * Calls {@link SystemClock#sleep(long)} to sleep 113e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * @param ms is in milliseconds. 114e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu */ 115e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu public void sleep(long ms) { 116e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu SystemClock.sleep(ms); 117e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 118e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 119f612e6a05f47b28ae0f5715545658c08dd759dd7Guang Zhu private void setDummyIme() throws RemoteException { 120e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu IInputMethodManager im = IInputMethodManager.Stub.asInterface(ServiceManager 121e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu .getService(Context.INPUT_METHOD_SERVICE)); 122e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu List<InputMethodInfo> infos = im.getInputMethodList(); 123e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu String id = null; 124e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu for (InputMethodInfo info : infos) { 125e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu if (DUMMY_IME_PACKAGE.equals(info.getComponent().getPackageName())) { 126e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu id = info.getId(); 127e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 128e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 129e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu if (id == null) { 130e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu throw new RuntimeException(String.format( 131e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu "Required testing fixture missing: IME package (%s)", DUMMY_IME_PACKAGE)); 132e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 133e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu im.setInputMethod(null, id); 134e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 135e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 136f612e6a05f47b28ae0f5715545658c08dd759dd7Guang Zhu private void restoreActiveIme() throws RemoteException { 137e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu // TODO: figure out a way to restore active IME 138e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu // Currently retrieving active IME requires querying secure settings provider, which is hard 139e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu // to do without a Context; so the caveat here is that to make the post test device usable, 140e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu // the active IME needs to be manually switched. 141e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu } 142e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu} 143