1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2020 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker *
4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker *
8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker *
10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker */
16*4d7e907cSAndroid Build Coastguard Worker #define LOG_TAG "VtsAidlHalAudioControlTest"
17*4d7e907cSAndroid Build Coastguard Worker
18*4d7e907cSAndroid Build Coastguard Worker #include <aidl/Gtest.h>
19*4d7e907cSAndroid Build Coastguard Worker #include <aidl/Vintf.h>
20*4d7e907cSAndroid Build Coastguard Worker #include <gmock/gmock.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <utils/String16.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <set>
23*4d7e907cSAndroid Build Coastguard Worker
24*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/automotive/audiocontrol/BnAudioGainCallback.h>
25*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/automotive/audiocontrol/BnFocusListener.h>
26*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/automotive/audiocontrol/BnModuleChangeCallback.h>
27*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/automotive/audiocontrol/IAudioControl.h>
28*4d7e907cSAndroid Build Coastguard Worker #include <android/log.h>
29*4d7e907cSAndroid Build Coastguard Worker #include <android/media/audio/common/AudioHalProductStrategy.h>
30*4d7e907cSAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
31*4d7e907cSAndroid Build Coastguard Worker #include <binder/ProcessState.h>
32*4d7e907cSAndroid Build Coastguard Worker #include <include/AudioControlTestUtils.h>
33*4d7e907cSAndroid Build Coastguard Worker
34*4d7e907cSAndroid Build Coastguard Worker using android::ProcessState;
35*4d7e907cSAndroid Build Coastguard Worker using android::sp;
36*4d7e907cSAndroid Build Coastguard Worker using android::String16;
37*4d7e907cSAndroid Build Coastguard Worker using android::binder::Status;
38*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::AudioDeviceConfiguration;
39*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::AudioFadeConfiguration;
40*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::AudioFocusChange;
41*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::AudioGainConfigInfo;
42*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::AudioZone;
43*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::AudioZoneConfig;
44*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::AudioZoneContextInfo;
45*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::AudioZoneFadeConfiguration;
46*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::BnAudioGainCallback;
47*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::BnFocusListener;
48*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::BnModuleChangeCallback;
49*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::DeviceToContextEntry;
50*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::DuckingInfo;
51*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::FadeConfiguration;
52*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::IAudioControl;
53*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::IModuleChangeCallback;
54*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::MutingInfo;
55*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::Reasons;
56*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::VolumeActivationConfiguration;
57*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::VolumeActivationConfigurationEntry;
58*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::VolumeGroupConfig;
59*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::RoutingDeviceConfiguration::
60*4d7e907cSAndroid Build Coastguard Worker CONFIGURABLE_AUDIO_ENGINE_ROUTING;
61*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::RoutingDeviceConfiguration::
62*4d7e907cSAndroid Build Coastguard Worker DEFAULT_AUDIO_ROUTING;
63*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::VolumeActivationConfigurationEntry::
64*4d7e907cSAndroid Build Coastguard Worker DEFAULT_MAX_ACTIVATION_VALUE;
65*4d7e907cSAndroid Build Coastguard Worker using android::hardware::automotive::audiocontrol::VolumeActivationConfigurationEntry::
66*4d7e907cSAndroid Build Coastguard Worker DEFAULT_MIN_ACTIVATION_VALUE;
67*4d7e907cSAndroid Build Coastguard Worker using android::media::audio::common::AudioHalProductStrategy;
68*4d7e907cSAndroid Build Coastguard Worker
69*4d7e907cSAndroid Build Coastguard Worker using ::testing::AnyOf;
70*4d7e907cSAndroid Build Coastguard Worker using ::testing::Eq;
71*4d7e907cSAndroid Build Coastguard Worker
72*4d7e907cSAndroid Build Coastguard Worker using ::testing::Not;
73*4d7e907cSAndroid Build Coastguard Worker using ::testing::UnorderedElementsAreArray;
74*4d7e907cSAndroid Build Coastguard Worker
75*4d7e907cSAndroid Build Coastguard Worker using android::internal::ToString;
76*4d7e907cSAndroid Build Coastguard Worker
77*4d7e907cSAndroid Build Coastguard Worker #include "android_audio_policy_configuration_V7_0.h"
78*4d7e907cSAndroid Build Coastguard Worker
79*4d7e907cSAndroid Build Coastguard Worker namespace xsd {
80*4d7e907cSAndroid Build Coastguard Worker using namespace android::audio::policy::configuration::V7_0;
81*4d7e907cSAndroid Build Coastguard Worker }
82*4d7e907cSAndroid Build Coastguard Worker
83*4d7e907cSAndroid Build Coastguard Worker namespace audiohalcommon = android::hardware::audio::common;
84*4d7e907cSAndroid Build Coastguard Worker namespace audiomediacommon = android::media::audio::common;
85*4d7e907cSAndroid Build Coastguard Worker namespace testutils = android::hardware::audiocontrol::testutils;
86*4d7e907cSAndroid Build Coastguard Worker
87*4d7e907cSAndroid Build Coastguard Worker namespace {
88*4d7e907cSAndroid Build Coastguard Worker constexpr int32_t kAidlVersionThree = 3;
89*4d7e907cSAndroid Build Coastguard Worker constexpr int32_t kAidlVersionFive = 5;
90*4d7e907cSAndroid Build Coastguard Worker
hasValidVolumeGroupActivation(const VolumeActivationConfiguration & activation,std::string & message)91*4d7e907cSAndroid Build Coastguard Worker bool hasValidVolumeGroupActivation(const VolumeActivationConfiguration& activation,
92*4d7e907cSAndroid Build Coastguard Worker std::string& message) {
93*4d7e907cSAndroid Build Coastguard Worker if (activation.volumeActivationEntries.empty()) {
94*4d7e907cSAndroid Build Coastguard Worker message = "Volume group activation must have at least one volume activation entry";
95*4d7e907cSAndroid Build Coastguard Worker return false;
96*4d7e907cSAndroid Build Coastguard Worker }
97*4d7e907cSAndroid Build Coastguard Worker for (const auto& entry : activation.volumeActivationEntries) {
98*4d7e907cSAndroid Build Coastguard Worker int32_t max = entry.maxActivationVolumePercentage;
99*4d7e907cSAndroid Build Coastguard Worker int32_t min = entry.minActivationVolumePercentage;
100*4d7e907cSAndroid Build Coastguard Worker if (min > DEFAULT_MAX_ACTIVATION_VALUE || min < DEFAULT_MIN_ACTIVATION_VALUE) {
101*4d7e907cSAndroid Build Coastguard Worker message = "Invalid minActivationVolumePercentage, must be between " +
102*4d7e907cSAndroid Build Coastguard Worker std::to_string(DEFAULT_MIN_ACTIVATION_VALUE) + " and " +
103*4d7e907cSAndroid Build Coastguard Worker std::to_string(DEFAULT_MAX_ACTIVATION_VALUE);
104*4d7e907cSAndroid Build Coastguard Worker return false;
105*4d7e907cSAndroid Build Coastguard Worker }
106*4d7e907cSAndroid Build Coastguard Worker if (max > DEFAULT_MAX_ACTIVATION_VALUE || max < DEFAULT_MIN_ACTIVATION_VALUE) {
107*4d7e907cSAndroid Build Coastguard Worker message = "Invalid maxActivationVolumePercentage, must be between " +
108*4d7e907cSAndroid Build Coastguard Worker std::to_string(DEFAULT_MIN_ACTIVATION_VALUE) + " and " +
109*4d7e907cSAndroid Build Coastguard Worker std::to_string(DEFAULT_MAX_ACTIVATION_VALUE);
110*4d7e907cSAndroid Build Coastguard Worker return false;
111*4d7e907cSAndroid Build Coastguard Worker }
112*4d7e907cSAndroid Build Coastguard Worker if (min >= max) {
113*4d7e907cSAndroid Build Coastguard Worker message =
114*4d7e907cSAndroid Build Coastguard Worker "Invalid maxActivationVolumePercentage and minActivationVolumePercentage "
115*4d7e907cSAndroid Build Coastguard Worker "combination, minActivationVolumePercentage must be less than "
116*4d7e907cSAndroid Build Coastguard Worker "maxActivationVolumePercentage";
117*4d7e907cSAndroid Build Coastguard Worker return false;
118*4d7e907cSAndroid Build Coastguard Worker }
119*4d7e907cSAndroid Build Coastguard Worker }
120*4d7e907cSAndroid Build Coastguard Worker return true;
121*4d7e907cSAndroid Build Coastguard Worker }
122*4d7e907cSAndroid Build Coastguard Worker
hasValidAudioRoute(const DeviceToContextEntry & entry,std::string & message,std::set<std::string> & groupDevices)123*4d7e907cSAndroid Build Coastguard Worker bool hasValidAudioRoute(const DeviceToContextEntry& entry, std::string& message,
124*4d7e907cSAndroid Build Coastguard Worker std::set<std::string>& groupDevices) {
125*4d7e907cSAndroid Build Coastguard Worker if (entry.contextNames.empty()) {
126*4d7e907cSAndroid Build Coastguard Worker message = " Contexts can not be empty for DeviceToContextEntry";
127*4d7e907cSAndroid Build Coastguard Worker return false;
128*4d7e907cSAndroid Build Coastguard Worker }
129*4d7e907cSAndroid Build Coastguard Worker std::set<std::string> contextInRoute;
130*4d7e907cSAndroid Build Coastguard Worker for (const auto& context : entry.contextNames) {
131*4d7e907cSAndroid Build Coastguard Worker std::string contextString = ToString(context);
132*4d7e907cSAndroid Build Coastguard Worker if (contextInRoute.contains(contextString)) {
133*4d7e907cSAndroid Build Coastguard Worker message = " Context " + contextString + " repeats for DeviceToContextEntry";
134*4d7e907cSAndroid Build Coastguard Worker return false;
135*4d7e907cSAndroid Build Coastguard Worker }
136*4d7e907cSAndroid Build Coastguard Worker groupDevices.insert(contextString);
137*4d7e907cSAndroid Build Coastguard Worker }
138*4d7e907cSAndroid Build Coastguard Worker audiomediacommon::AudioDeviceDescription description;
139*4d7e907cSAndroid Build Coastguard Worker if (!testutils::getAudioPortDeviceDescriptor(entry.device, description)) {
140*4d7e907cSAndroid Build Coastguard Worker message = " DeviceToContextEntry must have a valid device port";
141*4d7e907cSAndroid Build Coastguard Worker return false;
142*4d7e907cSAndroid Build Coastguard Worker }
143*4d7e907cSAndroid Build Coastguard Worker // BUS type also has empty connection
144*4d7e907cSAndroid Build Coastguard Worker // Note: OUT_BUS is also mapped to OUT_DEVICE
145*4d7e907cSAndroid Build Coastguard Worker if (description.type != audiomediacommon::AudioDeviceType::OUT_BUS &&
146*4d7e907cSAndroid Build Coastguard Worker !description.connection.empty()) {
147*4d7e907cSAndroid Build Coastguard Worker return true;
148*4d7e907cSAndroid Build Coastguard Worker }
149*4d7e907cSAndroid Build Coastguard Worker std::string address;
150*4d7e907cSAndroid Build Coastguard Worker if (!testutils::getAddressForAudioPort(entry.device, address) || address.empty()) {
151*4d7e907cSAndroid Build Coastguard Worker message = " Address can not be empty for BUS devices";
152*4d7e907cSAndroid Build Coastguard Worker return false;
153*4d7e907cSAndroid Build Coastguard Worker }
154*4d7e907cSAndroid Build Coastguard Worker if (groupDevices.contains(address)) {
155*4d7e907cSAndroid Build Coastguard Worker message =
156*4d7e907cSAndroid Build Coastguard Worker " Audio device address can not repeat in the same volume group or within audio"
157*4d7e907cSAndroid Build Coastguard Worker " zone configuration if not using configurable audio policy engine";
158*4d7e907cSAndroid Build Coastguard Worker return false;
159*4d7e907cSAndroid Build Coastguard Worker }
160*4d7e907cSAndroid Build Coastguard Worker groupDevices.insert(address);
161*4d7e907cSAndroid Build Coastguard Worker return true;
162*4d7e907cSAndroid Build Coastguard Worker }
163*4d7e907cSAndroid Build Coastguard Worker
hasValidTimeout(int64_t timeout)164*4d7e907cSAndroid Build Coastguard Worker inline bool hasValidTimeout(int64_t timeout) {
165*4d7e907cSAndroid Build Coastguard Worker return timeout > 0;
166*4d7e907cSAndroid Build Coastguard Worker }
hasValidFadeConfiguration(const FadeConfiguration & fadeConfiguration,const std::string & prefix,std::string & message)167*4d7e907cSAndroid Build Coastguard Worker bool hasValidFadeConfiguration(const FadeConfiguration& fadeConfiguration,
168*4d7e907cSAndroid Build Coastguard Worker const std::string& prefix, std::string& message) {
169*4d7e907cSAndroid Build Coastguard Worker if (!hasValidTimeout(fadeConfiguration.fadeDurationMillis)) {
170*4d7e907cSAndroid Build Coastguard Worker message = prefix + " duration must be greater than 0";
171*4d7e907cSAndroid Build Coastguard Worker return false;
172*4d7e907cSAndroid Build Coastguard Worker }
173*4d7e907cSAndroid Build Coastguard Worker return true;
174*4d7e907cSAndroid Build Coastguard Worker }
hadValidAudioFadeConfiguration(const AudioFadeConfiguration & fadeConfiguration,std::string & message)175*4d7e907cSAndroid Build Coastguard Worker bool hadValidAudioFadeConfiguration(const AudioFadeConfiguration& fadeConfiguration,
176*4d7e907cSAndroid Build Coastguard Worker std::string& message) {
177*4d7e907cSAndroid Build Coastguard Worker if (!hasValidTimeout(fadeConfiguration.fadeInDurationMs)) {
178*4d7e907cSAndroid Build Coastguard Worker message = "Fade-in duration must be greater than 0";
179*4d7e907cSAndroid Build Coastguard Worker return false;
180*4d7e907cSAndroid Build Coastguard Worker }
181*4d7e907cSAndroid Build Coastguard Worker if (!hasValidTimeout(fadeConfiguration.fadeOutDurationMs)) {
182*4d7e907cSAndroid Build Coastguard Worker message = "Fade-out duration must be greater than 0";
183*4d7e907cSAndroid Build Coastguard Worker return false;
184*4d7e907cSAndroid Build Coastguard Worker }
185*4d7e907cSAndroid Build Coastguard Worker if (!hasValidTimeout(fadeConfiguration.fadeInDelayedForOffendersMs)) {
186*4d7e907cSAndroid Build Coastguard Worker message = "Fade-in delayed for offenders duration must be greater than 0";
187*4d7e907cSAndroid Build Coastguard Worker return false;
188*4d7e907cSAndroid Build Coastguard Worker }
189*4d7e907cSAndroid Build Coastguard Worker for (const auto& fadeOutConfig : fadeConfiguration.fadeOutConfigurations) {
190*4d7e907cSAndroid Build Coastguard Worker if (!hasValidFadeConfiguration(fadeOutConfig, "Fade-out", message)) {
191*4d7e907cSAndroid Build Coastguard Worker return false;
192*4d7e907cSAndroid Build Coastguard Worker }
193*4d7e907cSAndroid Build Coastguard Worker }
194*4d7e907cSAndroid Build Coastguard Worker for (const auto& fadeOutConfig : fadeConfiguration.fadeInConfigurations) {
195*4d7e907cSAndroid Build Coastguard Worker if (!hasValidFadeConfiguration(fadeOutConfig, "Fade-in", message)) {
196*4d7e907cSAndroid Build Coastguard Worker return false;
197*4d7e907cSAndroid Build Coastguard Worker }
198*4d7e907cSAndroid Build Coastguard Worker }
199*4d7e907cSAndroid Build Coastguard Worker return true;
200*4d7e907cSAndroid Build Coastguard Worker }
201*4d7e907cSAndroid Build Coastguard Worker
validateVolumeGroupInfo(const AudioZoneConfig & audioZoneConfig,const VolumeGroupConfig & volumeGroupConfig,const AudioDeviceConfiguration & deviceConfig,std::set<std::string> & groupDevices,std::set<int> & groupIds)202*4d7e907cSAndroid Build Coastguard Worker void validateVolumeGroupInfo(const AudioZoneConfig& audioZoneConfig,
203*4d7e907cSAndroid Build Coastguard Worker const VolumeGroupConfig& volumeGroupConfig,
204*4d7e907cSAndroid Build Coastguard Worker const AudioDeviceConfiguration& deviceConfig,
205*4d7e907cSAndroid Build Coastguard Worker std::set<std::string>& groupDevices, std::set<int>& groupIds) {
206*4d7e907cSAndroid Build Coastguard Worker std::string zoneConfigName = testutils::toAlphaNumeric(ToString(audioZoneConfig.name));
207*4d7e907cSAndroid Build Coastguard Worker std::string volumeGroupName = testutils::toAlphaNumeric(ToString(volumeGroupConfig.name));
208*4d7e907cSAndroid Build Coastguard Worker std::string volumeGroupInfo =
209*4d7e907cSAndroid Build Coastguard Worker "Audio zone config " + zoneConfigName + " volume group " + volumeGroupName;
210*4d7e907cSAndroid Build Coastguard Worker ALOGI("%s test", volumeGroupInfo.c_str());
211*4d7e907cSAndroid Build Coastguard Worker
212*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(volumeGroupConfig.carAudioRoutes.empty())
213*4d7e907cSAndroid Build Coastguard Worker << volumeGroupInfo << " must have at least one audio route";
214*4d7e907cSAndroid Build Coastguard Worker if (deviceConfig.routingConfig == CONFIGURABLE_AUDIO_ENGINE_ROUTING) {
215*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(volumeGroupConfig.name.empty())
216*4d7e907cSAndroid Build Coastguard Worker << volumeGroupInfo << " must have a non-empty volume name";
217*4d7e907cSAndroid Build Coastguard Worker }
218*4d7e907cSAndroid Build Coastguard Worker if (volumeGroupConfig.id != VolumeGroupConfig::UNASSIGNED_ID) {
219*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(groupIds.insert(volumeGroupConfig.id).second)
220*4d7e907cSAndroid Build Coastguard Worker << volumeGroupInfo << " repeats volume group id " << volumeGroupConfig.id;
221*4d7e907cSAndroid Build Coastguard Worker }
222*4d7e907cSAndroid Build Coastguard Worker for (const auto& audioRoute : volumeGroupConfig.carAudioRoutes) {
223*4d7e907cSAndroid Build Coastguard Worker std::string routeMessage;
224*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(hasValidAudioRoute(audioRoute, routeMessage, groupDevices))
225*4d7e907cSAndroid Build Coastguard Worker << volumeGroupInfo << " Volume route message: " << routeMessage;
226*4d7e907cSAndroid Build Coastguard Worker }
227*4d7e907cSAndroid Build Coastguard Worker if (volumeGroupConfig.activationConfiguration.has_value()) {
228*4d7e907cSAndroid Build Coastguard Worker std::string activationMessage;
229*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(hasValidVolumeGroupActivation(volumeGroupConfig.activationConfiguration.value(),
230*4d7e907cSAndroid Build Coastguard Worker activationMessage))
231*4d7e907cSAndroid Build Coastguard Worker << volumeGroupInfo << " Activation message: " << activationMessage;
232*4d7e907cSAndroid Build Coastguard Worker }
233*4d7e907cSAndroid Build Coastguard Worker }
234*4d7e907cSAndroid Build Coastguard Worker
validateAudioZoneFadeConfiguration(const AudioZoneFadeConfiguration & fadeConfiguration)235*4d7e907cSAndroid Build Coastguard Worker void validateAudioZoneFadeConfiguration(const AudioZoneFadeConfiguration& fadeConfiguration) {
236*4d7e907cSAndroid Build Coastguard Worker ALOGI("Fade configuration test");
237*4d7e907cSAndroid Build Coastguard Worker std::set<audiomediacommon::AudioUsage> usages;
238*4d7e907cSAndroid Build Coastguard Worker std::string defaultValidationMessage;
239*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(hadValidAudioFadeConfiguration(fadeConfiguration.defaultConfiguration,
240*4d7e907cSAndroid Build Coastguard Worker defaultValidationMessage))
241*4d7e907cSAndroid Build Coastguard Worker << "Default configuration validation failed: " << defaultValidationMessage;
242*4d7e907cSAndroid Build Coastguard Worker for (const auto& entry : fadeConfiguration.transientConfiguration) {
243*4d7e907cSAndroid Build Coastguard Worker ALOGI("Transient fade configuration test");
244*4d7e907cSAndroid Build Coastguard Worker std::string transientFadeConfigurationMessage;
245*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(hadValidAudioFadeConfiguration(entry.transientFadeConfiguration,
246*4d7e907cSAndroid Build Coastguard Worker transientFadeConfigurationMessage))
247*4d7e907cSAndroid Build Coastguard Worker << "Transient fade configuration validation failed: "
248*4d7e907cSAndroid Build Coastguard Worker << transientFadeConfigurationMessage;
249*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(entry.transientUsages.empty())
250*4d7e907cSAndroid Build Coastguard Worker << "Transient fade configuration must have at least one audio usage";
251*4d7e907cSAndroid Build Coastguard Worker for (const auto& usage : entry.transientUsages) {
252*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(usages.contains(usage)) << "Audio usages " << ToString(usage)
253*4d7e907cSAndroid Build Coastguard Worker << " repeat in transient fade configuration";
254*4d7e907cSAndroid Build Coastguard Worker }
255*4d7e907cSAndroid Build Coastguard Worker }
256*4d7e907cSAndroid Build Coastguard Worker }
257*4d7e907cSAndroid Build Coastguard Worker
validateAudioZoneConfiguration(const AudioZone & carAudioZone,const AudioZoneConfig & audioZoneConfig,const AudioDeviceConfiguration & deviceConfig)258*4d7e907cSAndroid Build Coastguard Worker void validateAudioZoneConfiguration(const AudioZone& carAudioZone,
259*4d7e907cSAndroid Build Coastguard Worker const AudioZoneConfig& audioZoneConfig,
260*4d7e907cSAndroid Build Coastguard Worker const AudioDeviceConfiguration& deviceConfig) {
261*4d7e907cSAndroid Build Coastguard Worker std::string zoneConfigName = testutils::toAlphaNumeric(ToString(audioZoneConfig.name));
262*4d7e907cSAndroid Build Coastguard Worker ALOGI("Zone config name %s test", zoneConfigName.c_str());
263*4d7e907cSAndroid Build Coastguard Worker std::set<std::string> contextInfoNames;
264*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(audioZoneConfig.volumeGroups.empty())
265*4d7e907cSAndroid Build Coastguard Worker << "Volume groups for zone config " << zoneConfigName.c_str();
266*4d7e907cSAndroid Build Coastguard Worker std::set<std::string> groupDevices;
267*4d7e907cSAndroid Build Coastguard Worker std::set<int> groupIds;
268*4d7e907cSAndroid Build Coastguard Worker for (const auto& volumeGroup : audioZoneConfig.volumeGroups) {
269*4d7e907cSAndroid Build Coastguard Worker ALOGI("Zone config name %s volume group test %s", zoneConfigName.c_str(),
270*4d7e907cSAndroid Build Coastguard Worker ToString(volumeGroup.name).c_str());
271*4d7e907cSAndroid Build Coastguard Worker std::vector<std::string> groupContexts =
272*4d7e907cSAndroid Build Coastguard Worker testutils::getContextInfoNamesForVolumeGroup(volumeGroup);
273*4d7e907cSAndroid Build Coastguard Worker for (const auto& context : groupContexts) {
274*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(contextInfoNames.contains(context))
275*4d7e907cSAndroid Build Coastguard Worker << "Context " << context << " repeats in zone config " << zoneConfigName;
276*4d7e907cSAndroid Build Coastguard Worker contextInfoNames.insert(context);
277*4d7e907cSAndroid Build Coastguard Worker }
278*4d7e907cSAndroid Build Coastguard Worker // Configurable audio policy engine can share devices among volume groups
279*4d7e907cSAndroid Build Coastguard Worker if (deviceConfig.routingConfig == CONFIGURABLE_AUDIO_ENGINE_ROUTING) {
280*4d7e907cSAndroid Build Coastguard Worker groupDevices.clear();
281*4d7e907cSAndroid Build Coastguard Worker }
282*4d7e907cSAndroid Build Coastguard Worker validateVolumeGroupInfo(audioZoneConfig, volumeGroup, deviceConfig, groupDevices, groupIds);
283*4d7e907cSAndroid Build Coastguard Worker }
284*4d7e907cSAndroid Build Coastguard Worker const auto& audioZoneContexts = carAudioZone.audioZoneContext.audioContextInfos;
285*4d7e907cSAndroid Build Coastguard Worker std::map<std::string, AudioZoneContextInfo> infoNameToInfo;
286*4d7e907cSAndroid Build Coastguard Worker std::transform(audioZoneContexts.begin(), audioZoneContexts.end(),
287*4d7e907cSAndroid Build Coastguard Worker std::inserter(infoNameToInfo, infoNameToInfo.end()),
288*4d7e907cSAndroid Build Coastguard Worker [&](const AudioZoneContextInfo& context) {
289*4d7e907cSAndroid Build Coastguard Worker return std::make_pair(ToString(context.name), context);
290*4d7e907cSAndroid Build Coastguard Worker });
291*4d7e907cSAndroid Build Coastguard Worker std::vector<AudioZoneContextInfo> configContextInfos;
292*4d7e907cSAndroid Build Coastguard Worker for (const auto& contextName : contextInfoNames) {
293*4d7e907cSAndroid Build Coastguard Worker const auto& pair = infoNameToInfo.find(contextName);
294*4d7e907cSAndroid Build Coastguard Worker if (pair == infoNameToInfo.end()) {
295*4d7e907cSAndroid Build Coastguard Worker continue;
296*4d7e907cSAndroid Build Coastguard Worker }
297*4d7e907cSAndroid Build Coastguard Worker configContextInfos.push_back(pair->second);
298*4d7e907cSAndroid Build Coastguard Worker }
299*4d7e907cSAndroid Build Coastguard Worker std::string message;
300*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(testutils::contextInfosContainAllAudioAttributeUsages(configContextInfos, message))
301*4d7e907cSAndroid Build Coastguard Worker << "Config " << zoneConfigName << " message: " << message;
302*4d7e907cSAndroid Build Coastguard Worker
303*4d7e907cSAndroid Build Coastguard Worker if (audioZoneConfig.fadeConfiguration.has_value()) {
304*4d7e907cSAndroid Build Coastguard Worker validateAudioZoneFadeConfiguration(audioZoneConfig.fadeConfiguration.value());
305*4d7e907cSAndroid Build Coastguard Worker }
306*4d7e907cSAndroid Build Coastguard Worker }
307*4d7e907cSAndroid Build Coastguard Worker
308*4d7e907cSAndroid Build Coastguard Worker } // namespace
309*4d7e907cSAndroid Build Coastguard Worker
310*4d7e907cSAndroid Build Coastguard Worker class AudioControlAidl : public testing::TestWithParam<std::string> {
311*4d7e907cSAndroid Build Coastguard Worker public:
SetUp()312*4d7e907cSAndroid Build Coastguard Worker virtual void SetUp() override {
313*4d7e907cSAndroid Build Coastguard Worker audioControl = android::waitForDeclaredService<IAudioControl>(String16(GetParam().c_str()));
314*4d7e907cSAndroid Build Coastguard Worker ASSERT_NE(audioControl, nullptr);
315*4d7e907cSAndroid Build Coastguard Worker aidlVersion = audioControl->getInterfaceVersion();
316*4d7e907cSAndroid Build Coastguard Worker }
317*4d7e907cSAndroid Build Coastguard Worker
TearDown()318*4d7e907cSAndroid Build Coastguard Worker void TearDown() override { audioControl = nullptr; }
319*4d7e907cSAndroid Build Coastguard Worker
isAidlVersionAtleast(int version) const320*4d7e907cSAndroid Build Coastguard Worker bool isAidlVersionAtleast(int version) const { return aidlVersion >= version; }
321*4d7e907cSAndroid Build Coastguard Worker
322*4d7e907cSAndroid Build Coastguard Worker sp<IAudioControl> audioControl;
323*4d7e907cSAndroid Build Coastguard Worker int32_t capabilities;
324*4d7e907cSAndroid Build Coastguard Worker int32_t aidlVersion;
325*4d7e907cSAndroid Build Coastguard Worker };
326*4d7e907cSAndroid Build Coastguard Worker
TEST_P(AudioControlAidl,OnSetFadeTowardsFront)327*4d7e907cSAndroid Build Coastguard Worker TEST_P(AudioControlAidl, OnSetFadeTowardsFront) {
328*4d7e907cSAndroid Build Coastguard Worker ALOGI("Fader exercise test (silent)");
329*4d7e907cSAndroid Build Coastguard Worker
330*4d7e907cSAndroid Build Coastguard Worker // Set the fader all the way to the back
331*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->setFadeTowardFront(-1.0f).isOk());
332*4d7e907cSAndroid Build Coastguard Worker
333*4d7e907cSAndroid Build Coastguard Worker // Set the fader all the way to the front
334*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->setFadeTowardFront(1.0f).isOk());
335*4d7e907cSAndroid Build Coastguard Worker
336*4d7e907cSAndroid Build Coastguard Worker // Set the fader part way toward the back
337*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->setFadeTowardFront(-0.333f).isOk());
338*4d7e907cSAndroid Build Coastguard Worker
339*4d7e907cSAndroid Build Coastguard Worker // Set the fader to a out of bounds value (driver should clamp)
340*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->setFadeTowardFront(99999.9f).isOk());
341*4d7e907cSAndroid Build Coastguard Worker
342*4d7e907cSAndroid Build Coastguard Worker // Set the fader to a negative out of bounds value (driver should clamp)
343*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->setFadeTowardFront(-99999.9f).isOk());
344*4d7e907cSAndroid Build Coastguard Worker
345*4d7e907cSAndroid Build Coastguard Worker // Set the fader back to the middle
346*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->setFadeTowardFront(0.0f).isOk());
347*4d7e907cSAndroid Build Coastguard Worker }
348*4d7e907cSAndroid Build Coastguard Worker
TEST_P(AudioControlAidl,OnSetBalanceTowardsRight)349*4d7e907cSAndroid Build Coastguard Worker TEST_P(AudioControlAidl, OnSetBalanceTowardsRight) {
350*4d7e907cSAndroid Build Coastguard Worker ALOGI("Balance exercise test (silent)");
351*4d7e907cSAndroid Build Coastguard Worker
352*4d7e907cSAndroid Build Coastguard Worker // Set the balance all the way to the left
353*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->setBalanceTowardRight(-1.0f).isOk());
354*4d7e907cSAndroid Build Coastguard Worker
355*4d7e907cSAndroid Build Coastguard Worker // Set the balance all the way to the right
356*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->setBalanceTowardRight(1.0f).isOk());
357*4d7e907cSAndroid Build Coastguard Worker
358*4d7e907cSAndroid Build Coastguard Worker // Set the balance part way toward the left
359*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->setBalanceTowardRight(-0.333f).isOk());
360*4d7e907cSAndroid Build Coastguard Worker
361*4d7e907cSAndroid Build Coastguard Worker // Set the balance to a out of bounds value (driver should clamp)
362*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->setBalanceTowardRight(99999.9f).isOk());
363*4d7e907cSAndroid Build Coastguard Worker
364*4d7e907cSAndroid Build Coastguard Worker // Set the balance to a negative out of bounds value (driver should clamp)
365*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->setBalanceTowardRight(-99999.9f).isOk());
366*4d7e907cSAndroid Build Coastguard Worker
367*4d7e907cSAndroid Build Coastguard Worker // Set the balance back to the middle
368*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->setBalanceTowardRight(0.0f).isOk());
369*4d7e907cSAndroid Build Coastguard Worker
370*4d7e907cSAndroid Build Coastguard Worker // Set the balance back to the middle
371*4d7e907cSAndroid Build Coastguard Worker audioControl->setBalanceTowardRight(0.0f).isOk();
372*4d7e907cSAndroid Build Coastguard Worker }
373*4d7e907cSAndroid Build Coastguard Worker
374*4d7e907cSAndroid Build Coastguard Worker struct FocusListenerMock : BnFocusListener {
375*4d7e907cSAndroid Build Coastguard Worker MOCK_METHOD(Status, requestAudioFocus,
376*4d7e907cSAndroid Build Coastguard Worker (const String16& usage, int32_t zoneId, AudioFocusChange focusGain));
377*4d7e907cSAndroid Build Coastguard Worker MOCK_METHOD(Status, abandonAudioFocus, (const String16& usage, int32_t zoneId));
378*4d7e907cSAndroid Build Coastguard Worker MOCK_METHOD(Status, requestAudioFocusWithMetaData,
379*4d7e907cSAndroid Build Coastguard Worker (const audiohalcommon::PlaybackTrackMetadata& metaData, int32_t zoneId,
380*4d7e907cSAndroid Build Coastguard Worker AudioFocusChange focusGain));
381*4d7e907cSAndroid Build Coastguard Worker MOCK_METHOD(Status, abandonAudioFocusWithMetaData,
382*4d7e907cSAndroid Build Coastguard Worker (const audiohalcommon::PlaybackTrackMetadata& metaData, int32_t zoneId));
383*4d7e907cSAndroid Build Coastguard Worker };
384*4d7e907cSAndroid Build Coastguard Worker
385*4d7e907cSAndroid Build Coastguard Worker /*
386*4d7e907cSAndroid Build Coastguard Worker * Test focus listener registration.
387*4d7e907cSAndroid Build Coastguard Worker *
388*4d7e907cSAndroid Build Coastguard Worker * Verifies that:
389*4d7e907cSAndroid Build Coastguard Worker * - registerFocusListener succeeds;
390*4d7e907cSAndroid Build Coastguard Worker * - registering a second listener succeeds in replacing the first;
391*4d7e907cSAndroid Build Coastguard Worker * - closing handle does not crash;
392*4d7e907cSAndroid Build Coastguard Worker */
TEST_P(AudioControlAidl,FocusListenerRegistration)393*4d7e907cSAndroid Build Coastguard Worker TEST_P(AudioControlAidl, FocusListenerRegistration) {
394*4d7e907cSAndroid Build Coastguard Worker ALOGI("Focus listener test");
395*4d7e907cSAndroid Build Coastguard Worker
396*4d7e907cSAndroid Build Coastguard Worker sp<FocusListenerMock> listener = new FocusListenerMock();
397*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->registerFocusListener(listener).isOk());
398*4d7e907cSAndroid Build Coastguard Worker
399*4d7e907cSAndroid Build Coastguard Worker sp<FocusListenerMock> listener2 = new FocusListenerMock();
400*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->registerFocusListener(listener2).isOk());
401*4d7e907cSAndroid Build Coastguard Worker };
402*4d7e907cSAndroid Build Coastguard Worker
TEST_P(AudioControlAidl,FocusChangeExercise)403*4d7e907cSAndroid Build Coastguard Worker TEST_P(AudioControlAidl, FocusChangeExercise) {
404*4d7e907cSAndroid Build Coastguard Worker ALOGI("Focus Change test");
405*4d7e907cSAndroid Build Coastguard Worker
406*4d7e907cSAndroid Build Coastguard Worker String16 usage = String16(xsd::toString(xsd::AudioUsage::AUDIO_USAGE_MEDIA).c_str());
407*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(
408*4d7e907cSAndroid Build Coastguard Worker audioControl->onAudioFocusChange(usage, 0, AudioFocusChange::GAIN_TRANSIENT).isOk());
409*4d7e907cSAndroid Build Coastguard Worker };
410*4d7e907cSAndroid Build Coastguard Worker
TEST_P(AudioControlAidl,MuteChangeExercise)411*4d7e907cSAndroid Build Coastguard Worker TEST_P(AudioControlAidl, MuteChangeExercise) {
412*4d7e907cSAndroid Build Coastguard Worker ALOGI("Mute change test");
413*4d7e907cSAndroid Build Coastguard Worker
414*4d7e907cSAndroid Build Coastguard Worker MutingInfo mutingInfo;
415*4d7e907cSAndroid Build Coastguard Worker mutingInfo.zoneId = 0;
416*4d7e907cSAndroid Build Coastguard Worker mutingInfo.deviceAddressesToMute = {String16("address 1"), String16("address 2")};
417*4d7e907cSAndroid Build Coastguard Worker mutingInfo.deviceAddressesToUnmute = {String16("address 3"), String16("address 4")};
418*4d7e907cSAndroid Build Coastguard Worker std::vector<MutingInfo> mutingInfos = {mutingInfo};
419*4d7e907cSAndroid Build Coastguard Worker ALOGI("Mute change test start");
420*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->onDevicesToMuteChange(mutingInfos).isOk());
421*4d7e907cSAndroid Build Coastguard Worker }
422*4d7e907cSAndroid Build Coastguard Worker
TEST_P(AudioControlAidl,DuckChangeExercise)423*4d7e907cSAndroid Build Coastguard Worker TEST_P(AudioControlAidl, DuckChangeExercise) {
424*4d7e907cSAndroid Build Coastguard Worker ALOGI("Duck change test");
425*4d7e907cSAndroid Build Coastguard Worker
426*4d7e907cSAndroid Build Coastguard Worker DuckingInfo duckingInfo;
427*4d7e907cSAndroid Build Coastguard Worker duckingInfo.zoneId = 0;
428*4d7e907cSAndroid Build Coastguard Worker duckingInfo.deviceAddressesToDuck = {String16("address 1"), String16("address 2")};
429*4d7e907cSAndroid Build Coastguard Worker duckingInfo.deviceAddressesToUnduck = {String16("address 3"), String16("address 4")};
430*4d7e907cSAndroid Build Coastguard Worker duckingInfo.usagesHoldingFocus = {
431*4d7e907cSAndroid Build Coastguard Worker String16(xsd::toString(xsd::AudioUsage::AUDIO_USAGE_MEDIA).c_str()),
432*4d7e907cSAndroid Build Coastguard Worker String16(xsd::toString(xsd::AudioUsage::AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE)
433*4d7e907cSAndroid Build Coastguard Worker .c_str())};
434*4d7e907cSAndroid Build Coastguard Worker std::vector<DuckingInfo> duckingInfos = {duckingInfo};
435*4d7e907cSAndroid Build Coastguard Worker ALOGI("Duck change test start");
436*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->onDevicesToDuckChange(duckingInfos).isOk());
437*4d7e907cSAndroid Build Coastguard Worker }
438*4d7e907cSAndroid Build Coastguard Worker
TEST_P(AudioControlAidl,FocusChangeWithMetaDataExercise)439*4d7e907cSAndroid Build Coastguard Worker TEST_P(AudioControlAidl, FocusChangeWithMetaDataExercise) {
440*4d7e907cSAndroid Build Coastguard Worker ALOGI("Focus Change test");
441*4d7e907cSAndroid Build Coastguard Worker
442*4d7e907cSAndroid Build Coastguard Worker audiohalcommon::PlaybackTrackMetadata metadata;
443*4d7e907cSAndroid Build Coastguard Worker metadata.usage = audiomediacommon::AudioUsage::MEDIA;
444*4d7e907cSAndroid Build Coastguard Worker metadata.contentType = audiomediacommon::AudioContentType::MUSIC;
445*4d7e907cSAndroid Build Coastguard Worker metadata.tags = {"com.google.android=VR"};
446*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(
447*4d7e907cSAndroid Build Coastguard Worker audioControl
448*4d7e907cSAndroid Build Coastguard Worker ->onAudioFocusChangeWithMetaData(metadata, 0, AudioFocusChange::GAIN_TRANSIENT)
449*4d7e907cSAndroid Build Coastguard Worker .isOk());
450*4d7e907cSAndroid Build Coastguard Worker };
451*4d7e907cSAndroid Build Coastguard Worker
TEST_P(AudioControlAidl,SetAudioDeviceGainsChangedExercise)452*4d7e907cSAndroid Build Coastguard Worker TEST_P(AudioControlAidl, SetAudioDeviceGainsChangedExercise) {
453*4d7e907cSAndroid Build Coastguard Worker ALOGI("Set Audio Gains Changed test");
454*4d7e907cSAndroid Build Coastguard Worker
455*4d7e907cSAndroid Build Coastguard Worker const std::vector<Reasons> reasons{Reasons::FORCED_MASTER_MUTE, Reasons::NAV_DUCKING};
456*4d7e907cSAndroid Build Coastguard Worker AudioGainConfigInfo agci1;
457*4d7e907cSAndroid Build Coastguard Worker agci1.zoneId = 0;
458*4d7e907cSAndroid Build Coastguard Worker agci1.devicePortAddress = String16("address 1");
459*4d7e907cSAndroid Build Coastguard Worker agci1.volumeIndex = 8;
460*4d7e907cSAndroid Build Coastguard Worker
461*4d7e907cSAndroid Build Coastguard Worker AudioGainConfigInfo agci2;
462*4d7e907cSAndroid Build Coastguard Worker agci1.zoneId = 0;
463*4d7e907cSAndroid Build Coastguard Worker agci1.devicePortAddress = String16("address 2");
464*4d7e907cSAndroid Build Coastguard Worker agci1.volumeIndex = 1;
465*4d7e907cSAndroid Build Coastguard Worker
466*4d7e907cSAndroid Build Coastguard Worker std::vector<AudioGainConfigInfo> gains{agci1, agci2};
467*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->setAudioDeviceGainsChanged(reasons, gains).isOk());
468*4d7e907cSAndroid Build Coastguard Worker }
469*4d7e907cSAndroid Build Coastguard Worker
470*4d7e907cSAndroid Build Coastguard Worker /*
471*4d7e907cSAndroid Build Coastguard Worker * Test Audio Gain Callback registration.
472*4d7e907cSAndroid Build Coastguard Worker *
473*4d7e907cSAndroid Build Coastguard Worker * Verifies that:
474*4d7e907cSAndroid Build Coastguard Worker * - registerGainCallback succeeds;
475*4d7e907cSAndroid Build Coastguard Worker * - registering a second callback succeeds in replacing the first;
476*4d7e907cSAndroid Build Coastguard Worker * - closing handle does not crash;
477*4d7e907cSAndroid Build Coastguard Worker */
478*4d7e907cSAndroid Build Coastguard Worker struct AudioGainCallbackMock : BnAudioGainCallback {
479*4d7e907cSAndroid Build Coastguard Worker MOCK_METHOD(Status, onAudioDeviceGainsChanged,
480*4d7e907cSAndroid Build Coastguard Worker (const std::vector<Reasons>& reasons,
481*4d7e907cSAndroid Build Coastguard Worker const std::vector<AudioGainConfigInfo>& gains));
482*4d7e907cSAndroid Build Coastguard Worker };
483*4d7e907cSAndroid Build Coastguard Worker
TEST_P(AudioControlAidl,AudioGainCallbackRegistration)484*4d7e907cSAndroid Build Coastguard Worker TEST_P(AudioControlAidl, AudioGainCallbackRegistration) {
485*4d7e907cSAndroid Build Coastguard Worker ALOGI("Focus listener test");
486*4d7e907cSAndroid Build Coastguard Worker
487*4d7e907cSAndroid Build Coastguard Worker sp<AudioGainCallbackMock> gainCallback = new AudioGainCallbackMock();
488*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->registerGainCallback(gainCallback).isOk());
489*4d7e907cSAndroid Build Coastguard Worker
490*4d7e907cSAndroid Build Coastguard Worker sp<AudioGainCallbackMock> gainCallback2 = new AudioGainCallbackMock();
491*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->registerGainCallback(gainCallback2).isOk());
492*4d7e907cSAndroid Build Coastguard Worker }
493*4d7e907cSAndroid Build Coastguard Worker
494*4d7e907cSAndroid Build Coastguard Worker /*
495*4d7e907cSAndroid Build Coastguard Worker * Test Module change Callback registration.
496*4d7e907cSAndroid Build Coastguard Worker *
497*4d7e907cSAndroid Build Coastguard Worker * Verifies that:
498*4d7e907cSAndroid Build Coastguard Worker * - setModuleChangeCallback succeeds
499*4d7e907cSAndroid Build Coastguard Worker * - setting a double callback fails with exception
500*4d7e907cSAndroid Build Coastguard Worker * - clearModuleChangeCallback succeeds
501*4d7e907cSAndroid Build Coastguard Worker * - setting with nullptr callback fails with exception
502*4d7e907cSAndroid Build Coastguard Worker * - closing handle does not crash
503*4d7e907cSAndroid Build Coastguard Worker */
504*4d7e907cSAndroid Build Coastguard Worker struct ModuleChangeCallbackMock : BnModuleChangeCallback {
505*4d7e907cSAndroid Build Coastguard Worker MOCK_METHOD(Status, onAudioPortsChanged,
506*4d7e907cSAndroid Build Coastguard Worker (const std::vector<android::media::audio::common::AudioPort>& audioPorts));
507*4d7e907cSAndroid Build Coastguard Worker };
508*4d7e907cSAndroid Build Coastguard Worker
TEST_P(AudioControlAidl,RegisterModuleChangeCallbackTwiceThrowsException)509*4d7e907cSAndroid Build Coastguard Worker TEST_P(AudioControlAidl, RegisterModuleChangeCallbackTwiceThrowsException) {
510*4d7e907cSAndroid Build Coastguard Worker ALOGI("Register Module change callback test");
511*4d7e907cSAndroid Build Coastguard Worker if (!isAidlVersionAtleast(kAidlVersionThree)) {
512*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "Device does not support the new APIs for module change callback";
513*4d7e907cSAndroid Build Coastguard Worker return;
514*4d7e907cSAndroid Build Coastguard Worker }
515*4d7e907cSAndroid Build Coastguard Worker
516*4d7e907cSAndroid Build Coastguard Worker // make sure no stale callbacks.
517*4d7e907cSAndroid Build Coastguard Worker audioControl->clearModuleChangeCallback();
518*4d7e907cSAndroid Build Coastguard Worker
519*4d7e907cSAndroid Build Coastguard Worker sp<ModuleChangeCallbackMock> moduleChangeCallback = new ModuleChangeCallbackMock();
520*4d7e907cSAndroid Build Coastguard Worker auto status = audioControl->setModuleChangeCallback(moduleChangeCallback);
521*4d7e907cSAndroid Build Coastguard Worker EXPECT_THAT(status.exceptionCode(),
522*4d7e907cSAndroid Build Coastguard Worker AnyOf(Eq(Status::EX_NONE), Eq(Status::EX_UNSUPPORTED_OPERATION)));
523*4d7e907cSAndroid Build Coastguard Worker if (!status.isOk()) return;
524*4d7e907cSAndroid Build Coastguard Worker
525*4d7e907cSAndroid Build Coastguard Worker sp<ModuleChangeCallbackMock> moduleChangeCallback2 = new ModuleChangeCallbackMock();
526*4d7e907cSAndroid Build Coastguard Worker // no need to check for unsupported feature
527*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Status::EX_ILLEGAL_STATE,
528*4d7e907cSAndroid Build Coastguard Worker audioControl->setModuleChangeCallback(moduleChangeCallback2).exceptionCode());
529*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->clearModuleChangeCallback().isOk());
530*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(audioControl->setModuleChangeCallback(moduleChangeCallback2).isOk());
531*4d7e907cSAndroid Build Coastguard Worker }
532*4d7e907cSAndroid Build Coastguard Worker
TEST_P(AudioControlAidl,RegisterModuleChangeNullCallbackThrowsException)533*4d7e907cSAndroid Build Coastguard Worker TEST_P(AudioControlAidl, RegisterModuleChangeNullCallbackThrowsException) {
534*4d7e907cSAndroid Build Coastguard Worker ALOGI("Register Module change callback with nullptr test");
535*4d7e907cSAndroid Build Coastguard Worker if (!isAidlVersionAtleast(kAidlVersionThree)) {
536*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "Device does not support the new APIs for module change callback";
537*4d7e907cSAndroid Build Coastguard Worker return;
538*4d7e907cSAndroid Build Coastguard Worker }
539*4d7e907cSAndroid Build Coastguard Worker
540*4d7e907cSAndroid Build Coastguard Worker auto status = audioControl->setModuleChangeCallback(nullptr);
541*4d7e907cSAndroid Build Coastguard Worker EXPECT_THAT(status.exceptionCode(),
542*4d7e907cSAndroid Build Coastguard Worker AnyOf(Eq(Status::EX_ILLEGAL_ARGUMENT), Eq(Status::EX_UNSUPPORTED_OPERATION)));
543*4d7e907cSAndroid Build Coastguard Worker }
544*4d7e907cSAndroid Build Coastguard Worker
545*4d7e907cSAndroid Build Coastguard Worker class AudioControlVersionFiveAndAbove : public AudioControlAidl {
546*4d7e907cSAndroid Build Coastguard Worker public:
SetUp()547*4d7e907cSAndroid Build Coastguard Worker virtual void SetUp() override {
548*4d7e907cSAndroid Build Coastguard Worker AudioControlAidl::SetUp();
549*4d7e907cSAndroid Build Coastguard Worker if (isAidlVersionAtleast(kAidlVersionFive)) {
550*4d7e907cSAndroid Build Coastguard Worker return;
551*4d7e907cSAndroid Build Coastguard Worker }
552*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << " Version is lower than " << std::to_string(kAidlVersionFive);
553*4d7e907cSAndroid Build Coastguard Worker }
554*4d7e907cSAndroid Build Coastguard Worker };
555*4d7e907cSAndroid Build Coastguard Worker
556*4d7e907cSAndroid Build Coastguard Worker class AudioControlWithAudioConfiguration : public AudioControlVersionFiveAndAbove {
557*4d7e907cSAndroid Build Coastguard Worker public:
SetUp()558*4d7e907cSAndroid Build Coastguard Worker virtual void SetUp() override {
559*4d7e907cSAndroid Build Coastguard Worker AudioControlVersionFiveAndAbove::SetUp();
560*4d7e907cSAndroid Build Coastguard Worker
561*4d7e907cSAndroid Build Coastguard Worker if (IsSkipped()) {
562*4d7e907cSAndroid Build Coastguard Worker return;
563*4d7e907cSAndroid Build Coastguard Worker }
564*4d7e907cSAndroid Build Coastguard Worker
565*4d7e907cSAndroid Build Coastguard Worker const auto& configStatus =
566*4d7e907cSAndroid Build Coastguard Worker audioControl->getAudioDeviceConfiguration(&audioDeviceConfiguration);
567*4d7e907cSAndroid Build Coastguard Worker
568*4d7e907cSAndroid Build Coastguard Worker EXPECT_THAT(configStatus.exceptionCode(),
569*4d7e907cSAndroid Build Coastguard Worker AnyOf(Eq(Status::EX_NONE), Eq(Status::EX_UNSUPPORTED_OPERATION)));
570*4d7e907cSAndroid Build Coastguard Worker if (!configStatus.isOk()) {
571*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "Device does not support audio configurations APIs";
572*4d7e907cSAndroid Build Coastguard Worker }
573*4d7e907cSAndroid Build Coastguard Worker ALOGD("Audio device info: %s", audioDeviceConfiguration.toString().c_str());
574*4d7e907cSAndroid Build Coastguard Worker }
575*4d7e907cSAndroid Build Coastguard Worker
576*4d7e907cSAndroid Build Coastguard Worker AudioDeviceConfiguration audioDeviceConfiguration;
577*4d7e907cSAndroid Build Coastguard Worker };
578*4d7e907cSAndroid Build Coastguard Worker
TEST_P(AudioControlWithAudioConfiguration,DefaultAudioRoutingConfiguration)579*4d7e907cSAndroid Build Coastguard Worker TEST_P(AudioControlWithAudioConfiguration, DefaultAudioRoutingConfiguration) {
580*4d7e907cSAndroid Build Coastguard Worker if (audioDeviceConfiguration.routingConfig != DEFAULT_AUDIO_ROUTING) {
581*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "Default audio routing not supported";
582*4d7e907cSAndroid Build Coastguard Worker }
583*4d7e907cSAndroid Build Coastguard Worker std::vector<AudioZone> zones;
584*4d7e907cSAndroid Build Coastguard Worker
585*4d7e907cSAndroid Build Coastguard Worker const auto& zoneStatus = audioControl->getCarAudioZones(&zones);
586*4d7e907cSAndroid Build Coastguard Worker
587*4d7e907cSAndroid Build Coastguard Worker EXPECT_THAT(zoneStatus.exceptionCode(),
588*4d7e907cSAndroid Build Coastguard Worker AnyOf(Eq(Status::EX_NONE), Eq(Status::EX_UNSUPPORTED_OPERATION)))
589*4d7e907cSAndroid Build Coastguard Worker << "Default routing can be implemented or unsupported";
590*4d7e907cSAndroid Build Coastguard Worker if (!zoneStatus.isOk()) return;
591*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(zones.empty()) << "Zones must be empty for default routing";
592*4d7e907cSAndroid Build Coastguard Worker }
593*4d7e907cSAndroid Build Coastguard Worker
594*4d7e907cSAndroid Build Coastguard Worker class AudioControlWithDynamicConfiguration : public AudioControlWithAudioConfiguration {
595*4d7e907cSAndroid Build Coastguard Worker public:
SetUp()596*4d7e907cSAndroid Build Coastguard Worker virtual void SetUp() override {
597*4d7e907cSAndroid Build Coastguard Worker AudioControlWithAudioConfiguration::SetUp();
598*4d7e907cSAndroid Build Coastguard Worker if (IsSkipped()) {
599*4d7e907cSAndroid Build Coastguard Worker return;
600*4d7e907cSAndroid Build Coastguard Worker }
601*4d7e907cSAndroid Build Coastguard Worker if (audioDeviceConfiguration.routingConfig == DEFAULT_AUDIO_ROUTING) {
602*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "Dynamic/core audio routing not supported";
603*4d7e907cSAndroid Build Coastguard Worker }
604*4d7e907cSAndroid Build Coastguard Worker const auto& zoneStatus = audioControl->getCarAudioZones(&audioZones);
605*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(zoneStatus.exceptionCode(), Status::EX_NONE)
606*4d7e907cSAndroid Build Coastguard Worker << "Zones API must be supported for core/dynamic routing";
607*4d7e907cSAndroid Build Coastguard Worker }
608*4d7e907cSAndroid Build Coastguard Worker
609*4d7e907cSAndroid Build Coastguard Worker std::vector<AudioZone> audioZones;
610*4d7e907cSAndroid Build Coastguard Worker };
611*4d7e907cSAndroid Build Coastguard Worker
TEST_P(AudioControlWithDynamicConfiguration,DynamicAudioRoutingConfiguration)612*4d7e907cSAndroid Build Coastguard Worker TEST_P(AudioControlWithDynamicConfiguration, DynamicAudioRoutingConfiguration) {
613*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(audioZones.empty()) << "Zones must not be empty for core/dynamic routing";
614*4d7e907cSAndroid Build Coastguard Worker }
615*4d7e907cSAndroid Build Coastguard Worker
616*4d7e907cSAndroid Build Coastguard Worker class AudioControlWithAudioZoneInfo : public AudioControlWithDynamicConfiguration {
617*4d7e907cSAndroid Build Coastguard Worker public:
SetUp()618*4d7e907cSAndroid Build Coastguard Worker virtual void SetUp() override {
619*4d7e907cSAndroid Build Coastguard Worker AudioControlWithDynamicConfiguration::SetUp();
620*4d7e907cSAndroid Build Coastguard Worker if (IsSkipped()) {
621*4d7e907cSAndroid Build Coastguard Worker return;
622*4d7e907cSAndroid Build Coastguard Worker }
623*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(!audioZones.empty()) << "Zones must exist for core/dynamic routing";
624*4d7e907cSAndroid Build Coastguard Worker }
625*4d7e907cSAndroid Build Coastguard Worker };
626*4d7e907cSAndroid Build Coastguard Worker
TEST_P(AudioControlWithAudioZoneInfo,AudioZonesRequirements)627*4d7e907cSAndroid Build Coastguard Worker TEST_P(AudioControlWithAudioZoneInfo, AudioZonesRequirements) {
628*4d7e907cSAndroid Build Coastguard Worker bool primaryZoneFound = false;
629*4d7e907cSAndroid Build Coastguard Worker std::set<int> zoneIds;
630*4d7e907cSAndroid Build Coastguard Worker std::set<int> occupantIds;
631*4d7e907cSAndroid Build Coastguard Worker std::set<android::String16> zoneNames;
632*4d7e907cSAndroid Build Coastguard Worker std::set<std::string> deviceAddresses;
633*4d7e907cSAndroid Build Coastguard Worker for (const auto& zone : audioZones) {
634*4d7e907cSAndroid Build Coastguard Worker if (zone.id == static_cast<int>(AudioHalProductStrategy::ZoneId::DEFAULT)) {
635*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(primaryZoneFound) << "There can only be one primary zone";
636*4d7e907cSAndroid Build Coastguard Worker primaryZoneFound = true;
637*4d7e907cSAndroid Build Coastguard Worker }
638*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(zoneIds.contains(zone.id)) << "Zone " << std::to_string(zone.id) << " repeats";
639*4d7e907cSAndroid Build Coastguard Worker zoneIds.insert(zone.id);
640*4d7e907cSAndroid Build Coastguard Worker if (!zone.name.empty()) {
641*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(zoneNames.contains(zone.name)) << "Zone " << zone.name << " repeats";
642*4d7e907cSAndroid Build Coastguard Worker zoneNames.insert(zone.name);
643*4d7e907cSAndroid Build Coastguard Worker }
644*4d7e907cSAndroid Build Coastguard Worker if (zone.occupantZoneId != AudioZone::UNASSIGNED_OCCUPANT) {
645*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(occupantIds.contains(zone.occupantZoneId))
646*4d7e907cSAndroid Build Coastguard Worker << "Occupant zone id " << zone.occupantZoneId << " repeats";
647*4d7e907cSAndroid Build Coastguard Worker occupantIds.insert(zone.occupantZoneId);
648*4d7e907cSAndroid Build Coastguard Worker }
649*4d7e907cSAndroid Build Coastguard Worker const auto& zoneAddresses = testutils::getDeviceAddressesForZone(zone);
650*4d7e907cSAndroid Build Coastguard Worker for (const auto& address : zoneAddresses) {
651*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(deviceAddresses.contains(address))
652*4d7e907cSAndroid Build Coastguard Worker << "Device address " << address << " in zone " << zone.name << " repeats";
653*4d7e907cSAndroid Build Coastguard Worker }
654*4d7e907cSAndroid Build Coastguard Worker // Add after zone comparison is done since devices may repeat within a zone for different
655*4d7e907cSAndroid Build Coastguard Worker // configurations
656*4d7e907cSAndroid Build Coastguard Worker deviceAddresses.insert(zoneAddresses.begin(), zoneAddresses.end());
657*4d7e907cSAndroid Build Coastguard Worker }
658*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(primaryZoneFound) << "Primary zone must exist";
659*4d7e907cSAndroid Build Coastguard Worker }
660*4d7e907cSAndroid Build Coastguard Worker
TEST_P(AudioControlWithAudioZoneInfo,AudioZoneInfoRequirements)661*4d7e907cSAndroid Build Coastguard Worker TEST_P(AudioControlWithAudioZoneInfo, AudioZoneInfoRequirements) {
662*4d7e907cSAndroid Build Coastguard Worker for (const auto& carAudioZone : audioZones) {
663*4d7e907cSAndroid Build Coastguard Worker ALOGI("Zone id %d test", carAudioZone.id);
664*4d7e907cSAndroid Build Coastguard Worker std::string missingContextMessage;
665*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(testutils::contextContainsAllAudioAttributeUsages(carAudioZone.audioZoneContext,
666*4d7e907cSAndroid Build Coastguard Worker missingContextMessage))
667*4d7e907cSAndroid Build Coastguard Worker << "Audio zone context for zone id " << std::to_string(carAudioZone.id)
668*4d7e907cSAndroid Build Coastguard Worker << missingContextMessage;
669*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(carAudioZone.audioZoneConfigs.empty())
670*4d7e907cSAndroid Build Coastguard Worker << "Audio zone zone id " << std::to_string(carAudioZone.id)
671*4d7e907cSAndroid Build Coastguard Worker << " missing zone configs";
672*4d7e907cSAndroid Build Coastguard Worker std::set<android::String16> configNames;
673*4d7e907cSAndroid Build Coastguard Worker bool defaultConfigFound = false;
674*4d7e907cSAndroid Build Coastguard Worker for (const auto& config : carAudioZone.audioZoneConfigs) {
675*4d7e907cSAndroid Build Coastguard Worker ALOGI("Zone id %d config name %s test", carAudioZone.id, ToString(config.name).c_str());
676*4d7e907cSAndroid Build Coastguard Worker if (config.isDefault) {
677*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(defaultConfigFound)
678*4d7e907cSAndroid Build Coastguard Worker << "Config name " << config.name
679*4d7e907cSAndroid Build Coastguard Worker << " repeats default config value in zone id " << carAudioZone.id;
680*4d7e907cSAndroid Build Coastguard Worker defaultConfigFound = true;
681*4d7e907cSAndroid Build Coastguard Worker }
682*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(configNames.contains(config.name))
683*4d7e907cSAndroid Build Coastguard Worker << "Config name " << config.name << " repeats in " << carAudioZone.id;
684*4d7e907cSAndroid Build Coastguard Worker }
685*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(defaultConfigFound)
686*4d7e907cSAndroid Build Coastguard Worker << "Audio zone " << carAudioZone.id << " must contain default config";
687*4d7e907cSAndroid Build Coastguard Worker std::set<audiomediacommon::AudioPort> inputPorts;
688*4d7e907cSAndroid Build Coastguard Worker ALOGI("Zone id %d input devices test", carAudioZone.id);
689*4d7e907cSAndroid Build Coastguard Worker for (const auto& audioPort : carAudioZone.inputAudioDevices) {
690*4d7e907cSAndroid Build Coastguard Worker std::string address;
691*4d7e907cSAndroid Build Coastguard Worker const auto hasAddress = testutils::getAddressForAudioPort(audioPort, address);
692*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(inputPorts.contains(audioPort))
693*4d7e907cSAndroid Build Coastguard Worker << "Repeating input device for " << carAudioZone.id << ", device address "
694*4d7e907cSAndroid Build Coastguard Worker << (hasAddress ? address : "empty address");
695*4d7e907cSAndroid Build Coastguard Worker inputPorts.insert(audioPort);
696*4d7e907cSAndroid Build Coastguard Worker }
697*4d7e907cSAndroid Build Coastguard Worker }
698*4d7e907cSAndroid Build Coastguard Worker }
699*4d7e907cSAndroid Build Coastguard Worker
TEST_P(AudioControlWithAudioZoneInfo,AudioZoneConfigInfoRequirements)700*4d7e907cSAndroid Build Coastguard Worker TEST_P(AudioControlWithAudioZoneInfo, AudioZoneConfigInfoRequirements) {
701*4d7e907cSAndroid Build Coastguard Worker for (const auto& carAudioZone : audioZones) {
702*4d7e907cSAndroid Build Coastguard Worker for (const auto& audioZoneConfig : carAudioZone.audioZoneConfigs) {
703*4d7e907cSAndroid Build Coastguard Worker validateAudioZoneConfiguration(carAudioZone, audioZoneConfig, audioDeviceConfiguration);
704*4d7e907cSAndroid Build Coastguard Worker }
705*4d7e907cSAndroid Build Coastguard Worker }
706*4d7e907cSAndroid Build Coastguard Worker }
707*4d7e907cSAndroid Build Coastguard Worker
708*4d7e907cSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioControlAidl);
709*4d7e907cSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
710*4d7e907cSAndroid Build Coastguard Worker Audiocontrol, AudioControlAidl,
711*4d7e907cSAndroid Build Coastguard Worker testing::ValuesIn(android::getAidlHalInstanceNames(IAudioControl::descriptor)),
712*4d7e907cSAndroid Build Coastguard Worker android::PrintInstanceNameToString);
713*4d7e907cSAndroid Build Coastguard Worker
714*4d7e907cSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioControlWithAudioConfiguration);
715*4d7e907cSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
716*4d7e907cSAndroid Build Coastguard Worker Audiocontrol, AudioControlWithAudioConfiguration,
717*4d7e907cSAndroid Build Coastguard Worker testing::ValuesIn(android::getAidlHalInstanceNames(IAudioControl::descriptor)),
718*4d7e907cSAndroid Build Coastguard Worker android::PrintInstanceNameToString);
719*4d7e907cSAndroid Build Coastguard Worker
720*4d7e907cSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioControlWithDynamicConfiguration);
721*4d7e907cSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
722*4d7e907cSAndroid Build Coastguard Worker Audiocontrol, AudioControlWithDynamicConfiguration,
723*4d7e907cSAndroid Build Coastguard Worker testing::ValuesIn(android::getAidlHalInstanceNames(IAudioControl::descriptor)),
724*4d7e907cSAndroid Build Coastguard Worker android::PrintInstanceNameToString);
725*4d7e907cSAndroid Build Coastguard Worker
726*4d7e907cSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioControlWithAudioZoneInfo);
727*4d7e907cSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
728*4d7e907cSAndroid Build Coastguard Worker Audiocontrol, AudioControlWithAudioZoneInfo,
729*4d7e907cSAndroid Build Coastguard Worker testing::ValuesIn(android::getAidlHalInstanceNames(IAudioControl::descriptor)),
730*4d7e907cSAndroid Build Coastguard Worker android::PrintInstanceNameToString);
731*4d7e907cSAndroid Build Coastguard Worker
main(int argc,char ** argv)732*4d7e907cSAndroid Build Coastguard Worker int main(int argc, char** argv) {
733*4d7e907cSAndroid Build Coastguard Worker ::testing::InitGoogleTest(&argc, argv);
734*4d7e907cSAndroid Build Coastguard Worker ProcessState::self()->setThreadPoolMaxThreadCount(1);
735*4d7e907cSAndroid Build Coastguard Worker ProcessState::self()->startThreadPool();
736*4d7e907cSAndroid Build Coastguard Worker return RUN_ALL_TESTS();
737*4d7e907cSAndroid Build Coastguard Worker }
738