audiopolicy: Add more tests, fix issues found
Added tests that ensure correct initialization of APM.
Fixed issues:
-- UB in VolumeCurvesForStream::volIndexToDb due to not
checking that the pointer is non-null;
-- AudioInputDescriptor::open and SwAudioOutputDescriptor::open
were not checking that the returned IO handle is valid,
this was causing an infinite loop in
AudioPolicyManager::selectOutputForMusicEffects, added an
assertion.
-- Memory leak of VolumeCurves collection in APM.
Test: audiopolicy_tests
Change-Id: Ia4ecca1dd03b74d7f93720f042da05d5a0c74a6b
diff --git a/services/audiopolicy/tests/audiopolicymanager_tests.cpp b/services/audiopolicy/tests/audiopolicymanager_tests.cpp
index 33b15c7..de26ab0 100644
--- a/services/audiopolicy/tests/audiopolicymanager_tests.cpp
+++ b/services/audiopolicy/tests/audiopolicymanager_tests.cpp
@@ -21,9 +21,62 @@
using namespace android;
-TEST(AudioPolicyManager, CreateWithDummyClient) {
+TEST(AudioPolicyManager, InitFailure) {
AudioPolicyTestClient client;
AudioPolicyTestManager manager(&client);
manager.getConfig().setDefault();
+ // Since the default client fails to open anything,
+ // APM should indicate that the initialization didn't succeed.
ASSERT_EQ(NO_INIT, manager.initialize());
+ ASSERT_EQ(NO_INIT, manager.initCheck());
+}
+
+
+// A client that provides correct module and IO handles for inputs and outputs.
+class AudioPolicyTestClientWithModulesIoHandles : public AudioPolicyTestClient {
+ public:
+ audio_module_handle_t loadHwModule(const char* /*name*/) override {
+ return mNextModule++;
+ }
+ status_t openOutput(audio_module_handle_t module,
+ audio_io_handle_t* output,
+ audio_config_t* /*config*/,
+ audio_devices_t* /*devices*/,
+ const String8& /*address*/,
+ uint32_t* /*latencyMs*/,
+ audio_output_flags_t /*flags*/) override {
+ if (module >= mNextModule) {
+ ALOGE("%s: Module handle %d has not been allocated yet (next is %d)",
+ __func__, module, mNextModule);
+ return BAD_VALUE;
+ }
+ *output = mNextIoHandle++;
+ return NO_ERROR;
+ }
+ status_t openInput(audio_module_handle_t module,
+ audio_io_handle_t* input,
+ audio_config_t* /*config*/,
+ audio_devices_t* /*device*/,
+ const String8& /*address*/,
+ audio_source_t /*source*/,
+ audio_input_flags_t /*flags*/) override {
+ if (module >= mNextModule) {
+ ALOGE("%s: Module handle %d has not been allocated yet (next is %d)",
+ __func__, module, mNextModule);
+ return BAD_VALUE;
+ }
+ *input = mNextIoHandle++;
+ return NO_ERROR;
+ }
+ private:
+ audio_module_handle_t mNextModule = AUDIO_MODULE_HANDLE_NONE + 1;
+ audio_io_handle_t mNextIoHandle = AUDIO_IO_HANDLE_NONE + 1;
+};
+
+TEST(AudioPolicyManager, InitSuccess) {
+ AudioPolicyTestClientWithModulesIoHandles client;
+ AudioPolicyTestManager manager(&client);
+ manager.getConfig().setDefault();
+ ASSERT_EQ(NO_ERROR, manager.initialize());
+ ASSERT_EQ(NO_ERROR, manager.initCheck());
}