From 2953ed1dca7b041ed08deaeb796c972651d81e9b Mon Sep 17 00:00:00 2001 From: Henri Tremblay Date: Fri, 11 May 2018 11:23:09 +0100 Subject: [PATCH 1/2] Unwrap InvocationTargetException in isLogConfigurationMessage See gh-12958 --- .../boot/SpringBootExceptionHandler.java | 4 + .../boot/SpringBootExceptionHandlerTest.java | 81 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 spring-boot/src/test/java/org/springframework/boot/SpringBootExceptionHandlerTest.java diff --git a/spring-boot/src/main/java/org/springframework/boot/SpringBootExceptionHandler.java b/spring-boot/src/main/java/org/springframework/boot/SpringBootExceptionHandler.java index af7948b24c..bf9e6d9f03 100644 --- a/spring-boot/src/main/java/org/springframework/boot/SpringBootExceptionHandler.java +++ b/spring-boot/src/main/java/org/springframework/boot/SpringBootExceptionHandler.java @@ -86,6 +86,10 @@ class SpringBootExceptionHandler implements UncaughtExceptionHandler { * @return {@code true} if the exception contains a log configuration message */ private boolean isLogConfigurationMessage(Throwable ex) { + if (ex instanceof InvocationTargetException) { + return isLogConfigurationMessage(ex.getCause()); + } + String message = ex.getMessage(); if (message != null) { for (String candidate : LOG_CONFIGURATION_MESSAGES) { diff --git a/spring-boot/src/test/java/org/springframework/boot/SpringBootExceptionHandlerTest.java b/spring-boot/src/test/java/org/springframework/boot/SpringBootExceptionHandlerTest.java new file mode 100644 index 0000000000..ec1d28e77e --- /dev/null +++ b/spring-boot/src/test/java/org/springframework/boot/SpringBootExceptionHandlerTest.java @@ -0,0 +1,81 @@ +/* + * Copyright 2012-2018 the original author or authors. + * + * Licensed 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. + */ + +package org.springframework.boot; + +import java.lang.reflect.InvocationTargetException; + +import org.junit.Rule; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + + +import static org.mockito.ArgumentMatchers.same; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; + +/** + * Tests for {@link SpringBootExceptionHandler}. + * + * @author Henri Tremblay + */ +public class SpringBootExceptionHandlerTest { + + @Rule + public MockitoRule rule = MockitoJUnit.rule(); + + @Mock + private Thread.UncaughtExceptionHandler parent; + + @InjectMocks + private SpringBootExceptionHandler handler; + + @Test + public void uncaughtException_shouldNotForwardLoggedErrorToParent() { + Thread thread = Thread.currentThread(); + Exception ex = new Exception(); + this.handler.registerLoggedException(ex); + + this.handler.uncaughtException(thread, ex); + + verifyZeroInteractions(this.parent); + } + + @Test + public void uncaughtException_shouldForwardLogConfigurationErrorToParent() { + Thread thread = Thread.currentThread(); + Exception ex = new Exception("[stuff] Logback configuration error detected [stuff]"); + this.handler.registerLoggedException(ex); + + this.handler.uncaughtException(thread, ex); + + verify(this.parent).uncaughtException(same(thread), same(ex)); + } + + @Test + public void uncaughtException_shouldForwardLogConfigurationErrorToParentEvenWhenWrapped() { + Thread thread = Thread.currentThread(); + Exception ex = new InvocationTargetException(new Exception("[stuff] Logback configuration error detected [stuff]", new Exception())); + this.handler.registerLoggedException(ex); + + this.handler.uncaughtException(thread, ex); + + verify(this.parent).uncaughtException(same(thread), same(ex)); + } +} From 678e12572093f5a0e04a4cc626eb4ab8980c3191 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 11 May 2018 11:48:03 +0100 Subject: [PATCH 2/2] Polish "Unwrap InvocationTargetException in isLogConfigurationMessage" Closes gh-12958 --- .../boot/SpringBootExceptionHandler.java | 3 +- ...a => SpringBootExceptionHandlerTests.java} | 42 +++++++------------ 2 files changed, 17 insertions(+), 28 deletions(-) rename spring-boot/src/test/java/org/springframework/boot/{SpringBootExceptionHandlerTest.java => SpringBootExceptionHandlerTests.java} (63%) diff --git a/spring-boot/src/main/java/org/springframework/boot/SpringBootExceptionHandler.java b/spring-boot/src/main/java/org/springframework/boot/SpringBootExceptionHandler.java index bf9e6d9f03..9101e34ed0 100644 --- a/spring-boot/src/main/java/org/springframework/boot/SpringBootExceptionHandler.java +++ b/spring-boot/src/main/java/org/springframework/boot/SpringBootExceptionHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 the original author or authors. + * Copyright 2012-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -89,7 +89,6 @@ class SpringBootExceptionHandler implements UncaughtExceptionHandler { if (ex instanceof InvocationTargetException) { return isLogConfigurationMessage(ex.getCause()); } - String message = ex.getMessage(); if (message != null) { for (String candidate : LOG_CONFIGURATION_MESSAGES) { diff --git a/spring-boot/src/test/java/org/springframework/boot/SpringBootExceptionHandlerTest.java b/spring-boot/src/test/java/org/springframework/boot/SpringBootExceptionHandlerTests.java similarity index 63% rename from spring-boot/src/test/java/org/springframework/boot/SpringBootExceptionHandlerTest.java rename to spring-boot/src/test/java/org/springframework/boot/SpringBootExceptionHandlerTests.java index ec1d28e77e..33eeaf568d 100644 --- a/spring-boot/src/test/java/org/springframework/boot/SpringBootExceptionHandlerTest.java +++ b/spring-boot/src/test/java/org/springframework/boot/SpringBootExceptionHandlerTests.java @@ -16,17 +16,13 @@ package org.springframework.boot; +import java.lang.Thread.UncaughtExceptionHandler; import java.lang.reflect.InvocationTargetException; -import org.junit.Rule; import org.junit.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - -import static org.mockito.ArgumentMatchers.same; +import static org.mockito.Matchers.same; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; @@ -34,48 +30,42 @@ import static org.mockito.Mockito.verifyZeroInteractions; * Tests for {@link SpringBootExceptionHandler}. * * @author Henri Tremblay + * @author Andy Wilkinson */ -public class SpringBootExceptionHandlerTest { +public class SpringBootExceptionHandlerTests { - @Rule - public MockitoRule rule = MockitoJUnit.rule(); + private final UncaughtExceptionHandler parent = mock(UncaughtExceptionHandler.class); - @Mock - private Thread.UncaughtExceptionHandler parent; - - @InjectMocks - private SpringBootExceptionHandler handler; + private final SpringBootExceptionHandler handler = new SpringBootExceptionHandler( + this.parent); @Test - public void uncaughtException_shouldNotForwardLoggedErrorToParent() { + public void uncaughtExceptionDoesNotForwardLoggedErrorToParent() { Thread thread = Thread.currentThread(); Exception ex = new Exception(); this.handler.registerLoggedException(ex); - this.handler.uncaughtException(thread, ex); - verifyZeroInteractions(this.parent); } @Test - public void uncaughtException_shouldForwardLogConfigurationErrorToParent() { + public void uncaughtExceptionForwardsLogConfigurationErrorToParent() { Thread thread = Thread.currentThread(); - Exception ex = new Exception("[stuff] Logback configuration error detected [stuff]"); + Exception ex = new Exception( + "[stuff] Logback configuration error detected [stuff]"); this.handler.registerLoggedException(ex); - this.handler.uncaughtException(thread, ex); - verify(this.parent).uncaughtException(same(thread), same(ex)); } @Test - public void uncaughtException_shouldForwardLogConfigurationErrorToParentEvenWhenWrapped() { + public void uncaughtExceptionForwardsWrappedLogConfigurationErrorToParent() { Thread thread = Thread.currentThread(); - Exception ex = new InvocationTargetException(new Exception("[stuff] Logback configuration error detected [stuff]", new Exception())); + Exception ex = new InvocationTargetException(new Exception( + "[stuff] Logback configuration error detected [stuff]", new Exception())); this.handler.registerLoggedException(ex); - this.handler.uncaughtException(thread, ex); - verify(this.parent).uncaughtException(same(thread), same(ex)); } + }