1 /*
2 * Copyright (c) 2021-2022 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 OHOS::Audio;
42
43 namespace {
44 class AudioHdiRenderControlTest : public testing::Test {
45 public:
46 static void SetUpTestCase(void);
47 static void TearDownTestCase(void);
48 void SetUp();
49 void TearDown();
50 };
51
SetUpTestCase(void)52 void AudioHdiRenderControlTest::SetUpTestCase(void){}
53
TearDownTestCase(void)54 void AudioHdiRenderControlTest::TearDownTestCase(void) {}
55
SetUp(void)56 void AudioHdiRenderControlTest::SetUp(void) {}
57
TearDown(void)58 void AudioHdiRenderControlTest::TearDown(void) {}
59
60 /**
61 * @tc.name Test AudioRenderStart API via legal input
62 * @tc.number SUB_Audio_HDI_RenderStart_0001
63 * @tc.desc Test AudioRenderStart interface,return 0 if the audiorender object is created successfully.
64 */
65 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderStart_0001, Function | MediumTest | Level1)
66 {
67 int32_t ret = -1;
68 TestAudioManager* manager = {};
69 struct AudioAdapter *adapter = nullptr;
70 struct AudioRender *render = nullptr;
71
72 manager = GetAudioManagerFuncs();
73 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME, &adapter, &render);
74 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
75 ret = render->control.Start((AudioHandle)render);
76 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
77
78 ret = render->control.Stop((AudioHandle)render);
79 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
80 adapter->DestroyRender(adapter, render);
81 manager->UnloadAdapter(manager, adapter);
82 }
83 /**
84 * @tc.name Test AudioRenderStart API via setting the incoming parameter handle is nullptr
85 * @tc.number SUB_Audio_HDI_RenderStart_0002
86 * @tc.desc Test AudioRenderStart interface, return -1 if the incoming parameter handle is nullptr
87 */
88 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderStart_0002, Function | MediumTest | Level1)
89 {
90 int32_t ret = -1;
91 TestAudioManager* manager = {};
92 struct AudioAdapter *adapter = nullptr;
93 struct AudioRender *render = nullptr;
94 struct AudioRender *renderNull = nullptr;
95
96 manager = GetAudioManagerFuncs();
97 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME, &adapter, &render);
98 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
99 ret = render->control.Start((AudioHandle)renderNull);
100 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
101
102 adapter->DestroyRender(adapter, render);
103 manager->UnloadAdapter(manager, adapter);
104 }
105 /**
106 * @tc.name Test AudioRenderStop API via legal input
107 * @tc.number SUB_Audio_HDI_RenderStop_0001
108 * @tc.desc test AudioRenderStop interface. return 0 if the rendering is successfully stopped.
109 */
110 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderStop_0001, Function | MediumTest | Level1)
111 {
112 int32_t ret = -1;
113 TestAudioManager* manager = {};
114 struct AudioAdapter *adapter = nullptr;
115 struct AudioRender *render = nullptr;
116
117 manager = GetAudioManagerFuncs();
118 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME, &adapter, &render);
119 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
120 ret = render->control.Start((AudioHandle)render);
121 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
122 ret = render->control.Stop((AudioHandle)render);
123 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
124
125 adapter->DestroyRender(adapter, render);
126 manager->UnloadAdapter(manager, adapter);
127 }
128 /**
129 * @tc.name Test AudioRenderStop API via the render does not start and stop only
130 * @tc.number SUB_Audio_HDI_RenderStop_0002
131 * @tc.desc test AudioRenderStop interface. return -4 if the render does not start and stop only
132 */
133 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderStop_0002, Function | MediumTest | Level1)
134 {
135 int32_t ret = -1;
136 TestAudioManager* manager = {};
137 struct AudioAdapter *adapter = nullptr;
138 struct AudioRender *render = nullptr;
139
140 manager = GetAudioManagerFuncs();
141 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME, &adapter, &render);
142 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
143 ret = render->control.Stop((AudioHandle)render);
144 EXPECT_EQ(AUDIO_HAL_ERR_NOT_SUPPORT, ret);
145
146 adapter->DestroyRender(adapter, render);
147 manager->UnloadAdapter(manager, adapter);
148 }
149 /**
150 * @tc.name Test RenderStop API via setting the incoming parameter handle is nullptr
151 * @tc.number SUB_Audio_HDI_RenderStop_0004
152 * @tc.desc Test RenderStop interface, return -1 if the incoming parameter handle is nullptr
153 */
154 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderStop_0004, Function | MediumTest | Level1)
155 {
156 int32_t ret = -1;
157 TestAudioManager* manager = {};
158 struct AudioAdapter *adapter = nullptr;
159 struct AudioRender *render = nullptr;
160 struct AudioRender *renderNull = nullptr;
161
162 manager = GetAudioManagerFuncs();
163 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME, &adapter, &render);
164 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
165 ret = render->control.Start((AudioHandle)render);
166 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
167 ret = render->control.Stop((AudioHandle)renderNull);
168 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
169
170 ret = render->control.Stop((AudioHandle)render);
171 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
172 adapter->DestroyRender(adapter, render);
173 manager->UnloadAdapter(manager, adapter);
174 }
175 /**
176 * @tc.name Test RenderPause API via legal input
177 * @tc.number SUB_Audio_HDI_RenderPause_001
178 * @tc.desc test HDI RenderPause interface,return 0 if the render is paused after start
179 */
180 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderPause_0001, Function | MediumTest | Level1)
181 {
182 int32_t ret = -1;
183 TestAudioManager* manager = {};
184 struct AudioAdapter *adapter = nullptr;
185 struct AudioRender *render = nullptr;
186
187 manager = GetAudioManagerFuncs();
188 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME);
189 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
190 ret = render->control.Pause((AudioHandle)render);
191 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
192
193 ret = render->control.Stop((AudioHandle)render);
194 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
195 adapter->DestroyRender(adapter, render);
196 manager->UnloadAdapter(manager, adapter);
197 }
198 /**
199 * @tc.name Test AudioRenderPause API via the render is paused after created.
200 * @tc.number SUB_Audio_HDI_RenderPause_0003
201 * @tc.desc Test AudioRenderPause interface,return -1 if the render is paused after created.
202 */
203 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderPause_0003, Function | MediumTest | Level1)
204 {
205 int32_t ret = -1;
206 TestAudioManager* manager = {};
207 struct AudioAdapter *adapter = nullptr;
208 struct AudioRender *render = nullptr;
209
210 manager = GetAudioManagerFuncs();
211 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME, &adapter, &render);
212 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
213 ret = render->control.Pause((AudioHandle)render);
214 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
215 adapter->DestroyRender(adapter, render);
216 manager->UnloadAdapter(manager, adapter);
217 }
218 /**
219 * @tc.name Test AudioRenderPause API via the render is paused after resumed.
220 * @tc.number SUB_Audio_HDI_RenderPause_0004
221 * @tc.desc Test AudioRenderPause interface,return 0 if the render is paused after resumed.
222 */
223 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderPause_0004, Function | MediumTest | Level1)
224 {
225 int32_t ret = -1;
226 TestAudioManager* manager = {};
227 struct AudioAdapter *adapter = nullptr;
228 struct AudioRender *render = nullptr;
229
230 manager = GetAudioManagerFuncs();
231 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME);
232 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
233 ret = render->control.Pause((AudioHandle)render);
234 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
235 ret = render->control.Resume((AudioHandle)render);
236 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
237 ret = render->control.Pause((AudioHandle)render);
238 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
239
240 ret = render->control.Stop((AudioHandle)render);
241 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
242 adapter->DestroyRender(adapter, render);
243 manager->UnloadAdapter(manager, adapter);
244 }
245 /**
246 * @tc.name Test AudioRenderPause API via the render is paused after stoped.
247 * @tc.number SUB_Audio_HDI_RenderPause_0005
248 * @tc.desc Test AudioRenderPause interface, return -1 the render is paused after stopped.
249 */
250 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderPause_0005, Function | MediumTest | Level1)
251 {
252 int32_t ret = -1;
253 struct AudioAdapter *adapter = nullptr;
254 struct AudioRender *render = nullptr;
255 TestAudioManager* manager = {};
256
257 manager = GetAudioManagerFuncs();
258 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME);
259 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
260 ret = render->control.Stop((AudioHandle)render);
261 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
262 ret = render->control.Pause((AudioHandle)render);
263 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
264
265 adapter->DestroyRender(adapter, render);
266 manager->UnloadAdapter(manager, adapter);
267 }
268 /**
269 * @tc.name Test RenderPause API via setting the incoming parameter handle is nullptr
270 * @tc.number SUB_Audio_HDI_RenderPause_0006
271 * @tc.desc Test RenderPause interface, return -1 if the incoming parameter handle is nullptr
272 */
273 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderPause_0006, Function | MediumTest | Level1)
274 {
275 int32_t ret = -1;
276 struct AudioAdapter *adapter = nullptr;
277 struct AudioRender *render = nullptr;
278 struct AudioRender *renderNull = nullptr;
279 TestAudioManager* manager = {};
280
281 manager = GetAudioManagerFuncs();
282 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME);
283 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
284 ret = render->control.Pause((AudioHandle)renderNull);
285 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
286
287 ret = render->control.Stop((AudioHandle)render);
288 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
289 adapter->DestroyRender(adapter, render);
290 manager->UnloadAdapter(manager, adapter);
291 }
292 /**
293 * @tc.name Test RenderResume API via the render is resumed after started
294 * @tc.number SUB_Audio_HDI_RenderResume_0001
295 * @tc.desc test HDI RenderResume interface,return -1 if the render is resumed after started
296 */
297 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderResume_0001, Function | MediumTest | Level1)
298 {
299 int32_t ret = -1;
300 struct AudioAdapter *adapter = nullptr;
301 struct AudioRender *render = nullptr;
302
303 TestAudioManager* manager = GetAudioManagerFuncs();
304 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME);
305 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
306 ret = render->control.Resume((AudioHandle)render);
307 EXPECT_EQ(AUDIO_HAL_ERR_NOT_SUPPORT, ret);
308
309 ret = render->control.Stop((AudioHandle)render);
310 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
311 adapter->DestroyRender(adapter, render);
312 manager->UnloadAdapter(manager, adapter);
313 }
314 /**
315 * @tc.name Test RenderResume API via the render is resumed after stopped
316 * @tc.number SUB_Audio_HDI_RenderResume_0002
317 * @tc.desc test HDI RenderResume interface,return -1 if the render is resumed after stopped
318 */
319 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderResume_0002, Function | MediumTest | Level1)
320 {
321 int32_t ret = -1;
322 struct AudioAdapter *adapter = nullptr;
323 struct AudioRender *render = nullptr;
324
325 TestAudioManager* manager = GetAudioManagerFuncs();
326 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME);
327 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
328 ret = render->control.Stop((AudioHandle)render);
329 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
330 ret = render->control.Resume((AudioHandle)render);
331 EXPECT_EQ(AUDIO_HAL_ERR_NOT_SUPPORT, ret);
332
333 adapter->DestroyRender(adapter, render);
334 manager->UnloadAdapter(manager, adapter);
335 }
336 /**
337 * @tc.name Test RenderResume API via legal input
338 * @tc.number SUB_Audio_HDI_RenderResume_0003
339 * @tc.desc Test AudioRenderResume interface,return 0 if the render is resumed after paused
340 */
341 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderResume_0003, Function | MediumTest | Level1)
342 {
343 int32_t ret = -1;
344 struct AudioAdapter *adapter = nullptr;
345 struct AudioRender *render = nullptr;
346
347 TestAudioManager* manager = GetAudioManagerFuncs();
348 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME);
349 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
350 ret = render->control.Pause((AudioHandle)render);
351 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
352 ret = render->control.Resume((AudioHandle)render);
353 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
354
355 ret = render->control.Stop((AudioHandle)render);
356 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
357 adapter->DestroyRender(adapter, render);
358 manager->UnloadAdapter(manager, adapter);
359 }
360 /**
361 * @tc.name Test RenderResume API via the render Continue to start after resume
362 * @tc.number SUB_Audio_HDI_RenderResume_0005
363 * @tc.desc test HDI RenderResume interface,return -1 if the render Continue to start after resume
364 */
365 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderResume_0005, Function | MediumTest | Level1)
366 {
367 int32_t ret = -1;
368 struct AudioAdapter *adapter = nullptr;
369 struct AudioRender *render = nullptr;
370
371 TestAudioManager* manager = GetAudioManagerFuncs();
372 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME);
373 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
374 ret = render->control.Pause((AudioHandle)render);
375 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
376 ret = render->control.Resume((AudioHandle)render);
377 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
378 ret = render->control.Start((AudioHandle)render);
379 if ((ret == AUDIO_HAL_SUCCESS) || (ret == AUDIO_HAL_ERR_AO_BUSY)){
380 EXPECT_TRUE(true);
381 }else{
382 EXPECT_TRUE(false);
383 }
384
385 ret = render->control.Stop((AudioHandle)render);
386 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
387 adapter->DestroyRender(adapter, render);
388 manager->UnloadAdapter(manager, adapter);
389 }
390 /**
391 * @tc.name Test RenderResume API via setting the incoming parameter handle is nullptr
392 * @tc.number SUB_Audio_HDI_RenderResume_0007
393 * @tc.desc Test RenderResume interface, return -1 if the incoming parameter handle is nullptr
394 */
395 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderResume_0006, Function | MediumTest | Level1)
396 {
397 int32_t ret = -1;
398 struct AudioAdapter *adapter = nullptr;
399 struct AudioRender *render = nullptr;
400 struct AudioRender *renderNull = nullptr;
401
402 TestAudioManager* manager = GetAudioManagerFuncs();
403 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME);
404 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
405 ret = render->control.Pause((AudioHandle)render);
406 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
407 ret = render->control.Resume((AudioHandle)renderNull);
408 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
409
410 ret = render->control.Stop((AudioHandle)render);
411 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
412 adapter->DestroyRender(adapter, render);
413 manager->UnloadAdapter(manager, adapter);
414 }
415 /**
416 * @tc.name Test AudioCreateRender API via legal input.
417 * @tc.number SUB_Audio_HDI_CreateRender_0001
418 * @tc.desc test AudioCreateRender interface,return 0 if render is created successful.
419 */
420 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_CreateRender_0001, Function | MediumTest | Level1)
421 {
422 int32_t ret = -1;
423 struct AudioAdapter *adapter = nullptr;
424 struct AudioRender *render = nullptr;
425 TestAudioManager* manager = GetAudioManagerFuncs();
426 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME, &adapter, &render);
427 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
428 adapter->DestroyRender(adapter, render);
429 manager->UnloadAdapter(manager, adapter);
430 }
431 /**
432 * @tc.name Test AudioCreateRender API via setting the incoming parameter pins is PIN_IN_MIC.
433 * @tc.number SUB_Audio_HDI_CreateRender_0003
434 * @tc.desc test AudioCreateRender interface,return -1 if the incoming parameter pins is PIN_IN_MIC.
435 */
436 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_CreateRender_0003, Function | MediumTest | Level1)
437 {
438 int32_t ret = -1;
439 struct AudioAdapter *adapter = nullptr;
440 struct AudioRender *render = nullptr;
441 struct AudioPort* renderPort = nullptr;
442 struct AudioSampleAttributes attrs = {};
443 struct AudioDeviceDescriptor devDesc = {};
444
445 TestAudioManager* manager = GetAudioManagerFuncs();
446 ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME, &adapter, renderPort);
447 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
448 InitAttrs(attrs);
449 InitDevDesc(devDesc, renderPort->portId, PIN_IN_MIC);
450 ret = adapter->CreateRender(adapter, &devDesc, &attrs, &render);
451 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
452 manager->UnloadAdapter(manager, adapter);
453 }
454
455 /**
456 * @tc.name Test AudioCreateRender API via setting the incoming parameter attr is error.
457 * @tc.number SUB_Audio_HDI_CreateRender_0004
458 * @tc.desc test AudioCreateRender interface,return -1 if the incoming parameter attr is error.
459 */
460 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_CreateRender_0004, Function | MediumTest | Level1)
461 {
462 int32_t ret = -1;
463 struct AudioAdapter *adapter = nullptr;
464 struct AudioRender *render = nullptr;
465 struct AudioSampleAttributes attrs = {};
466 struct AudioDeviceDescriptor devDesc = {};
467 struct AudioPort* renderPort = nullptr;
468 uint32_t channelCountErr = 5;
469 TestAudioManager* manager = GetAudioManagerFuncs();
470 ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME, &adapter, renderPort);
471 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
472 InitAttrs(attrs);
473 InitDevDesc(devDesc, renderPort->portId, PIN_OUT_SPEAKER);
474 attrs.format = AUDIO_FORMAT_AAC_MAIN;
475 ret = adapter->CreateRender(adapter, &devDesc, &attrs, &render);
476 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
477 attrs.channelCount = channelCountErr;
478 ret = adapter->CreateRender(adapter, &devDesc, &attrs, &render);
479 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
480 attrs.type = AUDIO_IN_COMMUNICATION;
481 ret = adapter->CreateRender(adapter, &devDesc, &attrs, &render);
482 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
483
484 manager->UnloadAdapter(manager, adapter);
485 }
486 /**
487 * @tc.name Test AudioCreateRender API via setting the incoming parameter adapter is nullptr
488 * @tc.number SUB_Audio_HDI_CreateRender_0005
489 * @tc.desc test AudioCreateRender interface,Returns -1 if the incoming parameter adapter is nullptr.
490 */
491 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_CreateRender_0005, Function | MediumTest | Level1)
492 {
493 int32_t ret = -1;
494 struct AudioAdapter *adapter = nullptr;
495 struct AudioRender *render = nullptr;
496 struct AudioAdapter *adapterNull = nullptr;
497 struct AudioPort* renderPort = nullptr;
498 struct AudioSampleAttributes attrs = {};
499 struct AudioDeviceDescriptor devDesc = {};
500 TestAudioManager* manager = GetAudioManagerFuncs();
501 ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME, &adapter, renderPort);
502 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
503 InitAttrs(attrs);
504 InitDevDesc(devDesc, renderPort->portId, PIN_OUT_SPEAKER);
505 ret = adapter->CreateRender(adapterNull, &devDesc, &attrs, &render);
506 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
507 manager->UnloadAdapter(manager, adapter);
508 }
509
510 /**
511 * @tc.name Test AudioCreateRender API via setting the incoming parameter devDesc is nullptr
512 * @tc.number SUB_Audio_HDI_CreateRender_0006
513 * @tc.desc test AudioCreateRender interface,Returns -1 if the incoming parameter devDesc is nullptr.
514 */
515 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_CreateRender_0006, Function | MediumTest | Level1)
516 {
517 int32_t ret = -1;
518 struct AudioRender *render = nullptr;
519 struct AudioAdapter *adapter = nullptr;
520 struct AudioPort* renderPort = nullptr;
521 struct AudioSampleAttributes attrs = {};
522 struct AudioDeviceDescriptor *devDescNull = nullptr;
523 TestAudioManager* manager = GetAudioManagerFuncs();
524 ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME, &adapter, renderPort);
525 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
526 InitAttrs(attrs);
527 ret = adapter->CreateRender(adapter, devDescNull, &attrs, &render);
528 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
529 manager->UnloadAdapter(manager, adapter);
530 }
531
532 /**
533 * @tc.name Test AudioCreateRender API via setting the incoming parameter attrs is nullptr
534 * @tc.number SUB_Audio_HDI_CreateRender_0007
535 * @tc.desc test AudioCreateRender interface,Returns -1 if the incoming parameter attrs is nullptr.
536 */
537 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_CreateRender_0007, Function | MediumTest | Level1)
538 {
539 int32_t ret = -1;
540 struct AudioPort* renderPort = nullptr;
541 struct AudioAdapter *adapter = nullptr;
542 struct AudioRender *render = nullptr;
543 struct AudioSampleAttributes *attrsNull = nullptr;
544 struct AudioDeviceDescriptor devDesc = {};
545
546 TestAudioManager* manager = GetAudioManagerFuncs();
547 ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME, &adapter, renderPort);
548 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
549 InitDevDesc(devDesc, renderPort->portId, PIN_OUT_SPEAKER);
550 ret = adapter->CreateRender(adapter, &devDesc, attrsNull, &render);
551 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
552 manager->UnloadAdapter(manager, adapter);
553 }
554
555 /**
556 * @tc.name Test AudioCreateRender API via setting the incoming parameter render is nullptr
557 * @tc.number SUB_Audio_HDI_CreateRender_0008
558 * @tc.desc test AudioCreateRender interface,Returns -1 if the incoming parameter render is nullptr.
559 */
560 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_CreateRender_0008, Function | MediumTest | Level1)
561 {
562 int32_t ret = -1;
563 struct AudioAdapter *adapter = nullptr;
564 struct AudioRender **renderNull = nullptr;
565 struct AudioPort* renderPort = nullptr;
566 struct AudioSampleAttributes attrs = {};
567 struct AudioDeviceDescriptor devDesc = {};
568
569 TestAudioManager* manager = GetAudioManagerFuncs();
570 ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME, &adapter, renderPort);
571 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
572 InitAttrs(attrs);
573 InitDevDesc(devDesc, renderPort->portId, PIN_OUT_SPEAKER);
574 ret = adapter->CreateRender(adapter, &devDesc, &attrs, renderNull);
575 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
576 manager->UnloadAdapter(manager, adapter);
577 }
578
579 /**
580 * @tc.name Test AudioCreateRender API via setting the incoming parameter devDesc is error
581 * @tc.number SUB_Audio_HDI_CreateRender_0009
582 * @tc.desc test AudioCreateRender interface,Returns -1 if the incoming parameter devDesc is error.
583 */
584 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_CreateRender_0009, Function | MediumTest | Level1)
585 {
586 int32_t ret = -1;
587 struct AudioAdapter *adapter = nullptr;
588 struct AudioRender *render = nullptr;
589 struct AudioSampleAttributes attrs = {};
590 struct AudioDeviceDescriptor devDesc = {};
591 struct AudioPort* renderPort = nullptr;
592
593 TestAudioManager* manager = GetAudioManagerFuncs();
594 ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME, &adapter, renderPort);
595 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
596
597 ret = InitAttrs(attrs);
598 InitDevDesc(devDesc, renderPort->portId, PIN_OUT_SPEAKER);
599 devDesc.portId = -5;
600 ret = adapter->CreateRender(adapter, &devDesc, &attrs, &render);
601 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
602 devDesc.pins = PIN_NONE;
603 ret = adapter->CreateRender(adapter, &devDesc, &attrs, &render);
604 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
605 devDesc.desc = "devtestname";
606 ret = adapter->CreateRender(adapter, &devDesc, &attrs, &render);
607 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
608
609 manager->UnloadAdapter(manager, adapter);
610 }
611 /**
612 * @tc.name Test AudioCreateRender API via setting the incoming parameter desc which portID is not configed
613 * @tc.number SUB_Audio_HDI_CreateRender_0010
614 * @tc.desc test AudioCreateRender interface,Returns -1 if the incoming desc which portID is not configed
615 */
616 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_CreateRender_0010, TestSize.Level1)
617 {
618 int32_t ret = -1;
619 struct AudioAdapter *adapter = nullptr;
620 struct AudioRender *render = nullptr;
621 struct AudioSampleAttributes attrs = {};
622 struct AudioDeviceDescriptor devDesc = {};
623 struct AudioPort* renderPort = nullptr;
624 uint32_t portID = 10;
625
626 TestAudioManager* manager = GetAudioManagerFuncs();
627 ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME, &adapter, renderPort);
628 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
629
630 ret = InitAttrs(attrs);
631 InitDevDesc(devDesc, portID, PIN_OUT_SPEAKER);
632
633 ret = adapter->CreateRender(adapter, &devDesc, &attrs, &render);
634 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
635 ret = adapter->DestroyRender(adapter, render);
636 manager->UnloadAdapter(manager, adapter);
637 }
638 /**
639 * @tc.name Test AudioDestroyRender API via legal input.
640 * @tc.number SUB_Audio_HDI_DestroyRender_0001
641 * @tc.desc Test AudioDestroyRender interface, return 0 if render is destroyed successful.
642 */
643 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_DestroyRender_0001, Function | MediumTest | Level1)
644 {
645 int32_t ret = -1;
646 struct AudioAdapter *adapter = nullptr;
647 struct AudioRender *render = nullptr;
648 TestAudioManager* manager = GetAudioManagerFuncs();
649
650 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME, &adapter, &render);
651 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
652
653 ret = adapter->DestroyRender(adapter, render);
654 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
655 manager->UnloadAdapter(manager, adapter);
656 }
657 /**
658 * @tc.name Test AudioDestroyRender API,where the parameter render is empty.
659 * @tc.number SUB_Audio_HDI_DestroyRender_0002
660 * @tc.desc Test AudioDestroyRender interface, return -1 if the parameter render is empty.
661 */
662 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_DestroyRender_0002, Function | MediumTest | Level1)
663 {
664 int32_t ret = -1;
665 struct AudioAdapter *adapter = nullptr;
666 struct AudioRender *render = nullptr;
667 struct AudioRender *renderNull = nullptr;
668 TestAudioManager* manager = GetAudioManagerFuncs();
669
670 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME, &adapter, &render);
671 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
672
673 ret = adapter->DestroyRender(adapter, renderNull);
674 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
675 manager->UnloadAdapter(manager, adapter);
676 }
677
678 /**
679 * @tc.name Test RenderFlush API via legal input Verify that the data in the buffer is flushed after stop
680 * @tc.number SUB_Audio_HDI_RenderFlush_0001
681 * @tc.desc Test RenderFlush interface,return -2 if the data in the buffer is flushed successfully after stop
682 */
683 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderFlush_0001, Function | MediumTest | Level1)
684 {
685 int32_t ret = -1;
686 TestAudioManager* manager = {};
687 struct AudioAdapter *adapter = nullptr;
688 struct AudioRender *render = nullptr;
689
690 manager = GetAudioManagerFuncs();
691
692 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME);
693 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
694 ret = render->control.Stop((AudioHandle)render);
695 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
696 ret = render->control.Flush((AudioHandle)render);
697 EXPECT_EQ(AUDIO_HAL_ERR_NOT_SUPPORT, ret);
698
699 adapter->DestroyRender(adapter, render);
700 manager->UnloadAdapter(manager, adapter);
701 }
702 /**
703 * @tc.name Test RenderFlush that the data in the buffer is flushed when handle is nullptr after paused
704 * @tc.number SUB_Audio_HDI_RenderFlush_0002
705 * @tc.desc Test RenderFlush, return -1 if the data in the buffer is flushed when handle is nullptr after paused
706 */
707 HWTEST_F(AudioHdiRenderControlTest, SUB_Audio_HDI_RenderFlush_0002, Function | MediumTest | Level1)
708 {
709 int32_t ret = -1;
710 TestAudioManager* manager = {};
711 struct AudioAdapter *adapter = nullptr;
712 struct AudioRender *render = nullptr;
713 struct AudioRender *renderNull = nullptr;
714
715 manager = GetAudioManagerFuncs();
716
717 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME);
718 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
719 ret = render->control.Pause((AudioHandle)render);
720 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
721 ret = render->control.Flush((AudioHandle)renderNull);
722 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
723
724 ret = render->control.Stop((AudioHandle)render);
725 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
726 adapter->DestroyRender(adapter, render);
727 manager->UnloadAdapter(manager, adapter);
728 }
729 }
730