aboutsummaryrefslogtreecommitdiff
path: root/src/io/appium/droiddriver/helpers
diff options
context:
space:
mode:
authorKevin Jin <kjin@google.com>2015-03-05 15:40:13 -0800
committerKevin Jin <kjin@google.com>2015-03-05 18:00:44 -0800
commit367267b01bcc1ec5965cfc7c26149ccd405c11cf (patch)
tree9d638e644dc9079f06f8c8794cea09dbf404023b /src/io/appium/droiddriver/helpers
parentf2c5634785d05fbdaff81a8b5f781910dd7a2894 (diff)
downloaddroiddriver-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')
-rw-r--r--src/io/appium/droiddriver/helpers/BaseDroidDriverTest.java26
-rw-r--r--src/io/appium/droiddriver/helpers/DroidDrivers.java88
-rw-r--r--src/io/appium/droiddriver/helpers/DroidDriversInitializer.java49
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;
+ }
+}