package aQute.bnd.repository.maven.provider;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.nio.charset.StandardCharsets;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import org.osgi.resource.Capability;
import org.osgi.resource.Requirement;
import org.osgi.resource.Resource;
import aQute.bnd.build.Project;
import aQute.bnd.build.Workspace;
import aQute.bnd.http.HttpClient;
import aQute.bnd.osgi.Processor;
import aQute.bnd.osgi.resource.ResourceUtils;
import aQute.bnd.osgi.resource.ResourceUtils.IdentityCapability;
import aQute.bnd.service.RepositoryPlugin.PutOptions;
import aQute.bnd.service.RepositoryPlugin.PutResult;
import aQute.bnd.service.maven.PomOptions;
import aQute.bnd.service.progress.ProgressPlugin;
import aQute.bnd.version.Version;
import aQute.http.testservers.HttpTestServer.Config;
import aQute.lib.io.IO;
import aQute.maven.api.MavenScope;
import aQute.maven.api.Revision;
import aQute.maven.provider.FakeNexus;
import aQute.maven.provider.MavenRepository;
import aQute.maven.provider.POM;
import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
public class MavenBndRepoTest extends TestCase {
String tmpName;
File tmp;
File local;
File remote;
File index;
private MavenBndRepository repo;
private FakeNexus fnx;
private Processor reporter;
@Override
protected void setUp() throws Exception {
super.setUp();
tmpName = "generated/tmp/test/" + getName();
tmp = IO.getFile(tmpName);
IO.delete(tmp);
local = IO.getFile(tmp, "local");
remote = IO.getFile(tmp, "remote");
index = IO.getFile(tmp, "index");
remote.mkdirs();
local.mkdirs();
IO.copy(IO.getFile("testresources/mavenrepo"), remote);
IO.copy(IO.getFile("testresources/mavenrepo/index.maven"), index);
Config config = new Config();
fnx = new FakeNexus(config, remote);
fnx.start();
}
public void testPomGenerate() throws Exception {
config(null);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
PomOptions po = new PomOptions();
po.gav = "test:test:1.0";
po.parent = null;
po.dependencyManagement = false;
repo.toPom(bout, po);
ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
POM pom = new POM((MavenRepository) repo.storage, bin);
assertEquals(Revision.valueOf("test:test:1.0"), pom.getRevision());
assertEquals(3, pom.getDependencies(EnumSet.of(MavenScope.runtime), false).size());
System.out.println(new String(bout.toByteArray(), StandardCharsets.UTF_8));
}
public void testSnapshotGetInRelease() {
}
public void testReleaseGetInSnapshot() {
}
public void testNoLocalCacheSpecfiied() {
}
public void testPutLocalTwiceNoSnapshot() throws Exception {
Map<String,String> map = new HashMap<>();
map.put("releaseUrl", remote.toURI().toString());
config(map);
File jar = IO.getFile("testresources/release.jar");
PutResult put = repo.put(new FileInputStream(jar), null);
assertIsFile(local, "biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0/biz.aQute.bnd.maven-3.2.0.jar");
assertIsFile(local, "biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0/biz.aQute.bnd.maven-3.2.0.pom");
put = repo.put(new FileInputStream(jar), null);
Requirement wc = ResourceUtils.createWildcardRequirement();
Collection<Capability> caps = repo.findProviders(Collections.singleton(wc)).get(wc);
Set<Resource> resources = ResourceUtils.getResources(caps);
assertEquals(2, resources.size());
IdentityCapability bc = ResourceUtils.getIdentityCapability(resources.iterator().next());
assertEquals("biz.aQute.bnd.maven", bc.osgi_identity());
}
public void testPutReleaseAndThenIndex() throws Exception {
Workspace ws = Workspace.findWorkspace(IO.getFile("testdata/releasews"));
Project p1 = ws.getProject("p1");
Project indexProject = ws.getProject("index");
Map<String,String> map = new HashMap<>();
map.put("releaseUrl", remote.toURI().toString());
config(map);
repo.begin(indexProject);
File jar = IO.getFile("testresources/release.jar");
PutOptions po = new PutOptions();
po.context = p1;
PutResult put = repo.put(new FileInputStream(jar), po);
File demoJar = IO.getFile("testresources/demo.jar");
PutOptions indexPo = new PutOptions();
indexPo.context = indexProject;
put = repo.put(new FileInputStream(demoJar), indexPo);
repo.end(indexProject);
assertTrue(indexProject.check());
assertTrue(IO.getFile(remote, "biz/aQute/bnd/demo/1.0.0/demo-1.0.0-index.xml").isFile());
}
public void testNoIndexFile() throws Exception {
Map<String,String> map = new HashMap<>();
map.put("index", "generated/does_not_exist");
config(map);
repo.list(null);
assertTrue(reporter.check());
}
public void testGet() throws Exception {
config(null);
File file = repo.get("commons-cli:commons-cli", new Version("1.0.0"), null);
assertNotNull(file);
assertTrue(file.isFile());
}
public void testGetFileRepo() throws Exception {
Map<String,String> map = new HashMap<>();
map.put("releaseUrl", remote.toURI().toString());
config(map);
File file = repo.get("commons-cli:commons-cli", new Version("1.0.0"), null);
assertNotNull(file);
assertTrue(file.isFile());
}
/*
* Commons CLI 1.2 is in there as GAV & as BSN
*/
public void testGetViaBSNAndGAV() throws Exception {
config(null);
assertEquals(1, repo.list("org.apache.commons.cli").size());
System.out.println(repo.list("org.apache.commons.cli"));
System.out.println(repo.versions("org.apache.commons.cli"));
File f12maven = repo.get("commons-cli:commons-cli", new Version("1.2.0"), null);
File f12osgi = repo.get("org.apache.commons.cli", new Version("1.2.0"), null);
assertEquals("commons-cli-1.2.jar", f12maven.getName());
assertEquals(f12maven, f12osgi);
}
public void testList() throws Exception {
config(null);
List<String> l = repo.list(null);
System.out.println(l);
assertEquals(4, l.size());
assertTrue(l.contains("commons-cli:commons-cli"));
SortedSet<Version> versions = repo.versions("commons-cli:commons-cli");
assertEquals("[1.0.0, 1.2.0, 1.4.0.SNAPSHOT]", versions.toString());
versions = repo.versions("org.apache.commons.cli");
assertEquals("[1.2.0]", versions.toString());
Requirement all = ResourceUtils.createWildcardRequirement();
Collection<Capability> providers = repo.findProviders(Collections.singleton(all)).get(all);
Set<Resource> resources = ResourceUtils.getResources(providers);
// there is only one bundle in the store
assertEquals(1, resources.size());
}
public void testPutDefaultLocalSnapshot() throws Exception {
Map<String,String> map = new HashMap<>();
map.put("releaseUrl", null);
map.put("snapshotUrl", null);
config(map);
File jar = IO.getFile("testresources/snapshot.jar");
PutResult put = repo.put(new FileInputStream(jar), null);
assertIsFile(local, "biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-SNAPSHOT.jar");
assertIsFile(local, "biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-SNAPSHOT.pom");
String s = IO.collect(index);
assertFalse(s.contains("biz.aQute.bnd.maven"));
}
public void testPutDefaultLocalSnapshotFileRepo() throws Exception {
Map<String,String> map = new HashMap<>();
map.put("snapshotUrl", remote.toURI().toString());
config(map);
File jar = IO.getFile("testresources/snapshot.jar");
PutResult put = repo.put(new FileInputStream(jar), null);
assertIsFile(local, "biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-SNAPSHOT.jar");
assertIsFile(local, "biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-SNAPSHOT.pom");
String s = IO.collect(index);
// snapshots not added to index
assertFalse(s.contains("biz.aQute.bnd.maven"));
}
public void testPutRemoteSnapshot() throws Exception {
Map<String,String> map = new HashMap<>();
map.put("releaseUrl", null);
map.put("snapshotUrl", fnx.getBaseURI() + "/repo/");
config(map);
File jar = IO.getFile("testresources/snapshot.jar");
try (Processor context = new Processor();) {
context.setProperty("-maven-release", "remote;snapshot=1");
PutOptions put = new PutOptions();
put.context = context;
PutResult r = repo.put(new FileInputStream(jar), put);
assertIsFile(local,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-SNAPSHOT.jar");
assertIsFile(local,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-SNAPSHOT.pom");
assertIsFile(local,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-SNAPSHOT-sources.jar");
assertIsFile(local,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-SNAPSHOT-javadoc.jar");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000000-1.pom");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000000-1.jar");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000000-1-sources.jar");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000000-1-javadoc.jar");
assertIsFile(remote, "biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/maven-metadata.xml");
File f = IO.getFile(remote, "biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/maven-metadata.xml");
String s = IO.collect(f);
assertTrue(s.contains("3.2.0-19700101.000000"));
}
//
// Now try to update it
//
try (Processor context = new Processor();) {
context.setProperty("-maven-release", "remote;snapshot=10000");
PutOptions put = new PutOptions();
put.context = context;
PutResult r = repo.put(new FileInputStream(jar), put);
assertIsFile(local,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-SNAPSHOT.jar");
assertIsFile(local,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-SNAPSHOT.pom");
assertIsFile(local,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-SNAPSHOT-sources.jar");
assertIsFile(local,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-SNAPSHOT-javadoc.jar");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000000-1.pom");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000000-1.jar");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000000-1-sources.jar");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000000-1-javadoc.jar");
assertIsFile(remote, "biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/maven-metadata.xml");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000010-2.pom");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000010-2.jar");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000010-2-sources.jar");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000010-2-javadoc.jar");
assertIsFile(remote, "biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/maven-metadata.xml");
File f = IO.getFile(remote, "biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/maven-metadata.xml");
String s = IO.collect(f);
assertTrue(s.contains("<value>3.2.0-19700101.000000-1</value>"));
assertTrue(s.contains("<value>3.2.0-19700101.000010-2</value>"));
}
}
public void testPutRemoteSnapshotFileRepo() throws Exception {
Map<String,String> map = new HashMap<>();
map.put("snapshotUrl", remote.toURI().toString());
config(map);
File jar = IO.getFile("testresources/snapshot.jar");
try (Processor context = new Processor();) {
context.setProperty("-maven-release", "remote;snapshot=1");
PutOptions put = new PutOptions();
put.context = context;
PutResult r = repo.put(new FileInputStream(jar), put);
assertIsFile(local,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-SNAPSHOT.jar");
assertIsFile(local,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-SNAPSHOT.pom");
assertIsFile(local,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-SNAPSHOT-sources.jar");
assertIsFile(local,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-SNAPSHOT-javadoc.jar");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000000-1.pom");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000000-1.jar");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000000-1-sources.jar");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000000-1-javadoc.jar");
assertIsFile(remote, "biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/maven-metadata.xml");
File f = IO.getFile(remote, "biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/maven-metadata.xml");
String s = IO.collect(f);
assertTrue(s.contains("3.2.0-19700101.000000"));
}
//
// Now try to update it
//
try (Processor context = new Processor();) {
context.setProperty("-maven-release", "remote;snapshot=10000");
PutOptions put = new PutOptions();
put.context = context;
PutResult r = repo.put(new FileInputStream(jar), put);
assertIsFile(local,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-SNAPSHOT.jar");
assertIsFile(local,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-SNAPSHOT.pom");
assertIsFile(local,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-SNAPSHOT-sources.jar");
assertIsFile(local,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-SNAPSHOT-javadoc.jar");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000000-1.pom");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000000-1.jar");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000000-1-sources.jar");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000000-1-javadoc.jar");
assertIsFile(remote, "biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/maven-metadata.xml");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000010-2.pom");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000010-2.pom.sha1");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000010-2.pom.md5");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000010-2.jar");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000010-2-sources.jar");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000010-2-javadoc.jar");
assertIsFile(remote, "biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/maven-metadata.xml");
File f = IO.getFile(remote, "biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/maven-metadata.xml");
String s = IO.collect(f);
assertTrue(s.contains("<value>3.2.0-19700101.000000-1</value>"));
assertTrue(s.contains("<value>3.2.0-19700101.000010-2</value>"));
}
//
// Now try to update it again, should increase build number
//
try (Processor context = new Processor();) {
context.setProperty("-maven-release", "remote;snapshot=20000");
PutOptions put = new PutOptions();
put.context = context;
PutResult r = repo.put(new FileInputStream(jar), put);
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000020-3.pom");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000020-3.jar");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000020-3-sources.jar");
assertIsFile(remote,
"biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/biz.aQute.bnd.maven-3.2.0-19700101.000020-3-javadoc.jar");
assertIsFile(remote, "biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/maven-metadata.xml");
File f = IO.getFile(remote, "biz/aQute/bnd/biz.aQute.bnd.maven/3.2.0-SNAPSHOT/maven-metadata.xml");
String s = IO.collect(f);
assertTrue(s.contains("<value>3.2.0-19700101.000020-3</value>"));
}
}
private void assertIsFile(File dir, String path) {
if (!IO.getFile(dir, path).isFile())
throw new AssertionFailedError(path + " does not exist");
}
void config(Map<String,String> override) throws Exception {
Map<String,String> config = new HashMap<>();
config.put("local", tmpName + "/local");
config.put("index", tmpName + "/index");
config.put("releaseUrl", fnx.getBaseURI() + "/repo/");
if (override != null)
config.putAll(override);
reporter = new Processor();
reporter.addBasicPlugin(new ProgressPlugin() {
@Override
public Task startTask(final String name, int size) {
System.out.println("Starting " + name);
return new Task() {
@Override
public void worked(int units) {
System.out.println("Worked " + name + " " + units);
}
@Override
public void done(String message, Throwable e) {
System.out.println("Done " + name + " " + message + " " + e);
}
@Override
public boolean isCanceled() {
return false;
}
};
}
});
HttpClient client = new HttpClient();
client.setRegistry(reporter);
Executor executor = Executors.newCachedThreadPool();
reporter.addBasicPlugin(client);
reporter.setTrace(true);
repo = new MavenBndRepository();
repo.setReporter(reporter);
repo.setRegistry(reporter);
repo.setProperties(config);
}
public void testPutPlainJarInRepo() throws Exception {
Map<String,String> map = new HashMap<>();
map.put("releaseUrl", remote.toURI().toString());
config(map);
File f = IO.getFile("testdata/plainjar/olingo-odata2-api-1.2.0.jar");
try (FileInputStream in = new FileInputStream(f)) {
repo.put(in, null);
}
}
}