Chromium Code Reviews| Index: testing/android/java/src/org/chromium/testing/local/JunitTestMain.java |
| diff --git a/testing/android/java/src/org/chromium/testing/local/JunitTestMain.java b/testing/android/java/src/org/chromium/testing/local/JunitTestMain.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..d163347adb2deec5a8a1dc8063df350d2a508491 |
| --- /dev/null |
| +++ b/testing/android/java/src/org/chromium/testing/local/JunitTestMain.java |
| @@ -0,0 +1,90 @@ |
| +// Copyright 2014 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.testing.local; |
| + |
| +import org.junit.runner.JUnitCore; |
| +import org.junit.runner.Request; |
| +import org.junit.runner.RunWith; |
| + |
| +import java.io.IOException; |
| +import java.util.Enumeration; |
| +import java.util.LinkedList; |
| +import java.util.jar.JarEntry; |
| +import java.util.jar.JarFile; |
| + |
| +/** |
| + * Runs tests based on JUnit from the classpath on the host JVM based on the |
| + * provided filter configurations. |
| + */ |
| +public final class JunitTestMain { |
| + |
| + private static final String CLASS_FILE_EXT = ".class"; |
| + |
| + private JunitTestMain() { |
| + } |
| + |
| + /** |
| + * Finds all classes on the class path annotated with RunWith. |
| + */ |
| + public static Class[] findClassesFromClasspath() { |
| + String[] jarPaths = System.getProperty("java.class.path").split(":"); |
| + LinkedList<Class> classes = new LinkedList<Class>(); |
| + for (String jp : jarPaths) { |
| + try { |
| + JarFile jf = new JarFile(jp); |
| + for (Enumeration<JarEntry> eje = jf.entries(); eje.hasMoreElements();) { |
| + JarEntry je = eje.nextElement(); |
| + String cn = je.getName(); |
| + if (!cn.endsWith(CLASS_FILE_EXT) || cn.indexOf('$') != -1) { |
| + continue; |
| + } |
| + cn = cn.substring(0, cn.length() - CLASS_FILE_EXT.length()).replace('/', '.'); |
| + Class<?> c = classOrNull(cn); |
| + if (c != null && c.isAnnotationPresent(RunWith.class)) { |
| + classes.push(c); |
| + } |
| + } |
| + } catch (IOException e) { |
| + System.err.println("Error while reading classes from " + jp); |
| + } |
| + } |
| + return classes.toArray(new Class[classes.size()]); |
| + } |
| + |
| + private static Class<?> classOrNull(String className) { |
| + try { |
| + return Class.forName(className); |
| + } catch (ClassNotFoundException e) { |
| + System.err.println("Class not found: " + className); |
| + } catch (NoClassDefFoundError e) { |
| + System.err.println("Class definition not found: " + className); |
| + } catch (Exception e) { |
| + System.err.println("Other exception while reading class: " + className); |
| + } |
| + return null; |
| + } |
| + |
| + public static void main(String[] args) throws ClassNotFoundException { |
|
nyquist
2014/09/19 22:21:45
Is ClassNotFoundException still thrown?
jbudorick
2014/09/20 00:11:29
Nope. Removed.
|
| + JunitTestArgParser parser = JunitTestArgParser.parse(args); |
| + |
| + Class[] classes = findClassesFromClasspath(); |
|
nyquist
2014/09/19 22:21:45
I don't think you use these until you call Request
jbudorick
2014/09/20 00:11:29
Done.
|
| + JUnitCore core = new JUnitCore(); |
| + GtestLogger logger = new GtestLogger(System.out); |
| + core.addListener(new GtestListener(logger)); |
| + Request testRequest = Request.classes(new GtestComputer(logger), classes); |
| + for (String packageFilter : parser.getPackageFilters()) { |
| + testRequest = testRequest.filterWith(new PackageFilter(packageFilter)); |
| + } |
| + for (Class<?> runnerFilter : parser.getRunnerFilters()) { |
| + testRequest = testRequest.filterWith(new RunnerFilter(runnerFilter)); |
| + } |
| + for (String gtestFilter : parser.getGtestFilters()) { |
| + testRequest = testRequest.filterWith(new GtestFilter(gtestFilter)); |
| + } |
| + System.exit(core.run(testRequest).wasSuccessful() ? 0 : 1); |
| + } |
| + |
| +} |
| + |