blob: 4cbfee08faeab76413560bf7530293175d494f36 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.core.tests.runtime;
import junit.framework.*;
import org.eclipse.core.internal.registry.*;
import org.eclipse.core.runtime.*;
/**
* Tests the notification mechanism for registry changes.
*/
public class IRegistryChangeEventTest extends TestCase {
public IRegistryChangeEventTest(String name) {
super(name);
}
protected void setUp() throws Exception {
super.setUp();
}
/**
* Allows test cases to wait for event notification so they can make assertions on the event.
*/
class RegistryChangeListener implements IRegistryChangeListener {
private IRegistryChangeEvent event;
public synchronized void registryChanged(IRegistryChangeEvent newEvent) {
if (this.event != null)
return;
this.event = newEvent;
notify();
}
public synchronized IRegistryChangeEvent waitSignal(long timeout) {
IRegistryChangeEvent result = event;
if (event != null) {
event = null;
return result;
}
try {
wait(timeout);
} catch (InterruptedException e) {
// who cares?
}
result = event;
event = null;
return result;
}
}
public void testAddSinglePluginWithExtensionAndExtensionPoint() {
ExtensionRegistry registry = new ExtensionRegistry();
final Namespace pluginA = new Namespace();
pluginA.setUniqueIdentifier("a");
final ExtensionPoint xp1 = new ExtensionPoint();
xp1.setSimpleIdentifier("xp1");
final Extension ext1 = new Extension();
ext1.setExtensionPointIdentifier("a.xp1");
ext1.setSimpleIdentifier("ext1");
pluginA.setExtensionPoints(new ExtensionPoint[] {xp1});
xp1.setParent(pluginA);
pluginA.setExtensions(new Extension[] {ext1});
ext1.setParent(pluginA);
RegistryChangeListener listener = new RegistryChangeListener();
try {
registry.addRegistryChangeListener(listener);
registry.add(pluginA);
IRegistryChangeEvent event = listener.waitSignal(10000);
assertNotNull("1.0", event);
assertEquals("1.1", 1, event.getExtensionDeltas().length);
assertEquals("1.2", 1, event.getExtensionDeltas(pluginA.getUniqueIdentifier()).length);
IExtensionDelta[] extensionDeltas = event.getExtensionDeltas(pluginA.getUniqueIdentifier());
assertEquals("1.3", 1, extensionDeltas.length);
assertTrue("1.4", extensionDeltas[0].getExtension() == ext1);
assertTrue("1.5", extensionDeltas[0].getExtensionPoint() == xp1);
assertEquals("1.6", IExtensionDelta.ADDED, extensionDeltas[0].getKind());
} finally {
registry.removeRegistryChangeListener(listener);
}
}
public void testAddTwoPluginsExtensionPointProviderFirst() {
ExtensionRegistry registry = new ExtensionRegistry();
final Namespace pluginA = new Namespace();
pluginA.setUniqueIdentifier("a");
final ExtensionPoint xp1 = new ExtensionPoint();
xp1.setSimpleIdentifier("xp1");
pluginA.setExtensionPoints(new ExtensionPoint[] {xp1});
xp1.setParent(pluginA);
final Namespace pluginB = new Namespace();
pluginB.setUniqueIdentifier("b");
final Extension ext1 = new Extension();
ext1.setExtensionPointIdentifier("a.xp1");
ext1.setSimpleIdentifier("ext1");
pluginB.setExtensions(new Extension[] {ext1});
ext1.setParent(pluginB);
RegistryChangeListener listener = new RegistryChangeListener();
try {
registry.addRegistryChangeListener(listener);
registry.add(pluginA);
assertNull("0.9", listener.waitSignal(500));
registry.add(pluginB);
IRegistryChangeEvent event = listener.waitSignal(10000);
assertNotNull("1.0", event);
assertEquals("1.1", 1, event.getExtensionDeltas().length);
assertEquals("1.2", 1, event.getExtensionDeltas(pluginA.getUniqueIdentifier()).length);
assertEquals("1.2a", 0, event.getExtensionDeltas(pluginB.getUniqueIdentifier()).length);
IExtensionDelta[] extensionDeltas = event.getExtensionDeltas(pluginA.getUniqueIdentifier());
assertEquals("1.3", 1, extensionDeltas.length);
assertTrue("1.4", extensionDeltas[0].getExtension() == ext1);
assertTrue("1.5", extensionDeltas[0].getExtensionPoint() == xp1);
assertEquals("1.6", IExtensionDelta.ADDED, extensionDeltas[0].getKind());
} finally {
registry.removeRegistryChangeListener(listener);
}
}
public void testAddTwoPluginsExtensionProviderFirst() {
ExtensionRegistry registry = new ExtensionRegistry();
final Namespace pluginA = new Namespace();
pluginA.setUniqueIdentifier("a");
final ExtensionPoint xp1 = new ExtensionPoint();
xp1.setSimpleIdentifier("xp1");
pluginA.setExtensionPoints(new ExtensionPoint[] {xp1});
xp1.setParent(pluginA);
final Namespace pluginB = new Namespace();
pluginB.setUniqueIdentifier("b");
final Extension ext1 = new Extension();
ext1.setExtensionPointIdentifier("a.xp1");
ext1.setSimpleIdentifier("ext1");
pluginB.setExtensions(new Extension[] {ext1});
ext1.setParent(pluginB);
RegistryChangeListener listener = new RegistryChangeListener();
try {
registry.addRegistryChangeListener(listener);
registry.add(pluginB);
assertNull("0.9", listener.waitSignal(500));
registry.add(pluginA);
IRegistryChangeEvent event = listener.waitSignal(10000);
assertNotNull("1.0", event);
assertEquals("1.1", 1, event.getExtensionDeltas().length);
assertEquals("1.2", 1, event.getExtensionDeltas(pluginA.getUniqueIdentifier()).length);
assertEquals("1.2a", 0, event.getExtensionDeltas(pluginB.getUniqueIdentifier()).length);
IExtensionDelta[] extensionDeltas = event.getExtensionDeltas(pluginA.getUniqueIdentifier());
assertEquals("1.3", 1, extensionDeltas.length);
assertTrue("1.4", extensionDeltas[0].getExtension() == ext1);
assertTrue("1.5", extensionDeltas[0].getExtensionPoint() == xp1);
assertEquals("1.6", IExtensionDelta.ADDED, extensionDeltas[0].getKind());
} finally {
registry.removeRegistryChangeListener(listener);
}
}
public void testRemoveSinglePluginWithExtensionAndExtensionPoint() {
ExtensionRegistry registry = new ExtensionRegistry();
final Namespace pluginA = new Namespace();
pluginA.setUniqueIdentifier("a");
final ExtensionPoint xp1 = new ExtensionPoint();
xp1.setSimpleIdentifier("xp1");
final Extension ext1 = new Extension();
ext1.setExtensionPointIdentifier("a.xp1");
ext1.setSimpleIdentifier("ext1");
pluginA.setExtensionPoints(new ExtensionPoint[] {xp1});
xp1.setParent(pluginA);
pluginA.setExtensions(new Extension[] {ext1});
ext1.setParent(pluginA);
RegistryChangeListener listener = new RegistryChangeListener();
registry.add(pluginA);
try {
registry.addRegistryChangeListener(listener);
registry.remove(pluginA.getUniqueIdentifier(), pluginA.getId());
IRegistryChangeEvent event = listener.waitSignal(10000);
assertNotNull("1.0", event);
assertEquals("1.1", 1, event.getExtensionDeltas().length);
assertEquals("1.2", 1, event.getExtensionDeltas(pluginA.getUniqueIdentifier()).length);
IExtensionDelta[] extensionDeltas = event.getExtensionDeltas(pluginA.getUniqueIdentifier());
assertEquals("1.3", 1, extensionDeltas.length);
assertTrue("1.4", extensionDeltas[0].getExtension() == ext1);
assertTrue("1.5", extensionDeltas[0].getExtensionPoint() == xp1);
assertEquals("1.6", IExtensionDelta.REMOVED, extensionDeltas[0].getKind());
} finally {
registry.removeRegistryChangeListener(listener);
}
}
public void testRemoveTwoPluginsExtensionProviderFirst() {
ExtensionRegistry registry = new ExtensionRegistry();
final Namespace pluginA = new Namespace();
pluginA.setUniqueIdentifier("a");
final ExtensionPoint xp1 = new ExtensionPoint();
xp1.setSimpleIdentifier("xp1");
pluginA.setExtensionPoints(new ExtensionPoint[] {xp1});
xp1.setParent(pluginA);
final Namespace pluginB = new Namespace();
pluginB.setUniqueIdentifier("b");
final Extension ext1 = new Extension();
ext1.setExtensionPointIdentifier("a.xp1");
ext1.setSimpleIdentifier("ext1");
pluginB.setExtensions(new Extension[] {ext1});
ext1.setParent(pluginB);
RegistryChangeListener listener = new RegistryChangeListener();
registry.add(pluginA);
registry.add(pluginB);
try {
registry.addRegistryChangeListener(listener);
registry.remove(pluginB.getUniqueIdentifier(), pluginB.getId());
IRegistryChangeEvent event = listener.waitSignal(10000);
assertNotNull("1.0", event);
assertEquals("1.1", 1, event.getExtensionDeltas().length);
assertEquals("1.2", 1, event.getExtensionDeltas(pluginA.getUniqueIdentifier()).length);
assertEquals("1.2a", 0, event.getExtensionDeltas(pluginB.getUniqueIdentifier()).length);
IExtensionDelta[] extensionDeltas = event.getExtensionDeltas(pluginA.getUniqueIdentifier());
assertEquals("1.3", 1, extensionDeltas.length);
assertTrue("1.4", extensionDeltas[0].getExtension() == ext1);
assertTrue("1.5", extensionDeltas[0].getExtensionPoint() == xp1);
assertEquals("1.6", IExtensionDelta.REMOVED, extensionDeltas[0].getKind());
registry.remove(pluginA.getUniqueIdentifier(), pluginA.getId());
assertNull("1.7", listener.waitSignal(500));
} finally {
registry.removeRegistryChangeListener(listener);
}
}
public void testRemoveTwoPluginsExtensionPointProviderFirst() {
ExtensionRegistry registry = new ExtensionRegistry();
final Namespace pluginA = new Namespace();
pluginA.setUniqueIdentifier("a");
final ExtensionPoint xp1 = new ExtensionPoint();
xp1.setSimpleIdentifier("xp1");
pluginA.setExtensionPoints(new ExtensionPoint[] {xp1});
xp1.setParent(pluginA);
final Namespace pluginB = new Namespace();
pluginB.setUniqueIdentifier("b");
final Extension ext1 = new Extension();
ext1.setExtensionPointIdentifier("a.xp1");
ext1.setSimpleIdentifier("ext1");
pluginB.setExtensions(new Extension[] {ext1});
ext1.setParent(pluginB);
RegistryChangeListener listener = new RegistryChangeListener();
registry.add(pluginA);
registry.add(pluginB);
try {
registry.addRegistryChangeListener(listener);
registry.remove(pluginB.getUniqueIdentifier(), pluginA.getId());
IRegistryChangeEvent event = listener.waitSignal(10000);
assertNotNull("1.0", event);
assertEquals("1.1", 1, event.getExtensionDeltas().length);
assertEquals("1.2", 1, event.getExtensionDeltas(pluginA.getUniqueIdentifier()).length);
assertEquals("1.2a", 0, event.getExtensionDeltas(pluginB.getUniqueIdentifier()).length);
IExtensionDelta[] extensionDeltas = event.getExtensionDeltas(pluginA.getUniqueIdentifier());
assertEquals("1.3", 1, extensionDeltas.length);
assertTrue("1.4", extensionDeltas[0].getExtension() == ext1);
assertTrue("1.5", extensionDeltas[0].getExtensionPoint() == xp1);
assertEquals("1.6", IExtensionDelta.REMOVED, extensionDeltas[0].getKind());
registry.remove(pluginA.getUniqueIdentifier(), pluginB.getId());
assertNull("1.7", listener.waitSignal(500));
} finally {
registry.removeRegistryChangeListener(listener);
}
}
public void testBug71826() {
ExtensionRegistry registry = new ExtensionRegistry();
// plugin A provides an extension point
final Namespace pluginA = new Namespace();
pluginA.setUniqueIdentifier("a");
final ExtensionPoint xp1 = new ExtensionPoint();
xp1.setSimpleIdentifier("xp1");
pluginA.setExtensionPoints(new ExtensionPoint[] {xp1});
xp1.setParent(pluginA);
// plugin B provides an extension to A's extension point
final Namespace pluginB = new Namespace();
pluginB.setUniqueIdentifier("b");
final Extension ext1 = new Extension();
ext1.setExtensionPointIdentifier("a.xp1");
ext1.setSimpleIdentifier("ext1");
pluginB.setExtensions(new Extension[] {ext1});
ext1.setParent(pluginB);
// fragment C has plugin A as host and also contributes an extension to its extension point
final Namespace fragmentC = new Namespace();
fragmentC.setUniqueIdentifier("c");
final Extension ext2 = new Extension();
ext2.setExtensionPointIdentifier("a.xp1");
ext2.setSimpleIdentifier("ext2");
fragmentC.setExtensions(new Extension[] {ext2});
ext2.setParent(fragmentC);
fragmentC.setHostIdentifier(pluginA.getUniqueIdentifier());
// if B and C were added to the registry before A, C's extension point would get lost.
registry.add(fragmentC);
registry.add(pluginB);
registry.add(pluginA);
// ensure all extensions are there
IExtensionPoint xp = registry.getExtensionPoint(xp1.getUniqueIdentifier());
assertNotNull("1.0", xp);
IExtension[] exts = xp.getExtensions();
assertEquals("1.1", 2, exts.length);
assertEquals("1.2", ext1, xp.getExtension(ext1.getUniqueIdentifier()));
assertEquals("1.3", ext2, xp.getExtension(ext2.getUniqueIdentifier()));
}
public static Test suite() {
return new TestSuite(IRegistryChangeEventTest.class);
}
}