| /* |
| * 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.apache.felix.deploymentadmin.itest.util.CertificateUtil.createSelfSignedCert; |
| |
| import java.io.File; |
| import java.net.URL; |
| |
| import org.apache.felix.deploymentadmin.itest.util.CertificateUtil.KeyType; |
| import org.apache.felix.deploymentadmin.itest.util.CertificateUtil.SignerInfo; |
| import org.apache.felix.deploymentadmin.itest.util.DeploymentPackageBuilder; |
| import org.apache.felix.deploymentadmin.itest.util.DeploymentPackageBuilder.JarManifestManipulatingFilter; |
| 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.BundleInfo; |
| import org.osgi.service.deploymentadmin.DeploymentException; |
| import org.osgi.service.deploymentadmin.DeploymentPackage; |
| |
| /** |
| * Provides test cases regarding the use of "normal" deployment packages in DeploymentAdmin. |
| */ |
| @RunWith(PaxExam.class) |
| public class InstallDeploymentPackageTest extends BaseIntegrationTest { |
| /** |
| * FELIX-518 - Test that DP with localization and signature files are properly deployed. |
| */ |
| @Test |
| public void testInstallDeploymentPackageWithLocalizationAndSignatureFilesOk() throws Exception { |
| URL dpProps = getClass().getResource("/dp.properties"); |
| assertNotNull(dpProps); |
| |
| SignerInfo signer = createSelfSignedCert("CN=dpTest", KeyType.EC); |
| |
| DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); |
| dpBuilder.signOutput(signer.getPrivate(), signer.getCert()) |
| .add(dpBuilder.createLocalizationResource().setUrl(dpProps).setResourceProcessorPID(TEST_FAILING_BUNDLE_RP1).setFilename("dp.properties")) |
| .add(dpBuilder.createResourceProcessorResource().setUrl(getTestBundleURL("rp1"))) |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))) |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2"))); |
| |
| installDeploymentPackage(dpBuilder); // should succeed. |
| |
| assertBundleExists("testbundles.bundle1", "1.0.0"); |
| assertBundleExists("testbundles.bundle2", "1.0.0"); |
| assertBundleExists("testbundles.rp1", "1.0.0"); |
| } |
| |
| /** |
| * FELIX-4409/4410/4463 - test the installation of an invalid deployment package. |
| */ |
| @Test |
| public void testInstallInvalidDeploymentPackageFail() throws Exception { |
| DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); |
| // incluse two different versions of the same bundle (with the same BSN), this is *not* allowed per the DA |
| // spec... |
| dpBuilder |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundleapi1", "bundleapi1", "1.0.0"))) |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundleapi2", "bundleapi2", "2.0.0"))); |
| |
| try { |
| installDeploymentPackage(dpBuilder); |
| fail("DeploymentException expected!"); |
| } |
| catch (DeploymentException e) { |
| // Ok; expected... |
| } |
| |
| // Verify that none of the bundles are installed... |
| assertBundleNotExists("testbundles.bundleapi", "1.0.0"); |
| assertBundleNotExists("testbundles.bundleapi", "2.0.0"); |
| } |
| |
| /** |
| * FELIX-1835 - test whether we can install bundles with a non-root path inside the DP. |
| */ |
| @Test |
| public void testInstallBundlesWithPathsOk() throws Exception { |
| DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); |
| // incluse two different versions of the same bundle (with the same BSN), this is *not* allowed per the DA |
| // spec... |
| dpBuilder |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundleapi1", "bundleapi1", "1.0.0")).setFilename("bundles/bundleapi1.jar")) |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundleimpl1", "bundleimpl1", "1.0.0")).setFilename("bundles/bundleimpl1.jar")); |
| |
| DeploymentPackage dp = installDeploymentPackage(dpBuilder); |
| assertNotNull(dp); |
| |
| BundleInfo[] bundleInfos = dp.getBundleInfos(); |
| assertEquals(2, bundleInfos.length); |
| |
| // Verify that none of the bundles are installed... |
| assertBundleExists("testbundles.bundleapi", "1.0.0"); |
| assertBundleExists("testbundles.bundleimpl", "1.0.0"); |
| } |
| |
| /** |
| * Tests that adding the dependency for a bundle in an update package causes the depending bundle to be resolved and |
| * started. |
| */ |
| @Test |
| public void testInstallBundleWithDependencyInPackageUpdateOk() throws Exception { |
| DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); |
| // missing bundle1 as dependency... |
| 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); |
| |
| assertTrue(isBundleInstalled(dp1.getBundle(getSymbolicName("bundle2")))); |
| |
| dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1"); |
| dpBuilder |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2"))) |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))); |
| |
| DeploymentPackage dp2 = installDeploymentPackage(dpBuilder); |
| assertNotNull("No deployment package returned?!", dp2); |
| |
| awaitRefreshPackagesEvent(); |
| |
| assertTrue(isBundleActive(dp2.getBundle(getSymbolicName("bundle1")))); |
| assertTrue(isBundleActive(dp2.getBundle(getSymbolicName("bundle2")))); |
| } |
| |
| /** |
| * Tests that installing a bundle with a dependency installed by another deployment package is not started, but is |
| * resolved. |
| */ |
| @Test |
| public void testInstallBundleWithDependencyInSeparatePackageOk() 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(); |
| |
| assertBundleExists(getSymbolicName("bundle2"), "1.0.0"); |
| |
| // We shouldn't be able to resolve the deps for bundle2... |
| assertFalse(resolveBundles(dp1.getBundle(getSymbolicName("bundle2")))); |
| |
| assertTrue(isBundleInstalled(dp1.getBundle(getSymbolicName("bundle2")))); |
| |
| dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); |
| // as missing bundle1... |
| dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))); |
| |
| DeploymentPackage dp2 = installDeploymentPackage(dpBuilder); |
| assertNotNull("No deployment package returned?!", dp2); |
| |
| awaitRefreshPackagesEvent(); |
| |
| assertBundleExists(getSymbolicName("bundle1"), "1.0.0"); |
| assertBundleExists(getSymbolicName("bundle2"), "1.0.0"); |
| |
| // Now we should be able to resolve the dependencies for bundle2... |
| assertTrue(resolveBundles(dp1.getBundle(getSymbolicName("bundle2")))); |
| |
| assertTrue(isBundleActive(dp2.getBundle(getSymbolicName("bundle1")))); |
| assertTrue(isBundleResolved(dp1.getBundle(getSymbolicName("bundle2")))); |
| } |
| |
| /** |
| * Tests that if an exception is thrown in the start method of a bundle, the installation is not rolled back. |
| */ |
| @Test |
| public void testInstallBundleWithExceptionThrownInStartCausesNoRollbackOk() throws Exception { |
| System.setProperty("bundle3", "start"); |
| |
| DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); |
| dpBuilder |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))) |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle3"))); |
| |
| DeploymentPackage dp = installDeploymentPackage(dpBuilder); |
| assertNotNull("No deployment package returned?!", dp); |
| |
| awaitRefreshPackagesEvent(); |
| |
| assertBundleExists(getSymbolicName("bundle1"), "1.0.0"); |
| assertBundleExists(getSymbolicName("bundle3"), "1.0.0"); |
| |
| assertTrue(isBundleActive(dp.getBundle(getSymbolicName("bundle1")))); |
| // the bundle threw an exception during start, so it is not active... |
| assertFalse(isBundleActive(dp.getBundle(getSymbolicName("bundle3")))); |
| |
| assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages()); |
| } |
| |
| /** |
| * Tests that installing a bundle along with a fragment bundle succeeds (DA should not try to start the fragment, |
| * see FELIX-4167). |
| */ |
| @Test |
| public void testInstallBundleWithFragmentOk() throws Exception { |
| DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); |
| dpBuilder |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))) |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("fragment1"))); |
| |
| DeploymentPackage dp = installDeploymentPackage(dpBuilder); |
| assertNotNull("No deployment package returned?!", dp); |
| |
| awaitRefreshPackagesEvent(); |
| |
| assertBundleExists(getSymbolicName("bundle1"), "1.0.0"); |
| assertBundleExists(getSymbolicName("fragment1"), "1.0.0"); |
| |
| assertTrue(isBundleActive(dp.getBundle(getSymbolicName("bundle1")))); |
| assertFalse(isBundleActive(dp.getBundle(getSymbolicName("fragment1")))); |
| |
| assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages()); |
| } |
| |
| /** |
| * Tests that installing a bundle whose dependencies cannot be met, is installed, but not started. |
| */ |
| @Test |
| public void testInstallBundleWithMissingDependencyOk() throws Exception { |
| DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); |
| dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2"))); |
| |
| DeploymentPackage dp = installDeploymentPackage(dpBuilder); |
| assertNotNull("No deployment package returned?!", dp); |
| |
| awaitRefreshPackagesEvent(); |
| |
| Bundle bundle = dp.getBundle(getSymbolicName("bundle2")); |
| assertNotNull("Failed to obtain bundle from deployment package?!", bundle); |
| |
| assertBundleExists(getSymbolicName("bundle2"), "1.0.0"); |
| |
| assertTrue(isBundleInstalled(dp.getBundle(getSymbolicName("bundle2")))); |
| } |
| |
| /** |
| * Tests that installing a bundle along with other (non-bundle) artifacts succeeds. |
| */ |
| @Test |
| public void testInstallBundleWithOtherArtifactsOk() throws Exception { |
| DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); |
| dpBuilder |
| .add(dpBuilder.createResourceProcessorResource().setUrl(getTestBundleURL("rp1"))) |
| .add(dpBuilder.createResource().setResourceProcessorPID(TEST_FAILING_BUNDLE_RP1).setUrl(getTestResource("test-config1.xml"))) |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle3"))); |
| |
| DeploymentPackage dp = installDeploymentPackage(dpBuilder); |
| assertNotNull("No deployment package returned?!", dp); |
| |
| awaitRefreshPackagesEvent(); |
| |
| // Though the commit failed; the package should be installed... |
| assertBundleExists(getSymbolicName("rp1"), "1.0.0"); |
| assertBundleExists(getSymbolicName("bundle3"), "1.0.0"); |
| |
| assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages()); |
| } |
| |
| /** |
| * Tests that installing a new bundle works as expected. |
| */ |
| @Test |
| public void testInstallSingleValidBundleOk() throws Exception { |
| DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); |
| dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))); |
| |
| DeploymentPackage dp = installDeploymentPackage(dpBuilder); |
| assertNotNull("No deployment package returned?!", dp); |
| |
| awaitRefreshPackagesEvent(); |
| |
| assertNotNull("Failed to obtain test service?!", awaitService(TEST_SERVICE_NAME)); |
| |
| assertBundleExists(getSymbolicName("bundle1"), "1.0.0"); |
| assertTrue(isBundleActive(dp.getBundle(getSymbolicName("bundle1")))); |
| } |
| |
| /** |
| * Tests that installing two bundles works as expected. |
| */ |
| @Test |
| public void testInstallTwoValidBundlesOk() throws Exception { |
| DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); |
| dpBuilder |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))) |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2"))); |
| |
| DeploymentPackage dp = installDeploymentPackage(dpBuilder); |
| assertNotNull("No deployment package returned?!", dp); |
| |
| awaitRefreshPackagesEvent(); |
| |
| assertNotNull("Failed to obtain test service?!", awaitService(TEST_SERVICE_NAME)); |
| |
| assertBundleExists(getSymbolicName("bundle1"), "1.0.0"); |
| assertBundleExists(getSymbolicName("bundle2"), "1.0.0"); |
| |
| assertTrue(isBundleActive(dp.getBundle(getSymbolicName("bundle1")))); |
| assertTrue(isBundleActive(dp.getBundle(getSymbolicName("bundle2")))); |
| } |
| |
| /** |
| * Tests that if an exception is thrown during the uninstall of a bundle, the installation/update continues and |
| * succeeds. |
| */ |
| @Test |
| public void testUninstallBundleWithExceptionThrownInStopCauseNoRollbackOk() throws Exception { |
| DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); |
| dpBuilder |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))) |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle3"))); |
| |
| DeploymentPackage dp = installDeploymentPackage(dpBuilder); |
| assertNotNull("No deployment package returned?!", dp); |
| |
| awaitRefreshPackagesEvent(); |
| |
| assertBundleExists(getSymbolicName("bundle3"), "1.0.0"); |
| |
| System.setProperty("bundle3", "stop"); |
| |
| dpBuilder = dpBuilder.create("1.0.1"); |
| dpBuilder |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))) |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2"))); |
| |
| dp = installDeploymentPackage(dpBuilder); |
| assertNotNull("No deployment package returned?!", dp); |
| |
| assertBundleExists(getSymbolicName("bundle1"), "1.0.0"); |
| assertBundleExists(getSymbolicName("bundle2"), "1.0.0"); |
| assertBundleNotExists(getSymbolicName("bundle3"), "1.0.0"); |
| |
| assertTrue(isBundleActive(dp.getBundle(getSymbolicName("bundle1")))); |
| assertTrue(isBundleActive(dp.getBundle(getSymbolicName("bundle2")))); |
| |
| assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages()); |
| } |
| |
| /** |
| * Tests that if an exception is thrown during the stop of a bundle, the installation/update continues and succeeds. |
| */ |
| @Test |
| public void testUpdateBundleWithExceptionThrownInStopCauseNoRollbackOk() throws Exception { |
| DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); |
| dpBuilder |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))) |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle3"))); |
| |
| DeploymentPackage dp = installDeploymentPackage(dpBuilder); |
| assertNotNull("No deployment package returned?!", dp); |
| |
| awaitRefreshPackagesEvent(); |
| |
| assertBundleExists(getSymbolicName("bundle3"), "1.0.0"); |
| |
| System.setProperty("bundle3", "stop"); |
| |
| dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1"); |
| dpBuilder |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))) |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle2"))) |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle3"))); |
| |
| dp = installDeploymentPackage(dpBuilder); |
| assertNotNull("No deployment package returned?!", dp); |
| |
| assertBundleExists(getSymbolicName("bundle1"), "1.0.0"); |
| assertBundleExists(getSymbolicName("bundle2"), "1.0.0"); |
| assertBundleExists(getSymbolicName("bundle3"), "1.0.0"); |
| |
| assertTrue(isBundleActive(dp.getBundle(getSymbolicName("bundle1")))); |
| assertTrue(isBundleActive(dp.getBundle(getSymbolicName("bundle2")))); |
| assertTrue(isBundleActive(dp.getBundle(getSymbolicName("bundle3")))); |
| |
| assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages()); |
| } |
| |
| /** |
| * Tests that we can correctly rollback the installation of a deployment package for bundles that have their data |
| * area populated. |
| */ |
| @Test |
| public void testRollbackWithPopulatedDataAreaOk() throws Exception { |
| // Install a first version, in which we're going to change the data area of a bundle... |
| DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); |
| dpBuilder |
| .add(dpBuilder.createBundleResource().setUrl(getTestBundleURL("bundle1"))) |
| .add(dpBuilder.createResourceProcessorResource().setUrl(getTestBundleURL("rp1"))); |
| |
| DeploymentPackage dp = installDeploymentPackage(dpBuilder); |
| assertNotNull("No deployment package returned?!", dp); |
| |
| awaitRefreshPackagesEvent(); |
| |
| Bundle bundle1 = getBundle("testbundles.bundle1"); |
| assertNotNull("Unable to get installed test bundle?!", bundle1); |
| |
| File dataArea = bundle1.getDataFile(""); |
| assertNotNull("No data area obtained for test bundle?!", dataArea); |
| |
| // Populate the data area... |
| assertTrue("No file created?!", new File(dataArea, "file1").createNewFile()); |
| assertTrue("No file created?!", new File(dataArea, "file2").createNewFile()); |
| assertTrue("No file created?!", new File(dataArea, "file3").createNewFile()); |
| |
| // This will cause the new bundle to fail in its stop method... |
| System.setProperty("rp1", "process"); |
| |
| // Simulate an upgrade for our bundle, which should cause its data area to be retained... |
| dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1"); |
| dpBuilder |
| .add(dpBuilder.createBundleResource().setVersion("1.1.0").setUrl(getTestBundleURL("bundle1")).setFilter(new JarManifestManipulatingFilter("Bundle-Version", "1.1.0"))) |
| .add(dpBuilder.createResourceProcessorResource().setUrl(getTestBundleURL("rp1"))) |
| .add(dpBuilder.createResource().setResourceProcessorPID(TEST_FAILING_BUNDLE_RP1).setUrl(getTestResource("test-config1.xml"))); |
| |
| try { |
| dp = installDeploymentPackage(dpBuilder); // should fail! |
| fail("Deployment of upgrade package should have failed?!"); |
| } |
| catch (DeploymentException e) { |
| // Ok; expected... |
| } |
| |
| // We should still have this bundle.. |
| bundle1 = getBundle("testbundles.bundle1"); |
| assertNotNull("Unable to get installed test bundle?!", bundle1); |
| |
| dataArea = bundle1.getDataFile(""); |
| assertNotNull("No data area obtained for test bundle?!", dataArea); |
| |
| // Data area should be restored exactly as-is... |
| assertTrue("File not restored?!", new File(dataArea, "file1").exists()); |
| assertTrue("File not restored?!", new File(dataArea, "file2").exists()); |
| assertTrue("File not restored?!", new File(dataArea, "file3").exists()); |
| } |
| |
| /** |
| * Tests that we can correctly install a deployment package with bundles that have their data area populated. |
| */ |
| @Test |
| public void testUpgradeWithPopulatedDataAreaOk() throws Exception { |
| // Install a first version, in which we're going to change the data area of a bundle... |
| DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); |
| dpBuilder |
| .add(dpBuilder.createBundleResource().setVersion("1.0.0").setUrl(getTestBundleURL("bundle1"))) |
| .add(dpBuilder.createResourceProcessorResource().setUrl(getTestBundleURL("rp1"))); |
| |
| DeploymentPackage dp = installDeploymentPackage(dpBuilder); |
| assertNotNull("No deployment package returned?!", dp); |
| |
| awaitRefreshPackagesEvent(); |
| |
| Bundle bundle1 = getBundle("testbundles.bundle1"); |
| assertNotNull("Unable to get installed test bundle?!", bundle1); |
| |
| File dataArea = bundle1.getDataFile(""); |
| assertNotNull("No data area obtained for test bundle?!", dataArea); |
| |
| // Populate the data area... |
| assertTrue("No file created?!", new File(dataArea, "file1").createNewFile()); |
| assertTrue("No file created?!", new File(dataArea, "file2").createNewFile()); |
| assertTrue("No file created?!", new File(dataArea, "file3").createNewFile()); |
| |
| dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1"); |
| dpBuilder |
| .add(dpBuilder.createBundleResource().setVersion("1.1.0").setUrl(getTestBundleURL("bundle1")).setFilter(new JarManifestManipulatingFilter("Bundle-Version", "1.1.0"))) |
| .add(dpBuilder.createResourceProcessorResource().setUrl(getTestBundleURL("rp1"))) |
| .add(dpBuilder.createResource().setResourceProcessorPID(TEST_FAILING_BUNDLE_RP1).setUrl(getTestResource("test-config1.xml"))); |
| |
| dp = installDeploymentPackage(dpBuilder); // should succeed! |
| |
| // We should still have this bundle.. |
| bundle1 = getBundle("testbundles.bundle1"); |
| assertNotNull("Unable to get installed test bundle?!", bundle1); |
| |
| dataArea = bundle1.getDataFile(""); |
| assertNotNull("No data area obtained for test bundle?!", dataArea); |
| |
| // Data area should be restored exactly as-is... |
| assertTrue("File not restored?!", new File(dataArea, "file1").exists()); |
| assertTrue("File not restored?!", new File(dataArea, "file2").exists()); |
| assertTrue("File not restored?!", new File(dataArea, "file3").exists()); |
| } |
| |
| /** |
| * Tests that we can correctly install a deployment package with bundles that have their data area populated. |
| */ |
| @Test |
| public void testUninstallBundleWithPopulatedDataAreaOk() throws Exception { |
| // Install a first version, in which we're going to change the data area of a bundle... |
| DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); |
| dpBuilder |
| .add(dpBuilder.createBundleResource().setVersion("1.0.0").setUrl(getTestBundleURL("bundle1"))) |
| .add(dpBuilder.createResourceProcessorResource().setUrl(getTestBundleURL("rp1"))); |
| |
| DeploymentPackage dp = installDeploymentPackage(dpBuilder); |
| assertNotNull("No deployment package returned?!", dp); |
| |
| awaitRefreshPackagesEvent(); |
| |
| Bundle bundle1 = getBundle("testbundles.bundle1"); |
| assertNotNull("Unable to get installed test bundle?!", bundle1); |
| |
| File dataArea = bundle1.getDataFile(""); |
| assertNotNull("No data area obtained for test bundle?!", dataArea); |
| |
| // Populate the data area... |
| assertTrue("No file created?!", new File(dataArea, "file1").createNewFile()); |
| assertTrue("No file created?!", new File(dataArea, "file2").createNewFile()); |
| assertTrue("No file created?!", new File(dataArea, "file3").createNewFile()); |
| |
| dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1"); |
| dpBuilder |
| .add(dpBuilder.createResourceProcessorResource().setUrl(getTestBundleURL("rp1"))) |
| .add(dpBuilder.createResource().setResourceProcessorPID(TEST_FAILING_BUNDLE_RP1).setUrl(getTestResource("test-config1.xml"))); |
| |
| dp = installDeploymentPackage(dpBuilder); // should succeed! |
| |
| // We should no longer have this bundle.. |
| bundle1 = getBundle("testbundles.bundle1"); |
| assertNull("Unable to get installed test bundle?!", bundle1); |
| |
| // Data area should be restored exactly as-is... |
| assertFalse("Data area not purged?!", dataArea.exists()); |
| } |
| |
| /** |
| * Tests that we can correctly install a deployment package with bundles that have their data area populated. |
| */ |
| @Test |
| public void testRollbackUninstallBundleWithPopulatedDataAreaOk() throws Exception { |
| // Install a first version, in which we're going to change the data area of a bundle... |
| DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0"); |
| dpBuilder |
| .add(dpBuilder.createBundleResource().setVersion("1.0.0").setUrl(getTestBundleURL("bundle1"))) |
| .add(dpBuilder.createResourceProcessorResource().setUrl(getTestBundleURL("rp1"))); |
| |
| DeploymentPackage dp = installDeploymentPackage(dpBuilder); |
| assertNotNull("No deployment package returned?!", dp); |
| |
| awaitRefreshPackagesEvent(); |
| |
| Bundle bundle1 = getBundle("testbundles.bundle1"); |
| assertNotNull("Unable to get installed test bundle?!", bundle1); |
| |
| File dataArea = bundle1.getDataFile(""); |
| assertNotNull("No data area obtained for test bundle?!", dataArea); |
| |
| // Populate the data area... |
| assertTrue("No file created?!", new File(dataArea, "file1").createNewFile()); |
| assertTrue("No file created?!", new File(dataArea, "file2").createNewFile()); |
| assertTrue("No file created?!", new File(dataArea, "file3").createNewFile()); |
| |
| // This will cause the new bundle to fail in its stop method... |
| System.setProperty("rp1", "process"); |
| |
| dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1"); |
| dpBuilder |
| .add(dpBuilder.createResourceProcessorResource().setUrl(getTestBundleURL("rp1"))) |
| .add(dpBuilder.createResource().setResourceProcessorPID(TEST_FAILING_BUNDLE_RP1).setUrl(getTestResource("test-config1.xml"))); |
| |
| try { |
| dp = installDeploymentPackage(dpBuilder); // should fail! |
| fail("Deployment of upgrade package should have failed?!"); |
| } |
| catch (DeploymentException e) { |
| // Ok; expected... |
| } |
| |
| // We should still have this bundle.. |
| bundle1 = getBundle("testbundles.bundle1"); |
| assertNotNull("Unable to get installed test bundle?!", bundle1); |
| |
| dataArea = bundle1.getDataFile(""); |
| assertNotNull("No data area obtained for test bundle?!", dataArea); |
| |
| // Data area should be restored exactly as-is... |
| assertTrue("File not restored?!", new File(dataArea, "file1").exists()); |
| assertTrue("File not restored?!", new File(dataArea, "file2").exists()); |
| assertTrue("File not restored?!", new File(dataArea, "file3").exists()); |
| } |
| } |