/* * JBoss, Home of Professional Open Source * Copyright 2009, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * Licensed 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.jboss.as.test.integration.osgi.deployment; import static org.osgi.framework.Constants.ACTIVATION_LAZY; import static org.osgi.framework.Constants.BUNDLE_VERSION; import java.io.InputStream; import org.jboss.arquillian.container.test.api.Deployer; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.as.controller.client.ModelControllerClient; import org.jboss.as.controller.client.helpers.ClientConstants; import org.jboss.as.controller.client.helpers.standalone.DeploymentPlanBuilder; import org.jboss.as.controller.client.helpers.standalone.ServerDeploymentHelper; import org.jboss.as.test.integration.osgi.deployment.bundle.AttachedType; import org.jboss.osgi.metadata.ManifestBuilder; import org.jboss.osgi.metadata.OSGiManifestBuilder; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.Asset; import org.jboss.shrinkwrap.api.exporter.ZipExporter; import org.jboss.shrinkwrap.api.spec.EnterpriseArchive; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.jboss.test.osgi.FrameworkUtils; import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleReference; import org.osgi.framework.Constants; import org.osgi.util.tracker.ServiceTracker; /** * Test bundle deployment using the {@link ModelControllerClient} * * @author thomas.diesler@jboss.com * @since 22-Mar-2012 */ @RunWith(Arquillian.class) public class ServerDeploymentTestCase { static final String GOOD_BUNDLE = "good-bundle.jar"; static final String GOOD_FRAGMENT = "good-fragment.jar"; static final String GOOD_FRAGMENT_EAR = "good-fragment.ear"; static final String BAD_BUNDLE_VERSION = "bad-bundle-version"; static final String ACTIVATE_LAZILY = "activate-lazily"; @ArquillianResource Deployer deployer; @ArquillianResource BundleContext context; @Deployment public static JavaArchive createdeployment() { final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "deployment-tests"); archive.addClasses(ServerDeploymentHelper.class, FrameworkUtils.class); archive.setManifest(new Asset() { @Override public InputStream openStream() { OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance(); builder.addBundleSymbolicName(archive.getName()); builder.addBundleManifestVersion(2); builder.addImportPackages(ClientConstants.class, ModelControllerClient.class, DeploymentPlanBuilder.class); builder.addImportPackages(ServiceTracker.class); return builder.openStream(); } }); return archive; } @Test public void testAutoStart() throws Exception { ModelControllerClient client = FrameworkUtils.waitForService(context, ModelControllerClient.class); ServerDeploymentHelper server = new ServerDeploymentHelper(client); // Deploy the bundle InputStream input = deployer.getDeployment(GOOD_BUNDLE); String runtimeName = server.deploy("auto-start", input); // Find the deployed bundle Bundle bundle = context.getBundle("auto-start"); Assert.assertEquals("Bundle ACTIVE", Bundle.ACTIVE, bundle.getState()); server.undeploy(runtimeName); Assert.assertEquals("Bundle UNINSTALLED", Bundle.UNINSTALLED, bundle.getState()); } @Test public void testBadBundleVersion() throws Exception { ModelControllerClient client = FrameworkUtils.waitForService(context, ModelControllerClient.class); ServerDeploymentHelper server = new ServerDeploymentHelper(client); InputStream input = deployer.getDeployment(BAD_BUNDLE_VERSION); try { server.deploy(BAD_BUNDLE_VERSION, input); Assert.fail("Deployment exception expected"); } catch (Exception ex) { // expected } } @Test public void testRedeployAfterUndeploy() throws Exception { ModelControllerClient client = FrameworkUtils.waitForService(context, ModelControllerClient.class); ServerDeploymentHelper server = new ServerDeploymentHelper(client); // Deploy the bundle InputStream input = deployer.getDeployment(GOOD_BUNDLE); String runtimeName = server.deploy("redeploy", input); // Find the deployed bundle Bundle bundle = context.getBundle("redeploy"); Assert.assertEquals("Bundle ACTIVE", Bundle.ACTIVE, bundle.getState()); server.undeploy(runtimeName); Assert.assertEquals("Bundle UNINSTALLED", Bundle.UNINSTALLED, bundle.getState()); // Redeploy the same bundle input = deployer.getDeployment(GOOD_BUNDLE); runtimeName = server.deploy("redeploy", input); // Find the deployed bundle bundle = context.getBundle("redeploy"); Assert.assertEquals("Bundle ACTIVE", Bundle.ACTIVE, bundle.getState()); server.undeploy(runtimeName); Assert.assertEquals("Bundle UNINSTALLED", Bundle.UNINSTALLED, bundle.getState()); } @Test public void testAttachedFragment() throws Exception { ModelControllerClient client = FrameworkUtils.waitForService(context, ModelControllerClient.class); ServerDeploymentHelper server = new ServerDeploymentHelper(client); // Deploy the fragment InputStream input = deployer.getDeployment(GOOD_FRAGMENT); String fragmentName = server.deploy("bundle-fragment-attached", input); // Find the deployed bundle Bundle fragment = context.getBundle("bundle-fragment-attached"); Assert.assertEquals("Bundle INSTALLED", Bundle.INSTALLED, fragment.getState()); // Deploy the bundle input = deployer.getDeployment(GOOD_BUNDLE); String hostName = server.deploy("bundle-host-attached", input); // Find the deployed bundle Bundle host = context.getBundle("bundle-host-attached"); Assert.assertEquals("Bundle ACTIVE", Bundle.ACTIVE, host.getState()); Assert.assertEquals("Bundle RESOLVED", Bundle.RESOLVED, fragment.getState()); Class<?> clazz = host.loadClass("org.jboss.as.test.integration.osgi.deployment.bundle.AttachedType"); Assert.assertNotNull("Class not null", clazz); Assert.assertSame(host, ((BundleReference)clazz.getClassLoader()).getBundle()); server.undeploy(fragmentName); Assert.assertEquals("Bundle UNINSTALLED", Bundle.UNINSTALLED, fragment.getState()); server.undeploy(hostName); Assert.assertEquals("Bundle UNINSTALLED", Bundle.UNINSTALLED, host.getState()); } @Test public void testUnattachedFragment() throws Exception { ModelControllerClient client = FrameworkUtils.waitForService(context, ModelControllerClient.class); ServerDeploymentHelper server = new ServerDeploymentHelper(client); // Deploy the bundle InputStream input = deployer.getDeployment(GOOD_BUNDLE); String hostName = server.deploy("bundle-host", input); // Find the deployed bundle Bundle host = context.getBundle("bundle-host"); Assert.assertEquals("Bundle ACTIVE", Bundle.ACTIVE, host.getState()); // Deploy the fragment input = deployer.getDeployment(GOOD_FRAGMENT); String fragmentName = server.deploy("bundle-fragment", input); // Find the deployed bundle Bundle fragment = context.getBundle("bundle-fragment"); Assert.assertEquals("Bundle INSTALLED", Bundle.INSTALLED, fragment.getState()); try { host.loadClass("org.jboss.as.test.integration.osgi.deployment.bundle.AttachedType"); Assert.fail("ClassNotFoundException expected"); } catch (ClassNotFoundException ex) { // expected } server.undeploy(fragmentName); Assert.assertEquals("Bundle UNINSTALLED", Bundle.UNINSTALLED, fragment.getState()); server.undeploy(hostName); Assert.assertEquals("Bundle UNINSTALLED", Bundle.UNINSTALLED, host.getState()); } @Test public void testAttachedFragmentEar() throws Exception { ModelControllerClient client = FrameworkUtils.waitForService(context, ModelControllerClient.class); ServerDeploymentHelper server = new ServerDeploymentHelper(client); // Deploy the fragment InputStream input = deployer.getDeployment(GOOD_FRAGMENT_EAR); String earName = server.deploy(GOOD_FRAGMENT_EAR, input); // Find the deployed fragment Bundle fragment = context.getBundle(GOOD_FRAGMENT); Assert.assertEquals("Bundle RESOLVED", Bundle.RESOLVED, fragment.getState()); // Find the deployed bundle Bundle host = context.getBundle(GOOD_BUNDLE); Assert.assertEquals("Bundle ACTIVE", Bundle.ACTIVE, host.getState()); Class<?> clazz = host.loadClass("org.jboss.as.test.integration.osgi.deployment.bundle.AttachedType"); Assert.assertNotNull("Class not null", clazz); Assert.assertSame(host, ((BundleReference)clazz.getClassLoader()).getBundle()); server.undeploy(earName); Assert.assertEquals("Bundle UNINSTALLED", Bundle.UNINSTALLED, fragment.getState()); Assert.assertEquals("Bundle UNINSTALLED", Bundle.UNINSTALLED, host.getState()); } @Deployment(name = GOOD_BUNDLE, managed = false, testable = false) public static JavaArchive getGoodBundleArchive() { final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, GOOD_BUNDLE); archive.setManifest(new Asset() { @Override public InputStream openStream() { OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance(); builder.addBundleManifestVersion(2); builder.addBundleSymbolicName(archive.getName()); return builder.openStream(); } }); return archive; } @Deployment(name = GOOD_FRAGMENT, managed = false, testable = false) public static JavaArchive getGoodFragmentArchive() { final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, GOOD_FRAGMENT); archive.addClasses(AttachedType.class); archive.setManifest(new Asset() { @Override public InputStream openStream() { OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance(); builder.addBundleManifestVersion(2); builder.addBundleSymbolicName(archive.getName()); builder.addFragmentHost(GOOD_BUNDLE); return builder.openStream(); } }); return archive; } @Deployment(name = GOOD_FRAGMENT_EAR, managed = false, testable = false) public static EnterpriseArchive getGoodFragmentEar() { final EnterpriseArchive archive = ShrinkWrap.create(EnterpriseArchive.class, GOOD_FRAGMENT_EAR); archive.add(getGoodBundleArchive(), "/", ZipExporter.class); archive.add(getGoodFragmentArchive(), "/", ZipExporter.class); return archive; } @Deployment(name = BAD_BUNDLE_VERSION, managed = false, testable = false) public static JavaArchive getBadBundleArchive() { final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, BAD_BUNDLE_VERSION); archive.setManifest(new Asset() { @Override public InputStream openStream() { ManifestBuilder builder = ManifestBuilder.newInstance(); builder.addManifestHeader(Constants.BUNDLE_MANIFESTVERSION, "2"); builder.addManifestHeader(Constants.BUNDLE_SYMBOLICNAME, archive.getName()); builder.addManifestHeader(BUNDLE_VERSION, "bogus"); return builder.openStream(); } }); return archive; } @Deployment(name = ACTIVATE_LAZILY, managed = false, testable = false) public static JavaArchive getLazyActivationArchive() { final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, ACTIVATE_LAZILY); archive.setManifest(new Asset() { @Override public InputStream openStream() { OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance(); builder.addBundleManifestVersion(2); builder.addBundleSymbolicName(archive.getName()); builder.addBundleActivationPolicy(ACTIVATION_LAZY); return builder.openStream(); } }); return archive; } }