package aQute.bnd.repository.osgi;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import aQute.bnd.build.Workspace;
import aQute.bnd.http.HttpClient;
import aQute.bnd.osgi.Constants;
import aQute.bnd.osgi.Jar;
import aQute.bnd.osgi.Processor;
import aQute.bnd.service.RepositoryListenerPlugin;
import aQute.bnd.service.RepositoryPlugin;
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.provider.FakeNexus;
import junit.framework.TestCase;
public class OSGiRepositoryTest extends TestCase {
File tmp;
File cache;
File remote;
File ws;
private FakeNexus fnx;
@Override
protected void setUp() throws Exception {
super.setUp();
tmp = IO.getFile("generated/tmp/test/" + getName());
cache = IO.getFile(tmp, "cache");
remote = IO.getFile(tmp, "testdata");
ws = IO.getFile(tmp, "ws");
IO.delete(tmp);
Config config = new Config();
fnx = new FakeNexus(config, remote);
fnx.start();
remote.mkdirs();
IO.copy(IO.getFile("testdata/minir5.xml"), IO.getFile(remote, "minir5.xml"));
IO.copy(IO.getFile("testdata/bundles"), IO.getFile(remote, "bundles"));
}
public void testSimple() throws Exception {
try (OSGiRepository r = new OSGiRepository();) {
Map<String,String> map = new HashMap<>();
map.put("locations", fnx.getBaseURI("/repo/minir5.xml").toString());
map.put("cache", cache.getPath());
map.put("max.stale", "10000");
r.setProperties(map);
Processor p = new Processor();
HttpClient httpClient = new HttpClient();
httpClient.setCache(cache);
httpClient.setRegistry(p);
p.addBasicPlugin(httpClient);
p.setBase(ws);
p.addBasicPlugin(Workspace.createStandaloneWorkspace(p, ws.toURI()));
r.setRegistry(p);
final AtomicInteger tasks = new AtomicInteger();
p.addBasicPlugin(new ProgressPlugin() {
@Override
public Task startTask(final String name, int size) {
System.out.println("Starting " + name);
tasks.incrementAndGet();
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);
}
@Override
public boolean isCanceled() {
return false;
}
};
}
});
assertEquals(0, tasks.get());
File file = r.get("dummybundle", new Version("0"), null);
assertNotNull(file);
assertEquals(2, tasks.get()); // 2 = index + file
File file2 = r.get("dummybundle", new Version("0"), null);
assertNotNull(file2);
// second one should not have downloaded
assertEquals(2, tasks.get());
r.refresh();
File file3 = r.get("dummybundle", new Version("0"), null);
assertNotNull(file3);
// second one should not have downloaded
assertEquals(2, tasks.get());
}
}
public void testNoPolling() throws Exception {
try {
Processor p = new Processor();
p.setProperty(Constants.GESTALT, Constants.GESTALT_BATCH);
Workspace workspace = Workspace.createStandaloneWorkspace(p, ws.toURI());
testPolling(workspace);
fail();
} catch (Error e) {
return;
}
}
public void testPolling() throws Exception {
Processor p = new Processor();
testPolling(Workspace.createStandaloneWorkspace(p, ws.toURI()));
}
public void testPolling(Workspace workspace) throws Exception {
try (OSGiRepository r = new OSGiRepository();) {
Map<String,String> map = new HashMap<>();
map.put("locations", fnx.getBaseURI("/repo/minir5.xml").toString());
map.put("cache", cache.getPath());
map.put("max.stale", "10000");
map.put("name", "test");
map.put("poll.time", "1");
r.setProperties(map);
Processor p = new Processor();
HttpClient httpClient = new HttpClient();
httpClient.setCache(cache);
httpClient.setRegistry(p);
p.addBasicPlugin(httpClient);
p.setBase(ws);
p.addBasicPlugin(workspace);
r.setRegistry(p);
final AtomicReference<RepositoryPlugin> refreshed = new AtomicReference<>();
p.addBasicPlugin(new RepositoryListenerPlugin() {
@Override
public void repositoryRefreshed(RepositoryPlugin repository) {
refreshed.set(repository);
}
@Override
public void repositoriesRefreshed() {
// TODO Auto-generated method stub
}
@Override
public void bundleRemoved(RepositoryPlugin repository, Jar jar, File file) {
// TODO Auto-generated method stub
}
@Override
public void bundleAdded(RepositoryPlugin repository, Jar jar, File file) {
// TODO Auto-generated method stub
}
});
File file = r.get("dummybundle", new Version("0"), null);
assertNotNull(file);
assertNull(r.title(new Object[0])); // not stale, default name
System.out.println("1");
Thread.sleep(3000);
System.out.println("2");
assertEquals(null, refreshed.get());
System.out.println("3");
// update the index file
File index = IO.getFile(remote, "minir5.xml");
long time = index.lastModified();
String s = IO.collect(index);
s += " "; // change the sha
IO.store(s, index);
System.out.println("5 " + index + " " + (index.lastModified() - time));
Thread.sleep(3000); // give the poller a chance
System.out.println("6");
assertEquals(r, refreshed.get());
assertEquals("test [stale]", r.title(new Object[0]));
System.out.println(r.tooltip(new Object[0]));
}
}
public void testPollingWithFile() throws Exception {
try (OSGiRepository r = new OSGiRepository();) {
Map<String,String> map = new HashMap<>();
map.put("locations", IO.getFile(remote, "minir5.xml").toURI().toString());
map.put("cache", cache.getPath());
map.put("max.stale", "10000");
map.put("name", "test");
map.put("poll.time", "1");
r.setProperties(map);
Processor p = new Processor();
HttpClient httpClient = new HttpClient();
httpClient.setCache(cache);
httpClient.setRegistry(p);
p.addBasicPlugin(httpClient);
p.setBase(ws);
p.addBasicPlugin(Workspace.createStandaloneWorkspace(p, ws.toURI()));
r.setRegistry(p);
final AtomicReference<RepositoryPlugin> refreshed = new AtomicReference<>();
p.addBasicPlugin(new RepositoryListenerPlugin() {
@Override
public void repositoryRefreshed(RepositoryPlugin repository) {
refreshed.set(repository);
}
@Override
public void repositoriesRefreshed() {
// TODO Auto-generated method stub
}
@Override
public void bundleRemoved(RepositoryPlugin repository, Jar jar, File file) {
// TODO Auto-generated method stub
}
@Override
public void bundleAdded(RepositoryPlugin repository, Jar jar, File file) {
// TODO Auto-generated method stub
}
});
File file = r.get("dummybundle", new Version("0"), null);
assertNotNull(file);
Thread.sleep(3000);
assertEquals(null, refreshed.get());
System.out.println("1");
// update the index file
File index = IO.getFile(remote, "minir5.xml");
long time = index.lastModified();
do {
Thread.sleep(1000);
String s = IO.collect(index);
s += " "; // change the sha
IO.store(s, index);
System.out.println(index.lastModified());
} while (index.lastModified() == time);
System.out.println("2 ");
Thread.sleep(3000); // give the poller a chance
System.out.println("3 ");
assertEquals(r, refreshed.get());
assertEquals("test [stale]", r.title(new Object[0]));
System.out.println(r.tooltip(new Object[0]));
}
}
public void testBndRepo() throws Exception {
try (OSGiRepository r = new OSGiRepository();) {
Map<String,String> map = new HashMap<>();
map.put("locations",
"https://bndtools.ci.cloudbees.com/job/bnd.master/lastSuccessfulBuild/artifact/dist/bundles/index.xml.gz");
map.put("cache", cache.getPath());
map.put("max.stale", "10000");
r.setProperties(map);
Processor p = new Processor();
HttpClient httpClient = new HttpClient();
httpClient.setCache(cache);
httpClient.setRegistry(p);
p.addBasicPlugin(httpClient);
p.setBase(ws);
p.addBasicPlugin(Workspace.createStandaloneWorkspace(p, ws.toURI()));
r.setRegistry(p);
final AtomicInteger tasks = new AtomicInteger();
p.addBasicPlugin(new ProgressPlugin() {
@Override
public Task startTask(final String name, int size) {
System.out.println("Starting " + name);
tasks.incrementAndGet();
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);
}
@Override
public boolean isCanceled() {
return false;
}
};
}
});
assertEquals(0, tasks.get());
List<String> list = r.list(null);
assertFalse(list.isEmpty());
SortedSet<Version> versions = r.versions("aQute.libg");
assertFalse(versions.isEmpty());
File f1 = r.get("aQute.libg", versions.first(), null);
assertNotNull(f1);
assertEquals(2, tasks.get()); // index + bundle
File f2 = r.get("aQute.libg", versions.first(), null);
assertEquals(2, tasks.get());// should use cache
r.getIndex(true);
File f3 = r.get("aQute.libg", versions.first(), null);
assertEquals(4, tasks.get()); // should fetch again
}
}
}