/******************************************************************************* * Copyright (c) 2008, 2010 VMware Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VMware Inc. - initial contribution *******************************************************************************/ package org.eclipse.virgo.kernel.userregion.internal.equinox; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import java.io.IOException; import java.io.Reader; import java.net.URI; import org.junit.Test; import org.osgi.framework.Bundle; import org.osgi.framework.BundleException; import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle; import org.eclipse.virgo.util.io.IOUtils; import org.eclipse.virgo.util.osgi.manifest.VersionRange; import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory; /** */ public class BundleInstallationTests extends AbstractOsgiFrameworkLaunchingTests { @Override protected String getRepositoryConfigDirectory() { return new File("src/test/resources/config/BundleInstallationTests").getAbsolutePath(); } @Test(expected = BundleException.class) public void testFailedInstall() throws Exception { installBundle("fail.parent"); } @Test public void testInstallFragHost() throws Exception { Bundle bundle = installBundle("frag.host"); assertNotNull(bundle); assertEquals(Bundle.INSTALLED, bundle.getState()); Bundle[] bundles = this.framework.getBundleContext().getBundles(); boolean foundChild = false; for (Bundle b : bundles) { if ("frag.child".equals(b.getSymbolicName())) { foundChild = true; break; } } assertTrue(foundChild); } @Test public void testInstallFragChild() throws Exception { Bundle bundle = installBundle("frag.child"); assertNotNull(bundle); assertEquals(Bundle.RESOLVED, bundle.getState()); } @Test public void testInstallBundleWithNoDependencies() throws Exception { Bundle bundle = installBundle("org.eclipse.virgo.server.mock.bundle"); assertNotNull(bundle); bundle.start(); assertEquals(Bundle.ACTIVE, bundle.getState()); } @Test public void testInstallBundleWithMultipleDependencies() throws Exception { Bundle bundle = installBundle("install.three"); assertNotNull(bundle); bundle.start(); assertEquals(Bundle.ACTIVE, bundle.getState()); } @Test public void testInstallBundleWithTransitiveDependencies() throws Exception { Bundle bundle = installBundle("install.four"); assertNotNull(bundle); assertEquals(Bundle.RESOLVED, bundle.getState()); } @Test public void testInstallBundleWithRequireBundle() throws Exception { Bundle bundle = installBundle("install.five"); assertNotNull(bundle); assertEquals(Bundle.RESOLVED, bundle.getState()); } @Test public void testInstallBundleWithCircle() throws Exception { Bundle bundle = installBundle("install.six"); assertNotNull(bundle); assertEquals(Bundle.RESOLVED, bundle.getState()); } @Test public void platform170() throws Exception { Bundle b = installBundle(new File("./src/test/resources/platform170/simpleosgiservice-1.0.0.jar")); b.start(); b = installBundle(new File("./src/test/resources/platform170/simpleosgiservice-2.0.0.jar")); b.start(); b = installBundle(new File("./src/test/resources/platform170/simpleosgiapp-1.0.0.jar")); b.start(); assertEquals(Bundle.ACTIVE, b.getState()); } @Test public void testInstallWithOptionalImportNotSatisfied() throws Exception { Bundle b = installBundle("install.optional.ns"); b.start(); assertEquals(Bundle.ACTIVE, b.getState()); } @Test public void testInstallWithOptionalImportWithNotSatisfiedDependencyInOptional() throws Exception { Bundle b = installBundle("install.optional.dep.bundle"); b.start(); assertEquals(Bundle.ACTIVE, b.getState()); } @Test public void testMultipleOptionsChoosesOnlyOneOption() throws Exception { Bundle b = installBundle("install.multi.bundle"); b.start(); assertEquals(Bundle.ACTIVE, b.getState()); Bundle[] bundles = b.getBundleContext().getBundles(); for (Bundle bundle : bundles) { if ("install.multi.a".equals(bundle.getSymbolicName())) { fail("Bundle install.multi.a should not have been installed into the framework"); } } } @Test public void testSatisfyAgainstBundleNotInRepo() throws Exception { installBundle(new File("./src/test/resources/bit/standalone")); Bundle bundle = installBundle("install.six"); bundle.start(); assertEquals(Bundle.ACTIVE, bundle.getState()); } @Test(expected = BundleException.class) public void testFailedDueToMissingImport() throws Exception { installBundle("install.error.import"); } @Test public void testUnresolvableFragmentIsIgnored() throws Exception { Bundle b = installBundle("fragments.unresolvable.host"); b.start(); assertEquals(Bundle.ACTIVE, b.getState()); } @Test(expected = BundleException.class) public void testFailDueToUses() throws Exception { installBundle("install.uses.hibernate325"); installBundle("install.uses.hibernate326"); Bundle b = installBundle("install.uses.spring"); b.start(); assertEquals(Bundle.ACTIVE, b.getState()); installBundle("install.uses.bundle"); } private Bundle installBundle(String symbolicName) throws BundleException, IOException { URI bundleLocation = this.repository.get("bundle", symbolicName, VersionRange.NATURAL_NUMBER_RANGE).getUri(); File bundleFile = new File(bundleLocation); return installBundle(bundleFile); } private Bundle installBundle(File bundleFile) throws BundleException, IOException { Reader manifest = null; try { if (bundleFile.isDirectory()) { manifest = ManifestUtils.manifestReaderFromExplodedDirectory(bundleFile); } else { manifest = ManifestUtils.manifestReaderFromJar(bundleFile); } QuasiBundle quasiBundle = this.quasiFramework.install(bundleFile.toURI(), BundleManifestFactory.createBundleManifest(manifest)); this.quasiFramework.resolve(); this.quasiFramework.commit(); return quasiBundle.getBundle(); } finally { IOUtils.closeQuietly(manifest); } } }