1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.log4j.xml;
19
20 import junit.framework.Test;
21 import junit.framework.TestCase;
22 import junit.framework.TestSuite;
23 import org.apache.log4j.FileAppender;
24 import org.apache.log4j.Level;
25 import org.apache.log4j.Logger;
26 import org.apache.log4j.MDC;
27 import org.apache.log4j.util.Compare;
28 import org.apache.log4j.util.Filter;
29 import org.apache.log4j.util.JunitTestRunnerFilter;
30 import org.apache.log4j.util.LineNumberFilter;
31 import org.apache.log4j.util.SunReflectFilter;
32 import org.apache.log4j.util.Transformer;
33 import org.apache.log4j.util.XMLLineAttributeFilter;
34 import org.apache.log4j.util.XMLTimestampFilter;
35
36 import java.util.Hashtable;
37
38 public class XMLLayoutTestCase extends TestCase {
39
40 static String TEMP = "output/temp";
41 static String FILTERED = "output/filtered";
42
43 Logger root;
44 Logger logger;
45
46 public XMLLayoutTestCase(String name) {
47 super(name);
48 }
49
50 public void setUp() {
51 root = Logger.getRootLogger();
52 root.setLevel(Level.TRACE);
53 logger = Logger.getLogger(XMLLayoutTestCase.class);
54 logger.setLevel(Level.TRACE);
55 }
56
57 public void tearDown() {
58 root.getLoggerRepository().resetConfiguration();
59 }
60
61 public void basic() throws Exception {
62 XMLLayout xmlLayout = new XMLLayout();
63 root.addAppender(new FileAppender(xmlLayout, TEMP, false));
64 common();
65 Transformer.transform(
66 TEMP, FILTERED,
67 new Filter[] {
68 new LineNumberFilter(),
69 new XMLTimestampFilter(),
70 new JunitTestRunnerFilter(),
71 new SunReflectFilter()
72 });
73 assertTrue(Compare.compare(FILTERED, "witness/xmlLayout.1"));
74 }
75
76 public void locationInfo() throws Exception {
77 XMLLayout xmlLayout = new XMLLayout();
78 xmlLayout.setLocationInfo(true);
79 root.addAppender(new FileAppender(xmlLayout, TEMP, false));
80 common();
81 Transformer.transform(
82 TEMP, FILTERED,
83 new Filter[] {
84 new LineNumberFilter(),
85 new XMLTimestampFilter(),
86 new XMLLineAttributeFilter(),
87 new JunitTestRunnerFilter(),
88 new SunReflectFilter()
89 });
90 assertTrue(Compare.compare(FILTERED, "witness/xmlLayout.2"));
91 }
92
93 public void testCDATA() throws Exception {
94 XMLLayout xmlLayout = new XMLLayout();
95 xmlLayout.setLocationInfo(true);
96 root.addAppender(new FileAppender(xmlLayout, TEMP, false));
97
98 String oldThreadName = Thread.currentThread().getName();
99 Thread.currentThread().setName("main");
100
101 logger.trace("Message with embedded <![CDATA[<hello>hi</hello>]]>.");
102 logger.debug("Message with embedded <![CDATA[<hello>hi</hello>]]>.");
103
104 Thread.currentThread().setName(oldThreadName);
105
106 Transformer.transform(
107 TEMP, FILTERED,
108 new Filter[] {
109 new LineNumberFilter(),
110 new XMLTimestampFilter(),
111 new XMLLineAttributeFilter(),
112 new SunReflectFilter(),
113 new JunitTestRunnerFilter()
114
115 });
116 Transformer.transform(TEMP, FILTERED, new Filter[] {new LineNumberFilter(),
117 new XMLTimestampFilter(),
118 new XMLLineAttributeFilter()});
119 assertTrue(Compare.compare(FILTERED, "witness/xmlLayout.3"));
120 }
121
122 public void testNull() throws Exception {
123 XMLLayout xmlLayout = new XMLLayout();
124 root.addAppender(new FileAppender(xmlLayout, TEMP, false));
125
126 String oldThreadName = Thread.currentThread().getName();
127 Thread.currentThread().setName("main");
128
129 logger.debug("hi");
130 logger.debug(null);
131 Exception e = new Exception((String) null);
132 logger.debug("hi", e);
133
134 Thread.currentThread().setName(oldThreadName);
135
136 Transformer.transform(
137 TEMP, FILTERED,
138 new Filter[] { new LineNumberFilter(),
139 new XMLTimestampFilter(),
140 new JunitTestRunnerFilter(),
141 new SunReflectFilter()});
142 assertTrue(Compare.compare(FILTERED, "witness/xmlLayout.null"));
143 }
144
145
146
147
148
149
150 public void testMDC() throws Exception {
151 XMLLayout xmlLayout = new XMLLayout();
152 xmlLayout.setProperties(true);
153 root.addAppender(new FileAppender(xmlLayout, TEMP, false));
154
155 Hashtable context = MDC.getContext();
156 if (context != null) {
157 context.clear();
158 }
159 MDC.put("key1", "val1");
160 MDC.put("key2", "val2");
161
162 logger.debug("Hello");
163 Transformer.transform(
164 TEMP, FILTERED,
165 new Filter[] { new LineNumberFilter(),
166 new JunitTestRunnerFilter(),
167 new XMLTimestampFilter()});
168 assertTrue(Compare.compare(FILTERED, "witness/xmlLayout.mdc.1"));
169 }
170
171 public void testMDCEscaped() throws Exception {
172 XMLLayout xmlLayout = new XMLLayout();
173 xmlLayout.setProperties(true);
174 root.addAppender(new FileAppender(xmlLayout, TEMP, false));
175
176 Hashtable context = MDC.getContext();
177 if (context != null) {
178 context.clear();
179 }
180 MDC.put("blahAttribute", "<blah value='blah'>");
181 MDC.put("<blahKey value='blah'/>", "blahValue");
182
183 logger.debug("Hello");
184 Transformer.transform(
185 TEMP, FILTERED,
186 new Filter[] { new LineNumberFilter(),
187 new JunitTestRunnerFilter(),
188 new XMLTimestampFilter() });
189 assertTrue(Compare.compare(FILTERED, "witness/xmlLayout.mdc.2"));
190 }
191
192
193 void common() {
194 String oldThreadName = Thread.currentThread().getName();
195 Thread.currentThread().setName("main");
196
197 int i = -1;
198
199 new X();
200
201 logger.trace("Message " + ++i);
202 root.trace("Message " + i);
203
204 logger.debug("Message " + ++i);
205 root.debug("Message " + i);
206
207 logger.info("Message " + ++i);
208 root.info("Message " + i);
209
210 logger.warn ("Message " + ++i);
211 root.warn("Message " + i);
212
213 logger.error("Message " + ++i);
214 root.error("Message " + i);
215
216 logger.log(Level.FATAL, "Message " + ++i);
217 root.log(Level.FATAL, "Message " + i);
218
219 Exception e = new Exception("Just testing");
220 logger.debug("Message " + ++i, e);
221 root.debug("Message " + i, e);
222
223 logger.error("Message " + ++i, e);
224 root.error("Message " + i, e);
225
226
227 Thread.currentThread().setName(oldThreadName);
228 }
229
230 public static Test suite() {
231 TestSuite suite = new TestSuite();
232 suite.addTest(new XMLLayoutTestCase("basic"));
233 suite.addTest(new XMLLayoutTestCase("locationInfo"));
234 suite.addTest(new XMLLayoutTestCase("testCDATA"));
235 suite.addTest(new XMLLayoutTestCase("testNull"));
236 suite.addTest(new XMLLayoutTestCase("testMDC"));
237 suite.addTest(new XMLLayoutTestCase("testMDCEscaped"));
238 return suite;
239 }
240
241
242 class X {
243 Logger logger = Logger.getLogger(X.class);
244 public X() {
245 logger.info("in X() constructor");
246 }
247 }
248 }