blob: 89ca84a916335e2f08ae5650021dcd4ff6336353 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 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.equinox.common.tests.registry;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI;
import org.eclipse.core.runtime.ContributorFactorySimple;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IContributor;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.RegistryFactory;
import org.junit.Test;
import org.osgi.framework.FrameworkUtil;
/**
* Test proper clean-up in case registry gets invalid XML contribution.
* @since 3.4
*/
public class InputErrorTest {
static private final String DATA_LOCATION = "Plugin_Testing/registry/errorHandling/";
/**
* Use customized registry strategy to both check error processing
* and to remove expected error messages from test log.
*/
private class RegistryStrategyLog extends RegistryStrategyOSGI {
public String msg = null;
public RegistryStrategyLog(File[] theStorageDir, boolean[] cacheReadOnly, Object key) {
super(theStorageDir, cacheReadOnly, key);
}
@Override
public void log(IStatus status) {
msg = status.getMessage();
}
}
private InputStream getStream(String location) {
URL xml = FrameworkUtil.getBundle(getClass()).getEntry(DATA_LOCATION + location);
assertNotNull(xml);
try {
return new BufferedInputStream(xml.openStream());
} catch (IOException ex) {
fail("Unable to open input stream to XML");
}
return null;
}
@Test
public void testErrorCleanupPoints() {
RegistryStrategyLog strategy = new RegistryStrategyLog(null, null, null); // RegistryFactory.createOSGiStrategy(null, null, null);
IExtensionRegistry localRegistry = RegistryFactory.createRegistry(strategy, null, null);
IContributor contributor = ContributorFactorySimple.createContributor("testErrorHandling");
// 1) attempt to add information from mis-formed XML
InputStream is = getStream("bad/point/plugin.xml");
assertNotNull(is);
boolean added = localRegistry.addContribution(is, contributor, false, "test", null, null);
assertFalse(added);
IExtensionPoint bundleExtPointA = localRegistry.getExtensionPoint("testErrorHandling.xptErrorTestA");
assertNull(bundleExtPointA);
IExtensionPoint bundleExtPointB = localRegistry.getExtensionPoint("testErrorHandling.xptErrorTestB");
assertNull(bundleExtPointB);
assertNotNull(strategy.msg);
strategy.msg = null;
// 2) add properly formed XML
is = getStream("good/point/plugin.xml");
assertNotNull(is);
added = localRegistry.addContribution(is, contributor, false, "test", null, null);
assertTrue(added);
bundleExtPointA = localRegistry.getExtensionPoint("testErrorHandling.xptErrorTestA");
assertNotNull(bundleExtPointA);
bundleExtPointB = localRegistry.getExtensionPoint("testErrorHandling.xptErrorTestB");
assertNotNull(bundleExtPointB);
assertNull(strategy.msg);
localRegistry.stop(null);
}
@Test
public void testErrorCleanupExtensions() {
RegistryStrategyLog strategy = new RegistryStrategyLog(null, null, null); // RegistryFactory.createOSGiStrategy(null, null, null);
IExtensionRegistry localRegistry = RegistryFactory.createRegistry(strategy, null, null);
IContributor contributor = ContributorFactorySimple.createContributor("testErrorHandling");
// 1) attempt to add information from mis-formed XML
InputStream is = getStream("bad/extension/plugin.xml");
assertNotNull(is);
boolean added = localRegistry.addContribution(is, contributor, false, "test", null, null);
assertFalse(added);
IExtensionPoint bundleExtPointA = localRegistry.getExtensionPoint("testErrorHandling.xptErrorTestA");
assertNull(bundleExtPointA);
IExtension extensionA = localRegistry.getExtension("testErrorHandling.testExtA");
assertNull(extensionA);
IExtension extensionB = localRegistry.getExtension("testErrorHandling.testExtB");
assertNull(extensionB);
IExtension extensionC = localRegistry.getExtension("testErrorHandling.testExtC");
assertNull(extensionC);
assertNotNull(strategy.msg);
strategy.msg = null;
// 2) add properly formed XML
is = getStream("good/extension/plugin.xml");
assertNotNull(is);
added = localRegistry.addContribution(is, contributor, false, "test", null, null);
assertTrue(added);
bundleExtPointA = localRegistry.getExtensionPoint("testErrorHandling.xptErrorTestA");
assertNotNull(bundleExtPointA);
checkExtension(localRegistry, "testErrorHandling.testExtA", "valueGoodA");
checkExtension(localRegistry, "testErrorHandling.testExtB", "valueGoodB");
checkExtension(localRegistry, "testErrorHandling.testExtC", "valueGoodC");
assertNull(strategy.msg);
localRegistry.stop(null);
}
private void checkExtension(IExtensionRegistry registry, String extID, String expectedValue) {
IExtension extensionA = registry.getExtension(extID);
assertNotNull(extensionA);
IConfigurationElement[] configElements = extensionA.getConfigurationElements();
assertTrue(configElements.length == 1);
String value = configElements[0].getAttribute("testAttr");
assertTrue(expectedValue.equals(value));
}
}