1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package vogar; 18 19 import com.google.common.collect.ImmutableSet; 20 import java.io.File; 21 import java.io.FileInputStream; 22 import java.io.FileReader; 23 import java.io.IOException; 24 import java.text.ParseException; 25 import java.text.SimpleDateFormat; 26 import java.util.ArrayList; 27 import java.util.Collection; 28 import java.util.Date; 29 import java.util.HashMap; 30 import java.util.Map; 31 import java.util.Set; 32 import java.util.TimeZone; 33 import org.kxml2.io.KXmlParser; 34 import org.xmlpull.v1.XmlPullParser; 35 import org.xmlpull.v1.XmlPullParserException; 36 37 public final class XmlReportReader { 38 39 private final static Set<String> resultTagNames = ImmutableSet.of( 40 XmlReportConstants.FAILURE, 41 XmlReportConstants.ERROR, 42 XmlReportConstants.SUCCESS); 43 readSuiteReport(File xmlReport)44 public Collection<Outcome> readSuiteReport(File xmlReport) { 45 FileInputStream stream = null; 46 try { 47 stream = new FileInputStream(xmlReport); 48 49 KXmlParser parser = new KXmlParser(); 50 try { 51 parser.setInput(stream, "UTF-8"); 52 parser.setInput(new FileReader(xmlReport)); 53 return readTestSuite(parser); 54 } catch (XmlPullParserException e1) { 55 throw new RuntimeException(e1); 56 } 57 } catch (IOException e) { 58 throw new RuntimeException(e); 59 } finally { 60 if (stream != null) { 61 try { 62 stream.close(); 63 } catch(IOException ignored) { 64 } 65 } 66 } 67 } 68 readTestSuite(KXmlParser parser)69 private Collection<Outcome> readTestSuite(KXmlParser parser) 70 throws XmlPullParserException, IOException { 71 Collection<Outcome> outcomes = new ArrayList<Outcome>(); 72 73 parser.nextTag(); 74 parser.require(XmlPullParser.START_TAG, null, XmlReportConstants.TESTSUITE); 75 Map<String, String> testSuiteAttributes = createAttributeMap(parser); 76 String timestamp = testSuiteAttributes.get(XmlReportConstants.TIMESTAMP); 77 78 parser.nextTag(); 79 parser.require(XmlPullParser.START_TAG, null, XmlReportConstants.PROPERTIES); 80 parser.nextTag(); 81 parser.require(XmlPullParser.END_TAG, null, XmlReportConstants.PROPERTIES); 82 while (parser.nextTag() == XmlPullParser.START_TAG) { 83 parser.require(XmlPullParser.START_TAG, null, XmlReportConstants.TESTCASE); 84 85 Map<String, String> testCaseAttributes = createAttributeMap(parser); 86 String name = testCaseAttributes.get(XmlReportConstants.ATTR_NAME); 87 String classname = testCaseAttributes.get(XmlReportConstants.ATTR_CLASSNAME); 88 89 Result result = Result.SUCCESS; 90 String resultOutput = null; 91 parser.nextTag(); 92 String tagName = parser.getName(); 93 if (resultTagNames.contains(tagName)) { 94 parser.require(XmlPullParser.START_TAG, null, tagName); 95 96 Map<String, String> resultAttributes = createAttributeMap(parser); 97 String type = resultAttributes.get(XmlReportConstants.ATTR_TYPE); 98 result = Result.valueOf(type); 99 100 resultOutput = parser.nextText(); 101 102 parser.require(XmlPullParser.END_TAG, null, tagName); 103 parser.nextTag(); 104 } 105 106 // create outcome! 107 SimpleDateFormat dateFormat = new SimpleDateFormat(XmlReportConstants.DATEFORMAT); 108 dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 109 dateFormat.setLenient(true); 110 Date date; 111 try { 112 date = dateFormat.parse(timestamp); 113 } catch (ParseException e) { 114 throw new RuntimeException(e); 115 } 116 outcomes.add(new Outcome(classname + "#" + name, result, resultOutput, date)); 117 118 parser.require(XmlPullParser.END_TAG, null, XmlReportConstants.TESTCASE); 119 } 120 parser.require(XmlPullParser.END_TAG, null, XmlReportConstants.TESTSUITE); 121 122 return outcomes; 123 } 124 createAttributeMap(KXmlParser parser)125 private Map<String, String> createAttributeMap(KXmlParser parser) { 126 Map<String, String> attributeMap = new HashMap<String, String>(); 127 int attributeCount = parser.getAttributeCount(); 128 for (int i = 0; i < attributeCount; i++) { 129 String attributeName = parser.getAttributeName(i); 130 String attributeValue = parser.getAttributeValue(i); 131 attributeMap.put(attributeName, attributeValue); 132 } 133 return attributeMap; 134 } 135 }