blob: 01027ec2b04544dda5af88bbb560410b95957f55 [file] [log] [blame]
/**
* Copyright (C) 2009 Google Inc.
*
* 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 com.googlecode.guice;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.Properties;
import javax.imageio.spi.ServiceRegistry;
import junit.framework.TestCase;
import org.osgi.framework.BundleContext;
import org.osgi.framework.launch.Framework;
import org.osgi.framework.launch.FrameworkFactory;
import aQute.bnd.main.bnd;
import com.googlecode.guice.bundle.OSGiTestActivator;
/**
* Run various tests inside one or more OSGi containers.
*
* @author mcculls@gmail.com (Stuart McCulloch)
*/
public class OSGiContainerTest
extends TestCase {
// build properties passed from Ant
static final String VERSION = System.getProperty("version", "snapshot");
static final String BUILD_DIR = System.getProperty("build.dir", "build");
static final String BUILD_DIST_DIR = BUILD_DIR + "/dist";
static final String BUILD_TEST_DIR = BUILD_DIR + "/test";
static final String GUICE_JAR = BUILD_DIST_DIR + "/guice-" + VERSION + ".jar";
static final String AOPALLIANCE_JAR = System.getProperty("aopalliance.jar", "lib/aopalliance.jar");
static final String JAVAX_INJECT_JAR = System.getProperty("javax.inject.jar", "lib/javax.inject.jar");
// dynamically build test bundles
@Override protected void setUp()
throws Exception {
// verify properties
assertTrue(failMsg(), new File(BUILD_DIR).isDirectory());
assertTrue(failMsg(), new File(GUICE_JAR).isFile());
assertTrue(failMsg(), new File(AOPALLIANCE_JAR).isFile());
assertTrue(failMsg(), new File(JAVAX_INJECT_JAR).isFile());
Properties instructions = new Properties();
// aopalliance is an API bundle --> export the full API
instructions.setProperty("Export-Package", "org.aopalliance.*");
buildBundle("aopalliance", instructions, AOPALLIANCE_JAR);
instructions.clear();
// javax.inject is an API bundle --> export the full API
instructions.setProperty("Export-Package", "javax.inject.*");
buildBundle("javax.inject", instructions, JAVAX_INJECT_JAR);
instructions.clear();
// strict imports to make sure test bundle only has access to these packages
instructions.setProperty("Import-Package", "org.osgi.framework,org.aopalliance.intercept,"
+ "com.google.inject(|.binder|.matcher|.name)");
// test bundle should only contain the local test classes, nothing else
instructions.setProperty("Bundle-Activator", OSGiTestActivator.class.getName());
instructions.setProperty("Private-Package", OSGiTestActivator.class.getPackage().getName());
buildBundle("osgitests", instructions, BUILD_TEST_DIR);
instructions.clear();
}
// build an OSGi bundle at runtime
private static void buildBundle(String name, Properties instructions, String classpath)
throws IOException {
// write BND instructions to temporary test directory
String bndFileName = BUILD_TEST_DIR + '/' + name + ".bnd";
OutputStream os = new BufferedOutputStream(new FileOutputStream(bndFileName));
instructions.store(os, "BND instructions");
os.close();
// assemble bundle, use -failok switch to avoid early exit
bnd.main(new String[]{"-failok", "build", "-classpath", classpath, bndFileName});
}
private String failMsg() {
return "This test may fail if it is not run from ant, or if it is not run after ant has "
+ "compiled & built jars. This is because the test is validating that the Guice jar "
+ "is properly setup to load in an OSGi container";
}
//This test may fail if it is not run from ant, or if it is not run after ant has
//compiled & built jars. This is because the test is validating that the Guice jar
//is properly setup to load in an OSGi container
public void testGuiceWorksInOSGiContainer()
throws Throwable {
// ask framework to clear cache on startup
Properties properties = new Properties();
properties.setProperty("org.osgi.framework.storage", BUILD_TEST_DIR + "/bundle.cache");
properties.setProperty("org.osgi.framework.storage.clean", "onFirstInit");
// test each available OSGi framework in turn
Iterator<FrameworkFactory> f = ServiceRegistry.lookupProviders(FrameworkFactory.class);
while (f.hasNext()) {
Framework framework = f.next().newFramework(properties);
framework.start();
BundleContext systemContext = framework.getBundleContext();
// load all the necessary bundles and start the OSGi test bundle
systemContext.installBundle("reference:file:" + BUILD_TEST_DIR + "/aopalliance.jar");
systemContext.installBundle("reference:file:" + BUILD_TEST_DIR + "/javax.inject.jar");
systemContext.installBundle("reference:file:" + GUICE_JAR);
systemContext.installBundle("reference:file:" + BUILD_TEST_DIR + "/osgitests.jar").start();
framework.stop();
}
}
}