blob: 31e22f6d661fdd83e317098101921ce3eb5ef788 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 Lars Vogel and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Lars Vogel - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.tests.releng;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.Platform;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.tests.harness.util.TestRunLogUtil;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestWatcher;
import org.osgi.framework.Bundle;
import org.osgi.framework.FrameworkUtil;
/**
* Tests to ensure the correct bundles are activated. There are two reasons why
* a bundle is activated:
*
* - a plugin contributes OSGi services - a plugin contains an activator
*
* Additional plug-ins with activators should be avoided as they can slow down
* the startup of the Eclipse IDE Additional plug-ins provided OSGi services is
* desired as the OSGi framework initializes these services asynchronously
*
* @since 3.1
*/
public class PluginActivationTests {
@Rule
public TestWatcher LOG_TESTRUN = TestRunLogUtil.LOG_TESTRUN;
private static String[] NOT_ACTIVE_BUNDLES = new String[] {
"org.apache.xerces",
"com.jcraft.jsch",
"javax.servlet",
"javax.servlet.jsp",
"org.apache.ant",
"org.apache.commons.logging",
"org.apache.lucene",
"org.eclipse.ant.core",
"org.eclipse.ant.ui",
"org.eclipse.core.commands",
"org.eclipse.core.filesystem.win32.x86",
"org.eclipse.core.resources.compatibility",
"org.eclipse.core.resources.win32",
"org.eclipse.equinox.http.jetty",
"org.eclipse.equinox.http.registry",
"org.eclipse.equinox.http.servlet",
"org.eclipse.equinox.jsp.jasper",
"org.eclipse.equinox.jsp.jasper.registry",
"org.eclipse.help.base",
"org.eclipse.help.ui",
"org.eclipse.help.webapp",
"org.eclipse.jface.databinding",
"org.eclipse.jface.text",
"org.eclipse.osgi.services",
"org.eclipse.platform.doc.isv",
"org.eclipse.platform.doc.user",
"org.eclipse.sdk",
"org.eclipse.sdk.tests",
"org.eclipse.search",
"org.eclipse.swt",
"org.eclipse.swt.win32.win32.x86",
"org.eclipse.test.performance",
"org.eclipse.test.performance.ui",
"org.eclipse.test.performance.win32",
"org.eclipse.text",
"org.eclipse.text.tests",
"org.eclipse.ui.cheatsheets",
"org.eclipse.ui.console",
"org.eclipse.ui.editors.tests",
"org.eclipse.ui.views.properties.tabbed",
"org.eclipse.ui.win32",
"org.eclipse.ui.workbench.compatibility",
"org.eclipse.update.ui",
"org.junit",
"org.eclipse.core.databinding.beans",
"org.eclipse.equinox.launcher",
"org.eclipse.equinox.launcher.win32.win32.x86",
"org.eclipse.help.appserver",
"org.eclipse.jdt.apt.pluggable.core",
"org.eclipse.jsch.ui",
"org.eclipse.osgi.util",
"org.eclipse.platform",
"org.eclipse.rcp",
"org.eclipse.ui.browser"
};
private static String[] ACTIVE_BUNDLES = new String[] {
"org.eclipse.osgi",
"org.eclipse.equinox.simpleconfigurator",
"com.ibm.icu",
"org.apache.felix.gogo.command",
"org.apache.felix.gogo.runtime",
"org.apache.felix.gogo.shell",
"org.apache.felix.scr",
"org.eclipse.compare",
"org.eclipse.compare.core",
"org.eclipse.core.contenttype",
"org.eclipse.core.expressions",
"org.eclipse.core.filebuffers",
"org.eclipse.core.filesystem",
"org.eclipse.core.jobs",
"org.eclipse.core.net",
"org.eclipse.core.resources",
"org.eclipse.core.runtime",
"org.eclipse.debug.core",
"org.eclipse.e4.core.contexts",
"org.eclipse.e4.core.di",
"org.eclipse.e4.core.di.extensions",
"org.eclipse.e4.core.di.extensions.supplier",
"org.eclipse.e4.core.services",
"org.eclipse.e4.demo.contacts",
"org.eclipse.e4.ui.bindings",
"org.eclipse.e4.ui.css.swt",
"org.eclipse.e4.ui.css.swt.theme",
"org.eclipse.e4.ui.di",
"org.eclipse.e4.ui.model.workbench",
"org.eclipse.e4.ui.progress",
"org.eclipse.e4.ui.services",
"org.eclipse.e4.ui.workbench",
"org.eclipse.e4.ui.workbench.swt",
"org.eclipse.emf.common",
"org.eclipse.emf.ecore",
"org.eclipse.emf.ecore.xmi",
"org.eclipse.equinox.app",
"org.eclipse.equinox.common",
"org.eclipse.ui.cheatsheets",
"org.eclipse.equinox.console",
"org.eclipse.equinox.ds",
"org.eclipse.equinox.event",
"org.eclipse.equinox.preferences",
"org.eclipse.equinox.registry",
"org.eclipse.equinox.security",
"org.eclipse.help",
"org.eclipse.jgit",
"org.eclipse.jsch.core",
"org.eclipse.ui",
"org.eclipse.ui.editors",
"org.eclipse.ui.examples.contributions",
"org.eclipse.ui.ide",
"org.eclipse.ui.ide.application",
"org.eclipse.ui.intro",
"org.eclipse.ui.intro.universal",
"org.eclipse.ui.monitoring",
"org.eclipse.ui.navigator",
"org.eclipse.ui.navigator.resources",
"org.eclipse.ui.net",
"org.eclipse.ui.tests",
"org.eclipse.ui.tests.harness",
"org.eclipse.ui.themes",
"org.eclipse.ui.views.log",
"org.eclipse.ui.workbench",
"org.eclipse.ui.workbench.texteditor",
"org.hamcrest.core"
};
@Before
public void setUpTest() {
/*
* Since https://bugs.eclipse.org/484795 in EGit 4.2,
* org.eclipse.egit.ui/plugin.xml contributes: <extension
* point="org.eclipse.ui.services"> <sourceProvider
* provider="org.eclipse.egit.ui.internal.selection.RepositorySourceProvider">
* ... This activates the EGit UI bundle very early. Because of that, EGit's
* org.eclipse.egit.ui.team.MergeTool command's handler class is loaded, which
* in turn activates the org.eclipse.compare bundle on startup.
*
* org.eclipse.pde.ui also contributes a sourceProvider, that's why we don't
* test for it...
*
* Workaround is to remove org.eclipse.compare if EGit is present:
*/
if (Platform.getBundle("org.eclipse.egit.ui") != null) {
addLoadedPlugIns("org.eclipse.compare");
}
// enforce to show certain views to trigger plug-in activation
// are used
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
try {
window.getActivePage().showView("org.eclipse.ui.navigator.ProjectExplorer");
window.getActivePage().showView("org.eclipse.ui.views.PropertySheet");
} catch (PartInitException e) {
e.printStackTrace();
}
}
/**
* If a test suite uses this test and has other tests that cause plug-ins to be
* loaded then those need to be indicated here.
*
* @param loadedPlugins
* plug-ins that are additionally loaded by the caller
* @since 3.5
*/
public static void addLoadedPlugIns(String... loadedPlugins) {
Assert.isLegal(loadedPlugins != null);
List<String> l = new ArrayList<>(Arrays.asList(NOT_ACTIVE_BUNDLES));
l.removeAll(Arrays.asList(loadedPlugins));
NOT_ACTIVE_BUNDLES = l.toArray(new String[0]);
}
/**
* For debugging purposes
*
* @param active
* defines if method should print the active or the not not active
*/
public void printPluginStatus(boolean active) {
Bundle bundle = FrameworkUtil.getBundle(PluginActivationTests.class);
Bundle[] bundles = bundle.getBundleContext().getBundles();
System.out.println("Started printPluginStatus\n. Active status: " + active);
for (Bundle b : bundles) {
if (!active) {
if (b.getState() != Bundle.ACTIVE) {
System.out.println(b.getSymbolicName());
}
} else if (b.getState() == Bundle.ACTIVE) {
System.out.println(b.getSymbolicName());
}
}
System.out.println("Finished printPluginStatus\n");
}
/**
* Only plug-ins which provides OSGi services should be active.
*
* Also plug-ins with an activator must be activated but additional activators
* should be avoided as the slow down the startup of Eclipse
*
*/
@Test
@Ignore("See Bug 516743")
public void pluginsWithoutOSGiServiceOrActivatorShouldNotActive() {
StringBuilder buf = new StringBuilder();
for (String element : NOT_ACTIVE_BUNDLES) {
Bundle bundle = Platform.getBundle(element);
if (bundle == null) {
// // log bundles that cannot be found:
// buf.append("- not found: ");
// buf.append(NOT_ACTIVE_BUNDLES[i]);
// buf.append('\n');
} else if (bundle.getState() == Bundle.ACTIVE) {
buf.append("- ");
buf.append(element);
buf.append('\n');
}
}
// add some debug output
if (buf.length() > 0) {
printPluginStatus(true);
}
assertEquals("Unexpected bundles in status active:\n" + buf, 0, buf.length());
}
/**
* As the number of active plug-ins with an activator slow down the start of
* Eclipse, we should avoid increasing them.
*
* If a bundle provides OSGi services (without an activator), this is a desired
* situation. If the test is failing due to such a situation, add the
* corresponding bundle to this list.
*
* Equinox also (seems to activates plug-ins which set the singleton:=true. Not
* sure if that is a bug or desired
*
* Also plug-ins with an activator must be activated but additional activators
* should be avoided as the slow down the startup of Eclipse
*
*/
@Test
@Ignore("See Bug 516743")
public void activePluginsShouldNotIncrease() {
printPluginStatus(true);
StringBuilder buf = new StringBuilder();
for (String element : ACTIVE_BUNDLES) {
Bundle bundle = Platform.getBundle(element);
if (bundle == null) {
// // log bundles that cannot be found:
// buf.append("- not found: ");
// buf.append(NOT_ACTIVE_BUNDLES[i]);
// buf.append('\n');
} else if (bundle.getState() != Bundle.ACTIVE) {
buf.append("- ");
buf.append(element);
buf.append('\n');
}
}
// add some debug output
if (buf.length() > 0) {
printPluginStatus(true);
}
assertEquals("Bundles not active which used to be active:\n" + buf, 0, buf.length());
}
}