1 /*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "audio_device_status_unit_test.h"
17 #include "audio_device_info.h"
18
19 using namespace testing::ext;
20
21 namespace OHOS {
22 namespace AudioStandard {
SetUpTestCase(void)23 void AudioDeviceStatusUnitTest::SetUpTestCase(void) {}
TearDownTestCase(void)24 void AudioDeviceStatusUnitTest::TearDownTestCase(void) {}
SetUp(void)25 void AudioDeviceStatusUnitTest::SetUp(void)
26 {
27 std::shared_ptr<AudioA2dpOffloadManager> audioA2dpOffloadManager = std::make_shared<AudioA2dpOffloadManager>();
28 std::shared_ptr<AudioPolicyServerHandler> audioPolicyServerHandler =
29 DelayedSingleton<AudioPolicyServerHandler>::GetInstance();
30 AudioDeviceStatus& audioDeviceStatus = AudioDeviceStatus::GetInstance();
31
32 audioA2dpOffloadManager->Init();
33 audioDeviceStatus.Init(audioA2dpOffloadManager, audioPolicyServerHandler);
34 }
35
TearDown(void)36 void AudioDeviceStatusUnitTest::TearDown(void)
37 {
38 AudioDeviceStatus& audioDeviceStatus = AudioDeviceStatus::GetInstance();
39
40 audioDeviceStatus.DeInit();
41 }
42
43 /**
44 * @tc.name : Test AudioDeviceStatus.
45 * @tc.number: AudioDeviceStatus_001
46 * @tc.desc : Test RehandlePnpDevice interface.
47 */
48 HWTEST_F(AudioDeviceStatusUnitTest, AudioDeviceStatus_001, TestSize.Level1)
49 {
50 DeviceType deviceType = DEVICE_TYPE_USB_HEADSET;
51 DeviceRole deviceRole = DEVICE_ROLE_NONE;
52 std::string address = "00:11:22:33:44:55";
53 int32_t ret = 0;
54 AudioDeviceStatus& audioDeviceStatus = AudioDeviceStatus::GetInstance();
55
56 ret = audioDeviceStatus.RehandlePnpDevice(deviceType, deviceRole, address);
57 EXPECT_NE(ret, 0);
58
59 deviceRole = INPUT_DEVICE;
60 ret = audioDeviceStatus.RehandlePnpDevice(deviceType, deviceRole, address);
61 EXPECT_EQ(ret, 0);
62
63 deviceType = DEVICE_TYPE_USB_ARM_HEADSET;
64 ret = audioDeviceStatus.RehandlePnpDevice(deviceType, deviceRole, address);
65 EXPECT_EQ(ret, 0);
66
67 deviceType = DEVICE_TYPE_DP;
68 ret = audioDeviceStatus.RehandlePnpDevice(deviceType, deviceRole, address);
69 EXPECT_NE(ret, 0);
70 }
71
72 /**
73 * @tc.name : Test AudioDeviceStatus.
74 * @tc.number: AudioDeviceStatus_002
75 * @tc.desc : Test HandleArmUsbDevice interface.
76 */
77 HWTEST_F(AudioDeviceStatusUnitTest, AudioDeviceStatus_002, TestSize.Level1)
78 {
79 DeviceType deviceType = DEVICE_TYPE_USB_HEADSET;
80 DeviceRole deviceRole = DEVICE_ROLE_NONE;
81 std::string address = "00:11:22:33:44:55";
82 int32_t ret = 0;
83 AudioDeviceStatus& audioDeviceStatus = AudioDeviceStatus::GetInstance();
84
85 audioDeviceStatus.audioActiveDevice_.SetCurrentOutputDeviceType(DEVICE_TYPE_USB_HEADSET);
86 ret = audioDeviceStatus.HandleArmUsbDevice(deviceType, deviceRole, address);
87 EXPECT_EQ(ret, 0);
88 }
89
90 /**
91 * @tc.name : Test AudioDeviceStatus.
92 * @tc.number: AudioDeviceStatus_003
93 * @tc.desc : Test NoNeedChangeUsbDevice interface.
94 */
95 HWTEST_F(AudioDeviceStatusUnitTest, AudioDeviceStatus_003, TestSize.Level1)
96 {
97 std::string address = "00:11:22:33:44:55";
98 bool bRet = true;
99 AudioDeviceStatus& audioDeviceStatus = AudioDeviceStatus::GetInstance();
100
101 bRet = audioDeviceStatus.NoNeedChangeUsbDevice(address);
102 EXPECT_EQ(bRet, false);
103 }
104
105 /**
106 * @tc.name : Test AudioDeviceStatus.
107 * @tc.number: AudioDeviceStatus_004
108 * @tc.desc : Test TriggerMicrophoneBlockedCallback interface.
109 */
110 HWTEST_F(AudioDeviceStatusUnitTest, AudioDeviceStatus_004, TestSize.Level1)
111 {
112 vector<std::shared_ptr<AudioDeviceDescriptor>> desc;
113 DeviceBlockStatus status = DEVICE_UNBLOCKED;
114 AudioDeviceStatus& audioDeviceStatus = AudioDeviceStatus::GetInstance();
115
116 audioDeviceStatus.TriggerMicrophoneBlockedCallback(desc, status);
117 EXPECT_NE(audioDeviceStatus.audioPolicyServerHandler_, nullptr);
118 }
119
120 /**
121 * @tc.name : Test AudioDeviceStatus.
122 * @tc.number: AudioDeviceStatus_005
123 * @tc.desc : Test ReloadA2dpOffloadOnDeviceChanged interface.
124 */
125 HWTEST_F(AudioDeviceStatusUnitTest, AudioDeviceStatus_005, TestSize.Level1)
126 {
127 DeviceType deviceType = DEVICE_TYPE_USB_HEADSET;
128 std::string macAddress = "00:11:22:33:44:55";
129 std::string deviceName = "usb_headset";
130 AudioStreamInfo streamInfo = {SAMPLE_RATE_48000, ENCODING_PCM, SAMPLE_S16LE, STEREO};
131 AudioDeviceStatus& audioDeviceStatus = AudioDeviceStatus::GetInstance();
132 std::unique_ptr <AudioAffinityManager> audioAffinityManager = std::make_unique<AudioAffinityManager>();
133
134 ClassType classType = TYPE_A2DP;
135 AudioModuleInfo moduleInfo = {"className", "TEST", "TEST"};
136 std::list<AudioModuleInfo> audioModuleListData = {};
137
138 audioModuleListData.push_back(moduleInfo);
139 audioDeviceStatus.audioConfigManager_.deviceClassInfo_[classType] = audioModuleListData;
140
141 audioDeviceStatus.ReloadA2dpOffloadOnDeviceChanged(deviceType, macAddress, deviceName, streamInfo);
142 EXPECT_EQ(audioDeviceStatus.audioIOHandleMap_.CheckIOHandleExist(moduleInfo.name), false);
143 }
144
145 /**
146 * @tc.name : Test AudioDeviceStatus.
147 * @tc.number: AudioDeviceStatus_006
148 * @tc.desc : Test GetDeviceTypeFromPin interface.
149 */
150 HWTEST_F(AudioDeviceStatusUnitTest, AudioDeviceStatus_006, TestSize.Level1)
151 {
152 AudioPin hdiPin = AUDIO_PIN_NONE;
153 DeviceType deviceType = DEVICE_TYPE_NONE;
154 AudioDeviceStatus& audioDeviceStatus = AudioDeviceStatus::GetInstance();
155
156 deviceType = audioDeviceStatus.GetDeviceTypeFromPin(hdiPin);
157 EXPECT_EQ(deviceType, DEVICE_TYPE_DEFAULT);
158
159 hdiPin = AUDIO_PIN_OUT_SPEAKER;
160 deviceType = audioDeviceStatus.GetDeviceTypeFromPin(hdiPin);
161 EXPECT_EQ(deviceType, DEVICE_TYPE_SPEAKER);
162
163 hdiPin = AUDIO_PIN_OUT_DAUDIO_DEFAULT;
164 deviceType = audioDeviceStatus.GetDeviceTypeFromPin(hdiPin);
165 EXPECT_EQ(deviceType, DEVICE_TYPE_SPEAKER);
166
167 hdiPin = AUDIO_PIN_OUT_HEADSET;
168 deviceType = audioDeviceStatus.GetDeviceTypeFromPin(hdiPin);
169 EXPECT_EQ(deviceType, DEVICE_TYPE_DEFAULT);
170
171 hdiPin = AUDIO_PIN_OUT_LINEOUT;
172 deviceType = audioDeviceStatus.GetDeviceTypeFromPin(hdiPin);
173 EXPECT_EQ(deviceType, DEVICE_TYPE_DEFAULT);
174
175 hdiPin = AUDIO_PIN_OUT_HDMI;
176 deviceType = audioDeviceStatus.GetDeviceTypeFromPin(hdiPin);
177 EXPECT_EQ(deviceType, DEVICE_TYPE_DEFAULT);
178
179 hdiPin = AUDIO_PIN_OUT_USB;
180 deviceType = audioDeviceStatus.GetDeviceTypeFromPin(hdiPin);
181 EXPECT_EQ(deviceType, DEVICE_TYPE_DEFAULT);
182
183 hdiPin = AUDIO_PIN_OUT_USB_EXT;
184 deviceType = audioDeviceStatus.GetDeviceTypeFromPin(hdiPin);
185 EXPECT_EQ(deviceType, DEVICE_TYPE_DEFAULT);
186
187 hdiPin = AUDIO_PIN_OUT_USB_HEADSET;
188 deviceType = audioDeviceStatus.GetDeviceTypeFromPin(hdiPin);
189 EXPECT_EQ(deviceType, DEVICE_TYPE_USB_ARM_HEADSET);
190
191 hdiPin = AUDIO_PIN_IN_USB_HEADSET;
192 deviceType = audioDeviceStatus.GetDeviceTypeFromPin(hdiPin);
193 EXPECT_EQ(deviceType, DEVICE_TYPE_USB_ARM_HEADSET);
194
195 hdiPin = AUDIO_PIN_IN_MIC;
196 deviceType = audioDeviceStatus.GetDeviceTypeFromPin(hdiPin);
197 EXPECT_EQ(deviceType, DEVICE_TYPE_MIC);
198
199 hdiPin = AUDIO_PIN_IN_DAUDIO_DEFAULT;
200 deviceType = audioDeviceStatus.GetDeviceTypeFromPin(hdiPin);
201 EXPECT_EQ(deviceType, DEVICE_TYPE_MIC);
202
203 hdiPin = AUDIO_PIN_IN_HS_MIC;
204 deviceType = audioDeviceStatus.GetDeviceTypeFromPin(hdiPin);
205 EXPECT_EQ(deviceType, DEVICE_TYPE_DEFAULT);
206
207 hdiPin = AUDIO_PIN_IN_LINEIN;
208 deviceType = audioDeviceStatus.GetDeviceTypeFromPin(hdiPin);
209 EXPECT_EQ(deviceType, DEVICE_TYPE_DEFAULT);
210
211 hdiPin = AUDIO_PIN_IN_USB_EXT;
212 deviceType = audioDeviceStatus.GetDeviceTypeFromPin(hdiPin);
213 EXPECT_EQ(deviceType, DEVICE_TYPE_DEFAULT);
214 }
215
216 /**
217 * @tc.name : Test AudioDeviceStatus.
218 * @tc.number: AudioDeviceStatus_007
219 * @tc.desc : Test OnDeviceStatusUpdated interface.
220 */
221 HWTEST_F(AudioDeviceStatusUnitTest, AudioDeviceStatus_007, TestSize.Level1)
222 {
223 DeviceType devType = DEVICE_TYPE_INVALID;
224 bool isConnected = true;
225 std::string macAddress = "00:11:22:33:44:55";
226 std::string deviceName = "testDevice";
227 AudioStreamInfo streamInfo = {SAMPLE_RATE_48000, ENCODING_PCM, SAMPLE_S16LE, STEREO};
228 DeviceRole role = DEVICE_ROLE_NONE;
229 bool hasPair = false;
230 AudioDeviceStatus& audioDeviceStatus = AudioDeviceStatus::GetInstance();
231
232 audioDeviceStatus.OnDeviceStatusUpdated(devType, isConnected, macAddress, deviceName, streamInfo, role, hasPair);
233 EXPECT_NE(audioDeviceStatus.audioA2dpOffloadManager_, nullptr);
234
235 isConnected = false;
236 audioDeviceStatus.OnDeviceStatusUpdated(devType, isConnected, macAddress, deviceName, streamInfo, role, hasPair);
237 EXPECT_NE(audioDeviceStatus.audioA2dpOffloadManager_, nullptr);
238 }
239
240 /**
241 * @tc.name : Test AudioDeviceStatus.
242 * @tc.number: AudioDeviceStatus_008
243 * @tc.desc : Test HandleDistributedDeviceUpdate interface.
244 */
245 HWTEST_F(AudioDeviceStatusUnitTest, AudioDeviceStatus_008, TestSize.Level1)
246 {
247 DStatusInfo statusInfo;
248 std::vector<std::shared_ptr<AudioDeviceDescriptor>> descForCb;
249 int32_t ret;
250 AudioDeviceStatus& audioDeviceStatus = AudioDeviceStatus::GetInstance();
251
252 statusInfo.hdiPin = AUDIO_PIN_NONE;
253 statusInfo.deviceName = "test";
254 statusInfo.macAddress = "00:11:22:33:44:55";
255 statusInfo.isConnected = true;
256 ret = audioDeviceStatus.HandleDistributedDeviceUpdate(statusInfo, descForCb);
257 EXPECT_EQ(ret, SUCCESS);
258
259 statusInfo.isConnected = false;
260 ret = audioDeviceStatus.HandleDistributedDeviceUpdate(statusInfo, descForCb);
261 EXPECT_EQ(ret, SUCCESS);
262 }
263
264 /**
265 * @tc.name : Test AudioDeviceStatus.
266 * @tc.number: AudioDeviceStatus_009
267 * @tc.desc : Test UpdateDeviceList interface.
268 */
269 HWTEST_F(AudioDeviceStatusUnitTest, AudioDeviceStatus_009, TestSize.Level1)
270 {
271 AudioDeviceDescriptor updatedDesc;
272 bool isConnected = true;
273 std::vector<std::shared_ptr<AudioDeviceDescriptor>> descForCb;
274 AudioStreamDeviceChangeReasonExt::ExtEnum oldDevice =
275 AudioStreamDeviceChangeReasonExt::ExtEnum::OLD_DEVICE_UNAVALIABLE;
276 AudioStreamDeviceChangeReasonExt reason(oldDevice);
277 AudioDeviceStatus& audioDeviceStatus = AudioDeviceStatus::GetInstance();
278
279 updatedDesc.deviceType_ = DEVICE_TYPE_INVALID;
280 updatedDesc.macAddress_ = "00:11:22:33:44:55";
281 updatedDesc.deviceRole_ = DEVICE_ROLE_NONE;
282 audioDeviceStatus.UpdateDeviceList(updatedDesc, isConnected, descForCb, reason);
283 EXPECT_EQ(reason, AudioStreamDeviceChangeReason::NEW_DEVICE_AVAILABLE);
284
285 isConnected = false;
286 audioDeviceStatus.UpdateDeviceList(updatedDesc, isConnected, descForCb, reason);
287 EXPECT_EQ(reason, AudioStreamDeviceChangeReason::OLD_DEVICE_UNAVALIABLE);
288 }
289
290 /**
291 * @tc.name : Test AudioDeviceStatus.
292 * @tc.number: AudioDeviceStatus_010
293 * @tc.desc : Test OnPreferredStateUpdated interface.
294 */
295 HWTEST_F(AudioDeviceStatusUnitTest, AudioDeviceStatus_010, TestSize.Level1)
296 {
297 AudioDeviceDescriptor desc;
298 DeviceInfoUpdateCommand updateCommand = CATEGORY_UPDATE;
299 AudioStreamDeviceChangeReasonExt::ExtEnum oldDevice =
300 AudioStreamDeviceChangeReasonExt::ExtEnum::OLD_DEVICE_UNAVALIABLE;
301 AudioStreamDeviceChangeReasonExt reason(oldDevice);
302 AudioDeviceStatus& audioDeviceStatus = AudioDeviceStatus::GetInstance();
303
304 desc.deviceCategory_ = BT_UNWEAR_HEADPHONE;
305 audioDeviceStatus.OnPreferredStateUpdated(desc, updateCommand, reason);
306 EXPECT_EQ(reason, AudioStreamDeviceChangeReason::OLD_DEVICE_UNAVALIABLE);
307
308 desc.deviceType_ = DEVICE_TYPE_BLUETOOTH_A2DP;
309 desc.deviceCategory_ = CATEGORY_DEFAULT;
310 audioDeviceStatus.OnPreferredStateUpdated(desc, updateCommand, reason);
311 EXPECT_EQ(reason, AudioStreamDeviceChangeReason::NEW_DEVICE_AVAILABLE);
312
313 desc.deviceType_ = DEVICE_TYPE_INVALID;
314 desc.deviceCategory_ = CATEGORY_DEFAULT;
315 audioDeviceStatus.OnPreferredStateUpdated(desc, updateCommand, reason);
316 EXPECT_EQ(reason, AudioStreamDeviceChangeReason::NEW_DEVICE_AVAILABLE);
317
318 updateCommand = ENABLE_UPDATE;
319 desc.isEnable_ = false;
320 desc.deviceType_ = DEVICE_TYPE_BLUETOOTH_SCO;
321 audioDeviceStatus.OnPreferredStateUpdated(desc, updateCommand, reason);
322 EXPECT_EQ(reason, AudioStreamDeviceChangeReason::OLD_DEVICE_UNAVALIABLE);
323 }
324 } // namespace AudioStandard
325 } // namespace OHOS
326