• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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