1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 package org.openoffice.test.common; 22 23 import java.io.File; 24 import java.io.InputStream; 25 import java.text.SimpleDateFormat; 26 import java.util.Date; 27 import java.util.Map.Entry; 28 import java.util.Set; 29 30 import org.junit.Ignore; 31 import org.junit.runner.Description; 32 import org.junit.runner.Result; 33 import org.junit.runner.notification.Failure; 34 import org.junit.runner.notification.RunListener; 35 import org.w3c.dom.Document; 36 import org.w3c.dom.Element; 37 import org.w3c.dom.NodeList; 38 39 /** 40 * Generate XML test report 41 * 42 */ 43 public class XMLReporter extends RunListener { 44 45 private File outputDir = Testspace.getFile("output"); 46 47 private File file = null; 48 49 private Document doc = null; 50 51 private Element testsuiteEl = null; 52 53 private Element testcaseEl = null; 54 55 private String suiteName = null; 56 57 private long suiteStart = 0; 58 59 private long failures = 0; 60 61 private long errors = 0; 62 63 private long tests = 0; 64 65 private long ignored = 0; 66 67 private long testStart = 0; 68 69 @Override 70 public void testStarted(Description description) throws Exception { 71 // if (!description.getClassName().equals(testClassName)) { 72 // finishSuite(); 73 // startSuite(description); 74 // testClassName = description.getClassName(); 75 // } 76 testcaseEl = doc.createElement("testcase"); 77 testcaseEl.setAttribute("name", description.getDisplayName()); 78 testcaseEl.setAttribute("classname", description.getClassName()); 79 testcaseEl.setAttribute("methodname", description.getMethodName()); 80 testsuiteEl.appendChild(testcaseEl); 81 testStart = System.currentTimeMillis(); 82 } 83 84 @Override 85 public void testAssumptionFailure(Failure failure) { 86 87 } 88 89 @Override 90 public void testFailure(Failure failure) throws Exception { 91 if (failure.getException() instanceof AssertionError) { 92 failures++; 93 Element failureEl = doc.createElement("failure"); 94 failureEl.setAttribute("message", failure.getMessage()); 95 failureEl.setAttribute("type", failure.getTestHeader()); 96 failureEl.setTextContent(failure.getTrace()); 97 testcaseEl.appendChild(failureEl); 98 } else { 99 errors++; 100 Element errorEl = doc.createElement("error"); 101 errorEl.setAttribute("message", failure.getMessage()); 102 errorEl.setAttribute("type", failure.getTestHeader()); 103 errorEl.setTextContent(failure.getTrace()); 104 testcaseEl.appendChild(errorEl); 105 } 106 } 107 108 @Override 109 public void testFinished(Description description) throws Exception { 110 tests++; 111 testcaseEl.setAttribute("time", Double.toString((System.currentTimeMillis() - testStart) / 1000.0)); 112 store(); 113 } 114 115 @Override 116 public void testIgnored(Description description) throws Exception { 117 testStarted(description); 118 ignored++; 119 Ignore ignore = description.getAnnotation(Ignore.class); 120 Element ignoredEl = doc.createElement("ignored"); 121 ignoredEl.setAttribute("message", ignore.value()); 122 testcaseEl.appendChild(ignoredEl); 123 testFinished(description); 124 } 125 126 @Override 127 public void testRunFinished(Result result) throws Exception { 128 finishSuite(); 129 File outputBackupDir = new File(outputDir.getAbsolutePath() + "." + suiteName); 130 if (outputBackupDir.exists()) { 131 outputBackupDir.renameTo(new File(outputBackupDir.getAbsolutePath() + "." + System.currentTimeMillis())); 132 FileUtil.deleteFile(outputBackupDir); 133 } 134 135 outputDir.renameTo(outputBackupDir); 136 } 137 138 @Override 139 public void testRunStarted(Description description) throws Exception { 140 suiteName = description.getDisplayName(); 141 FileUtil.deleteFile(outputDir);//clear all old output 142 startSuite(); 143 } 144 145 private void startSuite() { 146 suiteStart = System.currentTimeMillis(); 147 failures = 0; 148 errors = 0; 149 tests = 0; 150 ignored = 0; 151 152 file = new File(outputDir, "result.xml"); 153 doc = FileUtil.newXML(); 154 155 testsuiteEl = doc.createElement("testsuite"); 156 testsuiteEl.setAttribute("name", suiteName); 157 testsuiteEl.setAttribute("start", Long.toString(suiteStart)); 158 doc.appendChild(testsuiteEl); 159 } 160 161 private void finishSuite() { 162 store(); 163 } 164 165 private void store() { 166 if (doc != null) { 167 testsuiteEl.setAttribute("time", Double.toString((System.currentTimeMillis() - testStart) / 1000.0)); 168 testsuiteEl.setAttribute("failures", Long.toString(failures)); 169 testsuiteEl.setAttribute("errors", Long.toString(errors)); 170 testsuiteEl.setAttribute("tests", Long.toString(tests)); 171 testsuiteEl.setAttribute("ignored", Long.toString(ignored)); 172 NodeList els = testsuiteEl.getElementsByTagName("properties"); 173 if (els.getLength() > 0) 174 testsuiteEl.removeChild(els.item(0)); 175 176 Element props = doc.createElement("properties"); 177 testsuiteEl.appendChild(props); 178 // Add some extra information 179 System.setProperty("info.os.name", SystemUtil.getOSName()); 180 System.setProperty("info.os.version", SystemUtil.getOSVersion()); 181 System.setProperty("info.os.arch", SystemUtil.getOSArch()); 182 String ipaddrStr = SystemUtil.getIPAddress(); 183 System.setProperty("info.ip", (ipaddrStr!=null) ? ipaddrStr : "UNKNOWN"); 184 String hostnameStr = SystemUtil.getHostName(); 185 System.setProperty("info.hostname", (hostnameStr!=null) ? hostnameStr : "UNKNOWN"); 186 Set<Entry<Object, Object>> entries = System.getProperties().entrySet(); 187 for (Entry<Object, Object> e : entries) { 188 Element prop = doc.createElement("property"); 189 prop.setAttribute("name", "" + e.getKey()); 190 prop.setAttribute("value", "" + e.getValue()); 191 props.appendChild(prop); 192 } 193 194 SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd HH-mm-ss"); 195 System.setProperty( "info.test.date", dateFormat.format( new Date())); 196 197 FileUtil.storeXML(doc, file); 198 File htmlFile = new File(outputDir, "result.html"); 199 InputStream is = getClass().getResourceAsStream("XMLReporter.xsl"); 200 if (is != null) { 201 FileUtil.storeXML(doc, htmlFile, is); 202 } 203 } 204 } 205 206 } 207 208