package biz.aQute.remote; import java.io.File; import java.net.ConnectException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.ServiceLoader; 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.launch.FrameworkFactory; import org.osgi.framework.wiring.dto.BundleRevisionDTO; import org.osgi.resource.dto.RequirementDTO; 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.api.Event; import aQute.remote.api.Supervisor; import aQute.remote.util.AgentSupervisor; import junit.framework.TestCase; public class AgentTest extends TestCase { private int random; private File tmp; private Framework framework; private BundleContext context; private Bundle agent; private File t1; private File t2; private File t3; private TestSupervisor supervisor; @Override protected void setUp() throws Exception { tmp = IO.getFile("generated/tmp"); tmp.mkdirs(); t1 = create("bsn-1", new Version(1, 0, 0)); t2 = create("bsn-2", new Version(2, 0, 0)); t3 = create("bsn-3", new Version(3, 0, 0)); ServiceLoader<FrameworkFactory> sl = ServiceLoader.load(FrameworkFactory.class, this.getClass().getClassLoader()); FrameworkFactory ff = sl.iterator().next(); Map<String,String> configuration = new HashMap<String,String>(); configuration.put(Constants.FRAMEWORK_STORAGE_CLEAN, Constants.FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT); configuration.put(Constants.FRAMEWORK_STORAGE, new File(tmp, "fwstorage").getAbsolutePath()); framework = ff.newFramework(configuration); framework.init(); framework.start(); context = framework.getBundleContext(); String location = "reference:" + t1.toURI().toString(); context.installBundle(location); location = "reference:" + t2.toURI().toString(); context.installBundle(location); location = "reference:" + IO.getFile("generated/biz.aQute.remote.agent.jar").toURI().toString(); agent = context.installBundle(location); agent.start(); supervisor = new TestSupervisor(); supervisor.connect("localhost", Agent.DEFAULT_PORT); super.setUp(); } @Override protected void tearDown() throws Exception { super.tearDown(); framework.stop(); IO.delete(tmp); IO.delete(IO.getFile("generated/cache")); IO.delete(IO.getFile("generated/storage")); framework.waitForStop(100000); super.tearDown(); } public void testAgentGetBundles() throws Exception { List<BundleDTO> bundles = supervisor.getAgent().getBundles(); assertNotNull(bundles); assertEquals(4, bundles.size()); assertEquals("bsn-1", bundles.get(1).symbolicName); assertEquals("1.0.0", bundles.get(1).version); assertEquals("bsn-2", bundles.get(2).symbolicName); assertEquals("2.0.0", bundles.get(2).version); bundles = supervisor.getAgent().getBundles(1, 2); assertEquals(2, bundles.size()); assertEquals("bsn-1", bundles.get(0).symbolicName); assertEquals("1.0.0", bundles.get(0).version); } public void testAgentGetBundleRevisions() throws Exception { List<BundleRevisionDTO> bundleRevisions = supervisor.getAgent().getBundleRevisons(); assertNotNull(bundleRevisions); assertEquals(4, bundleRevisions.size()); List<RequirementDTO> reqs = bundleRevisions.get(3).requirements; // agent assertNotNull(reqs); assertTrue(reqs.size() > 0); assertEquals("osgi.wiring.package", reqs.get(0).namespace); } public void testAgentInstallBundle() throws Exception { String sha = supervisor.addFile(t3); BundleDTO bundle = supervisor.getAgent().install(t3.getAbsolutePath(), sha); assertNotNull(bundle); assertEquals(4, bundle.id); assertEquals("bsn-3", bundle.symbolicName); assertEquals("3.0.0", bundle.version); } public void testAgentInstallBundleFromURL() throws Exception { BundleDTO bundle = supervisor.getAgent().installFromURL(t3.getAbsolutePath(), t3.toURI().toURL().toExternalForm()); assertNotNull(bundle); assertEquals(4, bundle.id); assertEquals("bsn-3", bundle.symbolicName); assertEquals("3.0.0", bundle.version); assertEquals(5, supervisor.getAgent().getBundles().size()); } public void testAgentUninstallBundle() throws Exception { List<BundleDTO> existingBundles = supervisor.getAgent().getBundles(); assertNotNull(existingBundles); assertTrue(existingBundles.size() == 4); assertNull(supervisor.getAgent().uninstall(1)); assertNull(supervisor.getAgent().uninstall(2)); existingBundles = supervisor.getAgent().getBundles(); assertNotNull(existingBundles); assertTrue(existingBundles.size() == 2); } public void testAgentUpdateBundle() throws Exception { BundleDTO t2Bundle = supervisor.getAgent().getBundles(2).get(0); assertEquals("bsn-2", t2Bundle.symbolicName); assertEquals("2.0.0", t2Bundle.version); long previousModified = t2Bundle.lastModified; File t2prime = create("bsn-2", new Version(2, 0, 1)); String sha = supervisor.addFile(t2prime); assertNull(supervisor.getAgent().update(2, sha)); t2Bundle = supervisor.getAgent().getBundles(2).get(0); assertTrue(previousModified != t2Bundle.lastModified); } public void testAgentUpdateBundleFromURL() throws Exception { BundleDTO t2Bundle = supervisor.getAgent().getBundles(2).get(0); assertEquals("bsn-2", t2Bundle.symbolicName); assertEquals("2.0.0", t2Bundle.version); long previousModified = t2Bundle.lastModified; File t2prime = create("bsn-2", new Version(2, 0, 1)); assertNull(supervisor.getAgent().updateFromURL(t2Bundle.id, t2prime.toURI().toURL().toExternalForm())); t2Bundle = supervisor.getAgent().getBundles(2).get(0); assertTrue(previousModified != t2Bundle.lastModified); } public void testAgentShell() throws Exception { String result = supervisor.getAgent().shell("lb"); assertNotNull(result); assertTrue(result.contains("START")); assertTrue(result.contains("LEVEL")); } public void testAgentSupervisorTimeout() throws Exception { TestSupervisor testSupervisor = new TestSupervisor(); try { testSupervisor.connect("localhost", 12345, 300); fail("Excepted connection timeout"); } catch (ConnectException e) {} try { testSupervisor.connect("localhost", 12345, 100); fail("Excepted connection timeout"); } catch (ConnectException e) {} try { testSupervisor.connect("localhost", 12345, -2); fail("Excepted illegal argument exception"); } catch (IllegalArgumentException e) {} } /** * Launches against main */ 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; } static class TestSupervisor extends AgentSupervisor<Supervisor,Agent> implements Supervisor { @Override public boolean stdout(String out) throws Exception { return true; } @Override public boolean stderr(String out) throws Exception { return true; } public void connect(String host, int port) throws Exception { super.connect(Agent.class, this, host, port); } public void connect(String host, int port, int timeout) throws Exception { super.connect(Agent.class, this, host, port, timeout); } @Override public void event(Event e) throws Exception { System.out.println(e); } } }