[go: nahoru, domu]

blob: d5ae1f91dfb60ea5b7aea599ed45f8e89d26b85f [file] [log] [blame]
/*
* Copyright 2022 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 androidx.car.app.hardware.climate;
import static android.car.VehiclePropertyIds.HVAC_AC_ON;
import static android.car.VehiclePropertyIds.HVAC_AUTO_ON;
import static android.car.VehiclePropertyIds.HVAC_AUTO_RECIRC_ON;
import static android.car.VehiclePropertyIds.HVAC_DEFROSTER;
import static android.car.VehiclePropertyIds.HVAC_DUAL_ON;
import static android.car.VehiclePropertyIds.HVAC_FAN_DIRECTION;
import static android.car.VehiclePropertyIds.HVAC_FAN_SPEED;
import static android.car.VehiclePropertyIds.HVAC_MAX_AC_ON;
import static android.car.VehiclePropertyIds.HVAC_MAX_DEFROST_ON;
import static android.car.VehiclePropertyIds.HVAC_POWER_ON;
import static android.car.VehiclePropertyIds.HVAC_RECIRC_ON;
import static android.car.VehiclePropertyIds.HVAC_SEAT_TEMPERATURE;
import static android.car.VehiclePropertyIds.HVAC_SEAT_VENTILATION;
import static android.car.VehiclePropertyIds.HVAC_STEERING_WHEEL_HEAT;
import static android.car.VehiclePropertyIds.HVAC_TEMPERATURE_SET;
import static androidx.car.app.hardware.climate.AutomotiveCarClimate.DEFAULT_SAMPLE_RATE_HZ;
import static androidx.car.app.hardware.climate.AutomotiveCarClimate.HVAC_ELECTRIC_DEFROSTER;
import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_CABIN_TEMPERATURE;
import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_FAN_DIRECTION;
import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_FAN_SPEED;
import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_HVAC_AC;
import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_HVAC_AUTO_MODE;
import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_HVAC_AUTO_RECIRCULATION;
import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_HVAC_DEFROSTER;
import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_HVAC_DUAL_MODE;
import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_HVAC_ELECTRIC_DEFROSTER;
import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_HVAC_MAX_AC;
import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_HVAC_MAX_DEFROSTER;
import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_HVAC_POWER;
import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_HVAC_RECIRCULATION;
import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_SEAT_TEMPERATURE_LEVEL;
import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_SEAT_VENTILATION_LEVEL;
import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_STEERING_WHEEL_HEAT;
import static androidx.car.app.hardware.common.CarValue.STATUS_SUCCESS;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
import static org.junit.Assert.assertThrows;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.car.Car;
import android.car.hardware.property.CarPropertyManager;
import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.car.app.hardware.common.CarPropertyProfile;
import androidx.car.app.hardware.common.CarPropertyResponse;
import androidx.car.app.hardware.common.CarValue;
import androidx.car.app.hardware.common.CarZone;
import androidx.car.app.hardware.common.OnCarPropertyResponseListener;
import androidx.car.app.hardware.common.PropertyManager;
import androidx.car.app.shadows.car.ShadowCar;
import androidx.test.rule.GrantPermissionRule;
import com.google.common.collect.ImmutableMap;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.annotation.internal.DoNotInstrument;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicReference;
@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE, shadows = {ShadowCar.class})
@DoNotInstrument
public class AutomotiveCarClimateTest {
private static final CarZone FRONT_LEFT_ZONE = new CarZone.Builder()
.setRow(CarZone.CAR_ZONE_ROW_FIRST)
.setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build();
private static final CarZone FRONT_RIGHT_ZONE = new CarZone.Builder()
.setRow(CarZone.CAR_ZONE_ROW_FIRST)
.setColumn(CarZone.CAR_ZONE_COLUMN_RIGHT).build();
@Rule
public GrantPermissionRule mPermissionsRule = GrantPermissionRule.grant(
"android.car.permission.CONTROL_CAR_CLIMATE");
private List<CarPropertyResponse<?>> mResponse;
private List<CarPropertyProfile<?>> mCarPropertyProfiles;
private CountDownLatch mCountDownLatch;
private final Executor mExecutor = directExecutor();
private AutomotiveCarClimate mAutomotiveCarClimate;
private CarZone mCarZone;
@Mock
private Car mCarMock;
@Mock
private CarPropertyManager mCarPropertyManagerMock;
@Mock
private PropertyManager mPropertyManager;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
ShadowCar.setCar(mCarMock);
when(mCarMock.getCarManager(anyString())).thenReturn(mCarPropertyManagerMock);
mAutomotiveCarClimate = new AutomotiveCarClimate(mPropertyManager);
mCountDownLatch = new CountDownLatch(1);
mResponse = new ArrayList<>();
mCarPropertyProfiles = new ArrayList<>();
mCarZone = new CarZone.Builder().build();
}
@Test
public void registerHvacPower_verifyResponse() throws InterruptedException {
CarClimateFeature.Builder carClimateBuilder = new CarClimateFeature.Builder(
FEATURE_HVAC_POWER);
carClimateBuilder.addCarZones(mCarZone);
CarClimateFeature mCarClimateFeature = new CarClimateFeature(carClimateBuilder);
RegisterClimateStateRequest.Builder builder =
new RegisterClimateStateRequest.Builder(false);
builder.addClimateRegisterFeatures(mCarClimateFeature);
AtomicReference<CarValue<Boolean>> loadedResult = new AtomicReference<>();
CarClimateStateCallback listener = new CarClimateStateCallback() {
@Override
public void onHvacPowerStateAvailable(@NonNull CarValue<Boolean> hvacPowerState) {
loadedResult.set(hvacPowerState);
mCountDownLatch.countDown();
}
};
mAutomotiveCarClimate.registerClimateStateCallback(mExecutor, builder.build(), listener);
Map<Integer, List<CarZone>> propertyIdsWithCarZones =
ImmutableMap.<Integer, List<CarZone>>builder().put(HVAC_POWER_ON,
Collections.singletonList(mCarZone)).buildKeepingLast();
ArgumentCaptor<OnCarPropertyResponseListener> captor = ArgumentCaptor.forClass(
OnCarPropertyResponseListener.class);
verify(mPropertyManager).submitRegisterListenerRequest(eq(propertyIdsWithCarZones),
eq(DEFAULT_SAMPLE_RATE_HZ), captor.capture(), eq(mExecutor));
mResponse.add(CarPropertyResponse.builder().setPropertyId(HVAC_POWER_ON).setCarZones(
Collections.singletonList(mCarZone)).setValue(true).setStatus(
STATUS_SUCCESS).build());
captor.getValue().onCarPropertyResponses(mResponse);
mCountDownLatch.await();
CarValue<Boolean> carValue = loadedResult.get();
assertThat(carValue.getValue()).isEqualTo(true);
assertThat(carValue.getCarZones()).isEqualTo(Collections.singletonList(mCarZone));
assertThat(carValue.getStatus()).isEqualTo(STATUS_SUCCESS);
}
@Test
public void registerElectricDefroster_verifyResponse() throws InterruptedException {
CarClimateFeature.Builder carClimateBuilder = new CarClimateFeature.Builder(
FEATURE_HVAC_ELECTRIC_DEFROSTER);
carClimateBuilder.addCarZones(mCarZone);
CarClimateFeature mCarClimateFeature = new CarClimateFeature(carClimateBuilder);
RegisterClimateStateRequest.Builder builder =
new RegisterClimateStateRequest.Builder(false);
builder.addClimateRegisterFeatures(mCarClimateFeature);
AtomicReference<CarValue<Boolean>> loadedResult = new AtomicReference<>();
CarClimateStateCallback listener = new CarClimateStateCallback() {
@Override
public void onElectricDefrosterStateAvailable(
@NonNull CarValue<Boolean> electricDefrosterState) {
loadedResult.set(electricDefrosterState);
mCountDownLatch.countDown();
}
};
mAutomotiveCarClimate.registerClimateStateCallback(mExecutor, builder.build(), listener);
Map<Integer, List<CarZone>> propertyIdsWithCarZones =
ImmutableMap.<Integer, List<CarZone>>builder().put(HVAC_ELECTRIC_DEFROSTER,
Collections.singletonList(mCarZone)).buildKeepingLast();
ArgumentCaptor<OnCarPropertyResponseListener> captor = ArgumentCaptor.forClass(
OnCarPropertyResponseListener.class);
verify(mPropertyManager).submitRegisterListenerRequest(eq(propertyIdsWithCarZones),
eq(DEFAULT_SAMPLE_RATE_HZ), captor.capture(), eq(mExecutor));
mResponse.add(CarPropertyResponse.builder().setPropertyId(HVAC_ELECTRIC_DEFROSTER)
.setCarZones(Collections.singletonList(mCarZone)).setValue(true).setStatus(
STATUS_SUCCESS).build());
captor.getValue().onCarPropertyResponses(mResponse);
mCountDownLatch.await();
CarValue<Boolean> carValue = loadedResult.get();
assertThat(carValue.getValue()).isEqualTo(true);
assertThat(carValue.getCarZones()).isEqualTo(Collections.singletonList(mCarZone));
assertThat(carValue.getStatus()).isEqualTo(STATUS_SUCCESS);
}
@Test
public void fetchHvacPower_verifyResponse() throws InterruptedException {
List<Set<CarZone>> carZones = new ArrayList<>();
carZones.add(Collections.singleton(FRONT_LEFT_ZONE));
carZones.add(Collections.singleton(FRONT_RIGHT_ZONE));
List<Integer> propertyIds = Collections.singletonList(HVAC_POWER_ON);
mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_POWER_ON)
.setCarZones(carZones).setStatus(STATUS_SUCCESS).build());
ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
Futures.immediateFuture(mCarPropertyProfiles);
when(mPropertyManager.fetchSupportedZonesResponse(
eq(propertyIds), eq(mExecutor))).thenReturn(
listenableCarPropertyProfile);
AtomicReference<HvacPowerProfile> loadedResult = new AtomicReference<>();
CarClimateProfileCallback listener = new CarClimateProfileCallback() {
@Override
public void onHvacPowerProfileAvailable(@NonNull HvacPowerProfile hvacPowerProfile) {
loadedResult.set(hvacPowerProfile);
mCountDownLatch.countDown();
}
};
CarClimateFeature.Builder carClimateBuilder = new CarClimateFeature.Builder(
FEATURE_HVAC_POWER);
carClimateBuilder.addCarZones(FRONT_LEFT_ZONE);
carClimateBuilder.addCarZones(FRONT_RIGHT_ZONE);
CarClimateFeature mCarClimateFeature = new CarClimateFeature(carClimateBuilder);
ClimateProfileRequest.Builder builder =
new ClimateProfileRequest.Builder();
builder.addClimateProfileFeatures(mCarClimateFeature);
mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
eq(propertyIds),
eq(mExecutor));
mCountDownLatch.await();
assertThat(loadedResult.get().getSupportedCarZoneSets()).isEqualTo(carZones);
}
@Test
public void fetchCabinConfigArrayTemperature_verifyResponse() throws InterruptedException {
List<Set<CarZone>> carZones = new ArrayList<>();
carZones.add(Collections.singleton(FRONT_LEFT_ZONE));
carZones.add(Collections.singleton(FRONT_RIGHT_ZONE));
List<Integer> propertyIds = Collections.singletonList(HVAC_TEMPERATURE_SET);
mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_TEMPERATURE_SET)
.setCelsiusIncrement(1f)
.setCelsiusRange(new Pair<>(16.0f, 18.0f))
.setFahrenheitRange(new Pair<>(60.5f, 64.5f))
.setFahrenheitIncrement(0.5f)
.setCarZoneSetsToMinMaxRange(null)
.setCarZones(carZones)
.setStatus(STATUS_SUCCESS)
.build());
ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfiles =
Futures.immediateFuture(mCarPropertyProfiles);
when(mPropertyManager.fetchSupportedZonesResponse(
eq(propertyIds), eq(mExecutor))).thenReturn(
listenableCarPropertyProfiles);
AtomicReference<CabinTemperatureProfile> loadedResult = new AtomicReference<>();
CarClimateProfileCallback listener = new CarClimateProfileCallback() {
@Override
public void onCabinTemperatureProfileAvailable(@NonNull CabinTemperatureProfile
cabinTemperatureProfile) {
loadedResult.set(cabinTemperatureProfile);
CabinTemperatureProfile response = loadedResult.get();
mCountDownLatch.countDown();
}
};
CarClimateFeature.Builder carClimateBuilder = new CarClimateFeature.Builder(
FEATURE_CABIN_TEMPERATURE);
carClimateBuilder.addCarZones(FRONT_LEFT_ZONE);
carClimateBuilder.addCarZones(FRONT_RIGHT_ZONE);
CarClimateFeature mCarClimateFeature = new CarClimateFeature(carClimateBuilder);
ClimateProfileRequest.Builder builder =
new ClimateProfileRequest.Builder();
builder.addClimateProfileFeatures(mCarClimateFeature);
mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
eq(propertyIds),
eq(mExecutor));
mCountDownLatch.await();
CabinTemperatureProfile cabinTemperatureProfile = loadedResult.get();
assertThat(cabinTemperatureProfile.getSupportedMinMaxCelsiusRange())
.isEqualTo(new Pair<>(16.0f, 18.0f));
assertThat(cabinTemperatureProfile.getSupportedMinMaxFahrenheitRange())
.isEqualTo(new Pair<>(60.5f, 64.5f));
assertThat(cabinTemperatureProfile.getCelsiusSupportedIncrement())
.isEqualTo(1f);
assertThat(cabinTemperatureProfile.getFahrenheitSupportedIncrement())
.isEqualTo(0.5f);
assertThrows(IllegalStateException.class,
cabinTemperatureProfile::getCarZoneSetsToCabinCelsiusTemperatureRanges);
}
@Test
public void fetchMinMaxCabinTemperature_verifyResponse() throws InterruptedException {
List<Set<CarZone>> carZones = new ArrayList<>();
carZones.add(Collections.singleton(FRONT_LEFT_ZONE));
carZones.add(Collections.singleton(FRONT_RIGHT_ZONE));
List<Integer> propertyIds = Collections.singletonList(HVAC_TEMPERATURE_SET);
Map<Set<CarZone>, Pair<Object, Object>> requestMinMaxValueMap = new HashMap<>();
requestMinMaxValueMap.put(Collections.singleton(FRONT_LEFT_ZONE), new Pair<>(16f, 32f));
requestMinMaxValueMap.put(Collections.singleton(FRONT_RIGHT_ZONE), new Pair<>(16f, 32f));
mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_TEMPERATURE_SET)
.setCelsiusRange(null)
.setFahrenheitRange(null)
.setCelsiusIncrement(-1f)
.setFahrenheitIncrement(-1f)
.setCarZoneSetsToMinMaxRange(requestMinMaxValueMap)
.setCarZones(carZones)
.setStatus(STATUS_SUCCESS)
.build());
ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfiles =
Futures.immediateFuture(mCarPropertyProfiles);
when(mPropertyManager.fetchSupportedZonesResponse(
eq(propertyIds), eq(mExecutor))).thenReturn(
listenableCarPropertyProfiles);
AtomicReference<CabinTemperatureProfile> loadedResult = new AtomicReference<>();
CarClimateProfileCallback listener = new CarClimateProfileCallback() {
@Override
public void onCabinTemperatureProfileAvailable(@NonNull CabinTemperatureProfile
cabinTemperatureProfile) {
loadedResult.set(cabinTemperatureProfile);
CabinTemperatureProfile response = loadedResult.get();
mCountDownLatch.countDown();
}
};
CarClimateFeature.Builder mCarClimateBuilder = new CarClimateFeature.Builder(
FEATURE_CABIN_TEMPERATURE);
mCarClimateBuilder.addCarZones(FRONT_LEFT_ZONE);
mCarClimateBuilder.addCarZones(FRONT_RIGHT_ZONE);
CarClimateFeature mCarClimateFeature = new CarClimateFeature(mCarClimateBuilder);
ClimateProfileRequest.Builder builder =
new ClimateProfileRequest.Builder();
builder.addClimateProfileFeatures(mCarClimateFeature);
mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
eq(propertyIds),
eq(mExecutor));
mCountDownLatch.await();
CabinTemperatureProfile cabinTemperatureProfile = loadedResult.get();
Map<Set<CarZone>, Pair<Object, Object>> responseMinMaxValueMap = new HashMap<>();
responseMinMaxValueMap.put(Collections.singleton(FRONT_LEFT_ZONE),
new Pair<>(16.0f, 32.0f));
responseMinMaxValueMap.put(Collections.singleton(FRONT_RIGHT_ZONE),
new Pair<>(16.0f, 32.0f));
assertThat(cabinTemperatureProfile.getCarZoneSetsToCabinCelsiusTemperatureRanges())
.isEqualTo(responseMinMaxValueMap);
assertThrows(IllegalStateException.class,
cabinTemperatureProfile::getSupportedMinMaxCelsiusRange);
assertThrows(IllegalStateException.class,
cabinTemperatureProfile::getSupportedMinMaxFahrenheitRange);
assertThrows(IllegalStateException.class,
cabinTemperatureProfile::getCelsiusSupportedIncrement);
assertThrows(IllegalStateException.class,
cabinTemperatureProfile::getFahrenheitSupportedIncrement);
}
@Test
public void fetchFanSpeed_verifyResponse() throws InterruptedException {
Map<Set<CarZone>, Pair<Object, Object>> minMaxValueMap = new HashMap<>();
minMaxValueMap.put(Collections.singleton(FRONT_LEFT_ZONE), new Pair<>(1, 7));
minMaxValueMap.put(Collections.singleton(FRONT_RIGHT_ZONE), new Pair<>(2, 6));
List<Set<CarZone>> carZones = new ArrayList<>();
carZones.add(Collections.singleton(FRONT_LEFT_ZONE));
carZones.add(Collections.singleton(FRONT_RIGHT_ZONE));
List<Integer> propertyIds = Collections.singletonList(HVAC_FAN_SPEED);
mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_FAN_SPEED)
.setCarZones(carZones).setCarZoneSetsToMinMaxRange(minMaxValueMap)
.setStatus(STATUS_SUCCESS).build());
ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
Futures.immediateFuture(mCarPropertyProfiles);
when(mPropertyManager.fetchSupportedZonesResponse(
eq(propertyIds), eq(mExecutor))).thenReturn(listenableCarPropertyProfile);
AtomicReference<FanSpeedLevelProfile> loadedResult = new AtomicReference<>();
CarClimateProfileCallback listener = new CarClimateProfileCallback() {
@Override
public void onFanSpeedLevelProfileAvailable(@NonNull FanSpeedLevelProfile
fanSpeedLevelProfile) {
loadedResult.set(fanSpeedLevelProfile);
mCountDownLatch.countDown();
}
};
CarClimateFeature.Builder carClimateBuilder = new CarClimateFeature.Builder(
FEATURE_FAN_SPEED);
carClimateBuilder.addCarZones(FRONT_LEFT_ZONE);
carClimateBuilder.addCarZones(FRONT_RIGHT_ZONE);
CarClimateFeature mCarClimateFeature = new CarClimateFeature(carClimateBuilder);
ClimateProfileRequest.Builder builder =
new ClimateProfileRequest.Builder();
builder.addClimateProfileFeatures(mCarClimateFeature);
mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
eq(propertyIds),
eq(mExecutor));
mCountDownLatch.await();
assertThat(loadedResult.get().getCarZoneSetsToFanSpeedLevelRanges()).isEqualTo(
minMaxValueMap);
}
@Test
public void fetchFanDirection_verifyResponse() throws InterruptedException {
Map<Set<CarZone>, Set<Integer>> fanDirectionValues = new HashMap<>();
fanDirectionValues.put(Collections.singleton(FRONT_LEFT_ZONE), Collections.singleton(1));
fanDirectionValues.put(Collections.singleton(FRONT_RIGHT_ZONE), Collections.singleton(6));
List<Set<CarZone>> carZones = new ArrayList<>();
carZones.add(Collections.singleton(FRONT_LEFT_ZONE));
carZones.add(Collections.singleton(FRONT_RIGHT_ZONE));
mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_FAN_DIRECTION)
.setCarZones(carZones).setHvacFanDirection(fanDirectionValues)
.setStatus(STATUS_SUCCESS).build());
ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
Futures.immediateFuture(mCarPropertyProfiles);
List<Integer> propertyIds = Collections.singletonList(HVAC_FAN_DIRECTION);
when(mPropertyManager.fetchSupportedZonesResponse(
eq(propertyIds), eq(mExecutor))).thenReturn(
listenableCarPropertyProfile);
AtomicReference<FanDirectionProfile> loadedResult = new AtomicReference<>();
CarClimateProfileCallback listener = new CarClimateProfileCallback() {
@Override
public void onFanDirectionProfileAvailable(@NonNull FanDirectionProfile
fanDirectionProfile) {
loadedResult.set(fanDirectionProfile);
mCountDownLatch.countDown();
}
};
CarClimateFeature.Builder carClimateBuilder = new CarClimateFeature.Builder(
FEATURE_FAN_DIRECTION);
carClimateBuilder.addCarZones(FRONT_LEFT_ZONE);
carClimateBuilder.addCarZones(FRONT_RIGHT_ZONE);
CarClimateFeature mCarClimateFeature = new CarClimateFeature(carClimateBuilder);
ClimateProfileRequest.Builder builder =
new ClimateProfileRequest.Builder();
builder.addClimateProfileFeatures(mCarClimateFeature);
mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
eq(propertyIds),
eq(mExecutor));
mCountDownLatch.await();
assertThat(loadedResult.get().getCarZoneSetsToFanDirectionValues()).isEqualTo(
fanDirectionValues);
}
@Test
public void fetchSeatTemperature_verifyResponse() throws InterruptedException {
Map<Set<CarZone>, Pair<Object, Object>> minMaxValueMap = new HashMap<>();
minMaxValueMap.put(Collections.singleton(FRONT_LEFT_ZONE), new Pair<>(1, 7));
minMaxValueMap.put(Collections.singleton(FRONT_RIGHT_ZONE), new Pair<>(2, 6));
List<Set<CarZone>> carZones = new ArrayList<>();
carZones.add(Collections.singleton(FRONT_LEFT_ZONE));
carZones.add(Collections.singleton(FRONT_RIGHT_ZONE));
mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_SEAT_TEMPERATURE)
.setCarZones(carZones).setCarZoneSetsToMinMaxRange(minMaxValueMap)
.setStatus(STATUS_SUCCESS).build());
ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
Futures.immediateFuture(mCarPropertyProfiles);
List<Integer> propertyIds = Collections.singletonList(HVAC_SEAT_TEMPERATURE);
when(mPropertyManager.fetchSupportedZonesResponse(
eq(propertyIds), eq(mExecutor))).thenReturn(
listenableCarPropertyProfile);
AtomicReference<SeatTemperatureProfile> loadedResult = new AtomicReference<>();
CarClimateProfileCallback listener = new CarClimateProfileCallback() {
@Override
public void onSeatTemperatureLevelProfileAvailable(@NonNull SeatTemperatureProfile
supportedCarZonesAndFanDirectionLevels) {
loadedResult.set(supportedCarZonesAndFanDirectionLevels);
mCountDownLatch.countDown();
}
};
CarClimateFeature.Builder carClimateBuilder = new CarClimateFeature.Builder(
FEATURE_SEAT_TEMPERATURE_LEVEL);
carClimateBuilder.addCarZones(FRONT_LEFT_ZONE);
carClimateBuilder.addCarZones(FRONT_RIGHT_ZONE);
CarClimateFeature mCarClimateFeature = new CarClimateFeature(carClimateBuilder);
ClimateProfileRequest.Builder builder =
new ClimateProfileRequest.Builder();
builder.addClimateProfileFeatures(mCarClimateFeature);
mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
eq(propertyIds),
eq(mExecutor));
mCountDownLatch.await();
assertThat(loadedResult.get().getCarZoneSetsToSeatTemperatureValues()).isEqualTo(
minMaxValueMap);
}
@Test
public void fetchSeatVentilation_verifyResponse() throws InterruptedException {
Map<Set<CarZone>, Pair<Object, Object>> minMaxValueMap = new HashMap<>();
minMaxValueMap.put(Collections.singleton(FRONT_LEFT_ZONE), new Pair<>(1, 7));
minMaxValueMap.put(Collections.singleton(FRONT_RIGHT_ZONE), new Pair<>(2, 6));
List<Set<CarZone>> carZones = new ArrayList<>();
carZones.add(Collections.singleton(FRONT_LEFT_ZONE));
carZones.add(Collections.singleton(FRONT_RIGHT_ZONE));
mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_SEAT_VENTILATION)
.setCarZones(carZones).setCarZoneSetsToMinMaxRange(minMaxValueMap)
.setStatus(STATUS_SUCCESS).build());
ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
Futures.immediateFuture(mCarPropertyProfiles);
List<Integer> propertyIds = Collections.singletonList(HVAC_SEAT_VENTILATION);
when(mPropertyManager.fetchSupportedZonesResponse(
eq(propertyIds), eq(mExecutor))).thenReturn(
listenableCarPropertyProfile);
AtomicReference<SeatVentilationProfile> loadedResult = new AtomicReference<>();
CarClimateProfileCallback listener = new CarClimateProfileCallback() {
@Override
public void onSeatVentilationLevelProfileAvailable(@NonNull SeatVentilationProfile
supportedCarZonesAndSeatVentilationLevels) {
loadedResult.set(supportedCarZonesAndSeatVentilationLevels);
mCountDownLatch.countDown();
}
};
CarClimateFeature.Builder carClimateBuilder = new CarClimateFeature.Builder(
FEATURE_SEAT_VENTILATION_LEVEL);
carClimateBuilder.addCarZones(FRONT_LEFT_ZONE);
carClimateBuilder.addCarZones(FRONT_RIGHT_ZONE);
CarClimateFeature mCarClimateFeature = new CarClimateFeature(carClimateBuilder);
ClimateProfileRequest.Builder builder =
new ClimateProfileRequest.Builder();
builder.addClimateProfileFeatures(mCarClimateFeature);
mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
eq(propertyIds),
eq(mExecutor));
mCountDownLatch.await();
assertThat(loadedResult.get().getCarZoneSetsToSeatVentilationValues()).isEqualTo(
minMaxValueMap);
}
@Test
public void fetchSteeringWheelHeat_verifyResponse() throws InterruptedException {
Map<Set<CarZone>, Pair<Object, Object>> minMaxValueMap = new HashMap<>();
minMaxValueMap.put(Collections.singleton(FRONT_LEFT_ZONE), new Pair<>(1, 7));
minMaxValueMap.put(Collections.singleton(FRONT_RIGHT_ZONE), new Pair<>(2, 6));
List<Set<CarZone>> carZones = new ArrayList<>();
carZones.add(Collections.singleton(FRONT_LEFT_ZONE));
carZones.add(Collections.singleton(FRONT_RIGHT_ZONE));
mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(
HVAC_STEERING_WHEEL_HEAT)
.setCarZones(carZones).setCarZoneSetsToMinMaxRange(minMaxValueMap)
.setStatus(STATUS_SUCCESS).build());
ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
Futures.immediateFuture(mCarPropertyProfiles);
List<Integer> propertyIds = Collections.singletonList(HVAC_STEERING_WHEEL_HEAT);
when(mPropertyManager.fetchSupportedZonesResponse(
eq(propertyIds), eq(mExecutor))).thenReturn(
listenableCarPropertyProfile);
AtomicReference<SteeringWheelHeatProfile> loadedResult = new AtomicReference<>();
CarClimateProfileCallback listener = new CarClimateProfileCallback() {
@Override
public void onSteeringWheelHeatProfileAvailable(@NonNull SteeringWheelHeatProfile
steeringWheelHeatProfile) {
loadedResult.set(steeringWheelHeatProfile);
mCountDownLatch.countDown();
}
};
CarClimateFeature.Builder carClimateBuilder = new CarClimateFeature.Builder(
FEATURE_STEERING_WHEEL_HEAT);
carClimateBuilder.addCarZones(FRONT_LEFT_ZONE);
carClimateBuilder.addCarZones(FRONT_RIGHT_ZONE);
CarClimateFeature mCarClimateFeature = new CarClimateFeature(carClimateBuilder);
ClimateProfileRequest.Builder builder =
new ClimateProfileRequest.Builder();
builder.addClimateProfileFeatures(mCarClimateFeature);
mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
eq(propertyIds),
eq(mExecutor));
mCountDownLatch.await();
assertThat(loadedResult.get().getCarZoneSetsToSteeringWheelHeatValues()).isEqualTo(
minMaxValueMap);
}
@Test
public void fetchHvacRecirculation_verifyResponse() throws InterruptedException {
List<Set<CarZone>> carZones = new ArrayList<>();
carZones.add(Collections.singleton(FRONT_LEFT_ZONE));
carZones.add(Collections.singleton(FRONT_RIGHT_ZONE));
mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_RECIRC_ON)
.setCarZones(carZones).setStatus(STATUS_SUCCESS).build());
ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
Futures.immediateFuture(mCarPropertyProfiles);
List<Integer> propertyIds = Collections.singletonList(HVAC_RECIRC_ON);
when(mPropertyManager.fetchSupportedZonesResponse(
eq(propertyIds), eq(mExecutor))).thenReturn(
listenableCarPropertyProfile);
AtomicReference<HvacRecirculationProfile> loadedResult = new AtomicReference<>();
CarClimateProfileCallback listener = new CarClimateProfileCallback() {
@Override
public void onHvacRecirculationProfileAvailable(@NonNull HvacRecirculationProfile
hvacRecirculationProfile) {
loadedResult.set(hvacRecirculationProfile);
mCountDownLatch.countDown();
}
};
CarClimateFeature.Builder carClimateBuilder = new CarClimateFeature.Builder(
FEATURE_HVAC_RECIRCULATION);
carClimateBuilder.addCarZones(FRONT_LEFT_ZONE);
carClimateBuilder.addCarZones(FRONT_RIGHT_ZONE);
CarClimateFeature mCarClimateFeature = new CarClimateFeature(carClimateBuilder);
ClimateProfileRequest.Builder builder =
new ClimateProfileRequest.Builder();
builder.addClimateProfileFeatures(mCarClimateFeature);
mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
eq(propertyIds),
eq(mExecutor));
mCountDownLatch.await();
assertThat(loadedResult.get().getSupportedCarZones()).isEqualTo(carZones);
}
@Test
public void fetchHvacAutoRecirculation_verifyResponse() throws InterruptedException {
List<Set<CarZone>> carZones = new ArrayList<>();
carZones.add(Collections.singleton(FRONT_LEFT_ZONE));
carZones.add(Collections.singleton(FRONT_RIGHT_ZONE));
List<Integer> propertyIds = Collections.singletonList(HVAC_AUTO_RECIRC_ON);
mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_AUTO_RECIRC_ON)
.setCarZones(carZones).setStatus(STATUS_SUCCESS).build());
ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
Futures.immediateFuture(mCarPropertyProfiles);
when(mPropertyManager.fetchSupportedZonesResponse(
eq(propertyIds), eq(mExecutor))).thenReturn(
listenableCarPropertyProfile);
AtomicReference<HvacAutoRecirculationProfile> loadedResult = new AtomicReference<>();
CarClimateProfileCallback listener = new CarClimateProfileCallback() {
@Override
public void onHvacAutoRecirculationProfileAvailable(@NonNull
HvacAutoRecirculationProfile hvacAutoRecirculationProfile) {
loadedResult.set(hvacAutoRecirculationProfile);
mCountDownLatch.countDown();
}
};
CarClimateFeature.Builder carClimateBuilder = new CarClimateFeature.Builder(
FEATURE_HVAC_AUTO_RECIRCULATION);
carClimateBuilder.addCarZones(FRONT_LEFT_ZONE);
carClimateBuilder.addCarZones(FRONT_RIGHT_ZONE);
CarClimateFeature mCarClimateFeature = new CarClimateFeature(carClimateBuilder);
ClimateProfileRequest.Builder builder =
new ClimateProfileRequest.Builder();
builder.addClimateProfileFeatures(mCarClimateFeature);
mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
eq(propertyIds),
eq(mExecutor));
mCountDownLatch.await();
assertThat(loadedResult.get().getSupportedCarZoneSets()).isEqualTo(carZones);
}
@Test
public void fetchHvacAutoMode_verifyResponse() throws InterruptedException {
List<Set<CarZone>> carZones = new ArrayList<>();
carZones.add(Collections.singleton(FRONT_LEFT_ZONE));
carZones.add(Collections.singleton(FRONT_RIGHT_ZONE));
List<Integer> propertyIds = Collections.singletonList(HVAC_AUTO_ON);
mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_AUTO_ON)
.setCarZones(carZones).setStatus(STATUS_SUCCESS).build());
ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
Futures.immediateFuture(mCarPropertyProfiles);
when(mPropertyManager.fetchSupportedZonesResponse(
eq(propertyIds), eq(mExecutor))).thenReturn(
listenableCarPropertyProfile);
AtomicReference<HvacAutoModeProfile> loadedResult = new AtomicReference<>();
CarClimateProfileCallback listener = new CarClimateProfileCallback() {
@Override
public void onHvacAutoModeProfileAvailable(@NonNull HvacAutoModeProfile
hvacAutoModeProfile) {
loadedResult.set(hvacAutoModeProfile);
mCountDownLatch.countDown();
}
};
CarClimateFeature.Builder carClimateBuilder = new CarClimateFeature.Builder(
FEATURE_HVAC_AUTO_MODE);
carClimateBuilder.addCarZones(FRONT_LEFT_ZONE);
carClimateBuilder.addCarZones(FRONT_RIGHT_ZONE);
CarClimateFeature mCarClimateFeature = new CarClimateFeature(carClimateBuilder);
ClimateProfileRequest.Builder builder =
new ClimateProfileRequest.Builder();
builder.addClimateProfileFeatures(mCarClimateFeature);
mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
eq(propertyIds),
eq(mExecutor));
mCountDownLatch.await();
assertThat(loadedResult.get().getSupportedCarZoneSets()).isEqualTo(carZones);
}
@Test
public void fetchHvacDualMode_verifyResponse() throws InterruptedException {
List<Set<CarZone>> carZones = new ArrayList<>();
carZones.add(Collections.singleton(FRONT_LEFT_ZONE));
carZones.add(Collections.singleton(FRONT_RIGHT_ZONE));
List<Integer> propertyIds = Collections.singletonList(HVAC_DUAL_ON);
mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_DUAL_ON)
.setCarZones(carZones).setStatus(STATUS_SUCCESS).build());
ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
Futures.immediateFuture(mCarPropertyProfiles);
when(mPropertyManager.fetchSupportedZonesResponse(
eq(propertyIds), eq(mExecutor))).thenReturn(
listenableCarPropertyProfile);
AtomicReference<HvacDualModeProfile> loadedResult = new AtomicReference<>();
CarClimateProfileCallback listener = new CarClimateProfileCallback() {
@Override
public void onHvacDualModeProfileAvailable(@NonNull HvacDualModeProfile
hvacDualModeProfile) {
loadedResult.set(hvacDualModeProfile);
mCountDownLatch.countDown();
}
};
CarClimateFeature.Builder carClimateBuilder = new CarClimateFeature.Builder(
FEATURE_HVAC_DUAL_MODE);
carClimateBuilder.addCarZones(FRONT_LEFT_ZONE);
carClimateBuilder.addCarZones(FRONT_RIGHT_ZONE);
CarClimateFeature mCarClimateFeature = new CarClimateFeature(carClimateBuilder);
ClimateProfileRequest.Builder builder =
new ClimateProfileRequest.Builder();
builder.addClimateProfileFeatures(mCarClimateFeature);
mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
eq(propertyIds),
eq(mExecutor));
mCountDownLatch.await();
assertThat(loadedResult.get().getSupportedCarZoneSets()).isEqualTo(carZones);
}
@Test
public void fetchDefroster_verifyResponse() throws InterruptedException {
List<Set<CarZone>> carZones = new ArrayList<>();
carZones.add(Collections.singleton(FRONT_LEFT_ZONE));
carZones.add(Collections.singleton(FRONT_RIGHT_ZONE));
List<Integer> propertyIds = Collections.singletonList(HVAC_DEFROSTER);
mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_DEFROSTER)
.setCarZones(carZones).setStatus(STATUS_SUCCESS).build());
ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
Futures.immediateFuture(mCarPropertyProfiles);
when(mPropertyManager.fetchSupportedZonesResponse(
eq(propertyIds), eq(mExecutor))).thenReturn(
listenableCarPropertyProfile);
AtomicReference<DefrosterProfile> loadedResult = new AtomicReference<>();
CarClimateProfileCallback listener = new CarClimateProfileCallback() {
@Override
public void onDefrosterProfileAvailable(@NonNull DefrosterProfile defrosterProfile) {
loadedResult.set(defrosterProfile);
mCountDownLatch.countDown();
}
};
CarClimateFeature.Builder carClimateBuilder = new CarClimateFeature.Builder(
FEATURE_HVAC_DEFROSTER);
carClimateBuilder.addCarZones(FRONT_LEFT_ZONE);
carClimateBuilder.addCarZones(FRONT_RIGHT_ZONE);
CarClimateFeature mCarClimateFeature = new CarClimateFeature(carClimateBuilder);
ClimateProfileRequest.Builder builder =
new ClimateProfileRequest.Builder();
builder.addClimateProfileFeatures(mCarClimateFeature);
mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
eq(propertyIds),
eq(mExecutor));
mCountDownLatch.await();
assertThat(loadedResult.get().getSupportedCarZoneSets()).isEqualTo(carZones);
}
@Test
public void fetchMaxDefroster_verifyResponse() throws InterruptedException {
List<Set<CarZone>> carZones = new ArrayList<>();
carZones.add(Collections.singleton(FRONT_LEFT_ZONE));
carZones.add(Collections.singleton(FRONT_RIGHT_ZONE));
List<Integer> propertyIds = Collections.singletonList(HVAC_MAX_DEFROST_ON);
mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_MAX_DEFROST_ON)
.setCarZones(carZones).setStatus(STATUS_SUCCESS).build());
ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
Futures.immediateFuture(mCarPropertyProfiles);
when(mPropertyManager.fetchSupportedZonesResponse(
eq(propertyIds), eq(mExecutor))).thenReturn(
listenableCarPropertyProfile);
AtomicReference<MaxDefrosterProfile> loadedResult = new AtomicReference<>();
CarClimateProfileCallback listener = new CarClimateProfileCallback() {
@Override
public void onMaxDefrosterProfileAvailable(@NonNull MaxDefrosterProfile
maxDefrosterProfile) {
loadedResult.set(maxDefrosterProfile);
mCountDownLatch.countDown();
}
};
CarClimateFeature.Builder carClimateBuilder = new CarClimateFeature.Builder(
FEATURE_HVAC_MAX_DEFROSTER);
carClimateBuilder.addCarZones(FRONT_LEFT_ZONE);
carClimateBuilder.addCarZones(FRONT_RIGHT_ZONE);
CarClimateFeature mCarClimateFeature = new CarClimateFeature(carClimateBuilder);
ClimateProfileRequest.Builder builder =
new ClimateProfileRequest.Builder();
builder.addClimateProfileFeatures(mCarClimateFeature);
mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
eq(propertyIds),
eq(mExecutor));
mCountDownLatch.await();
assertThat(loadedResult.get().getSupportedCarZoneSets()).isEqualTo(carZones);
}
@Test
public void fetchElectricDefroster_verifyResponse() throws InterruptedException {
List<Set<CarZone>> carZones = new ArrayList<>();
carZones.add(Collections.singleton(FRONT_LEFT_ZONE));
carZones.add(Collections.singleton(FRONT_RIGHT_ZONE));
List<Integer> propertyIds = Collections.singletonList(HVAC_ELECTRIC_DEFROSTER);
mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_ELECTRIC_DEFROSTER)
.setCarZones(carZones).setStatus(STATUS_SUCCESS).build());
ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
Futures.immediateFuture(mCarPropertyProfiles);
when(mPropertyManager.fetchSupportedZonesResponse(
eq(propertyIds), eq(mExecutor))).thenReturn(
listenableCarPropertyProfile);
AtomicReference<ElectricDefrosterProfile> loadedResult = new AtomicReference<>();
CarClimateProfileCallback listener = new CarClimateProfileCallback() {
@Override
public void onElectricDefrosterProfileAvailable(@NonNull ElectricDefrosterProfile
electricDefrosterProfile) {
loadedResult.set(electricDefrosterProfile);
mCountDownLatch.countDown();
}
};
CarClimateFeature.Builder carClimateBuilder = new CarClimateFeature.Builder(
FEATURE_HVAC_ELECTRIC_DEFROSTER);
carClimateBuilder.addCarZones(FRONT_LEFT_ZONE);
carClimateBuilder.addCarZones(FRONT_RIGHT_ZONE);
CarClimateFeature mCarClimateFeature = new CarClimateFeature(carClimateBuilder);
ClimateProfileRequest.Builder builder =
new ClimateProfileRequest.Builder();
builder.addClimateProfileFeatures(mCarClimateFeature);
mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
eq(propertyIds),
eq(mExecutor));
mCountDownLatch.await();
assertThat(loadedResult.get().getSupportedCarZoneSets()).isEqualTo(carZones);
}
@Test
public void fetchHvacAc_verifyResponse() throws InterruptedException {
List<Set<CarZone>> carZones = new ArrayList<>();
carZones.add(Collections.singleton(FRONT_LEFT_ZONE));
carZones.add(Collections.singleton(FRONT_RIGHT_ZONE));
List<Integer> propertyIds = Collections.singletonList(HVAC_AC_ON);
mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_AC_ON)
.setCarZones(carZones).setStatus(STATUS_SUCCESS).build());
ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
Futures.immediateFuture(mCarPropertyProfiles);
when(mPropertyManager.fetchSupportedZonesResponse(
eq(propertyIds), eq(mExecutor))).thenReturn(
listenableCarPropertyProfile);
AtomicReference<HvacAcProfile> loadedResult = new AtomicReference<>();
CarClimateProfileCallback listener = new CarClimateProfileCallback() {
@Override
public void onHvacAcProfileAvailable(@NonNull HvacAcProfile
hvacAcProfile) {
loadedResult.set(hvacAcProfile);
mCountDownLatch.countDown();
}
};
CarClimateFeature.Builder carClimateBuilder = new CarClimateFeature.Builder(
FEATURE_HVAC_AC);
carClimateBuilder.addCarZones(FRONT_LEFT_ZONE);
carClimateBuilder.addCarZones(FRONT_RIGHT_ZONE);
CarClimateFeature mCarClimateFeature = new CarClimateFeature(carClimateBuilder);
ClimateProfileRequest.Builder builder =
new ClimateProfileRequest.Builder();
builder.addClimateProfileFeatures(mCarClimateFeature);
mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
eq(propertyIds),
eq(mExecutor));
mCountDownLatch.await();
assertThat(loadedResult.get().getSupportedCarZoneSets()).isEqualTo(carZones);
}
@Test
public void fetchHvacMaxAc_verifyResponse() throws InterruptedException {
List<Set<CarZone>> carZones = new ArrayList<>();
carZones.add(Collections.singleton(FRONT_LEFT_ZONE));
carZones.add(Collections.singleton(FRONT_RIGHT_ZONE));
List<Integer> propertyIds = Collections.singletonList(HVAC_MAX_AC_ON);
mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_MAX_AC_ON)
.setCarZones(carZones).setStatus(STATUS_SUCCESS).build());
ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
Futures.immediateFuture(mCarPropertyProfiles);
when(mPropertyManager.fetchSupportedZonesResponse(
eq(propertyIds), eq(mExecutor))).thenReturn(
listenableCarPropertyProfile);
AtomicReference<HvacMaxAcModeProfile> loadedResult = new AtomicReference<>();
CarClimateProfileCallback listener = new CarClimateProfileCallback() {
@Override
public void onHvacMaxAcModeProfileAvailable(@NonNull HvacMaxAcModeProfile
hvacMaxAcModeProfile) {
loadedResult.set(hvacMaxAcModeProfile);
mCountDownLatch.countDown();
}
};
CarClimateFeature.Builder carClimateBuilder = new CarClimateFeature.Builder(
FEATURE_HVAC_MAX_AC);
carClimateBuilder.addCarZones(FRONT_LEFT_ZONE);
carClimateBuilder.addCarZones(FRONT_RIGHT_ZONE);
CarClimateFeature mCarClimateFeature = new CarClimateFeature(carClimateBuilder);
ClimateProfileRequest.Builder builder =
new ClimateProfileRequest.Builder();
builder.addClimateProfileFeatures(mCarClimateFeature);
mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
eq(propertyIds),
eq(mExecutor));
mCountDownLatch.await();
assertThat(loadedResult.get().getSupportedCarZoneSets()).isEqualTo(carZones);
}
}