/******************************************************************************* * Copyright (c) 2013, 2016 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.osgi.tests.plugins; import java.util.*; import junit.framework.Test; import junit.framework.TestSuite; import org.eclipse.core.tests.harness.CoreTest; import org.eclipse.osgi.service.pluginconversion.PluginConverter; import org.eclipse.osgi.tests.OSGiTestsActivator; import org.eclipse.osgi.tests.bundles.BundleInstaller; import org.osgi.framework.*; import org.osgi.framework.namespace.*; import org.osgi.framework.wiring.*; import org.osgi.resource.Namespace; public class OldStylePluginTests extends CoreTest { public static int BUNDLE_LISTENER = 0x01; public static int SYNC_BUNDLE_LISTENER = 0x02; public static int SIMPLE_RESULTS = 0x04; public static final String BUNDLES_ROOT = "bundle_tests"; private BundleInstaller installer; private boolean compatPluginInstalled = false; public static Test suite() { return new TestSuite(OldStylePluginTests.class); } protected void setUp() throws Exception { compatPluginInstalled = false; for (BundleWire hostWire : getContext().getBundle(Constants.SYSTEM_BUNDLE_LOCATION).adapt(BundleWiring.class).getProvidedWires(HostNamespace.HOST_NAMESPACE)) { if ("org.eclipse.osgi.compatibility.plugins".equals(hostWire.getRequirer().getSymbolicName())) { compatPluginInstalled = true; break; } } if (compatPluginInstalled) { assertTrue("Plugin compatibility fragment not configured.", getContext().getServiceReference(PluginConverter.class) != null); } installer = new BundleInstaller(BUNDLES_ROOT, OSGiTestsActivator.getContext()); installer.refreshPackages(null); } protected void tearDown() throws Exception { installer.shutdown(); installer = null; } public BundleContext getContext() { return OSGiTestsActivator.getContext(); } public void testSimplePlugin() { if (!compatPluginInstalled) { return; } String pluginName = "test.plugins.a"; Version pluginVersion = Version.parseVersion("1.0.0"); Bundle bundle = installPlugin(pluginName, false); BundleRevision revision = bundle.adapt(BundleRevision.class); assertIdentity(revision, pluginName, pluginVersion, false); assertTrue("Did not expect any requirements.", revision.getDeclaredRequirements(null).isEmpty()); } public void testImportPlugin() { if (!compatPluginInstalled) { return; } String pluginName = "test.plugins.b"; Version pluginVersion = Version.parseVersion("1.0.0"); Bundle bundle = installPlugin(pluginName, false); BundleRevision revision = bundle.adapt(BundleRevision.class); assertIdentity(revision, pluginName, pluginVersion, false); Collection<BundleRequirement> requirements = revision.getDeclaredRequirements(null); assertEquals("Wrong number of requirements: " + requirements, 7, requirements.size()); int index = 0; for (BundleRequirement req : requirements) { index++; Map<String, Object> matchAttributes = new HashMap<String, Object>(); Map<String, Object> noMatchAttributes = new HashMap<String, Object>(); matchAttributes.put(BundleNamespace.BUNDLE_NAMESPACE, "x" + index); noMatchAttributes.put(BundleNamespace.BUNDLE_NAMESPACE, "x" + index); Version match = null; Version noMatch = null; switch (index) { case 1 : match = Version.parseVersion("1.0.0"); noMatch = Version.parseVersion("1.0.0.x"); break; case 2 : match = Version.parseVersion("1.0.100"); noMatch = Version.parseVersion("1.1"); break; case 4 : match = Version.parseVersion("90000"); noMatch = Version.parseVersion("0.1"); break; default : match = Version.parseVersion("1.1"); noMatch = Version.parseVersion("2.0"); break; } matchAttributes.put(AbstractWiringNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE, match); noMatchAttributes.put(AbstractWiringNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE, noMatch); Filter f = null; try { f = getContext().createFilter(req.getDirectives().get(Namespace.REQUIREMENT_FILTER_DIRECTIVE)); } catch (InvalidSyntaxException e) { fail("Failed to create filter.", e); } assertTrue("Did not match requirement: " + req + ": against: " + matchAttributes, f.matches(matchAttributes)); assertFalse("Unexpected match requirement: " + req + ": against: " + matchAttributes, f.matches(noMatchAttributes)); String resolution = req.getDirectives().get(Namespace.REQUIREMENT_RESOLUTION_DIRECTIVE); if (resolution == null) { resolution = Namespace.RESOLUTION_MANDATORY; } String visibility = req.getDirectives().get(BundleNamespace.REQUIREMENT_VISIBILITY_DIRECTIVE); if (visibility == null) { visibility = BundleNamespace.VISIBILITY_PRIVATE; } if (index == 6) { assertEquals("Wrong visibility: " + req, BundleNamespace.VISIBILITY_REEXPORT, visibility); } else { assertEquals("Wrong visibility: " + req, BundleNamespace.VISIBILITY_PRIVATE, visibility); } if (index == 7) { assertEquals("Wrong resolution: " + req, Namespace.RESOLUTION_OPTIONAL, resolution); } else { assertEquals("Wrong resolution: " + req, Namespace.RESOLUTION_MANDATORY, resolution); } } } public void testExportSinglePackage() { if (!compatPluginInstalled) { return; } String pluginName = "test.plugins.c"; Version pluginVersion = Version.parseVersion("1.0.0"); Bundle bundle = installPlugin(pluginName, false); BundleRevision revision = bundle.adapt(BundleRevision.class); assertIdentity(revision, pluginName, pluginVersion, false); assertTrue("Did not expect any requirements.", revision.getDeclaredRequirements(null).isEmpty()); Collection<BundleCapability> packages = revision.getDeclaredCapabilities(PackageNamespace.PACKAGE_NAMESPACE); assertEquals("Wrong number of exports: " + packages, 1, packages.size()); assertEquals("Wrong package name.", pluginName + ".exported", packages.iterator().next().getAttributes().get(PackageNamespace.PACKAGE_NAMESPACE)); } public void testExportAllPackage() { if (!compatPluginInstalled) { return; } String pluginName = "test.plugins.d"; Version pluginVersion = Version.parseVersion("1.0.0"); Bundle bundle = installPlugin(pluginName, false); BundleRevision revision = bundle.adapt(BundleRevision.class); assertIdentity(revision, pluginName, pluginVersion, false); assertTrue("Did not expect any requirements.", revision.getDeclaredRequirements(null).isEmpty()); Collection<BundleCapability> packages = revision.getDeclaredCapabilities(PackageNamespace.PACKAGE_NAMESPACE); assertEquals("Wrong number of exports: " + packages, 4, packages.size()); Iterator<BundleCapability> iPackages = packages.iterator(); // Note that '.' is exported because scaning for * found a resource (plugin.xml) in root of the bundle. assertEquals("Wrong package name.", ".", iPackages.next().getAttributes().get(PackageNamespace.PACKAGE_NAMESPACE)); assertEquals("Wrong package name.", pluginName, iPackages.next().getAttributes().get(PackageNamespace.PACKAGE_NAMESPACE)); assertEquals("Wrong package name.", pluginName + ".exported", iPackages.next().getAttributes().get(PackageNamespace.PACKAGE_NAMESPACE)); assertEquals("Wrong package name.", pluginName + ".exported.sub", iPackages.next().getAttributes().get(PackageNamespace.PACKAGE_NAMESPACE)); } public void testActivator() { if (!compatPluginInstalled) { return; } String pluginName = "test.plugins.e"; Version pluginVersion = Version.parseVersion("1.0.0"); Bundle bundle = installPlugin(pluginName, false); BundleRevision revision = bundle.adapt(BundleRevision.class); assertIdentity(revision, pluginName, pluginVersion, false); try { bundle.start(); Collection<ServiceReference<Object>> testServices = getContext().getServiceReferences(Object.class, "(" + Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE + "=" + bundle.getSymbolicName() + ")"); assertFalse("Did not find registered service.", testServices.isEmpty()); } catch (BundleException e) { fail("Failed to start bundle.", e); } catch (InvalidSyntaxException e) { fail("Failed to create filter.", e); } } public void testExtensionSingleton() { if (!compatPluginInstalled) { return; } String pluginName = "test.plugins.f"; Version pluginVersion = Version.parseVersion("1.0.0"); Bundle bundle = installPlugin(pluginName, false); BundleRevision revision = bundle.adapt(BundleRevision.class); assertIdentity(revision, pluginName, pluginVersion, true); } public void testFragment() { if (!compatPluginInstalled) { return; } String pluginName = "test.plugins.g"; Version pluginVersion = Version.parseVersion("1.0.0"); Bundle bundle = installPlugin(pluginName, false); BundleRevision revision = bundle.adapt(BundleRevision.class); assertIdentity(revision, pluginName, pluginVersion, false); assertTrue("revision is not a fragment.", (revision.getTypes() & BundleRevision.TYPE_FRAGMENT) != 0); Collection<BundleRequirement> reqs = revision.getDeclaredRequirements(HostNamespace.HOST_NAMESPACE); assertEquals("Wrong number of host requirements.", 1, reqs.size()); BundleRequirement req = reqs.iterator().next(); Map<String, Object> matchAttributes = new HashMap<String, Object>(); Map<String, Object> noMatchAttributes = new HashMap<String, Object>(); matchAttributes.put(HostNamespace.HOST_NAMESPACE, "x"); noMatchAttributes.put(HostNamespace.HOST_NAMESPACE, "x"); Version match = Version.parseVersion("1.1"); Version noMatch = Version.parseVersion("2.0"); matchAttributes.put(AbstractWiringNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE, match); noMatchAttributes.put(AbstractWiringNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE, noMatch); Filter f = null; try { f = getContext().createFilter(req.getDirectives().get(Namespace.REQUIREMENT_FILTER_DIRECTIVE)); } catch (InvalidSyntaxException e) { fail("Failed to create filter.", e); } assertTrue("Did not match requirement: " + req + ": against: " + matchAttributes, f.matches(matchAttributes)); assertFalse("Unexpected match requirement: " + req + ": against: " + matchAttributes, f.matches(noMatchAttributes)); } private void assertIdentity(BundleRevision revision, String pluginName, Version pluginVersion, boolean isSingleton) { assertEquals("Wrong symbolic name", pluginName, revision.getSymbolicName()); assertEquals("Wrong version.", pluginVersion, revision.getVersion()); Collection<BundleCapability> capabilities = new ArrayList<BundleCapability>(); capabilities.addAll(revision.getDeclaredCapabilities(IdentityNamespace.IDENTITY_NAMESPACE)); capabilities.addAll(revision.getDeclaredCapabilities(BundleNamespace.BUNDLE_NAMESPACE)); capabilities.addAll(revision.getDeclaredCapabilities(HostNamespace.HOST_NAMESPACE)); int expectedNumCaps = (revision.getTypes() & BundleRevision.TYPE_FRAGMENT) == 0 ? 3 : 1; assertEquals("Wrong number of capabilities: " + capabilities, expectedNumCaps, capabilities.size()); for (BundleCapability cap : capabilities) { String namespace = cap.getNamespace(); String versionKey = IdentityNamespace.IDENTITY_NAMESPACE.equals(namespace) ? IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE : AbstractWiringNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE; Map<String, Object> attrs = cap.getAttributes(); assertEquals("Wrong name: " + namespace, pluginName, attrs.get(namespace)); assertEquals("Wrong version: " + namespace, pluginVersion, attrs.get(versionKey)); String singletonDirective = cap.getDirectives().get(IdentityNamespace.CAPABILITY_SINGLETON_DIRECTIVE); singletonDirective = singletonDirective == null ? Boolean.FALSE.toString() : singletonDirective; assertEquals("Wrong singleton directive.", isSingleton, Boolean.TRUE.toString().equals(singletonDirective)); } } private Bundle installPlugin(String plugin, boolean expectedFailure) { try { return installer.installBundle(plugin); } catch (BundleException e) { if (!expectedFailure) { fail("Failed to install plugin.", e); } return null; } } }