1 /*
2 * Copyright (C) 2024 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 // Test platform related API from AAudio
18
19 #include <aaudio/AAudio.h>
20 #include <gtest/gtest.h>
21
22 #include <functional>
23 #include <set>
24 #include <sstream>
25 #include <string>
26
27 #include "utils.h"
28
29 #define AAUDIO_CASE_ENUM(name) \
30 case name: \
31 return #name
32
deviceToString(AAudio_DeviceType device)33 static std::string deviceToString(AAudio_DeviceType device) {
34 switch (device) {
35 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_BUILTIN_EARPIECE);
36 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_BUILTIN_SPEAKER);
37 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_WIRED_HEADSET);
38 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_WIRED_HEADPHONES);
39 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_LINE_ANALOG);
40 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_LINE_DIGITAL);
41 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_BLUETOOTH_SCO);
42 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_BLUETOOTH_A2DP);
43 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_HDMI);
44 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_HDMI_ARC);
45 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_USB_DEVICE);
46 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_USB_ACCESSORY);
47 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_DOCK);
48 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_FM);
49 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_BUILTIN_MIC);
50 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_FM_TUNER);
51 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_TV_TUNER);
52 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_TELEPHONY);
53 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_AUX_LINE);
54 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_IP);
55 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_BUS);
56 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_USB_HEADSET);
57 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_HEARING_AID);
58 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_BUILTIN_SPEAKER_SAFE);
59 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_REMOTE_SUBMIX);
60 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_BLE_HEADSET);
61 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_BLE_SPEAKER);
62 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_HDMI_EARC);
63 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_BLE_BROADCAST);
64 AAUDIO_CASE_ENUM(AAUDIO_DEVICE_DOCK_ANALOG);
65 default:
66 return std::to_string(device);
67 }
68 }
69
70 using PlatformPolicyTestParam = std::tuple<AAudio_DeviceType, aaudio_direction_t>;
71
72 class PlatformPolicyTest : public AAudioCtsBase,
73 public ::testing::WithParamInterface<PlatformPolicyTestParam> {
74 public:
75 static std::string getTestName(const ::testing::TestParamInfo<PlatformPolicyTestParam>& info);
76
77 protected:
78 enum policy_type_t {
79 DEFAULT,
80 EXCLUSIVE,
81 };
82
83 void runTest(AAudio_DeviceType device, aaudio_direction_t direction, policy_type_t policyType);
84 };
85
86 // static
getTestName(const::testing::TestParamInfo<PlatformPolicyTestParam> & info)87 std::string PlatformPolicyTest::getTestName(
88 const ::testing::TestParamInfo<PlatformPolicyTestParam>& info) {
89 return deviceToString(std::get<0>(info.param)) + "_as_" +
90 (std::get<1>(info.param) == AAUDIO_DIRECTION_INPUT ? "input" : "output");
91 }
92
runTest(AAudio_DeviceType device,aaudio_direction_t direction,policy_type_t policyType)93 void PlatformPolicyTest::runTest(AAudio_DeviceType device, aaudio_direction_t direction,
94 policy_type_t policyType) {
95 const bool isValidValue = direction == AAUDIO_DIRECTION_INPUT
96 ? (ALL_VALID_INPUT_DEVICES.count(device) != 0)
97 : (ALL_VALID_OUTPUT_DEVICES.count(device) != 0);
98 auto result = policyType == DEFAULT
99 ? AAudioExtensions::getInstance().getPlatformMMapPolicy(device, direction)
100 : AAudioExtensions::getInstance().getPlatformMMapExclusivePolicy(device, direction);
101 if (isValidValue) {
102 ASSERT_GT(ALL_VALID_POLICIES.count(result), 0);
103 } else {
104 ASSERT_EQ(AAUDIO_ERROR_ILLEGAL_ARGUMENT, result);
105 }
106 }
107
TEST_P(PlatformPolicyTest,getDefaultPolicy)108 TEST_P(PlatformPolicyTest, getDefaultPolicy) {
109 ASSERT_NO_FATAL_FAILURE(runTest(std::get<0>(GetParam()), std::get<1>(GetParam()), DEFAULT));
110 }
111
TEST_P(PlatformPolicyTest,getExclusivePolicy)112 TEST_P(PlatformPolicyTest, getExclusivePolicy) {
113 ASSERT_NO_FATAL_FAILURE(runTest(std::get<0>(GetParam()), std::get<1>(GetParam()), EXCLUSIVE));
114 }
115
116 INSTANTIATE_TEST_CASE_P(
117 AAudioTestPlatform, PlatformPolicyTest,
118 ::testing::Combine(
119 ::testing::Values(
120 AAUDIO_DEVICE_BUILTIN_EARPIECE, AAUDIO_DEVICE_BUILTIN_SPEAKER,
121 AAUDIO_DEVICE_WIRED_HEADSET, AAUDIO_DEVICE_WIRED_HEADPHONES,
122 AAUDIO_DEVICE_LINE_ANALOG, AAUDIO_DEVICE_LINE_DIGITAL,
123 AAUDIO_DEVICE_BLUETOOTH_SCO, AAUDIO_DEVICE_BLUETOOTH_A2DP,
124 AAUDIO_DEVICE_HDMI, AAUDIO_DEVICE_HDMI_ARC, AAUDIO_DEVICE_USB_DEVICE,
125 AAUDIO_DEVICE_USB_ACCESSORY, AAUDIO_DEVICE_DOCK, AAUDIO_DEVICE_FM,
126 AAUDIO_DEVICE_BUILTIN_MIC, AAUDIO_DEVICE_FM_TUNER, AAUDIO_DEVICE_TV_TUNER,
127 AAUDIO_DEVICE_TELEPHONY, AAUDIO_DEVICE_AUX_LINE, AAUDIO_DEVICE_IP,
128 AAUDIO_DEVICE_BUS, AAUDIO_DEVICE_USB_HEADSET, AAUDIO_DEVICE_HEARING_AID,
129 AAUDIO_DEVICE_BUILTIN_SPEAKER_SAFE, AAUDIO_DEVICE_REMOTE_SUBMIX,
130 AAUDIO_DEVICE_BLE_HEADSET, AAUDIO_DEVICE_BLE_SPEAKER,
131 AAUDIO_DEVICE_HDMI_EARC, AAUDIO_DEVICE_BLE_BROADCAST,
132 AAUDIO_DEVICE_DOCK_ANALOG,
133 1234567 /*random number that is not yet defined as a device type*/),
134 ::testing::Values(AAUDIO_DIRECTION_INPUT, AAUDIO_DIRECTION_OUTPUT)),
135 &PlatformPolicyTest::getTestName);
136