Author: bodewig Date: Tue Apr 8 03:44:46 2008 New Revision: 645841 URL: http://svn.apache.org/viewvc?rev=645841&view=rev Log: Add logging of messages to xmllistener, based on code submitted by David Jackman
Added: ant/antlibs/antunit/trunk/src/etc/testcases/listener/xmllistener.xml (with props) ant/antlibs/antunit/trunk/src/tests/junit/org/apache/ant/antunit/listener/XMLListenerTest.java (with props) Modified: ant/antlibs/antunit/trunk/src/main/org/apache/ant/antunit/listener/XMLAntUnitListener.java Added: ant/antlibs/antunit/trunk/src/etc/testcases/listener/xmllistener.xml URL: http://svn.apache.org/viewvc/ant/antlibs/antunit/trunk/src/etc/testcases/listener/xmllistener.xml?rev=645841&view=auto ============================================================================== --- ant/antlibs/antunit/trunk/src/etc/testcases/listener/xmllistener.xml (added) +++ ant/antlibs/antunit/trunk/src/etc/testcases/listener/xmllistener.xml Tue Apr 8 03:44:46 2008 @@ -0,0 +1,304 @@ +<?xml version="1.0"?> +<!-- +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. +--> + +<project name="xmllistener-test" + default="all" + xmlns:au="antlib:org.apache.ant.antunit"> + + <macrodef name="assertFileContains"> + <attribute name="file" description="File to compare" /> + <attribute name="value" description="Text to look for in the file" /> + <attribute name="casesensitive" default="true"/> + <attribute name="message" + default="Expected file '@{file}' to contain value '@{value}'."/> + <sequential> + <au:assertTrue message="@{message}"> + <isfileselected file="@{file}"> + <contains text="@{value}" casesensitive="@{casesensitive}" /> + </isfileselected> + </au:assertTrue> + </sequential> + </macrodef> + + <macrodef name="assertFileDoesntContain"> + <attribute name="file" description="File to compare" /> + <attribute name="value" description="Text to look for in the file" /> + <attribute name="casesensitive" default="true"/> + <attribute name="message" + default="Expected file '@{file}' to not contain value '@{value}'."/> + <sequential> + <au:assertTrue message="@{message}"> + <not> + <isfileselected file="@{file}"> + <contains text="@{value}" casesensitive="@{casesensitive}" /> + </isfileselected> + </not> + </au:assertTrue> + </sequential> + </macrodef> + + <macrodef name="assertFileContainsRegExp"> + <attribute name="file" description="File to compare" /> + <attribute name="value" description="Regular expression to look for in the file" /> + <attribute name="message" + default="Expected file '@{file}' to contain the regular expression '@{value}'."/> + <sequential> + <au:assertTrue message="@{message}"> + <isfileselected file="@{file}"> + <containsregexp expression="@{value}" /> + </isfileselected> + </au:assertTrue> + </sequential> + </macrodef> + + <macrodef name="assertFileDoesntContainRegExp"> + <attribute name="file" description="File to compare" /> + <attribute name="value" description="Regular expression to look for in the file" /> + <attribute name="message" + default="Expected file '@{file}' to not contain the regular expression '@{value}'."/> + <sequential> + <au:assertTrue message="@{message}"> + <not> + <isfileselected file="@{file}"> + <containsregexp expression="@{value}" /> + </isfileselected> + </not> + </au:assertTrue> + </sequential> + </macrodef> + + <macrodef name="assertDoesntMatch" backtrace="false"> + <attribute name="string"/> + <attribute name="pattern"/> + <attribute name="casesensitive" default="true"/> + <attribute name="singleline" default="false"/> + <attribute name="multiline" default="false"/> + <attribute name="message" + default="Expected '@{string}' to match pattern '@{pattern}'"/> + <sequential> + <au:assertTrue message="@{message}"> + <not> + <matches string="@{string}" pattern="@{pattern}" + casesensitive="@{casesensitive}" + singleline="@{singleline}" + multiline="@{multiline}"/> + </not> + </au:assertTrue> + </sequential> + </macrodef> + + <macrodef name="clean"> + <sequential> + <delete file="${reportfile}" quiet="true" /> + </sequential> + </macrodef> + + + <!-- This is the name of the report the XML listener generates --> + <property name="reportfile" value="TEST-xmllistener_xml.xml" /> + + <target name="showdefault"> + <clean/> + <au:antunit failOnError="false"> + <file file="${ant.file}" /> + <au:xmllistener /> + </au:antunit> + <assertFileDoesntContain file="${reportfile}" value="errormessage" message="Should not have shown error message" /> + <assertFileDoesntContain file="${reportfile}" value="warningmessage" message="Should not have shown warning message" /> + <assertFileDoesntContain file="${reportfile}" value="infomessage" message="Should not have shown info message" /> + <assertFileDoesntContain file="${reportfile}" value="verbosemessage" message="Should not have shown verbose message" /> + <assertFileDoesntContain file="${reportfile}" value="debugmessage" message="Should not have shown debug message" /> + <clean/> + </target> + + <target name="showerror"> + <clean/> + <au:antunit failOnError="false"> + <file file="${ant.file}" /> + <au:xmllistener logLevel="error" /> + </au:antunit> + <assertFileContains file="${reportfile}" value="errormessage" message="Should have shown error message" /> + <assertFileDoesntContain file="${reportfile}" value="warningmessage" message="Should not have shown warning message" /> + <assertFileDoesntContain file="${reportfile}" value="infomessage" message="Should not have shown info message" /> + <assertFileDoesntContain file="${reportfile}" value="verbosemessage" message="Should not have shown verbose message" /> + <assertFileDoesntContain file="${reportfile}" value="debugmessage" message="Should not have shown debug message" /> + <clean/> + </target> + + <target name="showwarning"> + <clean/> + <au:antunit failOnError="false"> + <file file="${ant.file}" /> + <au:xmllistener logLevel="warning" /> + </au:antunit> + <assertFileContains file="${reportfile}" value="errormessage" message="Should have shown error message" /> + <assertFileContains file="${reportfile}" value="warningmessage" message="Should have shown warning message" /> + <assertFileDoesntContain file="${reportfile}" value="infomessage" message="Should not have shown info message" /> + <assertFileDoesntContain file="${reportfile}" value="verbosemessage" message="Should not have shown verbose message" /> + <assertFileDoesntContain file="${reportfile}" value="debugmessage" message="Should not have shown debug message" /> + <clean/> + </target> + + <target name="showinfo"> + <clean/> + <au:antunit failOnError="false"> + <file file="${ant.file}" /> + <au:xmllistener logLevel="info" /> + </au:antunit> + <assertFileContains file="${reportfile}" value="errormessage" message="Should have shown error message" /> + <assertFileContains file="${reportfile}" value="warningmessage" message="Should have shown warning message" /> + <assertFileContains file="${reportfile}" value="infomessage" message="Should have shown info message" /> + <assertFileDoesntContain file="${reportfile}" value="verbosemessage" message="Should not have shown verbose message" /> + <assertFileDoesntContain file="${reportfile}" value="debugmessage" message="Should not have shown debug message" /> + <clean/> + </target> + + <target name="showverbose"> + <clean/> + <au:antunit failOnError="false"> + <file file="${ant.file}" /> + <au:xmllistener logLevel="verbose" /> + </au:antunit> + <assertFileContains file="${reportfile}" value="errormessage" message="Should have shown error message" /> + <assertFileContains file="${reportfile}" value="warningmessage" message="Should have shown warning message" /> + <assertFileContains file="${reportfile}" value="infomessage" message="Should have shown info message" /> + <assertFileContains file="${reportfile}" value="verbosemessage" message="Should have shown verbose message" /> + <assertFileDoesntContain file="${reportfile}" value="debugmessage" message="Should not have shown debug message" /> + <clean/> + </target> + + <target name="showdebug"> + <clean/> + <au:antunit failOnError="false"> + <file file="${ant.file}" /> + <au:xmllistener logLevel="debug" /> + </au:antunit> + <assertFileContains file="${reportfile}" value="errormessage" message="Should have shown error message" /> + <assertFileContains file="${reportfile}" value="warningmessage" message="Should have shown warning message" /> + <assertFileContains file="${reportfile}" value="infomessage" message="Should have shown info message" /> + <assertFileContains file="${reportfile}" value="verbosemessage" message="Should have shown verbose message" /> + <assertFileContains file="${reportfile}" value="debugmessage" message="Should have shown debug message" /> + <clean/> + </target> + + <target name="shownone"> + <clean/> + <au:antunit failOnError="false"> + <file file="${ant.file}" /> + <au:xmllistener logLevel="none" /> + </au:antunit> + <assertFileDoesntContain file="${reportfile}" value="errormessage" message="Should not have shown error message" /> + <assertFileDoesntContain file="${reportfile}" value="warningmessage" message="Should not have shown warning message" /> + <assertFileDoesntContain file="${reportfile}" value="infomessage" message="Should not have shown info message" /> + <assertFileDoesntContain file="${reportfile}" value="verbosemessage" message="Should not have shown verbose message" /> + <assertFileDoesntContain file="${reportfile}" value="debugmessage" message="Should not have shown debug message" /> + <clean/> + </target> + + <target name="-createreport"> + <clean/> + <au:antunit failOnError="false"> + <file file="${ant.file}" /> + <au:xmllistener logLevel="info"/> + </au:antunit> + </target> + + <property name="systemoutstart" value="<system-out><!\[CDATA\[" /> + <property name="systemoutend" value="\]\]></system-out>" /> + + <target name="stdoutplacement" depends="-createreport"> + <loadfile property="reportxml" srcFile="${reportfile}" /> + <au:assertMatches string="${reportxml}" pattern="${systemoutstart}.*${systemoutend}" singleline="true" + message="Standard output element not present" /> + <assertDoesntMatch string="${reportxml}" pattern="${systemoutstart}.*<testcase" singleline="true" + message="Standard output element should be after all testcase elements" /> + <au:assertMatches string="${reportxml}" pattern="${systemoutend}.*<tests" singleline="true" + message="Standard output element should be before tests element" /> + <clean/> + </target> + + <target name="setupteardown" depends="-createreport"> + <loadfile property="reportxml" srcFile="${reportfile}" /> + <au:assertMatches string="${reportxml}" pattern="${systemoutstart}.*setUp.*${systemoutend}" singleline="true" + message="setUp message not present" /> + <au:assertMatches string="${reportxml}" pattern="${systemoutstart}.*setUp.*setUp.*${systemoutend}" singleline="true" + message="Two setUp messages not present" /> + <assertDoesntMatch string="${reportxml}" pattern="${systemoutstart}.*setUp.*setUp.*setUp.*${systemoutend}" singleline="true" + message="Too many setUp messages present" /> + <au:assertMatches string="${reportxml}" pattern="${systemoutstart}.*tearDown.*${systemoutend}" singleline="true" + message="tearDown message not present" /> + <au:assertMatches string="${reportxml}" pattern="${systemoutstart}.*tearDown.*tearDown.*${systemoutend}" singleline="true" + message="Two tearDown messages not present" /> + <assertDoesntMatch string="${reportxml}" pattern="${systemoutstart}.*tearDown.*tearDown.*tearDown.*${systemoutend}" singleline="true" + message="Too many tearDown messages present" /> + <clean/> + </target> + + <target name="suitesetupteardown" depends="-createreport"> + <loadfile property="reportxml" srcFile="${reportfile}" /> + <au:assertMatches string="${reportxml}" pattern="${systemoutstart}.*suiteSetUp.*${systemoutend}" singleline="true" + message="suiteSetUp message not present" /> + <assertDoesntMatch string="${reportxml}" pattern="${systemoutstart}.*suiteSetUp.*suiteSetUp.*${systemoutend}" singleline="true" + message="Too many suiteSetUp messages present" /> + <au:assertMatches string="${reportxml}" pattern="${systemoutstart}.*suiteTearDown.*${systemoutend}" singleline="true" + message="suiteTearDown message not present" /> + <assertDoesntMatch string="${reportxml}" pattern="${systemoutstart}.*suiteTearDown.*suiteTearDown.*${systemoutend}" singleline="true" + message="Too many suiteTearDown messages present" /> + <clean/> + </target> + + <target name="badcharacters" depends="-createreport"> + <loadfile property="reportxml" srcFile="${reportfile}" /> + <au:assertMatches string="${reportxml}" pattern="${systemoutstart}.*&#x5d;&#x5d;&gt;.*${systemoutend}" singleline="true" + message="Bad characters not escaped" /> + <clean/> + </target> + + + <target name="suiteSetUp"> + <echo>suiteSetUp</echo> + </target> + + <target name="suiteTearDown"> + <echo>suiteTearDown</echo> + </target> + + <target name="setUp"> + <echo>setUp</echo> + </target> + + <target name="tearDown"> + <echo>tearDown</echo> + </target> + + <target name="testEcho"> + <echo level="debug">debugmessage</echo> + <echo level="verbose">verbosemessage</echo> + <echo level="info">infomessage</echo> + <echo level="warning">warningmessage</echo> + <echo level="error">errormessage</echo> + </target> + + <target name="test2"> + <echo>test2</echo> + <echo>bad characters: ]]></echo> + </target> + +</project> Propchange: ant/antlibs/antunit/trunk/src/etc/testcases/listener/xmllistener.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ant/antlibs/antunit/trunk/src/etc/testcases/listener/xmllistener.xml ------------------------------------------------------------------------------ svn:executable = * Modified: ant/antlibs/antunit/trunk/src/main/org/apache/ant/antunit/listener/XMLAntUnitListener.java URL: http://svn.apache.org/viewvc/ant/antlibs/antunit/trunk/src/main/org/apache/ant/antunit/listener/XMLAntUnitListener.java?rev=645841&r1=645840&r2=645841&view=diff ============================================================================== --- ant/antlibs/antunit/trunk/src/main/org/apache/ant/antunit/listener/XMLAntUnitListener.java (original) +++ ant/antlibs/antunit/trunk/src/main/org/apache/ant/antunit/listener/XMLAntUnitListener.java Tue Apr 8 03:44:46 2008 @@ -30,6 +30,7 @@ import org.apache.ant.antunit.AssertionFailedException; +import org.apache.tools.ant.BuildEvent; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Location; import org.apache.tools.ant.Project; @@ -53,6 +54,10 @@ private Document doc; private Element root; private Element currentTest; + /** + * Collects log messages. + */ + private StringBuffer log = new StringBuffer(); public XMLAntUnitListener() { super(new BaseAntUnitListener.SendLogTo(SendLogTo.FILE), "xml"); @@ -92,8 +97,14 @@ public void endTestSuite(Project testProject, String buildFile) { try { - Element e = DOMUtils.createChildElement(root, - XMLConstants.ATTR_TESTS); + Element e; + if (log.length() > 0) { + e = DOMUtils.createChildElement(root, XMLConstants.SYSTEM_OUT); + DOMUtils.appendCDATA(e, log.toString()); + log.setLength(0); + domWri.write(e, wri, 1, INDENT); + } + e = DOMUtils.createChildElement(root, XMLConstants.ATTR_TESTS); DOMUtils.appendText(e, String.valueOf(runCount)); domWri.write(e, wri, 1, INDENT); e = DOMUtils.createChildElement(root, XMLConstants.ATTR_FAILURES); @@ -178,6 +189,11 @@ } catch (IOException ex) { throw new BuildException(ex); } + } + + protected void messageLogged(BuildEvent event) { + log.append(event.getMessage()); + log.append(System.getProperty("line.separator")); } /** Added: ant/antlibs/antunit/trunk/src/tests/junit/org/apache/ant/antunit/listener/XMLListenerTest.java URL: http://svn.apache.org/viewvc/ant/antlibs/antunit/trunk/src/tests/junit/org/apache/ant/antunit/listener/XMLListenerTest.java?rev=645841&view=auto ============================================================================== --- ant/antlibs/antunit/trunk/src/tests/junit/org/apache/ant/antunit/listener/XMLListenerTest.java (added) +++ ant/antlibs/antunit/trunk/src/tests/junit/org/apache/ant/antunit/listener/XMLListenerTest.java Tue Apr 8 03:44:46 2008 @@ -0,0 +1,79 @@ +/* + * 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.ant.antunit.listener; + +import org.apache.tools.ant.BuildFileTest; + +/** + * Tests the plain listener. + */ +public class XMLListenerTest extends BuildFileTest { + protected void setUp() throws Exception { + configureProject("src/etc/testcases/listener/xmllistener.xml"); + } + + public void testStdoutPlacement() { + executeTarget("stdoutplacement"); + } + + public void testShowDefault() { + executeTarget("showdefault"); + } + + public void testShowError() { + executeTarget("showerror"); + } + + public void testShowWarning() { + executeTarget("showwarning"); + } + + public void testShowInfo() { + executeTarget("showinfo"); + } + + public void testShowVerbose() { + executeTarget("showverbose"); + } + + public void testShowDebug() { + executeTarget("showdebug"); + } + + public void testShowNone() { + executeTarget("shownone"); + } + + public void testSetUpTearDown() { + executeTarget("setupteardown"); + } + + /* + public void testSuiteSetUpTearDown() { + executeTarget("suitesetupteardown"); + } + */ + + public void testBadCharacters() { + executeTarget("badcharacters"); + } + +} \ No newline at end of file Propchange: ant/antlibs/antunit/trunk/src/tests/junit/org/apache/ant/antunit/listener/XMLListenerTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ant/antlibs/antunit/trunk/src/tests/junit/org/apache/ant/antunit/listener/XMLListenerTest.java ------------------------------------------------------------------------------ svn:executable = *