blob: 8b5eb13cdb2cdf871c47cfe577eb8aac93561b56 [file] [log] [blame]
Shunkai Yao67b1be62022-07-13 05:01:42 +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
Shunkai Yao45905172022-08-24 18:14:02 +000017#include <memory>
Shunkai Yao67b1be62022-07-13 05:01:42 +000018#include <string>
Shunkai Yao45905172022-08-24 18:14:02 +000019#include <unordered_map>
20#include <unordered_set>
21#include <vector>
Shunkai Yao67b1be62022-07-13 05:01:42 +000022
23#define LOG_TAG "VtsHalAudioEffect"
24
25#include <aidl/Gtest.h>
26#include <aidl/Vintf.h>
27#include <android-base/logging.h>
28#include <android-base/properties.h>
29#include <android/binder_interface_utils.h>
30#include <android/binder_manager.h>
31#include <android/binder_process.h>
32
33#include <aidl/android/hardware/audio/effect/IFactory.h>
34
35#include "AudioHalBinderServiceUtil.h"
Shunkai Yao121c6dd2022-09-21 23:42:08 +000036#include "TestUtils.h"
Shunkai Yao67b1be62022-07-13 05:01:42 +000037
38using namespace android;
39
40using ndk::ScopedAStatus;
41
42using aidl::android::hardware::audio::effect::Descriptor;
Shunkai Yao45905172022-08-24 18:14:02 +000043using aidl::android::hardware::audio::effect::IEffect;
Shunkai Yao67b1be62022-07-13 05:01:42 +000044using aidl::android::hardware::audio::effect::IFactory;
45using aidl::android::media::audio::common::AudioUuid;
46
Shunkai Yao45905172022-08-24 18:14:02 +000047class EffectFactoryHelper {
Shunkai Yao67b1be62022-07-13 05:01:42 +000048 public:
Shunkai Yao121c6dd2022-09-21 23:42:08 +000049 explicit EffectFactoryHelper(const std::string& name) : mServiceName(name) {}
Shunkai Yao67b1be62022-07-13 05:01:42 +000050
Shunkai Yao45905172022-08-24 18:14:02 +000051 void ConnectToFactoryService() {
52 mEffectFactory = IFactory::fromBinder(binderUtil.connectToService(mServiceName));
53 ASSERT_NE(mEffectFactory, nullptr);
Shunkai Yao67b1be62022-07-13 05:01:42 +000054 }
55
Shunkai Yao45905172022-08-24 18:14:02 +000056 void RestartFactoryService() {
57 ASSERT_NE(mEffectFactory, nullptr);
58 mEffectFactory = IFactory::fromBinder(binderUtil.restartService());
59 ASSERT_NE(mEffectFactory, nullptr);
Shunkai Yao67b1be62022-07-13 05:01:42 +000060 }
61
Shunkai Yao45905172022-08-24 18:14:02 +000062 void QueryAllEffects() {
63 EXPECT_NE(mEffectFactory, nullptr);
Shunkai Yao121c6dd2022-09-21 23:42:08 +000064 EXPECT_IS_OK(mEffectFactory->queryEffects(std::nullopt, std::nullopt, &mCompleteIds));
Shunkai Yao45905172022-08-24 18:14:02 +000065 }
66
67 void QueryEffects(const std::optional<AudioUuid>& in_type,
68 const std::optional<AudioUuid>& in_instance,
69 std::vector<Descriptor::Identity>* _aidl_return) {
70 EXPECT_NE(mEffectFactory, nullptr);
Shunkai Yao121c6dd2022-09-21 23:42:08 +000071 EXPECT_IS_OK(mEffectFactory->queryEffects(in_type, in_instance, _aidl_return));
Shunkai Yao45905172022-08-24 18:14:02 +000072 mIds = *_aidl_return;
73 }
74
75 void CreateEffects() {
76 EXPECT_NE(mEffectFactory, nullptr);
Shunkai Yao45905172022-08-24 18:14:02 +000077 for (const auto& id : mIds) {
78 std::shared_ptr<IEffect> effect;
Shunkai Yao121c6dd2022-09-21 23:42:08 +000079 EXPECT_IS_OK(mEffectFactory->createEffect(id.uuid, &effect));
Shunkai Yao45905172022-08-24 18:14:02 +000080 EXPECT_NE(effect, nullptr) << id.toString();
81 mEffectIdMap[effect] = id;
82 }
83 }
84
85 void DestroyEffects() {
86 EXPECT_NE(mEffectFactory, nullptr);
Shunkai Yao45905172022-08-24 18:14:02 +000087 for (const auto& it : mEffectIdMap) {
Shunkai Yao121c6dd2022-09-21 23:42:08 +000088 EXPECT_IS_OK(mEffectFactory->destroyEffect(it.first));
Shunkai Yao45905172022-08-24 18:14:02 +000089 }
90 mEffectIdMap.clear();
91 }
92
93 std::shared_ptr<IFactory> GetFactory() { return mEffectFactory; }
94 const std::vector<Descriptor::Identity>& GetEffectIds() { return mIds; }
95 const std::vector<Descriptor::Identity>& GetCompleteEffectIdList() { return mCompleteIds; }
96 const std::unordered_map<std::shared_ptr<IEffect>, Descriptor::Identity>& GetEffectMap() {
97 return mEffectIdMap;
98 }
99
100 private:
101 std::shared_ptr<IFactory> mEffectFactory;
102 std::string mServiceName;
Shunkai Yao67b1be62022-07-13 05:01:42 +0000103 AudioHalBinderServiceUtil binderUtil;
Shunkai Yao45905172022-08-24 18:14:02 +0000104 std::vector<Descriptor::Identity> mIds;
105 std::vector<Descriptor::Identity> mCompleteIds;
106 std::unordered_map<std::shared_ptr<IEffect>, Descriptor::Identity> mEffectIdMap;
107};
108
109/// Effect factory testing.
110class EffectFactoryTest : public testing::TestWithParam<std::string> {
111 public:
112 void SetUp() override { ASSERT_NO_FATAL_FAILURE(mFactory.ConnectToFactoryService()); }
113
114 void TearDown() override { mFactory.DestroyEffects(); }
115
116 EffectFactoryHelper mFactory = EffectFactoryHelper(GetParam());
117
Shunkai Yao67b1be62022-07-13 05:01:42 +0000118 // TODO: these UUID can get from config file
119 // ec7178ec-e5e1-4432-a3f4-4657e6795210
120 const AudioUuid nullUuid = {static_cast<int32_t>(0xec7178ec),
121 0xe5e1,
122 0x4432,
123 0xa3f4,
124 {0x46, 0x57, 0xe6, 0x79, 0x52, 0x10}};
125 const AudioUuid zeroUuid = {
126 static_cast<int32_t>(0x0), 0x0, 0x0, 0x0, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}};
127};
128
Shunkai Yao45905172022-08-24 18:14:02 +0000129TEST_P(EffectFactoryTest, SetupAndTearDown) {
Shunkai Yao67b1be62022-07-13 05:01:42 +0000130 // Intentionally empty test body.
131}
132
Shunkai Yao45905172022-08-24 18:14:02 +0000133TEST_P(EffectFactoryTest, CanBeRestarted) {
134 ASSERT_NO_FATAL_FAILURE(mFactory.RestartFactoryService());
Shunkai Yao67b1be62022-07-13 05:01:42 +0000135}
136
Shunkai Yao45905172022-08-24 18:14:02 +0000137TEST_P(EffectFactoryTest, QueriedDescriptorList) {
Shunkai Yao67b1be62022-07-13 05:01:42 +0000138 std::vector<Descriptor::Identity> descriptors;
Shunkai Yao45905172022-08-24 18:14:02 +0000139 mFactory.QueryEffects(std::nullopt, std::nullopt, &descriptors);
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000140 EXPECT_NE(descriptors.size(), 0UL);
Shunkai Yao67b1be62022-07-13 05:01:42 +0000141}
142
Shunkai Yao45905172022-08-24 18:14:02 +0000143TEST_P(EffectFactoryTest, DescriptorUUIDNotNull) {
Shunkai Yao67b1be62022-07-13 05:01:42 +0000144 std::vector<Descriptor::Identity> descriptors;
Shunkai Yao45905172022-08-24 18:14:02 +0000145 mFactory.QueryEffects(std::nullopt, std::nullopt, &descriptors);
Shunkai Yao67b1be62022-07-13 05:01:42 +0000146 // TODO: Factory eventually need to return the full list of MUST supported AOSP effects.
147 for (auto& desc : descriptors) {
148 EXPECT_NE(desc.type, zeroUuid);
149 EXPECT_NE(desc.uuid, zeroUuid);
150 }
151}
152
Shunkai Yao45905172022-08-24 18:14:02 +0000153TEST_P(EffectFactoryTest, QueriedDescriptorNotExistType) {
Shunkai Yao67b1be62022-07-13 05:01:42 +0000154 std::vector<Descriptor::Identity> descriptors;
Shunkai Yao45905172022-08-24 18:14:02 +0000155 mFactory.QueryEffects(nullUuid, std::nullopt, &descriptors);
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000156 EXPECT_EQ(descriptors.size(), 0UL);
Shunkai Yao67b1be62022-07-13 05:01:42 +0000157}
158
Shunkai Yao45905172022-08-24 18:14:02 +0000159TEST_P(EffectFactoryTest, QueriedDescriptorNotExistInstance) {
Shunkai Yao67b1be62022-07-13 05:01:42 +0000160 std::vector<Descriptor::Identity> descriptors;
Shunkai Yao45905172022-08-24 18:14:02 +0000161 mFactory.QueryEffects(std::nullopt, nullUuid, &descriptors);
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000162 EXPECT_EQ(descriptors.size(), 0UL);
Shunkai Yao67b1be62022-07-13 05:01:42 +0000163}
164
Shunkai Yao45905172022-08-24 18:14:02 +0000165TEST_P(EffectFactoryTest, CreateAndDestroyRepeat) {
166 std::vector<Descriptor::Identity> descriptors;
167 mFactory.QueryEffects(std::nullopt, std::nullopt, &descriptors);
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000168 auto numIds = mFactory.GetEffectIds().size();
169 EXPECT_NE(numIds, 0UL);
Shunkai Yao45905172022-08-24 18:14:02 +0000170
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000171 EXPECT_EQ(mFactory.GetEffectMap().size(), 0UL);
Shunkai Yao45905172022-08-24 18:14:02 +0000172 mFactory.CreateEffects();
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000173 EXPECT_EQ(mFactory.GetEffectMap().size(), numIds);
Shunkai Yao45905172022-08-24 18:14:02 +0000174 mFactory.DestroyEffects();
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000175 EXPECT_EQ(mFactory.GetEffectMap().size(), 0UL);
Shunkai Yao45905172022-08-24 18:14:02 +0000176
177 // Create and destroy again
178 mFactory.CreateEffects();
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000179 EXPECT_EQ(mFactory.GetEffectMap().size(), numIds);
Shunkai Yao45905172022-08-24 18:14:02 +0000180 mFactory.DestroyEffects();
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000181 EXPECT_EQ(mFactory.GetEffectMap().size(), 0UL);
Shunkai Yao45905172022-08-24 18:14:02 +0000182}
183
184TEST_P(EffectFactoryTest, CreateMultipleInstanceOfSameEffect) {
185 std::vector<Descriptor::Identity> descriptors;
186 mFactory.QueryEffects(std::nullopt, std::nullopt, &descriptors);
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000187 auto numIds = mFactory.GetEffectIds().size();
188 EXPECT_NE(numIds, 0UL);
Shunkai Yao45905172022-08-24 18:14:02 +0000189
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000190 EXPECT_EQ(mFactory.GetEffectMap().size(), 0UL);
Shunkai Yao45905172022-08-24 18:14:02 +0000191 mFactory.CreateEffects();
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000192 EXPECT_EQ(mFactory.GetEffectMap().size(), numIds);
Shunkai Yao45905172022-08-24 18:14:02 +0000193 // Create effect instances of same implementation
194 mFactory.CreateEffects();
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000195 EXPECT_EQ(mFactory.GetEffectMap().size(), 2 * numIds);
Shunkai Yao45905172022-08-24 18:14:02 +0000196
197 mFactory.CreateEffects();
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000198 EXPECT_EQ(mFactory.GetEffectMap().size(), 3 * numIds);
Shunkai Yao45905172022-08-24 18:14:02 +0000199
200 mFactory.DestroyEffects();
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000201 EXPECT_EQ(mFactory.GetEffectMap().size(), 0UL);
Shunkai Yao45905172022-08-24 18:14:02 +0000202}
203
204INSTANTIATE_TEST_SUITE_P(EffectFactoryTest, EffectFactoryTest,
Shunkai Yao67b1be62022-07-13 05:01:42 +0000205 testing::ValuesIn(android::getAidlHalInstanceNames(IFactory::descriptor)),
206 android::PrintInstanceNameToString);
Shunkai Yao45905172022-08-24 18:14:02 +0000207GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EffectFactoryTest);
208
209/// Effect testing.
210class AudioEffect : public testing::TestWithParam<std::string> {
211 public:
212 void SetUp() override {
213 ASSERT_NO_FATAL_FAILURE(mFactory.ConnectToFactoryService());
214 ASSERT_NO_FATAL_FAILURE(mFactory.CreateEffects());
215 }
216
217 void TearDown() override {
218 CloseEffects();
219 ASSERT_NO_FATAL_FAILURE(mFactory.DestroyEffects());
220 }
221
222 void OpenEffects() {
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000223 auto open = [](const std::shared_ptr<IEffect>& effect) { EXPECT_IS_OK(effect->open()); };
Shunkai Yao45905172022-08-24 18:14:02 +0000224 EXPECT_NO_FATAL_FAILURE(ForEachEffect(open));
225 }
226
227 void CloseEffects() {
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000228 auto close = [](const std::shared_ptr<IEffect>& effect) { EXPECT_IS_OK(effect->close()); };
Shunkai Yao45905172022-08-24 18:14:02 +0000229 EXPECT_NO_FATAL_FAILURE(ForEachEffect(close));
230 }
231
232 void GetEffectDescriptors() {
233 auto get = [](const std::shared_ptr<IEffect>& effect) {
234 Descriptor desc;
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000235 EXPECT_IS_OK(effect->getDescriptor(&desc));
Shunkai Yao45905172022-08-24 18:14:02 +0000236 };
237 EXPECT_NO_FATAL_FAILURE(ForEachEffect(get));
238 }
239
240 template <typename Functor>
241 void ForEachEffect(Functor functor) {
242 auto effectMap = mFactory.GetEffectMap();
Shunkai Yao45905172022-08-24 18:14:02 +0000243 for (const auto& it : effectMap) {
244 SCOPED_TRACE(it.second.toString());
245 functor(it.first);
246 }
247 }
248
249 EffectFactoryHelper mFactory = EffectFactoryHelper(GetParam());
250};
251
252TEST_P(AudioEffect, OpenEffectTest) {
253 EXPECT_NO_FATAL_FAILURE(OpenEffects());
254}
255
256TEST_P(AudioEffect, OpenAndCloseEffect) {
257 EXPECT_NO_FATAL_FAILURE(OpenEffects());
258 EXPECT_NO_FATAL_FAILURE(CloseEffects());
259}
260
261TEST_P(AudioEffect, CloseUnopenedEffectTest) {
262 EXPECT_NO_FATAL_FAILURE(CloseEffects());
263}
264
265TEST_P(AudioEffect, DoubleOpenCloseEffects) {
266 EXPECT_NO_FATAL_FAILURE(OpenEffects());
267 EXPECT_NO_FATAL_FAILURE(CloseEffects());
268 EXPECT_NO_FATAL_FAILURE(OpenEffects());
269 EXPECT_NO_FATAL_FAILURE(CloseEffects());
270
271 EXPECT_NO_FATAL_FAILURE(OpenEffects());
272 EXPECT_NO_FATAL_FAILURE(OpenEffects());
273 EXPECT_NO_FATAL_FAILURE(CloseEffects());
274
275 EXPECT_NO_FATAL_FAILURE(OpenEffects());
276 EXPECT_NO_FATAL_FAILURE(CloseEffects());
277 EXPECT_NO_FATAL_FAILURE(CloseEffects());
278}
279
280TEST_P(AudioEffect, GetDescriptors) {
281 EXPECT_NO_FATAL_FAILURE(GetEffectDescriptors());
282}
283
284TEST_P(AudioEffect, DescriptorIdExistAndUnique) {
285 auto checker = [&](const std::shared_ptr<IEffect>& effect) {
286 Descriptor desc;
287 std::vector<Descriptor::Identity> idList;
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000288 EXPECT_IS_OK(effect->getDescriptor(&desc));
Shunkai Yao45905172022-08-24 18:14:02 +0000289 mFactory.QueryEffects(desc.common.id.type, desc.common.id.uuid, &idList);
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000290 EXPECT_EQ(idList.size(), 1UL);
Shunkai Yao45905172022-08-24 18:14:02 +0000291 };
292 EXPECT_NO_FATAL_FAILURE(ForEachEffect(checker));
293
294 // Check unique with a set
295 auto stringHash = [](const Descriptor::Identity& id) {
296 return std::hash<std::string>()(id.toString());
297 };
298 auto vec = mFactory.GetCompleteEffectIdList();
299 std::unordered_set<Descriptor::Identity, decltype(stringHash)> idSet(0, stringHash);
300 for (auto it : vec) {
Shunkai Yao121c6dd2022-09-21 23:42:08 +0000301 EXPECT_EQ(idSet.count(it), 0UL);
Shunkai Yao45905172022-08-24 18:14:02 +0000302 idSet.insert(it);
303 }
304}
305
306INSTANTIATE_TEST_SUITE_P(AudioEffectTest, AudioEffect,
307 testing::ValuesIn(android::getAidlHalInstanceNames(IFactory::descriptor)),
308 android::PrintInstanceNameToString);
309GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffect);
Shunkai Yao67b1be62022-07-13 05:01:42 +0000310
311int main(int argc, char** argv) {
312 ::testing::InitGoogleTest(&argc, argv);
313 ABinderProcess_setThreadPoolMaxThreadCount(1);
314 ABinderProcess_startThreadPool();
315 return RUN_ALL_TESTS();
Shunkai Yao45905172022-08-24 18:14:02 +0000316}