blob: a52010fb57f805347444cf15ba6b7820c6d49948 [file] [log] [blame]
/*******************************************************************************
* 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.osgi.test;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.Version;
import org.eclipse.virgo.kernel.osgi.framework.OsgiFrameworkUtils;
import org.eclipse.virgo.kernel.osgi.framework.OsgiServiceHolder;
import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
import org.eclipse.virgo.kernel.osgi.quasi.QuasiPackageResolutionFailure;
import org.eclipse.virgo.kernel.osgi.quasi.QuasiRequiredBundle;
import org.eclipse.virgo.kernel.osgi.quasi.QuasiResolutionFailure;
import org.eclipse.virgo.kernel.test.AbstractKernelIntegrationTest;
import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
import org.eclipse.virgo.util.osgi.manifest.RequireBundle;
/**
*/
public class QuasiFrameworkIntegrationTests extends AbstractKernelIntegrationTest {
private static final String EXPORTER_BSN = "exporter";
private static final String IMPORTER_BSN = "importer";
private static final String REQUIRING_BSN = "requirer";
private static final String IMPORTER_JAR_PATH = "src/test/resources/quasi/simpleimporter.jar";
private static final String EXPORTER_JAR_PATH = "src/test/resources/quasi/simpleexporter.jar";
private static final String QUASI_TEST_PACKAGE = "quasi.test";
private static final Version BUNDLE_VERSION = new Version("2.3");
private QuasiFrameworkFactory quasiFrameworkFactory;
private QuasiFramework quasiFramework;
@Before
public void setUp() {
BundleContext bundleContext = this.framework.getBundleContext();
OsgiServiceHolder<QuasiFrameworkFactory> holder = OsgiFrameworkUtils.getService(bundleContext, QuasiFrameworkFactory.class);
this.quasiFrameworkFactory = holder.getService();
Assert.assertNotNull(this.quasiFrameworkFactory);
this.quasiFramework = this.quasiFrameworkFactory.create();
Assert.assertNotNull(this.quasiFramework);
}
@After
public void tearDown() {
this.quasiFramework.destroy();
}
@Test
public void testInstall() throws Exception {
BundleManifest bundleManifest = getBundleManifest("test", BUNDLE_VERSION);
QuasiBundle quasiBundle = this.quasiFramework.install(new URI("test"), bundleManifest);
Assert.assertEquals("test", quasiBundle.getSymbolicName());
Assert.assertEquals(BUNDLE_VERSION, quasiBundle.getVersion());
Assert.assertFalse(quasiBundle.isResolved());
Assert.assertNull(quasiBundle.getBundle());
long bundleId = quasiBundle.getBundleId();
Assert.assertFalse(bundleId == 0);
Assert.assertEquals(quasiBundle, this.quasiFramework.getBundle(bundleId));
}
@Test
public void testBasicResolve() throws Exception {
QuasiBundle exporterQuasiBundle = installExporterBundle();
List<QuasiResolutionFailure> resolutionFailures = this.quasiFramework.resolve();
Assert.assertNotNull(resolutionFailures);
Assert.assertEquals(0, resolutionFailures.size());
Assert.assertTrue(exporterQuasiBundle.isResolved());
}
@Test
public void testWiringResolve() throws Exception {
QuasiBundle importerQuasiBundle = installImporterBundle();
QuasiBundle exporterQuasiBundle = installExporterBundle();
List<QuasiResolutionFailure> resolutionFailures = this.quasiFramework.resolve();
Assert.assertNotNull(resolutionFailures);
Assert.assertEquals(0, resolutionFailures.size());
Assert.assertTrue(importerQuasiBundle.isResolved());
Assert.assertTrue(exporterQuasiBundle.isResolved());
}
@Test
public void testFailedResolve() throws Exception {
QuasiBundle importerQuasiBundle = installImporterBundle();
List<QuasiResolutionFailure> resolutionFailures = this.quasiFramework.resolve();
Assert.assertNotNull(resolutionFailures);
Assert.assertEquals(1, resolutionFailures.size());
QuasiResolutionFailure failure = resolutionFailures.get(0);
Assert.assertTrue(failure instanceof QuasiPackageResolutionFailure);
QuasiPackageResolutionFailure qprFailure = (QuasiPackageResolutionFailure) failure;
Assert.assertEquals(QUASI_TEST_PACKAGE, qprFailure.getPackage());
Assert.assertFalse(importerQuasiBundle.isResolved());
}
@Test
public void testPackageWiringExploration() throws Exception {
QuasiBundle importerQuasiBundle = installImporterBundle();
QuasiBundle exporterQuasiBundle = installExporterBundle();
List<QuasiResolutionFailure> resolutionFailures = this.quasiFramework.resolve();
Assert.assertNotNull(resolutionFailures);
Assert.assertEquals(0, resolutionFailures.size());
Assert.assertTrue(importerQuasiBundle.isResolved());
Assert.assertTrue(exporterQuasiBundle.isResolved());
checkGetBundles(importerQuasiBundle, exporterQuasiBundle);
checkDependents(importerQuasiBundle, exporterQuasiBundle);
QuasiImportPackage qip = checkImportPackages(importerQuasiBundle, exporterQuasiBundle);
QuasiExportPackage qep = checkExportPackages(importerQuasiBundle, exporterQuasiBundle);
checkConsumers(qep, qip);
checkProvider(qip, qep);
}
@Test
public void testRequiredBundleExploration() throws Exception {
QuasiBundle requiringQuasiBundle = installRequiringBundle();
QuasiBundle exporterQuasiBundle = installExporterBundle();
List<QuasiResolutionFailure> resolutionFailures = this.quasiFramework.resolve();
Assert.assertNotNull(resolutionFailures);
Assert.assertEquals(0, resolutionFailures.size());
Assert.assertTrue(requiringQuasiBundle.isResolved());
Assert.assertTrue(exporterQuasiBundle.isResolved());
checkGetBundles(requiringQuasiBundle, exporterQuasiBundle);
List<QuasiRequiredBundle> requiredBundles = requiringQuasiBundle.getRequiredBundles();
Assert.assertEquals(1, requiredBundles.size());
QuasiRequiredBundle quasiRequiredBundle = requiredBundles.get(0);
QuasiBundle provider = quasiRequiredBundle.getProvider();
Assert.assertEquals(exporterQuasiBundle, provider);
}
private void checkProvider(QuasiImportPackage qip, QuasiExportPackage qep) {
QuasiExportPackage provider = qip.getProvider();
Assert.assertEquals(qep, provider);
}
private void checkConsumers(QuasiExportPackage qep, QuasiImportPackage qip) {
List<QuasiImportPackage> consumers = qep.getConsumers();
Assert.assertEquals(1, consumers.size());
QuasiImportPackage consumer = consumers.get(0);
Assert.assertEquals(qip, consumer);
}
private QuasiImportPackage checkImportPackages(QuasiBundle importerQuasiBundle, QuasiBundle exporterQuasiBundle) {
List<QuasiImportPackage> exporterImportPackages = exporterQuasiBundle.getImportPackages();
Assert.assertEquals(0, exporterImportPackages.size());
List<QuasiImportPackage> importPackages = importerQuasiBundle.getImportPackages();
Assert.assertEquals(1, importPackages.size());
QuasiImportPackage qip = importPackages.get(0);
Assert.assertEquals("quasi.test", qip.getPackageName());
return qip;
}
private QuasiExportPackage checkExportPackages(QuasiBundle importerQuasiBundle, QuasiBundle exporterQuasiBundle) {
Assert.assertEquals(0, importerQuasiBundle.getExportPackages().size());
List<QuasiExportPackage> exportPackages = exporterQuasiBundle.getExportPackages();
Assert.assertEquals(1, exportPackages.size());
QuasiExportPackage qep = exportPackages.get(0);
Assert.assertEquals("quasi.test", qep.getPackageName());
return qep;
}
private void checkDependents(QuasiBundle importerQuasiBundle, QuasiBundle exporterQuasiBundle) {
List<QuasiBundle> dependents = exporterQuasiBundle.getDependents();
Assert.assertEquals(1, dependents.size());
Assert.assertEquals(importerQuasiBundle, dependents.get(0));
}
private void checkGetBundles(QuasiBundle importerQuasiBundle, QuasiBundle exporterQuasiBundle) {
List<QuasiBundle> quasiBundles = this.quasiFramework.getBundles();
boolean foundImporter = false;
boolean foundExporter = false;
for (QuasiBundle quasiBundle : quasiBundles) {
if (quasiBundle.equals(importerQuasiBundle)) {
foundImporter = true;
}
if (quasiBundle.equals(exporterQuasiBundle)) {
foundExporter = true;
}
}
Assert.assertTrue(foundImporter);
Assert.assertTrue(foundExporter);
}
@Test
public void testCommit() throws Exception {
QuasiBundle importerQuasiBundle = installImporterBundle();
QuasiBundle exporterQuasiBundle = installExporterBundle();
List<QuasiResolutionFailure> resolutionFailures = this.quasiFramework.resolve();
Assert.assertNotNull(resolutionFailures);
Assert.assertEquals(0, resolutionFailures.size());
this.quasiFramework.commit();
Assert.assertTrue(importerQuasiBundle.isResolved());
Bundle importerBundle = importerQuasiBundle.getBundle();
Assert.assertNotNull(importerBundle);
Assert.assertEquals(IMPORTER_BSN, importerBundle.getSymbolicName());
Assert.assertTrue(exporterQuasiBundle.isResolved());
Bundle exporterBundle = exporterQuasiBundle.getBundle();
Assert.assertNotNull(exporterBundle);
Assert.assertEquals(EXPORTER_BSN, exporterBundle.getSymbolicName());
// Tidy up since test methods may run in any order in Java 7
importerBundle.uninstall();
exporterBundle.uninstall();
}
private QuasiBundle installExporterBundle() throws BundleException, URISyntaxException {
QuasiBundle exporterQuasiBundle;
BundleManifest exporterBundleManifest = getBundleManifest(EXPORTER_BSN, BUNDLE_VERSION);
exporterBundleManifest.getExportPackage().addExportedPackage(QUASI_TEST_PACKAGE);
exporterQuasiBundle = this.quasiFramework.install(new URI(EXPORTER_JAR_PATH), exporterBundleManifest);
Assert.assertEquals(EXPORTER_BSN, exporterQuasiBundle.getSymbolicName());
Assert.assertEquals(BUNDLE_VERSION, exporterQuasiBundle.getVersion());
Assert.assertFalse(exporterQuasiBundle.isResolved());
Assert.assertNull(exporterQuasiBundle.getBundle());
return exporterQuasiBundle;
}
private QuasiBundle installImporterBundle() throws BundleException, URISyntaxException {
QuasiBundle importerQuasiBundle;
BundleManifest importerBundleManifest = getBundleManifest(IMPORTER_BSN, BUNDLE_VERSION);
importerBundleManifest.getImportPackage().addImportedPackage(QUASI_TEST_PACKAGE);
importerQuasiBundle = this.quasiFramework.install(new URI(IMPORTER_JAR_PATH), importerBundleManifest);
Assert.assertEquals(IMPORTER_BSN, importerQuasiBundle.getSymbolicName());
Assert.assertEquals(BUNDLE_VERSION, importerQuasiBundle.getVersion());
Assert.assertFalse(importerQuasiBundle.isResolved());
Assert.assertNull(importerQuasiBundle.getBundle());
return importerQuasiBundle;
}
private QuasiBundle installRequiringBundle() throws BundleException, URISyntaxException {
QuasiBundle requiringQuasiBundle;
BundleManifest requiringBundleManifest = getBundleManifest(REQUIRING_BSN, BUNDLE_VERSION);
RequireBundle requireBundle = requiringBundleManifest.getRequireBundle();
requireBundle.addRequiredBundle(EXPORTER_BSN);
requiringQuasiBundle = this.quasiFramework.install(new URI(IMPORTER_JAR_PATH), requiringBundleManifest);
Assert.assertEquals(REQUIRING_BSN, requiringQuasiBundle.getSymbolicName());
Assert.assertEquals(BUNDLE_VERSION, requiringQuasiBundle.getVersion());
Assert.assertFalse(requiringQuasiBundle.isResolved());
Assert.assertNull(requiringQuasiBundle.getBundle());
return requiringQuasiBundle;
}
private BundleManifest getBundleManifest(String symbolicName, Version bundleVersion) {
BundleManifest bundleManifest;
bundleManifest = BundleManifestFactory.createBundleManifest();
bundleManifest.setBundleManifestVersion(2);
bundleManifest.getBundleSymbolicName().setSymbolicName(symbolicName);
bundleManifest.setBundleVersion(bundleVersion);
return bundleManifest;
}
}