• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <vector>
18 
19 #define LOG_TAG "AudioEffectHidlHalTest"
20 #include <android-base/logging.h>
21 #if MAJOR_VERSION <= 6
22 #include <system/audio.h>
23 #endif
24 
25 #include PATH(android/hardware/audio/effect/FILE_VERSION/IEffect.h)
26 #include PATH(android/hardware/audio/effect/FILE_VERSION/IEffectsFactory.h)
27 #include PATH(android/hardware/audio/effect/FILE_VERSION/IEqualizerEffect.h)
28 #include PATH(android/hardware/audio/effect/FILE_VERSION/ILoudnessEnhancerEffect.h)
29 #include PATH(android/hardware/audio/effect/FILE_VERSION/types.h)
30 #include <android/hidl/allocator/1.0/IAllocator.h>
31 #include <android/hidl/memory/1.0/IMemory.h>
32 #if MAJOR_VERSION >= 7
33 #include <android_audio_policy_configuration_V7_0-enums.h>
34 #endif
35 
36 #include <common/all-versions/VersionUtils.h>
37 
38 #include <cutils/properties.h>
39 #include <gtest/gtest.h>
40 #include <hidl/GtestPrinter.h>
41 #include <hidl/ServiceManagement.h>
42 #include <hwbinder/IPCThreadState.h>
43 
44 using ::android::sp;
45 using ::android::hardware::hidl_handle;
46 using ::android::hardware::hidl_memory;
47 using ::android::hardware::hidl_string;
48 using ::android::hardware::hidl_vec;
49 using ::android::hardware::MQDescriptorSync;
50 using ::android::hardware::Return;
51 using ::android::hardware::Void;
52 using ::android::hardware::audio::common::utils::mkEnumBitfield;
53 using ::android::hidl::allocator::V1_0::IAllocator;
54 using ::android::hidl::memory::V1_0::IMemory;
55 using namespace ::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION;
56 using namespace ::android::hardware::audio::effect::CPP_VERSION;
57 #if MAJOR_VERSION >= 7
58 // Make an alias for enumerations generated from the APM config XSD.
59 namespace xsd {
60 using namespace ::android::audio::policy::configuration::CPP_VERSION;
61 }
62 #endif
63 
64 #ifndef ARRAY_SIZE
65 #define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a)))
66 #endif
67 
68 class AudioEffectsFactoryHidlTest : public ::testing::TestWithParam<std::string> {
69   public:
SetUp()70     void SetUp() override {
71         effectsFactory = IEffectsFactory::getService(GetParam());
72         ASSERT_NE(effectsFactory, nullptr);
73     }
TearDown()74     void TearDown() override { effectsFactory.clear(); }
75 
76    protected:
description(const std::string & description)77     static void description(const std::string& description) {
78         RecordProperty("description", description);
79     }
80 
81     sp<IEffectsFactory> effectsFactory;
82 };
83 
TEST_P(AudioEffectsFactoryHidlTest,EnumerateEffects)84 TEST_P(AudioEffectsFactoryHidlTest, EnumerateEffects) {
85     description("Verify that EnumerateEffects returns at least one effect");
86     Result retval = Result::NOT_INITIALIZED;
87     size_t effectCount = 0;
88     Return<void> ret =
89         effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
90             retval = r;
91             effectCount = result.size();
92         });
93     EXPECT_TRUE(ret.isOk());
94     EXPECT_EQ(Result::OK, retval);
95     EXPECT_GT(effectCount, 0u);
96 }
97 
TEST_P(AudioEffectsFactoryHidlTest,CreateEffect)98 TEST_P(AudioEffectsFactoryHidlTest, CreateEffect) {
99     description("Verify that an effect can be created via CreateEffect");
100     bool gotEffect = false;
101     Uuid effectUuid;
102     Return<void> ret =
103         effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
104             if (r == Result::OK && result.size() > 0) {
105                 gotEffect = true;
106                 effectUuid = result[0].uuid;
107             }
108         });
109     ASSERT_TRUE(ret.isOk());
110     ASSERT_TRUE(gotEffect);
111     Result retval = Result::NOT_INITIALIZED;
112     sp<IEffect> effect;
113     ret = effectsFactory->createEffect(
114             effectUuid, 1 /*session*/, 1 /*ioHandle*/,
115 #if MAJOR_VERSION >= 6
116             0 /*device*/,
117 #endif
118             [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) {
119                 retval = r;
120                 if (r == Result::OK) {
121                     effect = result;
122                 }
123             });
124     EXPECT_TRUE(ret.isOk());
125     EXPECT_EQ(Result::OK, retval);
126     EXPECT_NE(nullptr, effect.get());
127 }
128 
TEST_P(AudioEffectsFactoryHidlTest,GetDescriptor)129 TEST_P(AudioEffectsFactoryHidlTest, GetDescriptor) {
130     description(
131         "Verify that effects factory can provide an effect descriptor via "
132         "GetDescriptor");
133     hidl_vec<EffectDescriptor> allDescriptors;
134     Return<void> ret =
135         effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
136             if (r == Result::OK) {
137                 allDescriptors = result;
138             }
139         });
140     ASSERT_TRUE(ret.isOk());
141     ASSERT_GT(allDescriptors.size(), 0u);
142     for (size_t i = 0; i < allDescriptors.size(); ++i) {
143         ret = effectsFactory->getDescriptor(allDescriptors[i].uuid,
144                                             [&](Result r, const EffectDescriptor& result) {
145                                                 EXPECT_EQ(r, Result::OK);
146                                                 EXPECT_EQ(result, allDescriptors[i]);
147                                             });
148     }
149     EXPECT_TRUE(ret.isOk());
150 }
151 
TEST_P(AudioEffectsFactoryHidlTest,DebugDumpInvalidArgument)152 TEST_P(AudioEffectsFactoryHidlTest, DebugDumpInvalidArgument) {
153     description("Verify that debugDump doesn't crash on invalid arguments");
154 #if MAJOR_VERSION == 2
155     Return<void> ret = effectsFactory->debugDump(hidl_handle());
156 #elif MAJOR_VERSION >= 4
157     Return<void> ret = effectsFactory->debug(hidl_handle(), {});
158 #endif
159     ASSERT_TRUE(ret.isOk());
160 }
161 
162 // Equalizer effect is required by CDD, but only the type is fixed.
163 // This is the same UUID as AudioEffect.EFFECT_TYPE_EQUALIZER in Java.
164 static const Uuid EQUALIZER_EFFECT_TYPE = {
165     0x0bed4300, 0xddd6, 0x11db, 0x8f34,
166     std::array<uint8_t, 6>{{0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}};
167 // Loudness Enhancer effect is required by CDD, but only the type is fixed.
168 // This is the same UUID as AudioEffect.EFFECT_TYPE_LOUDNESS_ENHANCER in Java.
169 static const Uuid LOUDNESS_ENHANCER_EFFECT_TYPE = {
170     0xfe3199be, 0xaed0, 0x413f, 0x87bb,
171     std::array<uint8_t, 6>{{0x11, 0x26, 0x0e, 0xb6, 0x3c, 0xf1}}};
172 
173 enum { PARAM_FACTORY_NAME, PARAM_EFFECT_UUID, PARAM_USE_AFTER_CLOSE };
174 using EffectParameter = std::tuple<std::string, Uuid, bool>;
175 
EffectParameterToString(const::testing::TestParamInfo<EffectParameter> & info)176 static inline std::string EffectParameterToString(
177         const ::testing::TestParamInfo<EffectParameter>& info) {
178     std::string prefix = std::get<PARAM_USE_AFTER_CLOSE>(info.param) ? "UseAfterClose_" : "";
179     return prefix.append(
180             ::android::hardware::PrintInstanceNameToString(::testing::TestParamInfo<std::string>{
181                     std::get<PARAM_FACTORY_NAME>(info.param), info.index}));
182 }
183 
184 // The main test class for Audio Effect HIDL HAL.
185 class AudioEffectHidlTest : public ::testing::TestWithParam<EffectParameter> {
186   public:
SetUp()187     void SetUp() override {
188         effectsFactory = IEffectsFactory::getService(std::get<PARAM_FACTORY_NAME>(GetParam()));
189         ASSERT_NE(nullptr, effectsFactory.get());
190 
191         ASSERT_NO_FATAL_FAILURE(findAndCreateEffect(getEffectType()));
192         ASSERT_NE(nullptr, effect.get());
193 
194         Return<Result> ret = effect->init();
195         ASSERT_TRUE(ret.isOk());
196         ASSERT_EQ(Result::OK, ret);
197 
198         useAfterClose = std::get<PARAM_USE_AFTER_CLOSE>(GetParam());
199         if (useAfterClose) {
200             Return<Result> ret = effect->close();
201             ASSERT_TRUE(ret.isOk());
202             ASSERT_EQ(Result::OK, ret);
203         }
204     }
205 
TearDown()206     void TearDown() override {
207         effect.clear();
208         effectsFactory.clear();
209         // Ensure all pending binder transactions are completed before proceeding.
210         android::hardware::IPCThreadState::self()->flushCommands();
211         // Add a delay to allow the binder destruction to propagate and ensure
212         // the remote objects are properly cleaned up.
213         usleep(100 * 1000);
214     }
215 
216    protected:
description(const std::string & description)217     static void description(const std::string& description) {
218         RecordProperty("description", description);
219     }
220 
getEffectType() const221     Uuid getEffectType() const { return std::get<PARAM_EFFECT_UUID>(GetParam()); }
222 
223     void checkResult(const Result& result);
224     void checkResultForUseAfterClose(const Result& result);
225     void findAndCreateEffect(const Uuid& type);
226     void findEffectInstance(const Uuid& type, Uuid* uuid);
227     void getChannelCount(uint32_t* channelCount);
228 
229     sp<IEffectsFactory> effectsFactory;
230     sp<IEffect> effect;
231     bool useAfterClose;
232 };
233 
checkResult(const Result & result)234 void AudioEffectHidlTest::checkResult(const Result& result) {
235     if (!useAfterClose) {
236         ASSERT_EQ(Result::OK, result);
237     } else {
238         ASSERT_NO_FATAL_FAILURE(checkResultForUseAfterClose(result));
239     }
240 }
241 
checkResultForUseAfterClose(const Result & result)242 void AudioEffectHidlTest::checkResultForUseAfterClose(const Result& result) {
243     if (useAfterClose) {
244         // The actual error does not matter. It's important that the effect did not crash
245         // while executing any command after a call to "close", and that the returned status
246         // is not OK.
247         ASSERT_NE(Result::OK, result);
248     }
249 }
250 
findAndCreateEffect(const Uuid & type)251 void AudioEffectHidlTest::findAndCreateEffect(const Uuid& type) {
252     Uuid effectUuid;
253     ASSERT_NO_FATAL_FAILURE(findEffectInstance(type, &effectUuid));
254     Return<void> ret = effectsFactory->createEffect(
255             effectUuid, 1 /*session*/, 1 /*ioHandle*/,
256 #if MAJOR_VERSION >= 6
257             0 /*device*/,
258 #endif
259             [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) {
260                 if (r == Result::OK) {
261                     effect = result;
262                 }
263             });
264     ASSERT_TRUE(ret.isOk());
265 }
266 
findEffectInstance(const Uuid & type,Uuid * uuid)267 void AudioEffectHidlTest::findEffectInstance(const Uuid& type, Uuid* uuid) {
268     bool effectFound = false;
269     Return<void> ret =
270         effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
271             if (r == Result::OK) {
272                 for (const auto& desc : result) {
273                     if (desc.type == type) {
274                         effectFound = true;
275                         *uuid = desc.uuid;
276                         break;
277                     }
278                 }
279             }
280         });
281     ASSERT_TRUE(ret.isOk());
282     ASSERT_TRUE(effectFound);
283 }
284 
getChannelCount(uint32_t * channelCount)285 void AudioEffectHidlTest::getChannelCount(uint32_t* channelCount) {
286     Result retval;
287     EffectConfig currentConfig;
288     Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
289         retval = r;
290         if (r == Result::OK) {
291             currentConfig = conf;
292         }
293     });
294     ASSERT_TRUE(ret.isOk());
295     ASSERT_NO_FATAL_FAILURE(checkResult(retval));
296     if (useAfterClose) {
297         *channelCount = 1;
298         return;
299     }
300 #if MAJOR_VERSION <= 6
301     ASSERT_TRUE(audio_channel_mask_is_valid(
302         static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels)));
303     *channelCount = audio_channel_count_from_out_mask(
304         static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels));
305 #else
306     ASSERT_EQ(AudioConfigBaseOptional::ChannelMask::hidl_discriminator::value,
307               currentConfig.outputCfg.base.channelMask.getDiscriminator());
308     *channelCount = android::audio::policy::configuration::V7_0::getChannelCount(
309             currentConfig.outputCfg.base.channelMask.value());
310     ASSERT_NE(*channelCount, 0);
311 #endif
312 }
313 
TEST_P(AudioEffectHidlTest,Close)314 TEST_P(AudioEffectHidlTest, Close) {
315     description("Verify that an effect can be closed");
316     Return<Result> ret = effect->close();
317     EXPECT_TRUE(ret.isOk());
318     ASSERT_NO_FATAL_FAILURE(checkResult(ret));
319 }
320 
TEST_P(AudioEffectHidlTest,GetDescriptor)321 TEST_P(AudioEffectHidlTest, GetDescriptor) {
322     description("Verify that an effect can return its own descriptor via GetDescriptor");
323     Result retval = Result::NOT_INITIALIZED;
324     Uuid actualType;
325     Return<void> ret = effect->getDescriptor([&](Result r, const EffectDescriptor& desc) {
326         retval = r;
327         if (r == Result::OK) {
328             actualType = desc.type;
329         }
330     });
331     EXPECT_TRUE(ret.isOk());
332     ASSERT_NO_FATAL_FAILURE(checkResult(retval));
333     if (useAfterClose) return;
334     EXPECT_EQ(getEffectType(), actualType);
335 }
336 
TEST_P(AudioEffectHidlTest,GetSetConfig)337 TEST_P(AudioEffectHidlTest, GetSetConfig) {
338     description(
339         "Verify that it is possible to manipulate effect config via Get / "
340         "SetConfig");
341     Result retval = Result::NOT_INITIALIZED;
342     EffectConfig currentConfig;
343     Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
344         retval = r;
345         if (r == Result::OK) {
346             currentConfig = conf;
347         }
348     });
349     EXPECT_TRUE(ret.isOk());
350     EXPECT_NO_FATAL_FAILURE(checkResult(retval));
351     if (useAfterClose) return;
352     Return<Result> ret2 = effect->setConfig(currentConfig, nullptr, nullptr);
353     EXPECT_TRUE(ret2.isOk());
354     EXPECT_EQ(Result::OK, ret2);
355 }
356 
357 #if MAJOR_VERSION >= 7
generateInvalidConfigs(const EffectBufferConfig & src)358 std::vector<EffectBufferConfig> generateInvalidConfigs(const EffectBufferConfig& src) {
359     std::vector<EffectBufferConfig> result;
360     EffectBufferConfig invalidFormat = src;
361     invalidFormat.base.format.value("random_string");
362     result.push_back(std::move(invalidFormat));
363     EffectBufferConfig invalidChannelMask = src;
364     invalidChannelMask.base.channelMask.value("random_string");
365     result.push_back(std::move(invalidChannelMask));
366     return result;
367 }
368 
TEST_P(AudioEffectHidlTest,SetConfigInvalidArguments)369 TEST_P(AudioEffectHidlTest, SetConfigInvalidArguments) {
370     description("Verify that invalid arguments are rejected by SetConfig");
371     Result retval = Result::NOT_INITIALIZED;
372     EffectConfig currentConfig;
373     Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
374         retval = r;
375         if (r == Result::OK) {
376             currentConfig = conf;
377         }
378     });
379     EXPECT_TRUE(ret.isOk());
380     EXPECT_NO_FATAL_FAILURE(checkResult(retval));
381     if (useAfterClose) return;
382     for (const auto& invalidInputCfg : generateInvalidConfigs(currentConfig.inputCfg)) {
383         EffectConfig invalidConfig = currentConfig;
384         invalidConfig.inputCfg = invalidInputCfg;
385         Return<Result> ret = effect->setConfig(invalidConfig, nullptr, nullptr);
386         EXPECT_TRUE(ret.isOk());
387         EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
388     }
389     for (const auto& invalidOutputCfg : generateInvalidConfigs(currentConfig.outputCfg)) {
390         EffectConfig invalidConfig = currentConfig;
391         invalidConfig.outputCfg = invalidOutputCfg;
392         Return<Result> ret = effect->setConfig(invalidConfig, nullptr, nullptr);
393         EXPECT_TRUE(ret.isOk());
394         EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
395     }
396 }
397 #endif
398 
TEST_P(AudioEffectHidlTest,GetConfigReverse)399 TEST_P(AudioEffectHidlTest, GetConfigReverse) {
400     description("Verify that GetConfigReverse does not crash");
401     Result retval = Result::OK;
402     Return<void> ret = effect->getConfigReverse([&](Result r, const EffectConfig&) { retval = r; });
403     EXPECT_TRUE(ret.isOk());
404     EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(retval));
405 }
406 
TEST_P(AudioEffectHidlTest,GetSupportedAuxChannelsConfigs)407 TEST_P(AudioEffectHidlTest, GetSupportedAuxChannelsConfigs) {
408     description("Verify that GetSupportedAuxChannelsConfigs does not crash");
409     Result retval = Result::OK;
410     Return<void> ret = effect->getSupportedAuxChannelsConfigs(
411             0, [&](Result r, const hidl_vec<EffectAuxChannelsConfig>&) { retval = r; });
412     EXPECT_TRUE(ret.isOk());
413     EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(retval));
414 }
415 
TEST_P(AudioEffectHidlTest,GetAuxChannelsConfig)416 TEST_P(AudioEffectHidlTest, GetAuxChannelsConfig) {
417     description("Verify that GetAuxChannelsConfig does not crash");
418     Result retval = Result::OK;
419     Return<void> ret = effect->getAuxChannelsConfig(
420             [&](Result r, const EffectAuxChannelsConfig&) { retval = r; });
421     EXPECT_TRUE(ret.isOk());
422     EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(retval));
423 }
424 
TEST_P(AudioEffectHidlTest,SetAuxChannelsConfig)425 TEST_P(AudioEffectHidlTest, SetAuxChannelsConfig) {
426     description("Verify that SetAuxChannelsConfig does not crash");
427     Return<Result> ret = effect->setAuxChannelsConfig(EffectAuxChannelsConfig());
428     EXPECT_TRUE(ret.isOk());
429     EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
430 }
431 
432 // Not generated automatically because AudioBuffer contains
433 // instances of hidl_memory which can't be compared properly
434 // in general case due to presence of handles.
435 //
436 // However, in this particular case, handles must not present
437 // thus comparison is possible.
438 //
439 // operator== must be defined in the same namespace as the structures.
440 namespace android {
441 namespace hardware {
442 namespace audio {
443 namespace effect {
444 namespace CPP_VERSION {
operator ==(const AudioBuffer & lhs,const AudioBuffer & rhs)445 inline bool operator==(const AudioBuffer& lhs, const AudioBuffer& rhs) {
446     return lhs.id == rhs.id && lhs.frameCount == rhs.frameCount && lhs.data.handle() == nullptr &&
447            rhs.data.handle() == nullptr;
448 }
449 
450 #if MAJOR_VERSION <= 6
operator ==(const EffectBufferConfig & lhs,const EffectBufferConfig & rhs)451 inline bool operator==(const EffectBufferConfig& lhs, const EffectBufferConfig& rhs) {
452     return lhs.buffer == rhs.buffer &&
453            lhs.samplingRateHz == rhs.samplingRateHz && lhs.channels == rhs.channels &&
454            lhs.format == rhs.format &&
455            lhs.accessMode == rhs.accessMode && lhs.mask == rhs.mask;
456 }
457 #else
operator ==(const EffectBufferConfig & lhs,const EffectBufferConfig & rhs)458 inline bool operator==(const EffectBufferConfig& lhs, const EffectBufferConfig& rhs) {
459     return lhs.buffer.getDiscriminator() == rhs.buffer.getDiscriminator() &&
460            (lhs.buffer.getDiscriminator() ==
461                     EffectBufferConfig::OptionalBuffer::hidl_discriminator::unspecified ||
462             lhs.buffer.buf() == rhs.buffer.buf()) &&
463            lhs.base == rhs.base && lhs.accessMode == rhs.accessMode;
464 }
465 #endif  // MAJOR_VERSION <= 6
466 
operator ==(const EffectConfig & lhs,const EffectConfig & rhs)467 inline bool operator==(const EffectConfig& lhs, const EffectConfig& rhs) {
468     return lhs.inputCfg == rhs.inputCfg && lhs.outputCfg == rhs.outputCfg;
469 }
470 }  // namespace CPP_VERSION
471 }  // namespace effect
472 }  // namespace audio
473 }  // namespace hardware
474 }  // namespace android
475 
TEST_P(AudioEffectHidlTest,Reset)476 TEST_P(AudioEffectHidlTest, Reset) {
477     description("Verify that Reset preserves effect configuration");
478     Result retval = Result::NOT_INITIALIZED;
479     EffectConfig originalConfig;
480     if (!useAfterClose) {
481         Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
482             retval = r;
483             if (r == Result::OK) {
484                 originalConfig = conf;
485             }
486         });
487         ASSERT_TRUE(ret.isOk());
488         ASSERT_EQ(Result::OK, retval);
489     }
490     Return<Result> ret2 = effect->reset();
491     EXPECT_TRUE(ret2.isOk());
492     EXPECT_NO_FATAL_FAILURE(checkResult(ret2));
493     if (!useAfterClose) {
494         EffectConfig configAfterReset;
495         Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
496             retval = r;
497             if (r == Result::OK) {
498                 configAfterReset = conf;
499             }
500         });
501         EXPECT_EQ(originalConfig, configAfterReset);
502     }
503 }
504 
TEST_P(AudioEffectHidlTest,DisableEnableDisable)505 TEST_P(AudioEffectHidlTest, DisableEnableDisable) {
506     description("Verify Disable -> Enable -> Disable sequence for an effect");
507     Return<Result> ret = effect->disable();
508     EXPECT_TRUE(ret.isOk());
509     if (!useAfterClose) {
510         // Note: some legacy effects may return -EINVAL (INVALID_ARGUMENTS),
511         //       more canonical is to return -ENOSYS (NOT_SUPPORTED)
512         EXPECT_TRUE(ret == Result::NOT_SUPPORTED || ret == Result::INVALID_ARGUMENTS);
513     } else {
514         EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
515     }
516     ret = effect->enable();
517     EXPECT_TRUE(ret.isOk());
518     EXPECT_NO_FATAL_FAILURE(checkResult(ret));
519     ret = effect->disable();
520     EXPECT_TRUE(ret.isOk());
521     EXPECT_NO_FATAL_FAILURE(checkResult(ret));
522 }
523 
524 #if MAJOR_VERSION >= 7
TEST_P(AudioEffectHidlTest,SetDeviceInvalidDeviceAddress)525 TEST_P(AudioEffectHidlTest, SetDeviceInvalidDeviceAddress) {
526     description("Verify that invalid device address is rejected by SetDevice");
527     if (useAfterClose) {
528         GTEST_SKIP() << "Does not make sense for the useAfterClose case";
529     }
530     DeviceAddress device{.deviceType = "random_string"};
531     Return<Result> ret = effect->setDevice(device);
532     EXPECT_TRUE(ret.isOk());
533     EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
534 }
535 #endif
536 
TEST_P(AudioEffectHidlTest,SetDevice)537 TEST_P(AudioEffectHidlTest, SetDevice) {
538     description("Verify that SetDevice works for an output chain effect");
539 #if MAJOR_VERSION <= 6
540     Return<Result> ret = effect->setDevice(mkEnumBitfield(AudioDevice::OUT_SPEAKER));
541 #else
542     DeviceAddress device{.deviceType = toString(xsd::AudioDevice::AUDIO_DEVICE_OUT_SPEAKER)};
543     Return<Result> ret = effect->setDevice(device);
544 #endif
545     EXPECT_TRUE(ret.isOk());
546     EXPECT_NO_FATAL_FAILURE(checkResult(ret));
547 }
548 
TEST_P(AudioEffectHidlTest,SetAndGetVolume)549 TEST_P(AudioEffectHidlTest, SetAndGetVolume) {
550     description("Verify that SetAndGetVolume method works for an effect");
551     uint32_t channelCount;
552     ASSERT_NO_FATAL_FAILURE(getChannelCount(&channelCount));
553     hidl_vec<uint32_t> volumes;
554     volumes.resize(channelCount);
555     for (uint32_t i = 0; i < channelCount; ++i) {
556         volumes[i] = 0;
557     }
558     Result retval = Result::NOT_INITIALIZED;
559     Return<void> ret =
560         effect->setAndGetVolume(volumes, [&](Result r, const hidl_vec<uint32_t>&) { retval = r; });
561     EXPECT_TRUE(ret.isOk());
562     EXPECT_NO_FATAL_FAILURE(checkResult(retval));
563 }
564 
TEST_P(AudioEffectHidlTest,VolumeChangeNotification)565 TEST_P(AudioEffectHidlTest, VolumeChangeNotification) {
566     description("Verify that effect accepts VolumeChangeNotification");
567     uint32_t channelCount;
568     ASSERT_NO_FATAL_FAILURE(getChannelCount(&channelCount));
569     hidl_vec<uint32_t> volumes;
570     volumes.resize(channelCount);
571     for (uint32_t i = 0; i < channelCount; ++i) {
572         volumes[i] = 0;
573     }
574     Return<Result> ret = effect->volumeChangeNotification(volumes);
575     EXPECT_TRUE(ret.isOk());
576     EXPECT_NO_FATAL_FAILURE(checkResult(ret));
577 }
578 
TEST_P(AudioEffectHidlTest,SetAudioMode)579 TEST_P(AudioEffectHidlTest, SetAudioMode) {
580     description("Verify that SetAudioMode works for an effect");
581     Return<Result> ret = effect->setAudioMode(AudioMode::NORMAL);
582     EXPECT_TRUE(ret.isOk());
583     EXPECT_NO_FATAL_FAILURE(checkResult(ret));
584 }
585 
TEST_P(AudioEffectHidlTest,SetConfigReverse)586 TEST_P(AudioEffectHidlTest, SetConfigReverse) {
587     description("Verify that SetConfigReverse does not crash");
588     Return<Result> ret = effect->setConfigReverse(EffectConfig(), nullptr, nullptr);
589     EXPECT_TRUE(ret.isOk());
590     EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
591 }
592 
593 #if MAJOR_VERSION >= 7
TEST_P(AudioEffectHidlTest,SetInputDeviceInvalidDeviceAddress)594 TEST_P(AudioEffectHidlTest, SetInputDeviceInvalidDeviceAddress) {
595     description("Verify that invalid device address is rejected by SetInputDevice");
596     if (useAfterClose) {
597         GTEST_SKIP() << "Does not make sense for the useAfterClose case";
598     }
599     DeviceAddress device{.deviceType = "random_string"};
600     Return<Result> ret = effect->setInputDevice(device);
601     EXPECT_TRUE(ret.isOk());
602     EXPECT_TRUE(ret == Result::INVALID_ARGUMENTS || ret == Result::NOT_SUPPORTED)
603             << ::testing::PrintToString(ret);
604 }
605 #endif
606 
TEST_P(AudioEffectHidlTest,SetInputDevice)607 TEST_P(AudioEffectHidlTest, SetInputDevice) {
608     description("Verify that SetInputDevice does not crash");
609 #if MAJOR_VERSION <= 6
610     Return<Result> ret = effect->setInputDevice(mkEnumBitfield(AudioDevice::IN_BUILTIN_MIC));
611 #else
612     DeviceAddress device{.deviceType = toString(xsd::AudioDevice::AUDIO_DEVICE_IN_BUILTIN_MIC)};
613     Return<Result> ret = effect->setInputDevice(device);
614 #endif
615     EXPECT_TRUE(ret.isOk());
616     EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
617 }
618 
619 #if MAJOR_VERSION >= 7
TEST_P(AudioEffectHidlTest,SetInvalidAudioSource)620 TEST_P(AudioEffectHidlTest, SetInvalidAudioSource) {
621     description("Verify that an invalid audio source is rejected by SetAudioSource");
622     if (useAfterClose) {
623         GTEST_SKIP() << "Does not make sense for the useAfterClose case";
624     }
625     Return<Result> ret = effect->setAudioSource("random_string");
626     ASSERT_TRUE(ret.isOk());
627     EXPECT_TRUE(ret == Result::INVALID_ARGUMENTS || ret == Result::NOT_SUPPORTED)
628             << ::testing::PrintToString(ret);
629 }
630 #endif
631 
TEST_P(AudioEffectHidlTest,SetAudioSource)632 TEST_P(AudioEffectHidlTest, SetAudioSource) {
633     description("Verify that SetAudioSource does not crash");
634 #if MAJOR_VERSION <= 6
635     Return<Result> ret = effect->setAudioSource(AudioSource::MIC);
636 #else
637     Return<Result> ret = effect->setAudioSource(toString(xsd::AudioSource::AUDIO_SOURCE_MIC));
638 #endif
639     EXPECT_TRUE(ret.isOk());
640     EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
641 }
642 
TEST_P(AudioEffectHidlTest,Offload)643 TEST_P(AudioEffectHidlTest, Offload) {
644     description("Verify that calling Offload method does not crash");
645     Return<Result> ret = effect->offload(EffectOffloadParameter{});
646     EXPECT_TRUE(ret.isOk());
647     EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
648 }
649 
TEST_P(AudioEffectHidlTest,PrepareForProcessing)650 TEST_P(AudioEffectHidlTest, PrepareForProcessing) {
651     description("Verify that PrepareForProcessing method works for an effect");
652     Result retval = Result::NOT_INITIALIZED;
653     Return<void> ret = effect->prepareForProcessing(
654         [&](Result r, const MQDescriptorSync<Result>&) { retval = r; });
655     EXPECT_TRUE(ret.isOk());
656     EXPECT_NO_FATAL_FAILURE(checkResult(retval));
657 }
658 
TEST_P(AudioEffectHidlTest,SetProcessBuffers)659 TEST_P(AudioEffectHidlTest, SetProcessBuffers) {
660     description("Verify that SetProcessBuffers works for an effect");
661     sp<IAllocator> ashmem = IAllocator::getService("ashmem");
662     ASSERT_NE(nullptr, ashmem.get());
663     bool success = false;
664     AudioBuffer buffer;
665     Return<void> ret = ashmem->allocate(1024, [&](bool s, const hidl_memory& memory) {
666         success = s;
667         if (s) {
668             buffer.data = memory;
669         }
670     });
671     ASSERT_TRUE(ret.isOk());
672     ASSERT_TRUE(success);
673     Return<Result> ret2 = effect->setProcessBuffers(buffer, buffer);
674     EXPECT_TRUE(ret2.isOk());
675     EXPECT_NO_FATAL_FAILURE(checkResult(ret2));
676 }
677 
TEST_P(AudioEffectHidlTest,Command)678 TEST_P(AudioEffectHidlTest, Command) {
679     description("Verify that Command does not crash");
680     Return<void> ret =
681         effect->command(0, hidl_vec<uint8_t>(), 0, [&](int32_t, const hidl_vec<uint8_t>&) {});
682     EXPECT_TRUE(ret.isOk());
683 }
684 
TEST_P(AudioEffectHidlTest,SetParameter)685 TEST_P(AudioEffectHidlTest, SetParameter) {
686     description("Verify that SetParameter does not crash");
687     Return<Result> ret = effect->setParameter(hidl_vec<uint8_t>(), hidl_vec<uint8_t>());
688     EXPECT_TRUE(ret.isOk());
689     EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
690 }
691 
TEST_P(AudioEffectHidlTest,GetParameter)692 TEST_P(AudioEffectHidlTest, GetParameter) {
693     description("Verify that GetParameter does not crash");
694     Return<void> ret =
695         effect->getParameter(hidl_vec<uint8_t>(), 0, [&](Result, const hidl_vec<uint8_t>&) {});
696     EXPECT_TRUE(ret.isOk());
697 }
698 
TEST_P(AudioEffectHidlTest,GetParameterInvalidMaxReplySize)699 TEST_P(AudioEffectHidlTest, GetParameterInvalidMaxReplySize) {
700     description("Verify that GetParameter caps the maximum reply size");
701     const bool isNewDeviceLaunchingOnTPlus = property_get_int32("ro.vendor.api_level", 0) >= 33;
702     if (!isNewDeviceLaunchingOnTPlus) {
703         GTEST_SKIP() << "The test only applies to devices launching on T or later";
704     }
705     if (useAfterClose) {
706         GTEST_SKIP() << "Does not make sense for the useAfterClose case";
707     }
708     // Use a non-empty parameter to avoid being rejected by any earlier checks.
709     hidl_vec<uint8_t> parameter;
710     parameter.resize(16);
711     // Use very large size to ensure that the service does not crash. Since parameters
712     // are specific to each effect, and some effects may not have parameters at all,
713     // simply checking the return value would not reveal an issue of using an uncapped value.
714     const uint32_t veryLargeReplySize = std::numeric_limits<uint32_t>::max() - 100;
715     Result retval = Result::OK;
716     Return<void> ret =
717             effect->getParameter(parameter, veryLargeReplySize,
718                                  [&](Result r, const hidl_vec<uint8_t>&) { retval = r; });
719     EXPECT_TRUE(ret.isOk());
720     EXPECT_EQ(Result::INVALID_ARGUMENTS, retval);
721 }
722 
TEST_P(AudioEffectHidlTest,GetSupportedConfigsForFeature)723 TEST_P(AudioEffectHidlTest, GetSupportedConfigsForFeature) {
724     description("Verify that GetSupportedConfigsForFeature does not crash");
725     Result retval = Result::OK;
726     Return<void> ret = effect->getSupportedConfigsForFeature(
727             0, 0, 0, [&](Result r, uint32_t, const hidl_vec<uint8_t>&) { retval = r; });
728     EXPECT_TRUE(ret.isOk());
729     EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(retval));
730 }
731 
TEST_P(AudioEffectHidlTest,GetCurrentConfigForFeature)732 TEST_P(AudioEffectHidlTest, GetCurrentConfigForFeature) {
733     description("Verify that GetCurrentConfigForFeature does not crash");
734     Result retval = Result::OK;
735     Return<void> ret = effect->getCurrentConfigForFeature(
736             0, 0, [&](Result r, const hidl_vec<uint8_t>&) { retval = r; });
737     EXPECT_TRUE(ret.isOk());
738     EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(retval));
739 }
740 
TEST_P(AudioEffectHidlTest,SetCurrentConfigForFeature)741 TEST_P(AudioEffectHidlTest, SetCurrentConfigForFeature) {
742     description("Verify that SetCurrentConfigForFeature does not crash");
743     Return<Result> ret = effect->setCurrentConfigForFeature(0, hidl_vec<uint8_t>());
744     EXPECT_TRUE(ret.isOk());
745 }
746 
TEST_P(AudioEffectHidlTest,GetSupportedConfigsForFeatureInvalidConfigSize)747 TEST_P(AudioEffectHidlTest, GetSupportedConfigsForFeatureInvalidConfigSize) {
748     description("Verify that GetSupportedConfigsForFeature caps the maximum config size");
749     const bool isNewDeviceLaunchingOnTPlus = property_get_int32("ro.vendor.api_level", 0) >= 33;
750     if (!isNewDeviceLaunchingOnTPlus) {
751         GTEST_SKIP() << "The test only applies to devices launching on T or later";
752     }
753     if (useAfterClose) {
754         GTEST_SKIP() << "Does not make sense for the useAfterClose case";
755     }
756     // Use very large size to ensure that the service does not crash.
757     const uint32_t veryLargeConfigSize = std::numeric_limits<uint32_t>::max() - 100;
758     Result retval = Result::OK;
759     Return<void> ret = effect->getSupportedConfigsForFeature(
760             0, 1, veryLargeConfigSize,
761             [&](Result r, uint32_t, const hidl_vec<uint8_t>&) { retval = r; });
762     EXPECT_TRUE(ret.isOk());
763     EXPECT_EQ(Result::INVALID_ARGUMENTS, retval);
764 }
765 
TEST_P(AudioEffectHidlTest,GetCurrentConfigForFeatureInvalidConfigSize)766 TEST_P(AudioEffectHidlTest, GetCurrentConfigForFeatureInvalidConfigSize) {
767     description("Verify that GetCurrentConfigForFeature caps the maximum config size");
768     const bool isNewDeviceLaunchingOnTPlus = property_get_int32("ro.vendor.api_level", 0) >= 33;
769     if (!isNewDeviceLaunchingOnTPlus) {
770         GTEST_SKIP() << "The test only applies to devices launching on T or later";
771     }
772     if (useAfterClose) {
773         GTEST_SKIP() << "Does not make sense for the useAfterClose case";
774     }
775     // Use very large size to ensure that the service does not crash.
776     const uint32_t veryLargeConfigSize = std::numeric_limits<uint32_t>::max() - 100;
777     Result retval = Result::OK;
778     Return<void> ret = effect->getCurrentConfigForFeature(
779             0, veryLargeConfigSize, [&](Result r, const hidl_vec<uint8_t>&) { retval = r; });
780     EXPECT_TRUE(ret.isOk());
781     EXPECT_EQ(Result::INVALID_ARGUMENTS, retval);
782 }
783 
784 // The main test class for Equalizer Audio Effect HIDL HAL.
785 class EqualizerAudioEffectHidlTest : public AudioEffectHidlTest {
786   public:
SetUp()787     void SetUp() override {
788         AudioEffectHidlTest::SetUp();
789         equalizer = IEqualizerEffect::castFrom(effect);
790         ASSERT_NE(nullptr, equalizer.get());
791     }
792 
TearDown()793     void TearDown() override {
794         equalizer.clear();
795         AudioEffectHidlTest::TearDown();
796     }
797 
798   protected:
799     void getNumBands(uint16_t* numBands);
800     void getLevelRange(int16_t* minLevel, int16_t* maxLevel);
801     void getBandFrequencyRange(uint16_t band, uint32_t* minFreq, uint32_t* centerFreq,
802                                uint32_t* maxFreq);
803     void getPresetCount(size_t* count);
804 
805     sp<IEqualizerEffect> equalizer;
806 };
807 
getNumBands(uint16_t * numBands)808 void EqualizerAudioEffectHidlTest::getNumBands(uint16_t* numBands) {
809     Result retval = Result::NOT_INITIALIZED;
810     Return<void> ret = equalizer->getNumBands([&](Result r, uint16_t b) {
811         retval = r;
812         if (retval == Result::OK) {
813             *numBands = b;
814         }
815     });
816     ASSERT_TRUE(ret.isOk());
817     ASSERT_NO_FATAL_FAILURE(checkResult(retval));
818     if (useAfterClose) *numBands = 1;
819 }
820 
getLevelRange(int16_t * minLevel,int16_t * maxLevel)821 void EqualizerAudioEffectHidlTest::getLevelRange(int16_t* minLevel, int16_t* maxLevel) {
822     Result retval = Result::NOT_INITIALIZED;
823     Return<void> ret = equalizer->getLevelRange([&](Result r, int16_t min, int16_t max) {
824         retval = r;
825         if (retval == Result::OK) {
826             *minLevel = min;
827             *maxLevel = max;
828         }
829     });
830     ASSERT_TRUE(ret.isOk());
831     ASSERT_NO_FATAL_FAILURE(checkResult(retval));
832     if (useAfterClose) {
833         *minLevel = 0;
834         *maxLevel = 255;
835     }
836 }
837 
getBandFrequencyRange(uint16_t band,uint32_t * minFreq,uint32_t * centerFreq,uint32_t * maxFreq)838 void EqualizerAudioEffectHidlTest::getBandFrequencyRange(uint16_t band, uint32_t* minFreq,
839                                                          uint32_t* centerFreq, uint32_t* maxFreq) {
840     Result retval = Result::NOT_INITIALIZED;
841     Return<void> ret =
842         equalizer->getBandFrequencyRange(band, [&](Result r, uint32_t min, uint32_t max) {
843             retval = r;
844             if (retval == Result::OK) {
845                 *minFreq = min;
846                 *maxFreq = max;
847             }
848         });
849     ASSERT_TRUE(ret.isOk());
850     ASSERT_NO_FATAL_FAILURE(checkResult(retval));
851     ret = equalizer->getBandCenterFrequency(band, [&](Result r, uint32_t center) {
852         retval = r;
853         if (retval == Result::OK) {
854             *centerFreq = center;
855         }
856     });
857     ASSERT_TRUE(ret.isOk());
858     ASSERT_NO_FATAL_FAILURE(checkResult(retval));
859     if (useAfterClose) {
860         *minFreq = 20;
861         *centerFreq = 10000;
862         *maxFreq = 20000;
863     }
864 }
865 
getPresetCount(size_t * count)866 void EqualizerAudioEffectHidlTest::getPresetCount(size_t* count) {
867     Result retval = Result::NOT_INITIALIZED;
868     Return<void> ret = equalizer->getPresetNames([&](Result r, const hidl_vec<hidl_string>& names) {
869         retval = r;
870         if (retval == Result::OK) {
871             *count = names.size();
872         }
873     });
874     ASSERT_TRUE(ret.isOk());
875     ASSERT_NO_FATAL_FAILURE(checkResult(retval));
876     if (useAfterClose) *count = 1;
877 }
878 
TEST_P(EqualizerAudioEffectHidlTest,GetNumBands)879 TEST_P(EqualizerAudioEffectHidlTest, GetNumBands) {
880     description("Verify that Equalizer effect reports at least one band");
881     uint16_t numBands = 0;
882     ASSERT_NO_FATAL_FAILURE(getNumBands(&numBands));
883     EXPECT_GT(numBands, 0);
884 }
885 
TEST_P(EqualizerAudioEffectHidlTest,GetLevelRange)886 TEST_P(EqualizerAudioEffectHidlTest, GetLevelRange) {
887     description("Verify that Equalizer effect reports adequate band level range");
888     int16_t minLevel = 0x7fff, maxLevel = 0;
889     ASSERT_NO_FATAL_FAILURE(getLevelRange(&minLevel, &maxLevel));
890     EXPECT_GT(maxLevel, minLevel);
891 }
892 
TEST_P(EqualizerAudioEffectHidlTest,GetSetBandLevel)893 TEST_P(EqualizerAudioEffectHidlTest, GetSetBandLevel) {
894     description("Verify that manipulating band levels works for Equalizer effect");
895     uint16_t numBands = 0;
896     ASSERT_NO_FATAL_FAILURE(getNumBands(&numBands));
897     ASSERT_GT(numBands, 0);
898     int16_t levels[3]{0x7fff, 0, 0};
899     ASSERT_NO_FATAL_FAILURE(getLevelRange(&levels[0], &levels[2]));
900     ASSERT_GT(levels[2], levels[0]);
901     levels[1] = (levels[2] + levels[0]) / 2;
902     for (uint16_t i = 0; i < numBands; ++i) {
903         for (size_t j = 0; j < ARRAY_SIZE(levels); ++j) {
904             Return<Result> ret = equalizer->setBandLevel(i, levels[j]);
905             EXPECT_TRUE(ret.isOk());
906             EXPECT_NO_FATAL_FAILURE(checkResult(ret));
907             Result retval = Result::NOT_INITIALIZED;
908             int16_t actualLevel;
909             Return<void> ret2 = equalizer->getBandLevel(i, [&](Result r, int16_t l) {
910                 retval = r;
911                 if (retval == Result::OK) {
912                     actualLevel = l;
913                 }
914             });
915             EXPECT_TRUE(ret2.isOk());
916             EXPECT_NO_FATAL_FAILURE(checkResult(retval));
917             if (!useAfterClose) {
918                 EXPECT_EQ(levels[j], actualLevel);
919             }
920         }
921     }
922 }
923 
TEST_P(EqualizerAudioEffectHidlTest,GetBandCenterFrequencyAndRange)924 TEST_P(EqualizerAudioEffectHidlTest, GetBandCenterFrequencyAndRange) {
925     description("Verify that Equalizer effect reports adequate band frequency range");
926     uint16_t numBands = 0;
927     ASSERT_NO_FATAL_FAILURE(getNumBands(&numBands));
928     ASSERT_GT(numBands, 0);
929     for (uint16_t i = 0; i < numBands; ++i) {
930         uint32_t minFreq = 0xffffffff, centerFreq = 0xffffffff, maxFreq = 0xffffffff;
931         ASSERT_NO_FATAL_FAILURE(getBandFrequencyRange(i, &minFreq, &centerFreq, &maxFreq));
932         // Note: NXP legacy implementation reports "1" as upper bound for last band,
933         // so this check fails.
934         EXPECT_GE(maxFreq, centerFreq);
935         EXPECT_GE(centerFreq, minFreq);
936     }
937 }
938 
TEST_P(EqualizerAudioEffectHidlTest,GetBandForFrequency)939 TEST_P(EqualizerAudioEffectHidlTest, GetBandForFrequency) {
940     description("Verify that Equalizer effect supports GetBandForFrequency correctly");
941     uint16_t numBands = 0;
942     ASSERT_NO_FATAL_FAILURE(getNumBands(&numBands));
943     ASSERT_GT(numBands, 0);
944     for (uint16_t i = 0; i < numBands; ++i) {
945         uint32_t freqs[3]{0, 0, 0};
946         getBandFrequencyRange(i, &freqs[0], &freqs[1], &freqs[2]);
947         // NXP legacy implementation reports "1" as upper bound for last band, some
948         // of the checks fail.
949         for (size_t j = 0; j < ARRAY_SIZE(freqs); ++j) {
950             if (j == 0) {
951                 freqs[j]++;
952             }  // Min frequency is an open interval.
953             Result retval = Result::NOT_INITIALIZED;
954             uint16_t actualBand = numBands + 1;
955             Return<void> ret = equalizer->getBandForFrequency(freqs[j], [&](Result r, uint16_t b) {
956                 retval = r;
957                 if (retval == Result::OK) {
958                     actualBand = b;
959                 }
960             });
961             EXPECT_TRUE(ret.isOk());
962             EXPECT_NO_FATAL_FAILURE(checkResult(retval));
963             if (!useAfterClose) {
964                 EXPECT_EQ(i, actualBand) << "Frequency: " << freqs[j];
965             }
966         }
967     }
968 }
969 
TEST_P(EqualizerAudioEffectHidlTest,GetPresetNames)970 TEST_P(EqualizerAudioEffectHidlTest, GetPresetNames) {
971     description("Verify that Equalizer effect reports at least one preset");
972     size_t presetCount;
973     ASSERT_NO_FATAL_FAILURE(getPresetCount(&presetCount));
974     EXPECT_GT(presetCount, 0u);
975 }
976 
TEST_P(EqualizerAudioEffectHidlTest,GetSetCurrentPreset)977 TEST_P(EqualizerAudioEffectHidlTest, GetSetCurrentPreset) {
978     description("Verify that manipulating the current preset for Equalizer effect");
979     size_t presetCount;
980     ASSERT_NO_FATAL_FAILURE(getPresetCount(&presetCount));
981     ASSERT_GT(presetCount, 0u);
982     for (uint16_t i = 0; i < presetCount; ++i) {
983         Return<Result> ret = equalizer->setCurrentPreset(i);
984         EXPECT_TRUE(ret.isOk());
985         EXPECT_NO_FATAL_FAILURE(checkResult(ret));
986         Result retval = Result::NOT_INITIALIZED;
987         uint16_t actualPreset = 0xffff;
988         Return<void> ret2 = equalizer->getCurrentPreset([&](Result r, uint16_t p) {
989             retval = r;
990             if (retval == Result::OK) {
991                 actualPreset = p;
992             }
993         });
994         EXPECT_TRUE(ret2.isOk());
995         EXPECT_NO_FATAL_FAILURE(checkResult(retval));
996         if (!useAfterClose) {
997             EXPECT_EQ(i, actualPreset);
998         }
999     }
1000 }
1001 
TEST_P(EqualizerAudioEffectHidlTest,GetSetAllProperties)1002 TEST_P(EqualizerAudioEffectHidlTest, GetSetAllProperties) {
1003     description(
1004         "Verify that setting band levels and presets works via Get / "
1005         "SetAllProperties for Equalizer effect");
1006     using AllProperties =
1007         ::android::hardware::audio::effect::CPP_VERSION::IEqualizerEffect::AllProperties;
1008     uint16_t numBands = 0;
1009     ASSERT_NO_FATAL_FAILURE(getNumBands(&numBands));
1010     ASSERT_GT(numBands, 0);
1011     AllProperties props;
1012     props.bandLevels.resize(numBands);
1013     for (size_t i = 0; i < numBands; ++i) {
1014         props.bandLevels[i] = 0;
1015     }
1016 
1017     AllProperties actualProps;
1018     Result retval = Result::NOT_INITIALIZED;
1019 
1020     // Verify setting of the band levels via properties.
1021     props.curPreset = -1;
1022     Return<Result> ret = equalizer->setAllProperties(props);
1023     EXPECT_TRUE(ret.isOk());
1024     EXPECT_NO_FATAL_FAILURE(checkResult(ret));
1025     Return<void> ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
1026         retval = r;
1027         if (retval == Result::OK) {
1028             actualProps = p;
1029         }
1030     });
1031     EXPECT_TRUE(ret2.isOk());
1032     EXPECT_NO_FATAL_FAILURE(checkResult(retval));
1033     if (!useAfterClose) {
1034         EXPECT_EQ(props.bandLevels, actualProps.bandLevels);
1035     }
1036 
1037     // Verify setting of the current preset via properties.
1038     props.curPreset = 0;  // Assuming there is at least one preset.
1039     ret = equalizer->setAllProperties(props);
1040     EXPECT_TRUE(ret.isOk());
1041     EXPECT_NO_FATAL_FAILURE(checkResult(ret));
1042     ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
1043         retval = r;
1044         if (retval == Result::OK) {
1045             actualProps = p;
1046         }
1047     });
1048     EXPECT_TRUE(ret2.isOk());
1049     EXPECT_NO_FATAL_FAILURE(checkResult(retval));
1050     if (!useAfterClose) {
1051         EXPECT_EQ(props.curPreset, actualProps.curPreset);
1052     }
1053 }
1054 
1055 // The main test class for Equalizer Audio Effect HIDL HAL.
1056 class LoudnessEnhancerAudioEffectHidlTest : public AudioEffectHidlTest {
1057   public:
SetUp()1058     void SetUp() override {
1059         AudioEffectHidlTest::SetUp();
1060         enhancer = ILoudnessEnhancerEffect::castFrom(effect);
1061         ASSERT_NE(nullptr, enhancer.get());
1062     }
1063 
TearDown()1064     void TearDown() override {
1065         enhancer.clear();
1066         AudioEffectHidlTest::TearDown();
1067     }
1068 
1069   protected:
1070     sp<ILoudnessEnhancerEffect> enhancer;
1071 };
1072 
TEST_P(LoudnessEnhancerAudioEffectHidlTest,GetSetTargetGain)1073 TEST_P(LoudnessEnhancerAudioEffectHidlTest, GetSetTargetGain) {
1074     description(
1075         "Verify that manipulating the target gain works for Loudness Enhancer "
1076         "effect");
1077     const int32_t gain = 100;
1078     Return<Result> ret = enhancer->setTargetGain(gain);
1079     EXPECT_TRUE(ret.isOk());
1080     EXPECT_NO_FATAL_FAILURE(checkResult(ret));
1081     int32_t actualGain = 0;
1082     Result retval;
1083     Return<void> ret2 = enhancer->getTargetGain([&](Result r, int32_t g) {
1084         retval = r;
1085         if (retval == Result::OK) {
1086             actualGain = g;
1087         }
1088     });
1089     EXPECT_TRUE(ret2.isOk());
1090     EXPECT_NO_FATAL_FAILURE(checkResult(retval));
1091     if (!useAfterClose) {
1092         EXPECT_EQ(gain, actualGain);
1093     }
1094 }
1095 
1096 INSTANTIATE_TEST_SUITE_P(EffectsFactory, AudioEffectsFactoryHidlTest,
1097                          ::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
1098                                  IEffectsFactory::descriptor)),
1099                          ::android::hardware::PrintInstanceNameToString);
1100 INSTANTIATE_TEST_SUITE_P(
1101         Equalizer_IEffect, AudioEffectHidlTest,
1102         ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
1103                                    IEffectsFactory::descriptor)),
1104                            ::testing::Values(EQUALIZER_EFFECT_TYPE),
1105                            ::testing::Values(false, true) /*useAfterClose*/),
1106         EffectParameterToString);
1107 INSTANTIATE_TEST_SUITE_P(
1108         LoudnessEnhancer_IEffect, AudioEffectHidlTest,
1109         ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
1110                                    IEffectsFactory::descriptor)),
1111                            ::testing::Values(LOUDNESS_ENHANCER_EFFECT_TYPE),
1112                            ::testing::Values(false, true) /*useAfterClose*/),
1113         EffectParameterToString);
1114 INSTANTIATE_TEST_SUITE_P(
1115         Equalizer, EqualizerAudioEffectHidlTest,
1116         ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
1117                                    IEffectsFactory::descriptor)),
1118                            ::testing::Values(EQUALIZER_EFFECT_TYPE),
1119                            ::testing::Values(false, true) /*useAfterClose*/),
1120         EffectParameterToString);
1121 INSTANTIATE_TEST_SUITE_P(
1122         LoudnessEnhancer, LoudnessEnhancerAudioEffectHidlTest,
1123         ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
1124                                    IEffectsFactory::descriptor)),
1125                            ::testing::Values(LOUDNESS_ENHANCER_EFFECT_TYPE),
1126                            ::testing::Values(false, true) /*useAfterClose*/),
1127         EffectParameterToString);
1128 // When the VTS test runs on a device lacking the corresponding HAL version the parameter
1129 // list is empty, this isn't a problem.
1130 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffectsFactoryHidlTest);
1131 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffectHidlTest);
1132 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EqualizerAudioEffectHidlTest);
1133 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(LoudnessEnhancerAudioEffectHidlTest);
1134