/* * 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.felix.deploymentadmin.itest; import static org.osgi.service.deploymentadmin.DeploymentException.CODE_BAD_HEADER; import static org.osgi.service.deploymentadmin.DeploymentException.CODE_BUNDLE_SHARING_VIOLATION; import static org.osgi.service.deploymentadmin.DeploymentException.CODE_MISSING_BUNDLE; import static org.osgi.service.deploymentadmin.DeploymentException.CODE_MISSING_FIXPACK_TARGET; import static org.osgi.service.deploymentadmin.DeploymentException.CODE_MISSING_RESOURCE; import org.apache.felix.deploymentadmin.itest.util.DeploymentPackageBuilder; import org.junit.Test; import org.junit.runner.RunWith; import org.ops4j.pax.exam.junit.PaxExam; import org.osgi.framework.Bundle; import org.osgi.service.deploymentadmin.DeploymentException; import org.osgi.service.deploymentadmin.DeploymentPackage; /** * Provides test cases regarding the use of "fix-packages" in DeploymentAdmin. */ @RunWith(PaxExam.class) public class InstallFixPackageTest extends BaseIntegrationTest { /** * Tests that we can install a new bundle through a fix-package. */ @Test public void testInstallBundleWithDependencyInFixPackageUpdateOk() throws Exception { DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2"))); DeploymentPackage dp1 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp1); awaitRefreshPackagesEvent(); Bundle bundle = dp1.getBundle(getSymbolicName("bundle2")); assertNotNull("Failed to obtain bundle from deployment package?!", bundle); assertEquals(Bundle.INSTALLED, bundle.getState()); dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1"); dpBuilder.setFixPackage("[1.0,2.0)").add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))).add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2")).setMissing()); DeploymentPackage dp2 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp2); awaitRefreshPackagesEvent(); bundle = dp2.getBundle(getSymbolicName("bundle2")); assertNotNull("Failed to obtain bundle from bundle context?!", bundle); assertBundleExists(getSymbolicName("bundle1"), "1.0.0"); assertBundleExists(getSymbolicName("bundle2"), "1.0.0"); assertTrue(isBundleActive(bundle)); } /** * Tests that it is not possible to install a fix package if it specifies a fix-version range that falls outside the installed target deployment package. */ @Test public void testInstallFixPackageOutsideLowerTargetRangeFail() throws Exception { DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2"))); DeploymentPackage dp1 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp1); awaitRefreshPackagesEvent(); Bundle bundle = dp1.getBundle(getSymbolicName("bundle2")); assertNotNull("Failed to obtain bundle from deployment package?!", bundle); assertEquals(Bundle.INSTALLED, bundle.getState()); dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1"); dpBuilder.setFixPackage("(1.0,2.0)") // should not include version 1.0.0! .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))).add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2")).setMissing()); try { installDeploymentPackage(dpBuilder); fail("Succeeded into installing fix package for undefined target package?!"); } catch (DeploymentException exception) { // Ok; expected assertDeploymentException(CODE_MISSING_FIXPACK_TARGET, exception); } } /** * Tests that it is not possible to install a fix package if it specifies a fix-version range that falls outside the installed target deployment package. */ @Test public void testInstallFixPackageOutsideUpperTargetRangeFail() throws Exception { DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2"))); DeploymentPackage dp1 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp1); awaitRefreshPackagesEvent(); Bundle bundle = dp1.getBundle(getSymbolicName("bundle2")); assertNotNull("Failed to obtain bundle from deployment package?!", bundle); assertEquals(Bundle.INSTALLED, bundle.getState()); dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1"); dpBuilder.setFixPackage("[0.9,1.0)") // should not include version 1.0.0! .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))).add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2")).setMissing()); try { installDeploymentPackage(dpBuilder); fail("Succeeded into installing fix package for undefined target package?!"); } catch (DeploymentException exception) { // Ok; expected assertDeploymentException(CODE_MISSING_FIXPACK_TARGET, exception); } } /** * Tests that a fix package can only be installed after at least one version of the denoted target package is installed. */ @Test public void testInstallFixPackageWithoutTargetFail() throws Exception { DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); dpBuilder.setFixPackage("[1.0,2.0)").add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))).add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2"))); try { installDeploymentPackage(dpBuilder); fail("Should not be able to install fix package without target?!"); } catch (DeploymentException exception) { // Ok; expected assertDeploymentException(CODE_MISSING_FIXPACK_TARGET, exception); } } /** * Tests that installing a fix-package causes the original target package to be replaced. */ @Test public void testInstallFixPackageReplacesOriginalTargetPackageOk() throws Exception { DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2"))); DeploymentPackage dp1 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp1); assertEquals("Expected only a single deployment package?!", 1, countDeploymentPackages()); awaitRefreshPackagesEvent(); dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1"); dpBuilder.setFixPackage("[1.0,2.0)").add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))).add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2")).setMissing()); DeploymentPackage dp2 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp2); awaitRefreshPackagesEvent(); assertEquals("Expected only a single deployment package?!", 1, countDeploymentPackages()); } /** * Tests that installing a fix-package that mentions a bundle that is not in the target package fails. */ @Test public void testInstallFixPackageWithMissingTargetBundleFail() throws Exception { DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); // missed valid-bundle1 as dependency... dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))); DeploymentPackage dp1 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp1); assertEquals("Expected only a single deployment package?!", 1, countDeploymentPackages()); awaitRefreshPackagesEvent(); dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1"); dpBuilder.setFixPackage("[1.0,2.0)").add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle3"))).add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2")).setMissing()); try { installDeploymentPackage(dpBuilder); fail("Succeeded into installing a fix-package with a missing bundle on target?!"); } catch (DeploymentException exception) { assertDeploymentException(CODE_MISSING_BUNDLE, exception); } } /** * Tests that installing a fix-package that mentions a resource that is not in the target package fails. */ @Test public void testInstallFixPackageWithMissingTargetResourceFail() throws Exception { DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))); DeploymentPackage dp1 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp1); assertEquals("Expected only a single deployment package?!", 1, countDeploymentPackages()); awaitRefreshPackagesEvent(); dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1"); dpBuilder.setFixPackage("[1.0,2.0)").add(dpBuilder.createResourceProcessorResource().setUrl(getTestBundleURL("rp1"))).add( dpBuilder.createResource().setResourceProcessorPID(TEST_FAILING_BUNDLE_RP1).setUrl(getTestResource("test-config1.xml")).setMissing()); try { installDeploymentPackage(dpBuilder); fail("Succeeded into installing a fix-package with a missing bundle on target?!"); } catch (DeploymentException exception) { assertDeploymentException(CODE_MISSING_RESOURCE, exception); } } /** * Tests that installing a fix-package that mentions a resource processor that is not in the target package fails. */ @Test public void testInstallFixPackageWithMissingTargetResourceProcessorFail() throws Exception { DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))); DeploymentPackage dp1 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp1); assertEquals("Expected only a single deployment package?!", 1, countDeploymentPackages()); awaitRefreshPackagesEvent(); dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1"); dpBuilder.setFixPackage("[1.0,2.0)").add(dpBuilder.createResourceProcessorResource().setUrl(getTestBundleURL("rp1")).setMissing()).add( dpBuilder.createResource().setResourceProcessorPID(TEST_FAILING_BUNDLE_RP1).setUrl(getTestResource("test-config1.xml"))); try { installDeploymentPackage(dpBuilder); fail("Succeeded into installing a fix-package with a missing bundle on target?!"); } catch (DeploymentException exception) { assertDeploymentException(CODE_MISSING_BUNDLE, exception); } } /** * Tests that installing a fix-package that mentions a bundle that does exist (in another DP), but is not in the target package fails. */ @Test public void testInstallFixPackageWithMissingTargetBundleFromOtherPackageFail() throws Exception { DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))); DeploymentPackage dp1 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp1); awaitRefreshPackagesEvent(); assertEquals("Expected only a single deployment package?!", 1, countDeploymentPackages()); dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2"))); DeploymentPackage dp2 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp2); awaitRefreshPackagesEvent(); assertEquals("Expected only a single deployment package?!", 2, countDeploymentPackages()); dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1"); dpBuilder.setFixPackage("[1.0,2.0)").add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1")).setMissing()).add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle3"))); try { installDeploymentPackage(dpBuilder); fail("Succeeded into installing a fix-package with a missing bundle on target?!"); } catch (DeploymentException exception) { assertDeploymentException(CODE_BUNDLE_SHARING_VIOLATION, exception); } } /** * Tests that only in a fix-package bundle can be marked as missing. */ @Test public void testMissingBundlesOnlyInFixPackageFail() throws Exception { DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2"))); DeploymentPackage dp1 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp1); awaitRefreshPackagesEvent(); Bundle bundle = dp1.getBundle(getSymbolicName("bundle2")); assertNotNull("Failed to obtain bundle from deployment package?!", bundle); assertEquals(Bundle.INSTALLED, bundle.getState()); dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1"); dpBuilder.disableVerification().add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))).add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2")).setMissing()); try { installDeploymentPackage(dpBuilder); fail("Failed to install missing bundle?!"); } catch (DeploymentException exception) { // Ok; expected... assertEquals("Invalid exception code?!", CODE_BAD_HEADER, exception.getCode()); } } /** * Tests the removal of a bundle through a fix package. */ @Test public void testRemoveBundleInFixPackageUpdateOk() throws Exception { DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))).add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2"))); DeploymentPackage dp1 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp1); awaitRefreshPackagesEvent(); Bundle bundle = dp1.getBundle(getSymbolicName("bundle2")); assertNotNull("Failed to obtain bundle from deployment package?!", bundle); assertEquals(Bundle.ACTIVE, bundle.getState()); // valid-bundle2 is to be removed by this fix package... dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1"); dpBuilder.setFixPackage("[1.0,2.0)").add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1")).setMissing()); DeploymentPackage dp2 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp2); awaitRefreshPackagesEvent(); assertBundleExists(getSymbolicName("bundle1"), "1.0.0"); assertBundleNotExists(getSymbolicName("bundle2"), "1.0.0"); } /** * Tests that we can uninstall a fix-package. */ @Test public void testUninstallBundleAddedInFixPackageOk() throws Exception { DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2"))); DeploymentPackage dp1 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp1); awaitRefreshPackagesEvent(); // Add valid-bundle1 through fix-package... dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1"); dpBuilder.setFixPackage("[1.0,2.0)").add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))).add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2")).setMissing()); DeploymentPackage dp2 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp2); awaitRefreshPackagesEvent(); assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages()); assertBundleExists(getSymbolicName("bundle1"), "1.0.0"); assertBundleExists(getSymbolicName("bundle2"), "1.0.0"); // Uninstall the deployment package; should yield the original situation again... dp2.uninstall(); awaitRefreshPackagesEvent(); assertEquals("Expected no deployment package?!", 0, countDeploymentPackages()); // None of our installed bundles should remain... assertBundleNotExists(getSymbolicName("bundle1"), "1.0.0"); assertBundleNotExists(getSymbolicName("bundle2"), "1.0.0"); } /** * Tests that we can uninstall a fix-package. */ @Test public void testUninstallBundleRemovedInFixPackageOk() throws Exception { DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))).add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2"))); DeploymentPackage dp1 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp1); awaitRefreshPackagesEvent(); // remove valid-bundle1 through fix package... dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1"); dpBuilder.setFixPackage("[1.0,2.0)").add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))); DeploymentPackage dp2 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp2); awaitRefreshPackagesEvent(); assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages()); assertBundleExists(getSymbolicName("bundle1"), "1.0.0"); assertBundleNotExists(getSymbolicName("bundle2"), "1.0.0"); // Uninstall the deployment package; should yield the initial situation again... dp2.uninstall(); awaitRefreshPackagesEvent(); assertEquals("Expected no deployment package?!", 0, countDeploymentPackages()); // None of our installed bundles should remain... assertBundleNotExists(getSymbolicName("bundle1"), "1.0.0"); assertBundleNotExists(getSymbolicName("bundle2"), "1.0.0"); } /** * Tests that we can uninstall a fix-package and that this will only uninstall the bundles installed by the fix-package. */ @Test public void testUninstallFixPackageOnlyRemovesOwnArtifactsOk() throws Exception { DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))); DeploymentPackage dp1 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp1); assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages()); dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2"))); DeploymentPackage dp2 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp2); awaitRefreshPackagesEvent(); assertEquals("Expected two deployment packages?!", 2, countDeploymentPackages()); // add bundle2 through fix package... dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1"); dpBuilder.setFixPackage("[1.0,2.0)").add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle3"))).add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2")).setMissing()); DeploymentPackage dp3 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp3); awaitRefreshPackagesEvent(); assertEquals("Expected two deployment packages?!", 2, countDeploymentPackages()); assertBundleExists(getSymbolicName("bundle1"), "1.0.0"); assertBundleExists(getSymbolicName("bundle2"), "1.0.0"); assertBundleExists(getSymbolicName("bundle3"), "1.0.0"); // Uninstall the deployment package; should yield the initial situation again... dp3.uninstall(); awaitRefreshPackagesEvent(); assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages()); // None of our installed bundles should remain... assertBundleNotExists(getSymbolicName("bundle3"), "1.0.0"); assertBundleNotExists(getSymbolicName("bundle2"), "1.0.0"); // The bundle installed in another deployment package should still remain... assertBundleExists(getSymbolicName("bundle1"), "1.0.0"); } @Test public void testInstallAndUpdateImplementationBundleWithSeparateAPIBundle_FELIX4184() throws Exception { String value = System.getProperty("org.apache.felix.deploymentadmin.stopunaffectedbundle"); System.setProperty("org.apache.felix.deploymentadmin.stopunaffectedbundle", "false"); // first, install a deployment package with implementation and api bundles in version 1.0.0 DeploymentPackageBuilder dpBuilder = createDeploymentPackageBuilder("a", "1.0.0"); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundleimpl1", "bundleimpl1", "1.0.0"))); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundleapi1", "bundleapi1", "1.0.0"))); DeploymentPackage dp1 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp1); assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages()); // then, install a fix package with implementation and api bundles in version 2.0.0 dpBuilder = createDeploymentPackageBuilder("a", "2.0.0").setFixPackage("[1.0.0,2.0.0]"); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundleimpl2", "bundleimpl2", "2.0.0"))); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundleapi2", "bundleapi2", "2.0.0"))); DeploymentPackage dp2 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp2); awaitRefreshPackagesEvent(); assertBundleExists(getSymbolicName("bundleimpl"), "2.0.0"); assertBundleExists(getSymbolicName("bundleapi"), "2.0.0"); assertBundleNotExists(getSymbolicName("bundleimpl"), "1.0.0"); assertBundleNotExists(getSymbolicName("bundleapi"), "1.0.0"); if (value != null) { System.setProperty("org.apache.felix.deploymentadmin.stopunaffectedbundle", value); } } /** * Tests that if we try to update with a DP containing a duplicate bundle (of which one is already installed in * an earlier DP) that this will fail the installation. See FELIX-4463. */ @Test public void testUpdateWithDuplicateBundleFail() throws Exception { DeploymentPackageBuilder dpBuilder = createDeploymentPackageBuilder("c", "1.0.0"); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundleimpl1", "bundleimpl1", "1.0.0"))); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundleapi1", "bundleapi1", "1.0.0"))); // Should succeed, as the DP is correct... DeploymentPackage dp1 = installDeploymentPackage(dpBuilder); assertNotNull("No deployment package returned?!", dp1); // then, install a fix package with implementation and api bundles in version 2.0.0, but *also* containing the original implementation // bundle, which is incorrect (no bundles with the same BSN may exist in a DP)... dpBuilder = createDeploymentPackageBuilder("c", "2.0.0").setFixPackage("[1.0.0,2.0.0]"); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundleapi1", "bundleapi1", "1.0.0"))); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundleimpl2", "bundleimpl2", "2.0.0"))); dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundleimpl1", "bundleimpl1", "1.0.0"))); try { installDeploymentPackage(dpBuilder); fail("DeploymentException expected!"); } catch (DeploymentException e) { // Ok; expected... assertEquals(DeploymentException.CODE_OTHER_ERROR, e.getCode()); } awaitRefreshPackagesEvent(); // Nothing should be updated... assertBundleExists(getSymbolicName("bundleimpl"), "1.0.0"); assertBundleExists(getSymbolicName("bundleapi"), "1.0.0"); } }