blob: 80ffd58cb97307ab7626c62084f0f5a43b913b68 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2015 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
* Alexander Kurtakov <akurtako@redhat.com> - bug 458490
*******************************************************************************/
package org.eclipse.equinox.common.tests.registry;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThrows;
import java.io.IOException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IRegistryChangeEvent;
import org.eclipse.core.runtime.IRegistryChangeListener;
import org.eclipse.core.runtime.InvalidRegistryObjectException;
import org.eclipse.core.runtime.RegistryFactory;
import org.eclipse.core.tests.harness.BundleTestingHelper;
import org.junit.Test;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.FrameworkUtil;
public class StaleObjects {
private class HandleCatcher implements IRegistryChangeListener {
private IExtension extensionFromTheListener;
public HandleCatcher() {
RegistryFactory.getRegistry().addRegistryChangeListener(this);
}
@Override
public void registryChanged(IRegistryChangeEvent event) {
extensionFromTheListener = event.getExtensionDeltas()[0].getExtension();
assertThrows(InvalidRegistryObjectException.class, () -> extensionFromTheListener.getSimpleIdentifier());
}
public IExtension getAcquiredHandle() {
return extensionFromTheListener;
}
}
@Test
public synchronized void testA() throws IOException, BundleException {
HandleCatcher listener = new HandleCatcher();
BundleContext bundleContext = FrameworkUtil.getBundle(getClass()).getBundleContext();
Bundle bundle01 = BundleTestingHelper.installBundle("", bundleContext, "Plugin_Testing/registry/testStale1");
BundleTestingHelper.refreshPackages(bundleContext, new Bundle[] { bundle01 });
IExtension willBeStale = RegistryFactory.getRegistry().getExtension("testStale.ext1");
// Test that handles obtained from deltas are working.
// Test that handles obtained from an addition deltas are working even after the
// delta is done being broadcasted.
IExtension result = null;
while ((result = listener.getAcquiredHandle()) == null) {
try {
wait(200);
} catch (InterruptedException e) {
// ignore.
}
}
result.getSimpleIdentifier();
// Add a listener capturing a handle removal. Inside the handle catcher the
// handle is valid
HandleCatcher listener2 = new HandleCatcher();
try {
wait(500); // Wait for the listeners to be done
} catch (InterruptedException e) {
// ignore.
}
bundle01.uninstall();
BundleTestingHelper.refreshPackages(bundleContext, new Bundle[] { bundle01 });
// Outside of the event notification the handle from a removed object should be
// invalid
while (listener2.getAcquiredHandle() == null) {
try {
wait(200);
} catch (InterruptedException e) {
// ignore.
}
}
assertThrows(InvalidRegistryObjectException.class, () -> listener2.getAcquiredHandle().getSimpleIdentifier());
// Check that the initial handles are stale as well
assertThrows(InvalidRegistryObjectException.class, () -> willBeStale.getSimpleIdentifier());
RegistryFactory.getRegistry().removeRegistryChangeListener(listener2);
RegistryFactory.getRegistry().removeRegistryChangeListener(listener);
}
@Test
public void testStaleConfigurationElement() throws IOException, BundleException {
BundleContext bundleContext = FrameworkUtil.getBundle(getClass()).getBundleContext();
Bundle bundle01 = BundleTestingHelper.installBundle("", bundleContext, "Plugin_Testing/registry/testStale2");
BundleTestingHelper.refreshPackages(bundleContext, new Bundle[] { bundle01 });
IConfigurationElement ce = RegistryFactory.getRegistry().getExtension("testStale2.ext1")
.getConfigurationElements()[0];
assertNotNull(ce);
bundle01.uninstall();
BundleTestingHelper.refreshPackages(bundleContext, new Bundle[] { bundle01 });
assertThrows(CoreException.class, () -> ce.createExecutableExtension("name"));
}
}