1 /* 2 * Copyright (C) 2017 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 17 package com.android.tradefed.util; 18 19 import java.io.InputStream; 20 import java.io.IOException; 21 import java.util.Map; 22 import java.util.NoSuchElementException; 23 24 import com.android.tradefed.build.IBuildInfo; 25 import com.android.tradefed.log.LogUtil.CLog; 26 import com.android.tradefed.util.StreamUtil; 27 28 import org.json.JSONException; 29 import org.json.JSONObject; 30 31 /** 32 * Util to access a VTS config file. 33 */ 34 public class VtsVendorConfigFileUtil { 35 public static final String KEY_VENDOR_TEST_CONFIG_DEFAULT_TYPE = 36 "vts-vendor-config:default-type"; 37 public static final String KEY_VENDOR_TEST_CONFIG_FILE_PATH = "vts-vendor-config:file-path"; 38 public static final String VENDOR_TEST_CONFIG_DEFAULT_TYPE = "prod"; 39 public static final String VENDOR_TEST_CONFIG_FILE_PATH_PROD = 40 "/config/vts-tradefed-vendor-config-prod.json"; 41 public static final String VENDOR_TEST_CONFIG_FILE_PATH_TEST = 42 "/config/vts-tradefed-vendor-config-test.json"; 43 44 private JSONObject vendorConfigJson = null; 45 46 // The path of a VTS vendor config file (format: json). 47 private String mVendorConfigFilePath = null; 48 49 // The default config file type, e.g., `prod` or `test`. 50 private String mDefaultType = VENDOR_TEST_CONFIG_DEFAULT_TYPE; 51 52 /** 53 * Returns the specified vendor config file path. 54 */ GetVendorConfigFilePath()55 public String GetVendorConfigFilePath() { 56 if (mVendorConfigFilePath == null) { 57 if (mDefaultType.toLowerCase().equals(VENDOR_TEST_CONFIG_DEFAULT_TYPE)) { 58 mVendorConfigFilePath = VENDOR_TEST_CONFIG_FILE_PATH_PROD; 59 } else { 60 mVendorConfigFilePath = VENDOR_TEST_CONFIG_FILE_PATH_TEST; 61 } 62 } 63 return mVendorConfigFilePath; 64 } 65 66 /** 67 * Loads a VTS vendor config file. 68 * 69 * @param configPath, the path of a config file. 70 * @throws RuntimeException 71 */ LoadVendorConfig(String configPath)72 public boolean LoadVendorConfig(String configPath) throws RuntimeException { 73 if (configPath == null || configPath.length() == 0) { 74 configPath = GetVendorConfigFilePath(); 75 } 76 CLog.d("Loading vendor test config %s", configPath); 77 InputStream config = getClass().getResourceAsStream(configPath); 78 if (config == null) { 79 CLog.d("Vendor test config file %s does not exist", configPath); 80 return false; 81 } 82 try { 83 String content = StreamUtil.getStringFromStream(config); 84 if (content == null) { 85 CLog.e("Loaded vendor test config is empty"); 86 return false; 87 } 88 CLog.d("Loaded vendor test config %s", content); 89 vendorConfigJson = new JSONObject(content); 90 } catch (IOException e) { 91 throw new RuntimeException("Failed to read vendor config json file"); 92 } catch (JSONException e) { 93 throw new RuntimeException("Failed to parse vendor config json data"); 94 } 95 return true; 96 } 97 98 /** 99 * Loads a VTS vendor config file. 100 * 101 * @param defaultType, The default config file type, e.g., `prod` or `test`. 102 * @param vendorConfigFilePath, The path of a VTS vendor config file (format: json). 103 * @throws RuntimeException 104 */ LoadVendorConfig(String defaultType, String vendorConfigFilePath)105 public boolean LoadVendorConfig(String defaultType, String vendorConfigFilePath) 106 throws RuntimeException { 107 mDefaultType = defaultType; 108 mVendorConfigFilePath = vendorConfigFilePath; 109 return LoadVendorConfig(""); 110 } 111 112 /** 113 * Loads a VTS vendor config file. 114 * 115 * @param defaultType, The default config file type, e.g., `prod` or `test`. 116 * @param vendorConfigFilePath, The path of a VTS vendor config file (format: json). 117 * @throws RuntimeException 118 */ LoadVendorConfig(IBuildInfo buildInfo)119 public boolean LoadVendorConfig(IBuildInfo buildInfo) throws RuntimeException { 120 Map<String, String> attrs = buildInfo.getBuildAttributes(); 121 if (attrs.containsKey(KEY_VENDOR_TEST_CONFIG_DEFAULT_TYPE)) { 122 mDefaultType = attrs.get(KEY_VENDOR_TEST_CONFIG_DEFAULT_TYPE); 123 } else { 124 CLog.d("No default vendor test configuration provided. Defaulting to prod."); 125 } 126 mVendorConfigFilePath = attrs.get(KEY_VENDOR_TEST_CONFIG_FILE_PATH); 127 return LoadVendorConfig(mDefaultType, mVendorConfigFilePath); 128 } 129 130 /** 131 * Gets the value of a config variable. 132 * 133 * @param varName, the name of a variable. 134 * @throws NoSuchElementException 135 */ GetVendorConfigVariable(String varName)136 public String GetVendorConfigVariable(String varName) throws NoSuchElementException { 137 if (vendorConfigJson == null) { 138 CLog.e("Vendor config json file invalid or not yet loaded."); 139 throw new NoSuchElementException("config is empty"); 140 } 141 try { 142 return vendorConfigJson.getString(varName); 143 } catch (JSONException e) { 144 CLog.e("Vendor config file does not define %s", varName); 145 throw new NoSuchElementException("config parsing error"); 146 } 147 } 148 149 /** 150 * Returns the current vendor config json object. 151 */ GetVendorConfigJson()152 public JSONObject GetVendorConfigJson() { 153 return vendorConfigJson; 154 } 155 } 156