@ -16,14 +16,19 @@
@@ -16,14 +16,19 @@
package org.springframework.boot.logging.logback ;
import java.io.Console ;
import java.io.IOException ;
import java.nio.charset.StandardCharsets ;
import ch.qos.logback.classic.LoggerContext ;
import org.junit.jupiter.api.Test ;
import org.springframework.util.StreamUtils ;
import static org.assertj.core.api.Assertions.assertThat ;
import static org.mockito.BDDMockito.given ;
import static org.mockito.Mockito.mock ;
import static org.mockito.Mockito.spy ;
/ * *
* Tests for { @link DefaultLogbackConfiguration }
@ -32,6 +37,10 @@ import static org.assertj.core.api.Assertions.assertThat;
@@ -32,6 +37,10 @@ import static org.assertj.core.api.Assertions.assertThat;
* /
class DefaultLogbackConfigurationTests {
private final LoggerContext loggerContext = new LoggerContext ( ) ;
private final LogbackConfigurator logbackConfigurator = new LogbackConfigurator ( this . loggerContext ) ;
@Test
void defaultLogbackXmlContainsConsoleLogPattern ( ) throws Exception {
assertThatDefaultXmlContains ( "CONSOLE_LOG_PATTERN" , DefaultLogbackConfiguration . CONSOLE_LOG_PATTERN ) ;
@ -42,6 +51,48 @@ class DefaultLogbackConfigurationTests {
@@ -42,6 +51,48 @@ class DefaultLogbackConfigurationTests {
assertThatDefaultXmlContains ( "FILE_LOG_PATTERN" , DefaultLogbackConfiguration . FILE_LOG_PATTERN ) ;
}
@Test
void consoleLogCharsetShouldUseConsoleCharsetIfConsoleAvailable ( ) {
DefaultLogbackConfiguration logbackConfiguration = spy ( new DefaultLogbackConfiguration ( null ) ) ;
Console console = mock ( Console . class ) ;
given ( console . charset ( ) ) . willReturn ( StandardCharsets . UTF_16 ) ;
given ( logbackConfiguration . getConsole ( ) ) . willReturn ( console ) ;
logbackConfiguration . apply ( this . logbackConfigurator ) ;
assertThat ( this . loggerContext . getProperty ( "CONSOLE_LOG_CHARSET" ) ) . isEqualTo ( StandardCharsets . UTF_16 . name ( ) ) ;
}
@Test
void consoleLogCharsetShouldDefaultToUtf8WhenConsoleIsNull ( ) {
DefaultLogbackConfiguration logbackConfiguration = spy ( new DefaultLogbackConfiguration ( null ) ) ;
given ( logbackConfiguration . getConsole ( ) ) . willReturn ( null ) ;
logbackConfiguration . apply ( this . logbackConfigurator ) ;
assertThat ( this . loggerContext . getProperty ( "CONSOLE_LOG_CHARSET" ) ) . isEqualTo ( StandardCharsets . UTF_8 . name ( ) ) ;
}
@Test
void consoleLogCharsetShouldUseSystemPropertyIfSet ( ) {
withSystemProperty ( "CONSOLE_LOG_CHARSET" , StandardCharsets . US_ASCII . name ( ) , ( ) - > {
new DefaultLogbackConfiguration ( null ) . apply ( this . logbackConfigurator ) ;
assertThat ( this . loggerContext . getProperty ( "CONSOLE_LOG_CHARSET" ) )
. isEqualTo ( StandardCharsets . US_ASCII . name ( ) ) ;
} ) ;
}
@Test
void fileLogCharsetShouldUseSystemPropertyIfSet ( ) {
withSystemProperty ( "FILE_LOG_CHARSET" , StandardCharsets . ISO_8859_1 . name ( ) , ( ) - > {
new DefaultLogbackConfiguration ( null ) . apply ( this . logbackConfigurator ) ;
assertThat ( this . loggerContext . getProperty ( "FILE_LOG_CHARSET" ) )
. isEqualTo ( StandardCharsets . ISO_8859_1 . name ( ) ) ;
} ) ;
}
@Test
void fileLogCharsetShouldDefaultToUtf8 ( ) {
new DefaultLogbackConfiguration ( null ) . apply ( this . logbackConfigurator ) ;
assertThat ( this . loggerContext . getProperty ( "FILE_LOG_CHARSET" ) ) . isEqualTo ( StandardCharsets . UTF_8 . name ( ) ) ;
}
private void assertThatDefaultXmlContains ( String name , String value ) throws Exception {
String expected = "<property name=\"%s\" value=\"%s\"/>" . formatted ( name , value ) ;
assertThat ( defaultXmlContent ( ) ) . contains ( expected ) ;
@ -51,4 +102,21 @@ class DefaultLogbackConfigurationTests {
@@ -51,4 +102,21 @@ class DefaultLogbackConfigurationTests {
return StreamUtils . copyToString ( getClass ( ) . getResourceAsStream ( "defaults.xml" ) , StandardCharsets . UTF_8 ) ;
}
private static void withSystemProperty ( String name , String value , Runnable action ) {
String previous = System . getProperty ( name ) ;
try {
System . setProperty ( name , value ) ;
action . run ( ) ;
}
finally {
if ( previous ! = null ) {
System . setProperty ( name , previous ) ;
}
else {
System . clearProperty ( name ) ;
}
}
}
}