/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.jpa.test.cdi;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.persistence.EntityManagerFactory;
import org.hibernate.testing.junit4.BaseUnitTestCase;
import org.hibernate.testing.junit4.ClassLoadingIsolater;
import org.junit.Rule;
import org.junit.Test;
import static org.junit.Assert.fail;
/**
* Test JPA bootstrapping when CDI is not available for classloading.
*
* @author Steve Ebersole
*/
public class NoCdiAvailableTest extends BaseUnitTestCase {
public static final String[] EXCLUDED_PACKAGES = new String[] {
"javax.enterprise.inject.",
"javax.enterprise.context."
};
private static class CdiClassLoadException extends RuntimeException {
private CdiClassLoadException(String message) {
super( message );
}
}
@Rule public ClassLoadingIsolater isolater = new ClassLoadingIsolater(
new ClassLoadingIsolater.IsolatedClassLoaderProvider() {
@Override
public ClassLoader buildIsolatedClassLoader() {
return new ClassLoader( NoCdiAvailableTest.class.getClassLoader() ) {
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
for ( String excludedPackage : EXCLUDED_PACKAGES ) {
if ( name.startsWith( excludedPackage ) ) {
throw new CdiClassLoadException( "CDI classes [" + name + "] excluded from load" );
}
}
return super.loadClass( name );
}
};
}
@Override
public void releaseIsolatedClassLoader(ClassLoader isolatedClassLoader) {
// nothing to do
}
}
);
@Test
public void testJpaBootstrapWithoutCdiAvailable() throws Exception {
Class delegateClass = Thread.currentThread().getContextClassLoader().loadClass(
"org.hibernate.jpa.test.cdi.NoCdiAvailableTestDelegate"
);
Method mainMethod = delegateClass.getMethod( "passingNoBeanManager" );
EntityManagerFactory entityManagerFactory = null;
try {
entityManagerFactory = (EntityManagerFactory) mainMethod.invoke( null );
}
finally {
if (entityManagerFactory != null ) {
entityManagerFactory.close();
}
}
}
@Test
public void testJpaBootstrapWithoutCdiAvailablePassingCdi() throws Throwable {
Class delegateClass = Thread.currentThread().getContextClassLoader().loadClass(
"org.hibernate.jpa.test.cdi.NoCdiAvailableTestDelegate"
);
Method mainMethod = delegateClass.getMethod( "passingBeanManager" );
try {
mainMethod.invoke( null );
fail( "Expecting failure from missing CDI classes" );
}
catch (InvocationTargetException expected) {
// hard to assert specific exception types due to classloader trickery
}
}
}