1 /*
2 * Copyright (c) 2024 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 #include <gtest/gtest.h>
16 #include "audio_renderer_sink.h"
17 #include "audio_errors.h"
18
19 using namespace testing::ext;
20 namespace OHOS {
21 namespace AudioStandard {
22 const std::string DIRECT_SINK_NAME = "direct";
23 const std::string VOIP_SINK_NAME = "voip";
24 const char *SINK_ADAPTER_NAME = "primary";
25 class AudioDirectSinkUnitTest : public testing::Test {
26 public:
27 static void SetUpTestCase(void);
28 static void TearDownTestCase(void);
29 void SetUp();
30 void TearDown();
31
32 protected:
33 AudioRendererSink *sink;
34 AudioRendererSink *voipSink;
35 };
36
SetUpTestCase(void)37 void AudioDirectSinkUnitTest::SetUpTestCase(void)
38 {
39 // input testsuit setup step,setup invoked before all testcases
40 }
41
TearDownTestCase(void)42 void AudioDirectSinkUnitTest::TearDownTestCase(void)
43 {
44 // input testsuit teardown step,teardown invoked after all testcases
45 }
46
SetUp(void)47 void AudioDirectSinkUnitTest::SetUp(void)
48 {
49 sink = AudioRendererSink::GetInstance(DIRECT_SINK_NAME);
50 voipSink = AudioRendererSink::GetInstance(VOIP_SINK_NAME);
51 }
52
TearDown(void)53 void AudioDirectSinkUnitTest::TearDown(void)
54 {
55 if (sink && sink->IsInited()) {
56 sink->DeInit();
57 }
58 if (voipSink && voipSink->IsInited()) {
59 voipSink->DeInit();
60 }
61 }
62
63 /**
64 * @tc.name : Test Audio Direct Sink Create
65 * @tc.type : FUNC
66 * @tc.number: DirectAudioSinkCreate_001
67 * @tc.desc : Test audio direct sink create success
68 */
69 HWTEST_F(AudioDirectSinkUnitTest, DirectAudioSinkCreate_001, TestSize.Level1)
70 {
71 EXPECT_NE(nullptr, this->sink);
72 }
73
74 /**
75 * @tc.name : Test Audio Direct Sink
76 * @tc.type : FUNC
77 * @tc.number: DirectAudioSinkInit_001
78 * @tc.desc : Test audio direct sink init(setVolume) success
79 */
80 HWTEST_F(AudioDirectSinkUnitTest, DirectAudioSinkInit_001, TestSize.Level1)
81 {
82 EXPECT_NE(nullptr, this->sink);
83 IAudioSinkAttr attr = {};
84 attr.adapterName = SINK_ADAPTER_NAME;
85 attr.sampleRate = 48000;
86 attr.channel = 2;
87 attr.format = HdiAdapterFormat::SAMPLE_S32;
88 attr.channelLayout = 3;
89 attr.deviceType = DEVICE_TYPE_WIRED_HEADSET;
90 attr.volume = 1.0f;
91 attr.openMicSpeaker = 1;
92 int32_t ret = sink->Init(attr);
93 EXPECT_EQ(SUCCESS, ret);
94 float volume = 1.0f;
95 ret = sink->SetVolume(volume, volume);
96 EXPECT_EQ(SUCCESS, ret);
97 }
98
99 /**
100 * @tc.name : Test Direct Sink State
101 * @tc.type : FUNC
102 * @tc.number: DirectAudioSinkState_001
103 * @tc.desc : Test direct sink state(init->start->stop) success
104 */
105 HWTEST_F(AudioDirectSinkUnitTest, DirectAudioSinkState_001, TestSize.Level1)
106 {
107 EXPECT_NE(nullptr, this->sink);
108 IAudioSinkAttr attr = {};
109 attr.adapterName = SINK_ADAPTER_NAME;
110 attr.sampleRate = 48000;
111 attr.channel = 2;
112 attr.format = HdiAdapterFormat::SAMPLE_S32;
113 attr.channelLayout = 3;
114 attr.deviceType = DEVICE_TYPE_WIRED_HEADSET;
115 attr.volume = 1.0f;
116 attr.openMicSpeaker = 1;
117 int32_t ret = sink->Init(attr);
118 EXPECT_EQ(SUCCESS, ret);
119 ret = sink->Start();
120 EXPECT_EQ(SUCCESS, ret);
121 ret = sink->Stop();
122 EXPECT_EQ(SUCCESS, ret);
123 }
124
125 /**
126 * @tc.name : Test Direct Sink Init State
127 * @tc.type : FUNC
128 * @tc.number: DirectAudioSinkState_002
129 * @tc.desc : Test direct sink init state success
130 */
131 HWTEST_F(AudioDirectSinkUnitTest, DirectAudioSinkState_002, TestSize.Level1)
132 {
133 EXPECT_NE(nullptr, this->sink);
134 IAudioSinkAttr attr = {};
135 attr.adapterName = SINK_ADAPTER_NAME;
136 attr.sampleRate = 48000;
137 attr.channel = 2;
138 attr.format = HdiAdapterFormat::SAMPLE_S32;
139 attr.channelLayout = 3;
140 attr.deviceType = DEVICE_TYPE_WIRED_HEADSET;
141 attr.volume = 1.0f;
142 attr.openMicSpeaker = 1;
143 bool isInited = sink->IsInited();
144 EXPECT_EQ(false, isInited);
145
146 int32_t ret = sink->Init(attr);
147 EXPECT_EQ(SUCCESS, ret);
148
149 isInited = sink->IsInited();
150 EXPECT_EQ(true, isInited);
151
152 sink->DeInit();
153
154 isInited = sink->IsInited();
155 EXPECT_EQ(false, isInited);
156
157 // Continuous execution init
158 ret = sink->Init(attr);
159 EXPECT_EQ(SUCCESS, ret);
160 ret = sink->Init(attr);
161 EXPECT_EQ(SUCCESS, ret);
162 isInited = sink->IsInited();
163 EXPECT_EQ(true, isInited);
164 }
165
166 /**
167 * @tc.name : Test Direct Sink Start State
168 * @tc.type : FUNC
169 * @tc.number: DirectAudioSinkState_003
170 * @tc.desc : Test direct sink start state success
171 */
172 HWTEST_F(AudioDirectSinkUnitTest, DirectAudioSinkState_003, TestSize.Level1)
173 {
174 EXPECT_NE(nullptr, this->sink);
175 IAudioSinkAttr attr = {};
176 attr.adapterName = SINK_ADAPTER_NAME;
177 attr.sampleRate = 48000;
178 attr.channel = 2;
179 attr.format = HdiAdapterFormat::SAMPLE_S32;
180 attr.channelLayout = 3;
181 attr.deviceType = DEVICE_TYPE_WIRED_HEADSET;
182 attr.volume = 1.0f;
183 attr.openMicSpeaker = 1;
184 int32_t ret = sink->Init(attr);
185 EXPECT_EQ(SUCCESS, ret);
186
187 ret = sink->Start();
188 EXPECT_EQ(SUCCESS, ret);
189 ret = sink->Stop();
190 EXPECT_EQ(SUCCESS, ret);
191
192 // Continuous execution start
193 ret = sink->Start();
194 EXPECT_EQ(SUCCESS, ret);
195 ret = sink->Start();
196 EXPECT_EQ(SUCCESS, ret);
197 ret = sink->Stop();
198 EXPECT_EQ(SUCCESS, ret);
199 }
200
201 /**
202 * @tc.name : Test Direct Sink Resume State
203 * @tc.type : FUNC
204 * @tc.number: DirectAudioSinkState_004
205 * @tc.desc : Test direct sink resume state success
206 */
207 HWTEST_F(AudioDirectSinkUnitTest, DirectAudioSinkState_004, TestSize.Level1)
208 {
209 EXPECT_NE(nullptr, this->sink);
210 IAudioSinkAttr attr = {};
211 attr.adapterName = SINK_ADAPTER_NAME;
212 attr.sampleRate = 48000;
213 attr.channel = 2;
214 attr.format = HdiAdapterFormat::SAMPLE_S32;
215 attr.channelLayout = 3;
216 attr.deviceType = DEVICE_TYPE_WIRED_HEADSET;
217 attr.volume = 1.0f;
218 attr.openMicSpeaker = 1;
219 int32_t ret = sink->Init(attr);
220 EXPECT_EQ(SUCCESS, ret);
221 ret = sink->Start();
222 EXPECT_EQ(SUCCESS, ret);
223 ret = sink->Resume();
224 EXPECT_EQ(SUCCESS, ret);
225 ret = sink->Stop();
226 EXPECT_EQ(SUCCESS, ret);
227 }
228
229 /**
230 * @tc.name : Test Audio Direct Sink Attribute
231 * @tc.type : FUNC
232 * @tc.number: DirectAudioSinkSetAttribute_001
233 * @tc.desc : Test audio direct sink attribute(sampleRate) success
234 */
235 HWTEST_F(AudioDirectSinkUnitTest, DirectAudioSinkSetAttribute_001, TestSize.Level1)
236 {
237 EXPECT_NE(nullptr, this->sink);
238 IAudioSinkAttr attr = {};
239 attr.adapterName = SINK_ADAPTER_NAME;
240 attr.sampleRate = 192000;
241 attr.channel = 2;
242 attr.format = HdiAdapterFormat::SAMPLE_S32;
243 attr.channelLayout = 3;
244 attr.deviceType = DEVICE_TYPE_WIRED_HEADSET;
245 attr.volume = 1.0f;
246 attr.openMicSpeaker = 1;
247 int32_t ret = sink->Init(attr);
248 EXPECT_EQ(SUCCESS, ret);
249 ret = sink->Start();
250 EXPECT_EQ(SUCCESS, ret);
251 ret = sink->Stop();
252 EXPECT_EQ(SUCCESS, ret);
253 }
254
255 /**
256 * @tc.name : Test Audio Direct Sink Attribute
257 * @tc.type : FUNC
258 * @tc.number: DirectAudioSinkSetAttribute_002
259 * @tc.desc : Test audio direct sink attribute(deviceType) success
260 */
261 HWTEST_F(AudioDirectSinkUnitTest, DirectAudioSinkSetAttribute_002, TestSize.Level1)
262 {
263 EXPECT_NE(nullptr, this->sink);
264 IAudioSinkAttr attr = {};
265 attr.adapterName = SINK_ADAPTER_NAME;
266 attr.sampleRate = 192000;
267 attr.channel = 2;
268 attr.format = HdiAdapterFormat::SAMPLE_S32;
269 attr.channelLayout = 3;
270 attr.deviceType = DEVICE_TYPE_USB_HEADSET;
271 attr.volume = 1.0f;
272 attr.openMicSpeaker = 1;
273 int32_t ret = sink->Init(attr);
274 EXPECT_EQ(SUCCESS, ret);
275 ret = sink->Start();
276 EXPECT_EQ(SUCCESS, ret);
277 ret = sink->Stop();
278 EXPECT_EQ(SUCCESS, ret);
279 }
280
281 /**
282 * @tc.name : Test Create Direct Voip Sink
283 * @tc.type : FUNC
284 * @tc.number: DirectVoipAudioSinkCreate_001
285 * @tc.desc : Test create direct voip sink success
286 */
287 HWTEST_F(AudioDirectSinkUnitTest, DirectVoipAudioSinkCreate_001, TestSize.Level1)
288 {
289 EXPECT_NE(nullptr, this->voipSink);
290 }
291
292 /**
293 * @tc.name : Test Init Direct Voip Sink
294 * @tc.type : FUNC
295 * @tc.number: DirectVoipAudioSinkInit_001
296 * @tc.desc : Test init direct voip sink success
297 */
298 HWTEST_F(AudioDirectSinkUnitTest, DirectVoipAudioSinkInit_001, TestSize.Level1)
299 {
300 EXPECT_NE(nullptr, this->voipSink);
301 IAudioSinkAttr attr = {};
302 attr.adapterName = SINK_ADAPTER_NAME;
303 attr.sampleRate = 48000;
304 attr.channel = 2;
305 attr.format = HdiAdapterFormat::SAMPLE_S16;
306 attr.channelLayout = 3;
307 attr.deviceType = DEVICE_TYPE_SPEAKER;
308 attr.volume = 1.0f;
309 attr.openMicSpeaker = 1;
310 int32_t ret = voipSink->Init(attr);
311 EXPECT_EQ(SUCCESS, ret);
312 float volume = 1.0f;
313 ret = voipSink->SetVolume(volume, volume);
314 EXPECT_EQ(SUCCESS, ret);
315 }
316
317 /**
318 * @tc.name : Test Direct Voip Sink State
319 * @tc.type : FUNC
320 * @tc.number: DirectVoipAudioSinkState_001
321 * @tc.desc : Test direct voip sink state success
322 */
323 HWTEST_F(AudioDirectSinkUnitTest, DirectVoipAudioSinkState_001, TestSize.Level1)
324 {
325 EXPECT_NE(nullptr, this->voipSink);
326 IAudioSinkAttr attr = {};
327 attr.adapterName = SINK_ADAPTER_NAME;
328 attr.sampleRate = 48000;
329 attr.channel = 2;
330 attr.format = HdiAdapterFormat::SAMPLE_S16;
331 attr.channelLayout = 3;
332 attr.deviceType = DEVICE_TYPE_BLUETOOTH_SCO;
333 attr.volume = 1.0f;
334 attr.openMicSpeaker = 1;
335 int32_t ret = voipSink->Init(attr);
336 EXPECT_EQ(SUCCESS, ret);
337 ret = voipSink->Start();
338 EXPECT_EQ(SUCCESS, ret);
339 ret = voipSink->Stop();
340 EXPECT_EQ(SUCCESS, ret);
341 }
342
343 /**
344 * @tc.name : Test Direct Voip Sink init State
345 * @tc.type : FUNC
346 * @tc.number: DirectVoipAudioSinkState_002
347 * @tc.desc : Test direct voip sink init state success
348 */
349 HWTEST_F(AudioDirectSinkUnitTest, DirectVoipAudioSinkState_002, TestSize.Level1)
350 {
351 EXPECT_NE(nullptr, this->voipSink);
352 IAudioSinkAttr attr = {};
353 attr.adapterName = SINK_ADAPTER_NAME;
354 attr.sampleRate = 48000;
355 attr.channel = 2;
356 attr.format = HdiAdapterFormat::SAMPLE_S16;
357 attr.channelLayout = 3;
358 attr.deviceType = DEVICE_TYPE_BLUETOOTH_SCO;
359 attr.volume = 1.0f;
360 attr.openMicSpeaker = 1;
361 bool isInited = voipSink->IsInited();
362 EXPECT_EQ(false, isInited);
363
364 int32_t ret = voipSink->Init(attr);
365 EXPECT_EQ(SUCCESS, ret);
366
367 isInited = voipSink->IsInited();
368 EXPECT_EQ(true, isInited);
369
370 voipSink->DeInit();
371
372 isInited = voipSink->IsInited();
373 EXPECT_EQ(false, isInited);
374
375 // Continuous execution init
376 ret = voipSink->Init(attr);
377 EXPECT_EQ(SUCCESS, ret);
378 ret = voipSink->Init(attr);
379 EXPECT_EQ(SUCCESS, ret);
380 isInited = voipSink->IsInited();
381 EXPECT_EQ(true, isInited);
382 }
383
384 /**
385 * @tc.name : Test Direct Voip Sink Start State
386 * @tc.type : FUNC
387 * @tc.number: DirectVoipAudioSinkState_003
388 * @tc.desc : Test direct voip sink start state success
389 */
390 HWTEST_F(AudioDirectSinkUnitTest, DirectVoipAudioSinkState_003, TestSize.Level1)
391 {
392 EXPECT_NE(nullptr, this->voipSink);
393 IAudioSinkAttr attr = {};
394 attr.adapterName = SINK_ADAPTER_NAME;
395 attr.sampleRate = 48000;
396 attr.channel = 2;
397 attr.format = HdiAdapterFormat::SAMPLE_S16;
398 attr.channelLayout = 3;
399 attr.deviceType = DEVICE_TYPE_BLUETOOTH_SCO;
400 attr.volume = 1.0f;
401 attr.openMicSpeaker = 1;
402 int32_t ret = voipSink->Init(attr);
403 EXPECT_EQ(SUCCESS, ret);
404
405 ret = voipSink->Start();
406 EXPECT_EQ(SUCCESS, ret);
407 ret = voipSink->Stop();
408 EXPECT_EQ(SUCCESS, ret);
409
410 // Continuous execution start
411 ret = voipSink->Start();
412 EXPECT_EQ(SUCCESS, ret);
413 ret = voipSink->Start();
414 EXPECT_EQ(SUCCESS, ret);
415 ret = voipSink->Stop();
416 EXPECT_EQ(SUCCESS, ret);
417 }
418
419 /**
420 * @tc.name : Test Direct Voip Sink Resume State
421 * @tc.type : FUNC
422 * @tc.number: DirectVoipAudioSinkState_004
423 * @tc.desc : Test direct voip sink resume state success
424 */
425 HWTEST_F(AudioDirectSinkUnitTest, DirectVoipAudioSinkState_004, TestSize.Level1)
426 {
427 EXPECT_NE(nullptr, this->voipSink);
428 IAudioSinkAttr attr = {};
429 attr.adapterName = SINK_ADAPTER_NAME;
430 attr.sampleRate = 48000;
431 attr.channel = 2;
432 attr.format = HdiAdapterFormat::SAMPLE_S16;
433 attr.channelLayout = 3;
434 attr.deviceType = DEVICE_TYPE_BLUETOOTH_SCO;
435 attr.volume = 1.0f;
436 attr.openMicSpeaker = 1;
437 int32_t ret = voipSink->Init(attr);
438 EXPECT_EQ(SUCCESS, ret);
439 ret = voipSink->Start();
440 EXPECT_EQ(SUCCESS, ret);
441 ret = voipSink->Resume();
442 EXPECT_EQ(SUCCESS, ret);
443 ret = voipSink->Stop();
444 EXPECT_EQ(SUCCESS, ret);
445 }
446 } // namespace AudioStandard
447 } // namespace OHOS