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