diff options
author | Kevin Jin <kjin@google.com> | 2015-03-05 15:40:13 -0800 |
---|---|---|
committer | Kevin Jin <kjin@google.com> | 2015-03-05 18:00:44 -0800 |
commit | 367267b01bcc1ec5965cfc7c26149ccd405c11cf (patch) | |
tree | 9d638e644dc9079f06f8c8794cea09dbf404023b /src/io/appium/droiddriver/helpers | |
parent | f2c5634785d05fbdaff81a8b5f781910dd7a2894 (diff) | |
download | droiddriver-367267b01bcc1ec5965cfc7c26149ccd405c11cf.tar.gz |
Add InstrumentationUtils
Move runOnMainSyncWithTimeout to InstrumentationUtils
Add By.resourceId(int) since InstrumentationUtils should always be available
Change-Id: I8e4683030583b88c3e2b777d0b80b5a2f310e279
Diffstat (limited to 'src/io/appium/droiddriver/helpers')
3 files changed, 76 insertions, 87 deletions
diff --git a/src/io/appium/droiddriver/helpers/BaseDroidDriverTest.java b/src/io/appium/droiddriver/helpers/BaseDroidDriverTest.java index 7b29bc0..0b17dc5 100644 --- a/src/io/appium/droiddriver/helpers/BaseDroidDriverTest.java +++ b/src/io/appium/droiddriver/helpers/BaseDroidDriverTest.java @@ -17,7 +17,6 @@ package io.appium.droiddriver.helpers; import android.app.Activity; -import android.app.Instrumentation; import android.content.Context; import android.os.Debug; import android.test.FlakyTest; @@ -41,29 +40,6 @@ import io.appium.droiddriver.util.Logs; */ public abstract class BaseDroidDriverTest<T extends Activity> extends D2ActivityInstrumentationTestCase2<T> { - /** - * Calls {@link DroidDrivers#init} once and only once. - */ - public static class DroidDriversInitializer extends SingleRun { - private static DroidDriversInitializer instance; - protected final Instrumentation instrumentation; - - protected DroidDriversInitializer(Instrumentation instrumentation) { - this.instrumentation = instrumentation; - } - - @Override - protected void run() { - DroidDrivers.init(DroidDrivers.newDriver(instrumentation)); - } - - public static synchronized DroidDriversInitializer get(Instrumentation instrumentation) { - if (instance == null) { - instance = new DroidDriversInitializer(instrumentation); - } - return instance; - } - } private static boolean classSetUpDone = false; // In case of device-wide fatal errors, e.g. OOME, the remaining tests will @@ -120,7 +96,7 @@ public abstract class BaseDroidDriverTest<T extends Activity> extends * io.appium.droiddriver.instrumentation.ViewElement#overrideClassName} */ protected void classSetUp() { - DroidDriversInitializer.get(getInstrumentation()).singleRun(); + DroidDriversInitializer.get(DroidDrivers.newDriver()).singleRun(); } protected boolean reportSkippedAsFailed() { diff --git a/src/io/appium/droiddriver/helpers/DroidDrivers.java b/src/io/appium/droiddriver/helpers/DroidDrivers.java index 60c3740..5cddb4f 100644 --- a/src/io/appium/droiddriver/helpers/DroidDrivers.java +++ b/src/io/appium/droiddriver/helpers/DroidDrivers.java @@ -19,7 +19,6 @@ package io.appium.droiddriver.helpers; import android.annotation.TargetApi; import android.app.Instrumentation; import android.os.Build; -import android.os.Bundle; import java.lang.reflect.InvocationTargetException; @@ -27,83 +26,53 @@ import io.appium.droiddriver.DroidDriver; import io.appium.droiddriver.exceptions.DroidDriverException; import io.appium.droiddriver.instrumentation.InstrumentationDriver; import io.appium.droiddriver.uiautomation.UiAutomationDriver; +import io.appium.droiddriver.util.InstrumentationUtils; /** - * Static utility methods pertaining to {@link DroidDriver} instances. + * Static utility methods using a singleton {@link DroidDriver} instance. This class is NOT + * required, but it is handy and using a singleton driver can avoid memory leak when you have many + * instances around (for example, one in every test - JUnit framework keeps the test instances in + * memory after running them). */ public class DroidDrivers { private static DroidDriver driver; - private static Instrumentation instrumentation; - private static Bundle options; /** - * Gets the singleton driver. Throws if {@link #init} has not been called. + * Gets the singleton driver. Throws if {@link #setSingleton} has not been called. */ public static DroidDriver get() { - if (DroidDrivers.driver == null) { - throw new DroidDriverException("init() has not been called"); + if (driver == null) { + throw new DroidDriverException("setSingleton() has not been called"); } - return DroidDrivers.driver; + return driver; } /** - * Initializes the singleton driver. The singleton driver is NOT required, but - * it is handy and using a singleton driver can avoid memory leak if you have - * many instances around (for example, one in every test -- JUnit framework - * keeps the test instances in memory after running them). + * Sets the singleton driver. */ - public static void init(DroidDriver driver) { + public static void setSingleton(DroidDriver driver) { if (DroidDrivers.driver != null) { - throw new DroidDriverException("init() can only be called once"); + throw new DroidDriverException("setSingleton() can only be called once"); } DroidDrivers.driver = driver; } /** - * Initializes for the convenience methods {@link #getInstrumentation()} and - * {@link #getOptions()}. Called by - * {@link io.appium.droiddriver.runner.TestRunner}. If a custom - * runner is used, this method must be called appropriately, otherwise the two - * convenience methods won't work. - */ - public static void initInstrumentation(Instrumentation instrumentation, Bundle arguments) { - if (DroidDrivers.instrumentation != null) { - throw new DroidDriverException("DroidDrivers.initInstrumentation() can only be called once"); - } - DroidDrivers.instrumentation = instrumentation; - DroidDrivers.options = arguments; - } - - public static Instrumentation getInstrumentation() { - return instrumentation; - } - - /** - * Gets the <a href= - * "http://developer.android.com/tools/testing/testing_otheride.html#AMOptionsSyntax" - * >am instrument options</a>. - */ - public static Bundle getOptions() { - return options; - } - - /** - * Returns whether the running target (device or emulator) has - * {@link android.app.UiAutomation} API, which is introduced in SDK API 18 - * (JELLY_BEAN_MR2). + * Returns whether the running target (device or emulator) has {@link android.app.UiAutomation} + * API, which is introduced in SDK API 18 (JELLY_BEAN_MR2). */ public static boolean hasUiAutomation() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2; } /** - * Returns a new DroidDriver instance. If am instrument options have "driver", - * treat it as the fully-qualified-class-name and create a new instance of it - * with {@code instrumentation} as the argument; otherwise a new - * platform-dependent default DroidDriver instance. + * Returns a new DroidDriver instance. If am instrument options have "driver", treat it as the + * fully-qualified-class-name and create a new instance of it with {@code instrumentation} as the + * argument; otherwise a new platform-dependent default DroidDriver instance. */ - public static DroidDriver newDriver(Instrumentation instrumentation) { - String driverClass = options == null ? null : options.getString("driver"); + public static DroidDriver newDriver() { + Instrumentation instrumentation = InstrumentationUtils.getInstrumentation(); + String driverClass = InstrumentationUtils.getD2Option("driver"); if (driverClass != null) { try { return (DroidDriver) Class.forName(driverClass).getConstructor(Instrumentation.class) @@ -123,29 +92,24 @@ public class DroidDrivers { } } - // If "driver" is not specified, return default. + // If "dd.driver" is not specified, return default. if (hasUiAutomation()) { - return newUiAutomationDriver(instrumentation); + checkUiAutomation(); + return new UiAutomationDriver(instrumentation); } - return newInstrumentationDriver(instrumentation); - } - - /** Returns a new InstrumentationDriver */ - public static InstrumentationDriver newInstrumentationDriver(Instrumentation instrumentation) { return new InstrumentationDriver(instrumentation); } - /** Returns a new UiAutomationDriver */ + /** Checks if UiAutomation API is available */ @TargetApi(18) - public static UiAutomationDriver newUiAutomationDriver(Instrumentation instrumentation) { + public static void checkUiAutomation() { if (!hasUiAutomation()) { throw new DroidDriverException("UiAutomation is not available below API 18. " + "See http://developer.android.com/reference/android/app/UiAutomation.html"); } - if (instrumentation.getUiAutomation() == null) { + if (InstrumentationUtils.getInstrumentation().getUiAutomation() == null) { throw new DroidDriverException( "uiAutomation==null: did you forget to set '-w' flag for 'am instrument'?"); } - return new UiAutomationDriver(instrumentation); } } diff --git a/src/io/appium/droiddriver/helpers/DroidDriversInitializer.java b/src/io/appium/droiddriver/helpers/DroidDriversInitializer.java new file mode 100644 index 0000000..727c97b --- /dev/null +++ b/src/io/appium/droiddriver/helpers/DroidDriversInitializer.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2015 DroidDriver committers + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.appium.droiddriver.helpers; + +import io.appium.droiddriver.DroidDriver; +import io.appium.droiddriver.exceptions.UnrecoverableException; + +/** + * Calls {@link DroidDrivers#setSingleton} once and only once. + */ +public class DroidDriversInitializer extends SingleRun { + private static DroidDriversInitializer instance; + private final DroidDriver driver; + + private DroidDriversInitializer(DroidDriver driver) { + this.driver = driver; + } + + @Override + protected void run() { + DroidDrivers.setSingleton(driver); + } + + public static synchronized DroidDriversInitializer get(DroidDriver driver) { + if (instance == null) { + instance = new DroidDriversInitializer(driver); + } + + if (instance.driver != driver) { + throw new UnrecoverableException("The singleton DroidDriversInitializer has already been" + + " created with a different driver"); + } + return instance; + } +} |