| Index: base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java
 | 
| diff --git a/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java b/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java
 | 
| index a48c4ab71301190bef89adf33a2a056832068600..9ff1c3db4aad013c93e384c8cb0125d22b106894 100644
 | 
| --- a/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java
 | 
| +++ b/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java
 | 
| @@ -4,20 +4,33 @@
 | 
|  
 | 
|  package org.chromium.base.test;
 | 
|  
 | 
| +import android.app.Activity;
 | 
|  import android.app.Application;
 | 
| +import android.app.Instrumentation;
 | 
|  import android.content.Context;
 | 
| +import android.os.Bundle;
 | 
| +import android.support.test.internal.runner.RunnerArgs;
 | 
| +import android.support.test.internal.runner.TestExecutor;
 | 
| +import android.support.test.internal.runner.TestRequest;
 | 
| +import android.support.test.internal.runner.TestRequestBuilder;
 | 
|  import android.support.test.runner.AndroidJUnitRunner;
 | 
|  
 | 
| +import org.chromium.base.Log;
 | 
|  import org.chromium.base.multidex.ChromiumMultiDexInstaller;
 | 
|  
 | 
|  /**
 | 
| - * A custom AndroidJUnitRunner that supports multidex installer.
 | 
| + * A custom AndroidJUnitRunner that supports multidex installer and list out test information.
 | 
|   *
 | 
|   * This class is the equivalent of BaseChromiumInstrumentationTestRunner in JUnit3. Please
 | 
|   * beware that is this not a class runner. It is declared in test apk AndroidManifest.xml
 | 
|   * <instrumentation>
 | 
|   */
 | 
|  public class BaseChromiumAndroidJUnitRunner extends AndroidJUnitRunner {
 | 
| +    private Bundle mArguments;
 | 
| +    private static final String LIST_ALL_TESTS_FLAG =
 | 
| +            "org.chromium.base.test.BaseChromiumAndroidJUnitRunner.TestList";
 | 
| +    private static final String TAG = "BaseJUnitRunner";
 | 
| +
 | 
|      @Override
 | 
|      public Application newApplication(ClassLoader cl, String className, Context context)
 | 
|              throws ClassNotFoundException, IllegalAccessException, InstantiationException {
 | 
| @@ -26,4 +39,53 @@ public class BaseChromiumAndroidJUnitRunner extends AndroidJUnitRunner {
 | 
|          BaseChromiumRunnerCommon.reorderDexPathElements(cl, getContext(), getTargetContext());
 | 
|          return super.newApplication(cl, className, context);
 | 
|      }
 | 
| +
 | 
| +    @Override
 | 
| +    public void onCreate(Bundle arguments) {
 | 
| +        super.onCreate(arguments);
 | 
| +        mArguments = arguments;
 | 
| +    }
 | 
| +
 | 
| +    /**
 | 
| +     * Add TestListInstrumentationRunListener when argument ask the runner to list tests info.
 | 
| +     *
 | 
| +     * The running mechanism when argument has "listAllTests" is equivalent to that of
 | 
| +     * {@link android.support.test.runner.AndroidJUnitRunner#onStart()} except it adds
 | 
| +     * only TestListInstrumentationRunListener to monitor the tests.
 | 
| +     */
 | 
| +    @Override
 | 
| +    public void onStart() {
 | 
| +        if (mArguments.getString(LIST_ALL_TESTS_FLAG) != null) {
 | 
| +            listTests();
 | 
| +        } else {
 | 
| +            super.onStart();
 | 
| +        }
 | 
| +    }
 | 
| +
 | 
| +    private void listTests() {
 | 
| +        Bundle results = new Bundle();
 | 
| +        try {
 | 
| +            TestExecutor.Builder executorBuilder = new TestExecutor.Builder(this);
 | 
| +            executorBuilder.addRunListener(new TestListInstrumentationRunListener(
 | 
| +                    mArguments.getString(LIST_ALL_TESTS_FLAG)));
 | 
| +            TestRequest listTestRequest = createListTestRequest(mArguments);
 | 
| +            results = executorBuilder.build().execute(listTestRequest);
 | 
| +        } catch (RuntimeException e) {
 | 
| +            final String msg = "Fatal exception when running tests";
 | 
| +            Log.e(TAG, msg, e);
 | 
| +            // report the exception to instrumentation out
 | 
| +            results.putString(Instrumentation.REPORT_KEY_STREAMRESULT,
 | 
| +                    msg + "\n" + Log.getStackTraceString(e));
 | 
| +        }
 | 
| +        finish(Activity.RESULT_OK, results);
 | 
| +    }
 | 
| +
 | 
| +    private TestRequest createListTestRequest(Bundle arguments) {
 | 
| +        RunnerArgs runnerArgs =
 | 
| +                new RunnerArgs.Builder().fromManifest(this).fromBundle(arguments).build();
 | 
| +        TestRequestBuilder builder = new TestRequestBuilder(this, arguments);
 | 
| +        builder.addApkToScan(getContext().getPackageCodePath());
 | 
| +        builder.addFromRunnerArgs(runnerArgs);
 | 
| +        return builder.build();
 | 
| +    }
 | 
|  }
 | 
| 
 |