package biz.aQute.remote;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.dto.BundleDTO;
import org.osgi.framework.launch.Framework;
import org.osgi.framework.wiring.dto.BundleRevisionDTO;
import aQute.bnd.osgi.Builder;
import aQute.bnd.osgi.Jar;
import aQute.bnd.version.Version;
import aQute.lib.io.IO;
import aQute.remote.api.Agent;
import aQute.remote.plugin.LauncherSupervisor;
import junit.framework.TestCase;
public class RemoteTest extends TestCase {
private int random;
private HashMap<String,Object> configuration;
private Framework framework;
private BundleContext context;
private Bundle agent;
private String location;
private File tmp;
@Override
protected void setUp() throws Exception {
try {
tmp = IO.getFile("generated/tmp");
configuration = new HashMap<String,Object>();
configuration.put(Constants.FRAMEWORK_STORAGE_CLEAN, Constants.FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT);
configuration.put(Constants.FRAMEWORK_STORAGE, new File(tmp, "fwstorage").getAbsolutePath());
configuration.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, "org.osgi.framework.launch;version=1.2");
framework = new org.apache.felix.framework.FrameworkFactory().newFramework(configuration);
framework.init();
framework.start();
context = framework.getBundleContext();
location = "reference:" + IO.getFile("generated/biz.aQute.remote.agent.jar").toURI().toString();
agent = context.installBundle(location);
agent.start();
super.setUp();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void tearDown() throws Exception {
framework.stop();
framework.waitForStop(10000);
IO.delete(tmp);
super.tearDown();
}
public void testSimple() throws Exception {
LauncherSupervisor supervisor = new LauncherSupervisor();
supervisor.connect("localhost", Agent.DEFAULT_PORT);
assertNotNull(supervisor);
Agent agent = supervisor.getAgent();
assertNotNull(agent.getFramework());
// Create stdin/stderr buffers
// and redirect output
StringBuffer stderr = new StringBuffer();
StringBuffer stdout = new StringBuffer();
supervisor.setStderr(stderr);
supervisor.setStdout(stdout);
supervisor.redirect(1);
//
// Install the bundle systemio
//
File f = IO.getFile("generated/biz.aQute.remote.test.systemio.jar");
String sha = supervisor.addFile(f);
BundleDTO bundle = agent.install(f.getAbsolutePath(), sha);
//
// Start the bundle and capture the output
//
String result = agent.start(bundle.id);
assertNull(result, result);
Thread.sleep(1000);
assertEquals("Hello World", stdout.toString().trim());
stdout.setLength(0);
// Send input (will be consumed by the Activator.stop
ByteArrayInputStream bin = new ByteArrayInputStream(new String("Input\n").getBytes());
supervisor.setStdin(bin);
// stop the bundle (will return input as uppercase)
result = agent.stop(bundle.id);
assertNull(result, result);
Thread.sleep(1000);
assertEquals("INPUT", stdout.toString().trim());
}
public void testUpdate() throws Exception {
LauncherSupervisor supervisor = new LauncherSupervisor();
supervisor.connect("localhost", Agent.DEFAULT_PORT);
File t1 = create("bsn-1", new Version(1, 0, 0));
File t2 = create("bsn-2", new Version(1, 0, 0));
assertTrue(t1.isFile());
assertTrue(t2.isFile());
String sha1 = supervisor.addFile(t1);
String sha2 = supervisor.addFile(t2);
Map<String,String> update = new HashMap<String,String>();
update.put(t1.getAbsolutePath(), sha1);
String errors = supervisor.getAgent().update(update);
assertNull(errors);
//
// Verify that t1 is installed and t2 not
//
Bundle b1 = context.getBundle(t1.getAbsolutePath());
assertNotNull(b1);
Bundle b2 = context.getBundle(t2.getAbsolutePath());
assertNull(b2);
//
// Now add a new one
//
update = new HashMap<String,String>();
update.put(t1.getAbsolutePath(), sha1);
update.put(t2.getAbsolutePath(), sha2);
errors = supervisor.getAgent().update(update);
assertNull(errors);
assertNotNull(context.getBundle(t1.getAbsolutePath()));
assertNotNull(context.getBundle(t2.getAbsolutePath()));
//
// Now change a bundle
//
t1 = create("bsn-1", new Version(2, 0, 0));
sha1 = supervisor.addFile(t1);
update = new HashMap<String,String>();
update.put(t1.getAbsolutePath(), sha1);
update.put(t2.getAbsolutePath(), sha2);
errors = supervisor.getAgent().update(update);
assertNull(errors);
b1 = context.getBundle(t1.getAbsolutePath());
assertNotNull(b1);
b2 = context.getBundle(t2.getAbsolutePath());
assertNotNull(b2);
assertEquals(new Version(2, 0, 0).toString(), b1.getVersion().toString());
assertEquals(Bundle.ACTIVE, b1.getState());
assertEquals(Bundle.ACTIVE, b2.getState());
//
// Now delete t1
//
update = new HashMap<String,String>();
update.put(t2.getAbsolutePath(), sha2);
errors = supervisor.getAgent().update(update);
assertNull(errors);
assertNull(context.getBundle(t1.getAbsolutePath()));
assertNotNull(context.getBundle(t2.getAbsolutePath()));
//
// Delete all
//
supervisor.getAgent().update(null);
assertNull(context.getBundle(t1.getAbsolutePath()));
assertNull(context.getBundle(t2.getAbsolutePath()));
}
public void testUpdateOrder() throws Exception {
LauncherSupervisor supervisor = new LauncherSupervisor();
supervisor.connect("localhost", Agent.DEFAULT_PORT);
List<String> bundles = new ArrayList<String>();
LinkedHashMap<String,String> update = new LinkedHashMap<String,String>();
for (int i = 0; i < 50; i++) {
String name = UUID.randomUUID().toString();
File f = create(name, new Version(1, 0, 0));
assertTrue(f.isFile());
String sha = supervisor.addFile(f);
update.put(f.getAbsolutePath(), sha);
bundles.add(name);
}
String errors = supervisor.getAgent().update(update);
assertNull(errors);
//
// Now check installed bundle order
//
Bundle[] installed = context.getBundles();
for (int i = 2; i < installed.length; i++) {
Bundle b = installed[i];
assertTrue(b.getLocation().endsWith(bundles.get(i - 2) + "-1.0.0.jar"));
}
// delete
supervisor.getAgent().update(null);
}
private File create(String bsn, Version v) throws Exception {
String name = bsn + "-" + v;
Builder b = new Builder();
b.setBundleSymbolicName(bsn);
b.setBundleVersion(v);
b.setProperty("Random", random++ + "");
b.setProperty("-resourceonly", true + "");
b.setIncludeResource("foo;literal='foo'");
Jar jar = b.build();
assertTrue(b.check());
File file = IO.getFile(tmp, name + ".jar");
file.getParentFile().mkdirs();
jar.updateModified(System.currentTimeMillis(), "Force it to now");
jar.write(file);
b.close();
return file;
}
/*
* Test if we can get the BundleRevisionDTOs
*/
public void testBRD() throws Exception {
LauncherSupervisor supervisor = new LauncherSupervisor();
supervisor.connect("localhost", Agent.DEFAULT_PORT);
assertNotNull(supervisor);
Agent agent = supervisor.getAgent();
assertNotNull(agent);
List<BundleRevisionDTO> bundleRevisons = agent.getBundleRevisons();
assertNotNull(bundleRevisons);
}
}