blob: 078e420acb7e7f0336a1d21502a1a228430f640c [file] [log] [blame]
Mikhail Naganovbf393172016-11-11 16:24:50 -08001/*
Mikhail Naganov9f289042017-02-23 08:39:36 -08002 * Copyright (C) 2017 The Android Open Source Project
Mikhail Naganovbf393172016-11-11 16:24:50 -08003 *
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#define LOG_TAG "AudioEffectHidlHalTest"
18#include <android-base/logging.h>
Mikhail Naganov9f289042017-02-23 08:39:36 -080019#include <system/audio.h>
Mikhail Naganovbf393172016-11-11 16:24:50 -080020
Mikhail Naganov9f289042017-02-23 08:39:36 -080021#include <android/hardware/audio/effect/2.0/IEffect.h>
Mikhail Naganovbf393172016-11-11 16:24:50 -080022#include <android/hardware/audio/effect/2.0/IEffectsFactory.h>
Mikhail Naganov9f289042017-02-23 08:39:36 -080023#include <android/hardware/audio/effect/2.0/IEqualizerEffect.h>
24#include <android/hardware/audio/effect/2.0/ILoudnessEnhancerEffect.h>
Mikhail Naganovbf393172016-11-11 16:24:50 -080025#include <android/hardware/audio/effect/2.0/types.h>
Mikhail Naganov9f289042017-02-23 08:39:36 -080026#include <android/hidl/allocator/1.0/IAllocator.h>
27#include <android/hidl/memory/1.0/IMemory.h>
Mikhail Naganovbf393172016-11-11 16:24:50 -080028
Kevin Rocardf5305b32018-11-13 10:41:53 -080029#include <common/all-versions/VersionUtils.h>
30
Yuexi Maed2bb4e2017-03-10 00:44:45 -080031#include <VtsHalHidlTargetTestBase.h>
Zhuoyao Zhang7dc6ce82018-02-08 12:44:27 -080032#include <VtsHalHidlTargetTestEnvBase.h>
Mikhail Naganovbf393172016-11-11 16:24:50 -080033
Kevin Rocard55b10612018-11-12 12:33:16 -080034using android::sp;
35using android::hardware::hidl_handle;
36using android::hardware::hidl_memory;
37using android::hardware::hidl_string;
38using android::hardware::hidl_vec;
39using android::hardware::MQDescriptorSync;
40using android::hardware::Return;
41using android::hardware::Void;
Kevin Rocardf5305b32018-11-13 10:41:53 -080042using android::hardware::audio::common::utils::mkEnumBitfield;
Mikhail Naganov9f289042017-02-23 08:39:36 -080043using android::hardware::audio::common::V2_0::AudioDevice;
44using android::hardware::audio::common::V2_0::AudioHandleConsts;
45using android::hardware::audio::common::V2_0::AudioMode;
Mikhail Naganov05fa0d02017-03-24 17:06:25 -070046using android::hardware::audio::common::V2_0::AudioSource;
Mikhail Naganov9f289042017-02-23 08:39:36 -080047using android::hardware::audio::common::V2_0::Uuid;
48using android::hardware::audio::effect::V2_0::AudioBuffer;
Mikhail Naganov05fa0d02017-03-24 17:06:25 -070049using android::hardware::audio::effect::V2_0::EffectAuxChannelsConfig;
Mikhail Naganov9f289042017-02-23 08:39:36 -080050using android::hardware::audio::effect::V2_0::EffectBufferConfig;
51using android::hardware::audio::effect::V2_0::EffectConfig;
52using android::hardware::audio::effect::V2_0::EffectDescriptor;
53using android::hardware::audio::effect::V2_0::EffectOffloadParameter;
54using android::hardware::audio::effect::V2_0::IEffect;
55using android::hardware::audio::effect::V2_0::IEffectsFactory;
56using android::hardware::audio::effect::V2_0::IEqualizerEffect;
57using android::hardware::audio::effect::V2_0::ILoudnessEnhancerEffect;
58using android::hardware::audio::effect::V2_0::Result;
Mikhail Naganov9f289042017-02-23 08:39:36 -080059using android::hidl::allocator::V1_0::IAllocator;
60using android::hidl::memory::V1_0::IMemory;
Mikhail Naganovbf393172016-11-11 16:24:50 -080061
Mikhail Naganov9f289042017-02-23 08:39:36 -080062#ifndef ARRAY_SIZE
63#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a)))
64#endif
65
Zhuoyao Zhang7dc6ce82018-02-08 12:44:27 -080066// Test environment for Audio Effects Factory HIDL HAL.
67class AudioEffectsFactoryHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase {
68 public:
69 // get the test environment singleton
70 static AudioEffectsFactoryHidlEnvironment* Instance() {
71 static AudioEffectsFactoryHidlEnvironment* instance =
72 new AudioEffectsFactoryHidlEnvironment;
73 return instance;
74 }
75
76 virtual void registerTestServices() override { registerTestService<IEffectsFactory>(); }
77};
78
Mikhail Naganov9f289042017-02-23 08:39:36 -080079// The main test class for Audio Effects Factory HIDL HAL.
80class AudioEffectsFactoryHidlTest : public ::testing::VtsHalHidlTargetTestBase {
Kevin Rocard55b10612018-11-12 12:33:16 -080081 public:
82 void SetUp() override {
83 effectsFactory = ::testing::VtsHalHidlTargetTestBase::getService<IEffectsFactory>(
84 AudioEffectsFactoryHidlEnvironment::Instance()->getServiceName<IEffectsFactory>());
85 ASSERT_NE(effectsFactory, nullptr);
86 }
Mikhail Naganovbf393172016-11-11 16:24:50 -080087
Kevin Rocard55b10612018-11-12 12:33:16 -080088 void TearDown() override { effectsFactory.clear(); }
Mikhail Naganov9f289042017-02-23 08:39:36 -080089
Kevin Rocard55b10612018-11-12 12:33:16 -080090 protected:
91 static void description(const std::string& description) {
92 RecordProperty("description", description);
93 }
Mikhail Naganovbf393172016-11-11 16:24:50 -080094
Kevin Rocard55b10612018-11-12 12:33:16 -080095 sp<IEffectsFactory> effectsFactory;
Mikhail Naganovbf393172016-11-11 16:24:50 -080096};
97
Mikhail Naganov9f289042017-02-23 08:39:36 -080098TEST_F(AudioEffectsFactoryHidlTest, EnumerateEffects) {
Kevin Rocard55b10612018-11-12 12:33:16 -080099 description("Verify that EnumerateEffects returns at least one effect");
100 Result retval = Result::NOT_INITIALIZED;
101 size_t effectCount = 0;
102 Return<void> ret =
103 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
104 retval = r;
105 effectCount = result.size();
106 });
107 EXPECT_TRUE(ret.isOk());
108 EXPECT_EQ(Result::OK, retval);
109 EXPECT_GT(effectCount, 0u);
Mikhail Naganovbf393172016-11-11 16:24:50 -0800110}
111
Mikhail Naganov9f289042017-02-23 08:39:36 -0800112TEST_F(AudioEffectsFactoryHidlTest, CreateEffect) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800113 description("Verify that an effect can be created via CreateEffect");
114 bool gotEffect = false;
115 Uuid effectUuid;
116 Return<void> ret =
117 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
118 if (r == Result::OK && result.size() > 0) {
119 gotEffect = true;
120 effectUuid = result[0].uuid;
121 }
122 });
123 ASSERT_TRUE(ret.isOk());
124 ASSERT_TRUE(gotEffect);
125 Result retval = Result::NOT_INITIALIZED;
126 sp<IEffect> effect;
127 ret = effectsFactory->createEffect(
128 effectUuid, 1 /*session*/, 1 /*ioHandle*/,
129 [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) {
130 retval = r;
131 if (r == Result::OK) {
132 effect = result;
133 }
134 });
135 EXPECT_TRUE(ret.isOk());
136 EXPECT_EQ(Result::OK, retval);
137 EXPECT_NE(nullptr, effect.get());
Mikhail Naganovbf393172016-11-11 16:24:50 -0800138}
139
Mikhail Naganov9f289042017-02-23 08:39:36 -0800140TEST_F(AudioEffectsFactoryHidlTest, GetDescriptor) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800141 description(
142 "Verify that effects factory can provide an effect descriptor via "
143 "GetDescriptor");
144 hidl_vec<EffectDescriptor> allDescriptors;
145 Return<void> ret =
146 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
147 if (r == Result::OK) {
148 allDescriptors = result;
149 }
Mikhail Naganovbf393172016-11-11 16:24:50 -0800150 });
Kevin Rocard55b10612018-11-12 12:33:16 -0800151 ASSERT_TRUE(ret.isOk());
152 ASSERT_GT(allDescriptors.size(), 0u);
153 for (size_t i = 0; i < allDescriptors.size(); ++i) {
154 ret = effectsFactory->getDescriptor(allDescriptors[i].uuid,
155 [&](Result r, const EffectDescriptor& result) {
156 EXPECT_EQ(r, Result::OK);
157 EXPECT_EQ(result, allDescriptors[i]);
158 });
159 }
160 EXPECT_TRUE(ret.isOk());
Mikhail Naganovbf393172016-11-11 16:24:50 -0800161}
162
Mikhail Naganov3e6fe752017-04-24 10:44:08 -0700163TEST_F(AudioEffectsFactoryHidlTest, DebugDumpInvalidArgument) {
164 description("Verify that debugDump doesn't crash on invalid arguments");
165 Return<void> ret = effectsFactory->debugDump(hidl_handle());
166 ASSERT_TRUE(ret.isOk());
167}
168
Mikhail Naganov9f289042017-02-23 08:39:36 -0800169// Equalizer effect is required by CDD, but only the type is fixed.
170// This is the same UUID as AudioEffect.EFFECT_TYPE_EQUALIZER in Java.
171static const Uuid EQUALIZER_EFFECT_TYPE = {
172 0x0bed4300, 0xddd6, 0x11db, 0x8f34,
173 std::array<uint8_t, 6>{{0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}};
174// Loudness Enhancer effect is required by CDD, but only the type is fixed.
175// This is the same UUID as AudioEffect.EFFECT_TYPE_LOUDNESS_ENHANCER in Java.
176static const Uuid LOUDNESS_ENHANCER_EFFECT_TYPE = {
177 0xfe3199be, 0xaed0, 0x413f, 0x87bb,
178 std::array<uint8_t, 6>{{0x11, 0x26, 0x0e, 0xb6, 0x3c, 0xf1}}};
179
180// The main test class for Audio Effect HIDL HAL.
181class AudioEffectHidlTest : public ::testing::VtsHalHidlTargetTestBase {
Kevin Rocard55b10612018-11-12 12:33:16 -0800182 public:
183 void SetUp() override {
184 effectsFactory = ::testing::VtsHalHidlTargetTestBase::getService<IEffectsFactory>();
185 ASSERT_NE(nullptr, effectsFactory.get());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800186
Kevin Rocard55b10612018-11-12 12:33:16 -0800187 findAndCreateEffect(getEffectType());
188 ASSERT_NE(nullptr, effect.get());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800189
Kevin Rocard55b10612018-11-12 12:33:16 -0800190 Return<Result> ret = effect->init();
191 ASSERT_TRUE(ret.isOk());
192 ASSERT_EQ(Result::OK, ret);
193 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800194
Kevin Rocard55b10612018-11-12 12:33:16 -0800195 void TearDown() override {
196 effect.clear();
197 effectsFactory.clear();
198 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800199
Kevin Rocard55b10612018-11-12 12:33:16 -0800200 protected:
201 static void description(const std::string& description) {
202 RecordProperty("description", description);
203 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800204
Kevin Rocard55b10612018-11-12 12:33:16 -0800205 virtual Uuid getEffectType() { return EQUALIZER_EFFECT_TYPE; }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800206
Kevin Rocard55b10612018-11-12 12:33:16 -0800207 void findAndCreateEffect(const Uuid& type);
208 void findEffectInstance(const Uuid& type, Uuid* uuid);
209 void getChannelCount(uint32_t* channelCount);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800210
Kevin Rocard55b10612018-11-12 12:33:16 -0800211 sp<IEffectsFactory> effectsFactory;
212 sp<IEffect> effect;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800213};
214
215void AudioEffectHidlTest::findAndCreateEffect(const Uuid& type) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800216 Uuid effectUuid;
217 findEffectInstance(type, &effectUuid);
218 Return<void> ret = effectsFactory->createEffect(
219 effectUuid, 1 /*session*/, 1 /*ioHandle*/,
220 [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) {
221 if (r == Result::OK) {
222 effect = result;
223 }
224 });
225 ASSERT_TRUE(ret.isOk());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800226}
227
228void AudioEffectHidlTest::findEffectInstance(const Uuid& type, Uuid* uuid) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800229 bool effectFound = false;
230 Return<void> ret =
231 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
232 if (r == Result::OK) {
233 for (const auto& desc : result) {
234 if (desc.type == type) {
235 effectFound = true;
236 *uuid = desc.uuid;
237 break;
238 }
239 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800240 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800241 });
242 ASSERT_TRUE(ret.isOk());
243 ASSERT_TRUE(effectFound);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800244}
245
246void AudioEffectHidlTest::getChannelCount(uint32_t* channelCount) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800247 Result retval;
248 EffectConfig currentConfig;
249 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
250 retval = r;
251 if (r == Result::OK) {
252 currentConfig = conf;
253 }
254 });
255 ASSERT_TRUE(ret.isOk());
256 ASSERT_EQ(Result::OK, retval);
257 ASSERT_TRUE(audio_channel_mask_is_valid(
258 static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels)));
259 *channelCount = audio_channel_count_from_out_mask(
260 static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels));
Mikhail Naganov9f289042017-02-23 08:39:36 -0800261}
262
263TEST_F(AudioEffectHidlTest, Close) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800264 description("Verify that an effect can be closed");
265 Return<Result> ret = effect->close();
266 EXPECT_TRUE(ret.isOk());
267 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800268}
269
270TEST_F(AudioEffectHidlTest, GetDescriptor) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800271 description("Verify that an effect can return its own descriptor via GetDescriptor");
272 Result retval = Result::NOT_INITIALIZED;
273 Uuid actualType;
274 Return<void> ret = effect->getDescriptor([&](Result r, const EffectDescriptor& desc) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800275 retval = r;
276 if (r == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800277 actualType = desc.type;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800278 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800279 });
280 EXPECT_TRUE(ret.isOk());
281 EXPECT_EQ(Result::OK, retval);
282 EXPECT_EQ(getEffectType(), actualType);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800283}
284
285TEST_F(AudioEffectHidlTest, GetSetConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800286 description(
287 "Verify that it is possible to manipulate effect config via Get / "
288 "SetConfig");
289 Result retval = Result::NOT_INITIALIZED;
290 EffectConfig currentConfig;
291 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
292 retval = r;
293 if (r == Result::OK) {
294 currentConfig = conf;
295 }
296 });
297 EXPECT_TRUE(ret.isOk());
298 EXPECT_EQ(Result::OK, retval);
299 Return<Result> ret2 = effect->setConfig(currentConfig, nullptr, nullptr);
300 EXPECT_TRUE(ret2.isOk());
301 EXPECT_EQ(Result::OK, ret2);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800302}
303
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700304TEST_F(AudioEffectHidlTest, GetConfigReverse) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800305 description("Verify that GetConfigReverse does not crash");
306 Return<void> ret = effect->getConfigReverse([&](Result, const EffectConfig&) {});
307 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700308}
309
310TEST_F(AudioEffectHidlTest, GetSupportedAuxChannelsConfigs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800311 description("Verify that GetSupportedAuxChannelsConfigs does not crash");
312 Return<void> ret = effect->getSupportedAuxChannelsConfigs(
313 0, [&](Result, const hidl_vec<EffectAuxChannelsConfig>&) {});
314 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700315}
316
317TEST_F(AudioEffectHidlTest, GetAuxChannelsConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800318 description("Verify that GetAuxChannelsConfig does not crash");
319 Return<void> ret = effect->getAuxChannelsConfig([&](Result, const EffectAuxChannelsConfig&) {});
320 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700321}
322
323TEST_F(AudioEffectHidlTest, SetAuxChannelsConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800324 description("Verify that SetAuxChannelsConfig does not crash");
325 Return<Result> ret = effect->setAuxChannelsConfig(EffectAuxChannelsConfig());
326 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700327}
328
Mikhail Naganov9f289042017-02-23 08:39:36 -0800329// Not generated automatically because AudioBuffer contains
330// instances of hidl_memory which can't be compared properly
331// in general case due to presence of handles.
332//
333// However, in this particular case, handles must not present
334// thus comparison is possible.
335//
336// operator== must be defined in the same namespace as the structures.
337namespace android {
338namespace hardware {
339namespace audio {
340namespace effect {
341namespace V2_0 {
342inline bool operator==(const AudioBuffer& lhs, const AudioBuffer& rhs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800343 return lhs.id == rhs.id && lhs.frameCount == rhs.frameCount && lhs.data.handle() == nullptr &&
344 rhs.data.handle() == nullptr;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800345}
346
Kevin Rocard55b10612018-11-12 12:33:16 -0800347inline bool operator==(const EffectBufferConfig& lhs, const EffectBufferConfig& rhs) {
348 return lhs.buffer == rhs.buffer && lhs.samplingRateHz == rhs.samplingRateHz &&
349 lhs.channels == rhs.channels && lhs.format == rhs.format &&
350 lhs.accessMode == rhs.accessMode && lhs.mask == rhs.mask;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800351}
352
353inline bool operator==(const EffectConfig& lhs, const EffectConfig& rhs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800354 return lhs.inputCfg == rhs.inputCfg && lhs.outputCfg == rhs.outputCfg;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800355}
356} // namespace V2_0
357} // namespace effect
358} // namespace audio
359} // namespace hardware
360} // namespace android
361
362TEST_F(AudioEffectHidlTest, Reset) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800363 description("Verify that Reset preserves effect configuration");
364 Result retval = Result::NOT_INITIALIZED;
365 EffectConfig originalConfig;
366 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
367 retval = r;
368 if (r == Result::OK) {
369 originalConfig = conf;
370 }
371 });
372 ASSERT_TRUE(ret.isOk());
373 ASSERT_EQ(Result::OK, retval);
374 Return<Result> ret2 = effect->reset();
375 EXPECT_TRUE(ret2.isOk());
376 EXPECT_EQ(Result::OK, ret2);
377 EffectConfig configAfterReset;
378 ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
379 retval = r;
380 if (r == Result::OK) {
381 configAfterReset = conf;
382 }
383 });
384 EXPECT_EQ(originalConfig, configAfterReset);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800385}
386
387TEST_F(AudioEffectHidlTest, DisableEnableDisable) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800388 description("Verify Disable -> Enable -> Disable sequence for an effect");
389 Return<Result> ret = effect->disable();
390 EXPECT_TRUE(ret.isOk());
391 EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
392 ret = effect->enable();
393 EXPECT_TRUE(ret.isOk());
394 EXPECT_EQ(Result::OK, ret);
395 ret = effect->disable();
396 EXPECT_TRUE(ret.isOk());
397 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800398}
399
400TEST_F(AudioEffectHidlTest, SetDevice) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800401 description("Verify that SetDevice works for an output chain effect");
Kevin Rocardf5305b32018-11-13 10:41:53 -0800402 Return<Result> ret = effect->setDevice(mkEnumBitfield(AudioDevice::OUT_SPEAKER));
Kevin Rocard55b10612018-11-12 12:33:16 -0800403 EXPECT_TRUE(ret.isOk());
404 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800405}
406
407TEST_F(AudioEffectHidlTest, SetAndGetVolume) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800408 description("Verify that SetAndGetVolume method works for an effect");
409 uint32_t channelCount;
410 getChannelCount(&channelCount);
411 hidl_vec<uint32_t> volumes;
412 volumes.resize(channelCount);
413 for (uint32_t i = 0; i < channelCount; ++i) {
414 volumes[i] = 0;
415 }
416 Result retval = Result::NOT_INITIALIZED;
417 Return<void> ret =
418 effect->setAndGetVolume(volumes, [&](Result r, const hidl_vec<uint32_t>&) { retval = r; });
419 EXPECT_TRUE(ret.isOk());
420 EXPECT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800421}
422
423TEST_F(AudioEffectHidlTest, VolumeChangeNotification) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800424 description("Verify that effect accepts VolumeChangeNotification");
425 uint32_t channelCount;
426 getChannelCount(&channelCount);
427 hidl_vec<uint32_t> volumes;
428 volumes.resize(channelCount);
429 for (uint32_t i = 0; i < channelCount; ++i) {
430 volumes[i] = 0;
431 }
432 Return<Result> ret = effect->volumeChangeNotification(volumes);
433 EXPECT_TRUE(ret.isOk());
434 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800435}
436
437TEST_F(AudioEffectHidlTest, SetAudioMode) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800438 description("Verify that SetAudioMode works for an effect");
439 Return<Result> ret = effect->setAudioMode(AudioMode::NORMAL);
440 EXPECT_TRUE(ret.isOk());
441 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800442}
443
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700444TEST_F(AudioEffectHidlTest, SetConfigReverse) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800445 description("Verify that SetConfigReverse does not crash");
446 Return<Result> ret = effect->setConfigReverse(EffectConfig(), nullptr, nullptr);
447 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700448}
449
450TEST_F(AudioEffectHidlTest, SetInputDevice) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800451 description("Verify that SetInputDevice does not crash");
Kevin Rocardf5305b32018-11-13 10:41:53 -0800452 Return<Result> ret = effect->setInputDevice(mkEnumBitfield(AudioDevice::IN_BUILTIN_MIC));
Kevin Rocard55b10612018-11-12 12:33:16 -0800453 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700454}
455
456TEST_F(AudioEffectHidlTest, SetAudioSource) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800457 description("Verify that SetAudioSource does not crash");
458 Return<Result> ret = effect->setAudioSource(AudioSource::MIC);
459 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700460}
461
Mikhail Naganov9f289042017-02-23 08:39:36 -0800462TEST_F(AudioEffectHidlTest, Offload) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800463 description("Verify that calling Offload method does not crash");
464 EffectOffloadParameter offloadParam;
465 offloadParam.isOffload = false;
466 offloadParam.ioHandle = static_cast<int>(AudioHandleConsts::AUDIO_IO_HANDLE_NONE);
467 Return<Result> ret = effect->offload(offloadParam);
468 EXPECT_TRUE(ret.isOk());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800469}
470
471TEST_F(AudioEffectHidlTest, PrepareForProcessing) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800472 description("Verify that PrepareForProcessing method works for an effect");
473 Result retval = Result::NOT_INITIALIZED;
474 Return<void> ret = effect->prepareForProcessing(
475 [&](Result r, const MQDescriptorSync<Result>&) { retval = r; });
476 EXPECT_TRUE(ret.isOk());
477 EXPECT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800478}
479
480TEST_F(AudioEffectHidlTest, SetProcessBuffers) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800481 description("Verify that SetProcessBuffers works for an effect");
482 sp<IAllocator> ashmem = IAllocator::getService("ashmem");
483 ASSERT_NE(nullptr, ashmem.get());
484 bool success = false;
485 AudioBuffer buffer;
486 Return<void> ret = ashmem->allocate(1024, [&](bool s, const hidl_memory& memory) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800487 success = s;
488 if (s) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800489 buffer.data = memory;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800490 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800491 });
492 ASSERT_TRUE(ret.isOk());
493 ASSERT_TRUE(success);
494 Return<Result> ret2 = effect->setProcessBuffers(buffer, buffer);
495 EXPECT_TRUE(ret2.isOk());
496 EXPECT_EQ(Result::OK, ret2);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800497}
498
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700499TEST_F(AudioEffectHidlTest, Command) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800500 description("Verify that Command does not crash");
501 Return<void> ret =
502 effect->command(0, hidl_vec<uint8_t>(), 0, [&](int32_t, const hidl_vec<uint8_t>&) {});
503 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700504}
Mikhail Naganov9f289042017-02-23 08:39:36 -0800505
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700506TEST_F(AudioEffectHidlTest, SetParameter) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800507 description("Verify that SetParameter does not crash");
508 Return<Result> ret = effect->setParameter(hidl_vec<uint8_t>(), hidl_vec<uint8_t>());
509 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700510}
511
512TEST_F(AudioEffectHidlTest, GetParameter) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800513 description("Verify that GetParameter does not crash");
514 Return<void> ret =
515 effect->getParameter(hidl_vec<uint8_t>(), 0, [&](Result, const hidl_vec<uint8_t>&) {});
516 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700517}
518
519TEST_F(AudioEffectHidlTest, GetSupportedConfigsForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800520 description("Verify that GetSupportedConfigsForFeature does not crash");
521 Return<void> ret = effect->getSupportedConfigsForFeature(
522 0, 0, 0, [&](Result, uint32_t, const hidl_vec<uint8_t>&) {});
523 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700524}
525
526TEST_F(AudioEffectHidlTest, GetCurrentConfigForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800527 description("Verify that GetCurrentConfigForFeature does not crash");
528 Return<void> ret =
529 effect->getCurrentConfigForFeature(0, 0, [&](Result, const hidl_vec<uint8_t>&) {});
530 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700531}
532
533TEST_F(AudioEffectHidlTest, SetCurrentConfigForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800534 description("Verify that SetCurrentConfigForFeature does not crash");
535 Return<Result> ret = effect->setCurrentConfigForFeature(0, hidl_vec<uint8_t>());
536 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700537}
538
Mikhail Naganov9f289042017-02-23 08:39:36 -0800539// The main test class for Equalizer Audio Effect HIDL HAL.
540class EqualizerAudioEffectHidlTest : public AudioEffectHidlTest {
Kevin Rocard55b10612018-11-12 12:33:16 -0800541 public:
542 void SetUp() override {
543 AudioEffectHidlTest::SetUp();
544 equalizer = IEqualizerEffect::castFrom(effect);
545 ASSERT_NE(nullptr, equalizer.get());
546 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800547
Kevin Rocard55b10612018-11-12 12:33:16 -0800548 protected:
549 Uuid getEffectType() override { return EQUALIZER_EFFECT_TYPE; }
550 void getNumBands(uint16_t* numBands);
551 void getLevelRange(int16_t* minLevel, int16_t* maxLevel);
552 void getBandFrequencyRange(uint16_t band, uint32_t* minFreq, uint32_t* centerFreq,
553 uint32_t* maxFreq);
554 void getPresetCount(size_t* count);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800555
Kevin Rocard55b10612018-11-12 12:33:16 -0800556 sp<IEqualizerEffect> equalizer;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800557};
558
559void EqualizerAudioEffectHidlTest::getNumBands(uint16_t* numBands) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800560 Result retval = Result::NOT_INITIALIZED;
561 Return<void> ret = equalizer->getNumBands([&](Result r, uint16_t b) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800562 retval = r;
563 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800564 *numBands = b;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800565 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800566 });
567 ASSERT_TRUE(ret.isOk());
568 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800569}
570
Kevin Rocard55b10612018-11-12 12:33:16 -0800571void EqualizerAudioEffectHidlTest::getLevelRange(int16_t* minLevel, int16_t* maxLevel) {
572 Result retval = Result::NOT_INITIALIZED;
573 Return<void> ret = equalizer->getLevelRange([&](Result r, int16_t min, int16_t max) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800574 retval = r;
575 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800576 *minLevel = min;
577 *maxLevel = max;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800578 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800579 });
580 ASSERT_TRUE(ret.isOk());
581 ASSERT_EQ(Result::OK, retval);
582}
583
584void EqualizerAudioEffectHidlTest::getBandFrequencyRange(uint16_t band, uint32_t* minFreq,
585 uint32_t* centerFreq, uint32_t* maxFreq) {
586 Result retval = Result::NOT_INITIALIZED;
587 Return<void> ret =
588 equalizer->getBandFrequencyRange(band, [&](Result r, uint32_t min, uint32_t max) {
589 retval = r;
590 if (retval == Result::OK) {
591 *minFreq = min;
592 *maxFreq = max;
593 }
594 });
595 ASSERT_TRUE(ret.isOk());
596 ASSERT_EQ(Result::OK, retval);
597 ret = equalizer->getBandCenterFrequency(band, [&](Result r, uint32_t center) {
598 retval = r;
599 if (retval == Result::OK) {
600 *centerFreq = center;
601 }
602 });
603 ASSERT_TRUE(ret.isOk());
604 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800605}
606
607void EqualizerAudioEffectHidlTest::getPresetCount(size_t* count) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800608 Result retval = Result::NOT_INITIALIZED;
609 Return<void> ret = equalizer->getPresetNames([&](Result r, const hidl_vec<hidl_string>& names) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800610 retval = r;
611 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800612 *count = names.size();
Mikhail Naganov9f289042017-02-23 08:39:36 -0800613 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800614 });
615 ASSERT_TRUE(ret.isOk());
616 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800617}
618
619TEST_F(EqualizerAudioEffectHidlTest, GetNumBands) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800620 description("Verify that Equalizer effect reports at least one band");
621 uint16_t numBands = 0;
622 getNumBands(&numBands);
623 EXPECT_GT(numBands, 0);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800624}
625
626TEST_F(EqualizerAudioEffectHidlTest, GetLevelRange) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800627 description("Verify that Equalizer effect reports adequate band level range");
628 int16_t minLevel = 0x7fff, maxLevel = 0;
629 getLevelRange(&minLevel, &maxLevel);
630 EXPECT_GT(maxLevel, minLevel);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800631}
632
633TEST_F(EqualizerAudioEffectHidlTest, GetSetBandLevel) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800634 description("Verify that manipulating band levels works for Equalizer effect");
635 uint16_t numBands = 0;
636 getNumBands(&numBands);
637 ASSERT_GT(numBands, 0);
638 int16_t levels[3]{0x7fff, 0, 0};
639 getLevelRange(&levels[0], &levels[2]);
640 ASSERT_GT(levels[2], levels[0]);
641 levels[1] = (levels[2] + levels[0]) / 2;
642 for (uint16_t i = 0; i < numBands; ++i) {
643 for (size_t j = 0; j < ARRAY_SIZE(levels); ++j) {
644 Return<Result> ret = equalizer->setBandLevel(i, levels[j]);
645 EXPECT_TRUE(ret.isOk());
646 EXPECT_EQ(Result::OK, ret);
647 Result retval = Result::NOT_INITIALIZED;
648 int16_t actualLevel;
649 Return<void> ret2 = equalizer->getBandLevel(i, [&](Result r, int16_t l) {
650 retval = r;
651 if (retval == Result::OK) {
652 actualLevel = l;
653 }
654 });
655 EXPECT_TRUE(ret2.isOk());
656 EXPECT_EQ(Result::OK, retval);
657 EXPECT_EQ(levels[j], actualLevel);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800658 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800659 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800660}
661
662TEST_F(EqualizerAudioEffectHidlTest, GetBandCenterFrequencyAndRange) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800663 description("Verify that Equalizer effect reports adequate band frequency range");
664 uint16_t numBands = 0;
665 getNumBands(&numBands);
666 ASSERT_GT(numBands, 0);
667 for (uint16_t i = 0; i < numBands; ++i) {
668 uint32_t minFreq = 0xffffffff, centerFreq = 0xffffffff, maxFreq = 0xffffffff;
669 getBandFrequencyRange(i, &minFreq, &centerFreq, &maxFreq);
670 // Note: NXP legacy implementation reports "1" as upper bound for last band,
671 // so this check fails.
672 EXPECT_GE(maxFreq, centerFreq);
673 EXPECT_GE(centerFreq, minFreq);
674 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800675}
676
677TEST_F(EqualizerAudioEffectHidlTest, GetBandForFrequency) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800678 description("Verify that Equalizer effect supports GetBandForFrequency correctly");
679 uint16_t numBands = 0;
680 getNumBands(&numBands);
681 ASSERT_GT(numBands, 0);
682 for (uint16_t i = 0; i < numBands; ++i) {
683 uint32_t freqs[3]{0, 0, 0};
684 getBandFrequencyRange(i, &freqs[0], &freqs[1], &freqs[2]);
685 // NXP legacy implementation reports "1" as upper bound for last band, some
686 // of the checks fail.
687 for (size_t j = 0; j < ARRAY_SIZE(freqs); ++j) {
688 if (j == 0) {
689 freqs[j]++;
690 } // Min frequency is an open interval.
691 Result retval = Result::NOT_INITIALIZED;
692 uint16_t actualBand = numBands + 1;
693 Return<void> ret = equalizer->getBandForFrequency(freqs[j], [&](Result r, uint16_t b) {
694 retval = r;
695 if (retval == Result::OK) {
696 actualBand = b;
697 }
698 });
699 EXPECT_TRUE(ret.isOk());
700 EXPECT_EQ(Result::OK, retval);
701 EXPECT_EQ(i, actualBand) << "Frequency: " << freqs[j];
702 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800703 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800704}
705
706TEST_F(EqualizerAudioEffectHidlTest, GetPresetNames) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800707 description("Verify that Equalizer effect reports at least one preset");
708 size_t presetCount;
709 getPresetCount(&presetCount);
710 EXPECT_GT(presetCount, 0u);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800711}
712
713TEST_F(EqualizerAudioEffectHidlTest, GetSetCurrentPreset) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800714 description("Verify that manipulating the current preset for Equalizer effect");
715 size_t presetCount;
716 getPresetCount(&presetCount);
717 ASSERT_GT(presetCount, 0u);
718 for (uint16_t i = 0; i < presetCount; ++i) {
719 Return<Result> ret = equalizer->setCurrentPreset(i);
720 EXPECT_TRUE(ret.isOk());
721 EXPECT_EQ(Result::OK, ret);
722 Result retval = Result::NOT_INITIALIZED;
723 uint16_t actualPreset = 0xffff;
724 Return<void> ret2 = equalizer->getCurrentPreset([&](Result r, uint16_t p) {
725 retval = r;
726 if (retval == Result::OK) {
727 actualPreset = p;
728 }
729 });
730 EXPECT_TRUE(ret2.isOk());
731 EXPECT_EQ(Result::OK, retval);
732 EXPECT_EQ(i, actualPreset);
733 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800734}
735
736TEST_F(EqualizerAudioEffectHidlTest, GetSetAllProperties) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800737 description(
738 "Verify that setting band levels and presets works via Get / "
739 "SetAllProperties for Equalizer effect");
740 using AllProperties = android::hardware::audio::effect::V2_0::IEqualizerEffect::AllProperties;
741 uint16_t numBands = 0;
742 getNumBands(&numBands);
743 ASSERT_GT(numBands, 0);
744 AllProperties props;
745 props.bandLevels.resize(numBands);
746 for (size_t i = 0; i < numBands; ++i) {
747 props.bandLevels[i] = 0;
748 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800749
Kevin Rocard55b10612018-11-12 12:33:16 -0800750 AllProperties actualProps;
751 Result retval = Result::NOT_INITIALIZED;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800752
Kevin Rocard55b10612018-11-12 12:33:16 -0800753 // Verify setting of the band levels via properties.
754 props.curPreset = -1;
755 Return<Result> ret = equalizer->setAllProperties(props);
756 EXPECT_TRUE(ret.isOk());
757 EXPECT_EQ(Result::OK, ret);
758 Return<void> ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800759 retval = r;
760 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800761 actualProps = p;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800762 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800763 });
764 EXPECT_TRUE(ret2.isOk());
765 EXPECT_EQ(Result::OK, retval);
766 EXPECT_EQ(props.bandLevels, actualProps.bandLevels);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800767
Kevin Rocard55b10612018-11-12 12:33:16 -0800768 // Verify setting of the current preset via properties.
769 props.curPreset = 0; // Assuming there is at least one preset.
770 ret = equalizer->setAllProperties(props);
771 EXPECT_TRUE(ret.isOk());
772 EXPECT_EQ(Result::OK, ret);
773 ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
774 retval = r;
775 if (retval == Result::OK) {
776 actualProps = p;
777 }
778 });
779 EXPECT_TRUE(ret2.isOk());
780 EXPECT_EQ(Result::OK, retval);
781 EXPECT_EQ(props.curPreset, actualProps.curPreset);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800782}
783
784// The main test class for Equalizer Audio Effect HIDL HAL.
785class LoudnessEnhancerAudioEffectHidlTest : public AudioEffectHidlTest {
Kevin Rocard55b10612018-11-12 12:33:16 -0800786 public:
787 void SetUp() override {
788 AudioEffectHidlTest::SetUp();
789 enhancer = ILoudnessEnhancerEffect::castFrom(effect);
790 ASSERT_NE(nullptr, enhancer.get());
791 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800792
Kevin Rocard55b10612018-11-12 12:33:16 -0800793 protected:
794 Uuid getEffectType() override { return LOUDNESS_ENHANCER_EFFECT_TYPE; }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800795
Kevin Rocard55b10612018-11-12 12:33:16 -0800796 sp<ILoudnessEnhancerEffect> enhancer;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800797};
798
799TEST_F(LoudnessEnhancerAudioEffectHidlTest, GetSetTargetGain) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800800 description(
801 "Verify that manipulating the target gain works for Loudness Enhancer "
802 "effect");
803 const int32_t gain = 100;
804 Return<Result> ret = enhancer->setTargetGain(gain);
805 EXPECT_TRUE(ret.isOk());
806 EXPECT_EQ(Result::OK, ret);
807 int32_t actualGain = 0;
808 Result retval;
809 Return<void> ret2 = enhancer->getTargetGain([&](Result r, int32_t g) {
810 retval = r;
811 if (retval == Result::OK) {
812 actualGain = g;
813 }
814 });
815 EXPECT_TRUE(ret2.isOk());
816 EXPECT_EQ(Result::OK, retval);
817 EXPECT_EQ(gain, actualGain);
Mikhail Naganovbf393172016-11-11 16:24:50 -0800818}
Zhuoyao Zhang7dc6ce82018-02-08 12:44:27 -0800819
820int main(int argc, char** argv) {
821 ::testing::AddGlobalTestEnvironment(AudioEffectsFactoryHidlEnvironment::Instance());
822 ::testing::InitGoogleTest(&argc, argv);
823 AudioEffectsFactoryHidlEnvironment::Instance()->init(&argc, argv);
824 int status = RUN_ALL_TESTS();
825 LOG(INFO) << "Test result = " << status;
826 return status;
827}