Author: krosenvold Date: Sat Nov 26 21:21:34 2011 New Revision: 1206595 URL: http://svn.apache.org/viewvc?rev=1206595&view=rev Log: [SUREFIRE-801] Classloader regression on forkMode=NONE
Thread.currentThread().getContextClassLoder() was wrong. Fixed with IT Added: maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Surefire801ForkModeNoneClassLoaderIT.java (with props) Modified: maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java Modified: maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java?rev=1206595&r1=1206594&r2=1206595&view=diff ============================================================================== --- maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java (original) +++ maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java Sat Nov 26 21:21:34 2011 @@ -22,6 +22,7 @@ package org.apache.maven.surefire.booter import java.io.PrintStream; import java.lang.reflect.Method; import java.util.Iterator; + import org.apache.maven.surefire.providerapi.SurefireProvider; import org.apache.maven.surefire.report.ReporterException; import org.apache.maven.surefire.suite.RunResult; @@ -122,7 +123,7 @@ public class ProviderFactory Object provider = surefireReflector.instantiateProvider( starterConfiguration.getProviderClassName(), o ); Thread.currentThread().setContextClassLoader( context ); - return new ProviderProxy( provider ); + return new ProviderProxy( provider, testsClassLoader ); } @@ -131,26 +132,53 @@ public class ProviderFactory { private final Object providerInOtherClassLoader; + private final ClassLoader testsClassLoader; + - private ProviderProxy( Object providerInOtherClassLoader ) + private ProviderProxy( Object providerInOtherClassLoader, ClassLoader testsClassLoader ) { this.providerInOtherClassLoader = providerInOtherClassLoader; + this.testsClassLoader = testsClassLoader; } public Iterator getSuites() { - return (Iterator) ReflectionUtils.invokeGetter( providerInOtherClassLoader, "getSuites" ); + ClassLoader current = swapClassLoader( testsClassLoader ); + try + { + return (Iterator) ReflectionUtils.invokeGetter( providerInOtherClassLoader, "getSuites" ); + } + finally + { + Thread.currentThread().setContextClassLoader( current ); + } } public RunResult invoke( Object forkTestSet ) throws TestSetFailedException, ReporterException { - final Method invoke = - ReflectionUtils.getMethod( providerInOtherClassLoader.getClass(), "invoke", invokeParamaters ); + ClassLoader current = swapClassLoader( testsClassLoader ); + try + { + final Method invoke = + ReflectionUtils.getMethod( providerInOtherClassLoader.getClass(), "invoke", invokeParamaters ); - final Object result = ReflectionUtils.invokeMethodWithArray( providerInOtherClassLoader, invoke, - new Object[]{ forkTestSet } ); - return (RunResult) surefireReflector.convertIfRunResult( result ); + final Object result = ReflectionUtils.invokeMethodWithArray( providerInOtherClassLoader, invoke, + new Object[]{ forkTestSet } ); + return (RunResult) surefireReflector.convertIfRunResult( result ); + } + finally + { + Thread.currentThread().setContextClassLoader( current ); + } + + } + + private ClassLoader swapClassLoader( ClassLoader newClassLoader ) + { + ClassLoader current = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader( newClassLoader ); + return current; } public void cancel() Added: maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Surefire801ForkModeNoneClassLoaderIT.java URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Surefire801ForkModeNoneClassLoaderIT.java?rev=1206595&view=auto ============================================================================== --- maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Surefire801ForkModeNoneClassLoaderIT.java (added) +++ maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Surefire801ForkModeNoneClassLoaderIT.java Sat Nov 26 21:21:34 2011 @@ -0,0 +1,43 @@ +package org.apache.maven.surefire.its; +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +import org.apache.maven.it.VerificationException; + +/** + * Test + * + * @author Kristian Rosenvold + */ +public class Surefire801ForkModeNoneClassLoaderIT + extends SurefireVerifierTestClass +{ + + public Surefire801ForkModeNoneClassLoaderIT() + { + super( "/fork-mode-resource-loading" ); + } + + public void testSHouldBeOkWithForkNever() + throws Exception + { + forkNever(); + executeTest(); + } +} Propchange: maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Surefire801ForkModeNoneClassLoaderIT.java ------------------------------------------------------------------------------ svn:eol-style = native