1 /* 2 * Copyright (C) 2020 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 android.car.extendedapitest; 17 18 import static com.google.common.truth.Truth.assertThat; 19 20 import android.car.VehiclePropertyIds; 21 import android.car.extendedapitest.testbase.CarLessApiTestBase; 22 import android.hardware.automotive.vehicle.VehicleProperty; 23 import android.util.SparseArray; 24 25 import androidx.test.filters.SmallTest; 26 import androidx.test.runner.AndroidJUnit4; 27 28 import com.android.compatibility.common.util.ApiTest; 29 import com.android.compatibility.common.util.NonApiTest; 30 31 import org.junit.Test; 32 import org.junit.runner.RunWith; 33 34 import java.lang.reflect.Field; 35 import java.lang.reflect.Modifier; 36 import java.util.ArrayList; 37 import java.util.List; 38 import java.util.Objects; 39 import java.util.stream.Collectors; 40 41 @RunWith(AndroidJUnit4.class) 42 @SmallTest 43 public final class VehiclePropertyIdsTest extends CarLessApiTestBase { 44 // IDs that only exist in CarPropertyManager, not VHAL. 45 private static final List<String> MISSING_VHAL_IDS = List.of(); 46 47 // IDs that only exist in VHAL, not exposed by CarPropertyManager. 48 private static final List<String> MISSING_VEHICLE_PROPERTY_IDS = List.of( 49 "CAMERA_SERVICE_CURRENT_STATE", 50 "DISABLED_OPTIONAL_FEATURES", 51 "EVS_SERVICE_REQUEST", 52 "EXTERNAL_CAR_TIME", 53 "HW_KEY_INPUT_V2", 54 "HW_MOTION_INPUT", 55 "HW_CUSTOM_INPUT", 56 "HW_ROTARY_INPUT", 57 "SUPPORT_CUSTOMIZE_VENDOR_PERMISSION", 58 "SUPPORTED_PROPERTY_IDS", 59 "STORAGE_ENCRYPTION_BINDING_SEED", 60 "SHUTDOWN_REQUEST", 61 "VEHICLE_IN_USE", 62 "PER_DISPLAY_MAX_BRIGHTNESS"); 63 64 @Test 65 @NonApiTest(exemptionReasons = {}, justification = "Large number of constant fields") testMatchingVehiclePropertyNamesInVehicleHal()66 public void testMatchingVehiclePropertyNamesInVehicleHal() { 67 List<String> carServiceNames = getListOfConstantNames(VehiclePropertyIds.class); 68 List<String> vhalNames = getListOfConstantNames(VehicleProperty.class); 69 assertThat(vhalNames.size() + MISSING_VHAL_IDS.size()).isEqualTo( 70 carServiceNames.size() + MISSING_VEHICLE_PROPERTY_IDS.size()); 71 72 List<String> expectedCarServiceNames = new ArrayList<>(); 73 for (String vhalName : vhalNames) { 74 if (MISSING_VEHICLE_PROPERTY_IDS.contains(vhalName)) { 75 continue; 76 } 77 if (Objects.equals(vhalName, "ANDROID_EPOCH_TIME")) { 78 // This is renamed in AIDL VHAL. 79 expectedCarServiceNames.add("EPOCH_TIME"); 80 continue; 81 } 82 if (Objects.equals(vhalName, "GENERAL_SAFETY_REGULATION_COMPLIANCE_REQUIREMENT")) { 83 // We renamed this property in Car Service. 84 expectedCarServiceNames.add("GENERAL_SAFETY_REGULATION_COMPLIANCE"); 85 continue; 86 } 87 expectedCarServiceNames.add(vhalName); 88 } 89 90 List<String> filteredCarServiceNames = carServiceNames.stream().filter( 91 name -> !MISSING_VHAL_IDS.contains(name)).collect(Collectors.toList()); 92 93 assertThat(expectedCarServiceNames).containsExactlyElementsIn(filteredCarServiceNames); 94 } 95 96 @Test 97 @NonApiTest(exemptionReasons = {}, justification = "Large number of constant fields") testMatchingVehiclePropertyValuesInVehicleHal()98 public void testMatchingVehiclePropertyValuesInVehicleHal() { 99 List<String> carServiceNames = getListOfConstantNames(VehiclePropertyIds.class); 100 List<String> vhalNames = getListOfConstantNames(VehicleProperty.class); 101 assertThat(vhalNames.size() + MISSING_VHAL_IDS.size()).isEqualTo( 102 carServiceNames.size() + MISSING_VEHICLE_PROPERTY_IDS.size()); 103 104 List<String> mismatchNames = new ArrayList<>(); 105 106 for (String vhalName : vhalNames) { 107 if (MISSING_VEHICLE_PROPERTY_IDS.contains(vhalName)) { 108 continue; 109 } 110 int vhalPropId = getValue(VehicleProperty.class, vhalName); 111 // TODO(b/151168399): VEHICLE_SPEED_DISPLAY_UNITS mismatch between java and hal. 112 if (vhalPropId == VehicleProperty.VEHICLE_SPEED_DISPLAY_UNITS) { 113 continue; 114 } 115 116 String carServiceName = vhalName; 117 if (Objects.equals(carServiceName, "ANDROID_EPOCH_TIME")) { 118 // This is renamed in AIDL VHAL. 119 carServiceName = "EPOCH_TIME"; 120 } 121 if (Objects.equals(carServiceName, 122 "GENERAL_SAFETY_REGULATION_COMPLIANCE_REQUIREMENT")) { 123 // We renamed this property in Car Service. 124 carServiceName = "GENERAL_SAFETY_REGULATION_COMPLIANCE"; 125 continue; 126 } 127 int carServicePropId = getValue(VehiclePropertyIds.class, carServiceName); 128 129 if (vhalPropId != carServicePropId) { 130 mismatchNames.add(vhalName); 131 } 132 } 133 134 assertThat(mismatchNames).isEmpty(); 135 } 136 137 @Test 138 @ApiTest(apis = {"android.car.VehiclePropertyIds#toString"}) testToString()139 public void testToString() { 140 SparseArray<String> propsToString = new SparseArray<>(); 141 142 propsToString.put(3, "0x3"); 143 propsToString.put(VehiclePropertyIds.INVALID, "INVALID"); 144 propsToString.put(VehiclePropertyIds.INFO_VIN, "INFO_VIN"); 145 propsToString.put(VehiclePropertyIds.INFO_MAKE, "INFO_MAKE"); 146 propsToString.put(VehiclePropertyIds.INFO_MODEL, "INFO_MODEL"); 147 propsToString.put(VehiclePropertyIds.INFO_MODEL_YEAR, "INFO_MODEL_YEAR"); 148 propsToString.put(VehiclePropertyIds.INFO_FUEL_CAPACITY, "INFO_FUEL_CAPACITY"); 149 propsToString.put(VehiclePropertyIds.INFO_FUEL_TYPE, "INFO_FUEL_TYPE"); 150 propsToString.put(VehiclePropertyIds.INFO_EV_BATTERY_CAPACITY, "INFO_EV_BATTERY_CAPACITY"); 151 propsToString.put(VehiclePropertyIds.INFO_MULTI_EV_PORT_LOCATIONS, 152 "INFO_MULTI_EV_PORT_LOCATIONS"); 153 propsToString.put(VehiclePropertyIds.INFO_EV_CONNECTOR_TYPE, "INFO_EV_CONNECTOR_TYPE"); 154 propsToString.put(VehiclePropertyIds.INFO_FUEL_DOOR_LOCATION, "INFO_FUEL_DOOR_LOCATION"); 155 propsToString.put(VehiclePropertyIds.INFO_EV_PORT_LOCATION, "INFO_EV_PORT_LOCATION"); 156 propsToString.put(VehiclePropertyIds.INFO_DRIVER_SEAT, "INFO_DRIVER_SEAT"); 157 propsToString.put(VehiclePropertyIds.INFO_EXTERIOR_DIMENSIONS, "INFO_EXTERIOR_DIMENSIONS"); 158 propsToString.put(VehiclePropertyIds.PERF_ODOMETER, "PERF_ODOMETER"); 159 propsToString.put(VehiclePropertyIds.PERF_VEHICLE_SPEED, "PERF_VEHICLE_SPEED"); 160 propsToString.put(VehiclePropertyIds.PERF_VEHICLE_SPEED_DISPLAY, 161 "PERF_VEHICLE_SPEED_DISPLAY"); 162 propsToString.put(VehiclePropertyIds.PERF_STEERING_ANGLE, "PERF_STEERING_ANGLE"); 163 propsToString.put(VehiclePropertyIds.PERF_REAR_STEERING_ANGLE, "PERF_REAR_STEERING_ANGLE"); 164 propsToString.put(VehiclePropertyIds.ENGINE_COOLANT_TEMP, "ENGINE_COOLANT_TEMP"); 165 propsToString.put(VehiclePropertyIds.ENGINE_OIL_LEVEL, "ENGINE_OIL_LEVEL"); 166 propsToString.put(VehiclePropertyIds.ENGINE_OIL_TEMP, "ENGINE_OIL_TEMP"); 167 propsToString.put(VehiclePropertyIds.ENGINE_RPM, "ENGINE_RPM"); 168 propsToString.put(VehiclePropertyIds.WHEEL_TICK, "WHEEL_TICK"); 169 propsToString.put(VehiclePropertyIds.FUEL_LEVEL, "FUEL_LEVEL"); 170 propsToString.put(VehiclePropertyIds.FUEL_DOOR_OPEN, "FUEL_DOOR_OPEN"); 171 propsToString.put(VehiclePropertyIds.EV_BATTERY_LEVEL, "EV_BATTERY_LEVEL"); 172 propsToString.put(VehiclePropertyIds.EV_CHARGE_PORT_OPEN, "EV_CHARGE_PORT_OPEN"); 173 propsToString.put(VehiclePropertyIds.EV_CHARGE_PORT_CONNECTED, "EV_CHARGE_PORT_CONNECTED"); 174 propsToString.put(VehiclePropertyIds.EV_BATTERY_INSTANTANEOUS_CHARGE_RATE, 175 "EV_BATTERY_INSTANTANEOUS_CHARGE_RATE"); 176 propsToString.put(VehiclePropertyIds.RANGE_REMAINING, "RANGE_REMAINING"); 177 propsToString.put(VehiclePropertyIds.TIRE_PRESSURE, "TIRE_PRESSURE"); 178 propsToString.put(VehiclePropertyIds.CRITICALLY_LOW_TIRE_PRESSURE, 179 "CRITICALLY_LOW_TIRE_PRESSURE"); 180 propsToString.put(VehiclePropertyIds.GEAR_SELECTION, "GEAR_SELECTION"); 181 propsToString.put(VehiclePropertyIds.CURRENT_GEAR, "CURRENT_GEAR"); 182 propsToString.put(VehiclePropertyIds.PARKING_BRAKE_ON, "PARKING_BRAKE_ON"); 183 propsToString.put(VehiclePropertyIds.PARKING_BRAKE_AUTO_APPLY, "PARKING_BRAKE_AUTO_APPLY"); 184 propsToString.put(VehiclePropertyIds.FUEL_LEVEL_LOW, "FUEL_LEVEL_LOW"); 185 propsToString.put(VehiclePropertyIds.NIGHT_MODE, "NIGHT_MODE"); 186 propsToString.put(VehiclePropertyIds.TURN_SIGNAL_STATE, "TURN_SIGNAL_STATE"); 187 propsToString.put(VehiclePropertyIds.IGNITION_STATE, "IGNITION_STATE"); 188 propsToString.put(VehiclePropertyIds.ABS_ACTIVE, "ABS_ACTIVE"); 189 propsToString.put(VehiclePropertyIds.TRACTION_CONTROL_ACTIVE, "TRACTION_CONTROL_ACTIVE"); 190 propsToString.put(VehiclePropertyIds.HVAC_FAN_SPEED, "HVAC_FAN_SPEED"); 191 propsToString.put(VehiclePropertyIds.HVAC_FAN_DIRECTION, "HVAC_FAN_DIRECTION"); 192 propsToString.put(VehiclePropertyIds.HVAC_TEMPERATURE_CURRENT, "HVAC_TEMPERATURE_CURRENT"); 193 propsToString.put(VehiclePropertyIds.HVAC_TEMPERATURE_SET, "HVAC_TEMPERATURE_SET"); 194 propsToString.put(VehiclePropertyIds.HVAC_TEMPERATURE_VALUE_SUGGESTION, 195 "HVAC_TEMPERATURE_VALUE_SUGGESTION"); 196 propsToString.put(VehiclePropertyIds.HVAC_DEFROSTER, "HVAC_DEFROSTER"); 197 propsToString.put(VehiclePropertyIds.HVAC_AC_ON, "HVAC_AC_ON"); 198 propsToString.put(VehiclePropertyIds.HVAC_MAX_AC_ON, "HVAC_MAX_AC_ON"); 199 propsToString.put(VehiclePropertyIds.HVAC_MAX_DEFROST_ON, "HVAC_MAX_DEFROST_ON"); 200 propsToString.put(VehiclePropertyIds.HVAC_RECIRC_ON, "HVAC_RECIRC_ON"); 201 propsToString.put(VehiclePropertyIds.HVAC_DUAL_ON, "HVAC_DUAL_ON"); 202 propsToString.put(VehiclePropertyIds.HVAC_AUTO_ON, "HVAC_AUTO_ON"); 203 propsToString.put(VehiclePropertyIds.HVAC_SEAT_TEMPERATURE, "HVAC_SEAT_TEMPERATURE"); 204 propsToString.put(VehiclePropertyIds.HVAC_SIDE_MIRROR_HEAT, "HVAC_SIDE_MIRROR_HEAT"); 205 propsToString.put(VehiclePropertyIds.HVAC_STEERING_WHEEL_HEAT, "HVAC_STEERING_WHEEL_HEAT"); 206 propsToString.put(VehiclePropertyIds.HVAC_TEMPERATURE_DISPLAY_UNITS, 207 "HVAC_TEMPERATURE_DISPLAY_UNITS"); 208 propsToString.put(VehiclePropertyIds.HVAC_ACTUAL_FAN_SPEED_RPM, 209 "HVAC_ACTUAL_FAN_SPEED_RPM"); 210 propsToString.put(VehiclePropertyIds.HVAC_POWER_ON, "HVAC_POWER_ON"); 211 propsToString.put(VehiclePropertyIds.HVAC_FAN_DIRECTION_AVAILABLE, 212 "HVAC_FAN_DIRECTION_AVAILABLE"); 213 propsToString.put(VehiclePropertyIds.HVAC_AUTO_RECIRC_ON, "HVAC_AUTO_RECIRC_ON"); 214 propsToString.put(VehiclePropertyIds.HVAC_SEAT_VENTILATION, "HVAC_SEAT_VENTILATION"); 215 propsToString.put(VehiclePropertyIds.HVAC_ELECTRIC_DEFROSTER_ON, 216 "HVAC_ELECTRIC_DEFROSTER_ON"); 217 propsToString.put(VehiclePropertyIds.DISTANCE_DISPLAY_UNITS, "DISTANCE_DISPLAY_UNITS"); 218 propsToString.put(VehiclePropertyIds.FUEL_VOLUME_DISPLAY_UNITS, 219 "FUEL_VOLUME_DISPLAY_UNITS"); 220 propsToString.put(VehiclePropertyIds.TIRE_PRESSURE_DISPLAY_UNITS, 221 "TIRE_PRESSURE_DISPLAY_UNITS"); 222 propsToString.put(VehiclePropertyIds.EV_BATTERY_DISPLAY_UNITS, "EV_BATTERY_DISPLAY_UNITS"); 223 propsToString.put(VehiclePropertyIds.FUEL_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME, 224 "FUEL_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME"); 225 propsToString.put(VehiclePropertyIds.ENV_OUTSIDE_TEMPERATURE, "ENV_OUTSIDE_TEMPERATURE"); 226 propsToString.put(VehiclePropertyIds.AP_POWER_STATE_REQ, "AP_POWER_STATE_REQ"); 227 propsToString.put(VehiclePropertyIds.AP_POWER_STATE_REPORT, "AP_POWER_STATE_REPORT"); 228 propsToString.put(VehiclePropertyIds.AP_POWER_BOOTUP_REASON, "AP_POWER_BOOTUP_REASON"); 229 propsToString.put(VehiclePropertyIds.DISPLAY_BRIGHTNESS, "DISPLAY_BRIGHTNESS"); 230 propsToString.put(VehiclePropertyIds.HW_KEY_INPUT, "HW_KEY_INPUT"); 231 propsToString.put(VehiclePropertyIds.DOOR_POS, "DOOR_POS"); 232 propsToString.put(VehiclePropertyIds.DOOR_MOVE, "DOOR_MOVE"); 233 propsToString.put(VehiclePropertyIds.DOOR_LOCK, "DOOR_LOCK"); 234 propsToString.put(VehiclePropertyIds.MIRROR_Z_POS, "MIRROR_Z_POS"); 235 propsToString.put(VehiclePropertyIds.MIRROR_Z_MOVE, "MIRROR_Z_MOVE"); 236 propsToString.put(VehiclePropertyIds.MIRROR_Y_POS, "MIRROR_Y_POS"); 237 propsToString.put(VehiclePropertyIds.MIRROR_Y_MOVE, "MIRROR_Y_MOVE"); 238 propsToString.put(VehiclePropertyIds.MIRROR_LOCK, "MIRROR_LOCK"); 239 propsToString.put(VehiclePropertyIds.MIRROR_FOLD, "MIRROR_FOLD"); 240 propsToString.put(VehiclePropertyIds.SEAT_MEMORY_SELECT, "SEAT_MEMORY_SELECT"); 241 propsToString.put(VehiclePropertyIds.SEAT_MEMORY_SET, "SEAT_MEMORY_SET"); 242 propsToString.put(VehiclePropertyIds.SEAT_BELT_BUCKLED, "SEAT_BELT_BUCKLED"); 243 propsToString.put(VehiclePropertyIds.SEAT_BELT_HEIGHT_POS, "SEAT_BELT_HEIGHT_POS"); 244 propsToString.put(VehiclePropertyIds.SEAT_BELT_HEIGHT_MOVE, "SEAT_BELT_HEIGHT_MOVE"); 245 propsToString.put(VehiclePropertyIds.SEAT_FORE_AFT_POS, "SEAT_FORE_AFT_POS"); 246 propsToString.put(VehiclePropertyIds.SEAT_FORE_AFT_MOVE, "SEAT_FORE_AFT_MOVE"); 247 propsToString.put(VehiclePropertyIds.SEAT_BACKREST_ANGLE_1_POS, 248 "SEAT_BACKREST_ANGLE_1_POS"); 249 propsToString.put(VehiclePropertyIds.SEAT_BACKREST_ANGLE_1_MOVE, 250 "SEAT_BACKREST_ANGLE_1_MOVE"); 251 propsToString.put(VehiclePropertyIds.SEAT_BACKREST_ANGLE_2_POS, 252 "SEAT_BACKREST_ANGLE_2_POS"); 253 propsToString.put(VehiclePropertyIds.SEAT_BACKREST_ANGLE_2_MOVE, 254 "SEAT_BACKREST_ANGLE_2_MOVE"); 255 propsToString.put(VehiclePropertyIds.SEAT_HEIGHT_POS, "SEAT_HEIGHT_POS"); 256 propsToString.put(VehiclePropertyIds.SEAT_HEIGHT_MOVE, "SEAT_HEIGHT_MOVE"); 257 propsToString.put(VehiclePropertyIds.SEAT_DEPTH_POS, "SEAT_DEPTH_POS"); 258 propsToString.put(VehiclePropertyIds.SEAT_DEPTH_MOVE, "SEAT_DEPTH_MOVE"); 259 propsToString.put(VehiclePropertyIds.SEAT_TILT_POS, "SEAT_TILT_POS"); 260 propsToString.put(VehiclePropertyIds.SEAT_TILT_MOVE, "SEAT_TILT_MOVE"); 261 propsToString.put(VehiclePropertyIds.SEAT_LUMBAR_FORE_AFT_POS, "SEAT_LUMBAR_FORE_AFT_POS"); 262 propsToString.put(VehiclePropertyIds.SEAT_LUMBAR_FORE_AFT_MOVE, 263 "SEAT_LUMBAR_FORE_AFT_MOVE"); 264 propsToString.put(VehiclePropertyIds.SEAT_LUMBAR_SIDE_SUPPORT_POS, 265 "SEAT_LUMBAR_SIDE_SUPPORT_POS"); 266 propsToString.put(VehiclePropertyIds.SEAT_LUMBAR_SIDE_SUPPORT_MOVE, 267 "SEAT_LUMBAR_SIDE_SUPPORT_MOVE"); 268 propsToString.put(VehiclePropertyIds.SEAT_HEADREST_HEIGHT_POS, "SEAT_HEADREST_HEIGHT_POS"); 269 propsToString.put(VehiclePropertyIds.SEAT_HEADREST_HEIGHT_MOVE, 270 "SEAT_HEADREST_HEIGHT_MOVE"); 271 propsToString.put(VehiclePropertyIds.SEAT_HEADREST_ANGLE_POS, "SEAT_HEADREST_ANGLE_POS"); 272 propsToString.put(VehiclePropertyIds.SEAT_HEADREST_ANGLE_MOVE, "SEAT_HEADREST_ANGLE_MOVE"); 273 propsToString.put(VehiclePropertyIds.SEAT_HEADREST_FORE_AFT_POS, 274 "SEAT_HEADREST_FORE_AFT_POS"); 275 propsToString.put(VehiclePropertyIds.SEAT_HEADREST_FORE_AFT_MOVE, 276 "SEAT_HEADREST_FORE_AFT_MOVE"); 277 propsToString.put(VehiclePropertyIds.SEAT_OCCUPANCY, "SEAT_OCCUPANCY"); 278 propsToString.put(VehiclePropertyIds.WINDOW_POS, "WINDOW_POS"); 279 propsToString.put(VehiclePropertyIds.WINDOW_MOVE, "WINDOW_MOVE"); 280 propsToString.put(VehiclePropertyIds.WINDOW_LOCK, "WINDOW_LOCK"); 281 propsToString.put(VehiclePropertyIds.VEHICLE_MAP_SERVICE, "VEHICLE_MAP_SERVICE"); 282 propsToString.put(VehiclePropertyIds.OBD2_LIVE_FRAME, "OBD2_LIVE_FRAME"); 283 propsToString.put(VehiclePropertyIds.OBD2_FREEZE_FRAME, "OBD2_FREEZE_FRAME"); 284 propsToString.put(VehiclePropertyIds.OBD2_FREEZE_FRAME_INFO, "OBD2_FREEZE_FRAME_INFO"); 285 propsToString.put(VehiclePropertyIds.OBD2_FREEZE_FRAME_CLEAR, "OBD2_FREEZE_FRAME_CLEAR"); 286 propsToString.put(VehiclePropertyIds.HEADLIGHTS_STATE, "HEADLIGHTS_STATE"); 287 propsToString.put(VehiclePropertyIds.HIGH_BEAM_LIGHTS_STATE, "HIGH_BEAM_LIGHTS_STATE"); 288 propsToString.put(VehiclePropertyIds.FOG_LIGHTS_STATE, "FOG_LIGHTS_STATE"); 289 propsToString.put(VehiclePropertyIds.HAZARD_LIGHTS_STATE, "HAZARD_LIGHTS_STATE"); 290 propsToString.put(VehiclePropertyIds.HEADLIGHTS_SWITCH, "HEADLIGHTS_SWITCH"); 291 propsToString.put(VehiclePropertyIds.HIGH_BEAM_LIGHTS_SWITCH, "HIGH_BEAM_LIGHTS_SWITCH"); 292 propsToString.put(VehiclePropertyIds.FOG_LIGHTS_SWITCH, "FOG_LIGHTS_SWITCH"); 293 propsToString.put(VehiclePropertyIds.HAZARD_LIGHTS_SWITCH, "HAZARD_LIGHTS_SWITCH"); 294 propsToString.put(VehiclePropertyIds.CABIN_LIGHTS_STATE, "CABIN_LIGHTS_STATE"); 295 propsToString.put(VehiclePropertyIds.CABIN_LIGHTS_SWITCH, "CABIN_LIGHTS_SWITCH"); 296 propsToString.put(VehiclePropertyIds.READING_LIGHTS_STATE, "READING_LIGHTS_STATE"); 297 propsToString.put(VehiclePropertyIds.READING_LIGHTS_SWITCH, "READING_LIGHTS_SWITCH"); 298 propsToString.put(VehiclePropertyIds.VEHICLE_SPEED_DISPLAY_UNITS, 299 "VEHICLE_SPEED_DISPLAY_UNITS"); 300 propsToString.put(VehiclePropertyIds.INITIAL_USER_INFO, "INITIAL_USER_INFO"); 301 propsToString.put(VehiclePropertyIds.SWITCH_USER, "SWITCH_USER"); 302 propsToString.put(VehiclePropertyIds.CREATE_USER, "CREATE_USER"); 303 propsToString.put(VehiclePropertyIds.REMOVE_USER, "REMOVE_USER"); 304 propsToString.put(VehiclePropertyIds.USER_IDENTIFICATION_ASSOCIATION, 305 "USER_IDENTIFICATION_ASSOCIATION"); 306 propsToString.put(VehiclePropertyIds.POWER_POLICY_REQ, "POWER_POLICY_REQ"); 307 propsToString.put(VehiclePropertyIds.POWER_POLICY_GROUP_REQ, "POWER_POLICY_GROUP_REQ"); 308 propsToString.put(VehiclePropertyIds.CURRENT_POWER_POLICY, "CURRENT_POWER_POLICY"); 309 propsToString.put(VehiclePropertyIds.WATCHDOG_ALIVE, "WATCHDOG_ALIVE"); 310 propsToString.put(VehiclePropertyIds.WATCHDOG_TERMINATED_PROCESS, 311 "WATCHDOG_TERMINATED_PROCESS"); 312 propsToString.put(VehiclePropertyIds.VHAL_HEARTBEAT, "VHAL_HEARTBEAT"); 313 propsToString.put(VehiclePropertyIds.CLUSTER_SWITCH_UI, "CLUSTER_SWITCH_UI"); 314 propsToString.put(VehiclePropertyIds.CLUSTER_DISPLAY_STATE, "CLUSTER_DISPLAY_STATE"); 315 propsToString.put(VehiclePropertyIds.CLUSTER_REPORT_STATE, "CLUSTER_REPORT_STATE"); 316 propsToString.put(VehiclePropertyIds.CLUSTER_REQUEST_DISPLAY, "CLUSTER_REQUEST_DISPLAY"); 317 propsToString.put(VehiclePropertyIds.CLUSTER_NAVIGATION_STATE, "CLUSTER_NAVIGATION_STATE"); 318 propsToString.put(VehiclePropertyIds.EPOCH_TIME, "EPOCH_TIME"); 319 propsToString.put(VehiclePropertyIds.ELECTRONIC_TOLL_COLLECTION_CARD_STATUS, 320 "ELECTRONIC_TOLL_COLLECTION_CARD_STATUS"); 321 propsToString.put(VehiclePropertyIds.ELECTRONIC_TOLL_COLLECTION_CARD_TYPE, 322 "ELECTRONIC_TOLL_COLLECTION_CARD_TYPE"); 323 propsToString.put(VehiclePropertyIds.FRONT_FOG_LIGHTS_STATE, "FRONT_FOG_LIGHTS_STATE"); 324 propsToString.put(VehiclePropertyIds.FRONT_FOG_LIGHTS_SWITCH, "FRONT_FOG_LIGHTS_SWITCH"); 325 propsToString.put(VehiclePropertyIds.REAR_FOG_LIGHTS_STATE, "REAR_FOG_LIGHTS_STATE"); 326 propsToString.put(VehiclePropertyIds.REAR_FOG_LIGHTS_SWITCH, "REAR_FOG_LIGHTS_SWITCH"); 327 propsToString.put(VehiclePropertyIds.EV_CHARGE_CURRENT_DRAW_LIMIT, 328 "EV_CHARGE_CURRENT_DRAW_LIMIT"); 329 propsToString.put(VehiclePropertyIds.EV_CHARGE_PERCENT_LIMIT, "EV_CHARGE_PERCENT_LIMIT"); 330 propsToString.put(VehiclePropertyIds.EV_CHARGE_STATE, "EV_CHARGE_STATE"); 331 propsToString.put(VehiclePropertyIds.EV_CHARGE_SWITCH, "EV_CHARGE_SWITCH"); 332 propsToString.put(VehiclePropertyIds.EV_CHARGE_TIME_REMAINING, "EV_CHARGE_TIME_REMAINING"); 333 propsToString.put(VehiclePropertyIds.EV_REGENERATIVE_BRAKING_STATE, 334 "EV_REGENERATIVE_BRAKING_STATE"); 335 propsToString.put(VehiclePropertyIds.VEHICLE_CURB_WEIGHT, "VEHICLE_CURB_WEIGHT"); 336 propsToString.put(VehiclePropertyIds.TRAILER_PRESENT, "TRAILER_PRESENT"); 337 338 for (int i = 0; i < propsToString.size(); i++) { 339 assertThat(VehiclePropertyIds.toString(propsToString.keyAt(i))).isEqualTo( 340 propsToString.valueAt(i)); 341 } 342 } 343 getListOfConstantNames(Class clazz)344 private static List<String> getListOfConstantNames(Class clazz) { 345 List<String> list = new ArrayList<String>(); 346 for (Field field : clazz.getFields()) { 347 int modifiers = field.getModifiers(); 348 if (Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) { 349 list.add(field.getName()); 350 } 351 } 352 return list; 353 } 354 getValue(Class clazz, String name)355 private static int getValue(Class clazz, String name) { 356 for (Field field : clazz.getFields()) { 357 int modifiers = field.getModifiers(); 358 if (Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers) 359 && field.getName().equals(name)) { 360 try { 361 return field.getInt(null); 362 } catch (IllegalAccessException e) { 363 // ignore 364 } 365 } 366 } 367 return 0; 368 } 369 } 370