Bug 477062: tweak logging tests to run on Java9+Jigsaw
diff --git a/org.eclipse.sisu.inject.tests/src/org/eclipse/sisu/inject/LogsTest.java b/org.eclipse.sisu.inject.tests/src/org/eclipse/sisu/inject/LogsTest.java
index 4a487a4..894ddc3 100644
--- a/org.eclipse.sisu.inject.tests/src/org/eclipse/sisu/inject/LogsTest.java
+++ b/org.eclipse.sisu.inject.tests/src/org/eclipse/sisu/inject/LogsTest.java
@@ -10,7 +10,12 @@
*******************************************************************************/
package org.eclipse.sisu.inject;
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.List;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -22,6 +27,10 @@
public class LogsTest
extends TestCase
{
+ public static final ClassLoader WITH_SLF4J = isolatedClassLoader( false );
+
+ public static final ClassLoader WITHOUT_SLF4J = isolatedClassLoader( true );
+
public void testLogging()
{
new LoggingExample();
@@ -34,25 +43,11 @@
{
( (ch.qos.logback.classic.Logger) LoggerFactory.getLogger( Logs.class ) ).setLevel( ch.qos.logback.classic.Level.WARN );
- final ClassLoader productionLoader =
- new URLClassLoader( ( (URLClassLoader) getClass().getClassLoader() ).getURLs(), null )
- {
- @Override
- protected synchronized Class<?> loadClass( final String name, final boolean resolve )
- throws ClassNotFoundException
- {
- if ( name.startsWith( "ch" ) || name.contains( "cobertura" ) )
- {
- return LogsTest.class.getClassLoader().loadClass( name );
- }
- return super.loadClass( name, resolve );
- }
- };
-
- productionLoader.loadClass( LoggingExample.class.getName() ).newInstance();
+ WITH_SLF4J.loadClass( LoggingExample.class.getName() ).newInstance();
}
finally
{
+ // no-op
}
}
@@ -72,26 +67,7 @@
{
rootLogger.setLevel( Level.FINE );
- final ClassLoader noSLF4JLoader =
- new URLClassLoader( ( (URLClassLoader) getClass().getClassLoader() ).getURLs(), null )
- {
- @Override
- protected synchronized Class<?> loadClass( final String name, final boolean resolve )
- throws ClassNotFoundException
- {
- if ( name.contains( "slf4j" ) )
- {
- throw new ClassNotFoundException( name );
- }
- if ( name.contains( "cobertura" ) )
- {
- return LogsTest.class.getClassLoader().loadClass( name );
- }
- return super.loadClass( name, resolve );
- }
- };
-
- noSLF4JLoader.loadClass( LoggingExample.class.getName() ).newInstance();
+ WITHOUT_SLF4J.loadClass( LoggingExample.class.getName() ).newInstance();
}
finally
{
@@ -105,26 +81,54 @@
System.setProperty( "org.eclipse.sisu.log", "console" );
try
{
- final ClassLoader consoleLoader =
- new URLClassLoader( ( (URLClassLoader) getClass().getClassLoader() ).getURLs(), null )
- {
- @Override
- protected synchronized Class<?> loadClass( final String name, final boolean resolve )
- throws ClassNotFoundException
- {
- if ( name.contains( "cobertura" ) )
- {
- return LogsTest.class.getClassLoader().loadClass( name );
- }
- return super.loadClass( name, resolve );
- }
- };
-
- consoleLoader.loadClass( LoggingExample.class.getName() ).newInstance();
+ WITH_SLF4J.loadClass( LoggingExample.class.getName() ).newInstance();
}
finally
{
System.clearProperty( "org.eclipse.sisu.log" );
}
}
+
+ private static ClassLoader isolatedClassLoader( final boolean hideSLF4j )
+ {
+ return new URLClassLoader( systemClassPath(), null )
+ {
+ @Override
+ protected synchronized Class<?> loadClass( final String name, final boolean resolve )
+ throws ClassNotFoundException
+ {
+ if ( hideSLF4j && name.contains( "slf4j" ) )
+ {
+ throw new ClassNotFoundException( name );
+ }
+ if ( !hideSLF4j && name.startsWith( "ch" ) || name.contains( "cobertura" ) )
+ {
+ return LogsTest.class.getClassLoader().loadClass( name );
+ }
+ return super.loadClass( name, resolve );
+ }
+ };
+ }
+
+ private static URL[] systemClassPath()
+ {
+ final ClassLoader testClassLoader = LogsTest.class.getClassLoader();
+ if ( testClassLoader instanceof URLClassLoader )
+ {
+ return ( (URLClassLoader) testClassLoader ).getURLs();
+ }
+ final List<URL> urls = new ArrayList<URL>();
+ for ( final String path : System.getProperty( "java.class.path", "." ).split( File.pathSeparator ) )
+ {
+ try
+ {
+ urls.add( new File( path ).getAbsoluteFile().toURI().toURL() );
+ }
+ catch ( final MalformedURLException e )
+ {
+ // skip bad classpath entry
+ }
+ }
+ return urls.toArray( new URL[urls.size()] );
+ }
}
diff --git a/org.eclipse.sisu.inject.tests/src/org/eclipse/sisu/space/QualifiedScanningTest.java b/org.eclipse.sisu.inject.tests/src/org/eclipse/sisu/space/QualifiedScanningTest.java
index f1f36f3..037add5 100644
--- a/org.eclipse.sisu.inject.tests/src/org/eclipse/sisu/space/QualifiedScanningTest.java
+++ b/org.eclipse.sisu.inject.tests/src/org/eclipse/sisu/space/QualifiedScanningTest.java
@@ -15,7 +15,6 @@
import java.lang.annotation.RetentionPolicy;
import java.net.MalformedURLException;
import java.net.URL;
-import java.net.URLClassLoader;
import java.net.URLStreamHandler;
import java.net.URLStreamHandlerFactory;
import java.util.ArrayList;
@@ -34,6 +33,7 @@
import junit.framework.TestCase;
import org.eclipse.sisu.inject.DeferredClass;
+import org.eclipse.sisu.inject.LogsTest;
import org.eclipse.sisu.space.oops.Handler;
import org.junit.Ignore;
@@ -315,26 +315,7 @@
Logger.getLogger( "" ).setLevel( Level.SEVERE );
// check everything still works without any SLF4J jars
- final ClassLoader noLoggingLoader =
- new URLClassLoader( ( (URLClassLoader) getClass().getClassLoader() ).getURLs(), null )
- {
- @Override
- protected synchronized Class<?> loadClass( final String name, final boolean resolve )
- throws ClassNotFoundException
- {
- if ( name.contains( "slf4j" ) )
- {
- throw new ClassNotFoundException( name );
- }
- if ( name.contains( "cobertura" ) )
- {
- return QualifiedScanningTest.class.getClassLoader().loadClass( name );
- }
- return super.loadClass( name, resolve );
- }
- };
-
- noLoggingLoader.loadClass( BrokenScanningExample.class.getName() ).newInstance();
+ LogsTest.WITHOUT_SLF4J.loadClass( BrokenScanningExample.class.getName() ).newInstance();
}
finally
{