001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 019 package org.apache.geronimo.mavenplugins.testsuite.report; 020 021 import org.apache.maven.reporting.MavenReportException; 022 import org.codehaus.plexus.util.DirectoryScanner; 023 import org.codehaus.plexus.util.StringUtils; 024 import org.xml.sax.SAXException; 025 026 import javax.xml.parsers.ParserConfigurationException; 027 import java.io.File; 028 import java.io.IOException; 029 import java.text.NumberFormat; 030 import java.util.ArrayList; 031 import java.util.HashMap; 032 import java.util.List; 033 import java.util.ListIterator; 034 import java.util.Locale; 035 import java.util.Map; 036 037 public class SurefireReportParser 038 { 039 private NumberFormat numberFormat = NumberFormat.getInstance(); 040 041 private File reportsDirectory; 042 043 private List testSuites = new ArrayList(); 044 045 private Locale locale; 046 047 private static final int PCENT = 100; 048 049 public SurefireReportParser() 050 { 051 } 052 053 public SurefireReportParser( File reportsDirectory, Locale locale ) 054 { 055 this.reportsDirectory = reportsDirectory; 056 057 setLocale( locale ); 058 } 059 060 public List parseXMLReportFiles() 061 throws MavenReportException 062 { 063 if ( reportsDirectory.exists() ) 064 { 065 String[] xmlReportFiles = getIncludedFiles( reportsDirectory, "*.xml", "*.txt" ); 066 067 for ( int index = 0; index < xmlReportFiles.length; index++ ) 068 { 069 ReportTestSuite testSuite = new ReportTestSuite(); 070 071 String currentReport = xmlReportFiles[index]; 072 073 try 074 { 075 testSuite.parse( reportsDirectory + "/" + currentReport ); 076 } 077 catch ( ParserConfigurationException e ) 078 { 079 throw new MavenReportException( "Error setting up parser for JUnit XML report", e ); 080 } 081 catch ( SAXException e ) 082 { 083 throw new MavenReportException( "Error parsing JUnit XML report " + currentReport, e ); 084 } 085 catch ( IOException e ) 086 { 087 throw new MavenReportException( "Error reading JUnit XML report " + currentReport, e ); 088 } 089 090 testSuites.add( testSuite ); 091 } 092 } 093 094 return testSuites; 095 } 096 097 protected String parseTestSuiteName( String lineString ) 098 { 099 return lineString.substring( lineString.lastIndexOf( "." ) + 1, lineString.length() ); 100 } 101 102 protected String parseTestSuitePackageName( String lineString ) 103 { 104 return lineString.substring( lineString.indexOf( ":" ) + 2, lineString.lastIndexOf( "." ) ); 105 } 106 107 protected String parseTestCaseName( String lineString ) 108 { 109 return lineString.substring( 0, lineString.indexOf( "(" ) ); 110 } 111 112 public Map getSummary( List suites ) 113 { 114 Map totalSummary = new HashMap(); 115 116 ListIterator iter = suites.listIterator(); 117 118 int totalNumberOfTests = 0; 119 120 int totalNumberOfErrors = 0; 121 122 int totalNumberOfFailures = 0; 123 124 int totalNumberOfSkipped = 0; 125 126 float totalElapsedTime = 0.0f; 127 128 while ( iter.hasNext() ) 129 { 130 ReportTestSuite suite = (ReportTestSuite) iter.next(); 131 132 totalNumberOfTests += suite.getNumberOfTests(); 133 134 totalNumberOfErrors += suite.getNumberOfErrors(); 135 136 totalNumberOfFailures += suite.getNumberOfFailures(); 137 138 totalNumberOfSkipped += suite.getNumberOfSkipped(); 139 140 totalElapsedTime += suite.getTimeElapsed(); 141 } 142 143 String totalPercentage = computePercentage( totalNumberOfTests, totalNumberOfErrors, totalNumberOfFailures, 144 totalNumberOfSkipped ); 145 146 totalSummary.put( "totalTests", Integer.toString( totalNumberOfTests ) ); 147 148 totalSummary.put( "totalErrors", Integer.toString( totalNumberOfErrors ) ); 149 150 totalSummary.put( "totalFailures", Integer.toString( totalNumberOfFailures ) ); 151 152 totalSummary.put( "totalSkipped", Integer.toString( totalNumberOfSkipped ) ); 153 154 totalSummary.put( "totalElapsedTime", numberFormat.format( totalElapsedTime ) ); 155 156 totalSummary.put( "totalPercentage", totalPercentage ); 157 158 return totalSummary; 159 } 160 161 public void setReportsDirectory( File reportsDirectory ) 162 { 163 this.reportsDirectory = reportsDirectory; 164 } 165 166 public File getReportsDirectory() 167 { 168 return this.reportsDirectory; 169 } 170 171 public final void setLocale( Locale locale ) 172 { 173 this.locale = locale; 174 numberFormat = NumberFormat.getInstance( locale ); 175 } 176 177 public Locale getLocale() 178 { 179 return this.locale; 180 } 181 182 public void setNumberFormat( NumberFormat numberFormat ) 183 { 184 this.numberFormat = numberFormat; 185 } 186 187 public NumberFormat getNumberFormat() 188 { 189 return this.numberFormat; 190 } 191 192 public Map getSuitesGroupByPackage( List testSuitesList ) 193 { 194 ListIterator iter = testSuitesList.listIterator(); 195 196 Map suitePackage = new HashMap(); 197 198 while ( iter.hasNext() ) 199 { 200 ReportTestSuite suite = (ReportTestSuite) iter.next(); 201 202 List suiteList = new ArrayList(); 203 204 if ( suitePackage.get( suite.getPackageName() ) != null ) 205 { 206 suiteList = (List) suitePackage.get( suite.getPackageName() ); 207 } 208 209 suiteList.add( suite ); 210 211 suitePackage.put( suite.getPackageName(), suiteList ); 212 } 213 214 return suitePackage; 215 } 216 217 public String computePercentage( int tests, int errors, int failures, int skipped ) 218 { 219 float percentage; 220 if ( tests == 0 ) 221 { 222 percentage = 0; 223 } 224 else 225 { 226 percentage = ( (float) ( tests - errors - failures - skipped ) / (float) tests ) * PCENT; 227 } 228 229 return numberFormat.format( percentage ); 230 } 231 232 public List getFailureDetails( List testSuitesList ) 233 { 234 ListIterator iter = testSuitesList.listIterator(); 235 236 List failureDetailList = new ArrayList(); 237 238 while ( iter.hasNext() ) 239 { 240 ReportTestSuite suite = (ReportTestSuite) iter.next(); 241 242 List testCaseList = suite.getTestCases(); 243 244 if ( testCaseList != null ) 245 { 246 ListIterator caseIter = testCaseList.listIterator(); 247 248 while ( caseIter.hasNext() ) 249 { 250 ReportTestCase tCase = (ReportTestCase) caseIter.next(); 251 252 if ( tCase.getFailure() != null ) 253 { 254 failureDetailList.add( tCase ); 255 } 256 } 257 } 258 } 259 260 return failureDetailList; 261 } 262 263 private String[] getIncludedFiles( File directory, String includes, String excludes ) 264 { 265 DirectoryScanner scanner = new DirectoryScanner(); 266 267 scanner.setBasedir( directory ); 268 269 scanner.setIncludes( StringUtils.split( includes, "," ) ); 270 271 scanner.setExcludes( StringUtils.split( excludes, "," ) ); 272 273 scanner.scan(); 274 275 return scanner.getIncludedFiles(); 276 } 277 }