/******************************************************************************* * Copyright (c) 2003, 2006 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.swtbot.eclipse.core; import java.io.IOException; import java.net.URL; import java.util.Enumeration; import java.util.Locale; import org.eclipse.core.runtime.Platform; import org.eclipse.jdt.internal.junit.runner.RemoteTestRunner; import org.osgi.framework.Bundle; /** * Copied verbatim from PDE to remove PDE dependency. * Runs JUnit tests contained inside a plugin. */ @SuppressWarnings("all") public class RemotePluginTestRunner extends RemoteTestRunner { private String fTestPluginName; private ClassLoader fLoaderClassLoader; class BundleClassLoader extends ClassLoader { private Bundle bundle; public BundleClassLoader(Bundle target) { this.bundle = target; } protected Class findClass(String name) throws ClassNotFoundException { return bundle.loadClass(name); } protected URL findResource(String name) { return bundle.getResource(name); } protected Enumeration findResources(String name) throws IOException { return bundle.getResources(name); } } /** * The main entry point. Supported arguments in addition * to the ones supported by RemoteTestRunner: * <pre> * -testpluginname: the name of the plugin containing the tests. * </pre> * @see RemoteTestRunner */ public static void main(String[] args) { RemotePluginTestRunner testRunner = new RemotePluginTestRunner(); testRunner.init(args); testRunner.run(); } /** * Returns the Plugin class loader of the plugin containing the test. * @see RemoteTestRunner#getTestClassLoader() */ protected ClassLoader getTestClassLoader() { final String pluginId = fTestPluginName; return getClassLoader(pluginId); } public ClassLoader getClassLoader(final String pluginId) { Bundle bundle = Platform.getBundle(pluginId); if (bundle == null) throw new IllegalArgumentException("No Classloader found for plug-in " + pluginId); //$NON-NLS-1$ return new BundleClassLoader(bundle); } public void init(String[] args) { readPluginArgs(args); defaultInit(args); } public void readPluginArgs(String[] args) { for (int i = 0; i < args.length; i++) { if (isFlag(args, i, "-testpluginname")) //$NON-NLS-1$ fTestPluginName = args[i + 1]; if (isFlag(args, i, "-loaderpluginname")) //$NON-NLS-1$ fLoaderClassLoader = getClassLoader(args[i + 1]); } if (fTestPluginName == null) throw new IllegalArgumentException("Parameter -testpluginnname not specified."); //$NON-NLS-1$ if (fLoaderClassLoader == null) fLoaderClassLoader = getClass().getClassLoader(); } protected Class loadTestLoaderClass(String className) throws ClassNotFoundException { return fLoaderClassLoader.loadClass(className); } private boolean isFlag(String[] args, int i, final String wantedFlag) { String lowerCase = args[i].toLowerCase(Locale.ENGLISH); return lowerCase.equals(wantedFlag) && i < args.length - 1; } }