1   /*
2    * Logback: the reliable, generic, fast and flexible logging framework.
3    * Copyright (C) 1999-2022, QOS.ch. All rights reserved.
4    *
5    * This program and the accompanying materials are dual-licensed under
6    * either the terms of the Eclipse Public License v1.0 as published by
7    * the Eclipse Foundation
8    *
9    *   or (per the licensee's choosing)
10   *
11   * under the terms of the GNU Lesser General Public License version 2.1
12   * as published by the Free Software Foundation.
13   */
14  
15  package ch.qos.logback.classic.blackbox.joran;
16  
17  import ch.qos.logback.classic.Level;
18  import ch.qos.logback.classic.Logger;
19  import ch.qos.logback.classic.LoggerContext;
20  import ch.qos.logback.classic.blackbox.BlackboxClassicTestConstants;
21  import ch.qos.logback.classic.joran.JoranConfigurator;
22  import ch.qos.logback.classic.jul.JULHelper;
23  import ch.qos.logback.classic.spi.ILoggingEvent;
24  import ch.qos.logback.classic.util.LogbackMDCAdapter;
25  import ch.qos.logback.core.joran.spi.JoranException;
26  import ch.qos.logback.core.read.ListAppender;
27  import ch.qos.logback.core.testUtil.RandomUtil;
28  import ch.qos.logback.core.testUtil.StringListAppender;
29  import ch.qos.logback.core.util.StatusPrinter;
30  import org.junit.jupiter.api.Disabled;
31  import org.junit.jupiter.api.Test;
32  
33  import java.io.IOException;
34  
35  import static org.junit.jupiter.api.Assertions.assertEquals;
36  import static org.junit.jupiter.api.Assertions.assertNotNull;
37  import static org.junit.jupiter.api.Assertions.assertNull;
38  import static org.junit.jupiter.api.Assertions.assertTrue;
39  
40  public class BlackboxJoranConfiguratorTest {
41      LoggerContext loggerContext = new LoggerContext();
42      LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter();
43      Logger logger = loggerContext.getLogger(this.getClass().getName());
44      Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
45      StatusChecker checker = new StatusChecker(loggerContext);
46      int diff = RandomUtil.getPositiveInt();
47  
48      void configure(String file) throws JoranException {
49          loggerContext.setMDCAdapter(logbackMDCAdapter);
50          JoranConfigurator jc = new JoranConfigurator();
51          jc.setContext(loggerContext);
52          loggerContext.putProperty("diff", "" + diff);
53          jc.doConfigure(file);
54  
55      }
56  
57      @Test
58      public void eval() throws JoranException {
59          configure(BlackboxClassicTestConstants.JORAN_INPUT_PREFIX + "callerData.xml");
60          String msg = "hello world";
61          logger.debug("toto");
62          logger.debug(msg);
63  
64          StringListAppender<ILoggingEvent> slAppender = (StringListAppender<ILoggingEvent>) loggerContext
65                  .getLogger("root").getAppender("STR_LIST");
66          assertNotNull(slAppender);
67          assertEquals(2, slAppender.strList.size());
68          assertTrue(slAppender.strList.get(0).contains(" DEBUG - toto"));
69  
70          String str1 = slAppender.strList.get(1);
71          assertTrue(str1.contains("Caller+0"));
72          assertTrue(str1.contains(" DEBUG - hello world"));
73      }
74  
75      @Disabled
76      @Test
77      public void testEvaluatorFilter() throws JoranException {
78          configure(BlackboxClassicTestConstants.JORAN_INPUT_PREFIX + "evaluatorFilter.xml");
79  
80          // StatusPrinter.print(loggerContext);
81  
82          logger.warn("hello");
83          logger.error("to be ignored");
84  
85          ListAppender<ILoggingEvent> listAppender = (ListAppender<ILoggingEvent>) root.getAppender("LIST");
86  
87          assertNotNull(listAppender);
88          assertEquals(1, listAppender.list.size());
89          ILoggingEvent back = listAppender.list.get(0);
90          assertEquals(Level.WARN, back.getLevel());
91          assertEquals("hello", back.getMessage());
92      }
93  
94      @Disabled
95      @Test
96      public void testEvaluatorFilterWithImports() throws JoranException {
97          configure(BlackboxClassicTestConstants.JORAN_INPUT_PREFIX + "evaluatorFilterWithImports.xml");
98  
99          // StatusPrinter.print(loggerContext);
100 
101         logger.warn("hello");
102         logger.error("to be ignored");
103 
104         ListAppender<ILoggingEvent> listAppender = (ListAppender<ILoggingEvent>) root.getAppender("LIST");
105 
106         assertNotNull(listAppender);
107         assertEquals(1, listAppender.list.size());
108         ILoggingEvent back = listAppender.list.get(0);
109         assertEquals(Level.WARN, back.getLevel());
110         assertEquals("hello", back.getMessage());
111     }
112 
113     @Test
114     public void conditional1673() throws JoranException  {
115         loggerContext.putProperty("EXTRA", "true");
116         String configFileAsStr = BlackboxClassicTestConstants.JORAN_INPUT_PREFIX + "issues/logback_1673.xml";
117         configure(configFileAsStr);
118     }
119 
120     @Test
121     public void conditional1673bisWithActiveThen() throws JoranException  {
122         loggerContext.putProperty("EXTRA", "true");
123         String configFileAsStr = BlackboxClassicTestConstants.JORAN_INPUT_PREFIX + "issues/logback_1673bis.xml";
124         configure(configFileAsStr);
125         Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
126         ListAppender<ILoggingEvent> listThen = (ListAppender<ILoggingEvent>) root.getAppender("LIST_THEN");
127         assertNotNull(listThen);
128 
129         ListAppender<ILoggingEvent> listElse = (ListAppender<ILoggingEvent>) root.getAppender("LIST_ELSE");
130         assertNull(listElse);
131     }
132 
133     @Test
134     public void conditional1673bisWithActiveElse() throws JoranException  {
135         String configFileAsStr = BlackboxClassicTestConstants.JORAN_INPUT_PREFIX + "issues/logback_1673bis.xml";
136         configure(configFileAsStr);
137         Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
138         ListAppender<ILoggingEvent> listThen = (ListAppender<ILoggingEvent>) root.getAppender("LIST_THEN");
139         assertNull(listThen);
140 
141         ListAppender<ILoggingEvent> listElse = (ListAppender<ILoggingEvent>) root.getAppender("LIST_ELSE");
142         assertNotNull(listElse);
143     }
144 
145     @Test
146     public void nestedIf() throws JoranException  {
147         loggerContext.putProperty("EXTRA", "true");
148         String configFileAsStr = BlackboxClassicTestConstants.JORAN_INPUT_PREFIX + "issues/logback_1678.xml";
149         configure(configFileAsStr);
150         StatusPrinter.print(loggerContext);
151 
152     }
153 
154     @Test
155     public void levelChangePropagator0() throws JoranException, IOException, InterruptedException {
156         String loggerName = "changePropagator0" + diff;
157         java.util.logging.Logger.getLogger(loggerName).setLevel(java.util.logging.Level.INFO);
158         String configFileAsStr = BlackboxClassicTestConstants.JORAN_INPUT_PREFIX + "/jul/levelChangePropagator0.xml";
159         configure(configFileAsStr);
160 
161         checker.assertIsErrorFree();
162         verifyJULLevel(loggerName, null);
163         verifyJULLevel("a.b.c." + diff, Level.WARN);
164         verifyJULLevel(Logger.ROOT_LOGGER_NAME, Level.TRACE);
165     }
166 
167     @Test
168     public void levelChangePropagator1() throws JoranException, IOException, InterruptedException {
169         String loggerName = "changePropagator1" + diff;
170         java.util.logging.Logger logger1 = java.util.logging.Logger.getLogger(loggerName);
171         logger1.setLevel(java.util.logging.Level.INFO);
172         verifyJULLevel(loggerName, Level.INFO);
173         String configFileAsStr = BlackboxClassicTestConstants.JORAN_INPUT_PREFIX + "/jul/levelChangePropagator1.xml";
174         configure(configFileAsStr);
175 
176         checker.assertIsErrorFree();
177         verifyJULLevel(loggerName, Level.INFO); //
178         verifyJULLevel("a.b.c." + diff, Level.WARN);
179         verifyJULLevel(Logger.ROOT_LOGGER_NAME, Level.TRACE);
180     }
181 
182     void verifyJULLevel(String loggerName, Level expectedLevel) {
183         java.util.logging.Logger julLogger = JULHelper.asJULLogger(loggerName);
184         java.util.logging.Level julLevel = julLogger.getLevel();
185 
186         if (expectedLevel == null) {
187             assertNull(julLevel);
188         } else {
189             assertEquals(JULHelper.asJULLevel(expectedLevel), julLevel);
190         }
191     }
192 
193 
194 }