Loading services/audiopolicy/tests/audiopolicymanager_tests.cpp +108 −75 Original line number Diff line number Diff line Loading @@ -158,9 +158,11 @@ class AudioPolicyManagerTest : public testing::Test { protected: void SetUp() override; void TearDown() override; virtual void SetUpConfig(AudioPolicyConfig *config) { (void)config; } virtual void SetUpManagerConfig(); void dumpToLog(); // When explicitly routing is needed, selectedDeviceId need to be set as the wanted port // id. Otherwise, selectedDeviceId need to be initialized as AUDIO_PORT_HANDLE_NONE. void getOutputForAttr( audio_port_handle_t *selectedDeviceId, audio_format_t format, Loading @@ -182,6 +184,7 @@ class AudioPolicyManagerTest : public testing::Test { void findDevicePort(audio_port_role_t role, audio_devices_t deviceType, const std::string &address, audio_port &foundPort); static audio_port_handle_t getDeviceIdFromPatch(const struct audio_patch* patch); std::unique_ptr<AudioPolicyManagerTestClient> mClient; std::unique_ptr<AudioPolicyTestManager> mManager; Loading @@ -190,8 +193,7 @@ class AudioPolicyManagerTest : public testing::Test { void AudioPolicyManagerTest::SetUp() { mClient.reset(new AudioPolicyManagerTestClient); mManager.reset(new AudioPolicyTestManager(mClient.get())); mManager->getConfig().setDefault(); SetUpConfig(&mManager->getConfig()); // Subclasses may want to customize the config. SetUpManagerConfig(); // Subclasses may want to customize the config. ASSERT_EQ(NO_ERROR, mManager->initialize()); ASSERT_EQ(NO_ERROR, mManager->initCheck()); } Loading @@ -201,6 +203,10 @@ void AudioPolicyManagerTest::TearDown() { mClient.reset(); } void AudioPolicyManagerTest::SetUpManagerConfig() { mManager->getConfig().setDefault(); } void AudioPolicyManagerTest::dumpToLog() { int pipefd[2]; ASSERT_NE(-1, pipe(pipefd)); Loading Loading @@ -245,7 +251,6 @@ void AudioPolicyManagerTest::getOutputForAttr( config.sample_rate = sampleRate; config.channel_mask = channelMask; config.format = format; *selectedDeviceId = AUDIO_PORT_HANDLE_NONE; audio_port_handle_t localPortId; if (!portId) portId = &localPortId; *portId = AUDIO_PORT_HANDLE_NONE; Loading @@ -269,7 +274,6 @@ void AudioPolicyManagerTest::getInputForAttr( config.sample_rate = sampleRate; config.channel_mask = channelMask; config.format = format; *selectedDeviceId = AUDIO_PORT_HANDLE_NONE; audio_port_handle_t localPortId; if (!portId) portId = &localPortId; *portId = AUDIO_PORT_HANDLE_NONE; Loading Loading @@ -306,6 +310,21 @@ void AudioPolicyManagerTest::findDevicePort(audio_port_role_t role, GTEST_FAIL(); } audio_port_handle_t AudioPolicyManagerTest::getDeviceIdFromPatch( const struct audio_patch* patch) { // The logic here is the same as the one in AudioIoDescriptor. // Note this function is aim to get routed device id for test. // In that case, device to device patch is not expected here. if (patch->num_sources != 0 && patch->num_sinks != 0) { if (patch->sources[0].type == AUDIO_PORT_TYPE_MIX) { return patch->sinks[0].id; } else { return patch->sources[0].id; } } return AUDIO_PORT_HANDLE_NONE; } TEST_F(AudioPolicyManagerTest, InitSuccess) { // SetUp must finish with no assertions. Loading Loading @@ -365,15 +384,17 @@ TEST_F(AudioPolicyManagerTest, CreateAudioPatchFromMix) { class AudioPolicyManagerTestMsd : public AudioPolicyManagerTest { protected: void SetUpConfig(AudioPolicyConfig *config) override; void SetUpManagerConfig() override; void TearDown() override; sp<DeviceDescriptor> mMsdOutputDevice; sp<DeviceDescriptor> mMsdInputDevice; }; void AudioPolicyManagerTestMsd::SetUpConfig(AudioPolicyConfig *config) { void AudioPolicyManagerTestMsd::SetUpManagerConfig() { // TODO: Consider using Serializer to load part of the config from a string. AudioPolicyManagerTest::SetUpManagerConfig(); AudioPolicyConfig& config = mManager->getConfig(); mMsdOutputDevice = new DeviceDescriptor(AUDIO_DEVICE_OUT_BUS); sp<AudioProfile> pcmOutputProfile = new AudioProfile( AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO, 48000); Loading @@ -386,13 +407,13 @@ void AudioPolicyManagerTestMsd::SetUpConfig(AudioPolicyConfig *config) { sp<AudioProfile> pcmInputProfile = new AudioProfile( AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO, 44100); mMsdInputDevice->addAudioProfile(pcmInputProfile); config->addAvailableDevice(mMsdOutputDevice); config->addAvailableDevice(mMsdInputDevice); config.addAvailableDevice(mMsdOutputDevice); config.addAvailableDevice(mMsdInputDevice); sp<HwModule> msdModule = new HwModule(AUDIO_HARDWARE_MODULE_ID_MSD, 2 /*halVersionMajor*/); HwModuleCollection modules = config->getHwModules(); HwModuleCollection modules = config.getHwModules(); modules.add(msdModule); config->setHwModules(modules); config.setHwModules(modules); mMsdOutputDevice->attach(msdModule); mMsdInputDevice->attach(msdModule); Loading @@ -417,12 +438,12 @@ void AudioPolicyManagerTestMsd::SetUpConfig(AudioPolicyConfig *config) { // of streams that are not supported by MSD. sp<AudioProfile> dtsOutputProfile = new AudioProfile( AUDIO_FORMAT_DTS, AUDIO_CHANNEL_OUT_5POINT1, 48000); config->getDefaultOutputDevice()->addAudioProfile(dtsOutputProfile); config.getDefaultOutputDevice()->addAudioProfile(dtsOutputProfile); sp<OutputProfile> primaryEncodedOutputProfile = new OutputProfile("encoded"); primaryEncodedOutputProfile->addAudioProfile(dtsOutputProfile); primaryEncodedOutputProfile->setFlags(AUDIO_OUTPUT_FLAG_DIRECT); primaryEncodedOutputProfile->addSupportedDevice(config->getDefaultOutputDevice()); config->getHwModules().getModuleFromName(AUDIO_HARDWARE_MODULE_ID_PRIMARY)-> primaryEncodedOutputProfile->addSupportedDevice(config.getDefaultOutputDevice()); config.getHwModules().getModuleFromName(AUDIO_HARDWARE_MODULE_ID_PRIMARY)-> addOutputProfile(primaryEncodedOutputProfile); } Loading Loading @@ -450,7 +471,7 @@ TEST_F(AudioPolicyManagerTestMsd, PatchCreationOnSetForceUse) { TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrEncodedRoutesToMsd) { const PatchCountCheck patchCount = snapshotPatchCount(); audio_port_handle_t selectedDeviceId; audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE; getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1, 48000, AUDIO_OUTPUT_FLAG_DIRECT); ASSERT_EQ(selectedDeviceId, mMsdOutputDevice->getId()); Loading @@ -459,7 +480,7 @@ TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrEncodedRoutesToMsd) { TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrPcmRoutesToMsd) { const PatchCountCheck patchCount = snapshotPatchCount(); audio_port_handle_t selectedDeviceId; audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE; getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO, 48000); ASSERT_EQ(selectedDeviceId, mMsdOutputDevice->getId()); Loading @@ -468,7 +489,7 @@ TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrPcmRoutesToMsd) { TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrEncodedPlusPcmRoutesToMsd) { const PatchCountCheck patchCount = snapshotPatchCount(); audio_port_handle_t selectedDeviceId; audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE; getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1, 48000, AUDIO_OUTPUT_FLAG_DIRECT); ASSERT_EQ(selectedDeviceId, mMsdOutputDevice->getId()); Loading @@ -481,7 +502,7 @@ TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrEncodedPlusPcmRoutesToMsd) { TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrUnsupportedFormatBypassesMsd) { const PatchCountCheck patchCount = snapshotPatchCount(); audio_port_handle_t selectedDeviceId; audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE; getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_DTS, AUDIO_CHANNEL_OUT_5POINT1, 48000, AUDIO_OUTPUT_FLAG_DIRECT); ASSERT_NE(selectedDeviceId, mMsdOutputDevice->getId()); Loading @@ -492,7 +513,8 @@ TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrFormatSwitching) { // Switch between formats that are supported and not supported by MSD. { const PatchCountCheck patchCount = snapshotPatchCount(); audio_port_handle_t selectedDeviceId, portId; audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE; audio_port_handle_t portId; getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1, 48000, AUDIO_OUTPUT_FLAG_DIRECT, &portId); Loading @@ -503,7 +525,8 @@ TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrFormatSwitching) { } { const PatchCountCheck patchCount = snapshotPatchCount(); audio_port_handle_t selectedDeviceId, portId; audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE; audio_port_handle_t portId; getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_DTS, AUDIO_CHANNEL_OUT_5POINT1, 48000, AUDIO_OUTPUT_FLAG_DIRECT, &portId); Loading @@ -514,7 +537,7 @@ TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrFormatSwitching) { } { const PatchCountCheck patchCount = snapshotPatchCount(); audio_port_handle_t selectedDeviceId; audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE; getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1, 48000, AUDIO_OUTPUT_FLAG_DIRECT); ASSERT_EQ(selectedDeviceId, mMsdOutputDevice->getId()); Loading @@ -522,37 +545,52 @@ TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrFormatSwitching) { } } class AudioPolicyManagerTestWithConfigurationFile : public AudioPolicyManagerTest { protected: void SetUpManagerConfig() override; virtual std::string getConfigFile() { return sDefaultConfig; } static const std::string sExecutableDir; static const std::string sDefaultConfig; }; const std::string AudioPolicyManagerTestWithConfigurationFile::sExecutableDir = base::GetExecutableDirectory() + "/"; const std::string AudioPolicyManagerTestWithConfigurationFile::sDefaultConfig = sExecutableDir + "test_audio_policy_configuration.xml"; void AudioPolicyManagerTestWithConfigurationFile::SetUpManagerConfig() { status_t status = deserializeAudioPolicyFile(getConfigFile().c_str(), &mManager->getConfig()); ASSERT_EQ(NO_ERROR, status); } TEST_F(AudioPolicyManagerTestWithConfigurationFile, InitSuccess) { // SetUp must finish with no assertions. } TEST_F(AudioPolicyManagerTestWithConfigurationFile, Dump) { dumpToLog(); } using PolicyMixTuple = std::tuple<audio_usage_t, audio_source_t, uint32_t>; class AudioPolicyManagerTestDynamicPolicy : public AudioPolicyManagerTest { class AudioPolicyManagerTestDynamicPolicy : public AudioPolicyManagerTestWithConfigurationFile { protected: void SetUp() override; void TearDown() override; status_t addPolicyMix(int mixType, int mixFlag, audio_devices_t deviceType, std::string mixAddress, const audio_config_t& audioConfig, const std::vector<PolicyMixTuple>& rules); void clearPolicyMix(); void resetManager(const std::string& configFileName); audio_port_handle_t getDeviceIdFromPatch(const struct audio_patch* patch); Vector<AudioMix> mAudioMixes; const std::string mExecutableDir = base::GetExecutableDirectory(); const std::string mConfig = mExecutableDir + "/test_audio_policy_configuration.xml"; const std::string mPrimaryOnlyConfig = mExecutableDir + "/test_audio_policy_primary_only_configuration.xml"; const std::string mMixAddress = "remote_submix_media"; }; void AudioPolicyManagerTestDynamicPolicy::SetUp() { // Override Setup function to use configuration file to do initialization. mClient.reset(new AudioPolicyManagerTestClient); resetManager(mConfig); } void AudioPolicyManagerTestDynamicPolicy::TearDown() { mManager->unregisterPolicyMixes(mAudioMixes); AudioPolicyManagerTest::TearDown(); AudioPolicyManagerTestWithConfigurationFile::TearDown(); } status_t AudioPolicyManagerTestDynamicPolicy::addPolicyMix(int mixType, int mixFlag, Loading Loading @@ -585,32 +623,8 @@ void AudioPolicyManagerTestDynamicPolicy::clearPolicyMix() { mAudioMixes.clear(); } void AudioPolicyManagerTestDynamicPolicy::resetManager(const std::string& configFileName) { clearPolicyMix(); mManager.reset(new AudioPolicyTestManager(mClient.get())); status_t status = deserializeAudioPolicyFile(configFileName.c_str(), &mManager->getConfig()); ASSERT_EQ(NO_ERROR, status); ASSERT_EQ(NO_ERROR, mManager->initialize()); ASSERT_EQ(NO_ERROR, mManager->initCheck()); } audio_port_handle_t AudioPolicyManagerTestDynamicPolicy::getDeviceIdFromPatch( const struct audio_patch* patch) { // The logic here is the same as the one in AudioIoDescriptor. // Note this function is aim to get routed device id for test. // In that case, device to device patch is not expected here. if (patch->num_sources != 0 && patch->num_sinks != 0) { if (patch->sources[0].type == AUDIO_PORT_TYPE_MIX) { return patch->sinks[0].id; } else { return patch->sources[0].id; } } return AUDIO_PORT_HANDLE_NONE; } TEST_F(AudioPolicyManagerTestDynamicPolicy, InitSuccess) { // SetUp must finish with no assertions. // SetUp must finish with no assertions } TEST_F(AudioPolicyManagerTestDynamicPolicy, Dump) { Loading Loading @@ -645,16 +659,10 @@ TEST_F(AudioPolicyManagerTestDynamicPolicy, RegisterPolicyMixes) { ret = mManager->registerPolicyMixes(mAudioMixes); ASSERT_EQ(INVALID_OPERATION, ret); // Registration should fail due to not module for remote submix found. resetManager(mPrimaryOnlyConfig); ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK, AUDIO_DEVICE_OUT_REMOTE_SUBMIX, "", audioConfig, std::vector<PolicyMixTuple>()); ASSERT_EQ(INVALID_OPERATION, ret); // Registration should fail due to device not found. // Note that earpiece is not present in the test configuration file. // This will need to be updated if earpiece is added in the test configuration file. resetManager(mConfig); clearPolicyMix(); ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER, AUDIO_DEVICE_OUT_EARPIECE, "", audioConfig, std::vector<PolicyMixTuple>()); ASSERT_EQ(INVALID_OPERATION, ret); Loading Loading @@ -695,12 +703,37 @@ TEST_F(AudioPolicyManagerTestDynamicPolicy, UnregisterPolicyMixes) { // the same policy mixes as they are not registered. ret = mManager->unregisterPolicyMixes(mAudioMixes); ASSERT_EQ(INVALID_OPERATION, ret); } class AudioPolicyManagerTestDPNoRemoteSubmixModule : public AudioPolicyManagerTestDynamicPolicy { protected: std::string getConfigFile() override { return sPrimaryOnlyConfig; } static const std::string sPrimaryOnlyConfig; }; const std::string AudioPolicyManagerTestDPNoRemoteSubmixModule::sPrimaryOnlyConfig = sExecutableDir + "test_audio_policy_primary_only_configuration.xml"; TEST_F(AudioPolicyManagerTestDPNoRemoteSubmixModule, InitSuccess) { // SetUp must finish with no assertions. } TEST_F(AudioPolicyManagerTestDPNoRemoteSubmixModule, Dump) { dumpToLog(); } TEST_F(AudioPolicyManagerTestDPNoRemoteSubmixModule, RegistrationFailure) { // Registration/Unregistration should fail due to module for remote submix not found. status_t ret; audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER; audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO; audioConfig.format = AUDIO_FORMAT_PCM_16_BIT; audioConfig.sample_rate = 48000; ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK, AUDIO_DEVICE_OUT_REMOTE_SUBMIX, "", audioConfig, std::vector<PolicyMixTuple>()); ASSERT_EQ(INVALID_OPERATION, ret); resetManager(mPrimaryOnlyConfig); // Create a fake policy mixes, the unregistration should fail due to no remote // submix module found. mAudioMixes.add(AudioMix(Vector<AudioMixMatchCriterion>(), MIX_TYPE_PLAYERS, audioConfig, MIX_ROUTE_FLAG_LOOP_BACK, String8(mMixAddress.c_str()), 0)); ret = mManager->unregisterPolicyMixes(mAudioMixes); ASSERT_EQ(INVALID_OPERATION, ret); } Loading Loading @@ -770,7 +803,7 @@ TEST_P(AudioPolicyManagerTestDPPlaybackReRouting, PlaybackReRouting) { const audio_attributes_t attr = GetParam(); const audio_usage_t usage = attr.usage; audio_port_handle_t playbackRoutedPortId; audio_port_handle_t playbackRoutedPortId = AUDIO_PORT_HANDLE_NONE; audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE; getOutputForAttr(&playbackRoutedPortId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO, 48000 /*sampleRate*/, AUDIO_OUTPUT_FLAG_NONE, &portId, attr); Loading Loading @@ -951,7 +984,7 @@ TEST_P(AudioPolicyManagerTestDPMixRecordInjection, RecordingInjection) { const audio_attributes_t attr = GetParam(); const audio_source_t source = attr.source; audio_port_handle_t captureRoutedPortId; audio_port_handle_t captureRoutedPortId = AUDIO_PORT_HANDLE_NONE; audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE; getInputForAttr(attr, mTracker->getRiid(), &captureRoutedPortId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO, 48000 /*sampleRate*/, AUDIO_INPUT_FLAG_NONE, &portId); Loading Loading
services/audiopolicy/tests/audiopolicymanager_tests.cpp +108 −75 Original line number Diff line number Diff line Loading @@ -158,9 +158,11 @@ class AudioPolicyManagerTest : public testing::Test { protected: void SetUp() override; void TearDown() override; virtual void SetUpConfig(AudioPolicyConfig *config) { (void)config; } virtual void SetUpManagerConfig(); void dumpToLog(); // When explicitly routing is needed, selectedDeviceId need to be set as the wanted port // id. Otherwise, selectedDeviceId need to be initialized as AUDIO_PORT_HANDLE_NONE. void getOutputForAttr( audio_port_handle_t *selectedDeviceId, audio_format_t format, Loading @@ -182,6 +184,7 @@ class AudioPolicyManagerTest : public testing::Test { void findDevicePort(audio_port_role_t role, audio_devices_t deviceType, const std::string &address, audio_port &foundPort); static audio_port_handle_t getDeviceIdFromPatch(const struct audio_patch* patch); std::unique_ptr<AudioPolicyManagerTestClient> mClient; std::unique_ptr<AudioPolicyTestManager> mManager; Loading @@ -190,8 +193,7 @@ class AudioPolicyManagerTest : public testing::Test { void AudioPolicyManagerTest::SetUp() { mClient.reset(new AudioPolicyManagerTestClient); mManager.reset(new AudioPolicyTestManager(mClient.get())); mManager->getConfig().setDefault(); SetUpConfig(&mManager->getConfig()); // Subclasses may want to customize the config. SetUpManagerConfig(); // Subclasses may want to customize the config. ASSERT_EQ(NO_ERROR, mManager->initialize()); ASSERT_EQ(NO_ERROR, mManager->initCheck()); } Loading @@ -201,6 +203,10 @@ void AudioPolicyManagerTest::TearDown() { mClient.reset(); } void AudioPolicyManagerTest::SetUpManagerConfig() { mManager->getConfig().setDefault(); } void AudioPolicyManagerTest::dumpToLog() { int pipefd[2]; ASSERT_NE(-1, pipe(pipefd)); Loading Loading @@ -245,7 +251,6 @@ void AudioPolicyManagerTest::getOutputForAttr( config.sample_rate = sampleRate; config.channel_mask = channelMask; config.format = format; *selectedDeviceId = AUDIO_PORT_HANDLE_NONE; audio_port_handle_t localPortId; if (!portId) portId = &localPortId; *portId = AUDIO_PORT_HANDLE_NONE; Loading @@ -269,7 +274,6 @@ void AudioPolicyManagerTest::getInputForAttr( config.sample_rate = sampleRate; config.channel_mask = channelMask; config.format = format; *selectedDeviceId = AUDIO_PORT_HANDLE_NONE; audio_port_handle_t localPortId; if (!portId) portId = &localPortId; *portId = AUDIO_PORT_HANDLE_NONE; Loading Loading @@ -306,6 +310,21 @@ void AudioPolicyManagerTest::findDevicePort(audio_port_role_t role, GTEST_FAIL(); } audio_port_handle_t AudioPolicyManagerTest::getDeviceIdFromPatch( const struct audio_patch* patch) { // The logic here is the same as the one in AudioIoDescriptor. // Note this function is aim to get routed device id for test. // In that case, device to device patch is not expected here. if (patch->num_sources != 0 && patch->num_sinks != 0) { if (patch->sources[0].type == AUDIO_PORT_TYPE_MIX) { return patch->sinks[0].id; } else { return patch->sources[0].id; } } return AUDIO_PORT_HANDLE_NONE; } TEST_F(AudioPolicyManagerTest, InitSuccess) { // SetUp must finish with no assertions. Loading Loading @@ -365,15 +384,17 @@ TEST_F(AudioPolicyManagerTest, CreateAudioPatchFromMix) { class AudioPolicyManagerTestMsd : public AudioPolicyManagerTest { protected: void SetUpConfig(AudioPolicyConfig *config) override; void SetUpManagerConfig() override; void TearDown() override; sp<DeviceDescriptor> mMsdOutputDevice; sp<DeviceDescriptor> mMsdInputDevice; }; void AudioPolicyManagerTestMsd::SetUpConfig(AudioPolicyConfig *config) { void AudioPolicyManagerTestMsd::SetUpManagerConfig() { // TODO: Consider using Serializer to load part of the config from a string. AudioPolicyManagerTest::SetUpManagerConfig(); AudioPolicyConfig& config = mManager->getConfig(); mMsdOutputDevice = new DeviceDescriptor(AUDIO_DEVICE_OUT_BUS); sp<AudioProfile> pcmOutputProfile = new AudioProfile( AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO, 48000); Loading @@ -386,13 +407,13 @@ void AudioPolicyManagerTestMsd::SetUpConfig(AudioPolicyConfig *config) { sp<AudioProfile> pcmInputProfile = new AudioProfile( AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO, 44100); mMsdInputDevice->addAudioProfile(pcmInputProfile); config->addAvailableDevice(mMsdOutputDevice); config->addAvailableDevice(mMsdInputDevice); config.addAvailableDevice(mMsdOutputDevice); config.addAvailableDevice(mMsdInputDevice); sp<HwModule> msdModule = new HwModule(AUDIO_HARDWARE_MODULE_ID_MSD, 2 /*halVersionMajor*/); HwModuleCollection modules = config->getHwModules(); HwModuleCollection modules = config.getHwModules(); modules.add(msdModule); config->setHwModules(modules); config.setHwModules(modules); mMsdOutputDevice->attach(msdModule); mMsdInputDevice->attach(msdModule); Loading @@ -417,12 +438,12 @@ void AudioPolicyManagerTestMsd::SetUpConfig(AudioPolicyConfig *config) { // of streams that are not supported by MSD. sp<AudioProfile> dtsOutputProfile = new AudioProfile( AUDIO_FORMAT_DTS, AUDIO_CHANNEL_OUT_5POINT1, 48000); config->getDefaultOutputDevice()->addAudioProfile(dtsOutputProfile); config.getDefaultOutputDevice()->addAudioProfile(dtsOutputProfile); sp<OutputProfile> primaryEncodedOutputProfile = new OutputProfile("encoded"); primaryEncodedOutputProfile->addAudioProfile(dtsOutputProfile); primaryEncodedOutputProfile->setFlags(AUDIO_OUTPUT_FLAG_DIRECT); primaryEncodedOutputProfile->addSupportedDevice(config->getDefaultOutputDevice()); config->getHwModules().getModuleFromName(AUDIO_HARDWARE_MODULE_ID_PRIMARY)-> primaryEncodedOutputProfile->addSupportedDevice(config.getDefaultOutputDevice()); config.getHwModules().getModuleFromName(AUDIO_HARDWARE_MODULE_ID_PRIMARY)-> addOutputProfile(primaryEncodedOutputProfile); } Loading Loading @@ -450,7 +471,7 @@ TEST_F(AudioPolicyManagerTestMsd, PatchCreationOnSetForceUse) { TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrEncodedRoutesToMsd) { const PatchCountCheck patchCount = snapshotPatchCount(); audio_port_handle_t selectedDeviceId; audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE; getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1, 48000, AUDIO_OUTPUT_FLAG_DIRECT); ASSERT_EQ(selectedDeviceId, mMsdOutputDevice->getId()); Loading @@ -459,7 +480,7 @@ TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrEncodedRoutesToMsd) { TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrPcmRoutesToMsd) { const PatchCountCheck patchCount = snapshotPatchCount(); audio_port_handle_t selectedDeviceId; audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE; getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO, 48000); ASSERT_EQ(selectedDeviceId, mMsdOutputDevice->getId()); Loading @@ -468,7 +489,7 @@ TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrPcmRoutesToMsd) { TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrEncodedPlusPcmRoutesToMsd) { const PatchCountCheck patchCount = snapshotPatchCount(); audio_port_handle_t selectedDeviceId; audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE; getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1, 48000, AUDIO_OUTPUT_FLAG_DIRECT); ASSERT_EQ(selectedDeviceId, mMsdOutputDevice->getId()); Loading @@ -481,7 +502,7 @@ TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrEncodedPlusPcmRoutesToMsd) { TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrUnsupportedFormatBypassesMsd) { const PatchCountCheck patchCount = snapshotPatchCount(); audio_port_handle_t selectedDeviceId; audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE; getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_DTS, AUDIO_CHANNEL_OUT_5POINT1, 48000, AUDIO_OUTPUT_FLAG_DIRECT); ASSERT_NE(selectedDeviceId, mMsdOutputDevice->getId()); Loading @@ -492,7 +513,8 @@ TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrFormatSwitching) { // Switch between formats that are supported and not supported by MSD. { const PatchCountCheck patchCount = snapshotPatchCount(); audio_port_handle_t selectedDeviceId, portId; audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE; audio_port_handle_t portId; getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1, 48000, AUDIO_OUTPUT_FLAG_DIRECT, &portId); Loading @@ -503,7 +525,8 @@ TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrFormatSwitching) { } { const PatchCountCheck patchCount = snapshotPatchCount(); audio_port_handle_t selectedDeviceId, portId; audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE; audio_port_handle_t portId; getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_DTS, AUDIO_CHANNEL_OUT_5POINT1, 48000, AUDIO_OUTPUT_FLAG_DIRECT, &portId); Loading @@ -514,7 +537,7 @@ TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrFormatSwitching) { } { const PatchCountCheck patchCount = snapshotPatchCount(); audio_port_handle_t selectedDeviceId; audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE; getOutputForAttr(&selectedDeviceId, AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1, 48000, AUDIO_OUTPUT_FLAG_DIRECT); ASSERT_EQ(selectedDeviceId, mMsdOutputDevice->getId()); Loading @@ -522,37 +545,52 @@ TEST_F(AudioPolicyManagerTestMsd, GetOutputForAttrFormatSwitching) { } } class AudioPolicyManagerTestWithConfigurationFile : public AudioPolicyManagerTest { protected: void SetUpManagerConfig() override; virtual std::string getConfigFile() { return sDefaultConfig; } static const std::string sExecutableDir; static const std::string sDefaultConfig; }; const std::string AudioPolicyManagerTestWithConfigurationFile::sExecutableDir = base::GetExecutableDirectory() + "/"; const std::string AudioPolicyManagerTestWithConfigurationFile::sDefaultConfig = sExecutableDir + "test_audio_policy_configuration.xml"; void AudioPolicyManagerTestWithConfigurationFile::SetUpManagerConfig() { status_t status = deserializeAudioPolicyFile(getConfigFile().c_str(), &mManager->getConfig()); ASSERT_EQ(NO_ERROR, status); } TEST_F(AudioPolicyManagerTestWithConfigurationFile, InitSuccess) { // SetUp must finish with no assertions. } TEST_F(AudioPolicyManagerTestWithConfigurationFile, Dump) { dumpToLog(); } using PolicyMixTuple = std::tuple<audio_usage_t, audio_source_t, uint32_t>; class AudioPolicyManagerTestDynamicPolicy : public AudioPolicyManagerTest { class AudioPolicyManagerTestDynamicPolicy : public AudioPolicyManagerTestWithConfigurationFile { protected: void SetUp() override; void TearDown() override; status_t addPolicyMix(int mixType, int mixFlag, audio_devices_t deviceType, std::string mixAddress, const audio_config_t& audioConfig, const std::vector<PolicyMixTuple>& rules); void clearPolicyMix(); void resetManager(const std::string& configFileName); audio_port_handle_t getDeviceIdFromPatch(const struct audio_patch* patch); Vector<AudioMix> mAudioMixes; const std::string mExecutableDir = base::GetExecutableDirectory(); const std::string mConfig = mExecutableDir + "/test_audio_policy_configuration.xml"; const std::string mPrimaryOnlyConfig = mExecutableDir + "/test_audio_policy_primary_only_configuration.xml"; const std::string mMixAddress = "remote_submix_media"; }; void AudioPolicyManagerTestDynamicPolicy::SetUp() { // Override Setup function to use configuration file to do initialization. mClient.reset(new AudioPolicyManagerTestClient); resetManager(mConfig); } void AudioPolicyManagerTestDynamicPolicy::TearDown() { mManager->unregisterPolicyMixes(mAudioMixes); AudioPolicyManagerTest::TearDown(); AudioPolicyManagerTestWithConfigurationFile::TearDown(); } status_t AudioPolicyManagerTestDynamicPolicy::addPolicyMix(int mixType, int mixFlag, Loading Loading @@ -585,32 +623,8 @@ void AudioPolicyManagerTestDynamicPolicy::clearPolicyMix() { mAudioMixes.clear(); } void AudioPolicyManagerTestDynamicPolicy::resetManager(const std::string& configFileName) { clearPolicyMix(); mManager.reset(new AudioPolicyTestManager(mClient.get())); status_t status = deserializeAudioPolicyFile(configFileName.c_str(), &mManager->getConfig()); ASSERT_EQ(NO_ERROR, status); ASSERT_EQ(NO_ERROR, mManager->initialize()); ASSERT_EQ(NO_ERROR, mManager->initCheck()); } audio_port_handle_t AudioPolicyManagerTestDynamicPolicy::getDeviceIdFromPatch( const struct audio_patch* patch) { // The logic here is the same as the one in AudioIoDescriptor. // Note this function is aim to get routed device id for test. // In that case, device to device patch is not expected here. if (patch->num_sources != 0 && patch->num_sinks != 0) { if (patch->sources[0].type == AUDIO_PORT_TYPE_MIX) { return patch->sinks[0].id; } else { return patch->sources[0].id; } } return AUDIO_PORT_HANDLE_NONE; } TEST_F(AudioPolicyManagerTestDynamicPolicy, InitSuccess) { // SetUp must finish with no assertions. // SetUp must finish with no assertions } TEST_F(AudioPolicyManagerTestDynamicPolicy, Dump) { Loading Loading @@ -645,16 +659,10 @@ TEST_F(AudioPolicyManagerTestDynamicPolicy, RegisterPolicyMixes) { ret = mManager->registerPolicyMixes(mAudioMixes); ASSERT_EQ(INVALID_OPERATION, ret); // Registration should fail due to not module for remote submix found. resetManager(mPrimaryOnlyConfig); ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK, AUDIO_DEVICE_OUT_REMOTE_SUBMIX, "", audioConfig, std::vector<PolicyMixTuple>()); ASSERT_EQ(INVALID_OPERATION, ret); // Registration should fail due to device not found. // Note that earpiece is not present in the test configuration file. // This will need to be updated if earpiece is added in the test configuration file. resetManager(mConfig); clearPolicyMix(); ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_RENDER, AUDIO_DEVICE_OUT_EARPIECE, "", audioConfig, std::vector<PolicyMixTuple>()); ASSERT_EQ(INVALID_OPERATION, ret); Loading Loading @@ -695,12 +703,37 @@ TEST_F(AudioPolicyManagerTestDynamicPolicy, UnregisterPolicyMixes) { // the same policy mixes as they are not registered. ret = mManager->unregisterPolicyMixes(mAudioMixes); ASSERT_EQ(INVALID_OPERATION, ret); } class AudioPolicyManagerTestDPNoRemoteSubmixModule : public AudioPolicyManagerTestDynamicPolicy { protected: std::string getConfigFile() override { return sPrimaryOnlyConfig; } static const std::string sPrimaryOnlyConfig; }; const std::string AudioPolicyManagerTestDPNoRemoteSubmixModule::sPrimaryOnlyConfig = sExecutableDir + "test_audio_policy_primary_only_configuration.xml"; TEST_F(AudioPolicyManagerTestDPNoRemoteSubmixModule, InitSuccess) { // SetUp must finish with no assertions. } TEST_F(AudioPolicyManagerTestDPNoRemoteSubmixModule, Dump) { dumpToLog(); } TEST_F(AudioPolicyManagerTestDPNoRemoteSubmixModule, RegistrationFailure) { // Registration/Unregistration should fail due to module for remote submix not found. status_t ret; audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER; audioConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO; audioConfig.format = AUDIO_FORMAT_PCM_16_BIT; audioConfig.sample_rate = 48000; ret = addPolicyMix(MIX_TYPE_PLAYERS, MIX_ROUTE_FLAG_LOOP_BACK, AUDIO_DEVICE_OUT_REMOTE_SUBMIX, "", audioConfig, std::vector<PolicyMixTuple>()); ASSERT_EQ(INVALID_OPERATION, ret); resetManager(mPrimaryOnlyConfig); // Create a fake policy mixes, the unregistration should fail due to no remote // submix module found. mAudioMixes.add(AudioMix(Vector<AudioMixMatchCriterion>(), MIX_TYPE_PLAYERS, audioConfig, MIX_ROUTE_FLAG_LOOP_BACK, String8(mMixAddress.c_str()), 0)); ret = mManager->unregisterPolicyMixes(mAudioMixes); ASSERT_EQ(INVALID_OPERATION, ret); } Loading Loading @@ -770,7 +803,7 @@ TEST_P(AudioPolicyManagerTestDPPlaybackReRouting, PlaybackReRouting) { const audio_attributes_t attr = GetParam(); const audio_usage_t usage = attr.usage; audio_port_handle_t playbackRoutedPortId; audio_port_handle_t playbackRoutedPortId = AUDIO_PORT_HANDLE_NONE; audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE; getOutputForAttr(&playbackRoutedPortId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO, 48000 /*sampleRate*/, AUDIO_OUTPUT_FLAG_NONE, &portId, attr); Loading Loading @@ -951,7 +984,7 @@ TEST_P(AudioPolicyManagerTestDPMixRecordInjection, RecordingInjection) { const audio_attributes_t attr = GetParam(); const audio_source_t source = attr.source; audio_port_handle_t captureRoutedPortId; audio_port_handle_t captureRoutedPortId = AUDIO_PORT_HANDLE_NONE; audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE; getInputForAttr(attr, mTracker->getRiid(), &captureRoutedPortId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO, 48000 /*sampleRate*/, AUDIO_INPUT_FLAG_NONE, &portId); Loading