blob: 654e4bf84c81f792eb650b2129aa750bdad7c8eb [file] [log] [blame]
Mufaddal Chakera253887f2020-12-09 17:17:37 +05301/******************************************************************************
2 *
3 * Copyright (C) 2021 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18#include <stdint.h>
19#include <sys/wait.h>
20#include <unistd.h>
21#include <algorithm>
22#include <memory>
23#include <string>
24#include <utility>
25#include <vector>
26
27#include <Serializer.h>
28#include <android-base/file.h>
Svet Ganov33761132021-05-13 22:51:08 +000029#include <android/content/AttributionSourceState.h>
Mufaddal Chakera253887f2020-12-09 17:17:37 +053030#include <libxml/parser.h>
31#include <libxml/xinclude.h>
32#include <media/AudioPolicy.h>
33#include <media/PatchBuilder.h>
34#include <media/RecordingActivityTracker.h>
35
36#include <AudioPolicyInterface.h>
37#include <android_audio_policy_configuration_V7_0-enums.h>
38#include <fuzzer/FuzzedDataProvider.h>
39#include <tests/AudioPolicyManagerTestClient.h>
40#include <tests/AudioPolicyTestClient.h>
41#include <tests/AudioPolicyTestManager.h>
42#include <xsdc/XsdcSupport.h>
43
44using namespace android;
45
46namespace xsd {
47using namespace ::android::audio::policy::configuration::V7_0;
48}
49
Svet Ganov33761132021-05-13 22:51:08 +000050using content::AttributionSourceState;
Philip P. Moltmannbda45752020-07-17 16:41:18 -070051
Mufaddal Chakera253887f2020-12-09 17:17:37 +053052static const std::vector<audio_format_t> kAudioFormats = [] {
53 std::vector<audio_format_t> result;
54 for (const auto enumVal : xsdc_enum_range<xsd::AudioFormat>{}) {
55 audio_format_t audioFormatHal;
56 std::string audioFormat = toString(enumVal);
57 if (audio_format_from_string(audioFormat.c_str(), &audioFormatHal)) {
58 result.push_back(audioFormatHal);
59 }
60 }
61 return result;
62}();
63
64static const std::vector<audio_channel_mask_t> kAudioChannelOutMasks = [] {
65 std::vector<audio_channel_mask_t> result;
66 for (const auto enumVal : xsdc_enum_range<xsd::AudioChannelMask>{}) {
67 audio_channel_mask_t audioChannelMaskHal;
68 std::string audioChannelMask = toString(enumVal);
69 if (enumVal != xsd::AudioChannelMask::AUDIO_CHANNEL_NONE &&
70 audioChannelMask.find("_IN_") == std::string::npos &&
71 audio_channel_mask_from_string(audioChannelMask.c_str(), &audioChannelMaskHal)) {
72 result.push_back(audioChannelMaskHal);
73 }
74 }
75 return result;
76}();
77
78static const std::vector<audio_channel_mask_t> kAudioChannelInMasks = [] {
79 std::vector<audio_channel_mask_t> result;
80 for (const auto enumVal : xsdc_enum_range<xsd::AudioChannelMask>{}) {
81 audio_channel_mask_t audioChannelMaskHal;
82 std::string audioChannelMask = toString(enumVal);
83 if (enumVal != xsd::AudioChannelMask::AUDIO_CHANNEL_NONE &&
84 audioChannelMask.find("_OUT_") == std::string::npos &&
85 audio_channel_mask_from_string(audioChannelMask.c_str(), &audioChannelMaskHal)) {
86 result.push_back(audioChannelMaskHal);
87 }
88 }
89 return result;
90}();
91
92static const std::vector<audio_output_flags_t> kAudioOutputFlags = [] {
93 std::vector<audio_output_flags_t> result;
94 for (const auto enumVal : xsdc_enum_range<xsd::AudioInOutFlag>{}) {
95 audio_output_flags_t audioOutputFlagHal;
96 std::string audioOutputFlag = toString(enumVal);
97 if (audioOutputFlag.find("_OUTPUT_") != std::string::npos &&
98 audio_output_flag_from_string(audioOutputFlag.c_str(), &audioOutputFlagHal)) {
99 result.push_back(audioOutputFlagHal);
100 }
101 }
102 return result;
103}();
104
105static const std::vector<audio_devices_t> kAudioDevices = [] {
106 std::vector<audio_devices_t> result;
107 for (const auto enumVal : xsdc_enum_range<xsd::AudioDevice>{}) {
108 audio_devices_t audioDeviceHal;
109 std::string audioDevice = toString(enumVal);
110 if (audio_device_from_string(audioDevice.c_str(), &audioDeviceHal)) {
111 result.push_back(audioDeviceHal);
112 }
113 }
114 return result;
115}();
116
117static const std::vector<audio_usage_t> kAudioUsages = [] {
118 std::vector<audio_usage_t> result;
119 for (const auto enumVal : xsdc_enum_range<xsd::AudioUsage>{}) {
120 audio_usage_t audioUsageHal;
121 std::string audioUsage = toString(enumVal);
122 if (audio_usage_from_string(audioUsage.c_str(), &audioUsageHal)) {
123 result.push_back(audioUsageHal);
124 }
125 }
126 return result;
127}();
128
129static const std::vector<audio_source_t> kAudioSources = [] {
130 std::vector<audio_source_t> result;
131 for (const auto enumVal : xsdc_enum_range<xsd::AudioSource>{}) {
132 audio_source_t audioSourceHal;
133 std::string audioSource = toString(enumVal);
134 if (audio_source_from_string(audioSource.c_str(), &audioSourceHal)) {
135 result.push_back(audioSourceHal);
136 }
137 }
138 return result;
139}();
140
141static const std::vector<audio_content_type_t> kAudioContentTypes = [] {
142 std::vector<audio_content_type_t> result;
143 for (const auto enumVal : xsdc_enum_range<xsd::AudioContentType>{}) {
144 audio_content_type_t audioContentTypeHal;
145 std::string audioContentType = toString(enumVal);
146 if (audio_content_type_from_string(audioContentType.c_str(), &audioContentTypeHal)) {
147 result.push_back(audioContentTypeHal);
148 }
149 }
150 return result;
151}();
152
153std::vector<int> kMixTypes = {MIX_TYPE_PLAYERS, MIX_TYPE_RECORDERS};
154
155std::vector<int> kMixRouteFlags = {MIX_ROUTE_FLAG_RENDER, MIX_ROUTE_FLAG_LOOP_BACK,
156 MIX_ROUTE_FLAG_LOOP_BACK_AND_RENDER, MIX_ROUTE_FLAG_ALL};
157
158std::vector<audio_flags_mask_t> kAudioFlagMasks = {
159 AUDIO_FLAG_NONE, AUDIO_FLAG_AUDIBILITY_ENFORCED,
160 AUDIO_FLAG_SECURE, AUDIO_FLAG_SCO,
161 AUDIO_FLAG_BEACON, AUDIO_FLAG_HW_AV_SYNC,
162 AUDIO_FLAG_HW_HOTWORD, AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY,
163 AUDIO_FLAG_BYPASS_MUTE, AUDIO_FLAG_LOW_LATENCY,
164 AUDIO_FLAG_DEEP_BUFFER, AUDIO_FLAG_NO_MEDIA_PROJECTION,
165 AUDIO_FLAG_MUTE_HAPTIC, AUDIO_FLAG_NO_SYSTEM_CAPTURE,
Eric Laurentac08f912021-08-25 15:01:05 +0200166 AUDIO_FLAG_CAPTURE_PRIVATE, AUDIO_FLAG_CONTENT_SPATIALIZED,
167 AUDIO_FLAG_NEVER_SPATIALIZE,
168 };
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530169
170std::vector<audio_policy_dev_state_t> kAudioPolicyDeviceStates = {
171 AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
172 AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
173 AUDIO_POLICY_DEVICE_STATE_CNT,
174};
175
176std::vector<uint32_t> kSamplingRates = {8000, 16000, 44100, 48000, 88200, 96000};
177
178template <typename T>
179T getValueFromVector(FuzzedDataProvider *fdp, std::vector<T> arr) {
180 if (fdp->ConsumeBool()) {
181 return arr[fdp->ConsumeIntegralInRange<int32_t>(0, arr.size() - 1)];
182 } else {
183 return (T)fdp->ConsumeIntegral<uint32_t>();
184 }
185}
186
187class AudioPolicyManagerFuzzer {
188 public:
189 explicit AudioPolicyManagerFuzzer(FuzzedDataProvider *fdp);
190 virtual ~AudioPolicyManagerFuzzer() = default;
191 virtual bool initialize();
192 virtual void SetUpManagerConfig();
193 bool getOutputForAttr(audio_port_handle_t *selectedDeviceId, audio_format_t format,
194 audio_channel_mask_t channelMask, int sampleRate,
195 audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE,
196 audio_io_handle_t *output = nullptr,
197 audio_port_handle_t *portId = nullptr, audio_attributes_t attr = {});
198 bool getInputForAttr(const audio_attributes_t &attr, audio_unique_id_t riid,
199 audio_port_handle_t *selectedDeviceId, audio_format_t format,
200 audio_channel_mask_t channelMask, int sampleRate,
201 audio_input_flags_t flags = AUDIO_INPUT_FLAG_NONE,
202 audio_port_handle_t *portId = nullptr);
203 bool findDevicePort(audio_port_role_t role, audio_devices_t deviceType,
204 const std::string &address, audio_port_v7 *foundPort);
205 static audio_port_handle_t getDeviceIdFromPatch(const struct audio_patch *patch);
206 audio_patch createFuzzedPatch();
207 void fuzzPatchCreation();
208 virtual void process();
209
210 protected:
211 std::unique_ptr<AudioPolicyManagerTestClient> mClient{new AudioPolicyManagerTestClient};
212 std::unique_ptr<AudioPolicyTestManager> mManager{new AudioPolicyTestManager(mClient.get())};
213 FuzzedDataProvider *mFdp;
214};
215
216AudioPolicyManagerFuzzer::AudioPolicyManagerFuzzer(FuzzedDataProvider *fdp)
217 : mFdp(fdp) {}
218
219bool AudioPolicyManagerFuzzer::initialize() {
220 if (mFdp->remaining_bytes() < 1) {
221 return false;
222 }
223 // init code
224 SetUpManagerConfig();
225
226 if (mManager->initialize() != NO_ERROR) {
227 return false;
228 }
229 if (mManager->initCheck() != NO_ERROR) {
230 return false;
231 }
232 return true;
233}
234
235void AudioPolicyManagerFuzzer::SetUpManagerConfig() { mManager->getConfig().setDefault(); }
236
237bool AudioPolicyManagerFuzzer::getOutputForAttr(
238 audio_port_handle_t *selectedDeviceId, audio_format_t format, audio_channel_mask_t channelMask,
239 int sampleRate, audio_output_flags_t flags, audio_io_handle_t *output,
240 audio_port_handle_t *portId, audio_attributes_t attr) {
241 audio_io_handle_t localOutput;
242 if (!output) output = &localOutput;
243 *output = AUDIO_IO_HANDLE_NONE;
244 audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
245 audio_config_t config = AUDIO_CONFIG_INITIALIZER;
246 config.sample_rate = sampleRate;
247 config.channel_mask = channelMask;
248 config.format = format;
249 audio_port_handle_t localPortId;
250 if (!portId) portId = &localPortId;
251 *portId = AUDIO_PORT_HANDLE_NONE;
252 AudioPolicyInterface::output_type_t outputType;
253
Svet Ganov33761132021-05-13 22:51:08 +0000254 // TODO b/182392769: use attribution source util
255 AttributionSourceState attributionSource;
256 attributionSource.uid = 0;
257 attributionSource.token = sp<BBinder>::make();
258 if (mManager->getOutputForAttr(&attr, output, AUDIO_SESSION_NONE, &stream, attributionSource,
259 &config, &flags, selectedDeviceId, portId, {}, &outputType) != OK) {
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530260 return false;
261 }
262 if (*output == AUDIO_IO_HANDLE_NONE || *portId == AUDIO_PORT_HANDLE_NONE) {
263 return false;
264 }
265 return true;
266}
267
268bool AudioPolicyManagerFuzzer::getInputForAttr(
269 const audio_attributes_t &attr, audio_unique_id_t riid, audio_port_handle_t *selectedDeviceId,
270 audio_format_t format, audio_channel_mask_t channelMask, int sampleRate,
271 audio_input_flags_t flags, audio_port_handle_t *portId) {
272 audio_io_handle_t input = AUDIO_IO_HANDLE_NONE;
273 audio_config_base_t config = AUDIO_CONFIG_BASE_INITIALIZER;
274 config.sample_rate = sampleRate;
275 config.channel_mask = channelMask;
276 config.format = format;
277 audio_port_handle_t localPortId;
278 if (!portId) portId = &localPortId;
279 *portId = AUDIO_PORT_HANDLE_NONE;
280 AudioPolicyInterface::input_type_t inputType;
281
Svet Ganov33761132021-05-13 22:51:08 +0000282 AttributionSourceState attributionSource;
283 attributionSource.uid = 0;
284 attributionSource.token = sp<BBinder>::make();
285 if (mManager->getInputForAttr(&attr, &input, riid, AUDIO_SESSION_NONE, attributionSource,
286 &config, flags, selectedDeviceId, &inputType, portId) != OK) {
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530287 return false;
288 }
289 if (*portId == AUDIO_PORT_HANDLE_NONE || input == AUDIO_IO_HANDLE_NONE) {
290 return false;
291 }
292 return true;
293}
294
295bool AudioPolicyManagerFuzzer::findDevicePort(audio_port_role_t role, audio_devices_t deviceType,
296 const std::string &address,
297 audio_port_v7 *foundPort) {
298 uint32_t numPorts = 0;
299 uint32_t generation1;
300 status_t ret;
301
302 ret = mManager->listAudioPorts(role, AUDIO_PORT_TYPE_DEVICE, &numPorts, nullptr, &generation1);
303 if (ret != NO_ERROR) {
304 return false;
305 }
306
307 uint32_t generation2;
308 struct audio_port_v7 ports[numPorts];
309 ret = mManager->listAudioPorts(role, AUDIO_PORT_TYPE_DEVICE, &numPorts, ports, &generation2);
310 if (ret != NO_ERROR) {
311 return false;
312 }
313
314 for (const auto &port : ports) {
315 if (port.role == role && port.ext.device.type == deviceType &&
316 (strncmp(port.ext.device.address, address.c_str(), AUDIO_DEVICE_MAX_ADDRESS_LEN) ==
317 0)) {
318 if (foundPort) *foundPort = port;
319 return true;
320 }
321 }
322 return false;
323}
324
325audio_port_handle_t AudioPolicyManagerFuzzer::getDeviceIdFromPatch(
326 const struct audio_patch *patch) {
327 if (patch->num_sources != 0 && patch->num_sinks != 0) {
328 if (patch->sources[0].type == AUDIO_PORT_TYPE_MIX) {
329 return patch->sinks[0].id;
330 } else {
331 return patch->sources[0].id;
332 }
333 }
334 return AUDIO_PORT_HANDLE_NONE;
335}
336
337audio_patch AudioPolicyManagerFuzzer::createFuzzedPatch() {
338 audio_patch patch{};
339 patch.id = mFdp->ConsumeIntegral<uint32_t>();
340 patch.num_sources = mFdp->ConsumeIntegralInRange(0, AUDIO_PATCH_PORTS_MAX);
341 for (int i = 0; i < patch.num_sources; ++i) {
342 audio_port_config config{};
343 std::vector<uint8_t> bytes = mFdp->ConsumeBytes<uint8_t>(sizeof(config));
344 memcpy(reinterpret_cast<uint8_t *>(&config), &bytes[0], bytes.size());
345 patch.sources[i] = config;
346 }
347 patch.num_sinks = mFdp->ConsumeIntegralInRange(0, AUDIO_PATCH_PORTS_MAX);
348 for (int i = 0; i < patch.num_sinks; ++i) {
349 audio_port_config config{};
350 std::vector<uint8_t> bytes = mFdp->ConsumeBytes<uint8_t>(sizeof(config));
351 memcpy(reinterpret_cast<uint8_t *>(&config), &bytes[0], bytes.size());
352 patch.sinks[i] = config;
353 }
354 return patch;
355}
356
357void AudioPolicyManagerFuzzer::fuzzPatchCreation() {
358 if (mFdp->remaining_bytes()) {
359 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
360 uid_t uid = mFdp->ConsumeIntegral<uint32_t>();
361
362 // create a fuzzed patch
363 handle = AUDIO_PATCH_HANDLE_NONE;
364 audio_patch patch = createFuzzedPatch();
365 uid = mFdp->ConsumeIntegral<uint32_t>();
366 if (mManager->createAudioPatch(&patch, &handle, uid) == NO_ERROR) {
367 mManager->releaseAudioPatch(handle, uid);
368 }
369 }
370}
371
372void AudioPolicyManagerFuzzer::process() {
373 if (initialize()) {
374 fuzzPatchCreation();
375 }
376}
377
378class AudioPolicyManagerFuzzerWithConfigurationFile : public AudioPolicyManagerFuzzer {
379 public:
380 explicit AudioPolicyManagerFuzzerWithConfigurationFile(FuzzedDataProvider *fdp)
381 : AudioPolicyManagerFuzzer(fdp){};
382
383 protected:
384 void SetUpManagerConfig() override;
385 virtual std::string getConfigFile();
386 void traverseAndFuzzXML(xmlDocPtr pDoc, xmlNodePtr curr);
387 std::string fuzzXML(std::string xmlPath);
388
389 static inline const std::string sExecutableDir = base::GetExecutableDirectory() + "/";
390 static inline const std::string sDefaultConfig =
391 sExecutableDir + "data/test_audio_policy_configuration.xml";
392 static inline const std::string sFuzzedConfig = sExecutableDir + "fuzzed.xml";;
393};
394
395std::string AudioPolicyManagerFuzzerWithConfigurationFile::getConfigFile() {
396 return fuzzXML(sDefaultConfig);
397}
398
399void AudioPolicyManagerFuzzerWithConfigurationFile::SetUpManagerConfig() {
400 deserializeAudioPolicyFile(getConfigFile().c_str(), &mManager->getConfig());
401}
402
403void AudioPolicyManagerFuzzerWithConfigurationFile::traverseAndFuzzXML(xmlDocPtr pDoc,
404 xmlNodePtr curr) {
405 if (curr == nullptr) {
406 return;
407 }
408
409 xmlAttr *attribute = curr->properties;
410 while (attribute) {
411 if (!xmlStrcmp(attribute->name, reinterpret_cast<const xmlChar *>("format"))) {
412 const char *newFormat =
413 audio_format_to_string(getValueFromVector<audio_format_t>(mFdp, kAudioFormats));
414 xmlSetProp(curr, attribute->name, reinterpret_cast<const xmlChar *>(newFormat));
415 }
416 if (!xmlStrcmp(attribute->name, reinterpret_cast<const xmlChar *>("flags"))) {
417 std::string newFlag = "";
418 uint16_t numFlags = std::max((uint16_t)1, mFdp->ConsumeIntegral<uint16_t>());
419 for (uint16_t i = 0; i < numFlags; ++i) {
420 newFlag += std::string(audio_output_flag_to_string(
421 getValueFromVector<audio_output_flags_t>(mFdp, kAudioOutputFlags)));
422 if (i != (numFlags - 1)) {
423 newFlag += std::string("|");
424 }
425 }
426 xmlSetProp(curr, attribute->name, reinterpret_cast<const xmlChar *>(newFlag.c_str()));
427 }
428 if (!xmlStrcmp(attribute->name, reinterpret_cast<const xmlChar *>("samplingRates"))) {
429 std::string newRate = "";
430 uint16_t numRates = std::max((uint16_t)1, mFdp->ConsumeIntegral<uint16_t>());
431 for (uint16_t i = 0; i < numRates; ++i) {
432 newRate += std::to_string(getValueFromVector<uint32_t>(mFdp, kSamplingRates));
433 if (i != (numRates - 1)) {
434 newRate += std::string(",");
435 }
436 }
437 xmlSetProp(curr, attribute->name, reinterpret_cast<const xmlChar *>(newRate.c_str()));
438 }
439 if (!xmlStrcmp(attribute->name, reinterpret_cast<const xmlChar *>("channelMasks"))) {
440 int isOutMask = -1;
441 char *value =
442 reinterpret_cast<char *>(xmlNodeListGetString(pDoc, attribute->children, 1));
443 if (std::string(value).find(std::string("_OUT_")) != std::string::npos) {
444 // OUT mask
445 isOutMask = 1;
446 } else if (std::string(value).find(std::string("_IN_")) != std::string::npos) {
447 // IN mask
448 isOutMask = 0;
449 }
450 if (isOutMask != -1) {
451 std::string newMask = "";
452 uint16_t numMasks = std::max((uint16_t)1, mFdp->ConsumeIntegral<uint16_t>());
453 for (uint16_t i = 0; i < numMasks; ++i) {
454 if (isOutMask) {
455 newMask += std::string(audio_channel_out_mask_to_string(
456 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelOutMasks)));
457 } else {
458 newMask += std::string(audio_channel_in_mask_to_string(
459 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelInMasks)));
460 }
461 if (i != (numMasks - 1)) {
462 newMask += std::string(",");
463 }
464 }
465 xmlSetProp(curr, attribute->name,
466 reinterpret_cast<const xmlChar *>(newMask.c_str()));
467 }
468 xmlFree(value);
469 }
470 attribute = attribute->next;
471 }
472
473 curr = curr->xmlChildrenNode;
474 while (curr != nullptr) {
475 traverseAndFuzzXML(pDoc, curr);
476 curr = curr->next;
477 }
478}
479
480std::string AudioPolicyManagerFuzzerWithConfigurationFile::fuzzXML(std::string xmlPath) {
481 std::string outPath = sFuzzedConfig;
482
483 // Load in the xml file from disk
484 xmlDocPtr pDoc = xmlParseFile(xmlPath.c_str());
485 xmlNodePtr root = xmlDocGetRootElement(pDoc);
486
487 traverseAndFuzzXML(pDoc, root);
488
489 // Save the document back out to disk.
490 xmlSaveFileEnc(outPath.c_str(), pDoc, "UTF-8");
491 xmlFreeDoc(pDoc);
492
493 return outPath;
494}
495
496class AudioPolicyManagerFuzzerMsd : public AudioPolicyManagerFuzzerWithConfigurationFile {
497 public:
498 explicit AudioPolicyManagerFuzzerMsd(FuzzedDataProvider *fdp)
499 : AudioPolicyManagerFuzzerWithConfigurationFile(fdp) {}
500
501 protected:
502 std::string getConfigFile() override;
503
504 static inline const std::string sMsdConfig =
505 sExecutableDir + "data/test_audio_policy_msd_configuration.xml";
506};
507
508std::string AudioPolicyManagerFuzzerMsd::getConfigFile() { return fuzzXML(sMsdConfig); }
509
510using PolicyMixTuple = std::tuple<audio_usage_t, audio_source_t, uint32_t>;
511
512class AudioPolicyManagerFuzzerDynamicPolicy : public AudioPolicyManagerFuzzerWithConfigurationFile {
513 public:
514 explicit AudioPolicyManagerFuzzerDynamicPolicy(FuzzedDataProvider *fdp)
515 : AudioPolicyManagerFuzzerWithConfigurationFile(fdp){};
516 ~AudioPolicyManagerFuzzerDynamicPolicy() override;
517 void process() override;
518
519 protected:
520 status_t addPolicyMix(int mixType, int mixFlag, audio_devices_t deviceType,
521 std::string mixAddress, const audio_config_t &audioConfig,
522 const std::vector<PolicyMixTuple> &rules);
523 void clearPolicyMix();
524 void registerPolicyMixes();
525 void unregisterPolicyMixes();
526
527 Vector<AudioMix> mAudioMixes;
528 const std::string mMixAddress = "remote_submix_media";
529};
530
531AudioPolicyManagerFuzzerDynamicPolicy::~AudioPolicyManagerFuzzerDynamicPolicy() {
532 clearPolicyMix();
533}
534
535status_t AudioPolicyManagerFuzzerDynamicPolicy::addPolicyMix(
536 int mixType, int mixFlag, audio_devices_t deviceType, std::string mixAddress,
537 const audio_config_t &audioConfig, const std::vector<PolicyMixTuple> &rules) {
538 Vector<AudioMixMatchCriterion> myMixMatchCriteria;
539
540 for (const auto &rule : rules) {
541 myMixMatchCriteria.add(
542 AudioMixMatchCriterion(std::get<0>(rule), std::get<1>(rule), std::get<2>(rule)));
543 }
544
545 AudioMix myAudioMix(myMixMatchCriteria, mixType, audioConfig, mixFlag,
546 String8(mixAddress.c_str()), 0);
547 myAudioMix.mDeviceType = deviceType;
548 // Clear mAudioMix before add new one to make sure we don't add already existing mixes.
549 mAudioMixes.clear();
550 mAudioMixes.add(myAudioMix);
551
552 // As the policy mixes registration may fail at some case,
553 // caller need to check the returned status.
554 status_t ret = mManager->registerPolicyMixes(mAudioMixes);
555 return ret;
556}
557
558void AudioPolicyManagerFuzzerDynamicPolicy::clearPolicyMix() {
559 if (mManager != nullptr) {
560 mManager->unregisterPolicyMixes(mAudioMixes);
561 }
562 mAudioMixes.clear();
563}
564
565void AudioPolicyManagerFuzzerDynamicPolicy::registerPolicyMixes() {
566 const uint32_t numPolicies = mFdp->ConsumeIntegralInRange<uint32_t>(1, MAX_MIXES_PER_POLICY);
567
568 for (int i = 0; i < numPolicies; ++i) {
569 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
570 audioConfig.channel_mask = getValueFromVector<audio_channel_mask_t>(
571 mFdp, mFdp->ConsumeBool() ? kAudioChannelInMasks : kAudioChannelOutMasks);
572 audioConfig.format = getValueFromVector<audio_format_t>(mFdp, kAudioFormats);
573 audioConfig.sample_rate = getValueFromVector<uint32_t>(mFdp, kSamplingRates);
574 addPolicyMix(getValueFromVector<int>(mFdp, kMixTypes),
575 getValueFromVector<int>(mFdp, kMixRouteFlags),
576 getValueFromVector<audio_devices_t>(mFdp, kAudioDevices), "", audioConfig,
577 std::vector<PolicyMixTuple>());
578 }
579}
580
581void AudioPolicyManagerFuzzerDynamicPolicy::unregisterPolicyMixes() {
582 mManager->unregisterPolicyMixes(mAudioMixes);
583}
584
585void AudioPolicyManagerFuzzerDynamicPolicy::process() {
586 if (initialize()) {
587 registerPolicyMixes();
588 fuzzPatchCreation();
589 unregisterPolicyMixes();
590 }
591}
592
593class AudioPolicyManagerFuzzerDPNoRemoteSubmixModule
594 : public AudioPolicyManagerFuzzerDynamicPolicy {
595 public:
596 explicit AudioPolicyManagerFuzzerDPNoRemoteSubmixModule(FuzzedDataProvider *fdp)
597 : AudioPolicyManagerFuzzerDynamicPolicy(fdp){};
598
599 protected:
600 std::string getConfigFile() override;
601
602 static inline const std::string sPrimaryOnlyConfig =
603 sExecutableDir + "data/test_audio_policy_primary_only_configuration.xml";
604};
605
606std::string AudioPolicyManagerFuzzerDPNoRemoteSubmixModule::getConfigFile() {
607 return fuzzXML(sPrimaryOnlyConfig);
608}
609
610class AudioPolicyManagerFuzzerDPPlaybackReRouting : public AudioPolicyManagerFuzzerDynamicPolicy {
611 public:
612 explicit AudioPolicyManagerFuzzerDPPlaybackReRouting(FuzzedDataProvider *fdp);
613 ~AudioPolicyManagerFuzzerDPPlaybackReRouting() override;
614 void process() override;
615
616 protected:
617 bool initialize() override;
618 void playBackReRouting();
619
620 std::unique_ptr<RecordingActivityTracker> mTracker;
621
622 std::vector<PolicyMixTuple> mUsageRules = {
623 {AUDIO_USAGE_MEDIA, AUDIO_SOURCE_DEFAULT, RULE_MATCH_ATTRIBUTE_USAGE},
624 {AUDIO_USAGE_ALARM, AUDIO_SOURCE_DEFAULT, RULE_MATCH_ATTRIBUTE_USAGE}};
625
626 struct audio_port_v7 mInjectionPort;
627 audio_port_handle_t mPortId = AUDIO_PORT_HANDLE_NONE;
628 audio_config_t mAudioConfig;
629};
630
631AudioPolicyManagerFuzzerDPPlaybackReRouting::AudioPolicyManagerFuzzerDPPlaybackReRouting(
632 FuzzedDataProvider *fdp)
633 : AudioPolicyManagerFuzzerDynamicPolicy(fdp) {
634 const uint32_t numRules = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
635 for (int i = 0; i < numRules; ++i) {
636 PolicyMixTuple rule = {getValueFromVector<audio_usage_t>(mFdp, kAudioUsages),
637 getValueFromVector<audio_source_t>(mFdp, kAudioSources),
638 RULE_MATCH_ATTRIBUTE_USAGE};
639 mUsageRules.push_back(rule);
640 }
641}
642
643AudioPolicyManagerFuzzerDPPlaybackReRouting::~AudioPolicyManagerFuzzerDPPlaybackReRouting() {
644 mManager->stopInput(mPortId);
645}
646
647bool AudioPolicyManagerFuzzerDPPlaybackReRouting::initialize() {
Mufaddal Chakera5d9a9e02021-02-16 14:18:54 +0530648 if (!AudioPolicyManagerFuzzerDynamicPolicy::initialize()) {
649 return false;
650 }
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530651 mTracker.reset(new RecordingActivityTracker());
652
653 mAudioConfig = AUDIO_CONFIG_INITIALIZER;
654 mAudioConfig.channel_mask =
655 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelOutMasks);
656 mAudioConfig.format = getValueFromVector<audio_format_t>(mFdp, kAudioFormats);
657 mAudioConfig.sample_rate = getValueFromVector<uint32_t>(mFdp, kSamplingRates);
658 status_t ret = addPolicyMix(getValueFromVector<int>(mFdp, kMixTypes),
659 getValueFromVector<int>(mFdp, kMixRouteFlags),
660 getValueFromVector<audio_devices_t>(mFdp, kAudioDevices),
661 mMixAddress, mAudioConfig, mUsageRules);
662 if (ret != NO_ERROR) {
663 return false;
664 }
665
666 struct audio_port_v7 extractionPort;
667 findDevicePort(AUDIO_PORT_ROLE_SOURCE, getValueFromVector<audio_devices_t>(mFdp, kAudioDevices),
668 mMixAddress, &extractionPort);
669
670 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
671 audio_source_t source = getValueFromVector<audio_source_t>(mFdp, kAudioSources);
672 audio_attributes_t attr = {AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_UNKNOWN, source,
673 AUDIO_FLAG_NONE, ""};
674 std::string tags = "addr=" + mMixAddress;
675 strncpy(attr.tags, tags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - 1);
676 getInputForAttr(attr, mTracker->getRiid(), &selectedDeviceId, mAudioConfig.format,
677 mAudioConfig.channel_mask, mAudioConfig.sample_rate, AUDIO_INPUT_FLAG_NONE,
678 &mPortId);
679
680 ret = mManager->startInput(mPortId);
681 if (ret != NO_ERROR) {
682 return false;
683 }
684 if (!findDevicePort(AUDIO_PORT_ROLE_SINK,
685 getValueFromVector<audio_devices_t>(mFdp, kAudioDevices), mMixAddress,
686 &mInjectionPort)) {
687 return false;
688 }
689
690 return true;
691}
692
693void AudioPolicyManagerFuzzerDPPlaybackReRouting::playBackReRouting() {
694 const uint32_t numTestCases = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
695 for (int i = 0; i < numTestCases; ++i) {
696 audio_attributes_t attr;
697 attr.content_type = getValueFromVector<audio_content_type_t>(mFdp, kAudioContentTypes);
698 attr.usage = getValueFromVector<audio_usage_t>(mFdp, kAudioUsages);
699 attr.source = getValueFromVector<audio_source_t>(mFdp, kAudioSources);
700 attr.flags = getValueFromVector<audio_flags_mask_t>(mFdp, kAudioFlagMasks);
701 std::string tags(mFdp->ConsumeBool() ? "" : "addr=remote_submix_media");
702 strncpy(attr.tags, tags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - 1);
703
704 audio_port_handle_t playbackRoutedPortId = AUDIO_PORT_HANDLE_NONE;
705 getOutputForAttr(&playbackRoutedPortId, mAudioConfig.format, mAudioConfig.channel_mask,
706 mAudioConfig.sample_rate, AUDIO_OUTPUT_FLAG_NONE, nullptr /*output*/,
707 nullptr /*portId*/, attr);
708 }
709}
710
711void AudioPolicyManagerFuzzerDPPlaybackReRouting::process() {
712 if (initialize()) {
713 playBackReRouting();
714 registerPolicyMixes();
715 fuzzPatchCreation();
716 unregisterPolicyMixes();
717 }
718}
719
720class AudioPolicyManagerFuzzerDPMixRecordInjection : public AudioPolicyManagerFuzzerDynamicPolicy {
721 public:
722 explicit AudioPolicyManagerFuzzerDPMixRecordInjection(FuzzedDataProvider *fdp);
723 ~AudioPolicyManagerFuzzerDPMixRecordInjection() override;
724 void process() override;
725
726 protected:
727 bool initialize() override;
728 void recordingInjection();
729
730 std::unique_ptr<RecordingActivityTracker> mTracker;
731
732 std::vector<PolicyMixTuple> mSourceRules = {
733 {AUDIO_USAGE_UNKNOWN, AUDIO_SOURCE_CAMCORDER, RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET},
734 {AUDIO_USAGE_UNKNOWN, AUDIO_SOURCE_MIC, RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET},
735 {AUDIO_USAGE_UNKNOWN, AUDIO_SOURCE_VOICE_COMMUNICATION,
736 RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET}};
737
738 struct audio_port_v7 mExtractionPort;
739 audio_port_handle_t mPortId = AUDIO_PORT_HANDLE_NONE;
740 audio_config_t mAudioConfig;
741};
742
743AudioPolicyManagerFuzzerDPMixRecordInjection::AudioPolicyManagerFuzzerDPMixRecordInjection(
744 FuzzedDataProvider *fdp)
745 : AudioPolicyManagerFuzzerDynamicPolicy(fdp) {
746 const uint32_t numRules = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
747 for (int i = 0; i < numRules; ++i) {
748 PolicyMixTuple rule = {getValueFromVector<audio_usage_t>(mFdp, kAudioUsages),
749 getValueFromVector<audio_source_t>(mFdp, kAudioSources),
750 RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET};
751 mSourceRules.push_back(rule);
752 }
753}
754
755AudioPolicyManagerFuzzerDPMixRecordInjection::~AudioPolicyManagerFuzzerDPMixRecordInjection() {
756 mManager->stopOutput(mPortId);
757}
758
759bool AudioPolicyManagerFuzzerDPMixRecordInjection::initialize() {
Mufaddal Chakera5d9a9e02021-02-16 14:18:54 +0530760 if (!AudioPolicyManagerFuzzerDynamicPolicy::initialize()) {
761 return false;
762 }
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530763
764 mTracker.reset(new RecordingActivityTracker());
765
766 mAudioConfig = AUDIO_CONFIG_INITIALIZER;
767 mAudioConfig.channel_mask =
768 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelInMasks);
769 mAudioConfig.format = getValueFromVector<audio_format_t>(mFdp, kAudioFormats);
770 mAudioConfig.sample_rate = getValueFromVector<uint32_t>(mFdp, kSamplingRates);
771 status_t ret = addPolicyMix(getValueFromVector<int>(mFdp, kMixTypes),
772 getValueFromVector<int>(mFdp, kMixRouteFlags),
773 getValueFromVector<audio_devices_t>(mFdp, kAudioDevices),
774 mMixAddress, mAudioConfig, mSourceRules);
775 if (ret != NO_ERROR) {
776 return false;
777 }
778
779 struct audio_port_v7 injectionPort;
780 findDevicePort(AUDIO_PORT_ROLE_SINK, getValueFromVector<audio_devices_t>(mFdp, kAudioDevices),
781 mMixAddress, &injectionPort);
782
783 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
784 audio_usage_t usage = getValueFromVector<audio_usage_t>(mFdp, kAudioUsages);
785 audio_attributes_t attr = {AUDIO_CONTENT_TYPE_UNKNOWN, usage, AUDIO_SOURCE_DEFAULT,
786 AUDIO_FLAG_NONE, ""};
787 std::string tags = std::string("addr=") + mMixAddress;
788 strncpy(attr.tags, tags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - 1);
789 getOutputForAttr(&selectedDeviceId, mAudioConfig.format, mAudioConfig.channel_mask,
790 mAudioConfig.sample_rate /*sampleRate*/, AUDIO_OUTPUT_FLAG_NONE,
791 nullptr /*output*/, &mPortId, attr);
792 ret = mManager->startOutput(mPortId);
793 if (ret != NO_ERROR) {
794 return false;
795 }
796 getDeviceIdFromPatch(mClient->getLastAddedPatch());
797 if (!findDevicePort(AUDIO_PORT_ROLE_SOURCE,
798 getValueFromVector<audio_devices_t>(mFdp, kAudioDevices), mMixAddress,
799 &mExtractionPort)) {
800 return false;
801 }
802
803 return true;
804}
805
806void AudioPolicyManagerFuzzerDPMixRecordInjection::recordingInjection() {
807 const uint32_t numTestCases = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
808 for (int i = 0; i < numTestCases; ++i) {
809 audio_attributes_t attr;
810 attr.content_type = getValueFromVector<audio_content_type_t>(mFdp, kAudioContentTypes);
811 attr.usage = getValueFromVector<audio_usage_t>(mFdp, kAudioUsages);
812 attr.source = getValueFromVector<audio_source_t>(mFdp, kAudioSources);
813 attr.flags = getValueFromVector<audio_flags_mask_t>(mFdp, kAudioFlagMasks);
814 std::string tags(mFdp->ConsumeBool() ? "" : "addr=remote_submix_media");
815 strncpy(attr.tags, tags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - 1);
816
817 audio_port_handle_t captureRoutedPortId = AUDIO_PORT_HANDLE_NONE;
818 audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
819 getInputForAttr(attr, mTracker->getRiid(), &captureRoutedPortId, mAudioConfig.format,
820 mAudioConfig.channel_mask, mAudioConfig.sample_rate, AUDIO_INPUT_FLAG_NONE,
821 &portId);
822 }
823}
824
825void AudioPolicyManagerFuzzerDPMixRecordInjection::process() {
826 if (initialize()) {
827 recordingInjection();
828 registerPolicyMixes();
829 fuzzPatchCreation();
830 unregisterPolicyMixes();
831 }
832}
833
834using DeviceConnectionTestParams =
835 std::tuple<audio_devices_t /*type*/, std::string /*name*/, std::string /*address*/>;
836
837class AudioPolicyManagerFuzzerDeviceConnection
838 : public AudioPolicyManagerFuzzerWithConfigurationFile {
839 public:
840 explicit AudioPolicyManagerFuzzerDeviceConnection(FuzzedDataProvider *fdp)
841 : AudioPolicyManagerFuzzerWithConfigurationFile(fdp){};
842 void process() override;
843
jiabin2b9d5a12021-12-10 01:06:29 +0000844 void fuzzGetDirectPlaybackSupport();
845
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530846 protected:
847 void setDeviceConnectionState();
848 void explicitlyRoutingAfterConnection();
849};
850
851void AudioPolicyManagerFuzzerDeviceConnection::setDeviceConnectionState() {
852 const uint32_t numTestCases = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
853 for (int i = 0; i < numTestCases; ++i) {
854 const audio_devices_t type = getValueFromVector<audio_devices_t>(mFdp, kAudioDevices);
855 const std::string name = mFdp->ConsumeRandomLengthString();
856 const std::string address = mFdp->ConsumeRandomLengthString();
857 mManager->setDeviceConnectionState(
858 type, getValueFromVector<audio_policy_dev_state_t>(mFdp, kAudioPolicyDeviceStates),
859 address.c_str(), name.c_str(), getValueFromVector<audio_format_t>(mFdp, kAudioFormats));
860 }
861}
862
863void AudioPolicyManagerFuzzerDeviceConnection::explicitlyRoutingAfterConnection() {
864 const uint32_t numTestCases = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
865 for (int i = 0; i < numTestCases; ++i) {
866 const audio_devices_t type = getValueFromVector<audio_devices_t>(mFdp, kAudioDevices);
867 const std::string name = mFdp->ConsumeRandomLengthString();
868 const std::string address = mFdp->ConsumeRandomLengthString();
869 mManager->setDeviceConnectionState(
870 type, getValueFromVector<audio_policy_dev_state_t>(mFdp, kAudioPolicyDeviceStates),
871 address.c_str(), name.c_str(), getValueFromVector<audio_format_t>(mFdp, kAudioFormats));
872
873 audio_port_v7 devicePort;
874 const audio_port_role_t role =
875 audio_is_output_device(type) ? AUDIO_PORT_ROLE_SINK : AUDIO_PORT_ROLE_SOURCE;
876 findDevicePort(role, type, address, &devicePort);
877
878 audio_port_handle_t routedPortId = devicePort.id;
879 // Try start input or output according to the device type
880 if (audio_is_output_devices(type)) {
881 getOutputForAttr(&routedPortId, getValueFromVector<audio_format_t>(mFdp, kAudioFormats),
882 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelOutMasks),
883 getValueFromVector<uint32_t>(mFdp, kSamplingRates),
884 AUDIO_OUTPUT_FLAG_NONE);
885 } else if (audio_is_input_device(type)) {
886 RecordingActivityTracker tracker;
887 getInputForAttr({}, tracker.getRiid(), &routedPortId,
888 getValueFromVector<audio_format_t>(mFdp, kAudioFormats),
889 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelInMasks),
890 getValueFromVector<uint32_t>(mFdp, kSamplingRates),
891 AUDIO_INPUT_FLAG_NONE);
892 }
893 }
894}
895
jiabin2b9d5a12021-12-10 01:06:29 +0000896void AudioPolicyManagerFuzzerDeviceConnection::fuzzGetDirectPlaybackSupport() {
897 const uint32_t numTestCases = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
898 for (int i = 0; i < numTestCases; ++i) {
899 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
900 attr.content_type = getValueFromVector<audio_content_type_t>(mFdp, kAudioContentTypes);
901 attr.usage = getValueFromVector<audio_usage_t>(mFdp, kAudioUsages);
902 attr.source = getValueFromVector<audio_source_t>(mFdp, kAudioSources);
903 attr.flags = getValueFromVector<audio_flags_mask_t>(mFdp, kAudioFlagMasks);
904 audio_config_t config = AUDIO_CONFIG_INITIALIZER;
905 config.channel_mask = getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelOutMasks);
906 config.format = getValueFromVector<audio_format_t>(mFdp, kAudioFormats);
907 config.sample_rate = getValueFromVector<uint32_t>(mFdp, kSamplingRates);
908 mManager->getDirectPlaybackSupport(&attr, &config);
909 }
910}
911
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530912void AudioPolicyManagerFuzzerDeviceConnection::process() {
913 if (initialize()) {
914 setDeviceConnectionState();
915 explicitlyRoutingAfterConnection();
jiabin2b9d5a12021-12-10 01:06:29 +0000916 fuzzGetDirectPlaybackSupport();
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530917 fuzzPatchCreation();
918 }
919}
920
921class AudioPolicyManagerTVFuzzer : public AudioPolicyManagerFuzzerWithConfigurationFile {
922 public:
923 explicit AudioPolicyManagerTVFuzzer(FuzzedDataProvider *fdp)
924 : AudioPolicyManagerFuzzerWithConfigurationFile(fdp){};
925 void process() override;
926
927 protected:
928 std::string getConfigFile();
929 void testHDMIPortSelection(audio_output_flags_t flags);
930
931 static inline const std::string sTvConfig =
932 AudioPolicyManagerTVFuzzer::sExecutableDir + "data/test_tv_apm_configuration.xml";
933};
934
935std::string AudioPolicyManagerTVFuzzer::getConfigFile() { return fuzzXML(sTvConfig); }
936
937void AudioPolicyManagerTVFuzzer::testHDMIPortSelection(audio_output_flags_t flags) {
938 audio_devices_t audioDevice = getValueFromVector<audio_devices_t>(mFdp, kAudioDevices);
939 audio_format_t audioFormat = getValueFromVector<audio_format_t>(mFdp, kAudioFormats);
940 status_t ret = mManager->setDeviceConnectionState(
941 audioDevice, AUDIO_POLICY_DEVICE_STATE_AVAILABLE, "" /*address*/, "" /*name*/, audioFormat);
942 if (ret != NO_ERROR) {
943 return;
944 }
945 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
946 audio_io_handle_t output;
947 audio_port_handle_t portId;
948 getOutputForAttr(&selectedDeviceId, getValueFromVector<audio_format_t>(mFdp, kAudioFormats),
949 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelOutMasks),
950 getValueFromVector<uint32_t>(mFdp, kSamplingRates), flags, &output, &portId);
951 sp<SwAudioOutputDescriptor> outDesc = mManager->getOutputs().valueFor(output);
952 if (outDesc.get() == nullptr) {
953 return;
954 }
955 audio_port_v7 port = {};
956 outDesc->toAudioPort(&port);
957 mManager->releaseOutput(portId);
958 mManager->setDeviceConnectionState(audioDevice, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
959 "" /*address*/, "" /*name*/, audioFormat);
960}
961
962void AudioPolicyManagerTVFuzzer::process() {
963 if (initialize()) {
964 testHDMIPortSelection(getValueFromVector<audio_output_flags_t>(mFdp, kAudioOutputFlags));
965 fuzzPatchCreation();
966 }
967}
968
969extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
970 if (size < 1) {
971 return 0;
972 }
973 FuzzedDataProvider fdp = FuzzedDataProvider(data, size);
974 while (fdp.remaining_bytes() > 0) {
975 AudioPolicyManagerFuzzer audioPolicyManagerFuzzer(&fdp);
976 audioPolicyManagerFuzzer.process();
977
978 AudioPolicyManagerFuzzerMsd audioPolicyManagerFuzzerMsd(&fdp);
979 audioPolicyManagerFuzzerMsd.process();
980
981 AudioPolicyManagerFuzzerWithConfigurationFile audioPolicyManagerFuzzerWithConfigurationFile(
982 &fdp);
983 audioPolicyManagerFuzzerWithConfigurationFile.process();
984
985 AudioPolicyManagerFuzzerDynamicPolicy audioPolicyManagerFuzzerDynamicPolicy(&fdp);
986 audioPolicyManagerFuzzerDynamicPolicy.process();
987
988 AudioPolicyManagerFuzzerDPNoRemoteSubmixModule
989 audioPolicyManagerFuzzerDPNoRemoteSubmixModule(&fdp);
990 audioPolicyManagerFuzzerDPNoRemoteSubmixModule.process();
991
992 AudioPolicyManagerFuzzerDPPlaybackReRouting audioPolicyManagerFuzzerDPPlaybackReRouting(
993 &fdp);
994 audioPolicyManagerFuzzerDPPlaybackReRouting.process();
995
996 AudioPolicyManagerFuzzerDPMixRecordInjection audioPolicyManagerFuzzerDPMixRecordInjection(
997 &fdp);
998 audioPolicyManagerFuzzerDPMixRecordInjection.process();
999
1000 AudioPolicyManagerFuzzerDeviceConnection audioPolicyManagerFuzzerDeviceConnection(&fdp);
1001 audioPolicyManagerFuzzerDeviceConnection.process();
1002
1003 AudioPolicyManagerTVFuzzer audioPolicyManagerTVFuzzer(&fdp);
1004 audioPolicyManagerTVFuzzer.process();
1005 }
1006 return 0;
1007}