blob: 7837a2cc09038c0ffd43d77f2013a29c93a9c1b7 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.log4j;
import org.apache.log4j.spi.LoggingEvent;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.Reader;
import java.io.StringReader;
import java.util.Hashtable;
/**
* Test for HTMLLayout.
*
* @author Curt Arnold
*/
public class HTMLLayoutTest extends LayoutTest {
/**
* Construct new instance of XMLLayoutTest.
*
* @param testName test name.
*/
public HTMLLayoutTest(final String testName) {
super(testName, "text/html", false, null, null);
}
/**
* @{inheritDoc}
*/
protected Layout createLayout() {
return new HTMLLayout();
}
/**
* Parses the string as the body of an XML document and returns the document element.
* @param source source string.
* @return document element.
* @throws Exception if parser can not be constructed or source is not a valid XML document.
*/
private Document parse(final String source) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setCoalescing(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Reader reader = new StringReader(source);
return builder.parse(new InputSource(reader));
}
/**
* Tests formatted results.
* @throws Exception if unable to create parser or output is not valid XML.
*/
public void testFormat() throws Exception {
Logger logger = Logger.getLogger("org.apache.log4j.xml.HTMLLayoutTest");
NDC.push("NDC goes here");
LoggingEvent event =
new LoggingEvent(
"org.apache.log4j.Logger", logger, Level.INFO, "Hello, World", null);
HTMLLayout layout = (HTMLLayout) createLayout();
layout.setLocationInfo(true);
String result = layout.format(event);
NDC.pop();
String src =
"<!DOCTYPE body [ <!ENTITY nbsp ' '>]><body>" + result + "</body>";
parse(src);
}
/**
* Tests getHeader.
*/
public void testGetHeader() {
assertEquals("<!DOCTYPE", createLayout().getHeader().substring(0, 9));
}
/**
* Tests getHeader with locationInfo = true.
*/
public void testGetHeaderWithLocation() {
HTMLLayout layout = (HTMLLayout) createLayout();
layout.setLocationInfo(true);
assertEquals("<!DOCTYPE", layout.getHeader().substring(0, 9));
}
/**
* Tests getFooter.
*/
public void testGetFooter() {
assertEquals("</table>", createLayout().getFooter().substring(0, 8));
}
/**
* Tests getLocationInfo and setLocationInfo.
*/
public void testGetSetLocationInfo() {
HTMLLayout layout = new HTMLLayout();
assertEquals(false, layout.getLocationInfo());
layout.setLocationInfo(true);
assertEquals(true, layout.getLocationInfo());
layout.setLocationInfo(false);
assertEquals(false, layout.getLocationInfo());
}
/**
* Tests activateOptions().
*/
public void testActivateOptions() {
HTMLLayout layout = new HTMLLayout();
layout.activateOptions();
}
/**
* Tests getTitle and setTitle.
*/
public void testGetSetTitle() {
HTMLLayout layout = new HTMLLayout();
assertEquals("Log4J Log Messages", layout.getTitle());
layout.setTitle(null);
assertNull(layout.getTitle());
String newTitle = "A treatise on messages of log persuasion";
layout.setTitle(newTitle);
assertEquals(newTitle, layout.getTitle());
}
/**
* Tests buffer downsizing and DEBUG and WARN colorization code paths.
*/
public void testFormatResize() {
Logger logger = Logger.getLogger("org.apache.log4j.xml.HTMLLayoutTest");
NDC.clear();
char[] msg = new char[2000];
for (int i = 0; i < msg.length; i++) {
msg[i] = 'A';
}
LoggingEvent event1 =
new LoggingEvent(
"org.apache.log4j.Logger", logger, Level.DEBUG, new String(msg), null);
HTMLLayout layout = (HTMLLayout) createLayout();
layout.setLocationInfo(true);
String result = layout.format(event1);
Exception ex = new IllegalArgumentException("'foo' is not a valid value.");
LoggingEvent event2 =
new LoggingEvent(
"org.apache.log4j.Logger", logger, Level.WARN, "Hello, World", ex);
result = layout.format(event2);
assertEquals(
Layout.LINE_SEP + "<tr>",
result.substring(0, Layout.LINE_SEP.length() + 4));
}
/**
* Level with arbitrary toString value.
*/
private static final class ProblemLevel extends Level {
private static final long serialVersionUID = 1L;
/**
* Construct new instance.
* @param levelName level name, may not be null.
*/
public ProblemLevel(final String levelName) {
super(6000, levelName, 6);
}
}
/**
* Tests problematic characters in multiple fields.
* @throws Exception if parser can not be constructed
* or source is not a valid XML document.
*/
public void testProblemCharacters() throws Exception {
String problemName = "com.example.bar<>&\"'";
Logger logger = Logger.getLogger(problemName);
Level level = new ProblemLevel(problemName);
Exception ex = new IllegalArgumentException(problemName);
String threadName = Thread.currentThread().getName();
Thread.currentThread().setName(problemName);
NDC.push(problemName);
Hashtable mdcMap = MDC.getContext();
if (mdcMap != null) {
mdcMap.clear();
}
MDC.put(problemName, problemName);
LoggingEvent event =
new LoggingEvent(
problemName, logger, level, problemName, ex);
HTMLLayout layout = (HTMLLayout) createLayout();
String result = layout.format(event);
mdcMap = MDC.getContext();
if (mdcMap != null) {
mdcMap.clear();
}
Thread.currentThread().setName(threadName);
//
// do a little fixup to make output XHTML
//
StringBuffer buf = new StringBuffer(
"<!DOCTYPE table [<!ENTITY nbsp ' '>]><table>");
buf.append(result);
buf.append("</table>");
String doc = buf.toString();
for(int i = doc.lastIndexOf("<br>");
i != -1;
i = doc.lastIndexOf("<br>", i - 1)) {
buf.replace(i, i + 4, "<br/>");
}
parse(buf.toString());
}
}