blob: d45a1eba87eae0e2c30e6a998efd29d5c873337d [file] [log] [blame]
/*
* 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");
}
}