/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.renderers; import java.io.StringReader; import javax.xml.parsers.DocumentBuilderFactory; import org.junit.Assert; import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import net.sourceforge.pmd.FooRule; import net.sourceforge.pmd.PMD; import net.sourceforge.pmd.Report; import net.sourceforge.pmd.Report.ProcessingError; import net.sourceforge.pmd.ReportTest; import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.RuleViolation; import net.sourceforge.pmd.lang.ast.DummyNode; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.rule.ParametricRuleViolation; public class XMLRendererTest extends AbstractRendererTst { @Override public Renderer getRenderer() { return new XMLRenderer(); } @Override public String getExpected() { return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + PMD.EOL + "<pmd version=\"" + PMD.VERSION + "\" timestamp=\"2014-10-06T19:30:51.262\">" + PMD.EOL + "<file name=\"n/a\">" + PMD.EOL + "<violation beginline=\"1\" endline=\"1\" begincolumn=\"1\" endcolumn=\"1\" rule=\"Foo\" ruleset=\"RuleSet\" priority=\"5\">" + PMD.EOL + "blah" + PMD.EOL + "</violation>" + PMD.EOL + "</file>" + PMD.EOL + "</pmd>" + PMD.EOL; } @Override public String getExpectedEmpty() { return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + PMD.EOL + "<pmd version=\"" + PMD.VERSION + "\" timestamp=\"2014-10-06T19:30:51.262\">" + PMD.EOL + "</pmd>" + PMD.EOL; } @Override public String getExpectedMultiple() { return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + PMD.EOL + "<pmd version=\"" + PMD.VERSION + "\" timestamp=\"2014-10-06T19:30:51.239\">" + PMD.EOL + "<file name=\"n/a\">" + PMD.EOL + "<violation beginline=\"1\" endline=\"1\" begincolumn=\"1\" endcolumn=\"1\" rule=\"Foo\" ruleset=\"RuleSet\" priority=\"5\">" + PMD.EOL + "blah" + PMD.EOL + "</violation>" + PMD.EOL + "<violation beginline=\"1\" endline=\"1\" begincolumn=\"1\" endcolumn=\"2\" rule=\"Foo\" ruleset=\"RuleSet\" priority=\"5\">" + PMD.EOL + "blah" + PMD.EOL + "</violation>" + PMD.EOL + "</file>" + PMD.EOL + "</pmd>" + PMD.EOL; } @Override public String getExpectedError(ProcessingError error) { return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + PMD.EOL + "<pmd version=\"" + PMD.VERSION + "\" timestamp=\"2014-10-06T19:30:51.222\">" + PMD.EOL + "<error filename=\"file\" msg=\"Error\"/>" + PMD.EOL + "</pmd>" + PMD.EOL; } @Override public String filter(String expected) { String result = expected.replaceAll(" timestamp=\"[^\"]+\">", " timestamp=\"\">"); return result; } private static RuleViolation createRuleViolation(String description) { DummyNode node = new DummyNode(1); node.testingOnlySetBeginLine(1); node.testingOnlySetBeginColumn(1); node.testingOnlySetEndLine(1); node.testingOnlySetEndColumn(1); RuleContext ctx = new RuleContext(); ctx.setSourceCodeFilename("n/a"); return new ParametricRuleViolation<Node>(new FooRule(), ctx, node, description); } private void verifyXmlEscaping(Renderer renderer, String shouldContain) throws Exception { Report report = new Report(); String surrogatePair = "\ud801\udc1c"; String msg = "The String literal \"Tokenizer " + surrogatePair + "\" appears..."; report.addRuleViolation(createRuleViolation(msg)); String actual = ReportTest.render(renderer, report); Assert.assertTrue(actual.contains(shouldContain)); Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder() .parse(new InputSource(new StringReader(actual))); NodeList violations = doc.getElementsByTagName("violation"); Assert.assertEquals(1, violations.getLength()); Assert.assertEquals(msg, violations.item(0).getTextContent().trim()); } @Test public void testXMLEscapingWithUTF8() throws Exception { Renderer renderer = getRenderer(); renderer.setProperty(XMLRenderer.ENCODING, "UTF-8"); verifyXmlEscaping(renderer, "\ud801\udc1c"); } @Test public void testXMLEscapingWithoutUTF8() throws Exception { Renderer renderer = getRenderer(); renderer.setProperty(XMLRenderer.ENCODING, "ISO-8859-1"); verifyXmlEscaping(renderer, "𐐜"); } }