blob: 21f5eb563643fb567083ddea1ae62659c0d1ea0b [file] [log] [blame]
Shunkai Yaoea24c1a2022-09-28 17:39:23 +00001/*
2 * Copyright (C) 2022 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 <memory>
Shunkai Yao812d5b42022-11-16 18:08:50 +000018#include <set>
Shunkai Yaoea24c1a2022-09-28 17:39:23 +000019#include <string>
20#include <vector>
21
22#define LOG_TAG "VtsHalAudioEffectFactory"
23
24#include <aidl/Gtest.h>
25#include <aidl/Vintf.h>
26#include <android-base/logging.h>
27#include <android-base/properties.h>
28#include <android/binder_interface_utils.h>
29#include <android/binder_manager.h>
30#include <android/binder_process.h>
31
32#include <aidl/android/hardware/audio/effect/IFactory.h>
33
34#include "AudioHalBinderServiceUtil.h"
35#include "EffectFactoryHelper.h"
36#include "TestUtils.h"
37
38using namespace android;
39
40using aidl::android::hardware::audio::effect::Descriptor;
Shunkai Yao812d5b42022-11-16 18:08:50 +000041using aidl::android::hardware::audio::effect::IEffect;
Shunkai Yaoea24c1a2022-09-28 17:39:23 +000042using aidl::android::hardware::audio::effect::IFactory;
Shunkai Yao812d5b42022-11-16 18:08:50 +000043using aidl::android::hardware::audio::effect::kEffectNullUuid;
44using aidl::android::hardware::audio::effect::kEffectZeroUuid;
Shunkai Yao08b687d2022-10-13 21:11:11 +000045using aidl::android::hardware::audio::effect::Processing;
Shunkai Yao812d5b42022-11-16 18:08:50 +000046using aidl::android::media::audio::common::AudioSource;
47using aidl::android::media::audio::common::AudioStreamType;
Shunkai Yaoea24c1a2022-09-28 17:39:23 +000048using aidl::android::media::audio::common::AudioUuid;
49
50/// Effect factory testing.
51class EffectFactoryTest : public testing::TestWithParam<std::string> {
52 public:
Shunkai Yao812d5b42022-11-16 18:08:50 +000053 void SetUp() override {
54 mFactoryHelper = std::make_unique<EffectFactoryHelper>(GetParam());
55 connectAndGetFactory();
56 }
Shunkai Yaoea24c1a2022-09-28 17:39:23 +000057
Shunkai Yao812d5b42022-11-16 18:08:50 +000058 void TearDown() override {
59 for (auto& effect : mEffects) {
60 const auto status = mEffectFactory->destroyEffect(effect);
61 EXPECT_STATUS(EX_NONE, status);
62 }
63 }
Shunkai Yaoea24c1a2022-09-28 17:39:23 +000064
Shunkai Yao812d5b42022-11-16 18:08:50 +000065 std::unique_ptr<EffectFactoryHelper> mFactoryHelper;
66 std::shared_ptr<IFactory> mEffectFactory;
67 std::vector<std::shared_ptr<IEffect>> mEffects;
Shunkai Yaoc12e0822022-12-12 07:13:58 +000068 const Descriptor::Identity kNullId = {.uuid = kEffectNullUuid};
69 const Descriptor::Identity kZeroId = {.uuid = kEffectZeroUuid};
70 const Descriptor kNullDesc = {.common.id = kNullId};
71 const Descriptor kZeroDesc = {.common.id = kZeroId};
Shunkai Yaoea24c1a2022-09-28 17:39:23 +000072
Shunkai Yao812d5b42022-11-16 18:08:50 +000073 template <typename Functor>
74 void ForEachId(const std::vector<Descriptor::Identity> ids, Functor functor) {
75 for (const auto& id : ids) {
76 SCOPED_TRACE(id.toString());
77 functor(id);
78 }
79 }
80 template <typename Functor>
81 void ForEachEffect(std::vector<std::shared_ptr<IEffect>> effects, Functor functor) {
82 for (auto& effect : effects) {
83 functor(effect);
84 }
85 }
86
Shunkai Yaoc12e0822022-12-12 07:13:58 +000087 std::vector<std::shared_ptr<IEffect>> createWithDescs(
88 const std::vector<Descriptor> descs, const binder_status_t expectStatus = EX_NONE) {
Shunkai Yao812d5b42022-11-16 18:08:50 +000089 std::vector<std::shared_ptr<IEffect>> effects;
Shunkai Yaoc12e0822022-12-12 07:13:58 +000090 for (const auto& desc : descs) {
91 const auto& uuid = desc.common.id.uuid;
Shunkai Yao812d5b42022-11-16 18:08:50 +000092 std::shared_ptr<IEffect> effect;
Shunkai Yaoc12e0822022-12-12 07:13:58 +000093 EXPECT_STATUS(expectStatus, mEffectFactory->createEffect(uuid, &effect));
Shunkai Yao812d5b42022-11-16 18:08:50 +000094 if (expectStatus == EX_NONE) {
Shunkai Yaoc12e0822022-12-12 07:13:58 +000095 EXPECT_NE(effect, nullptr) << " null effect with uuid: " << uuid.toString();
Shunkai Yao812d5b42022-11-16 18:08:50 +000096 effects.push_back(std::move(effect));
97 }
98 }
99 return effects;
100 }
101 void destroyEffects(std::vector<std::shared_ptr<IEffect>> effects,
102 const binder_status_t expectStatus = EX_NONE) {
103 for (const auto& effect : effects) {
104 EXPECT_STATUS(expectStatus, mEffectFactory->destroyEffect(effect));
105 }
106 }
Shunkai Yaoc12e0822022-12-12 07:13:58 +0000107 void creatAndDestroyDescs(const std::vector<Descriptor> descs) {
108 for (const auto& desc : descs) {
109 auto effects = createWithDescs({desc});
Shunkai Yao812d5b42022-11-16 18:08:50 +0000110 ASSERT_NO_FATAL_FAILURE(destroyEffects(effects));
111 }
112 }
113 void connectAndGetFactory() {
114 ASSERT_NO_FATAL_FAILURE(mFactoryHelper->ConnectToFactoryService());
115 mEffectFactory = mFactoryHelper->GetFactory();
116 ASSERT_NE(mEffectFactory, nullptr);
117 }
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000118};
119
120TEST_P(EffectFactoryTest, SetupAndTearDown) {
121 // Intentionally empty test body.
122}
123
124TEST_P(EffectFactoryTest, CanBeRestarted) {
Shunkai Yao812d5b42022-11-16 18:08:50 +0000125 ASSERT_NO_FATAL_FAILURE(mFactoryHelper->RestartFactoryService());
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000126}
127
Shunkai Yao812d5b42022-11-16 18:08:50 +0000128/**
129 * @brief Check at least support list of effect must be supported by aosp:
130 * https://developer.android.com/reference/android/media/audiofx/AudioEffect
131 */
132TEST_P(EffectFactoryTest, ExpectAllAospEffectTypes) {
Shunkai Yaoc12e0822022-12-12 07:13:58 +0000133 std::vector<Descriptor> descs;
Shunkai Yao812d5b42022-11-16 18:08:50 +0000134 std::set<AudioUuid> typeUuidSet(
135 {aidl::android::hardware::audio::effect::kBassBoostTypeUUID,
136 aidl::android::hardware::audio::effect::kEqualizerTypeUUID,
137 aidl::android::hardware::audio::effect::kEnvReverbTypeUUID,
138 aidl::android::hardware::audio::effect::kPresetReverbTypeUUID,
139 aidl::android::hardware::audio::effect::kDynamicsProcessingTypeUUID,
140 aidl::android::hardware::audio::effect::kHapticGeneratorTypeUUID,
141 aidl::android::hardware::audio::effect::kVirtualizerTypeUUID});
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000142
Shunkai Yaoc12e0822022-12-12 07:13:58 +0000143 EXPECT_IS_OK(mEffectFactory->queryEffects(std::nullopt, std::nullopt, std::nullopt, &descs));
144 EXPECT_TRUE(descs.size() >= typeUuidSet.size());
145 for (const auto& desc : descs) {
146 typeUuidSet.erase(desc.common.id.type);
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000147 }
Shunkai Yao812d5b42022-11-16 18:08:50 +0000148 std::string msg = " missing type UUID:\n";
149 for (const auto& uuid : typeUuidSet) {
150 msg += (uuid.toString() + "\n");
151 }
152 SCOPED_TRACE(msg);
153 EXPECT_EQ(0UL, typeUuidSet.size());
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000154}
155
Shunkai Yao812d5b42022-11-16 18:08:50 +0000156TEST_P(EffectFactoryTest, QueryNullTypeUuid) {
Shunkai Yaoc12e0822022-12-12 07:13:58 +0000157 std::vector<Descriptor> descs;
158 EXPECT_IS_OK(mEffectFactory->queryEffects(kEffectNullUuid, std::nullopt, std::nullopt, &descs));
159 EXPECT_EQ(descs.size(), 0UL);
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000160}
161
Shunkai Yao812d5b42022-11-16 18:08:50 +0000162TEST_P(EffectFactoryTest, QueriedNullImplUuid) {
Shunkai Yaoc12e0822022-12-12 07:13:58 +0000163 std::vector<Descriptor> descs;
164 EXPECT_IS_OK(mEffectFactory->queryEffects(std::nullopt, kEffectNullUuid, std::nullopt, &descs));
165 EXPECT_EQ(descs.size(), 0UL);
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000166}
167
Shunkai Yao812d5b42022-11-16 18:08:50 +0000168TEST_P(EffectFactoryTest, QueriedNullProxyUuid) {
Shunkai Yaoc12e0822022-12-12 07:13:58 +0000169 std::vector<Descriptor> descs;
170 EXPECT_IS_OK(mEffectFactory->queryEffects(std::nullopt, std::nullopt, kEffectNullUuid, &descs));
171 EXPECT_EQ(descs.size(), 0UL);
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000172}
173
Shunkai Yao812d5b42022-11-16 18:08:50 +0000174// create all effects, and then destroy them all together
175TEST_P(EffectFactoryTest, CreateAndDestroyEffects) {
Shunkai Yaoc12e0822022-12-12 07:13:58 +0000176 std::vector<Descriptor> descs;
177 EXPECT_IS_OK(mEffectFactory->queryEffects(std::nullopt, std::nullopt, std::nullopt, &descs));
178 EXPECT_NE(descs.size(), 0UL);
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000179
Shunkai Yao812d5b42022-11-16 18:08:50 +0000180 std::vector<std::shared_ptr<IEffect>> effects;
Shunkai Yaoc12e0822022-12-12 07:13:58 +0000181 effects = createWithDescs(descs);
182 EXPECT_EQ(descs.size(), effects.size());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000183 destroyEffects(effects);
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000184}
185
186TEST_P(EffectFactoryTest, CreateMultipleInstanceOfSameEffect) {
Shunkai Yaoc12e0822022-12-12 07:13:58 +0000187 std::vector<Descriptor> descs;
188 EXPECT_IS_OK(mEffectFactory->queryEffects(std::nullopt, std::nullopt, std::nullopt, &descs));
189 EXPECT_NE(descs.size(), 0UL);
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000190
Shunkai Yaoc12e0822022-12-12 07:13:58 +0000191 std::vector<std::shared_ptr<IEffect>> effects = createWithDescs(descs);
192 EXPECT_EQ(descs.size(), effects.size());
193 std::vector<std::shared_ptr<IEffect>> effects2 = createWithDescs(descs);
194 EXPECT_EQ(descs.size(), effects2.size());
195 std::vector<std::shared_ptr<IEffect>> effects3 = createWithDescs(descs);
196 EXPECT_EQ(descs.size(), effects3.size());
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000197
Shunkai Yao812d5b42022-11-16 18:08:50 +0000198 destroyEffects(effects);
199 destroyEffects(effects2);
200 destroyEffects(effects3);
201}
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000202
Shunkai Yao812d5b42022-11-16 18:08:50 +0000203// create and destroy each effect one by one
204TEST_P(EffectFactoryTest, CreateAndDestroyEffectsOneByOne) {
Shunkai Yaoc12e0822022-12-12 07:13:58 +0000205 std::vector<Descriptor> descs;
206 EXPECT_IS_OK(mEffectFactory->queryEffects(std::nullopt, std::nullopt, std::nullopt, &descs));
207 EXPECT_NE(descs.size(), 0UL);
Shunkai Yao812d5b42022-11-16 18:08:50 +0000208
Shunkai Yaoc12e0822022-12-12 07:13:58 +0000209 creatAndDestroyDescs(descs);
Shunkai Yao812d5b42022-11-16 18:08:50 +0000210}
211
212// for each effect: repeat 3 times create and destroy
213TEST_P(EffectFactoryTest, CreateAndDestroyRepeat) {
Shunkai Yaoc12e0822022-12-12 07:13:58 +0000214 std::vector<Descriptor> descs;
215 EXPECT_IS_OK(mEffectFactory->queryEffects(std::nullopt, std::nullopt, std::nullopt, &descs));
216 EXPECT_NE(descs.size(), 0UL);
Shunkai Yao812d5b42022-11-16 18:08:50 +0000217
Shunkai Yaoc12e0822022-12-12 07:13:58 +0000218 creatAndDestroyDescs(descs);
219 creatAndDestroyDescs(descs);
220 creatAndDestroyDescs(descs);
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000221}
222
223// Expect EX_ILLEGAL_ARGUMENT when create with invalid UUID.
224TEST_P(EffectFactoryTest, CreateWithInvalidUuid) {
Shunkai Yaoc12e0822022-12-12 07:13:58 +0000225 std::vector<Descriptor> descs = {kNullDesc, kZeroDesc};
226 auto effects = createWithDescs(descs, EX_ILLEGAL_ARGUMENT);
Shunkai Yao812d5b42022-11-16 18:08:50 +0000227 EXPECT_EQ(effects.size(), 0UL);
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000228}
229
230// Expect EX_ILLEGAL_ARGUMENT when destroy null interface.
231TEST_P(EffectFactoryTest, DestroyWithInvalidInterface) {
232 std::shared_ptr<IEffect> spDummyEffect(nullptr);
Shunkai Yao812d5b42022-11-16 18:08:50 +0000233 destroyEffects({spDummyEffect}, EX_ILLEGAL_ARGUMENT);
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000234}
235
Shunkai Yao812d5b42022-11-16 18:08:50 +0000236// Same descriptor ID should work after service restart.
237TEST_P(EffectFactoryTest, CreateDestroyWithRestart) {
Shunkai Yaoc12e0822022-12-12 07:13:58 +0000238 std::vector<Descriptor> descs;
239 EXPECT_IS_OK(mEffectFactory->queryEffects(std::nullopt, std::nullopt, std::nullopt, &descs));
240 EXPECT_NE(descs.size(), 0UL);
241 creatAndDestroyDescs(descs);
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000242
Shunkai Yao812d5b42022-11-16 18:08:50 +0000243 mFactoryHelper->RestartFactoryService();
244
245 connectAndGetFactory();
Shunkai Yaoc12e0822022-12-12 07:13:58 +0000246 creatAndDestroyDescs(descs);
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000247}
248
Shunkai Yao812d5b42022-11-16 18:08:50 +0000249// Effect handle invalid after restart.
250TEST_P(EffectFactoryTest, EffectInvalidAfterRestart) {
Shunkai Yaoc12e0822022-12-12 07:13:58 +0000251 std::vector<Descriptor> descs;
252 EXPECT_IS_OK(mEffectFactory->queryEffects(std::nullopt, std::nullopt, std::nullopt, &descs));
253 EXPECT_NE(descs.size(), 0UL);
254 std::vector<std::shared_ptr<IEffect>> effects = createWithDescs(descs);
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000255
Shunkai Yao812d5b42022-11-16 18:08:50 +0000256 ASSERT_NO_FATAL_FAILURE(mFactoryHelper->RestartFactoryService());
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000257
Shunkai Yao812d5b42022-11-16 18:08:50 +0000258 connectAndGetFactory();
259 destroyEffects(effects, EX_ILLEGAL_ARGUMENT);
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000260}
261
Shunkai Yao812d5b42022-11-16 18:08:50 +0000262// expect no error with the queryProcessing interface, but don't check number of processing
Shunkai Yao08b687d2022-10-13 21:11:11 +0000263TEST_P(EffectFactoryTest, QueryProcess) {
264 std::vector<Processing> processing;
Shunkai Yao812d5b42022-11-16 18:08:50 +0000265 EXPECT_IS_OK(mEffectFactory->queryProcessing(std::nullopt, &processing));
266
267 Processing::Type streamType =
268 Processing::Type::make<Processing::Type::streamType>(AudioStreamType::SYSTEM);
269 std::vector<Processing> processingFilteredByStream;
270 EXPECT_IS_OK(mEffectFactory->queryProcessing(streamType, &processingFilteredByStream));
271
272 Processing::Type source =
273 Processing::Type::make<Processing::Type::source>(AudioSource::DEFAULT);
274 std::vector<Processing> processingFilteredBySource;
275 EXPECT_IS_OK(mEffectFactory->queryProcessing(source, &processingFilteredBySource));
276
277 EXPECT_TRUE(processing.size() >= processingFilteredByStream.size());
278 EXPECT_TRUE(processing.size() >= processingFilteredBySource.size());
Shunkai Yao08b687d2022-10-13 21:11:11 +0000279}
280
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000281INSTANTIATE_TEST_SUITE_P(EffectFactoryTest, EffectFactoryTest,
282 testing::ValuesIn(android::getAidlHalInstanceNames(IFactory::descriptor)),
283 android::PrintInstanceNameToString);
284GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EffectFactoryTest);
285
286int main(int argc, char** argv) {
287 ::testing::InitGoogleTest(&argc, argv);
288 ABinderProcess_setThreadPoolMaxThreadCount(1);
289 ABinderProcess_startThreadPool();
290 return RUN_ALL_TESTS();
291}