[ 
https://issues.apache.org/jira/browse/LOG4J2-230?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13646766#comment-13646766
 ] 

Nick Williams commented on LOG4J2-230:
--------------------------------------

You're quite welcome. Two points:

1) IIRC, Class.forName ONLY throws ClassNotFoundException. It NEVER throws 
anything else (well, technically, any method can throw ThreadDeathException, 
but one should never stop that from percolating). I should be double-checked, 
but I think it's safe to JUST catch CNFE, which would allow you to get rid of 
the local variable and throw the ISE from the try block.

2) One could argue that writing a unit test for this is more trouble than it's 
worth. I personally disagree with this, because I think the things that are 
hardest to test are sometimes the things than need it most, but to each his 
own. Here is how I would test it. First, I would write a normal unit test that 
just called the constructor (this tests the "success condition" and fails if 
the constructor throws an exception). Then I would write the "failure 
condition" test like so:

A) Use the compiler tools to compile a simple, empty class named 
org.slf4j.helpers.Log4JLoggerFactory. Write the resulting class file to 
%temp%/%unitTestName%/org/slf4j/helpers/Log4JLoggerFactory.class.

B) Instantiate a java.net.URLClassLoader, using the current Thread's context 
class loader as the parent loader and passing in a single-element URL array to 
the %temp%/%unitTestName%/ directory when calling the constructor.

C) Using reflection and the custom class loader, attempt to load and 
instantiate the SLF4JLoggerContextFactory. Catch an InvocationTargetException. 
If the exception is not thrown, fail("Invocation exception not thrown.") the 
test. If the exception is thrown, get its cause. The cause should be an 
IllegalStateException. If it is some other exception, fail("Wrong exception 
type ___ thrown.") the test. Check to make sure the message is the same (just 
in case). If it's not, fail("Exception message not correct.") the test.

D) In a finally block, delete the %temp%/%unitTestName% directory.
                
> Preempt StackOverflowEx when both slf4j-impl jar and log4j-to-slf4j jar are 
> on the classpath
> --------------------------------------------------------------------------------------------
>
>                 Key: LOG4J2-230
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-230
>             Project: Log4j 2
>          Issue Type: Improvement
>          Components: SLF4J Bridge
>    Affects Versions: 2.0-beta5
>            Reporter: Remko Popma
>
> This ticket is to prevent issues like LOG4J2-204.
> Aiming for something similar to what is documented here:
> http://www.slf4j.org/codes.html#jclDelegationLoop

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to