blob: 355641e93362f3af7fdcc7727ca90a515bd843b9 [file] [log] [blame]
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.car.cts;
import static android.car.cts.utils.ShellPermissionUtils.runWithShellPermissionIdentity;
import static android.car.hardware.property.CarPropertyManager.GetPropertyResult;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
import static org.junit.Assume.assumeTrue;
import android.car.Car;
import android.car.EvConnectorType;
import android.car.FuelType;
import android.car.GsrComplianceType;
import android.car.PortLocationType;
import android.car.VehicleAreaSeat;
import android.car.VehicleAreaType;
import android.car.VehicleAreaWheel;
import android.car.VehicleGear;
import android.car.VehicleIgnitionState;
import android.car.VehiclePropertyIds;
import android.car.VehicleUnit;
import android.car.annotation.ApiRequirements;
import android.car.cts.utils.VehiclePropertyVerifier;
import android.car.hardware.CarPropertyConfig;
import android.car.hardware.CarPropertyValue;
import android.car.hardware.property.CarPropertyManager;
import android.car.hardware.property.CarPropertyManager.CarPropertyEventCallback;
import android.car.hardware.property.EvChargeState;
import android.car.hardware.property.EvRegenerativeBrakingState;
import android.car.hardware.property.EvStoppingMode;
import android.car.hardware.property.VehicleElectronicTollCollectionCardStatus;
import android.car.hardware.property.VehicleElectronicTollCollectionCardType;
import android.car.hardware.property.VehicleLightState;
import android.car.hardware.property.VehicleLightSwitch;
import android.car.hardware.property.VehicleTurnSignal;
import android.car.test.ApiCheckerRule.Builder;
import android.os.SystemClock;
import android.platform.test.annotations.AppModeFull;
import android.platform.test.annotations.RequiresDevice;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.ArraySet;
import android.util.Log;
import android.util.SparseArray;
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.test.runner.AndroidJUnit4;
import com.android.compatibility.common.util.ApiTest;
import com.android.compatibility.common.util.CddTest;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@SmallTest
@RequiresDevice
@RunWith(AndroidJUnit4.class)
@AppModeFull(reason = "Instant apps cannot get car related permissions.")
public final class CarPropertyManagerTest extends AbstractCarTestCase {
private static final String TAG = CarPropertyManagerTest.class.getSimpleName();
private static final long WAIT_CALLBACK = 1500L;
private static final int NO_EVENTS = 0;
private static final int ONCHANGE_RATE_EVENT_COUNTER = 1;
private static final int UI_RATE_EVENT_COUNTER = 5;
private static final int FAST_OR_FASTEST_EVENT_COUNTER = 10;
private static final long ASYNC_WAIT_TIMEOUT_IN_SEC = 15_000;
private static final ImmutableSet<Integer> PORT_LOCATION_TYPES =
ImmutableSet.<Integer>builder()
.add(
PortLocationType.UNKNOWN,
PortLocationType.FRONT_LEFT,
PortLocationType.FRONT_RIGHT,
PortLocationType.REAR_RIGHT,
PortLocationType.REAR_LEFT,
PortLocationType.FRONT,
PortLocationType.REAR)
.build();
private static final ImmutableSet<Integer> VEHICLE_GEARS =
ImmutableSet.<Integer>builder()
.add(
VehicleGear.GEAR_UNKNOWN,
VehicleGear.GEAR_NEUTRAL,
VehicleGear.GEAR_REVERSE,
VehicleGear.GEAR_PARK,
VehicleGear.GEAR_DRIVE,
VehicleGear.GEAR_FIRST,
VehicleGear.GEAR_SECOND,
VehicleGear.GEAR_THIRD,
VehicleGear.GEAR_FOURTH,
VehicleGear.GEAR_FIFTH,
VehicleGear.GEAR_SIXTH,
VehicleGear.GEAR_SEVENTH,
VehicleGear.GEAR_EIGHTH,
VehicleGear.GEAR_NINTH)
.build();
private static final ImmutableSet<Integer> DISTANCE_DISPLAY_UNITS =
ImmutableSet.<Integer>builder().add(VehicleUnit.MILLIMETER, VehicleUnit.METER,
VehicleUnit.KILOMETER, VehicleUnit.MILE).build();
private static final ImmutableSet<Integer> VOLUME_DISPLAY_UNITS =
ImmutableSet.<Integer>builder().add(VehicleUnit.MILLILITER, VehicleUnit.LITER,
VehicleUnit.US_GALLON, VehicleUnit.IMPERIAL_GALLON).build();
private static final ImmutableSet<Integer> PRESSURE_DISPLAY_UNITS =
ImmutableSet.<Integer>builder().add(VehicleUnit.KILOPASCAL, VehicleUnit.PSI,
VehicleUnit.BAR).build();
private static final ImmutableSet<Integer> BATTERY_DISPLAY_UNITS =
ImmutableSet.<Integer>builder().add(VehicleUnit.WATT_HOUR, VehicleUnit.AMPERE_HOURS,
VehicleUnit.KILOWATT_HOUR).build();
private static final ImmutableSet<Integer> SPEED_DISPLAY_UNITS =
ImmutableSet.<Integer>builder().add(VehicleUnit.METER_PER_SEC,
VehicleUnit.MILES_PER_HOUR, VehicleUnit.KILOMETERS_PER_HOUR).build();
private static final ImmutableSet<Integer> TURN_SIGNAL_STATES =
ImmutableSet.<Integer>builder().add(VehicleTurnSignal.STATE_NONE,
VehicleTurnSignal.STATE_RIGHT, VehicleTurnSignal.STATE_LEFT).build();
private static final ImmutableSet<Integer> VEHICLE_LIGHT_STATES =
ImmutableSet.<Integer>builder().add(VehicleLightState.STATE_OFF,
VehicleLightState.STATE_ON, VehicleLightState.STATE_DAYTIME_RUNNING).build();
private static final ImmutableSet<Integer> VEHICLE_LIGHT_SWITCHES =
ImmutableSet.<Integer>builder().add(VehicleLightSwitch.STATE_OFF,
VehicleLightSwitch.STATE_ON, VehicleLightSwitch.STATE_DAYTIME_RUNNING,
VehicleLightSwitch.STATE_AUTOMATIC).build();
private static final ImmutableSet<Integer> EV_STOPPING_MODES =
ImmutableSet.<Integer>builder().add(EvStoppingMode.STATE_OTHER,
EvStoppingMode.STATE_CREEP, EvStoppingMode.STATE_ROLL,
EvStoppingMode.STATE_HOLD).build();
private static final ImmutableSet<Integer> HVAC_TEMPERATURE_DISPLAY_UNITS =
ImmutableSet.<Integer>builder().add(VehicleUnit.CELSIUS,
VehicleUnit.FAHRENHEIT).build();
private static final ImmutableSet<Integer> SINGLE_HVAC_FAN_DIRECTIONS = ImmutableSet.of(
/*VehicleHvacFanDirection.FACE=*/0x1, /*VehicleHvacFanDirection.FLOOR=*/0x2,
/*VehicleHvacFanDirection.DEFROST=*/0x4);
private static final ImmutableSet<Integer> ALL_POSSIBLE_HVAC_FAN_DIRECTIONS =
generateAllPossibleHvacFanDirections();
private static final ImmutableSet<Integer> VEHICLE_SEAT_OCCUPANCY_STATES = ImmutableSet.of(
/*VehicleSeatOccupancyState.UNKNOWN=*/0, /*VehicleSeatOccupancyState.VACANT=*/1,
/*VehicleSeatOccupancyState.OCCUPIED=*/2);
private static final ImmutableList<Integer>
PERMISSION_READ_DRIVER_MONITORING_SETTINGS_PROPERTIES = ImmutableList.<Integer>builder()
.add(
VehiclePropertyIds.HANDS_ON_DETECTION_ENABLED,
VehiclePropertyIds.DRIVER_ATTENTION_MONITORING_ENABLED)
.build();
private static final ImmutableList<Integer>
PERMISSION_CONTROL_DRIVER_MONITORING_SETTINGS_PROPERTIES =
ImmutableList.<Integer>builder()
.add(
VehiclePropertyIds.HANDS_ON_DETECTION_ENABLED,
VehiclePropertyIds.DRIVER_ATTENTION_MONITORING_ENABLED)
.build();
private static final ImmutableList<Integer>
PERMISSION_READ_DRIVER_MONITORING_STATES_PROPERTIES = ImmutableList.<Integer>builder()
.add()
.build();
private static final ImmutableList<Integer> PERMISSION_CAR_ENERGY_PROPERTIES =
ImmutableList.<Integer>builder()
.add(
VehiclePropertyIds.FUEL_LEVEL,
VehiclePropertyIds.EV_BATTERY_LEVEL,
VehiclePropertyIds.EV_CURRENT_BATTERY_CAPACITY,
VehiclePropertyIds.EV_BATTERY_INSTANTANEOUS_CHARGE_RATE,
VehiclePropertyIds.RANGE_REMAINING,
VehiclePropertyIds.FUEL_LEVEL_LOW,
VehiclePropertyIds.EV_CHARGE_CURRENT_DRAW_LIMIT,
VehiclePropertyIds.EV_CHARGE_PERCENT_LIMIT,
VehiclePropertyIds.EV_CHARGE_STATE,
VehiclePropertyIds.EV_CHARGE_SWITCH,
VehiclePropertyIds.EV_CHARGE_TIME_REMAINING,
VehiclePropertyIds.EV_REGENERATIVE_BRAKING_STATE)
.build();
private static final ImmutableList<Integer> PERMISSION_CAR_ENERGY_PORTS_PROPERTIES =
ImmutableList.<Integer>builder()
.add(
VehiclePropertyIds.FUEL_DOOR_OPEN,
VehiclePropertyIds.EV_CHARGE_PORT_OPEN,
VehiclePropertyIds.EV_CHARGE_PORT_CONNECTED)
.build();
private static final ImmutableList<Integer> PERMISSION_CAR_EXTERIOR_ENVIRONMENT_PROPERTIES =
ImmutableList.<Integer>builder()
.add(VehiclePropertyIds.NIGHT_MODE, VehiclePropertyIds.ENV_OUTSIDE_TEMPERATURE)
.build();
private static final ImmutableList<Integer> PERMISSION_CAR_INFO_PROPERTIES =
ImmutableList.<Integer>builder()
.add(
VehiclePropertyIds.INFO_MAKE,
VehiclePropertyIds.INFO_MODEL,
VehiclePropertyIds.INFO_MODEL_YEAR,
VehiclePropertyIds.INFO_FUEL_CAPACITY,
VehiclePropertyIds.INFO_FUEL_TYPE,
VehiclePropertyIds.INFO_EV_BATTERY_CAPACITY,
VehiclePropertyIds.INFO_EV_CONNECTOR_TYPE,
VehiclePropertyIds.INFO_FUEL_DOOR_LOCATION,
VehiclePropertyIds.INFO_MULTI_EV_PORT_LOCATIONS,
VehiclePropertyIds.INFO_EV_PORT_LOCATION,
VehiclePropertyIds.INFO_DRIVER_SEAT,
VehiclePropertyIds.INFO_EXTERIOR_DIMENSIONS,
VehiclePropertyIds.ELECTRONIC_TOLL_COLLECTION_CARD_TYPE,
VehiclePropertyIds.ELECTRONIC_TOLL_COLLECTION_CARD_STATUS,
VehiclePropertyIds.GENERAL_SAFETY_REGULATION_COMPLIANCE)
.build();
private static final ImmutableList<Integer> PERMISSION_CAR_POWERTRAIN_PROPERTIES =
ImmutableList.<Integer>builder()
.add(
VehiclePropertyIds.GEAR_SELECTION,
VehiclePropertyIds.CURRENT_GEAR,
VehiclePropertyIds.PARKING_BRAKE_ON,
VehiclePropertyIds.PARKING_BRAKE_AUTO_APPLY,
VehiclePropertyIds.IGNITION_STATE,
VehiclePropertyIds.EV_BRAKE_REGENERATION_LEVEL,
VehiclePropertyIds.EV_STOPPING_MODE)
.build();
private static final ImmutableList<Integer> PERMISSION_CONTROL_CAR_POWERTRAIN_PROPERTIES =
ImmutableList.<Integer>builder()
.add(
VehiclePropertyIds.EV_BRAKE_REGENERATION_LEVEL,
VehiclePropertyIds.EV_STOPPING_MODE)
.build();
private static final ImmutableList<Integer> PERMISSION_CAR_SPEED_PROPERTIES =
ImmutableList.<Integer>builder()
.add(
VehiclePropertyIds.PERF_VEHICLE_SPEED,
VehiclePropertyIds.PERF_VEHICLE_SPEED_DISPLAY,
VehiclePropertyIds.WHEEL_TICK)
.build();
private static final ImmutableList<Integer> PERMISSION_READ_CAR_DISPLAY_UNITS_PROPERTIES =
ImmutableList.<Integer>builder()
.add(
VehiclePropertyIds.DISTANCE_DISPLAY_UNITS,
VehiclePropertyIds.FUEL_VOLUME_DISPLAY_UNITS,
VehiclePropertyIds.TIRE_PRESSURE_DISPLAY_UNITS,
VehiclePropertyIds.EV_BATTERY_DISPLAY_UNITS,
VehiclePropertyIds.VEHICLE_SPEED_DISPLAY_UNITS,
VehiclePropertyIds.FUEL_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME)
.build();
private static final ImmutableList<Integer> PERMISSION_CONTROL_CAR_STEERING_WHEEL_PROPERTIES =
ImmutableList.<Integer>builder()
.add(
VehiclePropertyIds.STEERING_WHEEL_DEPTH_POS,
VehiclePropertyIds.STEERING_WHEEL_DEPTH_MOVE,
VehiclePropertyIds.STEERING_WHEEL_HEIGHT_POS,
VehiclePropertyIds.STEERING_WHEEL_HEIGHT_MOVE,
VehiclePropertyIds.STEERING_WHEEL_THEFT_LOCK_ENABLED,
VehiclePropertyIds.STEERING_WHEEL_LOCKED,
VehiclePropertyIds.STEERING_WHEEL_EASY_ACCESS_ENABLED)
.build();
private static final ImmutableList<Integer> PERMISSION_READ_ADAS_SETTINGS_PROPERTIES =
ImmutableList.<Integer>builder()
.add(
VehiclePropertyIds.AUTOMATIC_EMERGENCY_BRAKING_ENABLED,
VehiclePropertyIds.FORWARD_COLLISION_WARNING_ENABLED,
VehiclePropertyIds.BLIND_SPOT_WARNING_ENABLED,
VehiclePropertyIds.LANE_DEPARTURE_WARNING_ENABLED,
VehiclePropertyIds.LANE_KEEP_ASSIST_ENABLED,
VehiclePropertyIds.LANE_CENTERING_ASSIST_ENABLED,
VehiclePropertyIds.EMERGENCY_LANE_KEEP_ASSIST_ENABLED,
VehiclePropertyIds.ADAPTIVE_CRUISE_CONTROL_ENABLED)
.build();
private static final ImmutableList<Integer> PERMISSION_CONTROL_ADAS_SETTINGS_PROPERTIES =
ImmutableList.<Integer>builder()
.add(
VehiclePropertyIds.AUTOMATIC_EMERGENCY_BRAKING_ENABLED,
VehiclePropertyIds.FORWARD_COLLISION_WARNING_ENABLED,
VehiclePropertyIds.BLIND_SPOT_WARNING_ENABLED,
VehiclePropertyIds.LANE_DEPARTURE_WARNING_ENABLED,
VehiclePropertyIds.LANE_KEEP_ASSIST_ENABLED,
VehiclePropertyIds.LANE_CENTERING_ASSIST_ENABLED,
VehiclePropertyIds.EMERGENCY_LANE_KEEP_ASSIST_ENABLED,
VehiclePropertyIds.ADAPTIVE_CRUISE_CONTROL_ENABLED)
.build();
private static final ImmutableList<Integer> PERMISSION_READ_ADAS_STATES_PROPERTIES =
ImmutableList.<Integer>builder()
.add()
.build();
private static final ImmutableList<Integer> PERMISSION_CONTROL_ADAS_STATES_PROPERTIES =
ImmutableList.<Integer>builder()
.add()
.build();
/** contains property Ids for the properties required by CDD */
private final ArraySet<Integer> mPropertyIds = new ArraySet<>();
private CarPropertyManager mCarPropertyManager;
private static ImmutableSet<Integer> generateAllPossibleHvacFanDirections() {
ImmutableSet.Builder<Integer> allPossibleFanDirectionsBuilder = ImmutableSet.builder();
for (int i = 1; i <= SINGLE_HVAC_FAN_DIRECTIONS.size(); i++) {
allPossibleFanDirectionsBuilder.addAll(Sets.combinations(SINGLE_HVAC_FAN_DIRECTIONS,
i).stream().map(hvacFanDirectionCombo -> {
Integer possibleHvacFanDirection = 0;
for (Integer hvacFanDirection : hvacFanDirectionCombo) {
possibleHvacFanDirection |= hvacFanDirection;
}
return possibleHvacFanDirection;
}).collect(Collectors.toList()));
}
return allPossibleFanDirectionsBuilder.build();
}
private static void verifyWheelTickConfigArray(int supportedWheels, int wheelToVerify,
int configArrayIndex, int wheelTicksToUm) {
if ((supportedWheels & wheelToVerify) != 0) {
assertWithMessage(
"WHEEL_TICK configArray["
+ configArrayIndex
+ "] must specify the ticks to micrometers for "
+ wheelToString(wheelToVerify))
.that(wheelTicksToUm)
.isGreaterThan(0);
} else {
assertWithMessage(
"WHEEL_TICK configArray["
+ configArrayIndex
+ "] should be zero since "
+ wheelToString(wheelToVerify)
+ "is not supported")
.that(wheelTicksToUm)
.isEqualTo(0);
}
}
private static void verifyWheelTickValue(
int supportedWheels, int wheelToVerify, int valueIndex, Long ticks) {
if ((supportedWheels & wheelToVerify) == 0) {
assertWithMessage(
"WHEEL_TICK value["
+ valueIndex
+ "] should be zero since "
+ wheelToString(wheelToVerify)
+ "is not supported")
.that(ticks)
.isEqualTo(0);
}
}
private static String wheelToString(int wheel) {
switch (wheel) {
case VehicleAreaWheel.WHEEL_LEFT_FRONT:
return "WHEEL_LEFT_FRONT";
case VehicleAreaWheel.WHEEL_RIGHT_FRONT:
return "WHEEL_RIGHT_FRONT";
case VehicleAreaWheel.WHEEL_RIGHT_REAR:
return "WHEEL_RIGHT_REAR";
case VehicleAreaWheel.WHEEL_LEFT_REAR:
return "WHEEL_LEFT_REAR";
default:
return Integer.toString(wheel);
}
}
// TODO(b/242350638): remove once all tests are annotated
// Also, while fixing those, make sure the proper versions were set in the ApiRequirements
// annotations added to @CddTests
// Finally, make these changes on a child bug of 242350638
@Override
protected void configApiCheckerRule(Builder builder) {
Log.w(TAG, "Disabling API requirements check");
builder.disableAnnotationsCheck();
}
@Before
public void setUp() throws Exception {
mCarPropertyManager = (CarPropertyManager) getCar().getCarManager(Car.PROPERTY_SERVICE);
mPropertyIds.add(VehiclePropertyIds.PERF_VEHICLE_SPEED);
mPropertyIds.add(VehiclePropertyIds.GEAR_SELECTION);
mPropertyIds.add(VehiclePropertyIds.NIGHT_MODE);
mPropertyIds.add(VehiclePropertyIds.PARKING_BRAKE_ON);
}
/**
* Test for {@link CarPropertyManager#getPropertyList()}
*/
@Test
public void testGetPropertyList() {
List<CarPropertyConfig> allConfigs = mCarPropertyManager.getPropertyList();
assertThat(allConfigs).isNotNull();
}
/**
* Test for {@link CarPropertyManager#getPropertyList(ArraySet)}
*/
@Test
public void testGetPropertyListWithArraySet() {
runWithShellPermissionIdentity(
() -> {
List<CarPropertyConfig> requiredConfigs =
mCarPropertyManager.getPropertyList(mPropertyIds);
// Vehicles need to implement all of those properties
assertThat(requiredConfigs.size()).isEqualTo(mPropertyIds.size());
},
Car.PERMISSION_EXTERIOR_ENVIRONMENT,
Car.PERMISSION_POWERTRAIN,
Car.PERMISSION_SPEED);
}
/**
* Test for {@link CarPropertyManager#getCarPropertyConfig(int)}
*/
@Test
public void testGetPropertyConfig() {
runWithShellPermissionIdentity(
() -> {
List<CarPropertyConfig> allConfigs = mCarPropertyManager.getPropertyList();
for (CarPropertyConfig cfg : allConfigs) {
assertThat(mCarPropertyManager.getCarPropertyConfig(cfg.getPropertyId()))
.isNotNull();
}
});
}
/**
* Test for {@link CarPropertyManager#getAreaId(int, int)}
*/
@Test
public void testGetAreaId() {
runWithShellPermissionIdentity(
() -> {
// For global properties, getAreaId should always return 0.
List<CarPropertyConfig> allConfigs = mCarPropertyManager.getPropertyList();
for (CarPropertyConfig cfg : allConfigs) {
if (cfg.isGlobalProperty()) {
assertThat(
mCarPropertyManager.getAreaId(
cfg.getPropertyId(),
VehicleAreaSeat.SEAT_ROW_1_LEFT))
.isEqualTo(VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL);
} else {
int[] areaIds = cfg.getAreaIds();
// Because areaId in propConfig must not be overlapped with each other.
// The result should be itself.
for (int areaIdInConfig : areaIds) {
int areaIdByCarPropertyManager =
mCarPropertyManager.getAreaId(
cfg.getPropertyId(), areaIdInConfig);
assertThat(areaIdByCarPropertyManager).isEqualTo(areaIdInConfig);
}
}
}
});
}
@Test
public void testInvalidMustNotBeImplemented() {
runWithShellPermissionIdentity(
() -> {
assertThat(mCarPropertyManager.getCarPropertyConfig(VehiclePropertyIds.INVALID))
.isNull();
});
}
@CddTest(requirements = {"2.5.1"})
@Test
@ApiRequirements(
minCarVersion = ApiRequirements.CarVersion.TIRAMISU_0,
minPlatformVersion = ApiRequirements.PlatformVersion.TIRAMISU_0)
public void testMustSupportGearSelection() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.GEAR_SELECTION,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireProperty()
.setPossibleConfigArrayValues(VEHICLE_GEARS)
.requirePropertyValueTobeInConfigArray()
.addReadPermission(Car.PERMISSION_POWERTRAIN)
.build()
.verify(mCarPropertyManager);
}
@CddTest(requirements = {"2.5.1"})
@Test
@ApiRequirements(
minCarVersion = ApiRequirements.CarVersion.TIRAMISU_0,
minPlatformVersion = ApiRequirements.PlatformVersion.TIRAMISU_0)
public void testMustSupportNightMode() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.NIGHT_MODE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.requireProperty()
.addReadPermission(Car.PERMISSION_EXTERIOR_ENVIRONMENT)
.build()
.verify(mCarPropertyManager);
}
@CddTest(requirements = {"2.5.1"})
@Test
@ApiRequirements(
minCarVersion = ApiRequirements.CarVersion.TIRAMISU_0,
minPlatformVersion = ApiRequirements.PlatformVersion.TIRAMISU_0)
public void testMustSupportPerfVehicleSpeed() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.PERF_VEHICLE_SPEED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_CONTINUOUS,
Float.class)
.requireProperty()
.addReadPermission(Car.PERMISSION_SPEED)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testPerfVehicleSpeedDisplayIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.PERF_VEHICLE_SPEED_DISPLAY,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_CONTINUOUS,
Float.class)
.addReadPermission(Car.PERMISSION_SPEED)
.build()
.verify(mCarPropertyManager);
}
@CddTest(requirements = {"2.5.1"})
@Test
@ApiRequirements(
minCarVersion = ApiRequirements.CarVersion.TIRAMISU_0,
minPlatformVersion = ApiRequirements.PlatformVersion.TIRAMISU_0)
public void testMustSupportParkingBrakeOn() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.PARKING_BRAKE_ON,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.requireProperty()
.addReadPermission(Car.PERMISSION_POWERTRAIN)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEmergencyLaneKeepAssistEnabledIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.EMERGENCY_LANE_KEEP_ASSIST_ENABLED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_READ_ADAS_SETTINGS)
.addWritePermission(Car.PERMISSION_CONTROL_ADAS_SETTINGS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testAdaptiveCruiseControlEnabledIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.ADAPTIVE_CRUISE_CONTROL_ENABLED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_READ_ADAS_SETTINGS)
.addWritePermission(Car.PERMISSION_CONTROL_ADAS_SETTINGS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testHandsOnDetectionEnabledIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HANDS_ON_DETECTION_ENABLED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_READ_DRIVER_MONITORING_SETTINGS)
.addWritePermission(Car.PERMISSION_CONTROL_DRIVER_MONITORING_SETTINGS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testDriverAttentionMonitoringEnabledIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.DRIVER_ATTENTION_MONITORING_ENABLED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_READ_DRIVER_MONITORING_SETTINGS)
.addWritePermission(Car.PERMISSION_CONTROL_DRIVER_MONITORING_SETTINGS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testWheelTickIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.WHEEL_TICK,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_CONTINUOUS,
Long[].class)
.setConfigArrayVerifier(
configArray -> {
assertWithMessage("WHEEL_TICK config array must be size 5")
.that(configArray.size())
.isEqualTo(5);
int supportedWheels = configArray.get(0);
assertWithMessage(
"WHEEL_TICK config array first element specifies which"
+ " wheels are supported")
.that(supportedWheels)
.isGreaterThan(VehicleAreaWheel.WHEEL_UNKNOWN);
assertWithMessage(
"WHEEL_TICK config array first element specifies which"
+ " wheels are supported")
.that(supportedWheels)
.isAtMost(
VehicleAreaWheel.WHEEL_LEFT_FRONT
| VehicleAreaWheel.WHEEL_RIGHT_FRONT
| VehicleAreaWheel.WHEEL_LEFT_REAR
| VehicleAreaWheel.WHEEL_RIGHT_REAR);
verifyWheelTickConfigArray(
supportedWheels,
VehicleAreaWheel.WHEEL_LEFT_FRONT,
1,
configArray.get(1));
verifyWheelTickConfigArray(
supportedWheels,
VehicleAreaWheel.WHEEL_RIGHT_FRONT,
2,
configArray.get(2));
verifyWheelTickConfigArray(
supportedWheels,
VehicleAreaWheel.WHEEL_RIGHT_REAR,
3,
configArray.get(3));
verifyWheelTickConfigArray(
supportedWheels,
VehicleAreaWheel.WHEEL_LEFT_REAR,
4,
configArray.get(4));
})
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
List<Integer> wheelTickConfigArray = carPropertyConfig.getConfigArray();
int supportedWheels = wheelTickConfigArray.get(0);
Long[] wheelTicks = (Long[]) carPropertyValue.getValue();
assertWithMessage("WHEEL_TICK Long[] value must be size 5")
.that(wheelTicks.length)
.isEqualTo(5);
verifyWheelTickValue(
supportedWheels,
VehicleAreaWheel.WHEEL_LEFT_FRONT,
1,
wheelTicks[1]);
verifyWheelTickValue(
supportedWheels,
VehicleAreaWheel.WHEEL_RIGHT_FRONT,
2,
wheelTicks[2]);
verifyWheelTickValue(
supportedWheels,
VehicleAreaWheel.WHEEL_RIGHT_REAR,
3,
wheelTicks[3]);
verifyWheelTickValue(
supportedWheels,
VehicleAreaWheel.WHEEL_LEFT_REAR,
4,
wheelTicks[4]);
})
.addReadPermission(Car.PERMISSION_SPEED)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testInfoVinIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.INFO_VIN,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_STATIC,
String.class)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) ->
assertWithMessage("INFO_VIN must be 17 characters")
.that((String) carPropertyValue.getValue())
.hasLength(17))
.addReadPermission(Car.PERMISSION_IDENTIFICATION)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testInfoMakeIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.INFO_MAKE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_STATIC,
String.class)
.addReadPermission(Car.PERMISSION_CAR_INFO)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testInfoModelIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.INFO_MODEL,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_STATIC,
String.class)
.addReadPermission(Car.PERMISSION_CAR_INFO)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testInfoModelYearIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.INFO_MODEL_YEAR,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_STATIC,
Integer.class)
.addReadPermission(Car.PERMISSION_CAR_INFO)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testInfoFuelCapacityIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.INFO_FUEL_CAPACITY,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_STATIC,
Float.class)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) ->
assertWithMessage(
"INFO_FUEL_CAPACITY Float value must be greater"
+ " than or equal 0")
.that((Float) carPropertyValue.getValue())
.isAtLeast(0))
.addReadPermission(Car.PERMISSION_CAR_INFO)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testInfoFuelTypeIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.INFO_FUEL_TYPE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_STATIC,
Integer[].class)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
Integer[] fuelTypes = (Integer[]) carPropertyValue.getValue();
assertWithMessage("INFO_FUEL_TYPE must specify at least 1 fuel type")
.that(fuelTypes.length)
.isGreaterThan(0);
for (Integer fuelType : fuelTypes) {
assertWithMessage(
"INFO_FUEL_TYPE must be a defined fuel type: "
+ fuelType)
.that(fuelType)
.isIn(
ImmutableSet.builder()
.add(
FuelType.UNKNOWN,
FuelType.UNLEADED,
FuelType.LEADED,
FuelType.DIESEL_1,
FuelType.DIESEL_2,
FuelType.BIODIESEL,
FuelType.E85,
FuelType.LPG,
FuelType.CNG,
FuelType.LNG,
FuelType.ELECTRIC,
FuelType.HYDROGEN,
FuelType.OTHER)
.build());
}
})
.addReadPermission(Car.PERMISSION_CAR_INFO)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testInfoEvBatteryCapacityIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.INFO_EV_BATTERY_CAPACITY,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_STATIC,
Float.class)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) ->
assertWithMessage(
"INFO_EV_BATTERY_CAPACITY Float value must be"
+ " greater than or equal to 0")
.that((Float) carPropertyValue.getValue())
.isAtLeast(0))
.addReadPermission(Car.PERMISSION_CAR_INFO)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testInfoEvConnectorTypeIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.INFO_EV_CONNECTOR_TYPE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_STATIC,
Integer[].class)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
Integer[] evConnectorTypes = (Integer[]) carPropertyValue.getValue();
assertWithMessage(
"INFO_EV_CONNECTOR_TYPE must specify at least 1"
+ " connection type")
.that(evConnectorTypes.length)
.isGreaterThan(0);
for (Integer evConnectorType : evConnectorTypes) {
assertWithMessage(
"INFO_EV_CONNECTOR_TYPE must be a defined"
+ " connection type: "
+ evConnectorType)
.that(evConnectorType)
.isIn(
ImmutableSet.builder()
.add(
EvConnectorType.UNKNOWN,
EvConnectorType.J1772,
EvConnectorType.MENNEKES,
EvConnectorType.CHADEMO,
EvConnectorType.COMBO_1,
EvConnectorType.COMBO_2,
EvConnectorType.TESLA_ROADSTER,
EvConnectorType.TESLA_HPWC,
EvConnectorType.TESLA_SUPERCHARGER,
EvConnectorType.GBT,
EvConnectorType.GBT_DC,
EvConnectorType.SCAME,
EvConnectorType.OTHER)
.build());
}
})
.addReadPermission(Car.PERMISSION_CAR_INFO)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testInfoFuelDoorLocationIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.INFO_FUEL_DOOR_LOCATION,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_STATIC,
Integer.class)
.setPossibleCarPropertyValues(PORT_LOCATION_TYPES)
.addReadPermission(Car.PERMISSION_CAR_INFO)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testInfoEvPortLocationIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.INFO_EV_PORT_LOCATION,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_STATIC,
Integer.class)
.setPossibleCarPropertyValues(PORT_LOCATION_TYPES)
.addReadPermission(Car.PERMISSION_CAR_INFO)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testInfoMultiEvPortLocationsIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.INFO_MULTI_EV_PORT_LOCATIONS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_STATIC,
Integer[].class)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
Integer[] evPortLocations = (Integer[]) carPropertyValue.getValue();
assertWithMessage(
"INFO_MULTI_EV_PORT_LOCATIONS must specify at least 1"
+ " port location")
.that(evPortLocations.length)
.isGreaterThan(0);
for (Integer evPortLocation : evPortLocations) {
assertWithMessage(
"INFO_MULTI_EV_PORT_LOCATIONS must be a defined"
+ " port location: "
+ evPortLocation)
.that(evPortLocation)
.isIn(PORT_LOCATION_TYPES);
}
})
.addReadPermission(Car.PERMISSION_CAR_INFO)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testInfoDriverSeatIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.INFO_DRIVER_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_STATIC,
Integer.class)
.setPossibleCarPropertyValues(
ImmutableSet.of(
VehicleAreaSeat.SEAT_UNKNOWN,
VehicleAreaSeat.SEAT_ROW_1_LEFT,
VehicleAreaSeat.SEAT_ROW_1_CENTER,
VehicleAreaSeat.SEAT_ROW_1_RIGHT))
.setAreaIdsVerifier(
areaIds ->
assertWithMessage(
"Even though INFO_DRIVER_SEAT is"
+ " VEHICLE_AREA_TYPE_SEAT, it is meant to be"
+ " VEHICLE_AREA_TYPE_GLOBAL, so its AreaIds"
+ " must contain a single 0")
.that(areaIds)
.isEqualTo(
new int[] {
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL
}))
.addReadPermission(Car.PERMISSION_CAR_INFO)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testInfoExteriorDimensionsIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.INFO_EXTERIOR_DIMENSIONS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_STATIC,
Integer[].class)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
Integer[] exteriorDimensions = (Integer[]) carPropertyValue.getValue();
assertWithMessage(
"INFO_EXTERIOR_DIMENSIONS must specify all 8 dimension"
+ " measurements")
.that(exteriorDimensions.length)
.isEqualTo(8);
for (Integer exteriorDimension : exteriorDimensions) {
assertWithMessage(
"INFO_EXTERIOR_DIMENSIONS measurement must be"
+ " greater than 0")
.that(exteriorDimension)
.isGreaterThan(0);
}
})
.addReadPermission(Car.PERMISSION_CAR_INFO)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testElectronicTollCollectionCardTypeIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.ELECTRONIC_TOLL_COLLECTION_CARD_TYPE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(
ImmutableSet.of(
VehicleElectronicTollCollectionCardType.UNKNOWN,
VehicleElectronicTollCollectionCardType
.JP_ELECTRONIC_TOLL_COLLECTION_CARD,
VehicleElectronicTollCollectionCardType
.JP_ELECTRONIC_TOLL_COLLECTION_CARD_V2))
.addReadPermission(Car.PERMISSION_CAR_INFO)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testElectronicTollCollectionCardStatusIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.ELECTRONIC_TOLL_COLLECTION_CARD_STATUS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(
ImmutableSet.of(
VehicleElectronicTollCollectionCardStatus.UNKNOWN,
VehicleElectronicTollCollectionCardStatus
.ELECTRONIC_TOLL_COLLECTION_CARD_VALID,
VehicleElectronicTollCollectionCardStatus
.ELECTRONIC_TOLL_COLLECTION_CARD_INVALID,
VehicleElectronicTollCollectionCardStatus
.ELECTRONIC_TOLL_COLLECTION_CARD_NOT_INSERTED))
.addReadPermission(Car.PERMISSION_CAR_INFO)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testGeneralSafetyRegulationComplianceIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.GENERAL_SAFETY_REGULATION_COMPLIANCE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_STATIC,
Integer.class)
.setPossibleCarPropertyValues(
ImmutableSet.of(
GsrComplianceType.GSR_COMPLIANCE_TYPE_NOT_REQUIRED,
GsrComplianceType.GSR_COMPLIANCE_TYPE_REQUIRED_V1))
.addReadPermission(Car.PERMISSION_CAR_INFO)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEnvOutsideTemperatureIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.ENV_OUTSIDE_TEMPERATURE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_CONTINUOUS,
Float.class)
.addReadPermission(Car.PERMISSION_EXTERIOR_ENVIRONMENT)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testCurrentGearIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.CURRENT_GEAR,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleConfigArrayValues(VEHICLE_GEARS)
.requirePropertyValueTobeInConfigArray()
.addReadPermission(Car.PERMISSION_POWERTRAIN)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testParkingBrakeAutoApplyIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.PARKING_BRAKE_AUTO_APPLY,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_POWERTRAIN)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testIgnitionStateIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.IGNITION_STATE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(
ImmutableSet.of(
VehicleIgnitionState.UNDEFINED,
VehicleIgnitionState.LOCK,
VehicleIgnitionState.OFF,
VehicleIgnitionState.ACC,
VehicleIgnitionState.ON,
VehicleIgnitionState.START))
.addReadPermission(Car.PERMISSION_POWERTRAIN)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEvBrakeRegenerationLevelIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.EV_BRAKE_REGENERATION_LEVEL,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireMinValuesToBeZero()
.addReadPermission(Car.PERMISSION_POWERTRAIN)
.addWritePermission(Car.PERMISSION_CONTROL_POWERTRAIN)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEvStoppingModeIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.EV_STOPPING_MODE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(EV_STOPPING_MODES)
.addReadPermission(Car.PERMISSION_POWERTRAIN)
.addWritePermission(Car.PERMISSION_CONTROL_POWERTRAIN)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testAbsActiveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.ABS_ACTIVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_CAR_DYNAMICS_STATE)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testTractionControlActiveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.TRACTION_CONTROL_ACTIVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_CAR_DYNAMICS_STATE)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testDoorPosIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.DOOR_POS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_DOOR,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireMinValuesToBeZero()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_DOORS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_DOORS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testDoorMoveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.DOOR_MOVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_DOOR,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_DOORS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_DOORS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testDoorLockIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.DOOR_LOCK,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_DOOR,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_CONTROL_CAR_DOORS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_DOORS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testDoorChildLockEnabledIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.DOOR_CHILD_LOCK_ENABLED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_DOOR,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_CONTROL_CAR_DOORS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_DOORS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testMirrorZPosIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.MIRROR_Z_POS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_MIRROR,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_MIRRORS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_MIRRORS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testMirrorZMoveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.MIRROR_Z_MOVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_MIRROR,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_MIRRORS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_MIRRORS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testMirrorYPosIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.MIRROR_Y_POS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_MIRROR,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_MIRRORS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_MIRRORS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testMirrorYMoveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.MIRROR_Y_MOVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_MIRROR,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_MIRRORS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_MIRRORS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testMirrorLockIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.MIRROR_LOCK,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_CONTROL_CAR_MIRRORS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_MIRRORS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testMirrorFoldIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.MIRROR_FOLD,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_CONTROL_CAR_MIRRORS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_MIRRORS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testMirrorAutoFoldEnabledIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.MIRROR_AUTO_FOLD_ENABLED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_MIRROR,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_CONTROL_CAR_MIRRORS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_MIRRORS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testMirrorAutoTiltEnabledIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.MIRROR_AUTO_TILT_ENABLED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_MIRROR,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_CONTROL_CAR_MIRRORS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_MIRRORS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testWindowPosIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.WINDOW_POS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_WINDOW,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_WINDOWS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_WINDOWS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testWindowMoveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.WINDOW_MOVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_WINDOW,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_WINDOWS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_WINDOWS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testWindowLockIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.WINDOW_LOCK,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_WINDOW,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_CONTROL_CAR_WINDOWS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_WINDOWS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSteeringWheelDepthPosIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.STEERING_WHEEL_DEPTH_POS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.addReadPermission(Car.PERMISSION_CONTROL_STEERING_WHEEL)
.addWritePermission(Car.PERMISSION_CONTROL_STEERING_WHEEL)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSteeringWheelDepthMoveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.STEERING_WHEEL_DEPTH_MOVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_STEERING_WHEEL)
.addWritePermission(Car.PERMISSION_CONTROL_STEERING_WHEEL)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSteeringWheelHeightPosIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.STEERING_WHEEL_HEIGHT_POS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.addReadPermission(Car.PERMISSION_CONTROL_STEERING_WHEEL)
.addWritePermission(Car.PERMISSION_CONTROL_STEERING_WHEEL)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSteeringWheelHeightMoveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.STEERING_WHEEL_HEIGHT_MOVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_STEERING_WHEEL)
.addWritePermission(Car.PERMISSION_CONTROL_STEERING_WHEEL)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSteeringWheelTheftLockEnabledIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.STEERING_WHEEL_THEFT_LOCK_ENABLED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_CONTROL_STEERING_WHEEL)
.addWritePermission(Car.PERMISSION_CONTROL_STEERING_WHEEL)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSteeringWheelLockedIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.STEERING_WHEEL_LOCKED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_CONTROL_STEERING_WHEEL)
.addWritePermission(Car.PERMISSION_CONTROL_STEERING_WHEEL)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSteeringWheelEasyAccessEnabledIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.STEERING_WHEEL_EASY_ACCESS_ENABLED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_CONTROL_STEERING_WHEEL)
.addWritePermission(Car.PERMISSION_CONTROL_STEERING_WHEEL)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testDistanceDisplayUnitsIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.DISTANCE_DISPLAY_UNITS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleConfigArrayValues(DISTANCE_DISPLAY_UNITS)
.requirePropertyValueTobeInConfigArray()
.verifySetterWithConfigArrayValues()
.addReadPermission(Car.PERMISSION_READ_DISPLAY_UNITS)
.addWritePermission(Car.PERMISSION_CONTROL_DISPLAY_UNITS)
.addReadPermission(Car.PERMISSION_VENDOR_EXTENSION)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testFuelVolumeDisplayUnitsIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.FUEL_VOLUME_DISPLAY_UNITS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleConfigArrayValues(VOLUME_DISPLAY_UNITS)
.requirePropertyValueTobeInConfigArray()
.verifySetterWithConfigArrayValues()
.addReadPermission(Car.PERMISSION_READ_DISPLAY_UNITS)
.addWritePermission(Car.PERMISSION_CONTROL_DISPLAY_UNITS)
.addReadPermission(Car.PERMISSION_VENDOR_EXTENSION)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testTirePressureIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.TIRE_PRESSURE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_WHEEL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_CONTINUOUS,
Float.class)
.requireMinMaxValues()
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) ->
assertWithMessage(
"TIRE_PRESSURE Float value"
+ " at Area ID equals to "
+ carPropertyValue.getAreaId()
+ " must be greater than or equal 0")
.that((Float) carPropertyValue.getValue())
.isAtLeast(0))
.addReadPermission(Car.PERMISSION_TIRES)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testCriticallyLowTirePressureIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.CRITICALLY_LOW_TIRE_PRESSURE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_WHEEL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_STATIC,
Float.class)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
int areaId = carPropertyValue.getAreaId();
assertWithMessage(
"CRITICALLY_LOW_TIRE_PRESSURE Float value"
+ "at Area ID equals to"
+ areaId
+ " must be greater than or equal 0")
.that((Float) carPropertyValue.getValue())
.isAtLeast(0);
CarPropertyConfig<?> tirePressureConfig =
mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.TIRE_PRESSURE);
if (tirePressureConfig == null
|| tirePressureConfig.getMinValue(areaId) == null) {
return;
}
assertWithMessage(
"CRITICALLY_LOW_TIRE_PRESSURE Float value"
+ "at Area ID equals to"
+ areaId
+ " must not exceed"
+ " minFloatValue in TIRE_PRESSURE")
.that((Float) carPropertyValue.getValue())
.isAtMost((Float) tirePressureConfig.getMinValue(areaId));
})
.addReadPermission(Car.PERMISSION_TIRES)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testTirePressureDisplayUnitsIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.TIRE_PRESSURE_DISPLAY_UNITS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleConfigArrayValues(PRESSURE_DISPLAY_UNITS)
.requirePropertyValueTobeInConfigArray()
.verifySetterWithConfigArrayValues()
.addReadPermission(Car.PERMISSION_READ_DISPLAY_UNITS)
.addWritePermission(Car.PERMISSION_CONTROL_DISPLAY_UNITS)
.addReadPermission(Car.PERMISSION_VENDOR_EXTENSION)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEvBatteryDisplayUnitsIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.EV_BATTERY_DISPLAY_UNITS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleConfigArrayValues(BATTERY_DISPLAY_UNITS)
.requirePropertyValueTobeInConfigArray()
.verifySetterWithConfigArrayValues()
.addReadPermission(Car.PERMISSION_READ_DISPLAY_UNITS)
.addWritePermission(Car.PERMISSION_CONTROL_DISPLAY_UNITS)
.addReadPermission(Car.PERMISSION_VENDOR_EXTENSION)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testVehicleSpeedDisplayUnitsIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.VEHICLE_SPEED_DISPLAY_UNITS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleConfigArrayValues(SPEED_DISPLAY_UNITS)
.requirePropertyValueTobeInConfigArray()
.verifySetterWithConfigArrayValues()
.addReadPermission(Car.PERMISSION_READ_DISPLAY_UNITS)
.addWritePermission(Car.PERMISSION_CONTROL_DISPLAY_UNITS)
.addReadPermission(Car.PERMISSION_VENDOR_EXTENSION)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testFuelConsumptionUnitsDistanceOverTimeIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.FUEL_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_READ_DISPLAY_UNITS)
.addWritePermission(Car.PERMISSION_CONTROL_DISPLAY_UNITS)
.addReadPermission(Car.PERMISSION_VENDOR_EXTENSION)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testFuelLevelIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.FUEL_LEVEL,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_CONTINUOUS,
Float.class)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
assertWithMessage(
"FUEL_LEVEL Float value must be greater than or equal"
+ " 0")
.that((Float) carPropertyValue.getValue())
.isAtLeast(0);
if (mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.INFO_FUEL_CAPACITY)
== null) {
return;
}
CarPropertyValue<?> infoFuelCapacityValue =
mCarPropertyManager.getProperty(
VehiclePropertyIds.INFO_FUEL_CAPACITY,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL);
assertWithMessage(
"FUEL_LEVEL Float value must not exceed"
+ " INFO_FUEL_CAPACITY Float value")
.that((Float) carPropertyValue.getValue())
.isAtMost((Float) infoFuelCapacityValue.getValue());
})
.addReadPermission(Car.PERMISSION_ENERGY)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEvBatteryLevelIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.EV_BATTERY_LEVEL,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_CONTINUOUS,
Float.class)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
assertWithMessage(
"EV_BATTERY_LEVEL Float value must be greater than or"
+ " equal 0")
.that((Float) carPropertyValue.getValue())
.isAtLeast(0);
if (mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.INFO_EV_BATTERY_CAPACITY)
== null) {
return;
}
CarPropertyValue<?> infoEvBatteryCapacityValue =
mCarPropertyManager.getProperty(
VehiclePropertyIds.INFO_EV_BATTERY_CAPACITY,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL);
assertWithMessage(
"EV_BATTERY_LEVEL Float value must not exceed "
+ "INFO_EV_BATTERY_CAPACITY Float "
+ "value")
.that((Float) carPropertyValue.getValue())
.isAtMost((Float) infoEvBatteryCapacityValue.getValue());
})
.addReadPermission(Car.PERMISSION_ENERGY)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEvCurrentBatteryCapacityIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.EV_CURRENT_BATTERY_CAPACITY,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Float.class)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
assertWithMessage(
"EV_CURRENT_BATTERY_CAPACITY Float value must be"
+ "greater than or equal 0")
.that((Float) carPropertyValue.getValue())
.isAtLeast(0);
if (mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.INFO_EV_BATTERY_CAPACITY)
== null) {
return;
}
CarPropertyValue<?> infoEvBatteryCapacityValue =
mCarPropertyManager.getProperty(
VehiclePropertyIds.INFO_EV_BATTERY_CAPACITY,
/*areaId=*/0);
assertWithMessage(
"EV_CURRENT_BATTERY_CAPACITY Float value must not"
+ "exceed INFO_EV_BATTERY_CAPACITY Float "
+ "value")
.that((Float) carPropertyValue.getValue())
.isAtMost((Float) infoEvBatteryCapacityValue.getValue());
})
.addReadPermission(Car.PERMISSION_ENERGY)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEvBatteryInstantaneousChargeRateIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.EV_BATTERY_INSTANTANEOUS_CHARGE_RATE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_CONTINUOUS,
Float.class)
.addReadPermission(Car.PERMISSION_ENERGY)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testRangeRemainingIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.RANGE_REMAINING,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_CONTINUOUS,
Float.class)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
assertWithMessage(
"RANGE_REMAINING Float value must be greater than or"
+ " equal 0")
.that((Float) carPropertyValue.getValue())
.isAtLeast(0);
})
.addReadPermission(Car.PERMISSION_ENERGY)
.addWritePermission(Car.PERMISSION_ADJUST_RANGE_REMAINING)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testFuelLevelLowIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.FUEL_LEVEL_LOW,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_ENERGY)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testFuelDoorOpenIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.FUEL_DOOR_OPEN,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_ENERGY_PORTS)
.addWritePermission(Car.PERMISSION_CONTROL_ENERGY_PORTS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEvChargePortOpenIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.EV_CHARGE_PORT_OPEN,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_ENERGY_PORTS)
.addWritePermission(Car.PERMISSION_CONTROL_ENERGY_PORTS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEvChargePortConnectedIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.EV_CHARGE_PORT_CONNECTED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_ENERGY_PORTS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEvChargeCurrentDrawLimitIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.EV_CHARGE_CURRENT_DRAW_LIMIT,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Float.class)
.setConfigArrayVerifier(
configArray -> {
assertWithMessage(
"EV_CHARGE_CURRENT_DRAW_LIMIT config array must be size"
+ " 1")
.that(configArray.size())
.isEqualTo(1);
int maxCurrentDrawThresholdAmps = configArray.get(0);
assertWithMessage(
"EV_CHARGE_CURRENT_DRAW_LIMIT config array first"
+ " element specifies max current draw allowed by"
+ " vehicle in amperes.")
.that(maxCurrentDrawThresholdAmps)
.isGreaterThan(0);
})
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
List<Integer> evChargeCurrentDrawLimitConfigArray =
carPropertyConfig.getConfigArray();
int maxCurrentDrawThresholdAmps =
evChargeCurrentDrawLimitConfigArray.get(0);
Float evChargeCurrentDrawLimit = (Float) carPropertyValue.getValue();
assertWithMessage(
"EV_CHARGE_CURRENT_DRAW_LIMIT value must be greater"
+ " than 0")
.that(evChargeCurrentDrawLimit)
.isGreaterThan(0);
assertWithMessage(
"EV_CHARGE_CURRENT_DRAW_LIMIT value must be less than"
+ " or equal to max current draw by the vehicle")
.that(evChargeCurrentDrawLimit)
.isAtMost(maxCurrentDrawThresholdAmps);
})
.addReadPermission(Car.PERMISSION_ENERGY)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_ENERGY)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEvChargePercentLimitIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.EV_CHARGE_PERCENT_LIMIT,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Float.class)
.setConfigArrayVerifier(
configArray -> {
for (int i = 0; i < configArray.size(); i++) {
assertWithMessage(
"EV_CHARGE_PERCENT_LIMIT configArray["
+ i
+ "] valid charge percent limit must be"
+ " greater than 0")
.that(configArray.get(i))
.isGreaterThan(0);
assertWithMessage(
"EV_CHARGE_PERCENT_LIMIT configArray["
+ i
+ "] valid charge percent limit must be at"
+ " most 100")
.that(configArray.get(i))
.isAtMost(100);
}
})
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
List<Integer> evChargePercentLimitConfigArray =
carPropertyConfig.getConfigArray();
Float evChargePercentLimit = (Float) carPropertyValue.getValue();
if (evChargePercentLimitConfigArray.isEmpty()) {
assertWithMessage(
"EV_CHARGE_PERCENT_LIMIT value must be greater than"
+ " 0")
.that(evChargePercentLimit)
.isGreaterThan(0);
assertWithMessage(
"EV_CHARGE_PERCENT_LIMIT value must be at most 100")
.that(evChargePercentLimit)
.isAtMost(100);
} else {
assertWithMessage(
"EV_CHARGE_PERCENT_LIMIT value must be in the"
+ " configArray valid charge percent limit"
+ " list")
.that(evChargePercentLimit.intValue())
.isIn(evChargePercentLimitConfigArray);
}
})
.addReadPermission(Car.PERMISSION_ENERGY)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_ENERGY)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEvChargeStateIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.EV_CHARGE_STATE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(ImmutableSet.of(
EvChargeState.STATE_UNKNOWN,
EvChargeState.STATE_CHARGING,
EvChargeState.STATE_FULLY_CHARGED,
EvChargeState.STATE_NOT_CHARGING,
EvChargeState.STATE_ERROR))
.addReadPermission(Car.PERMISSION_ENERGY)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEvChargeSwitchIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.EV_CHARGE_SWITCH,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_ENERGY)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_ENERGY)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEvChargeTimeRemainingIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.EV_CHARGE_TIME_REMAINING,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_CONTINUOUS,
Integer.class)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
assertWithMessage(
"FUEL_LEVEL Integer value must be greater than or equal"
+ " 0")
.that((Integer) carPropertyValue.getValue())
.isAtLeast(0);
})
.addReadPermission(Car.PERMISSION_ENERGY)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEvRegenerativeBrakingStateIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.EV_REGENERATIVE_BRAKING_STATE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(
ImmutableSet.of(
EvRegenerativeBrakingState.STATE_UNKNOWN,
EvRegenerativeBrakingState.STATE_DISABLED,
EvRegenerativeBrakingState
.STATE_PARTIALLY_ENABLED,
EvRegenerativeBrakingState
.STATE_FULLY_ENABLED))
.addReadPermission(Car.PERMISSION_ENERGY)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testPerfSteeringAngleIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.PERF_STEERING_ANGLE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_CONTINUOUS,
Float.class)
.addReadPermission(Car.PERMISSION_READ_STEERING_STATE)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testPerfRearSteeringAngleIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.PERF_REAR_STEERING_ANGLE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_CONTINUOUS,
Float.class)
.addReadPermission(Car.PERMISSION_READ_STEERING_STATE)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEngineCoolantTempIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.ENGINE_COOLANT_TEMP,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_CONTINUOUS,
Float.class)
.addReadPermission(Car.PERMISSION_CAR_ENGINE_DETAILED)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEngineOilLevelIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.ENGINE_OIL_LEVEL,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(
ImmutableSet.of(
/*VehicleOilLevel.CRITICALLY_LOW=*/ 0,
/*VehicleOilLevel.LOW=*/ 1,
/*VehicleOilLevel.NORMAL=*/ 2,
/*VehicleOilLevel.HIGH=*/ 3,
/*VehicleOilLevel.ERROR=*/ 4))
.addReadPermission(Car.PERMISSION_CAR_ENGINE_DETAILED)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEngineOilTempIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.ENGINE_OIL_TEMP,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_CONTINUOUS,
Float.class)
.addReadPermission(Car.PERMISSION_CAR_ENGINE_DETAILED)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEngineRpmIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.ENGINE_RPM,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_CONTINUOUS,
Float.class)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) ->
assertWithMessage(
"ENGINE_RPM Float value must be greater than or"
+ " equal 0")
.that((Float) carPropertyValue.getValue())
.isAtLeast(0))
.addReadPermission(Car.PERMISSION_CAR_ENGINE_DETAILED)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testEngineIdleAutoStopEnabledIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.ENGINE_IDLE_AUTO_STOP_ENABLED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_CAR_ENGINE_DETAILED)
.addWritePermission(Car.PERMISSION_CAR_ENGINE_DETAILED)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testPerfOdometerIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.PERF_ODOMETER,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_CONTINUOUS,
Float.class)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) ->
assertWithMessage(
"PERF_ODOMETER Float value must be greater than or"
+ " equal 0")
.that((Float) carPropertyValue.getValue())
.isAtLeast(0))
.addReadPermission(Car.PERMISSION_MILEAGE)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testTurnSignalStateIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.TURN_SIGNAL_STATE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(TURN_SIGNAL_STATES)
.addReadPermission(Car.PERMISSION_EXTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testHeadlightsStateIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HEADLIGHTS_STATE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_LIGHT_STATES)
.addReadPermission(Car.PERMISSION_EXTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testHighBeamLightsStateIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HIGH_BEAM_LIGHTS_STATE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_LIGHT_STATES)
.addReadPermission(Car.PERMISSION_EXTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testFogLightsStateIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.FOG_LIGHTS_STATE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_LIGHT_STATES)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
assertWithMessage(
"FRONT_FOG_LIGHTS_STATE must not be implemented"
+ "when FOG_LIGHTS_STATE is implemented")
.that(
mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.FRONT_FOG_LIGHTS_STATE))
.isNull();
assertWithMessage(
"REAR_FOG_LIGHTS_STATE must not be implemented"
+ "when FOG_LIGHTS_STATE is implemented")
.that(
mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.REAR_FOG_LIGHTS_STATE))
.isNull();
})
.addReadPermission(Car.PERMISSION_EXTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testHazardLightsStateIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HAZARD_LIGHTS_STATE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_LIGHT_STATES)
.addReadPermission(Car.PERMISSION_EXTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testFrontFogLightsStateIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.FRONT_FOG_LIGHTS_STATE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_LIGHT_STATES)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
assertWithMessage(
"FOG_LIGHTS_STATE must not be implemented"
+ "when FRONT_FOG_LIGHTS_STATE is implemented")
.that(
mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.FOG_LIGHTS_STATE))
.isNull();
})
.addReadPermission(Car.PERMISSION_EXTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testRearFogLightsStateIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.REAR_FOG_LIGHTS_STATE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_LIGHT_STATES)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
assertWithMessage(
"FOG_LIGHTS_STATE must not be implemented"
+ "when REAR_FOG_LIGHTS_STATE is implemented")
.that(
mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.FOG_LIGHTS_STATE))
.isNull();
})
.addReadPermission(Car.PERMISSION_EXTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testCabinLightsStateIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.CABIN_LIGHTS_STATE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_LIGHT_STATES)
.addReadPermission(Car.PERMISSION_READ_INTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testReadingLightsStateIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.READING_LIGHTS_STATE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_LIGHT_STATES)
.addReadPermission(Car.PERMISSION_READ_INTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSteeringWheelLightsStateIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.STEERING_WHEEL_LIGHTS_STATE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_LIGHT_STATES)
.addReadPermission(Car.PERMISSION_READ_INTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testVehicleCurbWeightIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.VEHICLE_CURB_WEIGHT,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_STATIC,
Integer.class)
.setConfigArrayVerifier(
configArray -> {
assertWithMessage(
"VEHICLE_CURB_WEIGHT configArray must contain the gross"
+ " weight in kilograms")
.that(configArray)
.hasSize(1);
assertWithMessage(
"VEHICLE_CURB_WEIGHT configArray[0] must contain the"
+ " gross weight in kilograms and be greater than"
+ " zero")
.that(configArray.get(0))
.isGreaterThan(0);
})
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
Integer curbWeightKg = (Integer) carPropertyValue.getValue();
Integer grossWeightKg = carPropertyConfig.getConfigArray().get(0);
assertWithMessage("VEHICLE_CURB_WEIGHT must be greater than zero")
.that(curbWeightKg)
.isGreaterThan(0);
assertWithMessage(
"VEHICLE_CURB_WEIGHT must be less than the gross"
+ " weight")
.that(curbWeightKg)
.isLessThan(grossWeightKg);
})
.addReadPermission(Car.PERMISSION_PRIVILEGED_CAR_INFO)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testHeadlightsSwitchIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HEADLIGHTS_SWITCH,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_LIGHT_SWITCHES)
.addReadPermission(Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS)
.addWritePermission(Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testTrailerPresentIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.TRAILER_PRESENT,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(
ImmutableSet.of(
/*TrailerState.UNKNOWN=*/
0, /*TrailerState.NOT_PRESENT*/
1, /*TrailerState.PRESENT=*/
2, /*TrailerState.ERROR=*/
3))
.addReadPermission(Car.PERMISSION_PRIVILEGED_CAR_INFO)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testHighBeamLightsSwitchIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HIGH_BEAM_LIGHTS_SWITCH,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_LIGHT_SWITCHES)
.addReadPermission(Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS)
.addWritePermission(Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testFogLightsSwitchIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.FOG_LIGHTS_SWITCH,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_LIGHT_SWITCHES)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
assertWithMessage(
"FRONT_FOG_LIGHTS_SWITCH must not be implemented"
+ "when FOG_LIGHTS_SWITCH is implemented")
.that(
mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.FRONT_FOG_LIGHTS_SWITCH))
.isNull();
assertWithMessage(
"REAR_FOG_LIGHTS_SWITCH must not be implemented"
+ "when FOG_LIGHTS_SWITCH is implemented")
.that(
mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.REAR_FOG_LIGHTS_SWITCH))
.isNull();
})
.addReadPermission(Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS)
.addWritePermission(Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testHazardLightsSwitchIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HAZARD_LIGHTS_SWITCH,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_LIGHT_SWITCHES)
.addReadPermission(Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS)
.addWritePermission(Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testFrontFogLightsSwitchIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.FRONT_FOG_LIGHTS_SWITCH,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_LIGHT_SWITCHES)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
assertWithMessage(
"FOG_LIGHTS_SWITCH must not be implemented"
+ "when FRONT_FOG_LIGHTS_SWITCH is implemented")
.that(
mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.FOG_LIGHTS_SWITCH))
.isNull();
})
.addReadPermission(Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS)
.addWritePermission(Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testRearFogLightsSwitchIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.REAR_FOG_LIGHTS_SWITCH,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_LIGHT_SWITCHES)
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
assertWithMessage(
"FOG_LIGHTS_SWITCH must not be implemented"
+ "when REAR_FOG_LIGHTS_SWITCH is implemented")
.that(
mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.FOG_LIGHTS_SWITCH))
.isNull();
})
.addReadPermission(Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS)
.addWritePermission(Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testCabinLightsSwitchIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.CABIN_LIGHTS_SWITCH,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_LIGHT_SWITCHES)
.addReadPermission(Car.PERMISSION_CONTROL_INTERIOR_LIGHTS)
.addWritePermission(Car.PERMISSION_CONTROL_INTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testReadingLightsSwitchIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.READING_LIGHTS_SWITCH,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_LIGHT_SWITCHES)
.addReadPermission(Car.PERMISSION_CONTROL_INTERIOR_LIGHTS)
.addWritePermission(Car.PERMISSION_CONTROL_INTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSteeringWheelLightsSwitchIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.STEERING_WHEEL_LIGHTS_SWITCH,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_LIGHT_SWITCHES)
.addReadPermission(Car.PERMISSION_CONTROL_INTERIOR_LIGHTS)
.addWritePermission(Car.PERMISSION_CONTROL_INTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(apis = {"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig"})
public void testSeatMemorySelectIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_MEMORY_SELECT,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireMinValuesToBeZero()
.setCarPropertyConfigVerifier(
carPropertyConfig -> {
int[] areaIds = carPropertyConfig.getAreaIds();
CarPropertyConfig<?> seatMemorySetCarPropertyConfig =
mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.SEAT_MEMORY_SET);
assertWithMessage(
"SEAT_MEMORY_SET must be implemented if "
+ "SEAT_MEMORY_SELECT is implemented")
.that(seatMemorySetCarPropertyConfig)
.isNotNull();
assertWithMessage(
"SEAT_MEMORY_SELECT area IDs must match the area IDs of"
+ " SEAT_MEMORY_SET")
.that(
Arrays.stream(areaIds)
.boxed()
.collect(Collectors.toList()))
.containsExactlyElementsIn(
Arrays.stream(
seatMemorySetCarPropertyConfig
.getAreaIds())
.boxed()
.collect(Collectors.toList()));
for (int areaId : areaIds) {
Integer seatMemorySetAreaIdMaxValue =
(Integer)
seatMemorySetCarPropertyConfig.getMaxValue(areaId);
assertWithMessage(
"SEAT_MEMORY_SET - area ID: "
+ areaId
+ " must have max value defined")
.that(seatMemorySetAreaIdMaxValue)
.isNotNull();
assertWithMessage(
"SEAT_MEMORY_SELECT - area ID: "
+ areaId
+ "'s max value must be equal to"
+ " SEAT_MEMORY_SET's max value under the"
+ " same area ID")
.that(seatMemorySetAreaIdMaxValue)
.isEqualTo(carPropertyConfig.getMaxValue(areaId));
}
})
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(apis = {"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig"})
public void testSeatMemorySetIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_MEMORY_SET,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireMinValuesToBeZero()
.setCarPropertyConfigVerifier(
carPropertyConfig -> {
int[] areaIds = carPropertyConfig.getAreaIds();
CarPropertyConfig<?> seatMemorySelectCarPropertyConfig =
mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.SEAT_MEMORY_SELECT);
assertWithMessage(
"SEAT_MEMORY_SELECT must be implemented if "
+ "SEAT_MEMORY_SET is implemented")
.that(seatMemorySelectCarPropertyConfig)
.isNotNull();
assertWithMessage(
"SEAT_MEMORY_SET area IDs must match the area IDs of "
+ "SEAT_MEMORY_SELECT")
.that(
Arrays.stream(areaIds)
.boxed()
.collect(Collectors.toList()))
.containsExactlyElementsIn(
Arrays.stream(
seatMemorySelectCarPropertyConfig
.getAreaIds())
.boxed()
.collect(Collectors.toList()));
for (int areaId : areaIds) {
Integer seatMemorySelectAreaIdMaxValue =
(Integer)
seatMemorySelectCarPropertyConfig.getMaxValue(
areaId);
assertWithMessage(
"SEAT_MEMORY_SELECT - area ID: "
+ areaId
+ " must have max value defined")
.that(seatMemorySelectAreaIdMaxValue)
.isNotNull();
assertWithMessage(
"SEAT_MEMORY_SET - area ID: "
+ areaId
+ "'s max value must be equal to"
+ " SEAT_MEMORY_SELECT's max value under"
+ " the same area ID")
.that(seatMemorySelectAreaIdMaxValue)
.isEqualTo(carPropertyConfig.getMaxValue(areaId));
}
})
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testSeatBeltBuckledIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_BELT_BUCKLED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSeatBeltHeightPosIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_BELT_HEIGHT_POS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSeatBeltHeightMoveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_BELT_HEIGHT_MOVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSeatForeAftPosIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_FORE_AFT_POS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSeatForeAftMoveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_FORE_AFT_MOVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSeatBackrestAngle1PosIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_BACKREST_ANGLE_1_POS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSeatBackrestAngle1MoveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_BACKREST_ANGLE_1_MOVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSeatBackrestAngle2PosIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_BACKREST_ANGLE_2_POS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSeatBackrestAngle2MoveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_BACKREST_ANGLE_2_MOVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testSeatHeightPosIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_HEIGHT_POS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testSeatHeightMoveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_HEIGHT_MOVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testSeatDepthPosIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_DEPTH_POS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testSeatDepthMoveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_DEPTH_MOVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testSeatTiltPosIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_TILT_POS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testSeatTiltMoveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_TILT_MOVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testSeatLumbarForeAftPosIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_LUMBAR_FORE_AFT_POS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testSeatLumbarForeAftMoveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_LUMBAR_FORE_AFT_MOVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testSeatLumbarSideSupportPosIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_LUMBAR_SIDE_SUPPORT_POS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testSeatLumbarSideSupportMoveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_LUMBAR_SIDE_SUPPORT_MOVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSeatHeadrestHeightPosMustNotBeImplemented() {
runWithShellPermissionIdentity(
() -> {
assertWithMessage(
"SEAT_HEADREST_HEIGHT_POS has been deprecated and should not be"
+ " implemented. Use SEAT_HEADREST_HEIGHT_POS_V2 instead.")
.that(
mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.SEAT_HEADREST_HEIGHT_POS))
.isNull();
},
Car.PERMISSION_CONTROL_CAR_SEATS);
}
@Test
public void testSeatHeadrestHeightPosV2IfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_HEADREST_HEIGHT_POS_V2,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testSeatHeadrestHeightMoveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_HEADREST_HEIGHT_MOVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testSeatHeadrestAnglePosIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_HEADREST_ANGLE_POS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testSeatHeadrestAngleMoveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_HEADREST_ANGLE_MOVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testSeatHeadrestForeAftPosIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_HEADREST_FORE_AFT_POS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testSeatHeadrestForeAftMoveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_HEADREST_FORE_AFT_MOVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSeatFootwellLightsStateIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_FOOTWELL_LIGHTS_STATE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_LIGHT_STATES)
.addReadPermission(Car.PERMISSION_READ_INTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSeatFootwellLightsSwitchIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_FOOTWELL_LIGHTS_SWITCH,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_LIGHT_SWITCHES)
.addReadPermission(Car.PERMISSION_CONTROL_INTERIOR_LIGHTS)
.addWritePermission(Car.PERMISSION_CONTROL_INTERIOR_LIGHTS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSeatEasyAccessEnabledIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_EASY_ACCESS_ENABLED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSeatAirbagEnabledIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_AIRBAG_ENABLED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_CONTROL_CAR_AIRBAGS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_AIRBAGS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSeatCushionSideSupportPosIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_CUSHION_SIDE_SUPPORT_POS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSeatCushionSideSupportMoveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_CUSHION_SIDE_SUPPORT_MOVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSeatLumbarVerticalPosIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_LUMBAR_VERTICAL_POS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSeatLumberVerticalMoveIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_LUMBAR_VERTICAL_MOVE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testSeatWalkInPosIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_WALK_IN_POS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireMinValuesToBeZero()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testSeatOccupancyIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.SEAT_OCCUPANCY,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleCarPropertyValues(VEHICLE_SEAT_OCCUPANCY_STATES)
.addReadPermission(Car.PERMISSION_CONTROL_CAR_SEATS)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testHvacDefrosterIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_DEFROSTER,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_WINDOW,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testHvacElectricDefrosterOnIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_ELECTRIC_DEFROSTER_ON,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_WINDOW,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testHvacSideMirrorHeatIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_SIDE_MIRROR_HEAT,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_MIRROR,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireMinValuesToBeZero()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testHvacSteeringWheelHeatIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_STEERING_WHEEL_HEAT,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testHvacTemperatureDisplayUnitsIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_TEMPERATURE_DISPLAY_UNITS,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossibleConfigArrayValues(HVAC_TEMPERATURE_DISPLAY_UNITS)
.requirePropertyValueTobeInConfigArray()
.verifySetterWithConfigArrayValues()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testHvacTemperatureValueSuggestionIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_TEMPERATURE_VALUE_SUGGESTION,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Float[].class)
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testHvacPowerOnIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_POWER_ON,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.setConfigArrayVerifier(
configArray -> {
CarPropertyConfig<?> hvacPowerOnCarPropertyConfig =
mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.HVAC_POWER_ON);
for (int powerDependentProperty : configArray) {
CarPropertyConfig<?> powerDependentCarPropertyConfig =
mCarPropertyManager.getCarPropertyConfig(
powerDependentProperty);
if (powerDependentCarPropertyConfig == null) {
continue;
}
assertWithMessage(
"HVAC_POWER_ON configArray must only contain"
+ " VehicleAreaSeat type properties: "
+ VehiclePropertyIds.toString(
powerDependentProperty))
.that(powerDependentCarPropertyConfig.getAreaType())
.isEqualTo(VehicleAreaType.VEHICLE_AREA_TYPE_SEAT);
for (int powerDependentAreaId :
powerDependentCarPropertyConfig.getAreaIds()) {
boolean powerDependentAreaIdIsContained = false;
for (int hvacPowerOnAreaId :
hvacPowerOnCarPropertyConfig.getAreaIds()) {
if ((powerDependentAreaId & hvacPowerOnAreaId)
== powerDependentAreaId) {
powerDependentAreaIdIsContained = true;
break;
}
}
assertWithMessage(
"HVAC_POWER_ON's area IDs must contain the area IDs"
+ " of power dependent property: "
+ VehiclePropertyIds.toString(
powerDependentProperty)).that(
powerDependentAreaIdIsContained).isTrue();
}
}
})
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testHvacFanSpeedIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_FAN_SPEED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.requireMinMaxValues()
.setPossiblyDependentOnHvacPowerOn()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testHvacFanDirectionAvailableIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_FAN_DIRECTION_AVAILABLE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_STATIC,
Integer[].class)
.setPossiblyDependentOnHvacPowerOn()
.setAreaIdsVerifier(
areaIds -> {
CarPropertyConfig<?> hvacFanDirectionCarPropertyConfig =
mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.HVAC_FAN_DIRECTION);
assertWithMessage(
"HVAC_FAN_DIRECTION must be implemented if "
+ "HVAC_FAN_DIRECTION_AVAILABLE is implemented")
.that(hvacFanDirectionCarPropertyConfig)
.isNotNull();
assertWithMessage(
"HVAC_FAN_DIRECTION_AVAILABLE area IDs must match the"
+ " area IDs of HVAC_FAN_DIRECTION")
.that(
Arrays.stream(areaIds)
.boxed()
.collect(Collectors.toList()))
.containsExactlyElementsIn(
Arrays.stream(
hvacFanDirectionCarPropertyConfig
.getAreaIds())
.boxed()
.collect(Collectors.toList()));
})
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
Integer[] fanDirectionValues = (Integer[]) carPropertyValue.getValue();
assertWithMessage(
"HVAC_FAN_DIRECTION_AVAILABLE area ID: "
+ carPropertyValue.getAreaId()
+ " must have at least 1 direction defined")
.that(fanDirectionValues.length)
.isAtLeast(1);
assertWithMessage(
"HVAC_FAN_DIRECTION_AVAILABLE area ID: "
+ carPropertyValue.getAreaId()
+ " values all must all be unique: "
+ Arrays.toString(fanDirectionValues))
.that(fanDirectionValues.length)
.isEqualTo(ImmutableSet.copyOf(fanDirectionValues).size());
for (Integer fanDirection : fanDirectionValues) {
assertWithMessage(
"HVAC_FAN_DIRECTION_AVAILABLE's area ID: "
+ carPropertyValue.getAreaId()
+ " must be a valid combination of fan"
+ " directions")
.that(fanDirection)
.isIn(ALL_POSSIBLE_HVAC_FAN_DIRECTIONS);
}
})
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testHvacFanDirectionIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_FAN_DIRECTION,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossiblyDependentOnHvacPowerOn()
.setAreaIdsVerifier(
areaIds -> {
CarPropertyConfig<?> hvacFanDirectionAvailableConfig =
mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.HVAC_FAN_DIRECTION_AVAILABLE);
assertWithMessage(
"HVAC_FAN_DIRECTION_AVAILABLE must be implemented if "
+ "HVAC_FAN_DIRECTION is implemented")
.that(hvacFanDirectionAvailableConfig)
.isNotNull();
assertWithMessage(
"HVAC_FAN_DIRECTION area IDs must match the area IDs of"
+ " HVAC_FAN_DIRECTION_AVAILABLE")
.that(
Arrays.stream(areaIds)
.boxed()
.collect(Collectors.toList()))
.containsExactlyElementsIn(
Arrays.stream(
hvacFanDirectionAvailableConfig
.getAreaIds())
.boxed()
.collect(Collectors.toList()));
})
.setCarPropertyValueVerifier(
(carPropertyConfig, carPropertyValue) -> {
CarPropertyValue<Integer[]> hvacFanDirectionAvailableCarPropertyValue =
mCarPropertyManager.getProperty(
VehiclePropertyIds.HVAC_FAN_DIRECTION_AVAILABLE,
carPropertyValue.getAreaId());
assertWithMessage(
"HVAC_FAN_DIRECTION_AVAILABLE value must be available")
.that(hvacFanDirectionAvailableCarPropertyValue)
.isNotNull();
assertWithMessage(
"HVAC_FAN_DIRECTION area ID "
+ carPropertyValue.getAreaId()
+ " value must be in list for"
+ " HVAC_FAN_DIRECTION_AVAILABLE")
.that(carPropertyValue.getValue())
.isIn(
Arrays.asList(
hvacFanDirectionAvailableCarPropertyValue
.getValue()));
})
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testHvacTemperatureCurrentIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_TEMPERATURE_CURRENT,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Float.class)
.setPossiblyDependentOnHvacPowerOn()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testHvacTemperatureSetIfSupported() {
VehiclePropertyVerifier.Builder<Float> hvacTempSetVerifierBuilder =
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_TEMPERATURE_SET,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Float.class)
.setPossiblyDependentOnHvacPowerOn()
.setCarPropertyConfigVerifier(
carPropertyConfig -> {
List<Integer> configArray = carPropertyConfig.getConfigArray();
assertWithMessage(
"HVAC_TEMPERATURE_SET config "
+ "array must be size 6")
.that(configArray.size())
.isEqualTo(6);
assertWithMessage(
"HVAC_TEMPERATURE_SET lower bound must be less"
+ " than the upper bound for the supported"
+ " temperatures in Celsius")
.that(configArray.get(0))
.isLessThan(configArray.get(1));
assertWithMessage(
"HVAC_TEMPERATURE_SET increment in Celsius"
+ " must be greater than 0")
.that(configArray.get(2))
.isGreaterThan(0);
assertWithMessage(
"HVAC_TEMPERATURE_SET increment in Celsius must"
+ " be less than the difference between the"
+ " upper and lower bound supported"
+ " temperatures")
.that(configArray.get(2))
.isLessThan(configArray.get(1) - configArray.get(0));
assertWithMessage(
"HVAC_TEMPERATURE_SET increment in Celsius must"
+ " evenly space the gap between upper and"
+ " lower bound")
.that(
(configArray.get(1) - configArray.get(0))
% configArray.get(2))
.isEqualTo(0);
assertWithMessage(
"HVAC_TEMPERATURE_SET lower bound must be less"
+ " than the upper bound for the supported"
+ " temperatures in Fahrenheit")
.that(configArray.get(3))
.isLessThan(configArray.get(4));
assertWithMessage(
"HVAC_TEMPERATURE_SET increment in Fahrenheit"
+ " must be greater than 0")
.that(configArray.get(5))
.isGreaterThan(0);
assertWithMessage(
"HVAC_TEMPERATURE_SET increment in Fahrenheit"
+ " must be less than the difference"
+ " between the upper and lower bound"
+ " supported temperatures")
.that(configArray.get(5))
.isLessThan(configArray.get(4) - configArray.get(3));
assertWithMessage(
"HVAC_TEMPERATURE_SET increment in Fahrenheit"
+ " must evenly space the gap between upper"
+ " and lower bound")
.that(
(configArray.get(4) - configArray.get(3))
% configArray.get(5))
.isEqualTo(0);
assertWithMessage(
"HVAC_TEMPERATURE_SET number of supported values for "
+ "Celsius and Fahrenheit must be equal.").that(
(configArray.get(1) - configArray.get(0))
/ configArray.get(2)).isEqualTo(
(configArray.get(4) - configArray.get(3))
/ configArray.get(5));
int[] supportedAreaIds = carPropertyConfig.getAreaIds();
int configMinValue = configArray.get(0);
int configMaxValue = configArray.get(1);
for (int i = 0; i < supportedAreaIds.length; i++) {
int areaId = supportedAreaIds[i];
Float minValueFloat =
(Float) carPropertyConfig.getMinValue(areaId);
if (minValueFloat != null) {
Integer minValueInt = (int) (minValueFloat * 10);
assertWithMessage(
"HVAC_TEMPERATURE_SET minimum value: "
+ minValueInt
+ " at areaId: "
+ areaId
+ " should be equal to minimum"
+ " value specified in config"
+ " array: "
+ configMinValue)
.that(minValueInt)
.isEqualTo(configMinValue);
}
Float maxValueFloat =
(Float) carPropertyConfig.getMaxValue(areaId);
if (maxValueFloat != null) {
Integer maxValueInt = (int) (maxValueFloat * 10);
assertWithMessage(
"HVAC_TEMPERATURE_SET maximum value: "
+ maxValueInt
+ " at areaId: "
+ areaId
+ " should be equal to maximum"
+ " value specified in config"
+ " array: "
+ configMaxValue)
.that(maxValueInt)
.isEqualTo(configMaxValue);
}
}
});
runWithShellPermissionIdentity(
() -> {
CarPropertyConfig<?> hvacTempSetConfig =
mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.HVAC_TEMPERATURE_SET);
if (hvacTempSetConfig != null) {
List<Integer> hvacTempSetConfigArray = hvacTempSetConfig.getConfigArray();
ImmutableSet.Builder<Float> possibleHvacTempSetValuesBuilder =
ImmutableSet.builder();
for (int possibleHvacTempSetValue = hvacTempSetConfigArray.get(0);
possibleHvacTempSetValue <= hvacTempSetConfigArray.get(1);
possibleHvacTempSetValue += hvacTempSetConfigArray.get(2)) {
possibleHvacTempSetValuesBuilder.add(
(float) possibleHvacTempSetValue / 10.0f);
}
hvacTempSetVerifierBuilder.setPossibleCarPropertyValues(
possibleHvacTempSetValuesBuilder.build());
}
},
Car.PERMISSION_CONTROL_CAR_CLIMATE);
hvacTempSetVerifierBuilder
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testHvacAcOnIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_AC_ON,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.setPossiblyDependentOnHvacPowerOn()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testHvacMaxAcOnIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_MAX_AC_ON,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.setPossiblyDependentOnHvacPowerOn()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testHvacMaxDefrostOnIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_MAX_DEFROST_ON,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.setPossiblyDependentOnHvacPowerOn()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testHvacRecircOnIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_RECIRC_ON,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.setPossiblyDependentOnHvacPowerOn()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testHvacAutoOnIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_AUTO_ON,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.setPossiblyDependentOnHvacPowerOn()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testHvacSeatTemperatureIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_SEAT_TEMPERATURE,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossiblyDependentOnHvacPowerOn()
.requireMinMaxValues()
.requireZeroToBeContainedInMinMaxRanges()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testHvacActualFanSpeedRpmIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_ACTUAL_FAN_SPEED_RPM,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossiblyDependentOnHvacPowerOn()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testHvacAutoRecircOnIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_AUTO_RECIRC_ON,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.setPossiblyDependentOnHvacPowerOn()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testHvacSeatVentilationIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_SEAT_VENTILATION,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Integer.class)
.setPossiblyDependentOnHvacPowerOn()
.requireMinMaxValues()
.requireMinValuesToBeZero()
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#getProperty(int, int)",
"android.car.hardware.property.CarPropertyManager#setProperty",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback, int)"
})
public void testHvacDualOnIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.HVAC_DUAL_ON,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_SEAT,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.setPossiblyDependentOnHvacPowerOn()
.setAreaIdsVerifier(
areaIds -> {
CarPropertyConfig<?> hvacTempSetCarPropertyConfig =
mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.HVAC_TEMPERATURE_SET);
if (hvacTempSetCarPropertyConfig == null) {
return;
}
ImmutableSet<Integer> hvacTempSetAreaIds =
ImmutableSet.copyOf(
Arrays.stream(hvacTempSetCarPropertyConfig.getAreaIds())
.boxed()
.collect(Collectors.toList()));
ImmutableSet.Builder<Integer> allPossibleHvacDualOnAreaIdsBuilder =
ImmutableSet.builder();
for (int i = 2; i <= hvacTempSetAreaIds.size(); i++) {
allPossibleHvacDualOnAreaIdsBuilder.addAll(
Sets.combinations(hvacTempSetAreaIds, i).stream()
.map(
areaIdCombo -> {
Integer possibleHvacDualOnAreaId = 0;
for (Integer areaId : areaIdCombo) {
possibleHvacDualOnAreaId |= areaId;
}
return possibleHvacDualOnAreaId;
})
.collect(Collectors.toList()));
}
ImmutableSet<Integer> allPossibleHvacDualOnAreaIds =
allPossibleHvacDualOnAreaIdsBuilder.build();
for (int areaId : areaIds) {
assertWithMessage(
"HVAC_DUAL_ON area ID: "
+ areaId
+ " must be a combination of"
+ " HVAC_TEMPERATURE_SET area IDs: "
+ Arrays.toString(
hvacTempSetCarPropertyConfig
.getAreaIds()))
.that(areaId)
.isIn(allPossibleHvacDualOnAreaIds);
}
})
.addReadPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.addWritePermission(Car.PERMISSION_CONTROL_CAR_CLIMATE)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testAutomaticEmergencyBrakingEnabledIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.AUTOMATIC_EMERGENCY_BRAKING_ENABLED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_READ_ADAS_SETTINGS)
.addWritePermission(Car.PERMISSION_CONTROL_ADAS_SETTINGS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testForwardCollisionWarningEnabledIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.FORWARD_COLLISION_WARNING_ENABLED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_READ_ADAS_SETTINGS)
.addWritePermission(Car.PERMISSION_CONTROL_ADAS_SETTINGS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testBlindSpotWarningEnabledIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.BLIND_SPOT_WARNING_ENABLED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_READ_ADAS_SETTINGS)
.addWritePermission(Car.PERMISSION_CONTROL_ADAS_SETTINGS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testLaneDepartureWarningEnabledIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.LANE_DEPARTURE_WARNING_ENABLED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_READ_ADAS_SETTINGS)
.addWritePermission(Car.PERMISSION_CONTROL_ADAS_SETTINGS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testLaneKeepAssistEnabledIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.LANE_KEEP_ASSIST_ENABLED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_READ_ADAS_SETTINGS)
.addWritePermission(Car.PERMISSION_CONTROL_ADAS_SETTINGS)
.build()
.verify(mCarPropertyManager);
}
@Test
public void testLaneCenteringAssistEnabledIfSupported() {
VehiclePropertyVerifier.newBuilder(
VehiclePropertyIds.LANE_CENTERING_ASSIST_ENABLED,
CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE,
Boolean.class)
.addReadPermission(Car.PERMISSION_READ_ADAS_SETTINGS)
.addWritePermission(Car.PERMISSION_CONTROL_ADAS_SETTINGS)
.build()
.verify(mCarPropertyManager);
}
@SuppressWarnings("unchecked")
@Test
@ApiTest(apis = {"android.car.hardware.property.CarPropertyManager#getPropertyList(ArraySet)",
"android.car.hardware.property.CarPropertyManager#getBooleanProperty",
"android.car.hardware.property.CarPropertyManager#getIntProperty",
"android.car.hardware.property.CarPropertyManager#getFloatProperty",
"android.car.hardware.property.CarPropertyManager#getIntArrayProperty",
"android.car.hardware.property.CarPropertyManager#getProperty(Class, int, int)"})
public void testGetAllSupportedReadablePropertiesSync() {
runWithShellPermissionIdentity(
() -> {
List<CarPropertyConfig> configs =
mCarPropertyManager.getPropertyList(mPropertyIds);
for (CarPropertyConfig cfg : configs) {
if (cfg.getAccess() == CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ) {
int[] areaIds = getAreaIdsHelper(cfg);
int propId = cfg.getPropertyId();
// no guarantee if we can get values, just call and check if it throws
// exception.
if (cfg.getPropertyType() == Boolean.class) {
for (int areaId : areaIds) {
mCarPropertyManager.getBooleanProperty(propId, areaId);
}
} else if (cfg.getPropertyType() == Integer.class) {
for (int areaId : areaIds) {
mCarPropertyManager.getIntProperty(propId, areaId);
}
} else if (cfg.getPropertyType() == Float.class) {
for (int areaId : areaIds) {
mCarPropertyManager.getFloatProperty(propId, areaId);
}
} else if (cfg.getPropertyType() == Integer[].class) {
for (int areId : areaIds) {
mCarPropertyManager.getIntArrayProperty(propId, areId);
}
} else {
for (int areaId : areaIds) {
mCarPropertyManager.getProperty(
cfg.getPropertyType(), propId, areaId);
}
}
}
}
});
}
/**
* Test for {@link CarPropertyManager#getPropertiesAsync}
*
* Generates GetPropertyRequest objects for supported readable properties and verifies if there
* are no exceptions or request timeouts.
*/
@Test
@ApiTest(apis = {"android.car.hardware.property.CarPropertyManager#getPropertiesAsync(List, "
+ "CancellationSignal, Executor, GetPropertyCallback)"})
public void testGetAllSupportedReadablePropertiesAsync() throws Exception {
runWithShellPermissionIdentity(() -> {
Executor executor = Executors.newFixedThreadPool(1);
Set<Integer> pendingRequests = new ArraySet<>();
List<CarPropertyManager.GetPropertyRequest> getPropertyRequests =
new ArrayList<>();
Set<PropIdAreaId> requestPropIdAreaIds = new ArraySet<>();
List<CarPropertyConfig> configs = mCarPropertyManager.getPropertyList();
for (CarPropertyConfig cfg : configs) {
if (cfg.getAccess() != CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ
&& cfg.getAccess()
!= CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE) {
continue;
}
int[] areaIds = cfg.getAreaIds();
int propId = cfg.getPropertyId();
for (int areaId : areaIds) {
CarPropertyManager.GetPropertyRequest gpr =
mCarPropertyManager.generateGetPropertyRequest(propId, areaId);
getPropertyRequests.add(gpr);
pendingRequests.add(gpr.getRequestId());
requestPropIdAreaIds.add(new PropIdAreaId(propId, areaId));
}
}
int expectedResultCount = pendingRequests.size();
TestGetPropertyAsyncCallback testGetPropertyAsyncCallback =
new TestGetPropertyAsyncCallback(pendingRequests);
mCarPropertyManager.getPropertiesAsync(
getPropertyRequests,
/* cancellationSignal= */ null,
executor,
testGetPropertyAsyncCallback);
testGetPropertyAsyncCallback.waitAndFinish();
assertThat(testGetPropertyAsyncCallback.getErrorList()).isEmpty();
int resultCount = testGetPropertyAsyncCallback.getResultList().size();
assertWithMessage("must receive at least " + expectedResultCount + " results, got "
+ resultCount).that(resultCount).isEqualTo(expectedResultCount);
for (PropIdAreaId receivedPropIdAreaId :
testGetPropertyAsyncCallback.getReceivedPropIdAreaIds()) {
assertWithMessage("received unexpected result for " + receivedPropIdAreaId)
.that(requestPropIdAreaIds).contains(receivedPropIdAreaId);
}
});
}
private static final class PropIdAreaId {
private final int mPropId;
private final int mAreaId;
PropIdAreaId(int propId, int areaId) {
mPropId = propId;
mAreaId = areaId;
}
PropIdAreaId(PropIdAreaId other) {
mPropId = other.mPropId;
mAreaId = other.mAreaId;
}
@Override
public int hashCode() {
return Objects.hash(mAreaId, mPropId);
}
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (other.getClass() != this.getClass()) {
return false;
}
PropIdAreaId o = (PropIdAreaId) other;
return mPropId == o.mPropId && mAreaId == o.mAreaId;
}
@Override
public String toString() {
return "{propId: " + mPropId + ", areaId: " + mAreaId + "}";
}
}
private static final class TestGetPropertyAsyncCallback implements
CarPropertyManager.GetPropertyCallback {
private final CountDownLatch mCountDownLatch;
private final Set<Integer> mPendingRequests;
private final int mNumberOfRequests;
private final Object mLock = new Object();
@GuardedBy("mLock")
private final List<String> mErrorList = new ArrayList<>();
@GuardedBy("mLock")
private final List<String> mResultList = new ArrayList<>();
@GuardedBy("mLock")
private final List<PropIdAreaId> mReceivedPropIdAreaIds = new ArrayList();
TestGetPropertyAsyncCallback(Set<Integer> pendingRequests) {
mNumberOfRequests = pendingRequests.size();
mCountDownLatch = new CountDownLatch(mNumberOfRequests);
mPendingRequests = pendingRequests;
}
private static String toMsg(int requestId, int propId, int areaId) {
return "Request ID: " + requestId + " (propId: " + propId + ", areaId: " + areaId + ")";
}
@Override
public void onSuccess(@NonNull GetPropertyResult<?> gotPropertyResult) {
int requestId = gotPropertyResult.getRequestId();
int propId = gotPropertyResult.getPropertyId();
int areaId = gotPropertyResult.getAreaId();
synchronized (mLock) {
if (!mPendingRequests.contains(requestId)) {
mErrorList.add(toMsg(requestId, propId, areaId) + " not present");
return;
} else {
mPendingRequests.remove(requestId);
mResultList.add(toMsg(requestId, propId, areaId)
+ " complete with onSuccess()");
}
if (gotPropertyResult.getValue() == null) {
mErrorList.add("The property value for " + toMsg(requestId, propId, areaId)
+ " is null");
} else {
mReceivedPropIdAreaIds.add(new PropIdAreaId(propId, areaId));
}
}
mCountDownLatch.countDown();
}
@Override
public void onFailure(@NonNull CarPropertyManager.GetPropertyError getPropertyError) {
int requestId = getPropertyError.getRequestId();
int propId = getPropertyError.getPropertyId();
int areaId = getPropertyError.getAreaId();
synchronized (mLock) {
if (!mPendingRequests.contains(requestId)) {
mErrorList.add(toMsg(requestId, propId, areaId) + " not present");
return;
} else {
mResultList.add(toMsg(requestId, propId, areaId)
+ " complete with onFailure()");
mPendingRequests.remove(requestId);
mReceivedPropIdAreaIds.add(new PropIdAreaId(propId, areaId));
}
}
mCountDownLatch.countDown();
}
public void waitAndFinish() throws InterruptedException {
boolean res = mCountDownLatch.await(ASYNC_WAIT_TIMEOUT_IN_SEC, TimeUnit.SECONDS);
synchronized (mLock) {
if (!res) {
int gotRequestsCount = mNumberOfRequests - mPendingRequests.size();
mErrorList.add(
"Not enough responses received for getPropertiesAsync before timeout "
+ "(" + ASYNC_WAIT_TIMEOUT_IN_SEC + "s), expected "
+ mNumberOfRequests + " responses, got "
+ gotRequestsCount);
}
}
}
public List<String> getErrorList() {
List<String> errorList;
synchronized (mLock) {
errorList = new ArrayList<>(mErrorList);
}
return errorList;
}
public List<String> getResultList() {
List<String> resultList;
synchronized (mLock) {
resultList = new ArrayList<>(mResultList);
}
return resultList;
}
public List<PropIdAreaId> getReceivedPropIdAreaIds() {
List<PropIdAreaId> receivedPropIdAreaIds;
synchronized (mLock) {
receivedPropIdAreaIds = new ArrayList<>(mReceivedPropIdAreaIds);
}
return receivedPropIdAreaIds;
}
}
@Test
public void testGetIntArrayProperty() {
runWithShellPermissionIdentity(
() -> {
List<CarPropertyConfig> allConfigs = mCarPropertyManager.getPropertyList();
for (CarPropertyConfig cfg : allConfigs) {
if (cfg.getAccess() == CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_NONE
|| cfg.getAccess()
== CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_WRITE
|| cfg.getPropertyType() != Integer[].class) {
// skip the test if the property is not readable or not an int array
// type
// property.
continue;
}
switch (cfg.getPropertyId()) {
case VehiclePropertyIds.INFO_FUEL_TYPE:
int[] fuelTypes =
mCarPropertyManager.getIntArrayProperty(
cfg.getPropertyId(),
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL);
verifyEnumsRange(EXPECTED_FUEL_TYPES, fuelTypes);
break;
case VehiclePropertyIds.INFO_MULTI_EV_PORT_LOCATIONS:
int[] evPortLocations =
mCarPropertyManager.getIntArrayProperty(
cfg.getPropertyId(),
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL);
verifyEnumsRange(EXPECTED_PORT_LOCATIONS, evPortLocations);
break;
default:
int[] areaIds = getAreaIdsHelper(cfg);
for (int areaId : areaIds) {
mCarPropertyManager.getIntArrayProperty(
cfg.getPropertyId(), areaId);
}
}
}
});
}
private void verifyEnumsRange(List<Integer> expectedResults, int[] results) {
assertThat(results).isNotNull();
// If the property is not implemented in cars, getIntArrayProperty returns an empty array.
if (results.length == 0) {
return;
}
for (int result : results) {
assertThat(result).isIn(expectedResults);
}
}
@Test
public void testIsPropertyAvailable() {
runWithShellPermissionIdentity(
() -> {
List<CarPropertyConfig> configs =
mCarPropertyManager.getPropertyList(mPropertyIds);
for (CarPropertyConfig cfg : configs) {
int[] areaIds = getAreaIdsHelper(cfg);
for (int areaId : areaIds) {
assertThat(
mCarPropertyManager.isPropertyAvailable(
cfg.getPropertyId(), areaId))
.isTrue();
}
}
});
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#registerCallback"
})
public void testRegisterCallbackWithInvalidProp() throws Exception {
runWithShellPermissionIdentity(() -> {
int invalidPropertyId = -1;
assertThat(mCarPropertyManager.registerCallback(
new CarPropertyEventCounter(), invalidPropertyId, /* updateRateHz= */ 0))
.isFalse();
});
}
@Test
@ApiTest(
apis = {
"android.car.hardware.property.CarPropertyManager#getCarPropertyConfig",
"android.car.hardware.property.CarPropertyManager#registerCallback",
"android.car.hardware.property.CarPropertyManager#"
+ "unregisterCallback(CarPropertyEventCallback)"
})
public void testRegisterCallback() throws Exception {
runWithShellPermissionIdentity(
() -> {
int vehicleSpeed = VehiclePropertyIds.PERF_VEHICLE_SPEED;
CarPropertyConfig<?> carPropertyConfig =
mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.PERF_VEHICLE_SPEED);
float secondToMillis = 1_000;
long bufferMillis = 1_000; // 1 second
// timeoutMillis is set to the maximum expected time needed to receive the
// required
// number of PERF_VEHICLE_SPEED events for test. If the test does not receive
// the
// required number of events before the timeout expires, it fails.
long timeoutMillis =
((long)
((1.0f / carPropertyConfig.getMinSampleRate())
* secondToMillis
* UI_RATE_EVENT_COUNTER))
+ bufferMillis;
CarPropertyEventCounter speedListenerUI =
new CarPropertyEventCounter(timeoutMillis);
CarPropertyEventCounter speedListenerFast = new CarPropertyEventCounter();
assertThat(speedListenerUI.receivedEvent(vehicleSpeed)).isEqualTo(NO_EVENTS);
assertThat(speedListenerUI.receivedError(vehicleSpeed)).isEqualTo(NO_EVENTS);
assertThat(speedListenerUI.receivedErrorWithErrorCode(vehicleSpeed))
.isEqualTo(NO_EVENTS);
assertThat(speedListenerFast.receivedEvent(vehicleSpeed)).isEqualTo(NO_EVENTS);
assertThat(speedListenerFast.receivedError(vehicleSpeed)).isEqualTo(NO_EVENTS);
assertThat(speedListenerFast.receivedErrorWithErrorCode(vehicleSpeed))
.isEqualTo(NO_EVENTS);
speedListenerUI.resetCountDownLatch(UI_RATE_EVENT_COUNTER);
mCarPropertyManager.registerCallback(
speedListenerUI, vehicleSpeed, CarPropertyManager.SENSOR_RATE_UI);
mCarPropertyManager.registerCallback(
speedListenerFast,
vehicleSpeed,
CarPropertyManager.SENSOR_RATE_FASTEST);
speedListenerUI.assertOnChangeEventCalled();
mCarPropertyManager.unregisterCallback(speedListenerUI);
mCarPropertyManager.unregisterCallback(speedListenerFast);
assertThat(speedListenerUI.receivedEvent(vehicleSpeed))
.isGreaterThan(NO_EVENTS);
assertThat(speedListenerFast.receivedEvent(vehicleSpeed))
.isAtLeast(speedListenerUI.receivedEvent(vehicleSpeed));
// The test did not change property values, it should not get error with error
// codes.
assertThat(speedListenerUI.receivedErrorWithErrorCode(vehicleSpeed))
.isEqualTo(NO_EVENTS);
assertThat(speedListenerFast.receivedErrorWithErrorCode(vehicleSpeed))
.isEqualTo(NO_EVENTS);
// Test for on_change properties
int nightMode = VehiclePropertyIds.NIGHT_MODE;
CarPropertyEventCounter nightModeListener = new CarPropertyEventCounter();
nightModeListener.resetCountDownLatch(ONCHANGE_RATE_EVENT_COUNTER);
mCarPropertyManager.registerCallback(nightModeListener, nightMode, 0);
nightModeListener.assertOnChangeEventCalled();
assertThat(nightModeListener.receivedEvent(nightMode)).isEqualTo(1);
mCarPropertyManager.unregisterCallback(nightModeListener);
});
}
@Test
public void testUnregisterCallback() throws Exception {
runWithShellPermissionIdentity(
() -> {
int vehicleSpeed = VehiclePropertyIds.PERF_VEHICLE_SPEED;
CarPropertyEventCounter speedListenerNormal = new CarPropertyEventCounter();
CarPropertyEventCounter speedListenerUI = new CarPropertyEventCounter();
mCarPropertyManager.registerCallback(
speedListenerNormal,
vehicleSpeed,
CarPropertyManager.SENSOR_RATE_NORMAL);
// test on unregistering a callback that was never registered
try {
mCarPropertyManager.unregisterCallback(speedListenerUI);
} catch (Exception e) {
Assert.fail();
}
mCarPropertyManager.registerCallback(
speedListenerUI, vehicleSpeed, CarPropertyManager.SENSOR_RATE_UI);
speedListenerUI.resetCountDownLatch(UI_RATE_EVENT_COUNTER);
speedListenerUI.assertOnChangeEventCalled();
mCarPropertyManager.unregisterCallback(speedListenerNormal, vehicleSpeed);
int currentEventNormal = speedListenerNormal.receivedEvent(vehicleSpeed);
int currentEventUI = speedListenerUI.receivedEvent(vehicleSpeed);
// Because we copy the callback outside the lock, so even after
// unregisterCallback, one
// callback that is already copied out still might be called.
// As a result, we verify that the callback is not called more than once.
speedListenerNormal.assertOnChangeEventNotCalledWithinMs(WAIT_CALLBACK);
assertThat(speedListenerNormal.receivedEvent(vehicleSpeed))
.isEqualTo(currentEventNormal);
assertThat(speedListenerUI.receivedEvent(vehicleSpeed))
.isNotEqualTo(currentEventUI);
mCarPropertyManager.unregisterCallback(speedListenerUI);
speedListenerUI.assertOnChangeEventNotCalledWithinMs(WAIT_CALLBACK);
currentEventUI = speedListenerUI.receivedEvent(vehicleSpeed);
assertThat(speedListenerUI.receivedEvent(vehicleSpeed))
.isEqualTo(currentEventUI);
});
}
@Test
public void testUnregisterWithPropertyId() throws Exception {
runWithShellPermissionIdentity(
() -> {
// Ignores the test if wheel_tick property does not exist in the car.
assumeTrue(
"WheelTick is not available, skip unregisterCallback test",
mCarPropertyManager.isPropertyAvailable(
VehiclePropertyIds.WHEEL_TICK,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL));
CarPropertyConfig wheelTickConfig =
mCarPropertyManager.getCarPropertyConfig(VehiclePropertyIds.WHEEL_TICK);
CarPropertyConfig speedConfig =
mCarPropertyManager.getCarPropertyConfig(
VehiclePropertyIds.PERF_VEHICLE_SPEED);
float maxSampleRateHz =
Math.max(
wheelTickConfig.getMaxSampleRate(),
speedConfig.getMaxSampleRate());
int eventCounter = getCounterBySampleRate(maxSampleRateHz);
// Ignores the test if sampleRates for properties are too low.
assumeTrue(
"The SampleRates for properties are too low, "
+ "skip testUnregisterWithPropertyId test",
eventCounter != 0);
CarPropertyEventCounter speedAndWheelTicksListener =
new CarPropertyEventCounter();
// CarService will register them to the maxSampleRate in CarPropertyConfig
mCarPropertyManager.registerCallback(
speedAndWheelTicksListener,
VehiclePropertyIds.PERF_VEHICLE_SPEED,
CarPropertyManager.SENSOR_RATE_FASTEST);
mCarPropertyManager.registerCallback(
speedAndWheelTicksListener,
VehiclePropertyIds.WHEEL_TICK,
CarPropertyManager.SENSOR_RATE_FASTEST);
speedAndWheelTicksListener.resetCountDownLatch(eventCounter);
speedAndWheelTicksListener.assertOnChangeEventCalled();
// Tests unregister the individual property
mCarPropertyManager.unregisterCallback(
speedAndWheelTicksListener, VehiclePropertyIds.PERF_VEHICLE_SPEED);
// Updates counter after unregistering the PERF_VEHICLE_SPEED
int wheelTickEventCounter =
getCounterBySampleRate(wheelTickConfig.getMaxSampleRate());
speedAndWheelTicksListener.resetCountDownLatch(wheelTickEventCounter);
speedAndWheelTicksListener.assertOnChangeEventCalled();
int speedEventCountAfterFirstCountDown =
speedAndWheelTicksListener.receivedEvent(
VehiclePropertyIds.PERF_VEHICLE_SPEED);
int wheelTickEventCountAfterFirstCountDown =
speedAndWheelTicksListener.receivedEvent(VehiclePropertyIds.WHEEL_TICK);
speedAndWheelTicksListener.resetCountDownLatch(wheelTickEventCounter);
speedAndWheelTicksListener.assertOnChangeEventCalled();
int speedEventCountAfterSecondCountDown =
speedAndWheelTicksListener.receivedEvent(
VehiclePropertyIds.PERF_VEHICLE_SPEED);
int wheelTickEventCountAfterSecondCountDown =
speedAndWheelTicksListener.receivedEvent(VehiclePropertyIds.WHEEL_TICK);
assertThat(speedEventCountAfterFirstCountDown)
.isEqualTo(speedEventCountAfterSecondCountDown);
assertThat(wheelTickEventCountAfterSecondCountDown)
.isGreaterThan(wheelTickEventCountAfterFirstCountDown);
});
}
@Test
public void testNoPropertyPermissionsGranted() {
assertWithMessage("CarPropertyManager.getPropertyList()")
.that(mCarPropertyManager.getPropertyList())
.isEmpty();
}
@Test
public void testPermissionReadDriverMonitoringSettingsGranted() {
runWithShellPermissionIdentity(
() -> {
for (CarPropertyConfig<?> carPropertyConfig :
mCarPropertyManager.getPropertyList()) {
assertWithMessage(
"%s",
VehiclePropertyIds.toString(
carPropertyConfig.getPropertyId()))
.that(carPropertyConfig.getPropertyId())
.isIn(PERMISSION_READ_DRIVER_MONITORING_SETTINGS_PROPERTIES);
}
},
Car.PERMISSION_READ_DRIVER_MONITORING_SETTINGS);
}
@Test
public void testPermissionControlDriverMonitoringSettingsGranted() {
runWithShellPermissionIdentity(
() -> {
for (CarPropertyConfig<?> carPropertyConfig :
mCarPropertyManager.getPropertyList()) {
assertWithMessage(
"%s",
VehiclePropertyIds.toString(
carPropertyConfig.getPropertyId()))
.that(carPropertyConfig.getPropertyId())
.isIn(PERMISSION_CONTROL_DRIVER_MONITORING_SETTINGS_PROPERTIES);
}
},
Car.PERMISSION_CONTROL_DRIVER_MONITORING_SETTINGS);
}
@Test
public void testPermissionReadDriverMonitoringStatesGranted() {
runWithShellPermissionIdentity(
() -> {
for (CarPropertyConfig<?> carPropertyConfig :
mCarPropertyManager.getPropertyList()) {
assertWithMessage(
"%s",
VehiclePropertyIds.toString(
carPropertyConfig.getPropertyId()))
.that(carPropertyConfig.getPropertyId())
.isIn(PERMISSION_READ_DRIVER_MONITORING_STATES_PROPERTIES);
}
},
Car.PERMISSION_READ_DRIVER_MONITORING_STATES);
}
@Test
public void testPermissionCarEnergyGranted() {
runWithShellPermissionIdentity(
() -> {
for (CarPropertyConfig<?> carPropertyConfig :
mCarPropertyManager.getPropertyList()) {
assertWithMessage(
"%s",
VehiclePropertyIds.toString(
carPropertyConfig.getPropertyId()))
.that(carPropertyConfig.getPropertyId())
.isIn(PERMISSION_CAR_ENERGY_PROPERTIES);
}
},
Car.PERMISSION_ENERGY);
}
@Test
public void testPermissionCarEnergyPortsGranted() {
runWithShellPermissionIdentity(
() -> {
for (CarPropertyConfig<?> carPropertyConfig :
mCarPropertyManager.getPropertyList()) {
assertWithMessage(
"%s",
VehiclePropertyIds.toString(
carPropertyConfig.getPropertyId()))
.that(carPropertyConfig.getPropertyId())
.isIn(PERMISSION_CAR_ENERGY_PORTS_PROPERTIES);
}
},
Car.PERMISSION_ENERGY_PORTS);
}
@Test
public void testPermissionCarExteriorEnvironmentGranted() {
runWithShellPermissionIdentity(
() -> {
for (CarPropertyConfig<?> carPropertyConfig :
mCarPropertyManager.getPropertyList()) {
assertWithMessage(
"%s",
VehiclePropertyIds.toString(
carPropertyConfig.getPropertyId()))
.that(carPropertyConfig.getPropertyId())
.isIn(PERMISSION_CAR_EXTERIOR_ENVIRONMENT_PROPERTIES);
}
},
Car.PERMISSION_EXTERIOR_ENVIRONMENT);
}
@Test
public void testPermissionCarInfoGranted() {
runWithShellPermissionIdentity(
() -> {
for (CarPropertyConfig<?> carPropertyConfig :
mCarPropertyManager.getPropertyList()) {
assertWithMessage(
"%s",
VehiclePropertyIds.toString(
carPropertyConfig.getPropertyId()))
.that(carPropertyConfig.getPropertyId())
.isIn(PERMISSION_CAR_INFO_PROPERTIES);
}
},
Car.PERMISSION_CAR_INFO);
}
@Test
public void testPermissionCarPowertrainGranted() {
runWithShellPermissionIdentity(
() -> {
for (CarPropertyConfig<?> carPropertyConfig :
mCarPropertyManager.getPropertyList()) {
assertWithMessage(
"%s",
VehiclePropertyIds.toString(
carPropertyConfig.getPropertyId()))
.that(carPropertyConfig.getPropertyId())
.isIn(PERMISSION_CAR_POWERTRAIN_PROPERTIES);
}
},
Car.PERMISSION_POWERTRAIN);
}
@Test
public void testPermissionControlCarPowertrainGranted() {
runWithShellPermissionIdentity(
() -> {
for (CarPropertyConfig<?> carPropertyConfig :
mCarPropertyManager.getPropertyList()) {
assertWithMessage(
"%s",
VehiclePropertyIds.toString(
carPropertyConfig.getPropertyId()))
.that(carPropertyConfig.getPropertyId())
.isIn(PERMISSION_CONTROL_CAR_POWERTRAIN_PROPERTIES);
}
},
Car.PERMISSION_CONTROL_POWERTRAIN);
}
@Test
public void testPermissionCarSpeedGranted() {
runWithShellPermissionIdentity(
() -> {
for (CarPropertyConfig<?> carPropertyConfig :
mCarPropertyManager.getPropertyList()) {
assertWithMessage(
"%s",
VehiclePropertyIds.toString(
carPropertyConfig.getPropertyId()))
.that(carPropertyConfig.getPropertyId())
.isIn(PERMISSION_CAR_SPEED_PROPERTIES);
}
},
Car.PERMISSION_SPEED);
}
@Test
public void testPermissionReadCarDisplayUnitsGranted() {
runWithShellPermissionIdentity(
() -> {
for (CarPropertyConfig<?> carPropertyConfig :
mCarPropertyManager.getPropertyList()) {
assertWithMessage(
"%s",
VehiclePropertyIds.toString(
carPropertyConfig.getPropertyId()))
.that(carPropertyConfig.getPropertyId())
.isIn(PERMISSION_READ_CAR_DISPLAY_UNITS_PROPERTIES);
}
},
Car.PERMISSION_READ_DISPLAY_UNITS);
}
@Test
public void testPermissionControlSteeringWheelGranted() {
runWithShellPermissionIdentity(
() -> {
for (CarPropertyConfig<?> carPropertyConfig :
mCarPropertyManager.getPropertyList()) {
assertWithMessage(
"%s",
VehiclePropertyIds.toString(
carPropertyConfig.getPropertyId()))
.that(carPropertyConfig.getPropertyId())
.isIn(PERMISSION_CONTROL_CAR_STEERING_WHEEL_PROPERTIES);
}
},
Car.PERMISSION_CONTROL_STEERING_WHEEL);
}
@Test
public void testPermissionReadAdasSettingsGranted() {
runWithShellPermissionIdentity(
() -> {
for (CarPropertyConfig<?> carPropertyConfig :
mCarPropertyManager.getPropertyList()) {
assertWithMessage(
"%s",
VehiclePropertyIds.toString(
carPropertyConfig.getPropertyId()))
.that(carPropertyConfig.getPropertyId())
.isIn(PERMISSION_READ_ADAS_SETTINGS_PROPERTIES);
}
},
Car.PERMISSION_READ_ADAS_SETTINGS);
}
@Test
public void testPermissionControlAdasSettingsGranted() {
runWithShellPermissionIdentity(
() -> {
for (CarPropertyConfig<?> carPropertyConfig :
mCarPropertyManager.getPropertyList()) {
assertWithMessage(
"%s",
VehiclePropertyIds.toString(
carPropertyConfig.getPropertyId()))
.that(carPropertyConfig.getPropertyId())
.isIn(PERMISSION_CONTROL_ADAS_SETTINGS_PROPERTIES);
}
},
Car.PERMISSION_CONTROL_ADAS_SETTINGS);
}
@Test
public void testPermissionReadAdasStatesGranted() {
runWithShellPermissionIdentity(
() -> {
for (CarPropertyConfig<?> carPropertyConfig :
mCarPropertyManager.getPropertyList()) {
assertWithMessage(
"%s",
VehiclePropertyIds.toString(
carPropertyConfig.getPropertyId()))
.that(carPropertyConfig.getPropertyId())
.isIn(PERMISSION_READ_ADAS_STATES_PROPERTIES);
}
},
Car.PERMISSION_READ_ADAS_STATES);
}
@Test
public void testPermissionControlAdasStatesGranted() {
runWithShellPermissionIdentity(
() -> {
for (CarPropertyConfig<?> carPropertyConfig :
mCarPropertyManager.getPropertyList()) {
assertWithMessage(
"%s",
VehiclePropertyIds.toString(
carPropertyConfig.getPropertyId()))
.that(carPropertyConfig.getPropertyId())
.isIn(PERMISSION_CONTROL_ADAS_STATES_PROPERTIES);
}
},
Car.PERMISSION_CONTROL_ADAS_STATES);
}
private int getCounterBySampleRate(float maxSampleRateHz) {
if (Float.compare(maxSampleRateHz, (float) FAST_OR_FASTEST_EVENT_COUNTER) > 0) {
return FAST_OR_FASTEST_EVENT_COUNTER;
} else if (Float.compare(maxSampleRateHz, (float) UI_RATE_EVENT_COUNTER) > 0) {
return UI_RATE_EVENT_COUNTER;
} else if (Float.compare(maxSampleRateHz, (float) ONCHANGE_RATE_EVENT_COUNTER) > 0) {
return ONCHANGE_RATE_EVENT_COUNTER;
} else {
return 0;
}
}
// Returns {0} if the property is global property, otherwise query areaId for CarPropertyConfig
private int[] getAreaIdsHelper(CarPropertyConfig config) {
if (config.isGlobalProperty()) {
return new int[]{0};
} else {
return config.getAreaIds();
}
}
private static class CarPropertyEventCounter implements CarPropertyEventCallback {
private final Object mLock = new Object();
@GuardedBy("mLock")
private final SparseArray<Integer> mEventCounter = new SparseArray<>();
@GuardedBy("mLock")
private final SparseArray<Integer> mErrorCounter = new SparseArray<>();
@GuardedBy("mLock")
private final SparseArray<Integer> mErrorWithErrorCodeCounter = new SparseArray<>();
@GuardedBy("mLock")
private int mCounter = FAST_OR_FASTEST_EVENT_COUNTER;
@GuardedBy("mLock")
private CountDownLatch mCountDownLatch = new CountDownLatch(mCounter);
private final long mTimeoutMillis;
CarPropertyEventCounter(long timeoutMillis) {
mTimeoutMillis = timeoutMillis;
}
CarPropertyEventCounter() {
this(WAIT_CALLBACK);
}
public int receivedEvent(int propId) {
int val;
synchronized (mLock) {
val = mEventCounter.get(propId, 0);
}
return val;
}
public int receivedError(int propId) {
int val;
synchronized (mLock) {
val = mErrorCounter.get(propId, 0);
}
return val;
}
public int receivedErrorWithErrorCode(int propId) {
int val;
synchronized (mLock) {
val = mErrorWithErrorCodeCounter.get(propId, 0);
}
return val;
}
@Override
public void onChangeEvent(CarPropertyValue value) {
synchronized (mLock) {
int val = mEventCounter.get(value.getPropertyId(), 0) + 1;
mEventCounter.put(value.getPropertyId(), val);
mCountDownLatch.countDown();
}
}
@Override
public void onErrorEvent(int propId, int zone) {
synchronized (mLock) {
int val = mErrorCounter.get(propId, 0) + 1;
mErrorCounter.put(propId, val);
}
}
@Override
public void onErrorEvent(int propId, int areaId, int errorCode) {
synchronized (mLock) {
int val = mErrorWithErrorCodeCounter.get(propId, 0) + 1;
mErrorWithErrorCodeCounter.put(propId, val);
}
}
public void resetCountDownLatch(int counter) {
synchronized (mLock) {
mCountDownLatch = new CountDownLatch(counter);
mCounter = counter;
}
}
public void assertOnChangeEventCalled() throws InterruptedException {
CountDownLatch countDownLatch;
int counter;
synchronized (mLock) {
countDownLatch = mCountDownLatch;
counter = mCounter;
}
if (!countDownLatch.await(mTimeoutMillis, TimeUnit.MILLISECONDS)) {
throw new IllegalStateException(
"Callback is not called "
+ counter
+ "times in "
+ mTimeoutMillis
+ " ms. It was only called "
+ (counter - countDownLatch.getCount())
+ " times.");
}
}
public void assertOnChangeEventNotCalledWithinMs(long durationInMs)
throws InterruptedException {
CountDownLatch countDownLatch;
synchronized (mLock) {
mCountDownLatch = new CountDownLatch(1);
countDownLatch = mCountDownLatch;
}
long timeoutMillis = 2 * durationInMs;
long startTimeMillis = SystemClock.uptimeMillis();
while (true) {
if (countDownLatch.await(durationInMs, TimeUnit.MILLISECONDS)) {
if (SystemClock.uptimeMillis() - startTimeMillis > timeoutMillis) {
// If we are still receiving events when timeout happens, the test
// failed.
throw new IllegalStateException(
"We are still receiving callback within "
+ durationInMs
+ " seconds after "
+ timeoutMillis
+ " ms.");
}
// Receive a event within the time period. This means there are still events
// being generated. Wait for another period and hope the events stop.
synchronized (mLock) {
mCountDownLatch = new CountDownLatch(1);
countDownLatch = mCountDownLatch;
}
} else {
break;
}
}
}
}
}