165cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot/*
265cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot * Copyright (C) 2010 The Android Open Source Project
365cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot *
465cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot * Licensed under the Apache License, Version 2.0 (the "License");
565cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot * you may not use this file except in compliance with the License.
665cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot * You may obtain a copy of the License at
765cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot *
865cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot *      http://www.apache.org/licenses/LICENSE-2.0
965cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot *
1065cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot * Unless required by applicable law or agreed to in writing, software
1165cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot * distributed under the License is distributed on an "AS IS" BASIS,
1265cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot * See the License for the specific language governing permissions and
1465cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot * limitations under the License.
1565cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot */
1665cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabotpackage com.android.cts.tradefed.result;
1765cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot
1892423df543c8e11070c57585a6450e7f4e9a1a42Stuart Scottimport com.android.compatibility.common.util.AbiUtils;
19770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabotimport com.android.cts.tradefed.build.CtsBuildProvider;
201569c2021bb6328de6a21bacfad3941789c49debBrett Chabotimport com.android.tradefed.log.LogUtil.CLog;
211569c2021bb6328de6a21bacfad3941789c49debBrett Chabot
221569c2021bb6328de6a21bacfad3941789c49debBrett Chabotimport org.kxml2.io.KXmlSerializer;
2365cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabotimport org.xmlpull.v1.XmlPullParser;
2465cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabotimport org.xmlpull.v1.XmlPullParserException;
2565cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot
2665cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabotimport java.io.IOException;
27770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabotimport java.net.InetAddress;
28770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabotimport java.net.UnknownHostException;
2965cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabotimport java.util.ArrayList;
301569c2021bb6328de6a21bacfad3941789c49debBrett Chabotimport java.util.Collection;
311569c2021bb6328de6a21bacfad3941789c49debBrett Chabotimport java.util.Collections;
321569c2021bb6328de6a21bacfad3941789c49debBrett Chabotimport java.util.Comparator;
331569c2021bb6328de6a21bacfad3941789c49debBrett Chabotimport java.util.LinkedHashMap;
3465cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabotimport java.util.List;
351569c2021bb6328de6a21bacfad3941789c49debBrett Chabotimport java.util.Map;
3665cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot
3765cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot/**
3865cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot * Data structure for the detailed CTS test results.
3965cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot * <p/>
4065cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot * Can deserialize results for test packages from XML
4165cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot */
4265cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabotclass TestResults extends AbstractXmlPullParser {
4365cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot
44770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot    private static final String ns = CtsXmlResultReporter.ns;
45770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot
46770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot    // XML constants
47770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot    static final String SUMMARY_TAG = "Summary";
48770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot    static final String PASS_ATTR = "pass";
49770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot    static final String TIMEOUT_ATTR = "timeout";
50770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot    static final String NOT_EXECUTED_ATTR = "notExecuted";
51770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot    static final String FAILED_ATTR = "failed";
52770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot
53e00a2b8d92832236fc647d74acf21b7f4b35677bStuart Scott    private Map<String, TestPackageResult> mPackageResults =
54770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot            new LinkedHashMap<String, TestPackageResult>();
55770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot    private DeviceInfoResult mDeviceInfo = new DeviceInfoResult();
5665cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot
5765cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot    /**
5865cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot     * {@inheritDoc}
5965cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot     */
6065cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot    @Override
6165cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot    void parse(XmlPullParser parser) throws XmlPullParserException, IOException {
6265cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot        int eventType = parser.getEventType();
6365cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot        while (eventType != XmlPullParser.END_DOCUMENT) {
6465cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot            if (eventType == XmlPullParser.START_TAG && parser.getName().equals(
65770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot                    DeviceInfoResult.TAG)) {
66770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot                mDeviceInfo.parse(parser);
67770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot            }
68770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot            if (eventType == XmlPullParser.START_TAG && parser.getName().equals(
6965cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot                    TestPackageResult.TAG)) {
7065cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot                TestPackageResult pkg = new TestPackageResult();
7165cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot                pkg.parse(parser);
72e00a2b8d92832236fc647d74acf21b7f4b35677bStuart Scott                if (pkg.getId() != null) {
73e00a2b8d92832236fc647d74acf21b7f4b35677bStuart Scott                    mPackageResults.put(pkg.getId(), pkg);
741569c2021bb6328de6a21bacfad3941789c49debBrett Chabot                } else {
75e00a2b8d92832236fc647d74acf21b7f4b35677bStuart Scott                    CLog.w("Found package with no id");
761569c2021bb6328de6a21bacfad3941789c49debBrett Chabot                }
7765cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot            }
7865cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot            eventType = parser.next();
7965cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot        }
8065cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot    }
8165cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot
8265cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot    /**
831569c2021bb6328de6a21bacfad3941789c49debBrett Chabot     * @return the list of {@link TestPackageResult}.
841569c2021bb6328de6a21bacfad3941789c49debBrett Chabot     */
851569c2021bb6328de6a21bacfad3941789c49debBrett Chabot    public Collection<TestPackageResult> getPackages() {
86e00a2b8d92832236fc647d74acf21b7f4b35677bStuart Scott        return mPackageResults.values();
871569c2021bb6328de6a21bacfad3941789c49debBrett Chabot    }
881569c2021bb6328de6a21bacfad3941789c49debBrett Chabot
891569c2021bb6328de6a21bacfad3941789c49debBrett Chabot    /**
901569c2021bb6328de6a21bacfad3941789c49debBrett Chabot     * Count the number of tests with given status
91e00a2b8d92832236fc647d74acf21b7f4b35677bStuart Scott     * @param status
921569c2021bb6328de6a21bacfad3941789c49debBrett Chabot     */
931569c2021bb6328de6a21bacfad3941789c49debBrett Chabot    public int countTests(CtsTestStatus status) {
941569c2021bb6328de6a21bacfad3941789c49debBrett Chabot        int total = 0;
95e00a2b8d92832236fc647d74acf21b7f4b35677bStuart Scott        for (TestPackageResult result : mPackageResults.values()) {
961569c2021bb6328de6a21bacfad3941789c49debBrett Chabot            total += result.countTests(status);
971569c2021bb6328de6a21bacfad3941789c49debBrett Chabot        }
981569c2021bb6328de6a21bacfad3941789c49debBrett Chabot        return total;
991569c2021bb6328de6a21bacfad3941789c49debBrett Chabot    }
1001569c2021bb6328de6a21bacfad3941789c49debBrett Chabot
1011569c2021bb6328de6a21bacfad3941789c49debBrett Chabot    /**
102770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot     * Serialize the test results to XML.
103770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot     *
104770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot     * @param serializer
105770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot     * @throws IOException
1061569c2021bb6328de6a21bacfad3941789c49debBrett Chabot     */
107b95b1c8df98f41407cb7167fe81dc72fab696e3cStuart Scott    public void serialize(KXmlSerializer serializer, String buildId) throws IOException {
108770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        mDeviceInfo.serialize(serializer);
109b95b1c8df98f41407cb7167fe81dc72fab696e3cStuart Scott        serializeHostInfo(serializer, buildId);
110770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializeTestSummary(serializer);
111770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        // sort before serializing
112e00a2b8d92832236fc647d74acf21b7f4b35677bStuart Scott        List<TestPackageResult> pkgs = new ArrayList<TestPackageResult>(mPackageResults.values());
113770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        Collections.sort(pkgs, new PkgComparator());
114770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        for (TestPackageResult r : pkgs) {
115770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot            r.serialize(serializer);
116770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        }
1171569c2021bb6328de6a21bacfad3941789c49debBrett Chabot    }
1181569c2021bb6328de6a21bacfad3941789c49debBrett Chabot
1191569c2021bb6328de6a21bacfad3941789c49debBrett Chabot    /**
120770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot     * Output the host info XML.
121770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot     *
122770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot     * @param serializer
1231569c2021bb6328de6a21bacfad3941789c49debBrett Chabot     */
124b95b1c8df98f41407cb7167fe81dc72fab696e3cStuart Scott    private void serializeHostInfo(KXmlSerializer serializer, String buildId) throws IOException {
125770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.startTag(ns, "HostInfo");
126770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot
127770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        String hostName = "";
128770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        try {
129770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot            hostName = InetAddress.getLocalHost().getHostName();
130770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        } catch (UnknownHostException ignored) {}
131770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.attribute(ns, "name", hostName);
132770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot
133770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.startTag(ns, "Os");
134770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.attribute(ns, "name", System.getProperty("os.name"));
135770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.attribute(ns, "version", System.getProperty("os.version"));
136770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.attribute(ns, "arch", System.getProperty("os.arch"));
137770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.endTag(ns, "Os");
138770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot
139770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.startTag(ns, "Java");
140770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.attribute(ns, "name", System.getProperty("java.vendor"));
141770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.attribute(ns, "version", System.getProperty("java.version"));
142770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.endTag(ns, "Java");
143770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot
144770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.startTag(ns, "Cts");
145770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.attribute(ns, "version", CtsBuildProvider.CTS_BUILD_VERSION);
146b95b1c8df98f41407cb7167fe81dc72fab696e3cStuart Scott        serializer.attribute(ns, "build", buildId);
147770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        // TODO: consider outputting other tradefed options here
148770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.startTag(ns, "IntValue");
149770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.attribute(ns, "name", "testStatusTimeoutMs");
150770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        // TODO: create a constant variable for testStatusTimeoutMs value. Currently it cannot be
151770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        // changed
152770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.attribute(ns, "value", "600000");
153770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.endTag(ns, "IntValue");
154770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.endTag(ns, "Cts");
155770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot
156770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.endTag(ns, "HostInfo");
1571569c2021bb6328de6a21bacfad3941789c49debBrett Chabot    }
1581569c2021bb6328de6a21bacfad3941789c49debBrett Chabot
1591569c2021bb6328de6a21bacfad3941789c49debBrett Chabot    /**
160770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot     * Output the test summary XML containing summary totals for all tests.
161770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot     *
1621569c2021bb6328de6a21bacfad3941789c49debBrett Chabot     * @param serializer
1631569c2021bb6328de6a21bacfad3941789c49debBrett Chabot     * @throws IOException
1641569c2021bb6328de6a21bacfad3941789c49debBrett Chabot     */
165770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot    private void serializeTestSummary(KXmlSerializer serializer) throws IOException {
166770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.startTag(ns, SUMMARY_TAG);
167770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.attribute(ns, FAILED_ATTR, Integer.toString(countTests(CtsTestStatus.FAIL)));
168770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.attribute(ns, NOT_EXECUTED_ATTR,
169770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot                Integer.toString(countTests(CtsTestStatus.NOT_EXECUTED)));
170770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        // ignore timeouts - these are reported as errors
171770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.attribute(ns, TIMEOUT_ATTR, "0");
172770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.attribute(ns, PASS_ATTR, Integer.toString(countTests(CtsTestStatus.PASS)));
173770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        serializer.endTag(ns, SUMMARY_TAG);
1741569c2021bb6328de6a21bacfad3941789c49debBrett Chabot    }
1751569c2021bb6328de6a21bacfad3941789c49debBrett Chabot
1761569c2021bb6328de6a21bacfad3941789c49debBrett Chabot    private static class PkgComparator implements Comparator<TestPackageResult> {
1771569c2021bb6328de6a21bacfad3941789c49debBrett Chabot
1781569c2021bb6328de6a21bacfad3941789c49debBrett Chabot        @Override
179e00a2b8d92832236fc647d74acf21b7f4b35677bStuart Scott        public int compare(TestPackageResult lhs, TestPackageResult rhs) {
180e00a2b8d92832236fc647d74acf21b7f4b35677bStuart Scott            return lhs.getId().compareTo(rhs.getId());
1811569c2021bb6328de6a21bacfad3941789c49debBrett Chabot        }
1821569c2021bb6328de6a21bacfad3941789c49debBrett Chabot    }
1831569c2021bb6328de6a21bacfad3941789c49debBrett Chabot
1841569c2021bb6328de6a21bacfad3941789c49debBrett Chabot    /**
185e00a2b8d92832236fc647d74acf21b7f4b35677bStuart Scott     * Return existing package with given id. If not found, create a new one.
186e00a2b8d92832236fc647d74acf21b7f4b35677bStuart Scott     * @param id
1871569c2021bb6328de6a21bacfad3941789c49debBrett Chabot     * @return
18865cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot     */
189e00a2b8d92832236fc647d74acf21b7f4b35677bStuart Scott    public TestPackageResult getOrCreatePackage(String id) {
190e00a2b8d92832236fc647d74acf21b7f4b35677bStuart Scott        TestPackageResult pkgResult = mPackageResults.get(id);
1911569c2021bb6328de6a21bacfad3941789c49debBrett Chabot        if (pkgResult == null) {
1921569c2021bb6328de6a21bacfad3941789c49debBrett Chabot            pkgResult = new TestPackageResult();
19378227665cbb060414e45f8f61de02ac496f05f8bStuart Scott            String[] abiAndName = AbiUtils.parseId(id);
19478227665cbb060414e45f8f61de02ac496f05f8bStuart Scott            pkgResult.setAbi(abiAndName[0]);
19578227665cbb060414e45f8f61de02ac496f05f8bStuart Scott            pkgResult.setAppPackageName(abiAndName[1]);
196e00a2b8d92832236fc647d74acf21b7f4b35677bStuart Scott            mPackageResults.put(id, pkgResult);
1971569c2021bb6328de6a21bacfad3941789c49debBrett Chabot        }
1981569c2021bb6328de6a21bacfad3941789c49debBrett Chabot        return pkgResult;
19965cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot    }
200770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot
201770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot    /**
202770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot     * Populate the results with collected device info metrics.
203770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot     * @param runMetrics
204770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot     */
205770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot    public void populateDeviceInfoMetrics(Map<String, String> runMetrics) {
206770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot        mDeviceInfo.populateMetrics(runMetrics);
207770358ebdbafa73653cced292f5f77cdccfbe2aaBrett Chabot    }
20865cd6eff9303eebf0a57c68b42e8a9e44b8771aeBrett Chabot}
209