1 /*
2  * Copyright (C) 2018 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 package com.android.compatibility.common.tradefed.result.suite;
17 
18 import com.android.tradefed.build.IBuildInfo;
19 import com.android.tradefed.invoker.IInvocationContext;
20 import com.android.tradefed.result.suite.SuiteResultHolder;
21 import com.android.tradefed.result.suite.XmlSuiteResultFormatter;
22 
23 import org.xmlpull.v1.XmlPullParser;
24 import org.xmlpull.v1.XmlPullParserException;
25 import org.xmlpull.v1.XmlSerializer;
26 
27 import java.io.IOException;
28 import java.util.HashMap;
29 import java.util.Map;
30 import java.util.Map.Entry;
31 
32 /**
33  * Utility class to save a Compatibility run as an XML.
34  */
35 public class CertificationResultXml extends XmlSuiteResultFormatter {
36 
37     public static final String SUITE_PLAN_ATTR = "suite_plan";
38     private static final String LOG_URL_ATTR = "log_url";
39     private static final String REPORT_VERSION_ATTR = "report_version";
40     private static final String REFERENCE_URL_ATTR = "reference_url";
41     private static final String RESULT_FILE_VERSION = "5.0";
42     private static final String SUITE_NAME_ATTR = "suite_name";
43     private static final String SUITE_VERSION_ATTR = "suite_version";
44     private static final String SUITE_BUILD_ATTR = "suite_build_number";
45     private static final String SUITE_VARIANT_ATTR = "suite_variant";
46 
47     private String mSuiteName;
48     private String mSuiteVersion;
49     private String mSuiteVariant;
50     private String mSuitePlan;
51     private String mSuiteBuild;
52     private String mReferenceUrl;
53     private String mLogUrl;
54     private Map<String, String> mResultAttributes = new HashMap<String, String>();
55 
56     /**
57      * Empty version of the constructor when loading results.
58      */
CertificationResultXml()59     public CertificationResultXml() {}
60 
61     /** Create an XML report specialized for the Compatibility Test cases. */
CertificationResultXml( String suiteName, String suiteVersion, String suiteVariant, String suitePlan, String suiteBuild, String referenceUrl, String logUrl, Map<String, String> resultAttributes)62     public CertificationResultXml(
63             String suiteName,
64             String suiteVersion,
65             String suiteVariant,
66             String suitePlan,
67             String suiteBuild,
68             String referenceUrl,
69             String logUrl,
70             Map<String, String> resultAttributes) {
71         mSuiteName = suiteName;
72         mSuiteVersion = suiteVersion;
73         mSuiteVariant = suiteVariant;
74         mSuitePlan = suitePlan;
75         mSuiteBuild = suiteBuild;
76         mReferenceUrl = referenceUrl;
77         mLogUrl = logUrl;
78         mResultAttributes = resultAttributes;
79     }
80 
81     /**
82      * Add Compatibility specific attributes.
83      */
84     @Override
addSuiteAttributes(XmlSerializer serializer)85     public void addSuiteAttributes(XmlSerializer serializer)
86             throws IllegalArgumentException, IllegalStateException, IOException {
87         serializer.attribute(NS, SUITE_NAME_ATTR, mSuiteName);
88         if (mSuiteVariant != null) {
89             serializer.attribute(NS, SUITE_VARIANT_ATTR, mSuiteVariant);
90         } else {
91             // Default suite_variant to the suite name itself if it's not a special variant.
92             serializer.attribute(NS, SUITE_VARIANT_ATTR, mSuiteName);
93         }
94         serializer.attribute(NS, SUITE_VERSION_ATTR, mSuiteVersion);
95         serializer.attribute(NS, SUITE_PLAN_ATTR, mSuitePlan);
96         serializer.attribute(NS, SUITE_BUILD_ATTR, mSuiteBuild);
97         serializer.attribute(NS, REPORT_VERSION_ATTR, RESULT_FILE_VERSION);
98 
99         if (mReferenceUrl != null) {
100             serializer.attribute(NS, REFERENCE_URL_ATTR, mReferenceUrl);
101         }
102 
103         if (mLogUrl != null) {
104             serializer.attribute(NS, LOG_URL_ATTR, mLogUrl);
105         }
106 
107         if (mResultAttributes != null) {
108             for (Entry<String, String> entry : mResultAttributes.entrySet()) {
109                 serializer.attribute(NS, entry.getKey(), entry.getValue());
110             }
111         }
112     }
113 
114     @Override
parseSuiteAttributes(XmlPullParser parser, IInvocationContext context)115     public void parseSuiteAttributes(XmlPullParser parser, IInvocationContext context)
116             throws XmlPullParserException {
117         mSuiteName = parser.getAttributeValue(NS, SUITE_NAME_ATTR);
118         context.addInvocationAttribute(SUITE_NAME_ATTR, mSuiteName);
119 
120         mSuiteVersion = parser.getAttributeValue(NS, SUITE_VERSION_ATTR);
121         context.addInvocationAttribute(SUITE_VERSION_ATTR, mSuiteVersion);
122 
123         mSuitePlan = parser.getAttributeValue(NS, SUITE_PLAN_ATTR);
124         context.addInvocationAttribute(SUITE_PLAN_ATTR, mSuitePlan);
125 
126         mSuiteBuild = parser.getAttributeValue(NS, SUITE_BUILD_ATTR);
127         context.addInvocationAttribute(SUITE_BUILD_ATTR, mSuiteBuild);
128 
129         mReferenceUrl = parser.getAttributeValue(NS, REFERENCE_URL_ATTR);
130         if (mReferenceUrl != null) {
131             context.addInvocationAttribute(REFERENCE_URL_ATTR, mReferenceUrl);
132         }
133         mLogUrl = parser.getAttributeValue(NS, LOG_URL_ATTR);
134         if (mLogUrl != null) {
135             context.addInvocationAttribute(LOG_URL_ATTR, mLogUrl);
136         }
137     }
138 
139     /**
140      * Add compatibility specific build info attributes.
141      */
142     @Override
addBuildInfoAttributes(XmlSerializer serializer, SuiteResultHolder holder)143     public void addBuildInfoAttributes(XmlSerializer serializer, SuiteResultHolder holder)
144             throws IllegalArgumentException, IllegalStateException, IOException {
145         for (IBuildInfo build : holder.context.getBuildInfos()) {
146             for (String key : build.getBuildAttributes().keySet()) {
147                 if (key.startsWith(getAttributesPrefix())) {
148                     String newKey = key.split(getAttributesPrefix())[1];
149                     serializer.attribute(NS, newKey, build.getBuildAttributes().get(key));
150                 }
151             }
152         }
153     }
154 
155     /**
156      * Parse the information in 'Build' tag.
157      */
158     @Override
parseBuildInfoAttributes(XmlPullParser parser, IInvocationContext context)159     public void parseBuildInfoAttributes(XmlPullParser parser, IInvocationContext context)
160             throws XmlPullParserException {
161         for (int index = 0; index < parser.getAttributeCount(); index++) {
162             String key = parser.getAttributeName(index);
163             String value = parser.getAttributeValue(NS, key);
164             context.addInvocationAttribute(key, value);
165         }
166     }
167 
168     /**
169      * Returns the compatibility prefix for attributes.
170      */
getAttributesPrefix()171     public String getAttributesPrefix() {
172         return "cts:";
173     }
174 }
175