001: /*******************************************************************************
002: * Copyright (c) 2003, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.pde.internal.junit.runtime;
011:
012: import java.io.IOException;
013: import java.net.URL;
014: import java.util.Enumeration;
015: import java.util.Locale;
016:
017: import org.eclipse.core.runtime.Platform;
018: import org.eclipse.jdt.internal.junit.runner.RemoteTestRunner;
019: import org.osgi.framework.Bundle;
020:
021: /**
022: * Runs JUnit tests contained inside a plugin.
023: */
024: public class RemotePluginTestRunner extends RemoteTestRunner {
025:
026: private String fTestPluginName;
027: private ClassLoader fLoaderClassLoader;
028:
029: class BundleClassLoader extends ClassLoader {
030: private Bundle bundle;
031:
032: public BundleClassLoader(Bundle target) {
033: this .bundle = target;
034: }
035:
036: protected Class findClass(String name)
037: throws ClassNotFoundException {
038: return bundle.loadClass(name);
039: }
040:
041: protected URL findResource(String name) {
042: return bundle.getResource(name);
043: }
044:
045: protected Enumeration findResources(String name)
046: throws IOException {
047: return bundle.getResources(name);
048: }
049: }
050:
051: /**
052: * The main entry point. Supported arguments in addition
053: * to the ones supported by RemoteTestRunner:
054: * <pre>
055: * -testpluginname: the name of the plugin containing the tests.
056: * </pre>
057: * @see RemoteTestRunner
058: */
059:
060: public static void main(String[] args) {
061: RemotePluginTestRunner testRunner = new RemotePluginTestRunner();
062: testRunner.init(args);
063: testRunner.run();
064: }
065:
066: /**
067: * Returns the Plugin class loader of the plugin containing the test.
068: * @see RemoteTestRunner#getTestClassLoader()
069: */
070: protected ClassLoader getTestClassLoader() {
071: final String pluginId = fTestPluginName;
072: return getClassLoader(pluginId);
073: }
074:
075: public ClassLoader getClassLoader(final String pluginId) {
076: Bundle bundle = Platform.getBundle(pluginId);
077: if (bundle == null)
078: throw new IllegalArgumentException(
079: "No Classloader found for plug-in " + pluginId); //$NON-NLS-1$
080: return new BundleClassLoader(bundle);
081: }
082:
083: public void init(String[] args) {
084: readPluginArgs(args);
085: defaultInit(args);
086: }
087:
088: public void readPluginArgs(String[] args) {
089: for (int i = 0; i < args.length; i++) {
090: if (isFlag(args, i, "-testpluginname")) //$NON-NLS-1$
091: fTestPluginName = args[i + 1];
092:
093: if (isFlag(args, i, "-loaderpluginname")) //$NON-NLS-1$
094: fLoaderClassLoader = getClassLoader(args[i + 1]);
095: }
096:
097: if (fTestPluginName == null)
098: throw new IllegalArgumentException(
099: "Parameter -testpluginnname not specified."); //$NON-NLS-1$
100:
101: if (fLoaderClassLoader == null)
102: fLoaderClassLoader = getClass().getClassLoader();
103: }
104:
105: protected Class loadTestLoaderClass(String className)
106: throws ClassNotFoundException {
107: return fLoaderClassLoader.loadClass(className);
108: }
109:
110: private boolean isFlag(String[] args, int i, final String wantedFlag) {
111: String lowerCase = args[i].toLowerCase(Locale.ENGLISH);
112: return lowerCase.equals(wantedFlag) && i < args.length - 1;
113: }
114: }
|