package aQute.bnd.deployer.repository;
import java.io.File;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.osgi.framework.Version;
import org.osgi.resource.Capability;
import org.osgi.resource.Requirement;
import aQute.bnd.osgi.resource.CapReqBuilder;
import aQute.lib.io.IO;
import junit.framework.TestCase;
public class FindProvidersTest extends TestCase {
public static void testPackageQuery() throws Exception {
FixedIndexedRepo repo = new FixedIndexedRepo();
Map<String,String> props = new HashMap<String,String>();
props.put("locations", IO.getFile("testdata/minir5.xml").toURI().toString());
repo.setProperties(props);
Requirement req = CapReqBuilder.createPackageRequirement("org.example.a", "[1,2)").buildSyntheticRequirement();
Map<Requirement,Collection<Capability>> result = repo.findProviders(Collections.singleton(req));
assertNotNull(result);
assertTrue(result.containsKey(req));
Collection<Capability> caps = result.get(req);
Capability[] capsArray = caps.toArray(new Capability[0]);
Capability identityCap = capsArray[0].getResource().getCapabilities("osgi.identity").get(0);
Object identityAttrValue = identityCap.getAttributes().get("osgi.identity");
assertEquals("dummybundle", identityAttrValue);
}
public static void testTypedCapabilityAttribute() {
FixedIndexedRepo repo = new FixedIndexedRepo();
Map<String,String> props = new HashMap<String,String>();
props.put("locations", IO.getFile("testdata/minir5.xml").toURI().toString());
repo.setProperties(props);
Requirement req = CapReqBuilder.createPackageRequirement("org.example.a", "[1,2)").buildSyntheticRequirement();
Map<Requirement,Collection<Capability>> result = repo.findProviders(Collections.singleton(req));
Capability id = result.get(req).iterator().next().getResource().getCapabilities("osgi.identity").get(0);
assertEquals(Version.class, id.getAttributes().get("version").getClass());
}
public static void testReadGZippedStream() throws Exception {
FixedIndexedRepo repo = new FixedIndexedRepo();
Map<String,String> props = new HashMap<String,String>();
props.put("locations", IO.getFile("testdata/big_index.xml.gz").toURI().toString());
repo.setProperties(props);
Requirement req = new CapReqBuilder("osgi.identity")
.addDirective("filter", "(&(osgi.identity=osgi.cmpn)(version>=4.2.0)(!(version>=4.2.1)))")
.buildSyntheticRequirement();
Map<Requirement,Collection<Capability>> result = repo.findProviders(Collections.singleton(req));
assertNotNull(result);
assertTrue(result.containsKey(req));
Collection<Capability> caps = result.get(req);
assertEquals(1, caps.size());
Capability identityCap = caps.iterator().next();
List<Capability> contentCaps = identityCap.getResource().getCapabilities("osgi.content");
assertNotNull(contentCaps);
assertEquals(1, contentCaps.size());
Capability contentCap = contentCaps.iterator().next();
assertEquals(IO.getFile("testdata/osgi.cmpn/osgi.cmpn-4.2.0.jar").getAbsoluteFile().toURI(),
contentCap.getAttributes().get("url"));
}
public static void testMultipleMatches() throws Exception {
FixedIndexedRepo repo = new FixedIndexedRepo();
Map<String,String> props = new HashMap<String,String>();
props.put("locations", IO.getFile("testdata/big_index.xml").toURI().toString());
repo.setProperties(props);
Requirement req = CapReqBuilder.createPackageRequirement("aQute.bnd.annotation", "[1.43,2)")
.buildSyntheticRequirement();
Map<Requirement,Collection<Capability>> result = repo.findProviders(Collections.singleton(req));
Collection<Capability> matchingCaps = result.get(req);
// 16 versions of biz.aQute.bndlib plus 8 versions of
// biz.aQute.bnd.annotation!
assertEquals(24, matchingCaps.size());
for (Capability cap : matchingCaps) {
Capability identityCap = cap.getResource().getCapabilities("osgi.identity").iterator().next();
String bsn = (String) identityCap.getAttributes().get("osgi.identity");
assertTrue("biz.aQute.bndlib".equals(bsn) || "biz.aQute.bnd.annotation".equals(bsn));
}
}
public void testResolveByHash() throws Exception {
FixedIndexedRepo repo = new FixedIndexedRepo();
Map<String,String> props = new HashMap<String,String>();
props.put("locations", IO.getFile("testdata/big_index.xml").toURI().toString());
repo.setProperties(props);
Map<String,String> searchProps = new HashMap<>();
searchProps.put("version", "hash");
searchProps.put("hash", "292ecca5d8fdb881f0273c1166b9c20925be063d3baf3824515983f76b73fffb");
File bundle = repo.get("biz.aQute.bnd", null, searchProps);
assertNotNull(bundle);
// the bundle doesn't actually exist... just check the filename
assertEquals("biz.aQute.bnd-1.45.0.jar", bundle.getName());
}
public void testResolveByHashWithAlgorithm() throws Exception {
FixedIndexedRepo repo = new FixedIndexedRepo();
Map<String,String> props = new HashMap<String,String>();
props.put("locations", IO.getFile("testdata/big_index.xml").toURI().toString());
repo.setProperties(props);
Map<String,String> searchProps = new HashMap<>();
searchProps.put("version", "hash");
searchProps.put("hash", "SHA-256:292ecca5d8fdb881f0273c1166b9c20925be063d3baf3824515983f76b73fffb");
File bundle = repo.get("biz.aQute.bnd", null, searchProps);
assertNotNull(bundle);
// the bundle doesn't actually exist... just check the filename
assertEquals("biz.aQute.bnd-1.45.0.jar", bundle.getName());
}
public void testResolveByHashWithWrongAlgorithm() throws Exception {
FixedIndexedRepo repo = new FixedIndexedRepo();
Map<String,String> props = new HashMap<String,String>();
props.put("locations", IO.getFile("testdata/big_index.xml").toURI().toString());
repo.setProperties(props);
Map<String,String> searchProps = new HashMap<>();
searchProps.put("version", "hash");
searchProps.put("hash", "SHA-1:292ecca5d8fdb881f0273c1166b9c20925be063d3baf3824515983f76b73fffb");
File bundle = repo.get("biz.aQute.bnd", null, searchProps);
assertNull(bundle);
}
public void testResolveByHashWithIdCheck() throws Exception {
FixedIndexedRepo repo = new FixedIndexedRepo();
Map<String,String> props = new HashMap<String,String>();
props.put("locations", IO.getFile("testdata/big_index.xml").toURI().toString());
repo.setProperties(props);
Map<String,String> searchProps = new HashMap<>();
searchProps.put("version", "hash");
searchProps.put("hash", "SHA-256:292ecca5d8fdb881f0273c1166b9c20925be063d3baf3824515983f76b73fffb");
try {
File bundle = repo.get("wrong.bsn", null, searchProps);
fail("Expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
}
}