blob: c4c7f7ccc4684e26a6399adc033c80b65b66ef35 [file] [log] [blame]
Mikhail Naganovbf393172016-11-11 16:24:50 -08001/*
Kevin Rocard96d2cd92018-11-14 16:22:07 -08002 * Copyright (C) 2018 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
Kevin Rocard96d2cd92018-11-14 16:22:07 -080021#include PATH(android/hardware/audio/effect/FILE_VERSION/IEffect.h)
22#include PATH(android/hardware/audio/effect/FILE_VERSION/IEffectsFactory.h)
23#include PATH(android/hardware/audio/effect/FILE_VERSION/IEqualizerEffect.h)
24#include PATH(android/hardware/audio/effect/FILE_VERSION/ILoudnessEnhancerEffect.h)
25#include PATH(android/hardware/audio/effect/FILE_VERSION/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
Mikhail Naganov00a44c02018-12-14 14:31:45 -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;
42using ::android::hardware::audio::common::utils::mkEnumBitfield;
43using ::android::hidl::allocator::V1_0::IAllocator;
44using ::android::hidl::memory::V1_0::IMemory;
45using namespace ::android::hardware::audio::common::CPP_VERSION;
46using namespace ::android::hardware::audio::effect::CPP_VERSION;
Mikhail Naganovbf393172016-11-11 16:24:50 -080047
Mikhail Naganov9f289042017-02-23 08:39:36 -080048#ifndef ARRAY_SIZE
49#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a)))
50#endif
51
Zhuoyao Zhang7dc6ce82018-02-08 12:44:27 -080052// Test environment for Audio Effects Factory HIDL HAL.
53class AudioEffectsFactoryHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase {
54 public:
55 // get the test environment singleton
56 static AudioEffectsFactoryHidlEnvironment* Instance() {
57 static AudioEffectsFactoryHidlEnvironment* instance =
58 new AudioEffectsFactoryHidlEnvironment;
59 return instance;
60 }
61
62 virtual void registerTestServices() override { registerTestService<IEffectsFactory>(); }
63};
64
Mikhail Naganov9f289042017-02-23 08:39:36 -080065// The main test class for Audio Effects Factory HIDL HAL.
66class AudioEffectsFactoryHidlTest : public ::testing::VtsHalHidlTargetTestBase {
Kevin Rocard55b10612018-11-12 12:33:16 -080067 public:
68 void SetUp() override {
69 effectsFactory = ::testing::VtsHalHidlTargetTestBase::getService<IEffectsFactory>(
70 AudioEffectsFactoryHidlEnvironment::Instance()->getServiceName<IEffectsFactory>());
71 ASSERT_NE(effectsFactory, nullptr);
72 }
Mikhail Naganovbf393172016-11-11 16:24:50 -080073
Kevin Rocard55b10612018-11-12 12:33:16 -080074 void TearDown() override { effectsFactory.clear(); }
Mikhail Naganov9f289042017-02-23 08:39:36 -080075
Kevin Rocard55b10612018-11-12 12:33:16 -080076 protected:
77 static void description(const std::string& description) {
78 RecordProperty("description", description);
79 }
Mikhail Naganovbf393172016-11-11 16:24:50 -080080
Kevin Rocard55b10612018-11-12 12:33:16 -080081 sp<IEffectsFactory> effectsFactory;
Mikhail Naganovbf393172016-11-11 16:24:50 -080082};
83
Mikhail Naganov9f289042017-02-23 08:39:36 -080084TEST_F(AudioEffectsFactoryHidlTest, EnumerateEffects) {
Kevin Rocard55b10612018-11-12 12:33:16 -080085 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);
Mikhail Naganovbf393172016-11-11 16:24:50 -080096}
97
Mikhail Naganov9f289042017-02-23 08:39:36 -080098TEST_F(AudioEffectsFactoryHidlTest, CreateEffect) {
Kevin Rocard55b10612018-11-12 12:33:16 -080099 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 [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) {
116 retval = r;
117 if (r == Result::OK) {
118 effect = result;
119 }
120 });
121 EXPECT_TRUE(ret.isOk());
122 EXPECT_EQ(Result::OK, retval);
123 EXPECT_NE(nullptr, effect.get());
Mikhail Naganovbf393172016-11-11 16:24:50 -0800124}
125
Mikhail Naganov9f289042017-02-23 08:39:36 -0800126TEST_F(AudioEffectsFactoryHidlTest, GetDescriptor) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800127 description(
128 "Verify that effects factory can provide an effect descriptor via "
129 "GetDescriptor");
130 hidl_vec<EffectDescriptor> allDescriptors;
131 Return<void> ret =
132 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
133 if (r == Result::OK) {
134 allDescriptors = result;
135 }
Mikhail Naganovbf393172016-11-11 16:24:50 -0800136 });
Kevin Rocard55b10612018-11-12 12:33:16 -0800137 ASSERT_TRUE(ret.isOk());
138 ASSERT_GT(allDescriptors.size(), 0u);
139 for (size_t i = 0; i < allDescriptors.size(); ++i) {
140 ret = effectsFactory->getDescriptor(allDescriptors[i].uuid,
141 [&](Result r, const EffectDescriptor& result) {
142 EXPECT_EQ(r, Result::OK);
143 EXPECT_EQ(result, allDescriptors[i]);
144 });
145 }
146 EXPECT_TRUE(ret.isOk());
Mikhail Naganovbf393172016-11-11 16:24:50 -0800147}
148
Mikhail Naganov3e6fe752017-04-24 10:44:08 -0700149TEST_F(AudioEffectsFactoryHidlTest, DebugDumpInvalidArgument) {
150 description("Verify that debugDump doesn't crash on invalid arguments");
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800151#if MAJOR_VERSION == 2
Mikhail Naganov3e6fe752017-04-24 10:44:08 -0700152 Return<void> ret = effectsFactory->debugDump(hidl_handle());
Kevin Rocard20614ba2018-11-10 07:20:17 -0800153#elif MAJOR_VERSION >= 4
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800154 Return<void> ret = effectsFactory->debug(hidl_handle(), {});
155#endif
Mikhail Naganov3e6fe752017-04-24 10:44:08 -0700156 ASSERT_TRUE(ret.isOk());
157}
158
Mikhail Naganov9f289042017-02-23 08:39:36 -0800159// Equalizer effect is required by CDD, but only the type is fixed.
160// This is the same UUID as AudioEffect.EFFECT_TYPE_EQUALIZER in Java.
161static const Uuid EQUALIZER_EFFECT_TYPE = {
162 0x0bed4300, 0xddd6, 0x11db, 0x8f34,
163 std::array<uint8_t, 6>{{0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}};
164// Loudness Enhancer effect is required by CDD, but only the type is fixed.
165// This is the same UUID as AudioEffect.EFFECT_TYPE_LOUDNESS_ENHANCER in Java.
166static const Uuid LOUDNESS_ENHANCER_EFFECT_TYPE = {
167 0xfe3199be, 0xaed0, 0x413f, 0x87bb,
168 std::array<uint8_t, 6>{{0x11, 0x26, 0x0e, 0xb6, 0x3c, 0xf1}}};
169
170// The main test class for Audio Effect HIDL HAL.
171class AudioEffectHidlTest : public ::testing::VtsHalHidlTargetTestBase {
Kevin Rocard55b10612018-11-12 12:33:16 -0800172 public:
173 void SetUp() override {
174 effectsFactory = ::testing::VtsHalHidlTargetTestBase::getService<IEffectsFactory>();
175 ASSERT_NE(nullptr, effectsFactory.get());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800176
Kevin Rocard55b10612018-11-12 12:33:16 -0800177 findAndCreateEffect(getEffectType());
178 ASSERT_NE(nullptr, effect.get());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800179
Kevin Rocard55b10612018-11-12 12:33:16 -0800180 Return<Result> ret = effect->init();
181 ASSERT_TRUE(ret.isOk());
182 ASSERT_EQ(Result::OK, ret);
183 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800184
Kevin Rocard55b10612018-11-12 12:33:16 -0800185 void TearDown() override {
186 effect.clear();
187 effectsFactory.clear();
188 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800189
Kevin Rocard55b10612018-11-12 12:33:16 -0800190 protected:
191 static void description(const std::string& description) {
192 RecordProperty("description", description);
193 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800194
Kevin Rocard55b10612018-11-12 12:33:16 -0800195 virtual Uuid getEffectType() { return EQUALIZER_EFFECT_TYPE; }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800196
Kevin Rocard55b10612018-11-12 12:33:16 -0800197 void findAndCreateEffect(const Uuid& type);
198 void findEffectInstance(const Uuid& type, Uuid* uuid);
199 void getChannelCount(uint32_t* channelCount);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800200
Kevin Rocard55b10612018-11-12 12:33:16 -0800201 sp<IEffectsFactory> effectsFactory;
202 sp<IEffect> effect;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800203};
204
205void AudioEffectHidlTest::findAndCreateEffect(const Uuid& type) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800206 Uuid effectUuid;
207 findEffectInstance(type, &effectUuid);
208 Return<void> ret = effectsFactory->createEffect(
209 effectUuid, 1 /*session*/, 1 /*ioHandle*/,
210 [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) {
211 if (r == Result::OK) {
212 effect = result;
213 }
214 });
215 ASSERT_TRUE(ret.isOk());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800216}
217
218void AudioEffectHidlTest::findEffectInstance(const Uuid& type, Uuid* uuid) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800219 bool effectFound = false;
220 Return<void> ret =
221 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
222 if (r == Result::OK) {
223 for (const auto& desc : result) {
224 if (desc.type == type) {
225 effectFound = true;
226 *uuid = desc.uuid;
227 break;
228 }
229 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800230 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800231 });
232 ASSERT_TRUE(ret.isOk());
233 ASSERT_TRUE(effectFound);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800234}
235
236void AudioEffectHidlTest::getChannelCount(uint32_t* channelCount) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800237 Result retval;
238 EffectConfig currentConfig;
239 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
240 retval = r;
241 if (r == Result::OK) {
242 currentConfig = conf;
243 }
244 });
245 ASSERT_TRUE(ret.isOk());
246 ASSERT_EQ(Result::OK, retval);
247 ASSERT_TRUE(audio_channel_mask_is_valid(
248 static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels)));
249 *channelCount = audio_channel_count_from_out_mask(
250 static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels));
Mikhail Naganov9f289042017-02-23 08:39:36 -0800251}
252
253TEST_F(AudioEffectHidlTest, Close) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800254 description("Verify that an effect can be closed");
255 Return<Result> ret = effect->close();
256 EXPECT_TRUE(ret.isOk());
257 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800258}
259
260TEST_F(AudioEffectHidlTest, GetDescriptor) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800261 description("Verify that an effect can return its own descriptor via GetDescriptor");
262 Result retval = Result::NOT_INITIALIZED;
263 Uuid actualType;
264 Return<void> ret = effect->getDescriptor([&](Result r, const EffectDescriptor& desc) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800265 retval = r;
266 if (r == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800267 actualType = desc.type;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800268 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800269 });
270 EXPECT_TRUE(ret.isOk());
271 EXPECT_EQ(Result::OK, retval);
272 EXPECT_EQ(getEffectType(), actualType);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800273}
274
275TEST_F(AudioEffectHidlTest, GetSetConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800276 description(
277 "Verify that it is possible to manipulate effect config via Get / "
278 "SetConfig");
279 Result retval = Result::NOT_INITIALIZED;
280 EffectConfig currentConfig;
281 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
282 retval = r;
283 if (r == Result::OK) {
284 currentConfig = conf;
285 }
286 });
287 EXPECT_TRUE(ret.isOk());
288 EXPECT_EQ(Result::OK, retval);
289 Return<Result> ret2 = effect->setConfig(currentConfig, nullptr, nullptr);
290 EXPECT_TRUE(ret2.isOk());
291 EXPECT_EQ(Result::OK, ret2);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800292}
293
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700294TEST_F(AudioEffectHidlTest, GetConfigReverse) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800295 description("Verify that GetConfigReverse does not crash");
296 Return<void> ret = effect->getConfigReverse([&](Result, const EffectConfig&) {});
297 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700298}
299
300TEST_F(AudioEffectHidlTest, GetSupportedAuxChannelsConfigs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800301 description("Verify that GetSupportedAuxChannelsConfigs does not crash");
302 Return<void> ret = effect->getSupportedAuxChannelsConfigs(
303 0, [&](Result, const hidl_vec<EffectAuxChannelsConfig>&) {});
304 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700305}
306
307TEST_F(AudioEffectHidlTest, GetAuxChannelsConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800308 description("Verify that GetAuxChannelsConfig does not crash");
309 Return<void> ret = effect->getAuxChannelsConfig([&](Result, const EffectAuxChannelsConfig&) {});
310 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700311}
312
313TEST_F(AudioEffectHidlTest, SetAuxChannelsConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800314 description("Verify that SetAuxChannelsConfig does not crash");
315 Return<Result> ret = effect->setAuxChannelsConfig(EffectAuxChannelsConfig());
316 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700317}
318
Mikhail Naganov9f289042017-02-23 08:39:36 -0800319// Not generated automatically because AudioBuffer contains
320// instances of hidl_memory which can't be compared properly
321// in general case due to presence of handles.
322//
323// However, in this particular case, handles must not present
324// thus comparison is possible.
325//
326// operator== must be defined in the same namespace as the structures.
327namespace android {
328namespace hardware {
329namespace audio {
330namespace effect {
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800331namespace CPP_VERSION {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800332inline bool operator==(const AudioBuffer& lhs, const AudioBuffer& rhs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800333 return lhs.id == rhs.id && lhs.frameCount == rhs.frameCount && lhs.data.handle() == nullptr &&
334 rhs.data.handle() == nullptr;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800335}
336
Kevin Rocard55b10612018-11-12 12:33:16 -0800337inline bool operator==(const EffectBufferConfig& lhs, const EffectBufferConfig& rhs) {
338 return lhs.buffer == rhs.buffer && lhs.samplingRateHz == rhs.samplingRateHz &&
339 lhs.channels == rhs.channels && lhs.format == rhs.format &&
340 lhs.accessMode == rhs.accessMode && lhs.mask == rhs.mask;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800341}
342
343inline bool operator==(const EffectConfig& lhs, const EffectConfig& rhs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800344 return lhs.inputCfg == rhs.inputCfg && lhs.outputCfg == rhs.outputCfg;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800345}
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800346} // namespace CPP_VERSION
Mikhail Naganov9f289042017-02-23 08:39:36 -0800347} // namespace effect
348} // namespace audio
349} // namespace hardware
350} // namespace android
351
352TEST_F(AudioEffectHidlTest, Reset) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800353 description("Verify that Reset preserves effect configuration");
354 Result retval = Result::NOT_INITIALIZED;
355 EffectConfig originalConfig;
356 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
357 retval = r;
358 if (r == Result::OK) {
359 originalConfig = conf;
360 }
361 });
362 ASSERT_TRUE(ret.isOk());
363 ASSERT_EQ(Result::OK, retval);
364 Return<Result> ret2 = effect->reset();
365 EXPECT_TRUE(ret2.isOk());
366 EXPECT_EQ(Result::OK, ret2);
367 EffectConfig configAfterReset;
368 ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
369 retval = r;
370 if (r == Result::OK) {
371 configAfterReset = conf;
372 }
373 });
374 EXPECT_EQ(originalConfig, configAfterReset);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800375}
376
377TEST_F(AudioEffectHidlTest, DisableEnableDisable) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800378 description("Verify Disable -> Enable -> Disable sequence for an effect");
379 Return<Result> ret = effect->disable();
380 EXPECT_TRUE(ret.isOk());
381 EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
382 ret = effect->enable();
383 EXPECT_TRUE(ret.isOk());
384 EXPECT_EQ(Result::OK, ret);
385 ret = effect->disable();
386 EXPECT_TRUE(ret.isOk());
387 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800388}
389
390TEST_F(AudioEffectHidlTest, SetDevice) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800391 description("Verify that SetDevice works for an output chain effect");
Kevin Rocardf5305b32018-11-13 10:41:53 -0800392 Return<Result> ret = effect->setDevice(mkEnumBitfield(AudioDevice::OUT_SPEAKER));
Kevin Rocard55b10612018-11-12 12:33:16 -0800393 EXPECT_TRUE(ret.isOk());
394 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800395}
396
397TEST_F(AudioEffectHidlTest, SetAndGetVolume) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800398 description("Verify that SetAndGetVolume method works for an effect");
399 uint32_t channelCount;
400 getChannelCount(&channelCount);
401 hidl_vec<uint32_t> volumes;
402 volumes.resize(channelCount);
403 for (uint32_t i = 0; i < channelCount; ++i) {
404 volumes[i] = 0;
405 }
406 Result retval = Result::NOT_INITIALIZED;
407 Return<void> ret =
408 effect->setAndGetVolume(volumes, [&](Result r, const hidl_vec<uint32_t>&) { retval = r; });
409 EXPECT_TRUE(ret.isOk());
410 EXPECT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800411}
412
413TEST_F(AudioEffectHidlTest, VolumeChangeNotification) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800414 description("Verify that effect accepts VolumeChangeNotification");
415 uint32_t channelCount;
416 getChannelCount(&channelCount);
417 hidl_vec<uint32_t> volumes;
418 volumes.resize(channelCount);
419 for (uint32_t i = 0; i < channelCount; ++i) {
420 volumes[i] = 0;
421 }
422 Return<Result> ret = effect->volumeChangeNotification(volumes);
423 EXPECT_TRUE(ret.isOk());
424 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800425}
426
427TEST_F(AudioEffectHidlTest, SetAudioMode) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800428 description("Verify that SetAudioMode works for an effect");
429 Return<Result> ret = effect->setAudioMode(AudioMode::NORMAL);
430 EXPECT_TRUE(ret.isOk());
431 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800432}
433
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700434TEST_F(AudioEffectHidlTest, SetConfigReverse) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800435 description("Verify that SetConfigReverse does not crash");
436 Return<Result> ret = effect->setConfigReverse(EffectConfig(), nullptr, nullptr);
437 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700438}
439
440TEST_F(AudioEffectHidlTest, SetInputDevice) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800441 description("Verify that SetInputDevice does not crash");
Kevin Rocardf5305b32018-11-13 10:41:53 -0800442 Return<Result> ret = effect->setInputDevice(mkEnumBitfield(AudioDevice::IN_BUILTIN_MIC));
Kevin Rocard55b10612018-11-12 12:33:16 -0800443 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700444}
445
446TEST_F(AudioEffectHidlTest, SetAudioSource) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800447 description("Verify that SetAudioSource does not crash");
448 Return<Result> ret = effect->setAudioSource(AudioSource::MIC);
449 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700450}
451
Mikhail Naganov9f289042017-02-23 08:39:36 -0800452TEST_F(AudioEffectHidlTest, Offload) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800453 description("Verify that calling Offload method does not crash");
454 EffectOffloadParameter offloadParam;
455 offloadParam.isOffload = false;
456 offloadParam.ioHandle = static_cast<int>(AudioHandleConsts::AUDIO_IO_HANDLE_NONE);
457 Return<Result> ret = effect->offload(offloadParam);
458 EXPECT_TRUE(ret.isOk());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800459}
460
461TEST_F(AudioEffectHidlTest, PrepareForProcessing) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800462 description("Verify that PrepareForProcessing method works for an effect");
463 Result retval = Result::NOT_INITIALIZED;
464 Return<void> ret = effect->prepareForProcessing(
465 [&](Result r, const MQDescriptorSync<Result>&) { retval = r; });
466 EXPECT_TRUE(ret.isOk());
467 EXPECT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800468}
469
470TEST_F(AudioEffectHidlTest, SetProcessBuffers) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800471 description("Verify that SetProcessBuffers works for an effect");
472 sp<IAllocator> ashmem = IAllocator::getService("ashmem");
473 ASSERT_NE(nullptr, ashmem.get());
474 bool success = false;
475 AudioBuffer buffer;
476 Return<void> ret = ashmem->allocate(1024, [&](bool s, const hidl_memory& memory) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800477 success = s;
478 if (s) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800479 buffer.data = memory;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800480 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800481 });
482 ASSERT_TRUE(ret.isOk());
483 ASSERT_TRUE(success);
484 Return<Result> ret2 = effect->setProcessBuffers(buffer, buffer);
485 EXPECT_TRUE(ret2.isOk());
486 EXPECT_EQ(Result::OK, ret2);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800487}
488
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700489TEST_F(AudioEffectHidlTest, Command) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800490 description("Verify that Command does not crash");
491 Return<void> ret =
492 effect->command(0, hidl_vec<uint8_t>(), 0, [&](int32_t, const hidl_vec<uint8_t>&) {});
493 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700494}
Mikhail Naganov9f289042017-02-23 08:39:36 -0800495
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700496TEST_F(AudioEffectHidlTest, SetParameter) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800497 description("Verify that SetParameter does not crash");
498 Return<Result> ret = effect->setParameter(hidl_vec<uint8_t>(), hidl_vec<uint8_t>());
499 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700500}
501
502TEST_F(AudioEffectHidlTest, GetParameter) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800503 description("Verify that GetParameter does not crash");
504 Return<void> ret =
505 effect->getParameter(hidl_vec<uint8_t>(), 0, [&](Result, const hidl_vec<uint8_t>&) {});
506 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700507}
508
509TEST_F(AudioEffectHidlTest, GetSupportedConfigsForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800510 description("Verify that GetSupportedConfigsForFeature does not crash");
511 Return<void> ret = effect->getSupportedConfigsForFeature(
512 0, 0, 0, [&](Result, uint32_t, const hidl_vec<uint8_t>&) {});
513 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700514}
515
516TEST_F(AudioEffectHidlTest, GetCurrentConfigForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800517 description("Verify that GetCurrentConfigForFeature does not crash");
518 Return<void> ret =
519 effect->getCurrentConfigForFeature(0, 0, [&](Result, const hidl_vec<uint8_t>&) {});
520 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700521}
522
523TEST_F(AudioEffectHidlTest, SetCurrentConfigForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800524 description("Verify that SetCurrentConfigForFeature does not crash");
525 Return<Result> ret = effect->setCurrentConfigForFeature(0, hidl_vec<uint8_t>());
526 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700527}
528
Mikhail Naganov9f289042017-02-23 08:39:36 -0800529// The main test class for Equalizer Audio Effect HIDL HAL.
530class EqualizerAudioEffectHidlTest : public AudioEffectHidlTest {
Kevin Rocard55b10612018-11-12 12:33:16 -0800531 public:
532 void SetUp() override {
533 AudioEffectHidlTest::SetUp();
534 equalizer = IEqualizerEffect::castFrom(effect);
535 ASSERT_NE(nullptr, equalizer.get());
536 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800537
Kevin Rocard55b10612018-11-12 12:33:16 -0800538 protected:
539 Uuid getEffectType() override { return EQUALIZER_EFFECT_TYPE; }
540 void getNumBands(uint16_t* numBands);
541 void getLevelRange(int16_t* minLevel, int16_t* maxLevel);
542 void getBandFrequencyRange(uint16_t band, uint32_t* minFreq, uint32_t* centerFreq,
543 uint32_t* maxFreq);
544 void getPresetCount(size_t* count);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800545
Kevin Rocard55b10612018-11-12 12:33:16 -0800546 sp<IEqualizerEffect> equalizer;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800547};
548
549void EqualizerAudioEffectHidlTest::getNumBands(uint16_t* numBands) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800550 Result retval = Result::NOT_INITIALIZED;
551 Return<void> ret = equalizer->getNumBands([&](Result r, uint16_t b) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800552 retval = r;
553 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800554 *numBands = b;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800555 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800556 });
557 ASSERT_TRUE(ret.isOk());
558 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800559}
560
Kevin Rocard55b10612018-11-12 12:33:16 -0800561void EqualizerAudioEffectHidlTest::getLevelRange(int16_t* minLevel, int16_t* maxLevel) {
562 Result retval = Result::NOT_INITIALIZED;
563 Return<void> ret = equalizer->getLevelRange([&](Result r, int16_t min, int16_t max) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800564 retval = r;
565 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800566 *minLevel = min;
567 *maxLevel = max;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800568 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800569 });
570 ASSERT_TRUE(ret.isOk());
571 ASSERT_EQ(Result::OK, retval);
572}
573
574void EqualizerAudioEffectHidlTest::getBandFrequencyRange(uint16_t band, uint32_t* minFreq,
575 uint32_t* centerFreq, uint32_t* maxFreq) {
576 Result retval = Result::NOT_INITIALIZED;
577 Return<void> ret =
578 equalizer->getBandFrequencyRange(band, [&](Result r, uint32_t min, uint32_t max) {
579 retval = r;
580 if (retval == Result::OK) {
581 *minFreq = min;
582 *maxFreq = max;
583 }
584 });
585 ASSERT_TRUE(ret.isOk());
586 ASSERT_EQ(Result::OK, retval);
587 ret = equalizer->getBandCenterFrequency(band, [&](Result r, uint32_t center) {
588 retval = r;
589 if (retval == Result::OK) {
590 *centerFreq = center;
591 }
592 });
593 ASSERT_TRUE(ret.isOk());
594 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800595}
596
597void EqualizerAudioEffectHidlTest::getPresetCount(size_t* count) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800598 Result retval = Result::NOT_INITIALIZED;
599 Return<void> ret = equalizer->getPresetNames([&](Result r, const hidl_vec<hidl_string>& names) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800600 retval = r;
601 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800602 *count = names.size();
Mikhail Naganov9f289042017-02-23 08:39:36 -0800603 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800604 });
605 ASSERT_TRUE(ret.isOk());
606 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800607}
608
609TEST_F(EqualizerAudioEffectHidlTest, GetNumBands) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800610 description("Verify that Equalizer effect reports at least one band");
611 uint16_t numBands = 0;
612 getNumBands(&numBands);
613 EXPECT_GT(numBands, 0);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800614}
615
616TEST_F(EqualizerAudioEffectHidlTest, GetLevelRange) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800617 description("Verify that Equalizer effect reports adequate band level range");
618 int16_t minLevel = 0x7fff, maxLevel = 0;
619 getLevelRange(&minLevel, &maxLevel);
620 EXPECT_GT(maxLevel, minLevel);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800621}
622
623TEST_F(EqualizerAudioEffectHidlTest, GetSetBandLevel) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800624 description("Verify that manipulating band levels works for Equalizer effect");
625 uint16_t numBands = 0;
626 getNumBands(&numBands);
627 ASSERT_GT(numBands, 0);
628 int16_t levels[3]{0x7fff, 0, 0};
629 getLevelRange(&levels[0], &levels[2]);
630 ASSERT_GT(levels[2], levels[0]);
631 levels[1] = (levels[2] + levels[0]) / 2;
632 for (uint16_t i = 0; i < numBands; ++i) {
633 for (size_t j = 0; j < ARRAY_SIZE(levels); ++j) {
634 Return<Result> ret = equalizer->setBandLevel(i, levels[j]);
635 EXPECT_TRUE(ret.isOk());
636 EXPECT_EQ(Result::OK, ret);
637 Result retval = Result::NOT_INITIALIZED;
638 int16_t actualLevel;
639 Return<void> ret2 = equalizer->getBandLevel(i, [&](Result r, int16_t l) {
640 retval = r;
641 if (retval == Result::OK) {
642 actualLevel = l;
643 }
644 });
645 EXPECT_TRUE(ret2.isOk());
646 EXPECT_EQ(Result::OK, retval);
647 EXPECT_EQ(levels[j], actualLevel);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800648 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800649 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800650}
651
652TEST_F(EqualizerAudioEffectHidlTest, GetBandCenterFrequencyAndRange) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800653 description("Verify that Equalizer effect reports adequate band frequency range");
654 uint16_t numBands = 0;
655 getNumBands(&numBands);
656 ASSERT_GT(numBands, 0);
657 for (uint16_t i = 0; i < numBands; ++i) {
658 uint32_t minFreq = 0xffffffff, centerFreq = 0xffffffff, maxFreq = 0xffffffff;
659 getBandFrequencyRange(i, &minFreq, &centerFreq, &maxFreq);
660 // Note: NXP legacy implementation reports "1" as upper bound for last band,
661 // so this check fails.
662 EXPECT_GE(maxFreq, centerFreq);
663 EXPECT_GE(centerFreq, minFreq);
664 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800665}
666
667TEST_F(EqualizerAudioEffectHidlTest, GetBandForFrequency) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800668 description("Verify that Equalizer effect supports GetBandForFrequency correctly");
669 uint16_t numBands = 0;
670 getNumBands(&numBands);
671 ASSERT_GT(numBands, 0);
672 for (uint16_t i = 0; i < numBands; ++i) {
673 uint32_t freqs[3]{0, 0, 0};
674 getBandFrequencyRange(i, &freqs[0], &freqs[1], &freqs[2]);
675 // NXP legacy implementation reports "1" as upper bound for last band, some
676 // of the checks fail.
677 for (size_t j = 0; j < ARRAY_SIZE(freqs); ++j) {
678 if (j == 0) {
679 freqs[j]++;
680 } // Min frequency is an open interval.
681 Result retval = Result::NOT_INITIALIZED;
682 uint16_t actualBand = numBands + 1;
683 Return<void> ret = equalizer->getBandForFrequency(freqs[j], [&](Result r, uint16_t b) {
684 retval = r;
685 if (retval == Result::OK) {
686 actualBand = b;
687 }
688 });
689 EXPECT_TRUE(ret.isOk());
690 EXPECT_EQ(Result::OK, retval);
691 EXPECT_EQ(i, actualBand) << "Frequency: " << freqs[j];
692 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800693 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800694}
695
696TEST_F(EqualizerAudioEffectHidlTest, GetPresetNames) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800697 description("Verify that Equalizer effect reports at least one preset");
698 size_t presetCount;
699 getPresetCount(&presetCount);
700 EXPECT_GT(presetCount, 0u);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800701}
702
703TEST_F(EqualizerAudioEffectHidlTest, GetSetCurrentPreset) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800704 description("Verify that manipulating the current preset for Equalizer effect");
705 size_t presetCount;
706 getPresetCount(&presetCount);
707 ASSERT_GT(presetCount, 0u);
708 for (uint16_t i = 0; i < presetCount; ++i) {
709 Return<Result> ret = equalizer->setCurrentPreset(i);
710 EXPECT_TRUE(ret.isOk());
711 EXPECT_EQ(Result::OK, ret);
712 Result retval = Result::NOT_INITIALIZED;
713 uint16_t actualPreset = 0xffff;
714 Return<void> ret2 = equalizer->getCurrentPreset([&](Result r, uint16_t p) {
715 retval = r;
716 if (retval == Result::OK) {
717 actualPreset = p;
718 }
719 });
720 EXPECT_TRUE(ret2.isOk());
721 EXPECT_EQ(Result::OK, retval);
722 EXPECT_EQ(i, actualPreset);
723 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800724}
725
726TEST_F(EqualizerAudioEffectHidlTest, GetSetAllProperties) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800727 description(
728 "Verify that setting band levels and presets works via Get / "
729 "SetAllProperties for Equalizer effect");
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800730 using AllProperties =
Mikhail Naganov00a44c02018-12-14 14:31:45 -0800731 ::android::hardware::audio::effect::CPP_VERSION::IEqualizerEffect::AllProperties;
Kevin Rocard55b10612018-11-12 12:33:16 -0800732 uint16_t numBands = 0;
733 getNumBands(&numBands);
734 ASSERT_GT(numBands, 0);
735 AllProperties props;
736 props.bandLevels.resize(numBands);
737 for (size_t i = 0; i < numBands; ++i) {
738 props.bandLevels[i] = 0;
739 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800740
Kevin Rocard55b10612018-11-12 12:33:16 -0800741 AllProperties actualProps;
742 Result retval = Result::NOT_INITIALIZED;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800743
Kevin Rocard55b10612018-11-12 12:33:16 -0800744 // Verify setting of the band levels via properties.
745 props.curPreset = -1;
746 Return<Result> ret = equalizer->setAllProperties(props);
747 EXPECT_TRUE(ret.isOk());
748 EXPECT_EQ(Result::OK, ret);
749 Return<void> ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800750 retval = r;
751 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800752 actualProps = p;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800753 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800754 });
755 EXPECT_TRUE(ret2.isOk());
756 EXPECT_EQ(Result::OK, retval);
757 EXPECT_EQ(props.bandLevels, actualProps.bandLevels);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800758
Kevin Rocard55b10612018-11-12 12:33:16 -0800759 // Verify setting of the current preset via properties.
760 props.curPreset = 0; // Assuming there is at least one preset.
761 ret = equalizer->setAllProperties(props);
762 EXPECT_TRUE(ret.isOk());
763 EXPECT_EQ(Result::OK, ret);
764 ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
765 retval = r;
766 if (retval == Result::OK) {
767 actualProps = p;
768 }
769 });
770 EXPECT_TRUE(ret2.isOk());
771 EXPECT_EQ(Result::OK, retval);
772 EXPECT_EQ(props.curPreset, actualProps.curPreset);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800773}
774
775// The main test class for Equalizer Audio Effect HIDL HAL.
776class LoudnessEnhancerAudioEffectHidlTest : public AudioEffectHidlTest {
Kevin Rocard55b10612018-11-12 12:33:16 -0800777 public:
778 void SetUp() override {
779 AudioEffectHidlTest::SetUp();
780 enhancer = ILoudnessEnhancerEffect::castFrom(effect);
781 ASSERT_NE(nullptr, enhancer.get());
782 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800783
Kevin Rocard55b10612018-11-12 12:33:16 -0800784 protected:
785 Uuid getEffectType() override { return LOUDNESS_ENHANCER_EFFECT_TYPE; }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800786
Kevin Rocard55b10612018-11-12 12:33:16 -0800787 sp<ILoudnessEnhancerEffect> enhancer;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800788};
789
790TEST_F(LoudnessEnhancerAudioEffectHidlTest, GetSetTargetGain) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800791 description(
792 "Verify that manipulating the target gain works for Loudness Enhancer "
793 "effect");
794 const int32_t gain = 100;
795 Return<Result> ret = enhancer->setTargetGain(gain);
796 EXPECT_TRUE(ret.isOk());
797 EXPECT_EQ(Result::OK, ret);
798 int32_t actualGain = 0;
799 Result retval;
800 Return<void> ret2 = enhancer->getTargetGain([&](Result r, int32_t g) {
801 retval = r;
802 if (retval == Result::OK) {
803 actualGain = g;
804 }
805 });
806 EXPECT_TRUE(ret2.isOk());
807 EXPECT_EQ(Result::OK, retval);
808 EXPECT_EQ(gain, actualGain);
Mikhail Naganovbf393172016-11-11 16:24:50 -0800809}
Zhuoyao Zhang7dc6ce82018-02-08 12:44:27 -0800810
811int main(int argc, char** argv) {
812 ::testing::AddGlobalTestEnvironment(AudioEffectsFactoryHidlEnvironment::Instance());
813 ::testing::InitGoogleTest(&argc, argv);
814 AudioEffectsFactoryHidlEnvironment::Instance()->init(&argc, argv);
815 int status = RUN_ALL_TESTS();
816 LOG(INFO) << "Test result = " << status;
817 return status;
818}