View Javadoc
1   /*
2    * Licensed under the GPL License. You may not use this file except in compliance with the License.
3    * You may obtain a copy of the License at
4    *
5    *   https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
6    *
7    * THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
8    * WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
9    * PURPOSE.
10   */
11  package psiprobe.tools.logging.logback;
12  
13  import static org.junit.jupiter.api.Assertions.assertArrayEquals;
14  import static org.junit.jupiter.api.Assertions.assertEquals;
15  import static org.junit.jupiter.api.Assertions.assertNull;
16  import static org.mockito.Mockito.mock;
17  import static org.mockito.Mockito.when;
18  
19  import ch.qos.logback.core.FileAppender;
20  import ch.qos.logback.core.OutputStreamAppender;
21  import ch.qos.logback.core.encoder.Encoder;
22  import ch.qos.logback.core.encoder.LayoutWrappingEncoder;
23  
24  import com.codebox.bean.JavaBeanTester;
25  
26  import java.nio.charset.StandardCharsets;
27  import java.nio.file.Path;
28  
29  import org.junit.jupiter.api.BeforeEach;
30  import org.junit.jupiter.api.Test;
31  
32  /**
33   * The Class LogbackAppenderAccessorTest.
34   */
35  class LogbackAppenderAccessorTest {
36  
37    private LogbackAppenderAccessor accessor;
38    private LogbackLoggerAccessor loggerAccessor;
39  
40    @BeforeEach
41    void setUp() {
42      accessor = new LogbackAppenderAccessor();
43      loggerAccessor = mock(LogbackLoggerAccessor.class);
44      accessor.setLoggerAccessor(loggerAccessor);
45    }
46  
47    @Test
48    void testLoggerAccessor() {
49      assertEquals(loggerAccessor, accessor.getLoggerAccessor());
50    }
51  
52    @Test
53    void testIsContext() {
54      when(loggerAccessor.isContext()).thenReturn(true);
55  
56      assertEquals(true, accessor.isContext());
57    }
58  
59    @Test
60    void testIsRoot() {
61      when(loggerAccessor.isRoot()).thenReturn(true);
62  
63      assertEquals(true, accessor.isRoot());
64    }
65  
66    @Test
67    void testGetName() {
68      when(loggerAccessor.getName()).thenReturn("my.logger");
69  
70      assertEquals("my.logger", accessor.getName());
71    }
72  
73    @Test
74    void testGetLogType() {
75      assertEquals("logback", accessor.getLogType());
76    }
77  
78    @Test
79    void testGetIndex() {
80      Object target = mock(Object.class);
81  
82      accessor.setTarget(target);
83  
84      // getProperty() is inherited from AbstractLogDestination. The target needs to expose
85      // a "name" bean property for this test, so use a real Logback appender.
86      OutputStreamAppender<?> appender = new OutputStreamAppender<>();
87      appender.setName("testAppender");
88  
89      accessor.setTarget(appender);
90  
91      assertEquals("testAppender", accessor.getIndex());
92    }
93  
94    @Test
95    void testGetIndexWhenNameIsNull() {
96      OutputStreamAppender<?> appender = new OutputStreamAppender<>();
97  
98      accessor.setTarget(appender);
99  
100     assertNull(accessor.getIndex());
101   }
102 
103   @Test
104   void testGetFile() {
105     FileAppender<?> appender = new FileAppender<>();
106 
107     Path expected = Path.of("logs").resolve("test.log");
108     appender.setFile(expected.toString());
109 
110     accessor.setTarget(appender);
111 
112     assertEquals(expected, accessor.getFile().toPath());
113   }
114 
115   @Test
116   void testGetFileWhenFileIsNotConfigured() {
117     String originalCatalinaBase = System.getProperty("catalina.base");
118 
119     try {
120       System.setProperty("catalina.base",
121           Path.of("target", "nonexistent-catalina-base").toString());
122 
123       OutputStreamAppender<?> appender = new OutputStreamAppender<>();
124       appender.setName("testAppender");
125 
126       accessor.setTarget(appender);
127 
128       assertEquals(Path.of("stdout").toFile(), accessor.getFile());
129     } finally {
130       if (originalCatalinaBase == null) {
131         System.clearProperty("catalina.base");
132       } else {
133         System.setProperty("catalina.base", originalCatalinaBase);
134       }
135     }
136   }
137 
138   @Test
139   void testGetEncoding() {
140     OutputStreamAppender appender = mock(OutputStreamAppender.class);
141     LayoutWrappingEncoder encoder = mock(LayoutWrappingEncoder.class);
142 
143     when(appender.getEncoder()).thenReturn(encoder);
144     when(encoder.getCharset()).thenReturn(StandardCharsets.UTF_8);
145 
146     accessor.setTarget(appender);
147 
148     assertEquals("UTF-8", accessor.getEncoding());
149   }
150 
151   @Test
152   void testGetEncodingWhenCharsetIsNull() {
153     OutputStreamAppender appender = mock(OutputStreamAppender.class);
154     LayoutWrappingEncoder encoder = mock(LayoutWrappingEncoder.class);
155 
156     when(appender.getEncoder()).thenReturn(encoder);
157     when(encoder.getCharset()).thenReturn(null);
158 
159     assertNull(accessor.getEncoding());
160   }
161 
162   @Test
163   void testGetEncodingWhenEncoderIsNotLayoutWrappingEncoder() {
164     OutputStreamAppender appender = mock(OutputStreamAppender.class);
165     Encoder encoder = mock(Encoder.class);
166 
167     when(appender.getEncoder()).thenReturn(encoder);
168 
169     accessor.setTarget(appender);
170 
171     assertNull(accessor.getEncoding());
172   }
173 
174   @Test
175   void testGetEncodingWhenTargetIsNotOutputStreamAppender() {
176     accessor.setTarget(new Object());
177 
178     assertNull(accessor.getEncoding());
179   }
180 
181   @Test
182   void testGetLevel() {
183     when(loggerAccessor.getLevel()).thenReturn("INFO");
184 
185     assertEquals("INFO", accessor.getLevel());
186   }
187 
188   @Test
189   void testGetValidLevels() {
190     assertArrayEquals(new String[] {"OFF", "ERROR", "WARN", "INFO", "DEBUG", "TRACE", "ALL"},
191         accessor.getValidLevels());
192   }
193 
194   /**
195    * Javabean tester.
196    */
197   @Test
198   void javabeanTester() {
199     JavaBeanTester.builder(LogbackAppenderAccessor.class).skip("level").test();
200   }
201 
202 }