1 /*
2 * Copyright (c) 2025 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 "direct_playback_engine.h"
18 #include "sink/i_audio_render_sink.h"
19 #include "common/hdi_adapter_info.h"
20 #include "manager/hdi_adapter_manager.h"
21 #include "pro_renderer_stream_impl.h"
22 #include "audio_errors.h"
23
24 using namespace testing::ext;
25 namespace OHOS {
26 namespace AudioStandard {
27 class DirectPlayBackEngineUnitTest : public testing::Test {
28 public:
29 static void SetUpTestCase(void);
30 static void TearDownTestCase(void);
31 void SetUp();
32 void TearDown();
33
34 protected:
35 AudioProcessConfig InitProcessConfig();
36
37 protected:
38 std::unique_ptr<AudioPlaybackEngine> playbackEngine_;
39 };
40
SetUpTestCase(void)41 void DirectPlayBackEngineUnitTest::SetUpTestCase(void)
42 {
43 // input testsuit setup step,setup invoked before all testcases
44 }
45
TearDownTestCase(void)46 void DirectPlayBackEngineUnitTest::TearDownTestCase(void)
47 {
48 // input testsuit teardown step,teardown invoked after all testcases
49 }
50
SetUp(void)51 void DirectPlayBackEngineUnitTest::SetUp(void)
52 {
53 AudioDeviceDescriptor deviceInfo(AudioDeviceDescriptor::DEVICE_INFO);
54 deviceInfo.deviceType_ = DEVICE_TYPE_SPEAKER;
55 playbackEngine_ = std::make_unique<DirectPlayBackEngine>();
56 if (playbackEngine_) {
57 playbackEngine_->Init(deviceInfo, false);
58 }
59 }
60
TearDown(void)61 void DirectPlayBackEngineUnitTest::TearDown(void)
62 {
63 if (playbackEngine_) {
64 playbackEngine_->Stop();
65 playbackEngine_ = nullptr;
66 }
67 }
68
69 /**
70 * @tc.name : Test DirectPlayBackEngine API
71 * @tc.type : FUNC
72 * @tc.number: DirectPlayBackEngine_001
73 * @tc.desc : Test DirectPlayBackEngine::Init().
74 */
75 HWTEST_F(DirectPlayBackEngineUnitTest, DirectPlayBackEngine_001, TestSize.Level2)
76 {
77 DirectPlayBackEngine engine;
78 AudioDeviceDescriptor deviceDesc(AudioDeviceDescriptor::DEVICE_INFO);
79 bool isVoip = true;
80 engine.isInit_ = true;
81 deviceDesc.deviceType_ = DEVICE_TYPE_INVALID;
82 engine.device_.deviceType_ = DEVICE_TYPE_NONE;
83 engine.renderId_ = HDI_INVALID_ID;
84
85 auto ret = engine.Init(deviceDesc, isVoip);
86 EXPECT_EQ(ret, SUCCESS);
87
88 engine.isInit_ = false;
89 ret = engine.Init(deviceDesc, isVoip);
90 EXPECT_EQ(ret, SUCCESS);
91 }
92
93 /**
94 * @tc.name : Test DirectPlayBackEngine API
95 * @tc.type : FUNC
96 * @tc.number: DirectPlayBackEngine_002
97 * @tc.desc : Test DirectPlayBackEngine::Init().
98 */
99 HWTEST_F(DirectPlayBackEngineUnitTest, DirectPlayBackEngine_002, TestSize.Level2)
100 {
101 DirectPlayBackEngine engine;
102 AudioDeviceDescriptor deviceDesc(AudioDeviceDescriptor::DEVICE_INFO);
103 bool isVoip = true;
104 engine.isInit_ = true;
105 deviceDesc.deviceType_ = DEVICE_TYPE_INVALID;
106 engine.device_.deviceType_ = DEVICE_TYPE_INVALID;
107 engine.renderId_ = HDI_INVALID_ID;
108
109 auto ret = engine.Init(deviceDesc, isVoip);
110 EXPECT_EQ(ret, SUCCESS);
111
112 deviceDesc.deviceType_ = DEVICE_TYPE_NONE;
113 ret = engine.Init(deviceDesc, isVoip);
114 EXPECT_EQ(ret, SUCCESS);
115 }
116
117 /**
118 * @tc.name : Test DirectPlayBackEngine API
119 * @tc.type : FUNC
120 * @tc.number: DirectPlayBackEngine_003
121 * @tc.desc : Test DirectPlayBackEngine::AddRenderer().
122 */
123 HWTEST_F(DirectPlayBackEngineUnitTest, DirectPlayBackEngine_003, TestSize.Level2)
124 {
125 DirectPlayBackEngine engine;
126 engine.isStart_ = true;
127 uint32_t idx1 = 0;
128 uint32_t idx2 = 1;
129 AudioProcessConfig config;
130 std::shared_ptr<ProRendererStreamImpl> rendererStream1 = std::make_shared<ProRendererStreamImpl>(config, true);
131 if (rendererStream1) {
132 rendererStream1->SetStreamIndex(idx1);
133 }
134 engine.stream_ = rendererStream1;
135 auto ret = engine.AddRenderer(rendererStream1);
136 EXPECT_EQ(ret, SUCCESS);
137
138 std::shared_ptr<ProRendererStreamImpl> rendererStream2 = std::make_shared<ProRendererStreamImpl>(config, true);
139 if (rendererStream2) {
140 rendererStream2->SetStreamIndex(idx2);
141 }
142 ret = engine.AddRenderer(rendererStream2);
143 EXPECT_EQ(ret, ERROR_UNSUPPORTED);
144 }
145
146 /**
147 * @tc.name : Test DirectPlayBackEngine API
148 * @tc.type : FUNC
149 * @tc.number: DirectPlayBackEngine_004
150 * @tc.desc : Test DirectPlayBackEngine::RemoveRenderer().
151 */
152 HWTEST_F(DirectPlayBackEngineUnitTest, DirectPlayBackEngine_004, TestSize.Level2)
153 {
154 DirectPlayBackEngine engine;
155 engine.isStart_ = true;
156 uint32_t idx1 = 0;
157 uint32_t idx2 = 1;
158 AudioProcessConfig config;
159 std::shared_ptr<ProRendererStreamImpl> rendererStream1 = std::make_shared<ProRendererStreamImpl>(config, true);
160 if (rendererStream1) {
161 rendererStream1->SetStreamIndex(idx1);
162 }
163 engine.stream_ = nullptr;
164 engine.RemoveRenderer(rendererStream1);
165
166 engine.stream_ = rendererStream1;
167 engine.RemoveRenderer(rendererStream1);
168 EXPECT_EQ(engine.stream_, nullptr);
169
170 std::shared_ptr<ProRendererStreamImpl> rendererStream2 = std::make_shared<ProRendererStreamImpl>(config, true);
171 if (rendererStream2) {
172 rendererStream2->SetStreamIndex(idx2);
173 }
174 engine.stream_ = rendererStream1;
175 EXPECT_NE(engine.stream_->GetStreamIndex(), rendererStream2->GetStreamIndex());
176 engine.RemoveRenderer(rendererStream2);
177 }
178
179 /**
180 * @tc.name : Test DirectPlayBackEngine API
181 * @tc.type : FUNC
182 * @tc.number: DirectPlayBackEngine_005
183 * @tc.desc : Test DirectPlayBackEngine::MixStreams()
184 */
185 HWTEST_F(DirectPlayBackEngineUnitTest, DirectPlayBackEngine_005, TestSize.Level2)
186 {
187 auto enginePtr = std::make_shared<DirectPlayBackEngine>();
188 EXPECT_NE(enginePtr, nullptr);
189
190 AudioProcessConfig configRet;
191 enginePtr->stream_ = std::make_shared<ProRendererStreamImpl>(configRet, true);
192 EXPECT_NE(enginePtr->stream_, nullptr);
193 enginePtr->MixStreams();
194
195 enginePtr->stream_ = nullptr;
196 enginePtr->MixStreams();
197 }
198
199 /**
200 * @tc.name : Test DirectPlayBackEngine API
201 * @tc.type : FUNC
202 * @tc.number: DirectPlayBackEngine_006
203 * @tc.desc : Test DirectPlayBackEngine::MixStreams()
204 */
205 HWTEST_F(DirectPlayBackEngineUnitTest, DirectPlayBackEngine_006, TestSize.Level2)
206 {
207 auto enginePtr = std::make_shared<DirectPlayBackEngine>();
208 EXPECT_NE(enginePtr, nullptr);
209
210 AudioProcessConfig config;
211 enginePtr->stream_ = std::make_shared<ProRendererStreamImpl>(config, true);
212 EXPECT_NE(enginePtr->stream_, nullptr);
213 enginePtr->failedCount_.store(10);
214 enginePtr->MixStreams();
215
216 enginePtr->failedCount_.store(100);
217 enginePtr->MixStreams();
218 }
219
220 /**
221 * @tc.name : Test DirectPlayBackEngine API
222 * @tc.type : FUNC
223 * @tc.number: DirectPlayBackEngine_007
224 * @tc.desc : Test DirectPlayBackEngine::GetDirectFormatByteSize().
225 */
226 HWTEST_F(DirectPlayBackEngineUnitTest, DirectPlayBackEngine_007, TestSize.Level2)
227 {
228 DirectPlayBackEngine engine;
229 AudioSampleFormat format = SAMPLE_S16LE;
230 auto ret = engine.GetDirectFormatByteSize(format);
231 EXPECT_EQ(ret, sizeof(int16_t));
232
233 format = SAMPLE_S32LE;
234 ret = engine.GetDirectFormatByteSize(format);
235 EXPECT_EQ(ret, sizeof(int32_t));
236
237 format = SAMPLE_F32LE;
238 ret = engine.GetDirectFormatByteSize(format);
239 EXPECT_EQ(ret, sizeof(int32_t));
240
241 format = INVALID_WIDTH;
242 ret = engine.GetDirectFormatByteSize(format);
243 EXPECT_EQ(ret, sizeof(int32_t));
244 }
245
246 /**
247 * @tc.name : Test DirectPlayBackEngine API
248 * @tc.type : FUNC
249 * @tc.number: DirectPlayBackEngine_008
250 * @tc.desc : Test DirectPlayBackEngine::InitSink()
251 */
252 HWTEST_F(DirectPlayBackEngineUnitTest, DirectPlayBackEngine_008, TestSize.Level2)
253 {
254 auto enginePtr = std::make_shared<DirectPlayBackEngine>();
255 EXPECT_NE(enginePtr, nullptr);
256
257 AudioStreamInfo streamInfo;
258 enginePtr->isInit_ = false;
259 enginePtr->renderId_ = HdiAdapterManager::GetInstance().GetId(HDI_ID_BASE_RENDER, HDI_ID_TYPE_EAC3,
260 HDI_ID_INFO_DEFAULT, true);
261 EXPECT_NE(enginePtr->renderId_, HDI_INVALID_ID);
262
263 auto ret = enginePtr->InitSink(streamInfo);
264 EXPECT_NE(ret, SUCCESS);
265 }
266
267
268 /**
269 * @tc.name : Test DirectPlayBackEngine API
270 * @tc.type : FUNC
271 * @tc.number: DirectPlayBackEngine_009
272 * @tc.desc : Test DirectPlayBackEngine::InitSink()
273 */
274 HWTEST_F(DirectPlayBackEngineUnitTest, DirectPlayBackEngine_009, TestSize.Level2)
275 {
276 auto enginePtr = std::make_shared<DirectPlayBackEngine>();
277 EXPECT_NE(enginePtr, nullptr);
278
279 AudioStreamInfo streamInfo;
280 enginePtr->isInit_ = true;
281 enginePtr->renderId_ = HDI_INVALID_ID;
282
283 auto ret = enginePtr->InitSink(streamInfo);
284 EXPECT_NE(ret, SUCCESS);
285 }
286
287 /**
288 * @tc.name : Test DirectPlayBackEngine API
289 * @tc.type : FUNC
290 * @tc.number: DirectPlayBackEngine_010
291 * @tc.desc : Test DirectPlayBackEngine::InitSink()
292 */
293 HWTEST_F(DirectPlayBackEngineUnitTest, DirectPlayBackEngine_010, TestSize.Level2)
294 {
295 auto enginePtr = std::make_shared<DirectPlayBackEngine>();
296 EXPECT_NE(enginePtr, nullptr);
297
298 AudioStreamInfo streamInfo;
299 streamInfo.channels = AudioChannel::STEREO;
300 streamInfo.samplingRate = AudioSamplingRate::SAMPLE_RATE_48000;
301 streamInfo.format = SAMPLE_S32LE;
302 enginePtr->isInit_ = true;
303 enginePtr->renderId_ = HdiAdapterManager::GetInstance().GetId(HDI_ID_BASE_RENDER, HDI_ID_TYPE_EAC3,
304 HDI_ID_INFO_DEFAULT, true);
305 EXPECT_NE(enginePtr->renderId_, HDI_INVALID_ID);
306 auto ret = enginePtr->InitSink(streamInfo);
307 EXPECT_NE(ret, SUCCESS);
308
309 enginePtr->uChannel_ = AudioChannel::CHANNEL_UNKNOW;
310 ret = enginePtr->InitSink(streamInfo);
311 EXPECT_NE(ret, SUCCESS);
312
313 enginePtr->uChannel_ = AudioChannel::STEREO;
314 ret = enginePtr->InitSink(streamInfo);
315 EXPECT_NE(ret, SUCCESS);
316
317 enginePtr->format_ = SAMPLE_S16LE;
318 ret = enginePtr->InitSink(streamInfo);
319 EXPECT_NE(ret, SUCCESS);
320
321 enginePtr->format_ = SAMPLE_S32LE;
322 ret = enginePtr->InitSink(streamInfo);
323 EXPECT_NE(ret, SUCCESS);
324
325 enginePtr->uSampleRate_ = AudioSamplingRate::SAMPLE_RATE_32000;
326 ret = enginePtr->InitSink(streamInfo);
327 EXPECT_NE(ret, SUCCESS);
328
329 enginePtr->uSampleRate_ = AudioSamplingRate::SAMPLE_RATE_48000;
330 ret = enginePtr->InitSink(streamInfo);
331 EXPECT_EQ(ret, SUCCESS);
332 }
333
334 /**
335 * @tc.name : Test DirectPlayBackEngine API
336 * @tc.type : FUNC
337 * @tc.number: DirectPlayBackEngine_011
338 * @tc.desc : Test DirectPlayBackEngine::StopAudioSink()
339 */
340 HWTEST_F(DirectPlayBackEngineUnitTest, DirectPlayBackEngine_011, TestSize.Level2)
341 {
342 auto enginePtr = std::make_shared<DirectPlayBackEngine>();
343 ASSERT_TRUE(enginePtr != nullptr);
344
345 enginePtr->renderId_ = -1;
346 auto ret = enginePtr->StopAudioSink();
347 EXPECT_EQ(ret, SUCCESS);
348 }
349
350 /**
351 * @tc.name : Test DirectPlayBackEngine API
352 * @tc.type : FUNC
353 * @tc.number: DirectPlayBackEngine_012
354 * @tc.desc : Test DirectPlayBackEngine::StopAudioSink()
355 */
356 HWTEST_F(DirectPlayBackEngineUnitTest, DirectPlayBackEngine_012, TestSize.Level2)
357 {
358 auto enginePtr = std::make_shared<DirectPlayBackEngine>();
359 ASSERT_TRUE(enginePtr != nullptr);
360
361 enginePtr->renderId_ = HdiAdapterManager::GetInstance().GetId(HDI_ID_BASE_RENDER, HDI_ID_TYPE_EAC3,
362 HDI_ID_INFO_DEFAULT, true);
363 auto sink = HdiAdapterManager::GetInstance().GetRenderSink(enginePtr->renderId_, true);
364 ASSERT_TRUE(sink != nullptr);
365
366 auto ret = enginePtr->StopAudioSink();
367 EXPECT_EQ(ret, SUCCESS);
368 }
369
370 /**
371 * @tc.name : Test DirectPlayBackEngine API
372 * @tc.type : FUNC
373 * @tc.number: DirectPlayBackEngine_013
374 * @tc.desc : Test DirectPlayBackEngine::Start()
375 */
376 HWTEST_F(DirectPlayBackEngineUnitTest, DirectPlayBackEngine_013, TestSize.Level2)
377 {
378 auto enginePtr = std::make_shared<DirectPlayBackEngine>();
379 EXPECT_NE(enginePtr, nullptr);
380
381 enginePtr->renderId_ = HdiAdapterManager::GetInstance().GetId(HDI_ID_BASE_RENDER, HDI_ID_TYPE_EAC3,
382 HDI_ID_INFO_DEFAULT, true);
383 EXPECT_NE(enginePtr->renderId_, HDI_INVALID_ID);
384
385 enginePtr->isStart_ = true;
386 auto ret = enginePtr->Start();
387 EXPECT_EQ(ret, ERR_INVALID_HANDLE);
388
389 enginePtr->isStart_ = false;
390 ret = enginePtr->Start();
391 EXPECT_EQ(ret, ERR_INVALID_HANDLE);
392 }
393
394 /**
395 * @tc.name : Test DirectPlayBackEngine API
396 * @tc.type : FUNC
397 * @tc.number: DirectPlayBackEngine_014
398 * @tc.desc : Test DirectPlayBackEngine::Stop()
399 */
400 HWTEST_F(DirectPlayBackEngineUnitTest, DirectPlayBackEngine_014, TestSize.Level2)
401 {
402 auto enginePtr = std::make_shared<DirectPlayBackEngine>();
403 ASSERT_TRUE(enginePtr != nullptr);
404
405 enginePtr->isStart_ = true;
406 auto ret = enginePtr->Stop();
407 EXPECT_EQ(ret, SUCCESS);
408
409 enginePtr->isStart_ = false;
410 ret = enginePtr->Stop();
411 EXPECT_EQ(ret, SUCCESS);
412 }
413
414 /**
415 * @tc.name : Test DirectPlayBackEngine API
416 * @tc.type : FUNC
417 * @tc.number: DirectPlayBackEngine_015
418 * @tc.desc : Test DirectPlayBackEngine::Pause()
419 */
420 HWTEST_F(DirectPlayBackEngineUnitTest, DirectPlayBackEngine_015, TestSize.Level2)
421 {
422 auto enginePtr = std::make_shared<DirectPlayBackEngine>();
423 ASSERT_TRUE(enginePtr != nullptr);
424
425 enginePtr->isStart_ = true;
426 auto ret = enginePtr->Pause();
427 EXPECT_EQ(ret, SUCCESS);
428
429 enginePtr->isStart_ = false;
430 ret = enginePtr->Pause();
431 EXPECT_EQ(ret, SUCCESS);
432 }
433
434 /**
435 * @tc.name : Test DirectPlayBackEngine API
436 * @tc.type : FUNC
437 * @tc.number: DirectPlayBackEngine_016
438 * @tc.desc : Test DirectPlayBackEngine::DirectCallback()
439 */
440 HWTEST_F(DirectPlayBackEngineUnitTest, DirectPlayBackEngine_016, TestSize.Level2)
441 {
442 auto enginePtr = std::make_shared<DirectPlayBackEngine>();
443 ASSERT_TRUE(enginePtr != nullptr);
444 enginePtr->DirectCallback(CB_NONBLOCK_WRITE_COMPLETED);
445 enginePtr->DirectCallback(CB_DRAIN_COMPLETED);
446 enginePtr->DirectCallback(CB_FLUSH_COMPLETED);
447 enginePtr->DirectCallback(CB_RENDER_FULL);
448 enginePtr->DirectCallback(CB_ERROR_OCCUR);
449 }
450 } // namespace AudioStandard
451 } // namespace OHOS
452