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}