1 /*
2 * Copyright (c) 2021 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 /**
17 * @addtogroup Audio
18 * @{
19 *
20 * @brief Defines audio-related APIs, including custom data types and functions for loading drivers,
21 * accessing a driver adapter, and rendering audios.
22 *
23 * @since 1.0
24 * @version 1.0
25 */
26
27 /**
28 * @file audio_hdi_common.h
29 *
30 * @brief Declares APIs for operations related to the audio render adapter.
31 *
32 * @since 1.0
33 * @version 1.0
34 */
35
36 #include "audio_hdi_common.h"
37 #include "audio_hdirender_control_test.h"
38
39 using namespace std;
40 using namespace testing::ext;
41 using namespace HMOS::Audio;
42
43 namespace {
44 const string ADAPTER_NAME_USB = "usb";
45 const string ADAPTER_NAME_INTERNAL = "internal";
46
47 class AudioHdiRenderControlTest : public testing::Test {
48 public:
49 static void SetUpTestCase(void);
50 static void TearDownTestCase(void);
51 void SetUp();
52 void TearDown();
53 static TestAudioManager *(*GetAudioManager)();
54 static void *handleSo;
55 #ifdef AUDIO_MPI_SO
56 static int32_t (*SdkInit)();
57 static void (*SdkExit)();
58 static void *sdkSo;
59 #endif
60 };
61
62 TestAudioManager *(*AudioHdiRenderControlTest::GetAudioManager)() = nullptr;
63 void *AudioHdiRenderControlTest::handleSo = nullptr;
64 #ifdef AUDIO_MPI_SO
65 int32_t (*AudioHdiRenderControlTest::SdkInit)() = nullptr;
66 void (*AudioHdiRenderControlTest::SdkExit)() = nullptr;
67 void *AudioHdiRenderControlTest::sdkSo = nullptr;
68 #endif
69
SetUpTestCase(void)70 void AudioHdiRenderControlTest::SetUpTestCase(void)
71 {
72 #ifdef AUDIO_MPI_SO
73 char sdkResolvedPath[] = HDF_LIBRARY_FULL_PATH("libhdi_audio_interface_lib_render");
74 sdkSo = dlopen(sdkResolvedPath, RTLD_LAZY);
75 if (sdkSo == nullptr) {
76 return;
77 }
78 SdkInit = (int32_t (*)())(dlsym(sdkSo, "MpiSdkInit"));
79 if (SdkInit == nullptr) {
80 return;
81 }
82 SdkExit = (void (*)())(dlsym(sdkSo, "MpiSdkExit"));
83 if (SdkExit == nullptr) {
84 return;
85 }
86 SdkInit();
87 #endif
88 char absPath[PATH_MAX] = {0};
89 if (realpath(RESOLVED_PATH.c_str(), absPath) == nullptr) {
90 return;
91 }
92 handleSo = dlopen(absPath, RTLD_LAZY);
93 if (handleSo == nullptr) {
94 return;
95 }
96 GetAudioManager = (TestAudioManager *(*)())(dlsym(handleSo, FUNCTION_NAME.c_str()));
97 if (GetAudioManager == nullptr) {
98 return;
99 }
100 }
101
TearDownTestCase(void)102 void AudioHdiRenderControlTest::TearDownTestCase(void)
103 {
104 #ifdef AUDIO_MPI_SO
105 SdkExit();
106 if (sdkSo != nullptr) {
107 dlclose(sdkSo);
108 sdkSo = nullptr;
109 }
110 if (SdkInit != nullptr) {
111 SdkInit = nullptr;
112 }
113 if (SdkExit != nullptr) {
114 SdkExit = nullptr;
115 }
116 #endif
117 if (handleSo != nullptr) {
118 dlclose(handleSo);
119 handleSo = nullptr;
120 }
121 if (GetAudioManager != nullptr) {
122 GetAudioManager = nullptr;
123 }
124 }
125
SetUp(void)126 void AudioHdiRenderControlTest::SetUp(void) {}
127
TearDown(void)128 void AudioHdiRenderControlTest::TearDown(void) {}
129
130 /**
131 * @tc.name Test AudioRenderStart API via legal input
132 * @tc.number SUB_Audio_HDI_RenderStart_0001
133 * @tc.desc Test AudioRenderStart interface,return 0 if the audiorender object is created successfully.
134 */
135 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderStart_0001, Function | MediumTest | Level1)
136 {
137 int32_t ret = -1;
138 TestAudioManager* manager = {};
139 struct AudioAdapter *adapter = nullptr;
140 struct AudioRender *render = nullptr;
141 enum AudioPortPin pins = PIN_OUT_SPEAKER;
142
143 ASSERT_NE(nullptr, GetAudioManager);
144 manager = GetAudioManager();
145 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
146 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
147 ret = render->control.Start((AudioHandle)render);
148 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
149
150 ret = render->control.Stop((AudioHandle)render);
151 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
152 adapter->DestroyRender(adapter, render);
153 manager->UnloadAdapter(manager, adapter);
154 }
155 /**
156 * @tc.name Test AudioRenderStart API via setting the incoming parameter handle is nullptr
157 * @tc.number SUB_Audio_HDI_RenderStart_0002
158 * @tc.desc Test AudioRenderStart interface, return -1 if the incoming parameter handle is nullptr
159 */
160 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderStart_0002, Function | MediumTest | Level1)
161 {
162 int32_t ret = -1;
163 TestAudioManager* manager = {};
164 struct AudioAdapter *adapter = nullptr;
165 enum AudioPortPin pins = PIN_OUT_SPEAKER;
166 struct AudioRender *render = nullptr;
167 struct AudioRender *renderNull = nullptr;
168
169 ASSERT_NE(nullptr, GetAudioManager);
170 manager = GetAudioManager();
171 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
172 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
173 ret = render->control.Start((AudioHandle)renderNull);
174 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
175
176 adapter->DestroyRender(adapter, render);
177 manager->UnloadAdapter(manager, adapter);
178 }
179 /**
180 * @tc.name Test AudioRenderStart API via the interface is called twice in a row
181 * @tc.number SUB_Audio_HDI_RenderStart_0003
182 * @tc.desc Test AudioRenderStart interface,return -1 the second time if the RenderStart is called twice
183 */
184 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderStart_0003, Function | MediumTest | Level1)
185 {
186 int32_t ret = -1;
187 TestAudioManager* manager = {};
188 struct AudioAdapter *adapter = nullptr;
189 enum AudioPortPin pins = PIN_OUT_SPEAKER;
190 struct AudioRender *render = nullptr;
191
192 manager = GetAudioManager();
193 ASSERT_NE(nullptr, GetAudioManager);
194 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
195 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
196 ret = render->control.Start((AudioHandle)render);
197 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
198 ret = render->control.Start((AudioHandle)render);
199 EXPECT_EQ(AUDIO_HAL_ERR_AO_BUSY, ret);
200
201 ret = render->control.Stop((AudioHandle)render);
202 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
203 adapter->DestroyRender(adapter, render);
204 manager->UnloadAdapter(manager, adapter);
205 }
206 /**
207 * @tc.name Test AudioRenderStop API via legal input
208 * @tc.number SUB_Audio_HDI_RenderStop_0001
209 * @tc.desc test AudioRenderStop interface. return 0 if the rendering is successfully stopped.
210 */
211 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderStop_0001, Function | MediumTest | Level1)
212 {
213 int32_t ret = -1;
214 TestAudioManager* manager = {};
215 struct AudioAdapter *adapter = nullptr;
216 enum AudioPortPin pins = PIN_OUT_SPEAKER;
217 struct AudioRender *render = nullptr;
218
219 manager = GetAudioManager();
220 ASSERT_NE(nullptr, GetAudioManager);
221 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
222 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
223 ret = render->control.Start((AudioHandle)render);
224 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
225 ret = render->control.Stop((AudioHandle)render);
226 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
227
228 adapter->DestroyRender(adapter, render);
229 manager->UnloadAdapter(manager, adapter);
230 }
231 /**
232 * @tc.name Test AudioRenderStop API via the render does not start and stop only
233 * @tc.number SUB_Audio_HDI_RenderStop_0002
234 * @tc.desc test AudioRenderStop interface. return -4 if the render does not start and stop only
235 */
236 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderStop_0002, Function | MediumTest | Level1)
237 {
238 int32_t ret = -1;
239 TestAudioManager* manager = {};
240 struct AudioAdapter *adapter = nullptr;
241 struct AudioRender *render = nullptr;
242 enum AudioPortPin pins = PIN_OUT_SPEAKER;
243
244 manager = GetAudioManager();
245 ASSERT_NE(nullptr, GetAudioManager);
246 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
247 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
248 ret = render->control.Stop((AudioHandle)render);
249 EXPECT_EQ(AUDIO_HAL_ERR_NOT_SUPPORT, ret);
250
251 adapter->DestroyRender(adapter, render);
252 manager->UnloadAdapter(manager, adapter);
253 }
254 /**
255 * @tc.name Test RenderStop API via the interface is called twice in a row
256 * @tc.number SUB_Audio_HDI_RenderStop_0003
257 * @tc.desc Test RenderStop interface,return -4 the second time if the RenderStop is called twice
258 */
259 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderStop_0003, Function | MediumTest | Level1)
260 {
261 int32_t ret = -1;
262 TestAudioManager* manager = {};
263 struct AudioAdapter *adapter = nullptr;
264 struct AudioRender *render = nullptr;
265 enum AudioPortPin pins = PIN_OUT_SPEAKER;
266
267 manager = GetAudioManager();
268 ASSERT_NE(nullptr, GetAudioManager);
269 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
270 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
271 ret = render->control.Start((AudioHandle)render);
272 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
273 ret = render->control.Stop((AudioHandle)render);
274 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
275 ret = render->control.Stop((AudioHandle)render);
276 EXPECT_EQ(AUDIO_HAL_ERR_NOT_SUPPORT, ret);
277
278 adapter->DestroyRender(adapter, render);
279 manager->UnloadAdapter(manager, adapter);
280 }
281 /**
282 * @tc.name Test RenderStop API via setting the incoming parameter handle is nullptr
283 * @tc.number SUB_Audio_HDI_RenderStop_0004
284 * @tc.desc Test RenderStop interface, return -1 if the incoming parameter handle is nullptr
285 */
286 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderStop_0004, Function | MediumTest | Level1)
287 {
288 int32_t ret = -1;
289 enum AudioPortPin pins = PIN_OUT_SPEAKER;
290 TestAudioManager* manager = {};
291 struct AudioAdapter *adapter = nullptr;
292 struct AudioRender *render = nullptr;
293 struct AudioRender *renderNull = nullptr;
294
295 manager = GetAudioManager();
296 ASSERT_NE(nullptr, GetAudioManager);
297 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
298 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
299 ret = render->control.Start((AudioHandle)render);
300 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
301 ret = render->control.Stop((AudioHandle)renderNull);
302 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
303
304 ret = render->control.Stop((AudioHandle)render);
305 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
306 adapter->DestroyRender(adapter, render);
307 manager->UnloadAdapter(manager, adapter);
308 }
309 /**
310 * @tc.name Test RenderPause API via legal input
311 * @tc.number SUB_Audio_HDI_RenderPause_001
312 * @tc.desc test HDI RenderPause interface,return 0 if the render is paused after start
313 */
314 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderPause_0001, Function | MediumTest | Level1)
315 {
316 int32_t ret = -1;
317 TestAudioManager* manager = {};
318 struct AudioAdapter *adapter = nullptr;
319 struct AudioRender *render = nullptr;
320
321 manager = GetAudioManager();
322 ASSERT_NE(nullptr, GetAudioManager);
323 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
324 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
325 ret = render->control.Pause((AudioHandle)render);
326 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
327
328 ret = render->control.Stop((AudioHandle)render);
329 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
330 adapter->DestroyRender(adapter, render);
331 manager->UnloadAdapter(manager, adapter);
332 }
333 /**
334 * @tc.name Test AudioRenderPause API via the interface is called twice in a row
335 * @tc.number SUB_Audio_HDI_RenderPause_0002
336 * @tc.desc Test AudioRenderPause interface, return -1 the second time if RenderPause is called twice
337 */
338 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderPause_0002, Function | MediumTest | Level1)
339 {
340 int32_t ret = -1;
341 struct AudioAdapter *adapter = nullptr;
342 struct AudioRender *render = nullptr;
343 TestAudioManager* manager = {};
344
345 manager = GetAudioManager();
346 ASSERT_NE(nullptr, GetAudioManager);
347 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
348 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
349 ret = render->control.Pause((AudioHandle)render);
350 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
351 ret = render->control.Pause((AudioHandle)render);
352 EXPECT_EQ(AUDIO_HAL_ERR_NOT_SUPPORT, ret);
353
354 render->control.Stop((AudioHandle)render);
355 adapter->DestroyRender(adapter, render);
356 manager->UnloadAdapter(manager, adapter);
357 }
358 /**
359 * @tc.name Test AudioRenderPause API via the render is paused after created.
360 * @tc.number SUB_Audio_HDI_RenderPause_0003
361 * @tc.desc Test AudioRenderPause interface,return -1 if the render is paused after created.
362 */
363 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderPause_0003, Function | MediumTest | Level1)
364 {
365 int32_t ret = -1;
366 TestAudioManager* manager = {};
367 struct AudioAdapter *adapter = nullptr;
368 struct AudioRender *render = nullptr;
369 enum AudioPortPin pins = PIN_OUT_SPEAKER;
370
371 manager = GetAudioManager();
372 ASSERT_NE(nullptr, GetAudioManager);
373 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
374 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
375 ret = render->control.Pause((AudioHandle)render);
376 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
377 adapter->DestroyRender(adapter, render);
378 manager->UnloadAdapter(manager, adapter);
379 }
380 /**
381 * @tc.name Test AudioRenderPause API via the render is paused after resumed.
382 * @tc.number SUB_Audio_HDI_RenderPause_0004
383 * @tc.desc Test AudioRenderPause interface,return 0 if the render is paused after resumed.
384 */
385 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderPause_0004, Function | MediumTest | Level1)
386 {
387 int32_t ret = -1;
388 TestAudioManager* manager = {};
389 struct AudioAdapter *adapter = nullptr;
390 struct AudioRender *render = nullptr;
391
392 manager = GetAudioManager();
393 ASSERT_NE(nullptr, GetAudioManager);
394 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
395 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
396 ret = render->control.Pause((AudioHandle)render);
397 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
398 ret = render->control.Resume((AudioHandle)render);
399 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
400 ret = render->control.Pause((AudioHandle)render);
401 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
402
403 ret = render->control.Stop((AudioHandle)render);
404 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
405 adapter->DestroyRender(adapter, render);
406 manager->UnloadAdapter(manager, adapter);
407 }
408 /**
409 * @tc.name Test AudioRenderPause API via the render is paused after stoped.
410 * @tc.number SUB_Audio_HDI_RenderPause_0005
411 * @tc.desc Test AudioRenderPause interface, return -1 the render is paused after stoped.
412 */
413 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderPause_0005, Function | MediumTest | Level1)
414 {
415 int32_t ret = -1;
416 struct AudioAdapter *adapter = nullptr;
417 struct AudioRender *render = nullptr;
418 TestAudioManager* manager = {};
419
420 manager = GetAudioManager();
421 ASSERT_NE(nullptr, GetAudioManager);
422 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
423 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
424 ret = render->control.Stop((AudioHandle)render);
425 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
426 ret = render->control.Pause((AudioHandle)render);
427 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
428
429 adapter->DestroyRender(adapter, render);
430 manager->UnloadAdapter(manager, adapter);
431 }
432 /**
433 * @tc.name Test RenderPause API via setting the incoming parameter handle is nullptr
434 * @tc.number SUB_Audio_HDI_RenderPause_0006
435 * @tc.desc Test RenderPause interface, return -1 if the incoming parameter handle is nullptr
436 */
437 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderPause_0006, Function | MediumTest | Level1)
438 {
439 int32_t ret = -1;
440 struct AudioAdapter *adapter = nullptr;
441 struct AudioRender *render = nullptr;
442 struct AudioRender *renderNull = nullptr;
443 TestAudioManager* manager = {};
444
445 manager = GetAudioManager();
446 ASSERT_NE(nullptr, GetAudioManager);
447 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
448 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
449 ret = render->control.Pause((AudioHandle)renderNull);
450 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
451
452 ret = render->control.Stop((AudioHandle)render);
453 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
454 adapter->DestroyRender(adapter, render);
455 manager->UnloadAdapter(manager, adapter);
456 }
457 /**
458 * @tc.name Test RenderResume API via the render is resumed after started
459 * @tc.number SUB_Audio_HDI_RenderResume_0001
460 * @tc.desc test HDI RenderResume interface,return -1 if the render is resumed after started
461 */
462 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderResume_0001, Function | MediumTest | Level1)
463 {
464 int32_t ret = -1;
465 struct AudioAdapter *adapter = nullptr;
466 struct AudioRender *render = nullptr;
467
468 TestAudioManager* manager = GetAudioManager();
469 ASSERT_NE(nullptr, GetAudioManager);
470 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
471 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
472 ret = render->control.Resume((AudioHandle)render);
473 EXPECT_EQ(AUDIO_HAL_ERR_NOT_SUPPORT, ret);
474
475 ret = render->control.Stop((AudioHandle)render);
476 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
477 adapter->DestroyRender(adapter, render);
478 manager->UnloadAdapter(manager, adapter);
479 }
480 /**
481 * @tc.name Test RenderResume API via the render is resumed after stopped
482 * @tc.number SUB_Audio_HDI_RenderResume_0002
483 * @tc.desc test HDI RenderResume interface,return -1 if the render is resumed after stopped
484 */
485 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderResume_0002, Function | MediumTest | Level1)
486 {
487 int32_t ret = -1;
488 struct AudioAdapter *adapter = nullptr;
489 struct AudioRender *render = nullptr;
490
491 TestAudioManager* manager = GetAudioManager();
492 ASSERT_NE(nullptr, GetAudioManager);
493 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
494 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
495 ret = render->control.Stop((AudioHandle)render);
496 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
497 ret = render->control.Resume((AudioHandle)render);
498 EXPECT_EQ(AUDIO_HAL_ERR_NOT_SUPPORT, ret);
499
500 adapter->DestroyRender(adapter, render);
501 manager->UnloadAdapter(manager, adapter);
502 }
503 /**
504 * @tc.name Test RenderResume API via legal input
505 * @tc.number SUB_Audio_HDI_RenderResume_0003
506 * @tc.desc Test AudioRenderResume interface,return 0 if the render is resumed after paused
507 */
508 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderResume_0003, Function | MediumTest | Level1)
509 {
510 int32_t ret = -1;
511 struct AudioAdapter *adapter = nullptr;
512 struct AudioRender *render = nullptr;
513
514 TestAudioManager* manager = GetAudioManager();
515 ASSERT_NE(nullptr, GetAudioManager);
516 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
517 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
518 ret = render->control.Pause((AudioHandle)render);
519 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
520 ret = render->control.Resume((AudioHandle)render);
521 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
522
523 ret = render->control.Stop((AudioHandle)render);
524 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
525 adapter->DestroyRender(adapter, render);
526 manager->UnloadAdapter(manager, adapter);
527 }
528 /**
529 * @tc.name Test RenderResume API via the interface is called twice in a row
530 * @tc.number SUB_Audio_HDI_RenderResume_0004
531 * @tc.desc Test RenderResume interface,return -1 the second time if the RenderResume is called twice
532 */
533 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderResume_0004, Function | MediumTest | Level1)
534 {
535 int32_t ret = -1;
536 struct AudioAdapter *adapter = nullptr;
537 struct AudioRender *render = nullptr;
538
539 TestAudioManager* manager = GetAudioManager();
540 ASSERT_NE(nullptr, GetAudioManager);
541 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
542 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
543 ret = render->control.Pause((AudioHandle)render);
544 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
545 ret = render->control.Resume((AudioHandle)render);
546 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
547 ret = render->control.Resume((AudioHandle)render);
548 EXPECT_EQ(AUDIO_HAL_ERR_NOT_SUPPORT, ret);
549
550 ret = render->control.Stop((AudioHandle)render);
551 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
552 adapter->DestroyRender(adapter, render);
553 manager->UnloadAdapter(manager, adapter);
554 }
555 /**
556 * @tc.name Test RenderResume API via the render Continue to start after resume
557 * @tc.number SUB_Audio_HDI_RenderResume_0005
558 * @tc.desc test HDI RenderResume interface,return -1 if the render Continue to start after resume
559 */
560 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderResume_0005, Function | MediumTest | Level1)
561 {
562 int32_t ret = -1;
563 struct AudioAdapter *adapter = nullptr;
564 struct AudioRender *render = nullptr;
565
566 TestAudioManager* manager = GetAudioManager();
567 ASSERT_NE(nullptr, GetAudioManager);
568 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
569 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
570 ret = render->control.Pause((AudioHandle)render);
571 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
572 ret = render->control.Resume((AudioHandle)render);
573 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
574 ret = render->control.Start((AudioHandle)render);
575 EXPECT_EQ(AUDIO_HAL_ERR_AO_BUSY, ret);
576
577 ret = render->control.Stop((AudioHandle)render);
578 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
579 adapter->DestroyRender(adapter, render);
580 manager->UnloadAdapter(manager, adapter);
581 }
582 /**
583 * @tc.name Test RenderResume API via setting the incoming parameter handle is nullptr
584 * @tc.number SUB_Audio_HDI_RenderResume_0007
585 * @tc.desc Test RenderResume interface, return -1 if the incoming parameter handle is nullptr
586 */
587 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderResume_0006, Function | MediumTest | Level1)
588 {
589 int32_t ret = -1;
590 struct AudioAdapter *adapter = nullptr;
591 struct AudioRender *render = nullptr;
592 struct AudioRender *renderNull = nullptr;
593
594 TestAudioManager* manager = GetAudioManager();
595 ASSERT_NE(nullptr, GetAudioManager);
596 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
597 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
598 ret = render->control.Pause((AudioHandle)render);
599 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
600 ret = render->control.Resume((AudioHandle)renderNull);
601 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
602
603 ret = render->control.Stop((AudioHandle)render);
604 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
605 adapter->DestroyRender(adapter, render);
606 manager->UnloadAdapter(manager, adapter);
607 }
608 /**
609 * @tc.name Test AudioCreateRender API via legal input.
610 * @tc.number SUB_Audio_HDI_CreateRender_0001
611 * @tc.desc test AudioCreateRender interface,return 0 if render is created successful.
612 */
613 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_CreateRender_0001, Function | MediumTest | Level1)
614 {
615 int32_t ret = -1;
616 struct AudioAdapter *adapter = nullptr;
617 struct AudioRender *render = nullptr;
618 enum AudioPortPin pins = PIN_OUT_SPEAKER;
619 ASSERT_NE(nullptr, GetAudioManager);
620 TestAudioManager* manager = GetAudioManager();
621 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
622 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
623
624 adapter->DestroyRender(adapter, render);
625 manager->UnloadAdapter(manager, adapter);
626 }
627 /**
628 * @tc.name Test AudioCreateRender API when two renders is created successful.
629 * @tc.number SUB_Audio_HDI_AudioCreateRender_0002
630 * @tc.desc Test AudioCreateRender interface,return 0 when two renders is created successful.
631 */
632 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_AudioCreateRender_0002, Function | MediumTest | Level1)
633 {
634 int32_t ret = -1;
635 enum AudioPortPin pins = PIN_OUT_SPEAKER;
636 struct AudioAdapter *adapter = nullptr;
637 struct AudioAdapter *adapter2 = nullptr;
638 struct AudioRender *render = nullptr;
639 struct AudioRender *render2 = nullptr;
640 ASSERT_NE(nullptr, GetAudioManager);
641 TestAudioManager* manager = GetAudioManager();
642
643 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
644 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
645 adapter->DestroyRender(adapter, render);
646 manager->UnloadAdapter(manager, adapter);
647
648 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter2, &render2);
649 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
650 adapter2->DestroyRender(adapter2, render2);
651 manager->UnloadAdapter(manager, adapter2);
652 }
653 /**
654 * @tc.name Test AudioCreateRender API via setting the incoming parameter pins is PIN_IN_MIC.
655 * @tc.number SUB_Audio_HDI_CreateRender_0003
656 * @tc.desc test AudioCreateRender interface,return -1 if the incoming parameter pins is PIN_IN_MIC.
657 */
658 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_CreateRender_0003, Function | MediumTest | Level1)
659 {
660 int32_t ret = -1;
661 struct AudioAdapter *adapter = nullptr;
662 struct AudioRender *render = nullptr;
663 struct AudioPort* renderPort = nullptr;
664 struct AudioSampleAttributes attrs = {};
665 struct AudioDeviceDescriptor devDesc = {};
666 ASSERT_NE(nullptr, GetAudioManager);
667 TestAudioManager* manager = GetAudioManager();
668 ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME_USB, &adapter, renderPort);
669 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
670
671 InitAttrs(attrs);
672 InitDevDesc(devDesc, renderPort->portId, PIN_IN_MIC);
673
674 ret = adapter->CreateRender(adapter, &devDesc, &attrs, &render);
675 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
676 manager->UnloadAdapter(manager, adapter);
677 }
678
679 /**
680 * @tc.name Test AudioCreateRender API via setting the incoming parameter attr is error.
681 * @tc.number SUB_Audio_HDI_CreateRender_0004
682 * @tc.desc test AudioCreateRender interface,return -1 if the incoming parameter attr is error.
683 */
684 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_CreateRender_0004, Function | MediumTest | Level1)
685 {
686 int32_t ret = -1;
687 struct AudioAdapter *adapter = nullptr;
688 struct AudioRender *render = nullptr;
689 struct AudioSampleAttributes attrs = {};
690 struct AudioDeviceDescriptor devDesc = {};
691 struct AudioPort* renderPort = nullptr;
692 uint32_t channelCountErr = 5;
693 ASSERT_NE(nullptr, GetAudioManager);
694 TestAudioManager* manager = GetAudioManager();
695 ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME_USB, &adapter, renderPort);
696 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
697
698 InitAttrs(attrs);
699 InitDevDesc(devDesc, renderPort->portId, PIN_OUT_SPEAKER);
700 attrs.format = AUDIO_FORMAT_AAC_MAIN;
701 ret = adapter->CreateRender(adapter, &devDesc, &attrs, &render);
702 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
703 attrs.channelCount = channelCountErr;
704 ret = adapter->CreateRender(adapter, &devDesc, &attrs, &render);
705 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
706 attrs.type = AUDIO_IN_COMMUNICATION;
707 ret = adapter->CreateRender(adapter, &devDesc, &attrs, &render);
708 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
709
710 manager->UnloadAdapter(manager, adapter);
711 }
712 /**
713 * @tc.name Test AudioCreateRender API via setting the incoming parameter adapter is nullptr
714 * @tc.number SUB_Audio_HDI_CreateRender_0005
715 * @tc.desc test AudioCreateRender interface,Returns -1 if the incoming parameter adapter is nullptr.
716 */
717 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_CreateRender_0005, Function | MediumTest | Level1)
718 {
719 int32_t ret = -1;
720 struct AudioAdapter *adapter = nullptr;
721 struct AudioRender *render = nullptr;
722 struct AudioAdapter *adapterNull = nullptr;
723 struct AudioPort* renderPort = nullptr;
724 struct AudioSampleAttributes attrs = {};
725 struct AudioDeviceDescriptor devDesc = {};
726 ASSERT_NE(nullptr, GetAudioManager);
727 TestAudioManager* manager = GetAudioManager();
728 ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME_USB, &adapter, renderPort);
729 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
730
731 InitAttrs(attrs);
732 InitDevDesc(devDesc, renderPort->portId, PIN_OUT_SPEAKER);
733
734 ret = adapter->CreateRender(adapterNull, &devDesc, &attrs, &render);
735 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
736
737 manager->UnloadAdapter(manager, adapter);
738 }
739
740 /**
741 * @tc.name Test AudioCreateRender API via setting the incoming parameter devDesc is nullptr
742 * @tc.number SUB_Audio_HDI_CreateRender_0006
743 * @tc.desc test AudioCreateRender interface,Returns -1 if the incoming parameter devDesc is nullptr.
744 */
745 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_CreateRender_0006, Function | MediumTest | Level1)
746 {
747 int32_t ret = -1;
748 struct AudioRender *render = nullptr;
749 struct AudioAdapter *adapter = nullptr;
750 struct AudioPort* renderPort = nullptr;
751 struct AudioSampleAttributes attrs = {};
752 struct AudioDeviceDescriptor *devDescNull = nullptr;
753 ASSERT_NE(nullptr, GetAudioManager);
754 TestAudioManager* manager = GetAudioManager();
755 ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME_USB, &adapter, renderPort);
756 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
757
758 InitAttrs(attrs);
759
760 ret = adapter->CreateRender(adapter, devDescNull, &attrs, &render);
761 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
762
763 manager->UnloadAdapter(manager, adapter);
764 }
765
766 /**
767 * @tc.name Test AudioCreateRender API via setting the incoming parameter attrs is nullptr
768 * @tc.number SUB_Audio_HDI_CreateRender_0007
769 * @tc.desc test AudioCreateRender interface,Returns -1 if the incoming parameter attrs is nullptr.
770 */
771 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_CreateRender_0007, Function | MediumTest | Level1)
772 {
773 int32_t ret = -1;
774 struct AudioPort* renderPort = nullptr;
775 struct AudioAdapter *adapter = nullptr;
776 struct AudioRender *render = nullptr;
777 struct AudioSampleAttributes *attrsNull = nullptr;
778 struct AudioDeviceDescriptor devDesc = {};
779 ASSERT_NE(nullptr, GetAudioManager);
780 TestAudioManager* manager = GetAudioManager();
781 ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME_USB, &adapter, renderPort);
782 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
783
784 InitDevDesc(devDesc, renderPort->portId, PIN_OUT_SPEAKER);
785
786 ret = adapter->CreateRender(adapter, &devDesc, attrsNull, &render);
787 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
788
789 manager->UnloadAdapter(manager, adapter);
790 }
791
792 /**
793 * @tc.name Test AudioCreateRender API via setting the incoming parameter render is nullptr
794 * @tc.number SUB_Audio_HDI_CreateRender_0008
795 * @tc.desc test AudioCreateRender interface,Returns -1 if the incoming parameter render is nullptr.
796 */
797 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_CreateRender_0008, Function | MediumTest | Level1)
798 {
799 int32_t ret = -1;
800 struct AudioAdapter *adapter = nullptr;
801 struct AudioRender **renderNull = nullptr;
802 struct AudioPort* renderPort = nullptr;
803 struct AudioSampleAttributes attrs = {};
804 struct AudioDeviceDescriptor devDesc = {};
805 ASSERT_NE(nullptr, GetAudioManager);
806 TestAudioManager* manager = GetAudioManager();
807 ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME_USB, &adapter, renderPort);
808 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
809
810 InitAttrs(attrs);
811 InitDevDesc(devDesc, renderPort->portId, PIN_OUT_SPEAKER);
812
813 ret = adapter->CreateRender(adapter, &devDesc, &attrs, renderNull);
814 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
815
816 manager->UnloadAdapter(manager, adapter);
817 }
818
819 /**
820 * @tc.name Test AudioCreateRender API via setting the incoming parameter devDesc is error
821 * @tc.number SUB_Audio_HDI_CreateRender_0009
822 * @tc.desc test AudioCreateRender interface,Returns -1 if the incoming parameter devDesc is error.
823 */
824 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_CreateRender_0009, Function | MediumTest | Level1)
825 {
826 int32_t ret = -1;
827 struct AudioAdapter *adapter = nullptr;
828 struct AudioRender *render = nullptr;
829 struct AudioSampleAttributes attrs = {};
830 struct AudioDeviceDescriptor devDesc = {};
831 struct AudioPort* renderPort = nullptr;
832 ASSERT_NE(nullptr, GetAudioManager);
833 TestAudioManager* manager = GetAudioManager();
834 ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME_USB, &adapter, renderPort);
835 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
836
837 ret = InitAttrs(attrs);
838 InitDevDesc(devDesc, renderPort->portId, PIN_OUT_SPEAKER);
839
840 devDesc.portId = -5;
841 ret = adapter->CreateRender(adapter, &devDesc, &attrs, &render);
842 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
843 devDesc.pins = PIN_NONE;
844 ret = adapter->CreateRender(adapter, &devDesc, &attrs, &render);
845 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
846 devDesc.desc = "devtestname";
847 ret = adapter->CreateRender(adapter, &devDesc, &attrs, &render);
848 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
849
850 manager->UnloadAdapter(manager, adapter);
851 }
852 /**
853 * @tc.name Test AudioDestroyRender API via legal input.
854 * @tc.number SUB_Audio_HDI_DestroyRender_0001
855 * @tc.desc Test AudioDestroyRender interface, return 0 if render is destroyed successful.
856 */
857 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_DestroyRender_0001, Function | MediumTest | Level1)
858 {
859 int32_t ret = -1;
860 struct AudioAdapter *adapter = nullptr;
861 struct AudioRender *render = nullptr;
862 enum AudioPortPin pins = PIN_OUT_SPEAKER;
863 TestAudioManager* manager = GetAudioManager();
864 ASSERT_NE(nullptr, GetAudioManager);
865 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
866 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
867
868 ret = adapter->DestroyRender(adapter, render);
869 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
870 manager->UnloadAdapter(manager, adapter);
871 }
872 /**
873 * @tc.name Test AudioDestroyRender API,where the parameter render is empty.
874 * @tc.number SUB_Audio_HDI_DestroyRender_0002
875 * @tc.desc Test AudioDestroyRender interface, return -1 if the parameter render is empty.
876 */
877 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_DestroyRender_0002, Function | MediumTest | Level1)
878 {
879 int32_t ret = -1;
880 enum AudioPortPin pins = PIN_OUT_SPEAKER;
881 struct AudioAdapter *adapter = nullptr;
882 struct AudioRender *render = nullptr;
883 struct AudioRender *renderNull = nullptr;
884 TestAudioManager* manager = GetAudioManager();
885 ASSERT_NE(nullptr, GetAudioManager);
886 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
887 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
888
889 ret = adapter->DestroyRender(adapter, renderNull);
890 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
891 manager->UnloadAdapter(manager, adapter);
892 }
893
894 /**
895 * @tc.name Test RenderFlush API via legal input Verify that the data in the buffer is flushed after stop
896 * @tc.number SUB_Audio_HDI_RenderFlush_0001
897 * @tc.desc Test RenderFlush interface,return -2 if the data in the buffer is flushed successfully after stop
898 */
899 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderFlush_0001, Function | MediumTest | Level1)
900 {
901 int32_t ret = -1;
902 TestAudioManager* manager = {};
903 struct AudioAdapter *adapter = nullptr;
904 struct AudioRender *render = nullptr;
905
906 manager = GetAudioManager();
907 ASSERT_NE(nullptr, GetAudioManager);
908 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
909 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
910 ret = render->control.Stop((AudioHandle)render);
911 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
912 ret = render->control.Flush((AudioHandle)render);
913 EXPECT_EQ(AUDIO_HAL_ERR_NOT_SUPPORT, ret);
914
915 adapter->DestroyRender(adapter, render);
916 manager->UnloadAdapter(manager, adapter);
917 }
918 /**
919 * @tc.name Test RenderFlush that the data in the buffer is flushed when handle is nullptr after paused
920 * @tc.number SUB_Audio_HDI_RenderFlush_0002
921 * @tc.desc Test RenderFlush, return -1 if the data in the buffer is flushed when handle is nullptr after paused
922 */
923 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderFlush_0002, Function | MediumTest | Level1)
924 {
925 int32_t ret = -1;
926 TestAudioManager* manager = {};
927 struct AudioAdapter *adapter = nullptr;
928 struct AudioRender *render = nullptr;
929 struct AudioRender *renderNull = nullptr;
930
931 manager = GetAudioManager();
932 ASSERT_NE(nullptr, GetAudioManager);
933 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
934 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
935 ret = render->control.Pause((AudioHandle)render);
936 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
937 ret = render->control.Flush((AudioHandle)renderNull);
938 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
939
940 ret = render->control.Stop((AudioHandle)render);
941 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
942 adapter->DestroyRender(adapter, render);
943 manager->UnloadAdapter(manager, adapter);
944 }
945 }