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