blob: b004e4efe837a5b2939283226aed937696eb0030 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2018 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.ui.tests.runtime;
import java.net.URISyntaxException;
import java.util.EventListener;
import junit.framework.TestCase;
import org.eclipse.core.runtime.*;
import org.eclipse.pde.internal.runtime.registry.model.*;
import org.eclipse.pde.internal.runtime.registry.model.Bundle;
import org.eclipse.pde.internal.runtime.registry.model.ServiceRegistration;
import org.eclipse.pde.ui.tests.PDETestsPlugin;
import org.osgi.framework.*;
public abstract class AbstractRegistryModelTest extends TestCase implements ModelChangeListener {
public static class MockFramework {
private EventListener listener;
public void createBundleEvent(int type, org.osgi.framework.Bundle bundle) {
assertTrue(listener instanceof BundleListener);
((BundleListener)listener).bundleChanged(new BundleEvent(type, bundle));
}
public void createRegistryAddedEvent(IExtension[] ext) {
assertTrue(listener instanceof IRegistryEventListener);
((IRegistryEventListener)listener).added(ext);
}
public void createRegistryRemovedEvent(IExtension[] ext) {
assertTrue(listener instanceof IRegistryEventListener);
((IRegistryEventListener)listener).removed(ext);
}
public void createRegistryAddedEvent(IExtensionPoint[] ext) {
assertTrue(listener instanceof IRegistryEventListener);
((IRegistryEventListener)listener).added(ext);
}
public void createRegistryRemovedEvent(IExtensionPoint[] ext) {
assertTrue(listener instanceof IRegistryEventListener);
((IRegistryEventListener)listener).removed(ext);
}
public void createServiceEvent(int type, ServiceReference<?> ref) {
assertTrue(listener instanceof ServiceListener);
((ServiceListener)listener).serviceChanged(new ServiceEvent(type, ref));
}
public void setListener(EventListener listener) {
this.listener = listener;
}
}
public static final String TEST_EXT_POINT = "org.eclipse.ui.views";
public static final String TEST_EXT_POINT_BUNDLE = "org.eclipse.ui";
protected MockFramework mockFramework = new MockFramework();
protected org.osgi.framework.Bundle testBundle;
protected ServiceReference<?> testServiceReference;
protected IExtensionPoint testExtPoint;
protected org.osgi.framework.Bundle testExtPointBundle;
protected RegistryModel model;
protected ModelChangeDelta[] deltas;
@Override
public void modelChanged(ModelChangeDelta[] deltas) {
this.deltas = deltas;
}
abstract protected RegistryModel createModel() throws URISyntaxException;
public AbstractRegistryModelTest() {
testBundle = PDETestsPlugin.getBundleContext().getBundle();
org.osgi.framework.ServiceRegistration<?> registration = PDETestsPlugin.getBundleContext()
.registerService(getClass().getName(), this, null);
testServiceReference = registration.getReference();
testExtPoint = Platform.getExtensionRegistry().getExtensionPoint(TEST_EXT_POINT);
testExtPointBundle = Platform.getBundle(TEST_EXT_POINT_BUNDLE);
}
@Override
protected void setUp() throws Exception {
model = createModel();
model.connect(new NullProgressMonitor(), false);
deltas = new ModelChangeDelta[0];
model.addModelChangeListener(this);
}
@Override
protected void tearDown() {
model.removeModelChangeListener(this);
model.disconnect();
}
/**
* Verifies that model provides correct list of installed bundles
*/
public void testInstalledBundles() {
org.osgi.framework.Bundle[] origBundles = PDETestsPlugin.getBundleContext().getBundles();
model.initialize(new NullProgressMonitor());
Bundle[] bundles = model.getBundles();
assertEquals(origBundles.length, bundles.length);
}
public void testBundleInstalled() {
mockFramework.createBundleEvent(BundleEvent.INSTALLED, testBundle);
assertEquals(1, deltas.length);
assertTrue(deltas[0].getModelObject() instanceof Bundle);
assertEquals(testBundle.getSymbolicName(), ((Bundle)deltas[0].getModelObject()).getSymbolicName());
assertEquals(ModelChangeDelta.ADDED, deltas[0].getFlag());
}
public void testBundleStartedEvent() {
mockFramework.createBundleEvent(BundleEvent.STARTED, testBundle);
assertEquals(1, deltas.length);
assertTrue(deltas[0].getModelObject() instanceof Bundle);
assertEquals(testBundle.getSymbolicName(), ((Bundle)deltas[0].getModelObject()).getSymbolicName());
assertEquals(ModelChangeDelta.STARTED, deltas[0].getFlag());
}
public void testBundleStoppedEvent() {
mockFramework.createBundleEvent(BundleEvent.STOPPED, testBundle);
assertEquals(1, deltas.length);
assertTrue(deltas[0].getModelObject() instanceof Bundle);
assertEquals(testBundle.getSymbolicName(), ((Bundle)deltas[0].getModelObject()).getSymbolicName());
assertEquals(ModelChangeDelta.STOPPED, deltas[0].getFlag());
}
public void testBundleUpdatedEvent() {
mockFramework.createBundleEvent(BundleEvent.UPDATED, testBundle);
assertEquals(1, deltas.length);
assertTrue(deltas[0].getModelObject() instanceof Bundle);
assertEquals(testBundle.getSymbolicName(), ((Bundle)deltas[0].getModelObject()).getSymbolicName());
assertEquals(ModelChangeDelta.UPDATED, deltas[0].getFlag());
}
public void testBundleUninstalledEvent() {
mockFramework.createBundleEvent(BundleEvent.UNINSTALLED, testBundle);
assertEquals(1, deltas.length);
assertTrue(deltas[0].getModelObject() instanceof Bundle);
assertEquals(testBundle.getSymbolicName(), ((Bundle)deltas[0].getModelObject()).getSymbolicName());
assertEquals(ModelChangeDelta.REMOVED, deltas[0].getFlag());
}
public void testBundleResolvedEvent() {
mockFramework.createBundleEvent(BundleEvent.RESOLVED, testBundle);
assertEquals(1, deltas.length);
assertTrue(deltas[0].getModelObject() instanceof Bundle);
assertEquals(testBundle.getSymbolicName(), ((Bundle)deltas[0].getModelObject()).getSymbolicName());
assertEquals(ModelChangeDelta.RESOLVED, deltas[0].getFlag());
}
public void testBundleUnresolvedEvent() {
mockFramework.createBundleEvent(BundleEvent.UNRESOLVED, testBundle);
assertEquals(1, deltas.length);
assertTrue(deltas[0].getModelObject() instanceof Bundle);
assertEquals(testBundle.getSymbolicName(), ((Bundle)deltas[0].getModelObject()).getSymbolicName());
assertEquals(ModelChangeDelta.UNRESOLVED, deltas[0].getFlag());
}
public void testBundleStartingEvent() {
mockFramework.createBundleEvent(BundleEvent.STARTING, testBundle);
assertEquals(1, deltas.length);
assertTrue(deltas[0].getModelObject() instanceof Bundle);
assertEquals(testBundle.getSymbolicName(), ((Bundle)deltas[0].getModelObject()).getSymbolicName());
assertEquals(ModelChangeDelta.STARTING, deltas[0].getFlag());
}
public void testBundleStoppingEvent() {
mockFramework.createBundleEvent(BundleEvent.STOPPING, testBundle);
assertEquals(1, deltas.length);
assertTrue(deltas[0].getModelObject() instanceof Bundle);
assertEquals(testBundle.getSymbolicName(), ((Bundle)deltas[0].getModelObject()).getSymbolicName());
assertEquals(ModelChangeDelta.STOPPING, deltas[0].getFlag());
}
public void testServiceRegisteredEvent() {
mockFramework.createServiceEvent(ServiceEvent.REGISTERED, testServiceReference);
assertEquals(2, deltas.length);
ModelChangeDelta delta = deltas[0];
assertTrue(delta.getModelObject() instanceof ServiceName);
assertEquals(getClass().getName(), ((ServiceName)delta.getModelObject()).getClasses()[0]);
assertEquals(ModelChangeDelta.ADDED, delta.getFlag());
delta = deltas[1];
assertTrue(delta.getModelObject() instanceof ServiceRegistration);
assertEquals(getClass().getName(), ((ServiceRegistration)delta.getModelObject()).getName().getClasses()[0]);
assertEquals(ModelChangeDelta.ADDED, delta.getFlag());
}
public void testServiceUnregisteringEvent() {
mockFramework.createServiceEvent(ServiceEvent.UNREGISTERING, testServiceReference);
assertEquals(2, deltas.length);
ModelChangeDelta delta = deltas[0];
assertTrue(delta.getModelObject() instanceof ServiceName);
assertEquals(getClass().getName(), ((ServiceName)delta.getModelObject()).getClasses()[0]);
assertEquals(ModelChangeDelta.REMOVED, delta.getFlag());
delta = deltas[1];
assertTrue(delta.getModelObject() instanceof ServiceRegistration);
assertEquals(getClass().getName(), ((ServiceRegistration)delta.getModelObject()).getName().getClasses()[0]);
assertEquals(ModelChangeDelta.REMOVED, delta.getFlag());
}
public void testServiceModifiedEvent() {
mockFramework.createServiceEvent(ServiceEvent.MODIFIED, testServiceReference);
assertEquals(1, deltas.length);
assertTrue(deltas[0].getModelObject() instanceof ServiceRegistration);
assertEquals(getClass().getName(), ((ServiceRegistration)deltas[0].getModelObject()).getName().getClasses()[0]);
assertEquals(ModelChangeDelta.UPDATED, deltas[0].getFlag());
}
public void testExtensionAddedEvent() {
mockFramework.createRegistryAddedEvent(new IExtensionPoint[] {testExtPoint});
IExtension ext = testExtPoint.getExtensions()[0];
mockFramework.createRegistryAddedEvent(new IExtension[] {ext});
assertEquals(1, deltas.length);
assertTrue(deltas[0].getModelObject() instanceof Extension);
assertEquals(ext.getLabel(), ((Extension)deltas[0].getModelObject()).getLabel());
assertEquals(ext.getExtensionPointUniqueIdentifier(), ((Extension)deltas[0].getModelObject()).getExtensionPointUniqueIdentifier());
assertEquals(ext.getNamespaceIdentifier(), ((Extension)deltas[0].getModelObject()).getNamespaceIdentifier());
assertEquals(ModelChangeDelta.ADDED, deltas[0].getFlag());
}
public void testExtensionRemovedEvent() {
mockFramework.createRegistryAddedEvent(new IExtensionPoint[] {testExtPoint});
IExtension ext = testExtPoint.getExtensions()[0];
mockFramework.createRegistryRemovedEvent(new IExtension[] {ext});
assertEquals(1, deltas.length);
assertTrue(deltas[0].getModelObject() instanceof Extension);
Extension modelObject = ((Extension)deltas[0].getModelObject());
assertEquals(ext.getLabel(), modelObject.getLabel());
assertEquals(ext.getExtensionPointUniqueIdentifier(), modelObject.getExtensionPointUniqueIdentifier());
assertEquals(ext.getNamespaceIdentifier(), modelObject.getNamespaceIdentifier());
assertEquals(ModelChangeDelta.REMOVED, deltas[0].getFlag());
}
public void testExtensionPointAddedEvent() {
mockFramework.createRegistryAddedEvent(new IExtensionPoint[] {testExtPoint});
assertEquals(1, deltas.length);
assertTrue(deltas[0].getModelObject() instanceof ExtensionPoint);
ExtensionPoint modelObject = ((ExtensionPoint)deltas[0].getModelObject());
assertEquals(testExtPoint.getLabel(), modelObject.getLabel());
assertEquals(testExtPoint.getNamespaceIdentifier(), modelObject.getNamespaceIdentifier());
assertEquals(testExtPoint.getUniqueIdentifier(), modelObject.getUniqueIdentifier());
assertEquals(ModelChangeDelta.ADDED, deltas[0].getFlag());
}
public void testExtensionPointRemovedEvent() {
mockFramework.createRegistryRemovedEvent(new IExtensionPoint[] {testExtPoint});
ExtensionPoint modelObject = ((ExtensionPoint)deltas[0].getModelObject());
assertEquals(testExtPoint.getLabel(), modelObject.getLabel());
assertEquals(testExtPoint.getNamespaceIdentifier(), modelObject.getNamespaceIdentifier());
assertEquals(testExtPoint.getUniqueIdentifier(), modelObject.getUniqueIdentifier());
assertEquals(ModelChangeDelta.REMOVED, deltas[0].getFlag());
}
}