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