Author: bdelacretaz Date: Thu Oct 15 06:01:12 2009 New Revision: 825404 URL: http://svn.apache.org/viewvc?rev=825404&view=rev Log: SLING-1106 - do not downgrade a bundle that we didn't install
Added: sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/ContextBundleUpdateTest.java (with props) Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/BundleTaskCreator.java sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerContext.java sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerImpl.java sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleInstallTask.java sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleUpdateTask.java sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/BundleTaskCreatorTest.java sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockBundleTaskCreator.java sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockOsgiInstallerContext.java sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/PersistentResourceListTest.java sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/BundlePrioritiesTest.java sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/RemovedResourceDetectionTest.java Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/BundleTaskCreator.java URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/BundleTaskCreator.java?rev=825404&r1=825403&r2=825404&view=diff ============================================================================== --- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/BundleTaskCreator.java (original) +++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/BundleTaskCreator.java Thu Oct 15 06:01:12 2009 @@ -18,6 +18,7 @@ */ package org.apache.sling.osgi.installer.impl; +import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.SortedSet; @@ -42,15 +43,18 @@ /** Holds the bundle info that we need, makes it easier to test * without an OSGi framework */ static class BundleInfo { + final String symbolicName; final Version version; final int state; - BundleInfo(Version version, int state) { + BundleInfo(String symbolicName, Version version, int state) { + this.symbolicName = symbolicName; this.version = version; this.state = state; } BundleInfo(Bundle b) { + this.symbolicName = b.getSymbolicName(); this.version = new Version((String)b.getHeaders().get(Constants.BUNDLE_VERSION)); this.state = b.getState(); } @@ -61,7 +65,7 @@ * has desired state == active, and generates the appropriate OSGi tasks to * reach this state. */ - public void createTasks(OsgiInstallerContext ctx, SortedSet<RegisteredResource> resources, SortedSet<OsgiInstallerTask> tasks) { + public void createTasks(OsgiInstallerContext ctx, SortedSet<RegisteredResource> resources, SortedSet<OsgiInstallerTask> tasks) throws IOException { // Find the bundle that must be active: the resources collection is ordered according // to priorities, so we just need to find the first one that is installable @@ -95,10 +99,27 @@ digestToSave = toActivate.getDigest(); } else { final int compare = info.version.compareTo(newVersion); - if(compare != 0) { - // installed but different version. Can be a later version if - // the newer version resource was removed, in case we downgrade - toUpdate = toActivate; + if(compare < 0) { + // installed version is lower -> update + toUpdate = toActivate; + } else if(compare > 0) { + // installed version is higher -> downgrade only if + // we installed that version + final String installedVersion = ctx.getInstalledBundleVersion(info.symbolicName); + if(info.version.toString().equals(installedVersion)) { + toUpdate = toActivate; + if(ctx.getLogService() != null) { + ctx.getLogService().log(LogService.LOG_INFO, + "Bundle " + info.symbolicName + " " + installedVersion + + " was installed by this module, downgrading to " + newVersion); + } + } else { + if(ctx.getLogService() != null) { + ctx.getLogService().log(LogService.LOG_INFO, + "Bundle " + info.symbolicName + " " + installedVersion + + " was not installed by this module, leaving as is"); + } + } } else if(compare == 0 && ctx.isSnapshot(newVersion)){ // installed, same version but SNAPSHOT toUpdate = toActivate; Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerContext.java URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerContext.java?rev=825404&r1=825403&r2=825404&view=diff ============================================================================== --- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerContext.java (original) +++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerContext.java Thu Oct 15 06:01:12 2009 @@ -46,11 +46,16 @@ */ void addTaskToNextCycle(OsgiInstallerTask t); - /** Store a bundle's digest, keyed by symbolic ID + version */ - void saveBundleDigest(Bundle b, String digest) throws IOException; + /** Store a bundle's digest and installed version, keyed by symbolic ID */ + void saveInstalledBundleInfo(Bundle b, String digest, String version) throws IOException; - /** Retrieve a bundle's digest that was stored by storeBundleDigest + /** Retrieve a bundle's digest that was stored by saveInstalledBundleInfo * @return null if no digest was stored * */ - String getBundleDigest(Bundle b) throws IOException; + String getInstalledBundleDigest(Bundle b) throws IOException; + + /** Retrieve a bundle's version that was stored by saveInstalledBundleInfo + * @return null if no version was stored + * */ + String getInstalledBundleVersion(String symbolicName) throws IOException; } Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerImpl.java URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerImpl.java?rev=825404&r1=825403&r2=825404&view=diff ============================================================================== --- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerImpl.java (original) +++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerImpl.java Thu Oct 15 06:01:12 2009 @@ -172,14 +172,21 @@ return v.toString().indexOf(MAVEN_SNAPSHOT_MARKER) >= 0; } - public String getBundleDigest(Bundle b) throws IOException { + public String getInstalledBundleDigest(Bundle b) throws IOException { if(bundleDigestsStorage == null) { return null; } return bundleDigestsStorage.getDigest(b.getSymbolicName()); } - public void saveBundleDigest(Bundle b, String digest) throws IOException { - bundleDigestsStorage.putInfo(b.getSymbolicName(), digest, ""); + public String getInstalledBundleVersion(String symbolicName) throws IOException { + if(bundleDigestsStorage == null) { + return null; + } + return bundleDigestsStorage.getInstalledVersion(symbolicName); + } + + public void saveInstalledBundleInfo(Bundle b, String digest, String version) throws IOException { + bundleDigestsStorage.putInfo(b.getSymbolicName(), digest, version); } } \ No newline at end of file Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleInstallTask.java URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleInstallTask.java?rev=825404&r1=825403&r2=825404&view=diff ============================================================================== --- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleInstallTask.java (original) +++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleInstallTask.java Thu Oct 15 06:01:12 2009 @@ -23,6 +23,8 @@ import org.apache.sling.osgi.installer.impl.OsgiInstallerTask; import org.apache.sling.osgi.installer.impl.RegisteredResource; import org.osgi.framework.Bundle; +import org.osgi.framework.Constants; +import org.osgi.framework.Version; /** Install a bundle supplied as a RegisteredResource. * Creates a BundleStartTask to start the bundle */ @@ -41,7 +43,8 @@ public void execute(OsgiInstallerContext ctx) throws Exception { final Bundle b = ctx.getBundleContext().installBundle(resource.getUrl(), resource.getInputStream()); - ctx.saveBundleDigest(b, resource.getDigest()); + final Version newVersion = new Version((String)resource.getAttributes().get(Constants.BUNDLE_VERSION)); + ctx.saveInstalledBundleInfo(b, resource.getDigest(), newVersion.toString()); logExecution(ctx); ctx.addTaskToCurrentCycle(new BundleStartTask(b.getBundleId())); ctx.incrementCounter(OsgiInstaller.OSGI_TASKS_COUNTER); Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleUpdateTask.java URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleUpdateTask.java?rev=825404&r1=825403&r2=825404&view=diff ============================================================================== --- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleUpdateTask.java (original) +++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleUpdateTask.java Thu Oct 15 06:01:12 2009 @@ -58,25 +58,23 @@ // Do not update if same version, unless snapshot boolean snapshot = false; - if(b != null) { - final Version currentVersion = new Version((String)b.getHeaders().get(Constants.BUNDLE_VERSION)); - final Version newVersion = new Version((String)resource.getAttributes().get(Constants.BUNDLE_VERSION)); - snapshot = ctx.isSnapshot(newVersion); - if(currentVersion.equals(newVersion) && !snapshot) { - if(ctx.getLogService() != null) { - ctx.getLogService().log( - LogService.LOG_DEBUG, - "Same version is already installed, and not a snapshot, ignoring update:" + resource); - } - return; - } - } + final Version currentVersion = new Version((String)b.getHeaders().get(Constants.BUNDLE_VERSION)); + final Version newVersion = new Version((String)resource.getAttributes().get(Constants.BUNDLE_VERSION)); + snapshot = ctx.isSnapshot(newVersion); + if(currentVersion.equals(newVersion) && !snapshot) { + if(ctx.getLogService() != null) { + ctx.getLogService().log( + LogService.LOG_DEBUG, + "Same version is already installed, and not a snapshot, ignoring update:" + resource); + } + return; + } // If snapshot and ready to update, cancel if digest didn't change - as the list // of RegisteredResources is not saved, this might not have been detected earlier, // if the snapshot was installed and the installer was later restarted - if( (b != null) && snapshot) { - final String oldDigest = ctx.getBundleDigest(b); + if(snapshot) { + final String oldDigest = ctx.getInstalledBundleDigest(b); if(resource.getDigest().equals(oldDigest)) { if(ctx.getLogService() != null) { ctx.getLogService().log( @@ -95,7 +93,7 @@ } b.stop(); b.update(resource.getInputStream()); - ctx.saveBundleDigest(b, resource.getDigest()); + ctx.saveInstalledBundleInfo(b, resource.getDigest(), newVersion.toString()); ctx.addTaskToCurrentCycle(new SynchronousRefreshPackagesTask()); if(ctx.getLogService() != null) { ctx.getLogService().log(LogService.LOG_DEBUG, "Bundle updated: " + b.getBundleId() + "/" + b.getSymbolicName()); Modified: sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/BundleTaskCreatorTest.java URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/BundleTaskCreatorTest.java?rev=825404&r1=825403&r2=825404&view=diff ============================================================================== --- sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/BundleTaskCreatorTest.java (original) +++ sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/BundleTaskCreatorTest.java Thu Oct 15 06:01:12 2009 @@ -21,20 +21,27 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import java.io.IOException; import java.util.SortedSet; import java.util.TreeSet; import org.apache.sling.osgi.installer.impl.tasks.BundleInstallTask; import org.apache.sling.osgi.installer.impl.tasks.BundleRemoveTask; import org.apache.sling.osgi.installer.impl.tasks.BundleUpdateTask; +import org.junit.Before; import org.junit.Test; import org.osgi.framework.Bundle; public class BundleTaskCreatorTest { public static final String SN = "TestSymbolicName"; - private final OsgiInstallerContext ctx = new MockOsgiInstallerContext(); + private MockOsgiInstallerContext ctx; - private SortedSet<OsgiInstallerTask> getTasks(RegisteredResource [] resources, BundleTaskCreator btc) { + @Before + public void setUp() throws IOException { + ctx = new MockOsgiInstallerContext(); + } + + private SortedSet<OsgiInstallerTask> getTasks(RegisteredResource [] resources, BundleTaskCreator btc) throws IOException { final SortedSet<RegisteredResource> s = OsgiInstallerThread.createRegisteredResourcesEntry(); for(RegisteredResource r : resources) { s.add(r); @@ -46,7 +53,7 @@ } @Test - public void testSingleBundleNew() { + public void testSingleBundleNew() throws IOException { final RegisteredResource [] r = { new MockBundleResource(SN, "1.0") }; @@ -57,7 +64,7 @@ } @Test - public void testSingleBundleAlreadyInstalled() { + public void testSingleBundleAlreadyInstalled() throws IOException { final RegisteredResource [] r = { new MockBundleResource(SN, "1.0") }; @@ -78,7 +85,7 @@ } @Test - public void testBundleUpgrade() { + public void testBundleUpgrade() throws IOException { final RegisteredResource [] r = { new MockBundleResource(SN, "1.1") }; @@ -93,7 +100,7 @@ } @Test - public void testBundleUpgradeBothRegistered() { + public void testBundleUpgradeBothRegistered() throws IOException { final RegisteredResource [] r = { new MockBundleResource(SN, "1.1"), new MockBundleResource(SN, "1.0") @@ -109,7 +116,7 @@ } @Test - public void testBundleUpgradeBothRegisteredReversed() { + public void testBundleUpgradeBothRegisteredReversed() throws IOException { final RegisteredResource [] r = { new MockBundleResource(SN, "1.0"), new MockBundleResource(SN, "1.1") @@ -125,7 +132,7 @@ } @Test - public void testBundleUpgradeSnapshot() { + public void testBundleUpgradeSnapshot() throws IOException { // Need to use OSGi-compliant version number, in bundles // bnd and other tools generate correct numbers. final String v = "2.0.7.SNAPSHOT"; @@ -143,7 +150,7 @@ } @Test - public void testBundleRemoveSingle() { + public void testBundleRemoveSingle() throws IOException { final RegisteredResource [] r = { new MockBundleResource(SN, "1.0") }; @@ -159,7 +166,7 @@ } @Test - public void testBundleRemoveMultiple() { + public void testBundleRemoveMultiple() throws IOException { final RegisteredResource [] r = { new MockBundleResource(SN, "1.0"), new MockBundleResource(SN, "1.1"), @@ -179,10 +186,10 @@ } @Test - public void testDowngradeOfRemovedResource() { + public void testDowngradeOfRemovedResource() throws IOException { final RegisteredResource [] r = { - new MockBundleResource(SN, "1.0"), - new MockBundleResource(SN, "1.1"), + new MockBundleResource(SN, "1.0.0"), + new MockBundleResource(SN, "1.1.0"), }; // Simulate V1.1 installed but resource is gone -> downgrade to 1.0 @@ -190,7 +197,8 @@ { final MockBundleTaskCreator c = new MockBundleTaskCreator(); - c.addBundleInfo(SN, "1.1", Bundle.ACTIVE); + c.addBundleInfo(SN, "1.1.0", Bundle.ACTIVE); + ctx.saveInstalledBundleInfo(SN, "fakedigest", "1.1.0"); final SortedSet<OsgiInstallerTask> s = getTasks(r, c); assertEquals("Expected one task", 1, s.size()); assertTrue("Expected a BundleUpdateTask", s.first() instanceof BundleUpdateTask); @@ -198,5 +206,4 @@ assertEquals("Update should be to V1.0", r[0], t.getResource()); } } - } \ No newline at end of file Modified: sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockBundleTaskCreator.java URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockBundleTaskCreator.java?rev=825404&r1=825403&r2=825404&view=diff ============================================================================== --- sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockBundleTaskCreator.java (original) +++ sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockBundleTaskCreator.java Thu Oct 15 06:01:12 2009 @@ -30,7 +30,7 @@ private final Map<String, BundleInfo> fakeBundleInfo = new HashMap<String, BundleInfo>(); void addBundleInfo(String symbolicName, String version, int state) { - fakeBundleInfo.put(symbolicName, new BundleInfo(new Version(version), state)); + fakeBundleInfo.put(symbolicName, new BundleInfo(symbolicName, new Version(version), state)); } @Override Modified: sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockOsgiInstallerContext.java URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockOsgiInstallerContext.java?rev=825404&r1=825403&r2=825404&view=diff ============================================================================== --- sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockOsgiInstallerContext.java (original) +++ sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockOsgiInstallerContext.java Thu Oct 15 06:01:12 2009 @@ -18,6 +18,7 @@ */ package org.apache.sling.osgi.installer.impl; +import java.io.File; import java.io.IOException; import org.osgi.framework.Bundle; @@ -29,6 +30,14 @@ public class MockOsgiInstallerContext implements OsgiInstallerContext { + private final PersistentBundleInfo persistentBundleInfo; + + public MockOsgiInstallerContext() throws IOException { + final File f = File.createTempFile(MockOsgiInstallerContext.class.getSimpleName(), ".data"); + f.deleteOnExit(); + persistentBundleInfo = new PersistentBundleInfo(this, f); + } + public void addTaskToCurrentCycle(OsgiInstallerTask t) { } @@ -65,10 +74,19 @@ return v.toString().indexOf(OsgiInstallerImpl.MAVEN_SNAPSHOT_MARKER) >= 0; } - public String getBundleDigest(Bundle b) throws IOException { - return null; + public String getInstalledBundleDigest(Bundle b) throws IOException { + return persistentBundleInfo.getDigest(b.getSymbolicName()); } - public void saveBundleDigest(Bundle b, String digest) throws IOException { + public String getInstalledBundleVersion(String symbolicName) throws IOException { + return persistentBundleInfo.getInstalledVersion(symbolicName); + } + + public void saveInstalledBundleInfo(Bundle b, String digest, String version) throws IOException { + saveInstalledBundleInfo(b.getSymbolicName(), digest, version); + } + + public void saveInstalledBundleInfo(String symbolicName, String digest, String version) throws IOException { + persistentBundleInfo.putInfo(symbolicName, digest, version); } } Modified: sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/PersistentResourceListTest.java URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/PersistentResourceListTest.java?rev=825404&r1=825403&r2=825404&view=diff ============================================================================== --- sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/PersistentResourceListTest.java (original) +++ sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/PersistentResourceListTest.java Thu Oct 15 06:01:12 2009 @@ -39,7 +39,7 @@ private final static String FAKE = "fakebundle."; @Test - public void testFileNotFound() { + public void testFileNotFound() throws IOException { File f = new File("NONEXISTENT"); PersistentResourceList p = new PersistentResourceList(new MockOsgiInstallerContext(), f); assertNotNull(p.getData()); @@ -61,7 +61,7 @@ } @Test - public void testTestData() { + public void testTestData() throws IOException { File f = new File("NONEXISTENT"); PersistentResourceList p = new PersistentResourceList(new MockOsgiInstallerContext(), f); assertNotNull(p.getData()); Modified: sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/BundlePrioritiesTest.java URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/BundlePrioritiesTest.java?rev=825404&r1=825403&r2=825404&view=diff ============================================================================== --- sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/BundlePrioritiesTest.java (original) +++ sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/BundlePrioritiesTest.java Thu Oct 15 06:01:12 2009 @@ -61,8 +61,7 @@ resetCounters(); installer.addResource(getInstallableResource( getTestBundle(BUNDLE_BASE_NAME + "-snap.jar"), "digest1")); - // wait for two tasks: install and start - waitForInstallerAction(OsgiInstaller.OSGI_TASKS_COUNTER, 2); + waitForInstallerAction(OsgiInstaller.WORKER_THREAD_BECOMES_IDLE_COUNTER, 1); assertBundle("Initial install", symbolicName, null, Bundle.ACTIVE); } @@ -76,8 +75,7 @@ resetCounters(); installer.addResource(getInstallableResource( getTestBundle(BUNDLE_BASE_NAME + "-snap.jar"), "digest3", highPriority)); - // wait for two tasks: update and restart - waitForInstallerAction(OsgiInstaller.OSGI_TASKS_COUNTER, 2); + waitForInstallerAction(OsgiInstaller.WORKER_THREAD_BECOMES_IDLE_COUNTER, 1); } assertNoOsgiTasks("At end of test"); Added: sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/ContextBundleUpdateTest.java URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/ContextBundleUpdateTest.java?rev=825404&view=auto ============================================================================== --- sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/ContextBundleUpdateTest.java (added) +++ sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/ContextBundleUpdateTest.java Thu Oct 15 06:01:12 2009 @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.sling.osgi.installer.it; + +import static org.junit.Assert.assertNull; + +import java.io.FileInputStream; +import java.io.InputStream; + +import org.apache.sling.osgi.installer.OsgiInstaller; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.ops4j.pax.exam.Option; +import org.ops4j.pax.exam.junit.JUnit4TestRunner; +import org.osgi.framework.Bundle; + +/** Test the second SLING-1106 scenario: if a bundle is updated + * via the BundleContext, the installer should not downgrade it + * back to its own version. + */ +...@runwith(JUnit4TestRunner.class) +public class ContextBundleUpdateTest extends OsgiInstallerTestBase { + @org.ops4j.pax.exam.junit.Configuration + public static Option[] configuration() { + return defaultConfiguration(); + } + + @Before + public void setUp() { + setupInstaller(); + } + + @After + public void tearDown() { + super.tearDown(); + } + + @Test + public void testContextUpdate() throws Exception { + + // Install V1.0 via installer + final String symbolicName = "osgi-installer-testbundle"; + assertNull("Test bundle must be absent before installing", findBundle(symbolicName)); + resetCounters(); + installer.addResource(getInstallableResource( + getTestBundle(BUNDLE_BASE_NAME + "-testbundle-1.0.jar"), "digest0")); + waitForInstallerAction(OsgiInstaller.WORKER_THREAD_BECOMES_IDLE_COUNTER, 1); + final Bundle b = assertBundle("After initial install", symbolicName, "1.0", Bundle.ACTIVE); + + // Update to 1.1, directly via bundle context + final InputStream is = new FileInputStream(getTestBundle(BUNDLE_BASE_NAME + "-testbundle-1.1.jar")); + try { + b.update(is); + } finally { + is.close(); + } + assertBundle("After direct update", symbolicName, "1.1", Bundle.ACTIVE); + + // Install another bundle (to trigger installer queue activity), wait + // for installer to be idle and check version + resetCounters(); + installer.addResource(getInstallableResource( + getTestBundle(BUNDLE_BASE_NAME + "-snap.jar"), "digest1")); + waitForInstallerAction(OsgiInstaller.WORKER_THREAD_BECOMES_IDLE_COUNTER, 1); + assertBundle("-snap bundle install", "osgi-installer-snapshot-test", null, Bundle.ACTIVE); + assertBundle("After installing another bundle", symbolicName, "1.1", Bundle.ACTIVE); + } +} Propchange: sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/ContextBundleUpdateTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/ContextBundleUpdateTest.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Rev URL Modified: sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/RemovedResourceDetectionTest.java URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/RemovedResourceDetectionTest.java?rev=825404&r1=825403&r2=825404&view=diff ============================================================================== --- sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/RemovedResourceDetectionTest.java (original) +++ sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/RemovedResourceDetectionTest.java Thu Oct 15 06:01:12 2009 @@ -79,6 +79,7 @@ final List<InstallableResource> data = new ArrayList<InstallableResource>(); data.add(getInstallableResource(getTestBundle(BUNDLE_BASE_NAME + "-testB-1.0.jar"))); installer.registerResources(data, URL_SCHEME); + sleep(500); waitForInstallerAction(OsgiInstaller.WORKER_THREAD_BECOMES_IDLE_COUNTER, 1); assertBundle("After installer restart", symbolicNameB, "1.0", Bundle.ACTIVE); assertNull("Bundle not in second list should be removed", findBundle(symbolicNameA));