1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    * 
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.log4j.helpers;
19  
20  import junit.framework.TestCase;
21  import junit.framework.TestSuite;
22  import junit.framework.Test;
23  
24  import org.apache.log4j.Logger;
25  import org.apache.log4j.Level;
26  import org.apache.log4j.Appender;
27  import org.apache.log4j.FileAppender;
28  import org.apache.log4j.PatternLayout;
29  import org.apache.log4j.MDC;
30  
31  import org.apache.log4j.util.Compare;
32  
33  /**
34     Test case for helpers/PatternParser.java. Tests the various 
35     conversion patterns supported by PatternParser. This test
36     class tests PatternParser via the PatternLayout class which
37     uses it.
38   */
39  public class PatternParserTestCase extends TestCase {
40    
41    static String OUTPUT_FILE   = "output/PatternParser";
42    static String WITNESS_FILE  = "witness/PatternParser";
43  
44    static String msgPattern = "%m%n";
45    
46    Logger root; 
47    Logger logger;
48  
49    public PatternParserTestCase(String name) {
50      super(name);
51    }
52  
53    public void setUp() {
54      root = Logger.getRootLogger();
55      root.removeAllAppenders();
56    }
57  
58    public void tearDown() {  
59      root.getLoggerRepository().resetConfiguration();
60    }
61  
62    /**
63      Test case for MDC conversion pattern. */
64    public void mdcPattern() throws Exception {
65      
66      String mdcMsgPattern1 = "%m : %X%n";
67      String mdcMsgPattern2 = "%m : %X{key1}%n";
68      String mdcMsgPattern3 = "%m : %X{key2}%n";
69      String mdcMsgPattern4 = "%m : %X{key3}%n";
70      String mdcMsgPattern5 = "%m : %X{key1},%X{key2},%X{key3}%n";
71      
72      // set up appender
73      PatternLayout layout = new PatternLayout(msgPattern);
74      Appender appender = new FileAppender(layout, OUTPUT_FILE+"_mdc", false);
75              
76      // set appender on root and set level to debug
77      root.addAppender(appender);
78      root.setLevel(Level.DEBUG);
79      
80      // output starting message
81      root.debug("starting mdc pattern test");
82   
83      layout.setConversionPattern(mdcMsgPattern1);
84      root.debug("empty mdc, no key specified in pattern");
85      
86      layout.setConversionPattern(mdcMsgPattern2);
87      root.debug("empty mdc, key1 in pattern");
88      
89      layout.setConversionPattern(mdcMsgPattern3);
90      root.debug("empty mdc, key2 in pattern");
91      
92      layout.setConversionPattern(mdcMsgPattern4);
93      root.debug("empty mdc, key3 in pattern");
94      
95      layout.setConversionPattern(mdcMsgPattern5);
96      root.debug("empty mdc, key1, key2, and key3 in pattern");
97  
98      MDC.put("key1", "value1");
99      MDC.put("key2", "value2");
100 
101     layout.setConversionPattern(mdcMsgPattern1);
102     root.debug("filled mdc, no key specified in pattern");
103     
104     layout.setConversionPattern(mdcMsgPattern2);
105     root.debug("filled mdc, key1 in pattern");
106     
107     layout.setConversionPattern(mdcMsgPattern3);
108     root.debug("filled mdc, key2 in pattern");
109     
110     layout.setConversionPattern(mdcMsgPattern4);
111     root.debug("filled mdc, key3 in pattern");
112     
113     layout.setConversionPattern(mdcMsgPattern5);
114     root.debug("filled mdc, key1, key2, and key3 in pattern");
115 
116     MDC.remove("key1");
117     MDC.remove("key2");
118 
119     layout.setConversionPattern(msgPattern);
120     root.debug("finished mdc pattern test");
121 
122     assertTrue(Compare.compare(OUTPUT_FILE+"_mdc", WITNESS_FILE+"_mdc"));
123   }
124 
125   public static Test suite() {
126     TestSuite suite = new TestSuite();
127     //
128     //   MDC requires JDK 1.2+
129     //
130     if (!System.getProperty("java.version").startsWith("1.1.")) {
131        suite.addTest(new PatternParserTestCase("mdcPattern"));
132     }
133     return suite;
134   }
135 
136 }