package aQute.bnd.main; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.ServiceLoader; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.osgi.framework.Version; import org.osgi.framework.launch.Framework; import org.osgi.framework.launch.FrameworkFactory; import org.osgi.framework.namespace.ExecutionEnvironmentNamespace; import org.osgi.namespace.extender.ExtenderNamespace; import org.osgi.resource.Capability; import org.osgi.resource.Resource; import org.osgi.resource.Wire; import aQute.bnd.header.Attrs; import aQute.bnd.header.Parameters; import aQute.bnd.main.RemoteCommand.DistroOptions; import aQute.bnd.main.RemoteCommand.RemoteOptions; import aQute.bnd.main.testlib.MockRegistry; import aQute.bnd.osgi.Domain; import aQute.bnd.osgi.Jar; import aQute.bnd.osgi.Processor; import aQute.bnd.osgi.resource.ResourceBuilder; import aQute.lib.getopt.CommandLine; import aQute.lib.io.IO; import biz.aQute.resolve.BndResolver; import biz.aQute.resolve.ResolutionCallback; import biz.aQute.resolve.ResolveProcess; import biz.aQute.resolve.ResolverLogger; import junit.framework.TestCase; @SuppressWarnings("restriction") public class DistroCommandTest extends TestCase { private Framework framework; private File tmp; @Override protected void setUp() throws Exception { tmp = IO.getFile("generated/tmp"); tmp.mkdirs(); ServiceLoader<FrameworkFactory> sl = ServiceLoader.load(FrameworkFactory.class, this.getClass().getClassLoader()); FrameworkFactory ff = sl.iterator().next(); Map<String,String> configuration = new HashMap<String,String>(); configuration.put(Constants.FRAMEWORK_STORAGE_CLEAN, Constants.FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT); configuration.put(Constants.FRAMEWORK_STORAGE, new File(tmp, "fwstorage").getAbsolutePath()); framework = ff.newFramework(configuration); framework.init(); framework.start(); BundleContext context = framework.getBundleContext(); String[] bundles = { "../biz.aQute.remote/generated/biz.aQute.remote.agent.jar", "testdata/bundles/com.liferay.dynamic.data.mapping.taglib.jar", "testdata/bundles/com.liferay.item.selector.taglib.jar" }; for (String bundle : bundles) { String location = "reference:" + IO.getFile(bundle).toURI().toString(); Bundle b = context.installBundle(location); b.start(); } super.setUp(); } @Override protected void tearDown() throws Exception { framework.stop(); framework.waitForStop(10000); IO.delete(tmp); super.tearDown(); } public void testMultipleCapabilitiesPerNamespace() throws Exception { bnd bnd = new bnd(); CommandLine cmdline = new CommandLine(null); List<String> remoteArgs = new ArrayList<>(); RemoteOptions remoteOptions = cmdline.getOptions(RemoteOptions.class, remoteArgs); File distro = new File("generated/tmp/test.distro.jar"); List<String> distroArgs = new ArrayList<>(); distroArgs.add("-o"); distroArgs.add(distro.getPath()); distroArgs.add("test.distro"); distroArgs.add("1.0.0"); DistroOptions distroOptions = cmdline.getOptions(DistroOptions.class, distroArgs); new RemoteCommand(bnd, remoteOptions)._distro(distroOptions); assertTrue(distro.exists()); ResourceBuilder builder = new ResourceBuilder(); Domain manifest = Domain.domain(new Jar(distro).getManifest()); builder.addManifest(manifest); Resource resource = builder.build(); List<Capability> capabilities = resource.getCapabilities(null); assertNotNull(capabilities); List<Capability> extenderCaps = resource.getCapabilities(ExtenderNamespace.EXTENDER_NAMESPACE); int jspTaglibCapabilityCount = 0; for (Capability capability : extenderCaps) { Map<String,Object> attributes = capability.getAttributes(); if ("jsp.taglib".equals(attributes.get(ExtenderNamespace.EXTENDER_NAMESPACE))) { jspTaglibCapabilityCount++; } } assertEquals(2, jspTaglibCapabilityCount); List<Capability> eeCaps = resource .getCapabilities(ExecutionEnvironmentNamespace.EXECUTION_ENVIRONMENT_NAMESPACE); assertTrue(eeCaps.size() > 0); Capability javaSECap = null; for (Capability capability : eeCaps) { Map<String,Object> attributes = capability.getAttributes(); if ("JavaSE".equals(attributes.get(ExecutionEnvironmentNamespace.EXECUTION_ENVIRONMENT_NAMESPACE))) { javaSECap = capability; } } assertNotNull(javaSECap); @SuppressWarnings("null") Map<String,Object> attributes = javaSECap.getAttributes(); assertTrue(attributes.containsKey("version")); @SuppressWarnings("unchecked") List<Version> versions = (List<Version>) attributes.get("version"); assertTrue(versions.size() > 1); assertTrue(versions.contains(new Version("1.7.0"))); assertTrue(versions.contains(new Version("1.6.0"))); assertTrue(versions.contains(new Version("1.5.0"))); assertTrue(versions.contains(new Version("1.4.0"))); assertTrue(versions.contains(new Version("1.3.0"))); } public void testResolveAgainstDistro() throws Exception { bnd bnd = new bnd(); CommandLine cmdline = new CommandLine(null); List<String> remoteArgs = new ArrayList<>(); RemoteOptions remoteOptions = cmdline.getOptions(RemoteOptions.class, remoteArgs); File distro = new File("generated/tmp/test.distro.jar"); List<String> distroArgs = new ArrayList<>(); distroArgs.add("-o"); distroArgs.add(distro.getPath()); distroArgs.add("test.distro"); distroArgs.add("1.0.0"); DistroOptions distroOptions = cmdline.getOptions(DistroOptions.class, distroArgs); new RemoteCommand(bnd, remoteOptions)._distro(distroOptions); assertTrue(distro.exists()); ResolveProcess process = new ResolveProcess(); ResolverLogger logger = new ResolverLogger(); MockRegistry registry = new MockRegistry(); Processor model = new Processor(); model.setProperty("-distro", distro.getAbsolutePath() + ";version=file"); model.setProperty("-runfw", "org.eclipse.osgi"); model.setProperty("-runrequires", "osgi.wiring.package;filter:='(osgi.wiring.package=com.liferay.dynamic.data.mapping.taglib.servlet.taglib)'"); Map<Resource,List<Wire>> requiredResources = process.resolveRequired(model, null, registry, new BndResolver(logger), Collections.<ResolutionCallback> emptyList(), logger); assertEquals(1, requiredResources.size()); } public void testDistroJarLastModified() throws Exception { bnd bnd = new bnd(); CommandLine cmdline = new CommandLine(null); List<String> remoteArgs = new ArrayList<>(); RemoteOptions remoteOptions = cmdline.getOptions(RemoteOptions.class, remoteArgs); File distro = new File("generated/tmp/test.distro.jar"); if (distro.exists()) { assertTrue(distro.delete()); } List<String> distroArgs = new ArrayList<>(); distroArgs.add("-o"); distroArgs.add(distro.getPath()); distroArgs.add("test.distro"); distroArgs.add("1.0.0"); DistroOptions distroOptions = cmdline.getOptions(DistroOptions.class, distroArgs); new RemoteCommand(bnd, remoteOptions)._distro(distroOptions); assertTrue(distro.exists()); assertTrue(distro.lastModified() > 0); } public void testDistroJarNotResolvable() throws Exception { bnd bnd = new bnd(); CommandLine cmdline = new CommandLine(null); List<String> remoteArgs = new ArrayList<>(); RemoteOptions remoteOptions = cmdline.getOptions(RemoteOptions.class, remoteArgs); File distro = new File("generated/tmp/test.distro.jar"); if (distro.exists()) { assertTrue(distro.delete()); } List<String> distroArgs = new ArrayList<>(); distroArgs.add("-o"); distroArgs.add(distro.getPath()); distroArgs.add("test.distro"); distroArgs.add("1.0.0"); DistroOptions distroOptions = cmdline.getOptions(DistroOptions.class, distroArgs); new RemoteCommand(bnd, remoteOptions)._distro(distroOptions); assertTrue(distro.exists()); Domain domain = Domain.domain(distro); Parameters providedCapabilities = domain.getProvideCapability(); assertTrue(providedCapabilities.containsKey("osgi.unresolvable")); Parameters requiredCapabilities = domain.getRequireCapability(); assertTrue(requiredCapabilities.containsKey("osgi.unresolvable")); Attrs attrs = requiredCapabilities.get("osgi.unresolvable"); assertEquals("(&(must.not.resolve=*)(!(must.not.resolve=*)))", attrs.get("filter:")); } }