blob: b49ede952222c41c8ad5c15e785de940fc21a8ee [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 com.android.car.audio;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.hardware.automotive.audiocontrol.V1_0.ContextNumber;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.common.primitives.Ints;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import java.util.List;
@RunWith(AndroidJUnit4.class)
public class CarVolumeGroupTest {
private static final int STEP_VALUE = 2;
private static final int MIN_GAIN = 0;
private static final int MAX_GAIN = 5;
private static final int DEFAULT_GAIN = 0;
private static final String OTHER_ADDRESS = "other_address";
private static final String MEDIA_DEVICE_ADDRESS = "music";
private static final String NAVIGATION_DEVICE_ADDRESS = "navigation";
@Rule
public final ExpectedException thrown = ExpectedException.none();
private CarAudioDeviceInfo mMediaDevice;
private CarAudioDeviceInfo mNavigationDevice;
private Context mContext;
@Before
public void setUp() {
mContext = ApplicationProvider.getApplicationContext();
mMediaDevice = generateCarAudioDeviceInfo(MEDIA_DEVICE_ADDRESS);
mNavigationDevice = generateCarAudioDeviceInfo(NAVIGATION_DEVICE_ADDRESS);
}
@Test
public void bind_associatesDeviceAddresses() {
CarVolumeGroup carVolumeGroup = new CarVolumeGroup(mContext, 0, 0);
carVolumeGroup.bind(ContextNumber.MUSIC, mMediaDevice);
assertEquals(1, carVolumeGroup.getAddresses().size());
carVolumeGroup.bind(ContextNumber.NAVIGATION, mNavigationDevice);
List<String> addresses = carVolumeGroup.getAddresses();
assertEquals(2, addresses.size());
assertTrue(addresses.contains(MEDIA_DEVICE_ADDRESS));
assertTrue(addresses.contains(NAVIGATION_DEVICE_ADDRESS));
}
@Test
public void bind_checksForSameStepSize() {
CarVolumeGroup carVolumeGroup = new CarVolumeGroup(mContext, 0, 0);
carVolumeGroup.bind(ContextNumber.MUSIC, mMediaDevice);
CarAudioDeviceInfo differentStepValueDevice = generateCarAudioDeviceInfo(
NAVIGATION_DEVICE_ADDRESS, STEP_VALUE + 1,
MIN_GAIN, MAX_GAIN);
thrown.expect(IllegalArgumentException.class);
thrown.expectMessage("Gain controls within one group must have same step value");
carVolumeGroup.bind(ContextNumber.NAVIGATION, differentStepValueDevice);
}
@Test
public void bind_updatesMinGainToSmallestValue() {
CarVolumeGroup carVolumeGroup = new CarVolumeGroup(mContext, 0, 0);
CarAudioDeviceInfo largestMinGain = generateCarAudioDeviceInfo(
NAVIGATION_DEVICE_ADDRESS, 1, 10, 10);
carVolumeGroup.bind(ContextNumber.NAVIGATION, largestMinGain);
assertEquals(0, carVolumeGroup.getMaxGainIndex());
CarAudioDeviceInfo smallestMinGain = generateCarAudioDeviceInfo(
NAVIGATION_DEVICE_ADDRESS, 1, 2, 10);
carVolumeGroup.bind(ContextNumber.NAVIGATION, smallestMinGain);
assertEquals(8, carVolumeGroup.getMaxGainIndex());
CarAudioDeviceInfo middleMinGain = generateCarAudioDeviceInfo(
NAVIGATION_DEVICE_ADDRESS, 1, 7, 10);
carVolumeGroup.bind(ContextNumber.NAVIGATION, middleMinGain);
assertEquals(8, carVolumeGroup.getMaxGainIndex());
}
@Test
public void bind_updatesMaxGainToLargestValue() {
CarVolumeGroup carVolumeGroup = new CarVolumeGroup(mContext, 0, 0);
CarAudioDeviceInfo smallestMaxGain = generateCarAudioDeviceInfo(
NAVIGATION_DEVICE_ADDRESS, 1, 1, 5);
carVolumeGroup.bind(ContextNumber.NAVIGATION, smallestMaxGain);
assertEquals(4, carVolumeGroup.getMaxGainIndex());
CarAudioDeviceInfo largestMaxGain = generateCarAudioDeviceInfo(
NAVIGATION_DEVICE_ADDRESS, 1, 1, 10);
carVolumeGroup.bind(ContextNumber.NAVIGATION, largestMaxGain);
assertEquals(9, carVolumeGroup.getMaxGainIndex());
CarAudioDeviceInfo middleMaxGain = generateCarAudioDeviceInfo(
NAVIGATION_DEVICE_ADDRESS, 1, 1, 7);
carVolumeGroup.bind(ContextNumber.NAVIGATION, middleMaxGain);
assertEquals(9, carVolumeGroup.getMaxGainIndex());
}
@Test
public void getContexts_returnsAllContextsBoundToVolumeGroup() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
int[] contexts = carVolumeGroup.getContexts();
assertEquals(6, contexts.length);
List<Integer> contextsList = Ints.asList(contexts);
assertTrue(contextsList.contains(ContextNumber.MUSIC));
assertTrue(contextsList.contains(ContextNumber.CALL));
assertTrue(contextsList.contains(ContextNumber.CALL_RING));
assertTrue(contextsList.contains(ContextNumber.NAVIGATION));
assertTrue(contextsList.contains(ContextNumber.ALARM));
assertTrue(contextsList.contains(ContextNumber.NOTIFICATION));
}
@Test
public void getContextsForAddress_returnsContextsBoundToThatAddress() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
int[] contexts = carVolumeGroup.getContextsForAddress(MEDIA_DEVICE_ADDRESS);
assertEquals(3, contexts.length);
List<Integer> contextsList = Ints.asList(contexts);
assertTrue(contextsList.contains(ContextNumber.MUSIC));
assertTrue(contextsList.contains(ContextNumber.CALL));
assertTrue(contextsList.contains(ContextNumber.CALL_RING));
}
@Test
public void getContextsForAddress_returnsEmptyArrayIfAddressNotBound() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
int[] contexts = carVolumeGroup.getContextsForAddress(OTHER_ADDRESS);
assertEquals(0, contexts.length);
}
@Test
public void getCarAudioDeviceInfoForAddress_returnsExpectedDevice() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
CarAudioDeviceInfo actualDevice = carVolumeGroup.getCarAudioDeviceInfoForAddress(
MEDIA_DEVICE_ADDRESS);
assertEquals(mMediaDevice, actualDevice);
}
@Test
public void getCarAudioDeviceInfoForAddress_returnsNullIfAddressNotBound() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
CarAudioDeviceInfo actualDevice = carVolumeGroup.getCarAudioDeviceInfoForAddress(
OTHER_ADDRESS);
assertNull(actualDevice);
}
@Test
public void setCurrentGainIndex_setsGainOnAllBoundDevices() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
carVolumeGroup.setCurrentGainIndex(2);
verify(mMediaDevice).setCurrentGain(4);
verify(mNavigationDevice).setCurrentGain(4);
}
@Test
public void setCurrentGainIndex_updatesCurrentGainIndex() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
carVolumeGroup.setCurrentGainIndex(2);
assertEquals(2, carVolumeGroup.getCurrentGainIndex());
}
@Test
public void setCurrentGainIndex_checksNewGainIsAboveMin() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
thrown.expect(IllegalArgumentException.class);
thrown.expectMessage("Gain out of range (0:5) -2index -1");
carVolumeGroup.setCurrentGainIndex(-1);
}
@Test
public void setCurrentGainIndex_checksNewGainIsBelowMax() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
thrown.expect(IllegalArgumentException.class);
thrown.expectMessage("Gain out of range (0:5) 6index 3");
carVolumeGroup.setCurrentGainIndex(3);
}
@Test
public void getMinGainIndex_alwaysReturnsZero() {
CarVolumeGroup carVolumeGroup = new CarVolumeGroup(mContext, 0, 0);
CarAudioDeviceInfo minGainPlusOneDevice = generateCarAudioDeviceInfo(
NAVIGATION_DEVICE_ADDRESS, STEP_VALUE, 10, MAX_GAIN);
carVolumeGroup.bind(ContextNumber.NAVIGATION, minGainPlusOneDevice);
assertEquals(0, carVolumeGroup.getMinGainIndex());
CarAudioDeviceInfo minGainDevice = generateCarAudioDeviceInfo(
NAVIGATION_DEVICE_ADDRESS, STEP_VALUE, 1, MAX_GAIN);
carVolumeGroup.bind(ContextNumber.NAVIGATION, minGainDevice);
assertEquals(0, carVolumeGroup.getMinGainIndex());
}
private CarVolumeGroup testVolumeGroupSetup() {
CarVolumeGroup carVolumeGroup = new CarVolumeGroup(mContext, 0, 0);
carVolumeGroup.bind(ContextNumber.MUSIC, mMediaDevice);
carVolumeGroup.bind(ContextNumber.CALL, mMediaDevice);
carVolumeGroup.bind(ContextNumber.CALL_RING, mMediaDevice);
carVolumeGroup.bind(ContextNumber.NAVIGATION, mNavigationDevice);
carVolumeGroup.bind(ContextNumber.ALARM, mNavigationDevice);
carVolumeGroup.bind(ContextNumber.NOTIFICATION, mNavigationDevice);
return carVolumeGroup;
}
private CarAudioDeviceInfo generateCarAudioDeviceInfo(String address) {
return generateCarAudioDeviceInfo(address, STEP_VALUE, MIN_GAIN, MAX_GAIN);
}
private CarAudioDeviceInfo generateCarAudioDeviceInfo(String address, int stepValue,
int minGain, int maxGain) {
CarAudioDeviceInfo cadiMock = Mockito.mock(CarAudioDeviceInfo.class);
when(cadiMock.getStepValue()).thenReturn(stepValue);
when(cadiMock.getDefaultGain()).thenReturn(DEFAULT_GAIN);
when(cadiMock.getMaxGain()).thenReturn(maxGain);
when(cadiMock.getMinGain()).thenReturn(minGain);
when(cadiMock.getAddress()).thenReturn(address);
return cadiMock;
}
}