blob: e61b417c142fcbde8f4179f1f997a157bf3d841c [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2006, 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
* and Apache License v2.0 which accompanies this distribution.
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0
* is available at http://www.opensource.org/licenses/apache2.0.php.
* You may elect to redistribute this code under either of these licenses.
*
* Contributors:
* VMware Inc.
*****************************************************************************/
package org.eclipse.gemini.blueprint.test.internal.support;
import junit.framework.Protectable;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestResult;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.gemini.blueprint.test.internal.OsgiJUnitTest;
import org.eclipse.gemini.blueprint.test.internal.TestRunnerService;
import org.eclipse.gemini.blueprint.test.internal.holder.HolderLoader;
import org.eclipse.gemini.blueprint.test.internal.holder.OsgiTestInfoHolder;
import org.eclipse.gemini.blueprint.test.internal.util.TestUtils;
/**
* OSGi service for executing JUnit tests.
*
* @author Costin Leau
*/
public class OsgiJUnitService implements TestRunnerService {
private static final Log log = LogFactory.getLog(OsgiJUnitService.class);
public void runTest(OsgiJUnitTest test) {
try {
executeTest(test);
} catch (Exception ex) {
if (ex instanceof RuntimeException) {
throw (RuntimeException) ex;
}
throw new RuntimeException("cannot execute test:" + ex, ex);
}
}
/**
* Execute the JUnit test and publish results to the outside-OSGi world.
*
* @param test
* @throws Exception
*/
protected void executeTest(OsgiJUnitTest test) throws Exception {
// create holder
// since we're inside OSGi, we have to use the special loading procedure
OsgiTestInfoHolder holder = HolderLoader.INSTANCE.getHolder();
// read the test to be executed
String testName = holder.getTestMethodName();
if (log.isDebugEnabled()) {
log.debug("Reading test [" + testName + "] for execution inside OSGi");
}
// execute the test
TestResult result = runTest(test, testName);
if (log.isDebugEnabled()) {
log.debug("Sending test results from OSGi");
}
// write result back to the outside world
TestUtils.unpackProblems(result, holder);
}
/**
* Run fixture setup, test from the given test case and fixture teardown.
*
* @param osgiTestExtensions
* @param testName
*/
protected TestResult runTest(final OsgiJUnitTest osgiTestExtensions, String testName) {
if (log.isDebugEnabled()) {
log.debug("Running test [" + testName + "] on testCase " + osgiTestExtensions);
}
final TestResult result = new TestResult();
TestCase rawTest = osgiTestExtensions.getTestCase();
rawTest.setName(testName);
try {
osgiTestExtensions.osgiSetUp();
try {
// use TestResult method to bypass the setUp/tearDown methods
result.runProtected(rawTest, new Protectable() {
public void protect() throws Throwable {
osgiTestExtensions.osgiRunTest();
}
});
} finally {
osgiTestExtensions.osgiTearDown();
}
}
// exceptions thrown by osgiSetUp/osgiTearDown
catch (Exception ex) {
log.error("test exception threw exception ", ex);
result.addError(rawTest, ex);
}
return result;
}
}