package biz.aQute.resolve;
import static test.lib.Utils.createRepo;
import static test.lib.Utils.findContentURI;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.osgi.resource.Capability;
import org.osgi.resource.Namespace;
import org.osgi.resource.Requirement;
import org.osgi.resource.Resource;
import org.osgi.service.log.LogService;
import org.osgi.service.repository.Repository;
import org.osgi.service.resolver.Resolver;
import aQute.bnd.build.model.BndEditModel;
import aQute.bnd.build.model.EE;
import aQute.bnd.build.model.clauses.ExportedPackage;
import aQute.bnd.header.Attrs;
import aQute.bnd.header.Parameters;
import aQute.bnd.osgi.resource.CapReqBuilder;
import aQute.bnd.osgi.resource.ResourceUtils;
import aQute.bnd.osgi.resource.ResourceUtils.IdentityCapability;
import aQute.bnd.service.resolve.hook.ResolverHook;
import aQute.lib.io.IO;
import junit.framework.TestCase;
import test.lib.MockRegistry;
import test.lib.NullLogService;
@SuppressWarnings({
"restriction", "deprecation"
})
public class BndrunResolveContextTest extends TestCase {
private static final LogService log = new NullLogService();
/**
* Simple test that checks if we can find a resource through the
* findProviders
*/
public static void testSimple() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/repo1.index.xml"), "Repository1"));
BndrunResolveContext context = new BndrunResolveContext(new BndEditModel(), registry, log);
Requirement req = new CapReqBuilder("osgi.wiring.package")
.addDirective("filter", "(osgi.wiring.package=org.apache.felix.gogo.api)").buildSyntheticRequirement();
List<Capability> providers = context.findProviders(req);
assertEquals(1, providers.size());
Resource resource = providers.get(0).getResource();
assertEquals(IO.getFile("testdata/repo1/org.apache.felix.gogo.runtime-0.10.0.jar").toURI(),
findContentURI(resource));
}
/**
* Test the blacklist. We reject any resources that matches a specific
* requirements
*/
public static void testSimpleBlacklist() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/repo1.index.xml"), "Repository1"));
BndEditModel model = new BndEditModel();
Requirement blacklist = new CapReqBuilder("osgi.wiring.package")
.addDirective("filter", "(osgi.wiring.package=org.apache.felix.gogo.api)").buildSyntheticRequirement();
model.setRunBlacklist(Arrays.asList(blacklist));
BndrunResolveContext context = new BndrunResolveContext(model, registry, log);
//
// This one is ok in testSimple
// but should fail because we blacklisted it
//
Requirement req = new CapReqBuilder("osgi.wiring.package")
.addDirective("filter", "(osgi.wiring.package=org.apache.felix.gogo.api)").buildSyntheticRequirement();
List<Capability> providers = context.findProviders(req);
assertEquals(0, providers.size());
}
/**
* See if we can reject the 4.0.2 framework, which should normally be
* selected because it is the highest (this is tested later).
*/
public static void testBlacklistFramework() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/org.apache.felix.framework-4.0.0.index.xml")));
registry.addPlugin(createRepo(IO.getFile("testdata/org.apache.felix.framework-4.0.2.index.xml")));
BndEditModel model = new BndEditModel();
model.setRunFw("org.apache.felix.framework;version='[4,4.1)'");
Requirement blacklist = new CapReqBuilder("osgi.identity")
.addDirective("filter", "(&(osgi.identity=org.apache.felix.framework)(version>=4.0.1))")
.buildSyntheticRequirement();
model.setRunBlacklist(Arrays.asList(blacklist));
BndrunResolveContext context = new BndrunResolveContext(model, registry, log);
context.init();
Resource framework = context.getFramework();
assertNotNull(framework);
assertEquals(IO.getFile("testdata/org.apache.felix.framework-4.0.0.jar").toURI(), findContentURI(framework));
}
public static void testEffective() {
BndrunResolveContext context = new BndrunResolveContext(new BndEditModel(), new MockRegistry(), log);
Requirement resolveReq = new CapReqBuilder("dummy.ns")
.addDirective(Namespace.REQUIREMENT_EFFECTIVE_DIRECTIVE, Namespace.EFFECTIVE_RESOLVE)
.buildSyntheticRequirement();
Requirement activeReq = new CapReqBuilder("dummy.ns")
.addDirective(Namespace.REQUIREMENT_EFFECTIVE_DIRECTIVE, Namespace.EFFECTIVE_ACTIVE)
.buildSyntheticRequirement();
Requirement noEffectiveDirectiveReq = new CapReqBuilder("dummy.ns").buildSyntheticRequirement();
assertTrue(context.isEffective(resolveReq));
assertFalse(context.isEffective(activeReq));
assertTrue(context.isEffective(noEffectiveDirectiveReq));
}
public static void testEffective2() {
BndEditModel model = new BndEditModel();
model.genericSet(BndrunResolveContext.RUN_EFFECTIVE_INSTRUCTION, "active, arbitrary");
BndrunResolveContext context = new BndrunResolveContext(model, new MockRegistry(), log);
Requirement resolveReq = new CapReqBuilder("dummy.ns")
.addDirective(Namespace.REQUIREMENT_EFFECTIVE_DIRECTIVE, Namespace.EFFECTIVE_RESOLVE)
.buildSyntheticRequirement();
Requirement activeReq = new CapReqBuilder("dummy.ns")
.addDirective(Namespace.REQUIREMENT_EFFECTIVE_DIRECTIVE, Namespace.EFFECTIVE_ACTIVE)
.buildSyntheticRequirement();
Requirement arbitrary1Req = new CapReqBuilder("dummy.ns")
.addDirective(Namespace.REQUIREMENT_EFFECTIVE_DIRECTIVE, "arbitrary").buildSyntheticRequirement();
Requirement arbitrary2Req = new CapReqBuilder("dummy.ns")
.addDirective(Namespace.REQUIREMENT_EFFECTIVE_DIRECTIVE, "VeryArbitrary").buildSyntheticRequirement();
Requirement noEffectiveDirectiveReq = new CapReqBuilder("dummy.ns").buildSyntheticRequirement();
assertTrue(context.isEffective(resolveReq));
assertTrue(context.isEffective(activeReq));
assertTrue(context.isEffective(arbitrary1Req));
assertFalse(context.isEffective(arbitrary2Req));
assertTrue(context.isEffective(noEffectiveDirectiveReq));
}
public static void testEffective3() {
BndEditModel model = new BndEditModel();
model.genericSet(BndrunResolveContext.RUN_EFFECTIVE_INSTRUCTION,
"active;skip:=\"filtered.ns,another.filtered.ns\", arbitrary");
BndrunResolveContext context = new BndrunResolveContext(model, new MockRegistry(), log);
Requirement resolveReq = new CapReqBuilder("dummy.ns")
.addDirective(Namespace.REQUIREMENT_EFFECTIVE_DIRECTIVE, Namespace.EFFECTIVE_RESOLVE)
.buildSyntheticRequirement();
Requirement activeReq = new CapReqBuilder("dummy.ns")
.addDirective(Namespace.REQUIREMENT_EFFECTIVE_DIRECTIVE, Namespace.EFFECTIVE_ACTIVE)
.buildSyntheticRequirement();
Requirement filteredActiveReq = new CapReqBuilder("filtered.ns")
.addDirective(Namespace.REQUIREMENT_EFFECTIVE_DIRECTIVE, Namespace.EFFECTIVE_ACTIVE)
.buildSyntheticRequirement();
Requirement anotherFilteredActiveReq = new CapReqBuilder("another.filtered.ns")
.addDirective(Namespace.REQUIREMENT_EFFECTIVE_DIRECTIVE, Namespace.EFFECTIVE_ACTIVE)
.buildSyntheticRequirement();
Requirement arbitrary1Req = new CapReqBuilder("dummy.ns")
.addDirective(Namespace.REQUIREMENT_EFFECTIVE_DIRECTIVE, "arbitrary").buildSyntheticRequirement();
Requirement noEffectiveDirectiveReq = new CapReqBuilder("dummy.ns").buildSyntheticRequirement();
assertTrue(context.isEffective(resolveReq));
assertTrue(context.isEffective(activeReq));
assertTrue(context.isEffective(arbitrary1Req));
assertFalse(context.isEffective(filteredActiveReq));
assertFalse(context.isEffective(anotherFilteredActiveReq));
assertTrue(context.isEffective(noEffectiveDirectiveReq));
}
public static void testEmptyInitialWirings() {
assertEquals(0, new BndrunResolveContext(new BndEditModel(), new MockRegistry(), log).getWirings().size());
}
public static void testBasicFindProviders() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/repo1.index.xml")));
BndEditModel runModel = new BndEditModel();
BndrunResolveContext context = new BndrunResolveContext(runModel, registry, log);
Requirement req = new CapReqBuilder("osgi.wiring.package")
.addDirective("filter", "(osgi.wiring.package=org.apache.felix.gogo.api)").buildSyntheticRequirement();
List<Capability> providers = context.findProviders(req);
assertEquals(1, providers.size());
Resource resource = providers.get(0).getResource();
assertEquals(IO.getFile("testdata/repo1/org.apache.felix.gogo.runtime-0.10.0.jar").toURI(),
findContentURI(resource));
}
public static void testProviderPreference() {
Requirement req = new CapReqBuilder("osgi.wiring.package")
.addDirective("filter", "(osgi.wiring.package=org.apache.felix.gogo.api)").buildSyntheticRequirement();
MockRegistry registry;
BndrunResolveContext context;
List<Capability> providers;
Resource resource;
// First try it with repo1 first
registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/repo1.index.xml")));
registry.addPlugin(createRepo(IO.getFile("testdata/repo2.index.xml")));
context = new BndrunResolveContext(new BndEditModel(), registry, log);
providers = context.findProviders(req);
assertEquals(2, providers.size());
resource = providers.get(0).getResource();
assertEquals(IO.getFile("testdata/repo1/org.apache.felix.gogo.runtime-0.10.0.jar").toURI(),
findContentURI(resource));
resource = providers.get(1).getResource();
assertEquals(IO.getFile("testdata/repo2/org.apache.felix.gogo.runtime-0.10.0.jar").toURI(),
findContentURI(resource));
// Now try it with repo2 first
registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/repo2.index.xml")));
registry.addPlugin(createRepo(IO.getFile("testdata/repo1.index.xml")));
context = new BndrunResolveContext(new BndEditModel(), registry, log);
providers = context.findProviders(req);
assertEquals(2, providers.size());
resource = providers.get(0).getResource();
assertEquals(IO.getFile("testdata/repo2/org.apache.felix.gogo.runtime-0.10.0.jar").toURI(),
findContentURI(resource));
resource = providers.get(1).getResource();
assertEquals(IO.getFile("testdata/repo1/org.apache.felix.gogo.runtime-0.10.0.jar").toURI(),
findContentURI(resource));
}
public static void testReorderRepositories() {
Requirement req = new CapReqBuilder("osgi.wiring.package")
.addDirective("filter", "(osgi.wiring.package=org.apache.felix.gogo.api)").buildSyntheticRequirement();
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/repo1.index.xml"), "Repository1"));
registry.addPlugin(createRepo(IO.getFile("testdata/repo2.index.xml"), "Repository2"));
BndrunResolveContext context;
List<Capability> providers;
Resource resource;
BndEditModel runModel;
runModel = new BndEditModel();
runModel.setRunRepos(Arrays.asList(new String[] {
"Repository2", "Repository1"
}));
context = new BndrunResolveContext(runModel, registry, log);
providers = context.findProviders(req);
assertEquals(2, providers.size());
resource = providers.get(0).getResource();
assertEquals(IO.getFile("testdata/repo2/org.apache.felix.gogo.runtime-0.10.0.jar").toURI(),
findContentURI(resource));
resource = providers.get(1).getResource();
assertEquals(IO.getFile("testdata/repo1/org.apache.felix.gogo.runtime-0.10.0.jar").toURI(),
findContentURI(resource));
}
public static void testFrameworkIsMandatory() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/repo3.index.xml")));
BndEditModel runModel = new BndEditModel();
runModel.setRunFw("org.apache.felix.framework;version='[4,4.1)'");
BndrunResolveContext context = new BndrunResolveContext(runModel, registry, log);
context.init();
assertEquals(IO.getFile("testdata/repo3/org.apache.felix.framework-4.0.2.jar").toURI(),
findContentURI(context.getFramework()));
}
public static void testChooseHighestFrameworkVersion() {
MockRegistry registry;
BndEditModel runModel;
BndrunResolveContext context;
Collection<Resource> resources;
Resource fwkResource;
registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/org.apache.felix.framework-4.0.0.index.xml")));
registry.addPlugin(createRepo(IO.getFile("testdata/repo3.index.xml")));
runModel = new BndEditModel();
runModel.setRunFw("org.apache.felix.framework;version='[4,4.1)'");
context = new BndrunResolveContext(runModel, registry, log);
context.init();
assertEquals(IO.getFile("testdata/repo3/org.apache.felix.framework-4.0.2.jar").toURI(),
findContentURI(context.getFramework()));
// Try it the other way round
registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/repo3.index.xml")));
registry.addPlugin(createRepo(IO.getFile("testdata/org.apache.felix.framework-4.0.0.index.xml")));
runModel = new BndEditModel();
runModel.setRunFw("org.apache.felix.framework;version='[4,4.1)'");
context = new BndrunResolveContext(runModel, registry, log);
context.init();
assertEquals(IO.getFile("testdata/repo3/org.apache.felix.framework-4.0.2.jar").toURI(),
findContentURI(context.getFramework()));
}
public static void testFrameworkCapabilitiesPreferredOverRepository() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/osgi.cmpn-4.3.0.index.xml")));
registry.addPlugin(createRepo(IO.getFile("testdata/org.apache.felix.framework-4.0.2.index.xml")));
BndEditModel runModel = new BndEditModel();
runModel.setRunFw("org.apache.felix.framework");
Requirement requirement = new CapReqBuilder("osgi.wiring.package")
.addDirective("filter", "(&(osgi.wiring.package=org.osgi.util.tracker)(version>=1.5)(!(version>=1.6)))")
.buildSyntheticRequirement();
BndrunResolveContext context = new BndrunResolveContext(runModel, registry, log);
List<Capability> providers = context.findProviders(requirement);
assertEquals(2, providers.size());
assertEquals(IO.getFile("testdata/org.apache.felix.framework-4.0.2.jar").toURI(),
findContentURI(providers.get(0).getResource()));
assertEquals(IO.getFile("testdata/osgi.cmpn-4.3.0.jar").toURI(),
findContentURI(providers.get(1).getResource()));
}
public static void testResolverHookFiltersResult() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/osgi.cmpn-4.3.0.index.xml")));
registry.addPlugin(createRepo(IO.getFile("testdata/org.apache.felix.framework-4.0.2.index.xml")));
// Add a hook that removes all capabilities from resource with id
// "osgi.cmpn"
registry.addPlugin(new ResolverHook() {
public void filterMatches(Requirement requirement, List<Capability> candidates) {
for (Iterator<Capability> iter = candidates.iterator(); iter.hasNext();) {
Object id = iter.next()
.getResource()
.getCapabilities("osgi.identity")
.get(0)
.getAttributes()
.get("osgi.identity");
if ("osgi.cmpn".equals(id))
iter.remove();
}
}
});
BndEditModel runModel = new BndEditModel();
runModel.setRunFw("org.apache.felix.framework");
Requirement requirement = new CapReqBuilder("osgi.wiring.package")
.addDirective("filter", "(&(osgi.wiring.package=org.osgi.util.tracker)(version>=1.5)(!(version>=1.6)))")
.buildSyntheticRequirement();
BndrunResolveContext context = new BndrunResolveContext(runModel, registry, log);
List<Capability> providers = context.findProviders(requirement);
assertEquals(1, providers.size());
assertEquals(IO.getFile("testdata/org.apache.felix.framework-4.0.2.jar").toURI(),
findContentURI(providers.get(0).getResource()));
// The capability from osgi.cmpn is NOT here
}
public static void testResolverHookFiltersResultWithBlacklist() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(new File("testdata/osgi.cmpn-4.3.0.index.xml")));
registry.addPlugin(createRepo(new File("testdata/org.apache.felix.framework-4.0.2.index.xml")));
// Add a hook that removes all capabilities from resource with id
// "osgi.cmpn"
HashMap<String,String> blacklistProp = new HashMap<String,String>();
BndEditModel runModel = new BndEditModel();
ArrayList<Requirement> blacklistlist = new ArrayList<Requirement>();
blacklistlist.add(CapReqBuilder.createSimpleRequirement("osgi.identity", "osgi.cmpn", "4.3.0")
.buildSyntheticRequirement());
runModel.setRunBlacklist(blacklistlist);
runModel.setRunFw("org.apache.felix.framework");
Requirement requirement = new CapReqBuilder("osgi.wiring.package")
.addDirective("filter", "(&(osgi.wiring.package=org.osgi.util.tracker)(version>=1.5)(!(version>=1.6)))")
.buildSyntheticRequirement();
BndrunResolveContext context = new BndrunResolveContext(runModel, registry, log);
List<Capability> providers = context.findProviders(requirement);
assertEquals(1, providers.size());
assertEquals(new File("testdata/org.apache.felix.framework-4.0.2.jar").toURI(),
findContentURI(providers.get(0).getResource()));
}
public static void testResolverHookFiltersResultWithBlacklistAndVersionRange1() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(new File("testdata/osgi.cmpn-4.3.0.index.xml")));
registry.addPlugin(createRepo(new File("testdata/org.apache.felix.framework-4.0.2.index.xml")));
// Add a hook that removes all capabilities from resource with id
// "osgi.cmpn"
HashMap<String,String> blacklistProp = new HashMap<String,String>();
BndEditModel runModel = new BndEditModel();
ArrayList<Requirement> blacklistlist = new ArrayList<Requirement>();
blacklistlist.add(CapReqBuilder.createSimpleRequirement("osgi.identity", "osgi.cmpn", "[4.0.0,4.3.0)")
.buildSyntheticRequirement());
runModel.setRunBlacklist(blacklistlist);
runModel.setRunFw("org.apache.felix.framework");
Requirement requirement = new CapReqBuilder("osgi.wiring.package")
.addDirective("filter", "(&(osgi.wiring.package=org.osgi.util.tracker)(version>=1.5)(!(version>=1.6)))")
.buildSyntheticRequirement();
BndrunResolveContext context = new BndrunResolveContext(runModel, registry, log);
List<Capability> providers = context.findProviders(requirement);
assertEquals(2, providers.size());
assertEquals(new File("testdata/org.apache.felix.framework-4.0.2.jar").toURI(),
findContentURI(providers.get(0).getResource()));
assertEquals(new File("testdata/osgi.cmpn-4.3.0.jar").toURI(), findContentURI(providers.get(1).getResource()));
}
public static void testResolverHookFiltersResultWithBlacklistAndVersionRange2() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(new File("testdata/osgi.cmpn-4.3.0.index.xml")));
registry.addPlugin(createRepo(new File("testdata/org.apache.felix.framework-4.0.2.index.xml")));
// Add a hook that removes all capabilities from resource with id
// "osgi.cmpn"
HashMap<String,String> blacklistProp = new HashMap<String,String>();
BndEditModel runModel = new BndEditModel();
ArrayList<Requirement> blacklistlist = new ArrayList<Requirement>();
blacklistlist.add(CapReqBuilder.createSimpleRequirement("osgi.identity", "osgi.cmpn", "[4.0.0,4.4.0)")
.buildSyntheticRequirement());
runModel.setRunBlacklist(blacklistlist);
runModel.setRunFw("org.apache.felix.framework");
Requirement requirement = new CapReqBuilder("osgi.wiring.package")
.addDirective("filter", "(&(osgi.wiring.package=org.osgi.util.tracker)(version>=1.5)(!(version>=1.6)))")
.buildSyntheticRequirement();
BndrunResolveContext context = new BndrunResolveContext(runModel, registry, log);
List<Capability> providers = context.findProviders(requirement);
assertEquals(1, providers.size());
assertEquals(new File("testdata/org.apache.felix.framework-4.0.2.jar").toURI(),
findContentURI(providers.get(0).getResource()));
}
public static void testResolverHookCannotFilterFrameworkCapabilities() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/osgi.cmpn-4.3.0.index.xml")));
registry.addPlugin(createRepo(IO.getFile("testdata/org.apache.felix.framework-4.0.2.index.xml")));
// Add a hook that tries to remove all capabilities from resource with
// id "org.apache.felix.framework"
registry.addPlugin(new ResolverHook() {
public void filterMatches(Requirement requirement, List<Capability> candidates) {
for (Iterator<Capability> iter = candidates.iterator(); iter.hasNext();) {
Object id = iter.next()
.getResource()
.getCapabilities("osgi.identity")
.get(0)
.getAttributes()
.get("osgi.identity");
if ("org.apache.felix.framework".equals(id)) {
fail("this line should not be reached");
}
}
}
});
BndEditModel runModel = new BndEditModel();
runModel.setRunFw("org.apache.felix.framework");
Requirement requirement = new CapReqBuilder("osgi.wiring.package")
.addDirective("filter", "(&(osgi.wiring.package=org.osgi.util.tracker)(version>=1.5)(!(version>=1.6)))")
.buildSyntheticRequirement();
BndrunResolveContext context = new BndrunResolveContext(runModel, registry, log);
List<Capability> providers = context.findProviders(requirement);
// The filter was ineffective
assertEquals(2, providers.size());
assertEquals(IO.getFile("testdata/org.apache.felix.framework-4.0.2.jar").toURI(),
findContentURI(providers.get(0).getResource()));
assertEquals(IO.getFile("testdata/osgi.cmpn-4.3.0.jar").toURI(),
findContentURI(providers.get(1).getResource()));
}
public static void testPreferLeastRequirementsAndMostCapabilities() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/repo4/index.xml")));
BndEditModel runModel = new BndEditModel();
runModel.setRunFw("org.apache.felix.framework");
Requirement requirement = new CapReqBuilder("x").buildSyntheticRequirement();
BndrunResolveContext context = new BndrunResolveContext(runModel, registry, log);
List<Capability> providers = context.findProviders(requirement);
assertEquals(3, providers.size());
// x.3 has same requirements but more capabilities than x.2
assertEquals(IO.getFile("testdata/repo4/x.3.jar").toURI(), findContentURI(providers.get(0).getResource()));
// x.2 has same capabilities but fewer requirements than x.1
assertEquals(IO.getFile("testdata/repo4/x.2.jar").toURI(), findContentURI(providers.get(1).getResource()));
assertEquals(IO.getFile("testdata/repo4/x.1.jar").toURI(), findContentURI(providers.get(2).getResource()));
}
public static void testResolvePreferences() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/repo4/index.xml")));
BndEditModel runModel = new BndEditModel();
runModel.setRunFw("org.apache.felix.framework");
runModel.genericSet("-resolve.preferences", "x.1");
Requirement requirement = new CapReqBuilder("x").buildSyntheticRequirement();
BndrunResolveContext context = new BndrunResolveContext(runModel, registry, log);
List<Capability> providers = context.findProviders(requirement);
assertEquals(3, providers.size());
assertEquals(IO.getFile("testdata/repo4/x.1.jar").toURI(), findContentURI(providers.get(0).getResource()));
assertEquals(IO.getFile("testdata/repo4/x.3.jar").toURI(), findContentURI(providers.get(1).getResource()));
assertEquals(IO.getFile("testdata/repo4/x.2.jar").toURI(), findContentURI(providers.get(2).getResource()));
}
public static void testSelfCapabilityPreferredOverRepository() {
MockRegistry registry = new MockRegistry();
Repository repo = createRepo(IO.getFile("testdata/repo4.index.xml"));
registry.addPlugin(repo);
Requirement resourceReq = new CapReqBuilder("osgi.identity")
.addDirective("filter", "(osgi.identity=dummy-selfcap)").buildSyntheticRequirement();
Resource resource = repo.findProviders(Collections.singleton(resourceReq))
.get(resourceReq)
.iterator()
.next()
.getResource();
Requirement packageReq = resource.getRequirements("osgi.wiring.package").get(0);
BndEditModel runModel = new BndEditModel();
runModel.setRunFw("org.apache.felix.framework");
BndrunResolveContext context = new BndrunResolveContext(runModel, registry, log);
List<Capability> providers = context.findProviders(packageReq);
assertNotNull(providers);
assertEquals(2, providers.size());
assertEquals(IO.getFile("testdata/repo4/dummy.jar").toURI(), findContentURI(providers.get(0).getResource()));
}
public static void testInputRequirementsAsMandatoryResource() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/repo3.index.xml")));
BndEditModel runModel = new BndEditModel();
runModel.setRunFw("org.apache.felix.framework");
Requirement req = new CapReqBuilder("osgi.identity")
.addDirective("filter", "(osgi.identity=org.apache.felix.gogo.command)").buildSyntheticRequirement();
runModel.setRunRequires(Collections.singletonList(req));
BndrunResolveContext context = new BndrunResolveContext(runModel, registry, log);
context.init();
assertEquals(IO.getFile("testdata/repo3/org.apache.felix.framework-4.0.2.jar").toURI(),
findContentURI(context.getFramework()));
Collection<Resource> mandRes = context.getMandatoryResources();
assertEquals(1, mandRes.size());
Resource resource = mandRes.iterator().next();
assertNotNull(resource);
IdentityCapability ic = ResourceUtils.getIdentityCapability(resource);
assertNotNull(ic);
assertEquals("<<INITIAL>>", ic.osgi_identity());
}
public static void testEERequirementResolvesFramework() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/repo3.index.xml")));
BndEditModel runModel = new BndEditModel();
runModel.setRunFw("org.apache.felix.framework");
runModel.setEE(EE.JavaSE_1_6);
BndrunResolveContext context = new BndrunResolveContext(runModel, registry, log);
Requirement req = new CapReqBuilder("osgi.ee").addDirective("filter", "(osgi.ee=J2SE-1.5)")
.buildSyntheticRequirement();
List<Capability> providers = context.findProviders(req);
assertEquals(1, providers.size());
assertEquals(IO.getFile("testdata/repo3/org.apache.felix.framework-4.0.2.jar").toURI(),
findContentURI(providers.get(0).getResource()));
}
public static void testJREPackageResolvesFramework() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/repo3.index.xml")));
BndEditModel runModel = new BndEditModel();
runModel.setRunFw("org.apache.felix.framework");
runModel.setEE(EE.JavaSE_1_6);
BndrunResolveContext context = new BndrunResolveContext(runModel, registry, log);
Requirement req = CapReqBuilder.createPackageRequirement("javax.annotation", null).buildSyntheticRequirement();
List<Capability> providers = context.findProviders(req);
assertEquals(1, providers.size());
assertEquals(IO.getFile("testdata/repo3/org.apache.felix.framework-4.0.2.jar").toURI(),
findContentURI(providers.get(0).getResource()));
}
public static void testJREPackageNotResolved() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/repo3.index.xml")));
BndEditModel runModel = new BndEditModel();
runModel.setRunFw("org.apache.felix.framework");
runModel.setEE(EE.J2SE_1_5); // javax.annotation added in Java 6
BndrunResolveContext context = new BndrunResolveContext(runModel, registry, log);
Requirement req = CapReqBuilder.createPackageRequirement("javax.annotation", null).buildSyntheticRequirement();
List<Capability> providers = context.findProviders(req);
assertEquals(0, providers.size());
}
public static void testDontResolveBuildOnlyLibraries() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/buildrepo.index.xml")));
BndEditModel runModel = new BndEditModel();
BndrunResolveContext context;
context = new BndrunResolveContext(runModel, registry, log);
List<Capability> providers1 = context.findProviders(
CapReqBuilder.createPackageRequirement("org.osgi.framework", null).buildSyntheticRequirement());
assertEquals(0, providers1.size());
context = new BndrunResolveContext(runModel, registry, log);
List<Capability> providers2 = context.findProviders(
CapReqBuilder.createPackageRequirement("java.security", null).buildSyntheticRequirement());
assertEquals(0, providers2.size());
}
public static void testResolveSystemBundleAlias() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/repo3.index.xml")));
BndEditModel runModel = new BndEditModel();
runModel.setRunFw("org.apache.felix.framework");
runModel.setEE(EE.JavaSE_1_6);
BndrunResolveContext context = new BndrunResolveContext(runModel, registry, log);
Requirement req = new CapReqBuilder("osgi.wiring.host")
.addDirective("filter", "(osgi.wiring.host=system.bundle)").buildSyntheticRequirement();
List<Capability> providers = context.findProviders(req);
assertEquals(1, providers.size());
assertEquals(IO.getFile("testdata/repo3/org.apache.felix.framework-4.0.2.jar").toURI(),
findContentURI(providers.get(0).getResource()));
}
public static void testUnsatisfiedSystemPackage() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/repo3.index.xml")));
BndEditModel runModel = new BndEditModel();
runModel.setRunFw("org.apache.felix.framework");
runModel.setEE(EE.JavaSE_1_6);
BndrunResolveContext context = new BndrunResolveContext(runModel, registry, log);
Requirement req = new CapReqBuilder("osgi.wiring.package")
.addDirective("filter", "(osgi.wiring.package=sun.reflect)").buildSyntheticRequirement();
List<Capability> providers = context.findProviders(req);
assertEquals(0, providers.size());
}
public static void testResolveSystemPackagesExtra() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/repo3.index.xml")));
BndEditModel runModel = new BndEditModel();
runModel.setRunFw("org.apache.felix.framework");
runModel.setEE(EE.JavaSE_1_6);
runModel.setSystemPackages(Collections.singletonList(new ExportedPackage("sun.reflect", new Attrs())));
BndrunResolveContext context = new BndrunResolveContext(runModel, registry, log);
Requirement req = new CapReqBuilder("osgi.wiring.package")
.addDirective("filter", "(osgi.wiring.package=sun.reflect)").buildSyntheticRequirement();
List<Capability> providers = context.findProviders(req);
assertEquals(1, providers.size());
assertEquals(IO.getFile("testdata/repo3/org.apache.felix.framework-4.0.2.jar").toURI(),
findContentURI(providers.get(0).getResource()));
}
public static void testUnsatisfiedRequirement() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/repo3.index.xml")));
BndEditModel runModel = new BndEditModel();
runModel.setRunFw("org.apache.felix.framework");
runModel.setEE(EE.JavaSE_1_6);
BndrunResolveContext context = new BndrunResolveContext(runModel, registry, log);
Requirement req = new CapReqBuilder("osgi.extender")
.addDirective("filter", "(&(osgi.extender=foobar)(version>=1.0))").buildSyntheticRequirement();
List<Capability> providers = context.findProviders(req);
assertEquals(0, providers.size());
}
public static void testResolveSystemCapabilitiesExtra() {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/repo3.index.xml")));
BndEditModel runModel = new BndEditModel();
runModel.setRunFw("org.apache.felix.framework");
runModel.setEE(EE.JavaSE_1_6);
runModel.genericSet("-runsystemcapabilities", "osgi.extender;osgi.extender=foobar;version:Version=1.0");
BndrunResolveContext context = new BndrunResolveContext(runModel, registry, log);
Requirement req = new CapReqBuilder("osgi.extender")
.addDirective("filter", "(&(osgi.extender=foobar)(version>=1.0))").buildSyntheticRequirement();
List<Capability> providers = context.findProviders(req);
assertEquals(1, providers.size());
assertEquals(IO.getFile("testdata/repo3/org.apache.felix.framework-4.0.2.jar").toURI(),
findContentURI(providers.get(0).getResource()));
}
public static void testResolveProvidedCapabilitiesWithDistro() throws Exception {
MockRegistry registry = new MockRegistry();
registry.addPlugin(createRepo(IO.getFile("testdata/repo3.index.xml")));
BndEditModel model = new BndEditModel();
model.genericSet("-runprovidedcapabilities",
"osgi.service;objectClass=foo.bar.FooBarService;effective:=active");
model.setDistro(Arrays.asList("testdata/distro.jar;version=file"));
List<Requirement> requires = new ArrayList<Requirement>();
List<Capability> caps = CapReqBuilder.getCapabilitiesFrom(
new Parameters("osgi.service;objectClass=foo.bar.FooBarService;effective:=active"));
Requirement req = CapReqBuilder.createRequirementFromCapability(caps.get(0)).buildSyntheticRequirement();
requires.add(req);
model.setRunRequires(requires);
BndrunResolveContext context = new BndrunResolveContext(model, registry, log);
context.setLevel(0);
context.init();
Resolver resolver = new BndResolver(new ResolverLogger(4));
resolver.resolve(context);
}
}