package org.apache.aries.subsystem.itests; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.io.File; import java.net.URI; import java.util.Dictionary; import java.util.Hashtable; import org.apache.aries.itest.RichBundleContext; import org.apache.aries.subsystem.itests.hello.api.Hello; import org.apache.aries.util.filesystem.FileSystem; import org.apache.aries.util.filesystem.IDirectory; import org.apache.aries.util.filesystem.IDirectoryFinder; import org.junit.Test; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceRegistration; import org.osgi.service.subsystem.Subsystem; import org.osgi.service.subsystem.SubsystemException; public class HelloWorldTest extends SubsystemTest { /* * An implementation of the IDirectoryFinder interface that provides the * IDirectory that corresponds to some id URI. In practice this could come * from anywhere (exploded archive on filesystem, in-memory, IDE etc) but * for the test just use an archive file. */ static class TestIDirectoryFinder implements IDirectoryFinder { static final String IDIR_FINDERID_VALUE = "TestIDirectoryFinder"; static final String IDIR_DIRECTORYID_VALUE = "hello.esa"; static final URI HELLO_ID_URI = URI.create(IDIR_SCHEME + "://?" + IDIR_FINDERID_KEY + "=" + IDIR_FINDERID_VALUE + "&" + IDIR_DIRECTORYID_KEY + "=" + IDIR_DIRECTORYID_VALUE); static final String HELLO_ID_STRING = HELLO_ID_URI.toString(); public IDirectory retrieveIDirectory(URI idirectoryId) { if (HELLO_ID_URI.equals(idirectoryId)) { File helloEsaFile = new File("hello.esa"); IDirectory helloEsaIDir = FileSystem.getFSRoot(helloEsaFile); return helloEsaIDir; } else { return null; } } } @Override public void createApplications() throws Exception { createApplication("hello", "helloImpl.jar"); } void checkHelloSubsystem(Subsystem helloSubsystem) throws Exception { helloSubsystem.start(); BundleContext bc = helloSubsystem.getBundleContext(); Hello h = new RichBundleContext(bc).getService(Hello.class); String message = h.saySomething(); assertEquals ("Wrong message back", "something", message); helloSubsystem.stop(); } @Test public void testHelloFromFile() throws Exception { Subsystem subsystem = installSubsystemFromFile("hello.esa"); try { checkHelloSubsystem(subsystem); } finally { uninstallSubsystemSilently(subsystem); } } @Test public void testHelloFromIDirectory() throws Exception { // Sanity check, application should not install if no IDirectoryFinder // services are registered, which should be the case on entry to this test. try { installSubsystem(getRootSubsystem(), TestIDirectoryFinder.HELLO_ID_STRING, null, (Boolean[]) null); fail("installed esa application from idir without an idirfinder service, shouldn't be possible."); } catch (SubsystemException se) { // expected exception } // The root subsystem already exists and has a service tracker for // IDirectoryFinder services, so it will be notified on service registration. Dictionary<String, String> properties = new Hashtable<String, String>(); properties.put(IDirectoryFinder.IDIR_FINDERID_KEY, TestIDirectoryFinder.IDIR_FINDERID_VALUE); ServiceRegistration serviceRegistration = bundleContext.registerService(IDirectoryFinder.class, new TestIDirectoryFinder(), properties); // Call the SubsystemTest.installSubsystem method that does not create a URL // and stream from the location, as we just need the location string passed // through to the installing root subsystem. Subsystem subsystem = installSubsystem(getRootSubsystem(), TestIDirectoryFinder.HELLO_ID_STRING, null, (Boolean[]) null); try { checkHelloSubsystem(subsystem); } finally { uninstallSubsystemSilently(subsystem); if (serviceRegistration!=null) serviceRegistration.unregister(); } } }