| Index: base/test/android/javatests/src/org/chromium/base/test/BaseActivityInstrumentationTestCase.java
|
| diff --git a/base/test/android/javatests/src/org/chromium/base/test/BaseActivityInstrumentationTestCase.java b/base/test/android/javatests/src/org/chromium/base/test/BaseActivityInstrumentationTestCase.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..53dee4ab14594c4faeb99c8db7ff5be2e61e716c
|
| --- /dev/null
|
| +++ b/base/test/android/javatests/src/org/chromium/base/test/BaseActivityInstrumentationTestCase.java
|
| @@ -0,0 +1,118 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.base.test;
|
| +
|
| +import android.app.Activity;
|
| +import android.content.Context;
|
| +import android.os.SystemClock;
|
| +import android.test.ActivityInstrumentationTestCase2;
|
| +import android.util.Log;
|
| +
|
| +import org.chromium.base.BaseChromiumApplication;
|
| +import org.chromium.base.CommandLine;
|
| +import org.chromium.base.test.util.CommandLineFlags;
|
| +
|
| +import java.lang.reflect.AnnotatedElement;
|
| +import java.lang.reflect.Method;
|
| +import java.util.Arrays;
|
| +import java.util.HashSet;
|
| +import java.util.List;
|
| +import java.util.Set;
|
| +
|
| +/**
|
| + * Base class for all Activity-based Instrumentation tests.
|
| + *
|
| + * @param <T> The Activity type.
|
| + */
|
| +public class BaseActivityInstrumentationTestCase<T extends Activity>
|
| + extends ActivityInstrumentationTestCase2<T> {
|
| +
|
| + private static final String TAG = "BaseActivityInstrumentationTestCase";
|
| +
|
| + private static final int SLEEP_INTERVAL = 50; // milliseconds
|
| + private static final int WAIT_DURATION = 5000; // milliseconds
|
| +
|
| + /**
|
| + * Creates a instance for running tests against an Activity of the given class.
|
| + *
|
| + * @param activityClass The type of activity that will be tested.
|
| + */
|
| + public BaseActivityInstrumentationTestCase(Class<T> activityClass) {
|
| + super(activityClass);
|
| + }
|
| +
|
| + /**
|
| + * Sets up the CommandLine with the appropriate flags.
|
| + *
|
| + * This will add the difference of the sets of flags specified by {@link CommandLineFlags.Add}
|
| + * and {@link CommandLineFlags.Remove} to the {@link org.chromium.base.CommandLine}. Note that
|
| + * trying to remove a flag set externally, i.e. by the command-line flags file, will not work.
|
| + */
|
| + @Override
|
| + protected void setUp() throws Exception {
|
| + super.setUp();
|
| +
|
| + CommandLine.reset();
|
| + Context targetContext = getTargetContext();
|
| + assertNotNull("Unable to get a non-null target context.", targetContext);
|
| +
|
| + BaseChromiumApplication.initCommandLine(targetContext);
|
| + Set<String> flags = getFlags(getClass().getMethod(getName()));
|
| + for (String flag : flags) {
|
| + CommandLine.getInstance().appendSwitch(flag);
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Gets the target context.
|
| + *
|
| + * On older versions of Android, getTargetContext() may initially return null, so we have to
|
| + * wait for it to become available.
|
| + *
|
| + * @return The target {@link android.content.Context} if available; null otherwise.
|
| + */
|
| + private Context getTargetContext() {
|
| + Context targetContext = getInstrumentation().getTargetContext();
|
| + try {
|
| + long startTime = SystemClock.uptimeMillis();
|
| + // TODO(jbudorick): Convert this to CriteriaHelper once that moves to base/.
|
| + while (targetContext == null
|
| + && SystemClock.uptimeMillis() - startTime < WAIT_DURATION) {
|
| + Thread.sleep(SLEEP_INTERVAL);
|
| + targetContext = getInstrumentation().getTargetContext();
|
| + }
|
| + } catch (InterruptedException e) {
|
| + Log.e(TAG, "Interrupted while attempting to initialize the command line.");
|
| + }
|
| + return targetContext;
|
| + }
|
| +
|
| + private static Set<String> getFlags(AnnotatedElement element) {
|
| + AnnotatedElement parent = (element instanceof Method)
|
| + ? ((Method) element).getDeclaringClass()
|
| + : ((Class) element).getSuperclass();
|
| + Set<String> flags = (parent == null) ? new HashSet<String>() : getFlags(parent);
|
| +
|
| + if (element.isAnnotationPresent(CommandLineFlags.Add.class)) {
|
| + flags.addAll(
|
| + Arrays.asList(element.getAnnotation(CommandLineFlags.Add.class).value()));
|
| + }
|
| +
|
| + if (element.isAnnotationPresent(CommandLineFlags.Remove.class)) {
|
| + List<String> flagsToRemove =
|
| + Arrays.asList(element.getAnnotation(CommandLineFlags.Remove.class).value());
|
| + for (String flagToRemove : flagsToRemove) {
|
| + // If your test fails here, you have tried to remove a command-line flag via
|
| + // CommandLineFlags.Remove that was loaded into CommandLine via something other
|
| + // than CommandLineFlags.Add (probably the command-line flag file).
|
| + assertFalse("Unable to remove command-line flag \"" + flagToRemove + "\".",
|
| + CommandLine.getInstance().hasSwitch(flagToRemove));
|
| + }
|
| + flags.removeAll(flagsToRemove);
|
| + }
|
| +
|
| + return flags;
|
| + }
|
| +}
|
|
|