Author: bdelacretaz
Date: Tue May 19 12:57:51 2009
New Revision: 776297
URL: http://svn.apache.org/viewvc?rev=776297&view=rev
Log:
SLING-904 - more OsgiController tests and fix a bug in BundleResourceProcessor
Modified:
incubator/sling/trunk/contrib/extensions/jcrinstall/it/src/test/java/org/apache/sling/jcr/jcrinstall/it/OsgiControllerTest.java
incubator/sling/trunk/contrib/extensions/jcrinstall/osgi/src/main/java/org/apache/sling/osgi/installer/impl/BundleResourceProcessor.java
Modified:
incubator/sling/trunk/contrib/extensions/jcrinstall/it/src/test/java/org/apache/sling/jcr/jcrinstall/it/OsgiControllerTest.java
URL:
http://svn.apache.org/viewvc/incubator/sling/trunk/contrib/extensions/jcrinstall/it/src/test/java/org/apache/sling/jcr/jcrinstall/it/OsgiControllerTest.java?rev=776297&r1=776296&r2=776297&view=diff
==============================================================================
---
incubator/sling/trunk/contrib/extensions/jcrinstall/it/src/test/java/org/apache/sling/jcr/jcrinstall/it/OsgiControllerTest.java
(original)
+++
incubator/sling/trunk/contrib/extensions/jcrinstall/it/src/test/java/org/apache/sling/jcr/jcrinstall/it/OsgiControllerTest.java
Tue May 19 12:57:51 2009
@@ -20,9 +20,11 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
import static org.ops4j.pax.exam.CoreOptions.felix;
import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.provision;
import static org.ops4j.pax.exam.CoreOptions.waitForFrameworkStartup;
import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.vmOption;
@@ -42,11 +44,14 @@
import org.osgi.framework.ServiceReference;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.startlevel.StartLevel;
/** Test the OsgiController running in the OSGi framework */
@RunWith(JUnit4TestRunner.class)
public class OsgiControllerTest {
public final static String POM_VERSION =
System.getProperty("jcrinstall.pom.version");
+ public final static int CONFIG_ADMIN_START_LEVEL = 100;
+ public final static int NO_CONFIG_ADMIN_START_LEVEL =
CONFIG_ADMIN_START_LEVEL - 1;
@Inject
protected BundleContext bundleContext;
@@ -61,12 +66,15 @@
}
protected Configuration findConfiguration(String pid) throws Exception {
- final Configuration[] cfgs =
getService(ConfigurationAdmin.class).listConfigurations(null);
- if(cfgs != null) {
- for(Configuration cfg : cfgs) {
- if(cfg.getPid().equals(pid)) {
- return cfg;
- }
+ final ConfigurationAdmin ca = getService(ConfigurationAdmin.class);
+ if(ca != null) {
+ final Configuration[] cfgs = ca.listConfigurations(null);
+ if(cfgs != null) {
+ for(Configuration cfg : cfgs) {
+ if(cfg.getPid().equals(pid)) {
+ return cfg;
+ }
+ }
}
}
return null;
@@ -85,8 +93,23 @@
return new File(System.getProperty("jcrinstall.base.dir"), bundleName);
}
+ protected void setStartLevel(int level) throws InterruptedException {
+ final StartLevel s = getService(StartLevel.class);
+ s.setStartLevel(level);
+ final int timeout = 5;
+ final long waitUntil = System.currentTimeMillis() + (timeout * 1000L);
+ do {
+ if(s.getStartLevel() == level) {
+ return;
+ }
+ Thread.sleep(100L);
+ } while(System.currentTimeMillis() < waitUntil);
+ fail("Start level did not change to " + level + " after waiting " +
timeout + " seconds");
+ }
+
@Test
public void testInstallAndRemoveConfig() throws Exception {
+ setStartLevel(CONFIG_ADMIN_START_LEVEL);
final OsgiController c = getService(OsgiController.class);
final Dictionary<String, Object> cfgData = new Hashtable<String,
Object>();
cfgData.put("foo", "bar");
@@ -109,6 +132,34 @@
assertNull("Config " + cfgPid + " must be gone after
executeScheduledOperations", findConfiguration(cfgPid));
}
+ // TODO test fails due to SCR no rebinding the ConfigurationAdmin service
+ // to the OsgiController @Test
+ public void testDeferredConfigInstall() throws Exception {
+ setStartLevel(CONFIG_ADMIN_START_LEVEL);
+
+ final OsgiController c = getService(OsgiController.class);
+ final Dictionary<String, Object> cfgData = new Hashtable<String,
Object>();
+ cfgData.put("foo", "bar");
+ final String cfgPid = getClass().getName() + ".deferred." +
System.currentTimeMillis();
+ assertNull("Config " + cfgPid + " must not be found before test",
findConfiguration(cfgPid));
+
+ c.scheduleInstallOrUpdate(cfgPid, new
DictionaryInstallableData(cfgData));
+ assertNull("Config " + cfgPid + " must not be found right after
scheduleInstall", findConfiguration(cfgPid));
+
+ // Config installs must be deferred if ConfigAdmin service is stopped
+ setStartLevel(NO_CONFIG_ADMIN_START_LEVEL);
+ c.executeScheduledOperations();
+ setStartLevel(CONFIG_ADMIN_START_LEVEL);
+ getService(ConfigurationAdmin.class);
+ assertNull("Config " + cfgPid + " must not be installed if ConfigAdmin
was stopped", findConfiguration(cfgPid));
+
+ // with configadmin back, executeScheduledOperations must install
deferred configs
+ c.executeScheduledOperations();
+ assertNotNull("Config " + cfgPid + " must be installed after restarting
ConfigAdmin", findConfiguration(cfgPid));
+ findConfiguration(cfgPid).delete();
+ assertNull("Config " + cfgPid + " must be gone after test",
findConfiguration(cfgPid));
+ }
+
@Test
public void testInstallUpgradeDowngradeBundle() throws Exception {
final String symbolicName = "jcrinstall-testbundle";
@@ -127,6 +178,7 @@
final Bundle b = findBundle(symbolicName);
bundleId = b.getBundleId();
assertNotNull("Test bundle 1.1 must be found after
executeScheduledOperations", b);
+ assertEquals("Installed bundle must be started", Bundle.ACTIVE,
b.getState());
assertEquals("Version must be 1.1", "1.1",
b.getHeaders().get(BUNDLE_VERSION));
}
@@ -136,6 +188,7 @@
c.executeScheduledOperations();
final Bundle b = findBundle(symbolicName);
assertNotNull("Test bundle 1.2 must be found after
executeScheduledOperations", b);
+ assertEquals("Installed bundle must be started", Bundle.ACTIVE,
b.getState());
assertEquals("Version must be 1.2 after upgrade", "1.2",
b.getHeaders().get(BUNDLE_VERSION));
assertEquals("Bundle ID must not change after upgrade",
bundleId, b.getBundleId());
}
@@ -146,6 +199,7 @@
c.executeScheduledOperations();
final Bundle b = findBundle(symbolicName);
assertNotNull("Test bundle 1.2 must be found after
executeScheduledOperations", b);
+ assertEquals("Installed bundle must be started", Bundle.ACTIVE,
b.getState());
assertEquals("Version must be 1.2 after ignored downgrade",
"1.2", b.getHeaders().get(BUNDLE_VERSION));
assertEquals("Bundle ID must not change after downgrade",
bundleId, b.getBundleId());
}
@@ -164,6 +218,7 @@
c.executeScheduledOperations();
final Bundle b = findBundle(symbolicName);
assertNotNull("Test bundle 1.0 must be found after
executeScheduledOperations", b);
+ assertEquals("Installed bundle must be started", Bundle.ACTIVE,
b.getState());
assertEquals("Version must be 1.0 after uninstall and
downgrade", "1.0", b.getHeaders().get(BUNDLE_VERSION));
assertFalse("Bundle ID must have changed after uninstall and
reinstall", bundleId == b.getBundleId());
}
@@ -173,7 +228,8 @@
public static Option[] configuration() {
String vmOpt = "-Djrcinstall.testing";
- // make all jcrinstall.* system properties available to OSGi framework
VM
+ // This runs in the VM that runs the build, but the tests run in
another one.
+ // Make all jcrinstall.* system properties available to OSGi framework
VM
for(Object o : System.getProperties().keySet()) {
final String key = (String)o;
if(key.startsWith("jcrinstall.")) {
@@ -188,13 +244,15 @@
}
return options(
- mavenBundle("org.apache.felix", "org.apache.felix.scr"),
- mavenBundle("org.apache.felix", "org.apache.felix.configadmin"),
- mavenBundle("org.apache.sling", "org.apache.sling.commons.log"),
- mavenBundle("org.apache.sling",
"org.apache.sling.osgi.installer", POM_VERSION),
- felix(),
- vmOption(vmOpt),
- waitForFrameworkStartup()
+ felix(),
+ vmOption(vmOpt),
+ waitForFrameworkStartup(),
+ provision(
+ mavenBundle("org.apache.felix",
"org.apache.felix.scr", "1.0.6"),
+ mavenBundle("org.apache.felix",
"org.apache.felix.configadmin").startLevel(CONFIG_ADMIN_START_LEVEL),
+ mavenBundle("org.apache.sling",
"org.apache.sling.commons.log"),
+ mavenBundle("org.apache.sling",
"org.apache.sling.osgi.installer", POM_VERSION)
+ )
);
}
}
\ No newline at end of file
Modified:
incubator/sling/trunk/contrib/extensions/jcrinstall/osgi/src/main/java/org/apache/sling/osgi/installer/impl/BundleResourceProcessor.java
URL:
http://svn.apache.org/viewvc/incubator/sling/trunk/contrib/extensions/jcrinstall/osgi/src/main/java/org/apache/sling/osgi/installer/impl/BundleResourceProcessor.java?rev=776297&r1=776296&r2=776297&view=diff
==============================================================================
---
incubator/sling/trunk/contrib/extensions/jcrinstall/osgi/src/main/java/org/apache/sling/osgi/installer/impl/BundleResourceProcessor.java
(original)
+++
incubator/sling/trunk/contrib/extensions/jcrinstall/osgi/src/main/java/org/apache/sling/osgi/installer/impl/BundleResourceProcessor.java
Tue May 19 12:57:51 2009
@@ -182,10 +182,11 @@
}
if (b != null) {
- // Existing bundle -> stop and update
+ // Existing bundle -> stop, update, restart
log.debug("Calling Bundle.stop() and updating {}",
uri);
b.stop();
b.update(data);
+ b.start();
updated = true;
needsRefresh = true;
} else {