aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/EclipseTestCollector.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/EclipseTestCollector.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/EclipseTestCollector.java121
1 files changed, 121 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/EclipseTestCollector.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/EclipseTestCollector.java
new file mode 100644
index 000000000..6bbc955ee
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/EclipseTestCollector.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
+ *
+ * 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 com.android.ide.eclipse.tests;
+
+import org.eclipse.core.runtime.Plugin;
+
+import java.lang.reflect.Modifier;
+import java.net.URL;
+import java.util.Enumeration;
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Class for collecting all test cases in an eclipse plugin
+ *
+ */
+public class EclipseTestCollector {
+
+ /**
+ * Constructor
+ */
+ public EclipseTestCollector() {
+
+ }
+
+ /**
+ * Searches through given plugin, adding all TestCase classes to given suite
+ * @param suite - TestSuite to add to
+ * @param plugin - Plugin to search for tests
+ * @param expectedPackage - expected package for tests. Only test classes
+ * that start with this package name will be added to suite
+ */
+ @SuppressWarnings({"cast", "unchecked"})
+ public void addTestCases(TestSuite suite, Plugin plugin, String expectedPackage) {
+ if (plugin != null) {
+ Enumeration<?> entries = plugin.getBundle().findEntries("/", "*.class", true);
+
+ while (entries.hasMoreElements()) {
+ URL entry = (URL)entries.nextElement();
+ String filePath = entry.getPath().replace(".class", "");
+ try {
+ Class<?> testClass = getClass(filePath, expectedPackage);
+ if (isTestClass(testClass)) {
+ // In Eclipse 3.6 RCP Windows-x64, the signature has changed from
+ // addTestSuite(Class)
+ // to:
+ // addTestSuite(Class<? extends TestCase>)
+ // which is enough to create an error. To solve it, we cast into the
+ // generics expected by the JUnit framework used by 3.6 and suppress the
+ // warnings generated by the compiler under 3.5
+ suite.addTestSuite((Class<? extends TestCase>)testClass);
+ }
+ }
+ catch (ClassNotFoundException e) {
+ // ignore, this is not the class we're looking for
+ //sLogger.log(Level.INFO, "Could not load class " + filePath);
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns true if given class should be added to suite
+ */
+ protected boolean isTestClass(Class<?> testClass) {
+ return TestCase.class.isAssignableFrom(testClass) &&
+ Modifier.isPublic(testClass.getModifiers()) &&
+ hasPublicConstructor(testClass);
+ }
+
+ /**
+ * Returns true if given class has a public constructor
+ */
+ @SuppressWarnings({"unchecked", "cast"})
+ protected boolean hasPublicConstructor(Class<?> testClass) {
+ try {
+ // In Eclipse 3.6 RCP Windows-x64, the signature has changed from
+ // getTestConstructor(Class)
+ // to:
+ // getTestConstructor(Class<? extends TestCase>)
+ // which is enough to create an error. To solve it, we cast into the
+ // generics expected by the JUnit framework used by 3.6 and suppress the
+ // warnings generated by the compiler under 3.5
+ TestSuite.getTestConstructor((Class<? extends TestCase>) testClass);
+ } catch(NoSuchMethodException e) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Load the class given by the plugin aka bundle file path
+ * @param filePath - path of class in bundle
+ * @param expectedPackage - expected package of class
+ * @throws ClassNotFoundException
+ */
+ protected Class<?> getClass(String filePath, String expectedPackage) throws ClassNotFoundException {
+ String dotPath = filePath.replace('/', '.');
+ // remove the output folders, by finding where package name starts
+ int index = dotPath.indexOf(expectedPackage);
+ if (index == -1) {
+ throw new ClassNotFoundException();
+ }
+ String packagePath = dotPath.substring(index);
+ return Class.forName(packagePath);
+ }
+}