Add test for setDeviceConnectionState.

The test uses HDMI and bt hfp to test setting of device connection
state. After the device is connected, the test tries to use explicit
routing to the new connected device to make sure the connection state is
set correctly.

Bug: 135621476
Test: atest audiopolicy_tests
Change-Id: I14759daac6d3522fa133a6e3b27b3863bb4ce3d1
Merged-In: I14759daac6d3522fa133a6e3b27b3863bb4ce3d1
gugelfrei
jiabin 5 years ago
parent 890df85d72
commit f9bd900f18

@ -80,6 +80,12 @@ class AudioPolicyManagerTestClient : public AudioPolicyTestClient {
return NO_ERROR;
}
audio_io_handle_t openDuplicateOutput(audio_io_handle_t /*output1*/,
audio_io_handle_t /*output2*/) override {
audio_io_handle_t id = mNextIoHandle++;
return id;
}
status_t openInput(audio_module_handle_t module,
audio_io_handle_t* input,
audio_config_t* /*config*/,
@ -1035,3 +1041,101 @@ INSTANTIATE_TEST_CASE_P(
AUDIO_SOURCE_HOTWORD, 0, "addr=remote_submix_media"}
)
);
using DeviceConnectionTestParams =
std::tuple<audio_devices_t /*type*/, std::string /*name*/, std::string /*address*/>;
class AudioPolicyManagerTestDeviceConnection : public AudioPolicyManagerTestWithConfigurationFile,
public testing::WithParamInterface<DeviceConnectionTestParams> {
};
TEST_F(AudioPolicyManagerTestDeviceConnection, InitSuccess) {
// SetUp must finish with no assertions.
}
TEST_F(AudioPolicyManagerTestDeviceConnection, Dump) {
dumpToLog();
}
TEST_P(AudioPolicyManagerTestDeviceConnection, SetDeviceConnectionState) {
const audio_devices_t type = std::get<0>(GetParam());
const std::string name = std::get<1>(GetParam());
const std::string address = std::get<2>(GetParam());
if (type == AUDIO_DEVICE_OUT_HDMI) {
// Set device connection state failed due to no device descriptor found
// For HDMI case, it is easier to simulate device descriptor not found error
// by using a undeclared encoded format.
ASSERT_EQ(INVALID_OPERATION, mManager->setDeviceConnectionState(
type, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
address.c_str(), name.c_str(), AUDIO_FORMAT_MAT_2_1));
}
// Connect with valid parameters should succeed
ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
type, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
// Try to connect with the same device again should fail
ASSERT_EQ(INVALID_OPERATION, mManager->setDeviceConnectionState(
type, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
// Disconnect the connected device should succeed
ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
type, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
// Disconnect device that is not connected should fail
ASSERT_EQ(INVALID_OPERATION, mManager->setDeviceConnectionState(
type, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
// Try to set device connection state with a invalid connection state should fail
ASSERT_EQ(BAD_VALUE, mManager->setDeviceConnectionState(
type, AUDIO_POLICY_DEVICE_STATE_CNT,
"", "", AUDIO_FORMAT_DEFAULT));
}
TEST_P(AudioPolicyManagerTestDeviceConnection, ExplicitlyRoutingAfterConnection) {
const audio_devices_t type = std::get<0>(GetParam());
const std::string name = std::get<1>(GetParam());
const std::string address = std::get<2>(GetParam());
// Connect device to do explicitly routing test
ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
type, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
audio_port devicePort;
const audio_port_role_t role = audio_is_output_device(type)
? AUDIO_PORT_ROLE_SINK : AUDIO_PORT_ROLE_SOURCE;
findDevicePort(role, type, address, devicePort);
audio_port_handle_t routedPortId = devicePort.id;
audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
// Try start input or output according to the device type
if (audio_is_output_devices(type)) {
getOutputForAttr(&routedPortId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
48000 /*sampleRate*/, AUDIO_OUTPUT_FLAG_NONE, &portId);
} else if (audio_is_input_device(type)) {
RecordingActivityTracker tracker;
getInputForAttr({}, tracker.getRiid(), &routedPortId, AUDIO_FORMAT_PCM_16_BIT,
AUDIO_CHANNEL_IN_STEREO, 48000 /*sampleRate*/, AUDIO_INPUT_FLAG_NONE, &portId);
}
ASSERT_EQ(devicePort.id, routedPortId);
ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
type, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
}
INSTANTIATE_TEST_CASE_P(
DeviceConnectionState,
AudioPolicyManagerTestDeviceConnection,
testing::Values(
DeviceConnectionTestParams({AUDIO_DEVICE_IN_HDMI, "test_in_hdmi",
"audio_policy_test_in_hdmi"}),
DeviceConnectionTestParams({AUDIO_DEVICE_OUT_HDMI, "test_out_hdmi",
"audio_policy_test_out_hdmi"}),
DeviceConnectionTestParams({AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, "bt_hfp_in",
"hfp_client_in"}),
DeviceConnectionTestParams({AUDIO_DEVICE_OUT_BLUETOOTH_SCO, "bt_hfp_out",
"hfp_client_out"})
)
);

@ -35,18 +35,43 @@
samplingRates="48000"
channelMasks="AUDIO_CHANNEL_IN_STEREO"/>
</mixPort>
<mixPort name="mixport_bt_hfp_output" role="source">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</mixPort>
<mixPort name="mixport_bt_hfp_input" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="8000,11025,16000,44100,48000"
channelMasks="AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_MONO"/>
</mixPort>
</mixPorts>
<devicePorts>
<devicePort tagName="Speaker" type="AUDIO_DEVICE_OUT_SPEAKER" role="sink">
</devicePort>
<devicePort tagName="Built-In Mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" role="source">
</devicePort>
<devicePort tagName="Hdmi" type="AUDIO_DEVICE_OUT_HDMI" role="sink">
</devicePort>
<devicePort tagName="Hdmi-In Mic" type="AUDIO_DEVICE_IN_HDMI" role="source">
</devicePort>
<devicePort tagName="BT SCO" type="AUDIO_DEVICE_OUT_BLUETOOTH_SCO"
role="sink" address="hfp_client_out">
</devicePort>
<devicePort tagName="BT SCO Headset Mic" type="AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET"
role="source" address="hfp_client_in">
</devicePort>
</devicePorts>
<routes>
<route type="mix" sink="Speaker"
sources="primary output"/>
<route type="mix" sink="primary input"
sources="Built-In Mic"/>
sources="Built-In Mic,Hdmi-In Mic"/>
<route type="mix" sink="Hdmi"
sources="primary output"/>
<route type="mix" sink="BT SCO"
sources="mixport_bt_hfp_output"/>
<route type="mix" sink="mixport_bt_hfp_input"
sources="BT SCO Headset Mic"/>
</routes>
</module>

Loading…
Cancel
Save