1 /*
2  * Copyright (c) 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 #include <gtest/gtest.h>
17 #include "osal_mem.h"
18 #include "hdi_service_common.h"
19 
20 using namespace std;
21 using namespace testing::ext;
22 using namespace OHOS::Audio;
23 
24 namespace {
25 class AudioIdlHdiManagerTest : public testing::Test {
26 public:
27     static void SetUpTestCase(void);
28     static void TearDownTestCase(void);
29     void SetUp();
30     void TearDown();
31     static TestAudioManager *manager;
32 };
33 
34 TestAudioManager *AudioIdlHdiManagerTest::manager = nullptr;
35 
SetUpTestCase(void)36 void AudioIdlHdiManagerTest::SetUpTestCase(void)
37 {
38     manager = IAudioManagerGet(IS_STUB);
39     ASSERT_NE(nullptr, manager);
40 }
41 
TearDownTestCase(void)42 void AudioIdlHdiManagerTest::TearDownTestCase(void)
43 {
44     if (manager != nullptr) {
45         (void)IAudioManagerRelease(manager, IS_STUB);
46     }
47 }
48 
SetUp(void)49 void AudioIdlHdiManagerTest::SetUp(void) {}
TearDown(void)50 void AudioIdlHdiManagerTest::TearDown(void) {}
51 
52 /**
53 * @tc.name  AudioGetAllAdapters_001
54 * @tc.desc  test GetAllAdapters interface,Returns 0 if the list is obtained successfully
55 * @tc.type: FUNC
56 */
57 HWTEST_F(AudioIdlHdiManagerTest, AudioGetAllAdapters_001, TestSize.Level1)
58 {
59     int32_t ret = -1;
60     uint32_t descsLen = AUDIO_ADAPTER_MAX_NUM;
61     struct AudioAdapterDescriptor *descs = nullptr;
62     descs = (struct AudioAdapterDescriptor*)OsalMemCalloc(
63         sizeof(struct AudioAdapterDescriptor) * (AUDIO_ADAPTER_MAX_NUM));
64     ASSERT_NE(nullptr, descs);
65     ASSERT_NE(nullptr, manager);
66 
67     ret = manager->GetAllAdapters(manager, descs, &descsLen);
68     EXPECT_EQ(HDF_SUCCESS, ret);
69 
70     TestReleaseAdapterDescs(&descs, descsLen);
71 }
72 
73 /**
74 * @tc.name  AudioGetAllAdaptersNull_002
75 * @tc.desc  test GetAllAdapters interface,Returns -3/-4 if the incoming parameter manager is nullptr
76 * @tc.type: FUNC
77 */
78 HWTEST_F(AudioIdlHdiManagerTest, AudioGetAllAdaptersNull_002, TestSize.Level1)
79 {
80     int32_t ret = -1;
81     uint32_t descsLen = AUDIO_ADAPTER_MAX_NUM;
82     struct AudioAdapterDescriptor *descs = nullptr;
83     descs = (struct AudioAdapterDescriptor*)OsalMemCalloc(
84         sizeof(struct AudioAdapterDescriptor) * (AUDIO_ADAPTER_MAX_NUM));
85     TestAudioManager *managerNull = nullptr;
86     ASSERT_NE(nullptr, descs);
87     ASSERT_NE(nullptr, manager);
88 
89     ret = manager->GetAllAdapters(managerNull, descs, &descsLen);
90     ASSERT_TRUE(ret == HDF_ERR_INVALID_PARAM || ret == HDF_ERR_INVALID_OBJECT);
91     OsalMemFree(descs);
92     descs = nullptr;
93 }
94 #ifdef AUDIO_ADM_PASSTHROUGH
95 /**
96 * @tc.name  AudioGetAllAdapters_003
97 * @tc.desc  test GetAllAdapters interface,Returns -3 if the incoming parameter descs is nullptr
98 * @tc.type: FUNC
99 */
100 HWTEST_F(AudioIdlHdiManagerTest, AudioGetAllAdaptersNull_003, TestSize.Level1)
101 {
102     int32_t ret = -1;
103     uint32_t descsLen = AUDIO_ADAPTER_MAX_NUM;
104     struct AudioAdapterDescriptor *descs = nullptr;
105     ASSERT_NE(nullptr, manager);
106 
107     ret = manager->GetAllAdapters(manager, descs, &descsLen);
108     EXPECT_EQ(HDF_ERR_INVALID_PARAM, ret);
109 }
110 /**
111 * @tc.name  AudioGetAllAdaptersNull_004
112 * @tc.desc  test GetAllAdapters interface,Returns -3/-4 if the incoming parameter descsLen is nullptr
113 * @tc.type: FUNC
114 */
115 
116 HWTEST_F(AudioIdlHdiManagerTest, AudioGetAllAdaptersNull_004, TestSize.Level1)
117 {
118     int32_t ret = -1;
119     uint32_t* descsLen = nullptr;
120     struct AudioAdapterDescriptor *descs = nullptr;
121     descs = (struct AudioAdapterDescriptor*)OsalMemCalloc(
122         sizeof(struct AudioAdapterDescriptor) * (AUDIO_ADAPTER_MAX_NUM));
123     ASSERT_NE(nullptr, descs);
124     ASSERT_NE(nullptr, manager);
125 
126     ret = manager->GetAllAdapters(manager, descs, descsLen);
127     ASSERT_TRUE(ret == HDF_ERR_INVALID_PARAM || ret == HDF_ERR_INVALID_OBJECT);
128     OsalMemFree(descs);
129     descs = nullptr;
130 }
131 #endif
132 /**
133 * @tc.name  AudioGetAllAdapters_005
134 * @tc.desc  test GetAllAdapters interface,Returns -7001 if the incoming parameter descsLen is too small
135 * @tc.type: FUNC
136 */
137 HWTEST_F(AudioIdlHdiManagerTest, AudioGetAllAdapters_005, TestSize.Level1)
138 {
139     int32_t ret = -1;
140     uint32_t descsLen = AUDIO_ADAPTER_MAX_NUM;
141     struct AudioAdapterDescriptor *descs = nullptr;
142     descs = (struct AudioAdapterDescriptor*)OsalMemCalloc(
143         sizeof(struct AudioAdapterDescriptor) * (AUDIO_ADAPTER_MAX_NUM));
144     ASSERT_NE(nullptr, descs);
145     ASSERT_NE(nullptr, manager);
146 
147     descsLen = 0; // invalid descsLen
148     ret = manager->GetAllAdapters(manager, descs, &descsLen);
149     EXPECT_TRUE((ret == AUDIO_HAL_ERR_NOTREADY || ret == HDF_ERR_INVALID_PARAM));
150     OsalMemFree(descs);
151     descs = nullptr;
152 }
153 
154 /**
155 * @tc.name  AudioLoadAdapter_001
156 * @tc.desc  test LoadAdapter interface,Returns 0 if the driver is loaded successfully
157 * @tc.type: FUNC
158 */
159 HWTEST_F(AudioIdlHdiManagerTest, AudioLoadAdapter_001, TestSize.Level1)
160 {
161     uint32_t descsLen = AUDIO_ADAPTER_MAX_NUM;
162     struct AudioAdapterDescriptor *descs = nullptr;
163     struct IAudioAdapter *adapter = nullptr;
164     ASSERT_NE(nullptr, manager);
165 
166     int32_t ret = GetAdapters(manager, descs, descsLen);
167     ASSERT_EQ(HDF_SUCCESS, ret);
168     struct AudioAdapterDescriptor *desc = &descs[0];
169     ASSERT_TRUE(desc != nullptr);
170     ret = manager->LoadAdapter(manager, desc, &adapter);
171     ASSERT_EQ(HDF_SUCCESS, ret);
172     ret = -1;
173     if (adapter != nullptr) {
174         if (adapter->InitAllPorts != nullptr && adapter->CreateRender != nullptr &&
175             adapter->DestroyRender != nullptr && adapter->CreateCapture != nullptr &&
176             adapter->DestroyCapture != nullptr && adapter->GetPortCapability != nullptr &&
177             adapter->SetPassthroughMode != nullptr && adapter->GetPassthroughMode != nullptr) {
178             ret = 0;
179         }
180     }
181     EXPECT_EQ(HDF_SUCCESS, ret);
182     ret = manager->UnloadAdapter(manager, desc->adapterName);
183     EXPECT_EQ(HDF_SUCCESS, ret);
184     TestReleaseAdapterDescs(&descs, descsLen);
185     IAudioAdapterRelease(adapter, IS_STUB);
186 }
187 
188 /**
189 * @tc.name  AudioLoadAdapterNull_002
190 * @tc.desc  test LoadAdapter interface,Returns -3/-4 if the incoming parameter manager is nullptr
191 * @tc.type: FUNC
192 */
193 HWTEST_F(AudioIdlHdiManagerTest, AudioLoadAdapterNull_002, TestSize.Level1)
194 {
195     int32_t ret = -1;
196     uint32_t descsLen = AUDIO_ADAPTER_MAX_NUM;
197     struct AudioAdapterDescriptor *descs = nullptr;
198     TestAudioManager *managerNull = nullptr;
199     struct IAudioAdapter *adapter = nullptr;
200     ASSERT_NE(nullptr, manager);
201 
202     ret = GetAdapters(manager, descs, descsLen);
203     ASSERT_EQ(HDF_SUCCESS, ret);
204     struct AudioAdapterDescriptor *desc = &descs[0];
205     ASSERT_TRUE(desc != nullptr);
206     ret = manager->LoadAdapter(managerNull, desc, &adapter);
207     ASSERT_TRUE(ret == HDF_ERR_INVALID_PARAM || ret == HDF_ERR_INVALID_OBJECT);
208     TestReleaseAdapterDescs(&descs, descsLen);
209 }
210 #ifdef AUDIO_ADM_PASSTHROUGH
211 /**
212 * @tc.name  AudioLoadAdapterNull_003
213 * @tc.desc  test LoadAdapter interface,Returns -3 if the incoming parameter desc is nullptr
214 * @tc.type: FUNC
215 */
216 HWTEST_F(AudioIdlHdiManagerTest, AudioLoadAdapterNull_003, TestSize.Level1)
217 {
218     int32_t ret = -1;
219     uint32_t descsLen = AUDIO_ADAPTER_MAX_NUM;
220     struct AudioAdapterDescriptor *desc = nullptr;
221     struct AudioAdapterDescriptor *descs = nullptr;
222     struct IAudioAdapter *adapter = nullptr;
223     ASSERT_NE(nullptr, manager);
224 
225     ret = GetAdapters(manager, descs, descsLen);
226     ASSERT_EQ(HDF_SUCCESS, ret);
227 
228     ret = manager->LoadAdapter(manager, desc, &adapter);
229     ASSERT_EQ(HDF_ERR_INVALID_PARAM, ret);
230     TestReleaseAdapterDescs(&descs, descsLen);
231 }
232 /**
233 * @tc.name  AudioLoadAdapterNull_004
234 * @tc.desc  test LoadAdapter interface,Returns -3/-4 if the incoming parameter adapter is nullptr
235 * @tc.type: FUNC
236 */
237 HWTEST_F(AudioIdlHdiManagerTest, AudioLoadAdapterNull_004, TestSize.Level1)
238 {
239     int32_t ret = -1;
240     uint32_t descsLen = AUDIO_ADAPTER_MAX_NUM;
241     struct AudioAdapterDescriptor *descs = nullptr;
242     struct IAudioAdapter **adapter = nullptr;
243     ASSERT_NE(nullptr, manager);
244 
245     ret = GetAdapters(manager, descs, descsLen);
246     ASSERT_EQ(HDF_SUCCESS, ret);
247     struct AudioAdapterDescriptor *desc = &descs[0];
248     ASSERT_TRUE(desc != nullptr);
249 
250     ret = manager->LoadAdapter(manager, desc, adapter);
251     ASSERT_TRUE(ret == HDF_ERR_INVALID_PARAM || ret == HDF_ERR_INVALID_OBJECT);
252     TestReleaseAdapterDescs(&descs, descsLen);
253 }
254 #endif
255 /**
256 * @tc.name  AudioLoadAdapter_005
257 * @tc.desc  test LoadAdapter interface,Returns -3 if the adapterName of incoming parameter desc is not support
258 * @tc.type: FUNC
259 */
260 
261 HWTEST_F(AudioIdlHdiManagerTest, AudioLoadAdapter_005, TestSize.Level1)
262 {
263     uint32_t descsLen = AUDIO_ADAPTER_MAX_NUM;
264     struct AudioAdapterDescriptor *descs = nullptr;
265     struct IAudioAdapter *adapter = nullptr;
266     ASSERT_NE(nullptr, manager);
267 
268     int32_t ret = GetAdapters(manager, descs, descsLen);
269     ASSERT_EQ(HDF_SUCCESS, ret);
270     struct AudioAdapterDescriptor *desc = &descs[0];
271     ASSERT_TRUE(desc != nullptr);
272     desc->adapterName = strdup("illegal");
273     ret = manager->LoadAdapter(manager, desc, &adapter);
274     ASSERT_TRUE(ret == HDF_ERR_INVALID_PARAM || ret == HDF_FAILURE);
275     TestReleaseAdapterDescs(&descs, descsLen);
276 }
277 
278 /**
279 * @tc.name  AudioLoadAdapter_006
280 * @tc.desc  test LoadAdapter interface,Returns -3 if the adapterName of incoming parameter desc is illegal
281 * @tc.type: FUNC
282 */
283 HWTEST_F(AudioIdlHdiManagerTest, AudioLoadAdapter_006, TestSize.Level1)
284 {
285     int32_t ret = -1;
286     struct AudioAdapterDescriptor desc = {
287         .adapterName = strdup("illegal"),
288         .ports = nullptr,
289         .portsLen = 0,
290     };
291     struct IAudioAdapter *adapter = nullptr;
292     ASSERT_NE(nullptr, manager);
293 
294     ret = manager->LoadAdapter(manager, &desc, &adapter);
295     ASSERT_TRUE(ret == HDF_ERR_INVALID_PARAM || ret == HDF_FAILURE);
296     free(desc.adapterName);
297 }
298 /**
299 * @tc.name  AudioLoadAdapter_008
300 * @tc.desc  test LoadAdapter interface,Load two sound cards at the same time, Returns 0 If the loading is successful,
301             Return - 1 If the loading fails.
302 */
303 HWTEST_F(AudioIdlHdiManagerTest, AudioLoadAdapter_008, TestSize.Level1)
304 {
305     int32_t ret = -1;
306     struct AudioPort audioPort = {};
307     struct AudioPort secondAudioPort = {};
308     struct IAudioAdapter *firstAdapter = nullptr;
309     struct IAudioAdapter *secondAdapter = nullptr;
310     ASSERT_NE(nullptr, manager);
311 
312     ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME, &firstAdapter, audioPort);
313     EXPECT_EQ(HDF_SUCCESS, ret);
314     ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME, &secondAdapter, secondAudioPort);
315     EXPECT_EQ(HDF_SUCCESS, ret);
316 
317     ret = manager->UnloadAdapter(manager, ADAPTER_NAME.c_str());
318     EXPECT_EQ(HDF_SUCCESS, ret);
319     IAudioAdapterRelease(firstAdapter, IS_STUB);
320     if (audioPort.portName != nullptr) {
321         free(audioPort.portName);
322     }
323     if (secondAudioPort.portName != nullptr) {
324         free(secondAudioPort.portName);
325     }
326 }
327 /**
328 * @tc.name  AudioUnloadAdapter_001
329 * @tc.desc  test UnloadAdapter interface,Returns 0 if If the sound card can be successfully uninstalled
330 * @tc.type: FUNC
331 */
332 HWTEST_F(AudioIdlHdiManagerTest, AudioUnloadAdapter_001, TestSize.Level1)
333 {
334     int32_t ret = -1;
335     struct AudioPort audioPort = {};
336     struct IAudioAdapter *adapter = nullptr;
337     ASSERT_NE(nullptr, manager);
338 
339     ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME, &adapter, audioPort);
340     EXPECT_EQ(HDF_SUCCESS, ret);
341     ret = manager->UnloadAdapter(manager, ADAPTER_NAME.c_str());
342     EXPECT_EQ(HDF_SUCCESS, ret);
343     IAudioAdapterRelease(adapter, IS_STUB);
344     if (audioPort.portName != nullptr) {
345         free(audioPort.portName);
346     }
347 }
348 /**
349 * @tc.name  AudioUnloadAdapterNull_002
350 * @tc.desc  test UnloadAdapter interface,Returns -3/-4 if the incoming parameter manager is nullptr
351 * @tc.type: FUNC
352 */
353 HWTEST_F(AudioIdlHdiManagerTest, AudioUnloadAdapterNull_002, TestSize.Level1)
354 {
355     int32_t ret = -1;
356     struct AudioPort audioPort = {};
357     struct IAudioAdapter *adapter = nullptr;
358     ASSERT_NE(nullptr, manager);
359 
360     ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME, &adapter, audioPort);
361     EXPECT_EQ(HDF_SUCCESS, ret);
362     TestAudioManager *managerNull = nullptr;
363     ret = manager->UnloadAdapter(managerNull, ADAPTER_NAME.c_str());
364     ASSERT_TRUE(ret == HDF_ERR_INVALID_PARAM || ret == HDF_ERR_INVALID_OBJECT);
365     ret = manager->UnloadAdapter(manager, ADAPTER_NAME.c_str());
366     EXPECT_EQ(HDF_SUCCESS, ret);
367     IAudioAdapterRelease(adapter, IS_STUB);
368     if (audioPort.portName != nullptr) {
369         free(audioPort.portName);
370     }
371 }
372 
373 /**
374 * @tc.name  AudioUnloadAdapterNull_003
375 * @tc.desc  test UnloadAdapter interface,Returns -3 if the incoming parameter adapterName is nullptr
376 * @tc.type: FUNC
377 */
378 HWTEST_F(AudioIdlHdiManagerTest, AudioUnloadAdapterNull_003, TestSize.Level1)
379 {
380     int32_t ret = -1;
381     struct AudioPort audioPort = {};
382     struct IAudioAdapter *adapter = nullptr;
383     ASSERT_NE(nullptr, manager);
384 
385     ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME, &adapter, audioPort);
386     EXPECT_EQ(HDF_SUCCESS, ret);
387     char *adapterName = nullptr;
388     ret = manager->UnloadAdapter(manager, adapterName);
389     EXPECT_EQ(HDF_ERR_INVALID_PARAM, ret);
390     ret = manager->UnloadAdapter(manager, ADAPTER_NAME.c_str());
391     EXPECT_EQ(HDF_SUCCESS, ret);
392     IAudioAdapterRelease(adapter, IS_STUB);
393     if (audioPort.portName != nullptr) {
394         free(audioPort.portName);
395     }
396 }
397 
398 /**
399 * @tc.name  AudioUnloadAdapter_004
400 * @tc.desc  test UnloadAdapter interface,Returns -1 if The name of the adapterName is not supported
401 * @tc.type: FUNC
402 */
403 HWTEST_F(AudioIdlHdiManagerTest, AudioUnloadAdapter_004, TestSize.Level1)
404 {
405     int32_t ret = -1;
406     struct AudioPort audioPort = {};
407     struct IAudioAdapter *adapter = nullptr;
408     ASSERT_NE(nullptr, manager);
409 
410     ret = GetLoadAdapter(manager, PORT_OUT, ADAPTER_NAME, &adapter, audioPort);
411     EXPECT_EQ(HDF_SUCCESS, ret);
412     ret = manager->UnloadAdapter(manager, ADAPTER_NAME_OUT.c_str());
413     EXPECT_EQ(HDF_ERR_INVALID_PARAM, ret);
414     ret = manager->UnloadAdapter(manager, ADAPTER_NAME.c_str());
415     EXPECT_EQ(HDF_SUCCESS, ret);
416     IAudioAdapterRelease(adapter, IS_STUB);
417     if (audioPort.portName != nullptr) {
418         free(audioPort.portName);
419     }
420 }
421 }