package biz.aQute.resolve;
import static test.lib.Utils.createRepo;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.osgi.framework.namespace.IdentityNamespace;
import org.osgi.resource.Capability;
import org.osgi.resource.Requirement;
import org.osgi.resource.Resource;
import org.osgi.service.repository.Repository;
import org.osgi.service.resolver.Resolver;
import aQute.bnd.build.model.EE;
import aQute.bnd.osgi.resource.CapReqBuilder;
import aQute.bnd.version.Version;
import aQute.bnd.version.VersionRange;
import aQute.lib.io.IO;
import junit.framework.TestCase;
@SuppressWarnings("restriction")
public class GenericResolveContextResolveTest extends TestCase {
ResolverLogger logger = new ResolverLogger(0, System.out);
/**
* Simple basic resolve. We use a small index with gogo + framework and then
* try to see if we can resolve the runtime from the shell requirement.
*
* @throws Exception
*/
public void testSimpleResolve() throws Exception {
Repository repository = createRepo(IO.getFile("testdata/repo3.index.xml"));
GenericResolveContext grc = new GenericResolveContext(logger);
grc.setLevel(2);
grc.addRepository(repository);
grc.addFramework("org.apache.felix.framework", null);
grc.addEE(EE.JavaSE_1_7);
grc.addRequireBundle("org.apache.felix.gogo.shell", new VersionRange("[0,1]"));
grc.done();
Resolver resolver = new BndResolver(new ResolverLogger(4));
Set<Resource> resources = resolver.resolve(grc).keySet();
assertNotNull(getResource(resources, "org.apache.felix.gogo.runtime", "0.10"));
}
/**
* Check default directive
*/
public void testResolveRequirementNoDirective() {
Repository repository = createRepo(IO.getFile("testdata/repo6/index.xml"));
GenericResolveContext grc = new GenericResolveContext(logger);
grc.setLevel(2);
grc.addRepository(repository);
Requirement logservice = new CapReqBuilder("osgi.service")
.addDirective("filter", "(objectClass=org.osgi.service.log.LogService)").buildSyntheticRequirement();
List<Capability> providers = grc.findProviders(logservice);
assertEquals(2, providers.size());
assertNames(providers, "test.a", "test.b");
}
/**
* Check expressly set directive
*/
public void testResolveRequirementResolveDirective() {
Repository repository = createRepo(IO.getFile("testdata/repo6/index.xml"));
GenericResolveContext grc = new GenericResolveContext(logger);
grc.addRepository(repository);
Requirement logservice = new CapReqBuilder("osgi.service")
.addDirective("filter", "(objectClass=org.osgi.service.log.LogService)")
.addDirective("effective", "resolve")
.buildSyntheticRequirement();
List<Capability> providers = grc.findProviders(logservice);
assertEquals(2, providers.size());
assertNames(providers, "test.a", "test.b");
}
public void testResolveRequirementActiveDirective() {
Repository repository = createRepo(IO.getFile("testdata/repo6/index.xml"));
GenericResolveContext grc = new GenericResolveContext(logger);
grc.addRepository(repository);
Requirement logservice = new CapReqBuilder("osgi.service")
.addDirective("filter", "(objectClass=org.osgi.service.log.LogService)")
.addDirective("effective", "active")
.buildSyntheticRequirement();
List<Capability> providers = grc.findProviders(logservice);
assertEquals(3, providers.size());
assertNames(providers, "test.a", "test.b", "test.c");
}
private static Resource getResource(Set<Resource> resources, String bsn, String versionString) {
for (Resource resource : resources) {
List<Capability> identities = resource.getCapabilities(IdentityNamespace.IDENTITY_NAMESPACE);
if (identities != null && identities.size() == 1) {
Capability idCap = identities.get(0);
Object id = idCap.getAttributes().get(IdentityNamespace.IDENTITY_NAMESPACE);
Object version = idCap.getAttributes().get(IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE);
if (bsn.equals(id)) {
if (versionString == null) {
return resource;
}
Version requested = Version.parseVersion(versionString);
Version current;
if (version instanceof Version) {
current = (Version) version;
} else {
current = Version.parseVersion("" + version);
}
if (requested.equals(current)) {
return resource;
}
}
}
}
return null;
}
void assertNames(List<Capability> providers, String... ids) {
Set<String> resourceNames = new HashSet<String>();
for (Capability cap : providers) {
resourceNames.add(cap.getResource()
.getCapabilities(IdentityNamespace.IDENTITY_NAMESPACE)
.get(0)
.getAttributes()
.get(IdentityNamespace.IDENTITY_NAMESPACE)
.toString());
}
Set<String> expectedResourceNames = new HashSet<String>(Arrays.asList(ids));
assertEquals(expectedResourceNames, resourceNames);
}
}