Fix test broken on some machines

This commit is contained in:
Vlad Mihalcea 2016-11-28 16:47:49 +02:00
parent 8f3d58601d
commit 26c0b5b5cb
1 changed files with 134 additions and 94 deletions

View File

@ -7,108 +7,148 @@
package org.hibernate.boot.registry.classloading.internal;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* @author Cédric Tabin
*/
public class ClassLoaderServiceImplTest {
@Test
public void testNullTCCL() {
Thread.currentThread().setContextClassLoader(null);
@Test
public void testNullTCCL() {
Thread.currentThread().setContextClassLoader( null );
ClassLoaderServiceImpl csi1 = new ClassLoaderServiceImpl(null,TcclLookupPrecedence.BEFORE);
Class<ClassLoaderServiceImplTest> clazz1 = csi1.classForName(ClassLoaderServiceImplTest.class.getName());
assertEquals(ClassLoaderServiceImplTest.class, clazz1);
csi1.stop();
ClassLoaderServiceImpl csi1 = new ClassLoaderServiceImpl( null,
TcclLookupPrecedence.BEFORE );
Class<ClassLoaderServiceImplTest> clazz1 = csi1.classForName(
ClassLoaderServiceImplTest.class.getName() );
assertEquals( ClassLoaderServiceImplTest.class, clazz1 );
csi1.stop();
ClassLoaderServiceImpl csi2 = new ClassLoaderServiceImpl(null,TcclLookupPrecedence.AFTER);
Class<ClassLoaderServiceImplTest> clazz2 = csi2.classForName(ClassLoaderServiceImplTest.class.getName());
assertEquals(ClassLoaderServiceImplTest.class, clazz2);
csi2.stop();
ClassLoaderServiceImpl csi2 = new ClassLoaderServiceImpl( null,
TcclLookupPrecedence.AFTER );
Class<ClassLoaderServiceImplTest> clazz2 = csi2.classForName(
ClassLoaderServiceImplTest.class.getName() );
assertEquals( ClassLoaderServiceImplTest.class, clazz2 );
csi2.stop();
ClassLoaderServiceImpl csi3 = new ClassLoaderServiceImpl(null,TcclLookupPrecedence.NEVER);
Class<ClassLoaderServiceImplTest> clazz3 = csi3.classForName(ClassLoaderServiceImplTest.class.getName());
assertEquals(ClassLoaderServiceImplTest.class, clazz3);
csi3.stop();
}
@Test
public void testLookupBefore() {
InternalClassLoader icl = new InternalClassLoader();
Thread.currentThread().setContextClassLoader(icl);
ClassLoaderServiceImpl csi = new ClassLoaderServiceImpl(null,TcclLookupPrecedence.BEFORE);
Class<ClassLoaderServiceImplTest> clazz = csi.classForName(ClassLoaderServiceImplTest.class.getName());
assertEquals(ClassLoaderServiceImplTest.class, clazz);
assertEquals(1, icl.accessCount);
csi.stop();
}
@Test
public void testLookupAfterAvoided() {
InternalClassLoader icl = new InternalClassLoader();
Thread.currentThread().setContextClassLoader(icl);
ClassLoaderServiceImpl csi = new ClassLoaderServiceImpl(null,TcclLookupPrecedence.AFTER);
Class<ClassLoaderServiceImplTest> clazz = csi.classForName(ClassLoaderServiceImplTest.class.getName());
assertEquals(ClassLoaderServiceImplTest.class, clazz);
assertEquals(0, icl.accessCount);
csi.stop();
}
@Test
public void testLookupAfter() {
InternalClassLoader icl = new InternalClassLoader();
Thread.currentThread().setContextClassLoader(icl);
ClassLoaderServiceImpl csi = new ClassLoaderServiceImpl(null,TcclLookupPrecedence.AFTER);
try { csi.classForName("test.class.name"); assertTrue(false); }
catch (Exception e) {}
assertEquals(1, icl.accessCount);
csi.stop();
}
@Test
public void testLookupAfterNotFound() {
InternalClassLoader icl = new InternalClassLoader();
Thread.currentThread().setContextClassLoader(icl);
ClassLoaderServiceImpl csi = new ClassLoaderServiceImpl(null,TcclLookupPrecedence.BEFORE);
try { csi.classForName("test.class.not.found"); assertTrue(false); }
catch (Exception e) { }
assertEquals(1, icl.accessCount);
csi.stop();
}
@Test
public void testLookupNever() {
InternalClassLoader icl = new InternalClassLoader();
Thread.currentThread().setContextClassLoader(icl);
ClassLoaderServiceImpl csi = new ClassLoaderServiceImpl(null,TcclLookupPrecedence.NEVER);
try { csi.classForName("test.class.name"); assertTrue(false); }
catch (Exception e) { }
assertEquals(0, icl.accessCount);
csi.stop();
}
private static class InternalClassLoader extends ClassLoader {
private int accessCount = 0;
public InternalClassLoader() { super(null); }
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
++accessCount;
return super.loadClass(name);
ClassLoaderServiceImpl csi3 = new ClassLoaderServiceImpl( null,
TcclLookupPrecedence.NEVER );
Class<ClassLoaderServiceImplTest> clazz3 = csi3.classForName(
ClassLoaderServiceImplTest.class.getName() );
assertEquals( ClassLoaderServiceImplTest.class, clazz3 );
csi3.stop();
}
@Override
protected URL findResource(String name) {
++accessCount;
return super.findResource(name);
@Test
public void testLookupBefore() {
InternalClassLoader icl = new InternalClassLoader();
Thread.currentThread().setContextClassLoader( icl );
ClassLoaderServiceImpl csi = new ClassLoaderServiceImpl( null,
TcclLookupPrecedence.BEFORE );
Class<ClassLoaderServiceImplTest> clazz = csi.classForName(
ClassLoaderServiceImplTest.class.getName() );
assertEquals( ClassLoaderServiceImplTest.class, clazz );
assertEquals( 1, icl.getAccessCount() );
csi.stop();
}
@Test
public void testLookupAfterAvoided() {
InternalClassLoader icl = new InternalClassLoader();
Thread.currentThread().setContextClassLoader( icl );
ClassLoaderServiceImpl csi = new ClassLoaderServiceImpl( null,
TcclLookupPrecedence.AFTER );
Class<ClassLoaderServiceImplTest> clazz = csi.classForName(
ClassLoaderServiceImplTest.class.getName() );
assertEquals( ClassLoaderServiceImplTest.class, clazz );
assertEquals( 0, icl.getAccessCount() );
csi.stop();
}
@Test
public void testLookupAfter() {
InternalClassLoader icl = new InternalClassLoader();
Thread.currentThread().setContextClassLoader( icl );
ClassLoaderServiceImpl csi = new ClassLoaderServiceImpl( null,
TcclLookupPrecedence.AFTER );
try {
csi.classForName( "test.class.name" );
assertTrue( false );
}
catch ( Exception e ) {
}
assertEquals( 0, icl.getAccessCount() );
csi.stop();
}
@Test
public void testLookupAfterNotFound() {
InternalClassLoader icl = new InternalClassLoader();
Thread.currentThread().setContextClassLoader( icl );
ClassLoaderServiceImpl csi = new ClassLoaderServiceImpl( null,
TcclLookupPrecedence.BEFORE );
try {
csi.classForName( "test.class.not.found" );
assertTrue( false );
}
catch ( Exception e ) {
}
assertEquals( 0, icl.getAccessCount() );
csi.stop();
}
@Test
public void testLookupNever() {
InternalClassLoader icl = new InternalClassLoader();
Thread.currentThread().setContextClassLoader( icl );
ClassLoaderServiceImpl csi = new ClassLoaderServiceImpl( null,
TcclLookupPrecedence.NEVER );
try {
csi.classForName( "test.class.name" );
assertTrue( false );
}
catch ( Exception e ) {
}
assertEquals( 0, icl.getAccessCount() );
csi.stop();
}
private static class InternalClassLoader extends ClassLoader {
private List<String> names = new ArrayList<>( );
public InternalClassLoader() {
super( null );
}
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
if ( name.startsWith( "org.hibernate" ) ) {
names.add( name );
}
return super.loadClass( name );
}
@Override
protected URL findResource(String name) {
if ( name.startsWith( "org.hibernate" ) ) {
names.add( name );
}
return super.findResource( name );
}
public int getAccessCount() {
return names.size();
}
}
}
}