blob: 9438524ac3e745ea233db39b45342142269ecb18 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2015 EclipseSource 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:
* EclipseSource Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.internal.junit.runtime;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext;
import org.junit.Assert;
/**
* A Workbench that runs a test suite specified in the
* command line arguments.
*/
public class NonUIThreadTestApplication implements IApplication {
private static final String DEFAULT_HEADLESSAPP = "org.eclipse.pde.junit.runtime.coretestapplication"; //$NON-NLS-1$
protected IApplication fApplication;
protected Object fTestHarness;
@Override
public Object start(IApplicationContext context) throws Exception {
String[] args = (String[]) context.getArguments().get(IApplicationContext.APPLICATION_ARGS);
String appId = getApplicationToRun(args);
Object app = getApplication(appId);
Assert.assertNotNull(app);
if (!DEFAULT_HEADLESSAPP.equals(appId)) {
// this means we are running a different application, which potentially can be UI application;
// non-ui thread test app can also mean we are running UI tests but outside the UI thread;
// this is a pattern used by SWT bot and worked before; we continue to support this
// (see bug 340906 for details)
installPlatformUITestHarness();
}
return runApp(app, context, args);
}
protected Object runApp(Object app, IApplicationContext context, String[] args) throws Exception {
if (app instanceof IApplication) {
fApplication = (IApplication) app;
return fApplication.start(context);
}
return ((IPlatformRunnable) app).run(args);
}
/**
* the non-UI thread test application also supports launching headless applications;
* this may mean that no UI bundle will be available; thus, in order to not
* introduce any dependency on UI code we first attempt to get the harness via service.
* If that doesn't work, we use reflection to call the workbench code, but don't fail
* if Platform UI is not available.
*
* @throws Exception
*/
private void installPlatformUITestHarness() throws Exception {
Object testableObject = PDEJUnitRuntimePlugin.getDefault().getTestableObject();
if (testableObject == null) {
try {
Class<?> platformUIClass = Class.forName("org.eclipse.ui.PlatformUI", true, getClass().getClassLoader()); //$NON-NLS-1$
testableObject = platformUIClass.getMethod("getTestableObject").invoke(null); //$NON-NLS-1$
} catch (ClassNotFoundException e) {
// PlatformUI is not available
}
}
if (testableObject != null) {
fTestHarness = new PlatformUITestHarness(testableObject, true);
}
}
@Override
public void stop() {
if (fApplication != null)
fApplication.stop();
if (fTestHarness != null)
fTestHarness = null;
}
/*
* return the application to run, or null if not even the default application
* is found.
*/
private Object getApplication(String appId) throws CoreException {
// Find the name of the application as specified by the PDE JUnit launcher.
// If no application is specified, the 3.0 default workbench application
// is returned.
IExtension extension = Platform.getExtensionRegistry().getExtension(Platform.PI_RUNTIME, Platform.PT_APPLICATIONS, appId);
Assert.assertNotNull(extension);
// If the extension does not have the correct grammar, return null.
// Otherwise, return the application object.
IConfigurationElement[] elements = extension.getConfigurationElements();
if (elements.length > 0) {
IConfigurationElement[] runs = elements[0].getChildren("run"); //$NON-NLS-1$
if (runs.length > 0) {
Object runnable = runs[0].createExecutableExtension("class"); //$NON-NLS-1$
if (runnable instanceof IPlatformRunnable || runnable instanceof IApplication)
return runnable;
}
}
return null;
}
/*
* The -testApplication argument specifies the application to be run.
* If the PDE JUnit launcher did not set this argument, then return
* the name of the default application.
* In 3.0, the default is the "org.eclipse.ui.ide.worbench" application.
*
* see bug 228044
*
*/
private String getApplicationToRun(String[] args) {
for (int i = 0; i < args.length; i++) {
if (args[i].equals("-testApplication") && i < args.length - 1) //$NON-NLS-1$
return args[i + 1];
}
IProduct product = Platform.getProduct();
if (product != null)
return product.getApplication();
return getDefaultApplicationId();
}
protected String getDefaultApplicationId() {
return DEFAULT_HEADLESSAPP;
}
}