1 /*
2 * Copyright (c) 2023-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 "audio_sink.h"
18 #include "audio_effect.h"
19 #include "filter/filter.h"
20 #include "common/log.h"
21 #include "sink/media_synchronous_sink.h"
22
23 namespace {
24 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_ONLY_PRERELEASE, LOG_DOMAIN_SYSTEM_PLAYER, "AudioSinkTest" };
25 constexpr int64_t WARNING_TIME_MS = 60;
26 }
27
28 using namespace testing::ext;
29
30 namespace OHOS {
31 namespace Media {
32 namespace Test {
33
34 class TestEventReceiver : public Pipeline::EventReceiver {
35 public:
TestEventReceiver()36 explicit TestEventReceiver()
37 {
38 MEDIA_LOG_I("TestEventReceiver ctor ");
39 }
40
OnEvent(const Event & event)41 void OnEvent(const Event &event)
42 {
43 MEDIA_LOG_I("TestEventReceiver OnEvent " PUBLIC_LOG_S, event.srcFilter.c_str());
44 }
45
46 private:
47 };
48
49 class TestAudioSinkMock : public AudioSinkPlugin {
50 public:
51
TestAudioSinkMock(std::string name)52 explicit TestAudioSinkMock(std::string name): AudioSinkPlugin(std::move(name)) {}
53
Start()54 Status Start() override
55 {
56 std::this_thread::sleep_for(std::chrono::milliseconds(WARNING_TIME_MS));
57 return Status::ERROR_UNKNOWN;
58 };
59
Stop()60 Status Stop() override
61 {
62 return Status::ERROR_UNKNOWN;
63 };
64
PauseTransitent()65 Status PauseTransitent() override
66 {
67 std::this_thread::sleep_for(std::chrono::milliseconds(WARNING_TIME_MS));
68 return Status::ERROR_UNKNOWN;
69 };
70
Pause()71 Status Pause() override
72 {
73 std::this_thread::sleep_for(std::chrono::milliseconds(WARNING_TIME_MS));
74 return Status::ERROR_UNKNOWN;
75 };
76
Resume()77 Status Resume() override
78 {
79 return Status::ERROR_UNKNOWN;
80 };
81
GetLatency(uint64_t & hstTime)82 Status GetLatency(uint64_t &hstTime) override
83 {
84 (void)hstTime;
85 return Status::ERROR_UNKNOWN;
86 };
87
SetAudioEffectMode(int32_t effectMode)88 Status SetAudioEffectMode(int32_t effectMode) override
89 {
90 (void)effectMode;
91 return Status::ERROR_UNKNOWN;
92 };
93
GetAudioEffectMode(int32_t & effectMode)94 Status GetAudioEffectMode(int32_t &effectMode) override
95 {
96 (void)effectMode;
97 return Status::ERROR_UNKNOWN;
98 };
99
GetPlayedOutDurationUs(int64_t nowUs)100 int64_t GetPlayedOutDurationUs(int64_t nowUs) override
101 {
102 (void)nowUs;
103 return 0;
104 }
GetMute(bool & mute)105 Status GetMute(bool& mute) override
106 {
107 (void)mute;
108 return Status::ERROR_UNKNOWN;
109 }
SetMute(bool mute)110 Status SetMute(bool mute) override
111 {
112 (void)mute;
113 return Status::ERROR_UNKNOWN;
114 }
115
GetVolume(float & volume)116 Status GetVolume(float& volume) override
117 {
118 (void)volume;
119 return Status::ERROR_UNKNOWN;
120 }
SetVolume(float volume)121 Status SetVolume(float volume) override
122 {
123 (void)volume;
124 return Status::ERROR_UNKNOWN;
125 }
SetVolumeMode(int32_t mode)126 Status SetVolumeMode(int32_t mode) override
127 {
128 (void)mode;
129 return Status::ERROR_UNKNOWN;
130 }
GetSpeed(float & speed)131 Status GetSpeed(float& speed) override
132 {
133 (void)speed;
134 return Status::ERROR_UNKNOWN;
135 }
SetSpeed(float speed)136 Status SetSpeed(float speed) override
137 {
138 (void)speed;
139 return Status::ERROR_UNKNOWN;
140 }
GetFrameSize(size_t & size)141 Status GetFrameSize(size_t& size) override
142 {
143 (void)size;
144 return Status::ERROR_UNKNOWN;
145 }
GetFrameCount(uint32_t & count)146 Status GetFrameCount(uint32_t& count) override
147 {
148 (void)count;
149 return Status::ERROR_UNKNOWN;
150 }
Write(const std::shared_ptr<AVBuffer> & input)151 Status Write(const std::shared_ptr<AVBuffer>& input) override
152 {
153 (void)input;
154 return Status::ERROR_UNKNOWN;
155 }
Flush()156 Status Flush() override
157 {
158 return Status::ERROR_UNKNOWN;
159 }
Drain()160 Status Drain() override
161 {
162 return Status::ERROR_UNKNOWN;
163 }
GetFramePosition(int32_t & framePosition)164 Status GetFramePosition(int32_t &framePosition) override
165 {
166 (void)framePosition;
167 return Status::ERROR_UNKNOWN;
168 }
SetEventReceiver(const std::shared_ptr<Pipeline::EventReceiver> & receiver)169 void SetEventReceiver(const std::shared_ptr<Pipeline::EventReceiver>& receiver) override
170 {
171 (void)receiver;
172 }
SetVolumeWithRamp(float targetVolume,int32_t duration)173 int32_t SetVolumeWithRamp(float targetVolume, int32_t duration) override
174 {
175 (void)targetVolume;
176 (void)duration;
177 return 0;
178 }
SetMuted(bool isMuted)179 Status SetMuted(bool isMuted) override
180 {
181 return Status::OK;
182 }
SetRequestDataCallback(const std::shared_ptr<AudioSinkDataCallback> & callback)183 Status SetRequestDataCallback(const std::shared_ptr<AudioSinkDataCallback> &callback) override
184 {
185 (void)callback;
186 return Status::OK;
187 }
GetAudioPosition(timespec & time,uint32_t & framePosition)188 bool GetAudioPosition(timespec &time, uint32_t &framePosition) override
189 {
190 (void)time;
191 (void)framePosition;
192 return true;
193 }
GetBufferDesc(AudioStandard::BufferDesc & bufDesc)194 Status GetBufferDesc(AudioStandard::BufferDesc &bufDesc) override
195 {
196 (void)bufDesc;
197 return Status::OK;
198 }
EnqueueBufferDesc(const AudioStandard::BufferDesc & bufDesc)199 Status EnqueueBufferDesc(const AudioStandard::BufferDesc &bufDesc) override
200 {
201 (void)bufDesc;
202 return Status::OK;
203 }
IsFormatSupported(const std::shared_ptr<Meta> & meta)204 bool IsFormatSupported(const std::shared_ptr<Meta> &meta)
205 {
206 (void)meta;
207 return true;
208 }
SetAudioHapticsSyncId(int32_t syncId)209 Status SetAudioHapticsSyncId(int32_t syncId) override
210 {
211 (void)syncId;
212 return Status::OK;
213 }
214 };
215
AudioSinkCreate()216 std::shared_ptr<AudioSink> AudioSinkCreate()
217 {
218 auto audioSink = std::make_shared<AudioSink>();
219 std::shared_ptr<Pipeline::EventReceiver> testEventReceiver = std::make_shared<TestEventReceiver>();
220 auto meta = std::make_shared<Meta>();
221 auto initStatus = audioSink->Init(meta, testEventReceiver);
222 if (initStatus == Status::OK) {
223 return audioSink;
224 } else {
225 return nullptr;
226 }
227 }
228
229 HWTEST(TestAudioSink, find_audio_sink_process, TestSize.Level1)
230 {
231 std::shared_ptr<AudioSink> audioSink = AudioSinkCreate();
232 ASSERT_TRUE(audioSink != nullptr);
233 auto preStatus = audioSink->Prepare();
234 ASSERT_TRUE(preStatus == Status::OK);
235 auto startStatus = audioSink->Start();
236 ASSERT_TRUE(startStatus == Status::OK);
237 auto pauseStatus = audioSink->Pause();
238 ASSERT_TRUE(pauseStatus == Status::OK);
239 auto stopStatus = audioSink->Stop();
240 ASSERT_TRUE(stopStatus == Status::OK);
241 auto flushStatus = audioSink->Flush();
242 ASSERT_TRUE(flushStatus == Status::OK);
243 auto resumeStatus = audioSink->Resume();
244 ASSERT_TRUE(resumeStatus == Status::OK);
245 auto freeStatus = audioSink->Release();
246 ASSERT_TRUE(freeStatus == Status::OK);
247 }
248
249 HWTEST(TestAudioSink, find_audio_sink_set_volume, TestSize.Level1)
250 {
251 std::shared_ptr<AudioSink> audioSink = AudioSinkCreate();
252 ASSERT_TRUE(audioSink != nullptr);
253 float volume = 0.5f;
254 auto setVolumeStatus = audioSink->SetVolume(volume);
255 ASSERT_TRUE(setVolumeStatus == Status::OK);
256
257 // SetVolumeWithRamp
258 float targetVolume = 0;
259 int32_t duration = 0;
260 auto setVolumeWithRampStatus = audioSink->SetVolumeWithRamp(targetVolume, duration);
261 ASSERT_TRUE(setVolumeWithRampStatus == 0);
262 }
263
264 HWTEST(TestAudioSink, find_audio_sink_set_volume002, TestSize.Level1)
265 {
266 std::shared_ptr<AudioSink> audioSink = AudioSinkCreate();
267 ASSERT_TRUE(audioSink != nullptr);
268 float volume = -0.5f;
269 auto setVolumeStatus = audioSink->SetVolume(volume);
270 ASSERT_TRUE(setVolumeStatus != Status::OK);
271
272 // SetVolumeWithRamp
273 float targetVolume = 0;
274 int32_t duration = 0;
275 auto setVolumeWithRampStatus = audioSink->SetVolumeWithRamp(targetVolume, duration);
276 ASSERT_TRUE(setVolumeWithRampStatus == 0);
277 }
278
279 HWTEST(TestAudioSink, find_audio_sink_set_volume003, TestSize.Level1)
280 {
281 std::shared_ptr<AudioSink> audioSink = AudioSinkCreate();
282 ASSERT_TRUE(audioSink != nullptr);
283 audioSink->plugin_ = audioSink->CreatePlugin();
284 float volume = 0.5f;
285 auto setVolumeStatus = audioSink->SetVolume(volume);
286 ASSERT_TRUE(setVolumeStatus != Status::OK);
287
288 // SetVolumeWithRamp
289 float targetVolume = 0;
290 int32_t duration = 0;
291 auto setVolumeWithRampStatus = audioSink->SetVolumeWithRamp(targetVolume, duration);
292 ASSERT_TRUE(setVolumeWithRampStatus == 0);
293 }
294
295 HWTEST(TestAudioSink, find_audio_sink_set_volume004, TestSize.Level1)
296 {
297 std::shared_ptr<AudioSink> audioSink = AudioSinkCreate();
298 ASSERT_TRUE(audioSink != nullptr);
299 audioSink->plugin_ = audioSink->CreatePlugin();
300 float volume = -0.5f;
301 auto setVolumeStatus = audioSink->SetVolume(volume);
302 ASSERT_TRUE(setVolumeStatus != Status::OK);
303
304 // SetVolumeWithRamp
305 float targetVolume = 0;
306 int32_t duration = 0;
307 auto setVolumeWithRampStatus = audioSink->SetVolumeWithRamp(targetVolume, duration);
308 ASSERT_TRUE(setVolumeWithRampStatus == 0);
309 }
310
311 HWTEST(TestAudioSink, find_audio_sink_set_volume005, TestSize.Level1)
312 {
313 std::shared_ptr<AudioSink> audioSink = AudioSinkCreate();
314 ASSERT_TRUE(audioSink != nullptr);
315 audioSink->plugin_ = nullptr;
316 float volume = -0.5f;
317 auto setVolumeStatus = audioSink->SetVolume(volume);
318 ASSERT_TRUE(setVolumeStatus == Status::ERROR_NULL_POINTER);
319 }
320
321 HWTEST(TestAudioSink, find_audio_sink_set_sync_center, TestSize.Level1)
322 {
323 std::shared_ptr<AudioSink> audioSink = AudioSinkCreate();
324 ASSERT_TRUE(audioSink != nullptr);
325 float volume = 0.5f;
326 auto setVolumeStatus = audioSink->SetVolume(volume);
327 ASSERT_TRUE(setVolumeStatus == Status::OK);
328
329 // SetVolumeWithRamp
330 float targetVolume = 0;
331 int32_t duration = 0;
332 auto setVolumeWithRampStatus = audioSink->SetVolumeWithRamp(targetVolume, duration);
333 ASSERT_TRUE(setVolumeWithRampStatus == 0);
334
335 // SetSyncCenter
336 auto syncCenter = std::make_shared<Pipeline::MediaSyncManager>();
337 audioSink->SetSyncCenter(syncCenter);
338 }
339
340 HWTEST(TestAudioSink, find_audio_sink_set_speed, TestSize.Level1)
341 {
342 std::shared_ptr<AudioSink> audioSink = AudioSinkCreate();
343 ASSERT_TRUE(audioSink != nullptr);
344 float speed = 1.0f;
345 auto setVolumeStatus = audioSink->SetSpeed(speed);
346 ASSERT_TRUE(setVolumeStatus == Status::OK);
347 }
348
349 HWTEST(TestAudioSink, find_audio_sink_set_speed002, TestSize.Level1)
350 {
351 std::shared_ptr<AudioSink> audioSink = AudioSinkCreate();
352 ASSERT_TRUE(audioSink != nullptr);
353 float speed = -1.0f;
354 auto setVolumeStatus = audioSink->SetSpeed(speed);
355 ASSERT_TRUE(setVolumeStatus != Status::OK);
356 }
357
358 HWTEST(TestAudioSink, find_audio_sink_set_speed003, TestSize.Level1)
359 {
360 std::shared_ptr<AudioSink> audioSink = AudioSinkCreate();
361 ASSERT_TRUE(audioSink != nullptr);
362 audioSink->plugin_ = nullptr;
363 float speed = 1.0f;
364 auto setVolumeStatus = audioSink->SetSpeed(speed);
365 ASSERT_TRUE(setVolumeStatus != Status::OK);
366 }
367
368 HWTEST(TestAudioSink, find_audio_sink_set_speed004, TestSize.Level1)
369 {
370 std::shared_ptr<AudioSink> audioSink = AudioSinkCreate();
371 ASSERT_TRUE(audioSink != nullptr);
372 audioSink->plugin_ = nullptr;
373 float speed = -1.0f;
374 auto setVolumeStatus = audioSink->SetSpeed(speed);
375 ASSERT_TRUE(setVolumeStatus != Status::OK);
376 }
377
378 HWTEST(TestAudioSink, find_audio_sink_audio_effect, TestSize.Level1)
379 {
380 std::shared_ptr<AudioSink> audioSink = AudioSinkCreate();
381 ASSERT_TRUE(audioSink != nullptr);
382 auto setEffectStatus = audioSink->SetAudioEffectMode(AudioStandard::EFFECT_NONE);
383 ASSERT_TRUE(setEffectStatus == Status::OK);
384 int32_t audioEffectMode;
385 auto getEffectStatus = audioSink->GetAudioEffectMode(audioEffectMode);
386 ASSERT_TRUE(getEffectStatus == Status::OK);
387 }
388
389 HWTEST(TestAudioSink, find_audio_sink_audio_effect002, TestSize.Level1)
390 {
391 std::shared_ptr<AudioSink> audioSink = AudioSinkCreate();
392 ASSERT_TRUE(audioSink != nullptr);
393 audioSink->plugin_ = nullptr;
394 auto setEffectStatus = audioSink->SetAudioEffectMode(AudioStandard::EFFECT_NONE);
395 ASSERT_TRUE(setEffectStatus != Status::OK);
396 int32_t audioEffectMode;
397 auto getEffectStatus = audioSink->GetAudioEffectMode(audioEffectMode);
398 ASSERT_TRUE(getEffectStatus != Status::OK);
399 }
400
401 HWTEST(TestAudioSink, find_audio_sink_audio_reset_sync_info, TestSize.Level1)
402 {
403 std::shared_ptr<AudioSink> audioSink = AudioSinkCreate();
404 ASSERT_TRUE(audioSink != nullptr);
405 audioSink->ResetSyncInfo();
406 SUCCEED();
407 }
408
409 HWTEST(TestAudioSink, find_audio_sink_audio_change_track, TestSize.Level1)
410 {
411 std::shared_ptr<AudioSink> audioSink = AudioSinkCreate();
412 ASSERT_TRUE(audioSink != nullptr);
413 std::shared_ptr<Meta> meta = std::make_shared<Meta>();
414 meta->SetData(Tag::APP_UID, 0);
415 std::shared_ptr<Pipeline::EventReceiver> testEventReceiver = std::make_shared<TestEventReceiver>();
416 Status res = audioSink->ChangeTrack(meta, testEventReceiver);
417 ASSERT_EQ(res, Status::OK);
418 }
419
420 HWTEST(TestAudioSink, audio_sink_set_get_parameter, TestSize.Level1)
421 {
422 std::shared_ptr<AudioSink> audioSink = AudioSinkCreate();
423 ASSERT_TRUE(audioSink != nullptr);
424
425 // SetParameter before ChangeTrack
426 std::shared_ptr<Meta> meta = std::make_shared<Meta>();
427 auto setParameterStatus = audioSink->SetParameter(meta);
428 ASSERT_EQ(setParameterStatus, Status::OK);
429
430 // SetParameter after ChangeTrack
431 meta->SetData(Tag::APP_UID, 9999);
432 std::shared_ptr<Pipeline::EventReceiver> testEventReceiver = std::make_shared<TestEventReceiver>();
433 auto changeTrackStatus = audioSink->ChangeTrack(meta, testEventReceiver);
434 ASSERT_EQ(changeTrackStatus, Status::OK);
435 auto setParamterStatus = audioSink->SetParameter(meta);
436 ASSERT_EQ(setParamterStatus, Status::OK);
437
438 // GetParameter
439 std::shared_ptr<Meta> newMeta = std::make_shared<Meta>();
440 audioSink->GetParameter(newMeta);
441 int32_t appUid = 0;
442 (void)newMeta->Get<Tag::APP_UID>(appUid);
443 ASSERT_FALSE(appUid == 9999);
444 }
445
446 HWTEST(TestAudioSink, audio_sink_write, TestSize.Level1)
447 {
448 std::shared_ptr<AudioSink> audioSink = AudioSinkCreate();
449 ASSERT_TRUE(audioSink != nullptr);
450
451 // SetSyncCenter
452 auto syncCenter = std::make_shared<Pipeline::MediaSyncManager>();
453 audioSink->SetSyncCenter(syncCenter);
454
455 // DoSyncWrite
456 AVBufferConfig config;
457 config.size = 4;
458 config.memoryType = MemoryType::SHARED_MEMORY;
459 const std::shared_ptr<AVBuffer> buffer = AVBuffer::CreateAVBuffer(config);
460 buffer->flag_ = 0; // not eos
461 buffer->pts_ = -1;
462 auto doSyncWriteRes = audioSink->DoSyncWrite(buffer);
463 ASSERT_TRUE(doSyncWriteRes == 0);
464 buffer->pts_ = 1;
465 doSyncWriteRes = audioSink->DoSyncWrite(buffer);
466 ASSERT_TRUE(doSyncWriteRes == 0);
467 }
468
469 HWTEST(TestAudioSink, audio_sink_init, TestSize.Level1) {
470 auto audioSink = AudioSinkCreate();
471 ASSERT_TRUE(audioSink != nullptr);
472
473 auto meta = std::make_shared<Meta>();
474 auto testEventReceiver = std::make_shared<TestEventReceiver>();
475
476 // Set some data in meta for testing
477 meta->SetData(Tag::APP_PID, 12345);
478 meta->SetData(Tag::APP_UID, 67890);
479 meta->SetData(Tag::AUDIO_SAMPLE_RATE, 44100);
480 meta->SetData(Tag::AUDIO_SAMPLE_PER_FRAME, 1024);
481
482 // Call Init method
483 auto initStatus = audioSink->Init(meta, testEventReceiver);
484 ASSERT_EQ(initStatus, Status::OK) << "Init should succeed with valid parameters";
485
486 // Verify the internal state of AudioSink
487 ASSERT_TRUE(audioSink->IsInitialized()) << "AudioSink should be initialized";
488 ASSERT_TRUE(audioSink->HasPlugin()) << "Plugin should be initialized";
489 }
490
491 HWTEST(TestAudioSink, audio_sink_init002, TestSize.Level1) {
492 auto audioSink = AudioSinkCreate();
493 ASSERT_TRUE(audioSink != nullptr);
494
495 auto meta = std::make_shared<Meta>();
496 auto testEventReceiver = std::make_shared<TestEventReceiver>();
497
498 // Set some data in meta for testing
499 meta->SetData(Tag::APP_PID, 12345);
500 meta->SetData(Tag::APP_UID, 67890);
501 meta->SetData(Tag::AUDIO_SAMPLE_RATE, 0);
502 meta->SetData(Tag::AUDIO_SAMPLE_PER_FRAME, 1024);
503
504 // Call Init method
505 auto initStatus = audioSink->Init(meta, testEventReceiver);
506 ASSERT_EQ(initStatus, Status::OK) << "Init should succeed with valid parameters";
507
508 // Verify the internal state of AudioSink
509 ASSERT_TRUE(audioSink->IsInitialized()) << "AudioSink should be initialized";
510 ASSERT_TRUE(audioSink->HasPlugin()) << "Plugin should be initialized";
511 }
512
513 HWTEST(TestAudioSink, audio_sink_init003, TestSize.Level1) {
514 auto audioSink = AudioSinkCreate();
515 ASSERT_TRUE(audioSink != nullptr);
516
517 auto meta = std::make_shared<Meta>();
518 auto testEventReceiver = std::make_shared<TestEventReceiver>();
519
520 // Set some data in meta for testing
521 meta->SetData(Tag::APP_PID, 12345);
522 meta->SetData(Tag::APP_UID, 67890);
523 meta->SetData(Tag::AUDIO_SAMPLE_RATE, 44100);
524 meta->SetData(Tag::AUDIO_SAMPLE_PER_FRAME, 0);
525
526 // Call Init method
527 auto initStatus = audioSink->Init(meta, testEventReceiver);
528 ASSERT_EQ(initStatus, Status::OK) << "Init should succeed with valid parameters";
529
530 // Verify the internal state of AudioSink
531 ASSERT_TRUE(audioSink->IsInitialized()) << "AudioSink should be initialized";
532 ASSERT_TRUE(audioSink->HasPlugin()) << "Plugin should be initialized";
533 }
534
535 HWTEST(TestAudioSink, audio_sink_init004, TestSize.Level1) {
536 auto audioSink = AudioSinkCreate();
537 ASSERT_TRUE(audioSink != nullptr);
538
539 auto meta = std::make_shared<Meta>();
540 auto testEventReceiver = std::make_shared<TestEventReceiver>();
541
542 // Set some data in meta for testing
543 meta->SetData(Tag::APP_PID, 12345);
544 meta->SetData(Tag::APP_UID, 67890);
545 meta->SetData(Tag::AUDIO_SAMPLE_RATE, 0);
546 meta->SetData(Tag::AUDIO_SAMPLE_PER_FRAME, 0);
547
548 // Call Init method
549 auto initStatus = audioSink->Init(meta, testEventReceiver);
550 ASSERT_EQ(initStatus, Status::OK) << "Init should succeed with valid parameters";
551
552 // Verify the internal state of AudioSink
553 ASSERT_TRUE(audioSink->IsInitialized()) << "AudioSink should be initialized";
554 ASSERT_TRUE(audioSink->HasPlugin()) << "Plugin should be initialized";
555 }
556
557 HWTEST(TestAudioSink, audio_sink_init005, TestSize.Level1) {
558 auto audioSink = AudioSinkCreate();
559 ASSERT_TRUE(audioSink != nullptr);
560
561 auto meta = std::make_shared<Meta>();
562 auto testEventReceiver = std::make_shared<TestEventReceiver>();
563
564 // Set some data in meta for testing
565 meta->SetData(Tag::APP_PID, 12345);
566 meta->SetData(Tag::APP_UID, 67890);
567 meta->SetData(Tag::AUDIO_SAMPLE_RATE, 44100);
568 meta->SetData(Tag::AUDIO_SAMPLE_PER_FRAME, 1024);
569 meta->SetData(Tag::MEDIA_START_TIME, 1);
570 meta->SetData(Tag::MIME_TYPE, "audio/x-ape");
571
572 // Call Init method
573 auto initStatus = audioSink->Init(meta, testEventReceiver);
574 ASSERT_EQ(initStatus, Status::OK) << "Init should succeed with valid parameters";
575
576 // Verify the internal state of AudioSink
577 ASSERT_TRUE(audioSink->IsInitialized()) << "AudioSink should be initialized";
578 ASSERT_TRUE(audioSink->HasPlugin()) << "Plugin should be initialized";
579 }
580
581 HWTEST(TestAudioSink, audio_sink_init006, TestSize.Level1) {
582 auto audioSink = AudioSinkCreate();
583 ASSERT_TRUE(audioSink != nullptr);
584
585 auto meta = std::make_shared<Meta>();
586 auto testEventReceiver = std::make_shared<TestEventReceiver>();
587
588 // Set some data in meta for testing
589 meta->SetData(Tag::APP_PID, 12345);
590 meta->SetData(Tag::APP_UID, 67890);
591 meta->SetData(Tag::AUDIO_SAMPLE_RATE, 44100);
592 meta->SetData(Tag::AUDIO_SAMPLE_PER_FRAME, 1024);
593 meta->SetData(Tag::MIME_TYPE, "audio/mpeg");
594
595 // Call Init method
596 auto initStatus = audioSink->Init(meta, testEventReceiver);
597 ASSERT_EQ(initStatus, Status::OK) << "Init should succeed with valid parameters";
598
599 // Verify the internal state of AudioSink
600 ASSERT_TRUE(audioSink->IsInitialized()) << "AudioSink should be initialized";
601 ASSERT_TRUE(audioSink->HasPlugin()) << "Plugin should be initialized";
602 }
603
604 HWTEST(TestAudioSink, audio_sink_init007, TestSize.Level1) {
605 auto audioSink = AudioSinkCreate();
606 ASSERT_TRUE(audioSink != nullptr);
607 auto meta = std::make_shared<Meta>();
608 auto testEventReceiver = std::make_shared<TestEventReceiver>();
609 audioSink->plugin_ = audioSink->CreatePlugin();
610 meta->SetData(Tag::MEDIA_START_TIME, 0);
611 ASSERT_NE(nullptr, audioSink->plugin_);
612 audioSink->samplePerFrame_ = 1;
613 audioSink->sampleRate_ = -1;
614 // Call Init method
615 auto initStatus = audioSink->Init(meta, testEventReceiver);
616 ASSERT_EQ(initStatus, Status::OK) << "Init should succeed with valid parameters";
617 // Verify the internal state of AudioSink
618 ASSERT_TRUE(audioSink->IsInitialized()) << "AudioSink should be initialized";
619 EXPECT_EQ(audioSink->playingBufferDurationUs_, 0);
620 ASSERT_TRUE(audioSink->HasPlugin()) << "Plugin should be initialized";
621 }
622
623 HWTEST(TestAudioSink, audio_sink_GetBufferQueueProducer, TestSize.Level1) {
624 auto audioSink = AudioSinkCreate();
625 ASSERT_TRUE(audioSink != nullptr);
626
627 auto meta = std::make_shared<Meta>();
628 auto testEventReceiver = std::make_shared<TestEventReceiver>();
629
630 // Set some data in meta for testing
631 meta->SetData(Tag::APP_PID, 12345);
632 meta->SetData(Tag::APP_UID, 67890);
633 meta->SetData(Tag::AUDIO_SAMPLE_RATE, 44100);
634 meta->SetData(Tag::AUDIO_SAMPLE_PER_FRAME, 1024);
635
636 // Call Init method
637 auto initStatus = audioSink->Init(meta, testEventReceiver);
638 ASSERT_EQ(initStatus, Status::OK) << "Init should succeed with valid parameters";
639
640 // Get Buffer Queue Producer
641 ASSERT_EQ(audioSink->GetBufferQueueProducer(), nullptr);
642
643 // Prepare AudioSink
644 auto prepareStatus = audioSink->Prepare();
645 ASSERT_EQ(prepareStatus, Status::OK) << "Prepare should succeed";
646
647 // Get Buffer Queue Producer
648 auto producer = audioSink->GetBufferQueueProducer();
649 ASSERT_TRUE(producer != nullptr) << "GetBufferQueueProducer should return a valid producer";
650 }
651
652 HWTEST(TestAudioSink, audio_sink_GetBufferQueueConsumer, TestSize.Level1) {
653
654 auto audioSink = AudioSinkCreate();
655 ASSERT_TRUE(audioSink != nullptr);
656
657 ASSERT_EQ(audioSink->GetBufferQueueConsumer(), nullptr);
658
659 auto prepareStatus = audioSink->Prepare();
660 ASSERT_EQ(prepareStatus, Status::OK) << "Prepare should succeed";
661
662 auto consumer = audioSink->GetBufferQueueConsumer();
663 ASSERT_TRUE(consumer != nullptr) << "GetBufferQueueConsumer should return a valid consumer";
664 }
665
666 HWTEST(TestAudioSink, audio_sink_TestSetParameter, TestSize.Level1) {
667 auto audioSink = AudioSinkCreate();
668 ASSERT_TRUE(audioSink != nullptr);
669
670 auto meta = std::make_shared<Meta>();
671
672 meta->SetData(Tag::APP_PID, 12345);
673 meta->SetData(Tag::APP_UID, 67890);
674 meta->SetData(Tag::AUDIO_SAMPLE_RATE, 44100);
675
676 auto setParameterStatus = audioSink->SetParameter(meta);
677 ASSERT_EQ(setParameterStatus, Status::OK) << "SetParameter should succeed";
678 audioSink->plugin_ = nullptr;
679 ASSERT_EQ(audioSink->SetParameter(nullptr), Status::ERROR_NULL_POINTER);
680 }
681
682 HWTEST(TestAudioSink, audio_sink_TestSetParameter02, TestSize.Level1) {
683 auto audioSink = AudioSinkCreate();
684 ASSERT_TRUE(audioSink != nullptr);
685
686 // std::shared_ptr<Meta> meta = nullptr;
687 auto meta = std::make_shared<Meta>();
688 audioSink->plugin_ = nullptr;
689 auto setParameterStatus = audioSink->SetParameter(meta);
690 // ASSERT_EQ(setParameterStatus, Status::OK) << "SetParameter should succeed";
691 ASSERT_TRUE(setParameterStatus != Status::OK);
692 }
693
694 HWTEST(TestAudioSink, audio_sink_TestPrepare, TestSize.Level1) {
695 auto audioSink = AudioSinkCreate();
696 ASSERT_TRUE(audioSink != nullptr);
697
698 auto status = audioSink->Prepare();
699 ASSERT_EQ(status, Status::OK) << "Prepare should return OK";
700 ASSERT_EQ(Status::ERROR_INVALID_OPERATION, audioSink->Prepare());
701 }
702
703 HWTEST(TestAudioSink, audio_sink_TestStart, TestSize.Level1) {
704 auto audioSink = AudioSinkCreate();
705 ASSERT_TRUE(audioSink != nullptr);
706
707 auto prepareStatus = audioSink->Prepare();
708 ASSERT_EQ(prepareStatus, Status::OK) << "Prepare should return OK";
709
710 auto startStatus = audioSink->Start();
711 ASSERT_EQ(startStatus, Status::OK) << "Start should return OK";
712
713 std::shared_ptr<TestAudioSinkMock> plugin = std::make_shared<TestAudioSinkMock>("test");
714 audioSink->plugin_ = plugin;
715 ASSERT_EQ(Status::ERROR_UNKNOWN, audioSink->Start());
716 }
717
718 HWTEST(TestAudioSink, audio_sink_TestStop, TestSize.Level1)
719 {
720 auto audioSink = AudioSinkCreate();
721 ASSERT_TRUE(audioSink != nullptr);
722
723 auto prepareStatus = audioSink->Prepare();
724 ASSERT_EQ(prepareStatus, Status::OK) << "Prepare should return OK";
725 auto startStatus = audioSink->Start();
726 ASSERT_EQ(startStatus, Status::OK) << "Start should return OK";
727
728 auto stopStatus = audioSink->Stop();
729 ASSERT_EQ(stopStatus, Status::OK) << "Stop should return OK";
730
731 audioSink->eosInterruptType_ = AudioSink::EosInterruptState::INITIAL;
732 ASSERT_EQ(Status::OK, audioSink->Stop());
733
734 std::shared_ptr<TestAudioSinkMock> plugin = std::make_shared<TestAudioSinkMock>("test");
735 audioSink->plugin_ = plugin;
736 ASSERT_EQ(Status::ERROR_UNKNOWN, audioSink->Stop());
737 }
738
739 HWTEST(TestAudioSink, audio_sink_TestPause, TestSize.Level1)
740 {
741 auto audioSink = AudioSinkCreate();
742 ASSERT_TRUE(audioSink != nullptr);
743
744 auto prepareStatus = audioSink->Prepare();
745 ASSERT_EQ(prepareStatus, Status::OK) << "Prepare should return OK";
746 auto startStatus = audioSink->Start();
747 ASSERT_EQ(startStatus, Status::OK) << "Start should return OK";
748
749 auto pauseStatus = audioSink->Pause();
750 ASSERT_EQ(pauseStatus, Status::OK) << "Pause should return OK";
751
752 audioSink->eosInterruptType_ = AudioSink::EosInterruptState::INITIAL;
753 ASSERT_EQ(audioSink->Pause(), Status::OK);
754
755 audioSink->eosInterruptType_ = AudioSink::EosInterruptState::STOP;
756 ASSERT_EQ(audioSink->Pause(), Status::OK);
757
758 audioSink->isTransitent_ = true;
759 audioSink->isEos_ = false;
760
761 std::shared_ptr<TestAudioSinkMock> plugin = std::make_shared<TestAudioSinkMock>("test");
762 audioSink->plugin_ = plugin;
763 ASSERT_EQ(Status::ERROR_UNKNOWN, audioSink->Pause());
764 }
765
766 HWTEST(TestAudioSink, audio_sink_TestResume001, TestSize.Level1)
767 {
768 auto audioSink = AudioSinkCreate();
769 ASSERT_TRUE(audioSink != nullptr);
770
771 auto prepareStatus = audioSink->Prepare();
772 ASSERT_EQ(prepareStatus, Status::OK) << "Prepare should return OK";
773 auto startStatus = audioSink->Start();
774 ASSERT_EQ(startStatus, Status::OK) << "Start should return OK";
775 auto pauseStatus = audioSink->Pause();
776 ASSERT_EQ(pauseStatus, Status::OK) << "Pause should return OK";
777
778 auto resumeStatus = audioSink->Resume();
779 ASSERT_EQ(resumeStatus, Status::OK) << "Resume should return OK";
780
781 audioSink->eosInterruptType_ = AudioSink::EosInterruptState::PAUSE;
782 audioSink->eosDraining_ = false;
783 audioSink->eosTask_ = nullptr;
784 ASSERT_EQ(Status::ERROR_UNKNOWN, audioSink->Resume());
785
786 std::shared_ptr<TestAudioSinkMock> plugin = std::make_shared<TestAudioSinkMock>("test");
787 audioSink->plugin_ = plugin;
788 ASSERT_EQ(Status::ERROR_UNKNOWN, audioSink->Resume());
789 }
790
791 HWTEST(TestAudioSink, audio_sink_TestResume002, TestSize.Level1)
792 {
793 auto audioSink = AudioSinkCreate();
794 ASSERT_TRUE(audioSink != nullptr);
795 std::shared_ptr<TestAudioSinkMock> plugin = std::make_shared<TestAudioSinkMock>("test");
796 audioSink->plugin_ = plugin;
797 std::atomic<AudioSink::EosInterruptState> eosInterruptType_ = std::atomic<AudioSink::EosInterruptState>();
798 eosInterruptType_ = AudioSink::EosInterruptState::PAUSE;
799 audioSink->eosDraining_ = false;
800 audioSink->eosTask_= std::unique_ptr<Task>();
801 auto resumeStatus = audioSink->Resume();
802 ASSERT_EQ(resumeStatus, Status::ERROR_UNKNOWN);
803 }
804
805 HWTEST(TestAudioSink, audio_sink_SetVolume, TestSize.Level1)
806 {
807 auto audioSink = AudioSinkCreate();
808 ASSERT_TRUE(audioSink != nullptr);
809 ASSERT_EQ(Status::ERROR_INVALID_PARAMETER, audioSink->SetVolume(-1));
810 audioSink->plugin_ = nullptr;
811 ASSERT_EQ(Status::ERROR_NULL_POINTER, audioSink->SetVolume(0));
812 }
813
814 HWTEST(TestAudioSink, audio_sink_TestFlush, TestSize.Level1)
815 {
816 auto audioSink = AudioSinkCreate();
817 ASSERT_TRUE(audioSink != nullptr);
818
819 auto prepareStatus = audioSink->Prepare();
820 ASSERT_EQ(prepareStatus, Status::OK) << "Prepare should return OK";
821 auto startStatus = audioSink->Start();
822 ASSERT_EQ(startStatus, Status::OK) << "Start should return OK";
823
824 auto flushStatus = audioSink->Flush();
825 ASSERT_EQ(flushStatus, Status::OK) << "Flush should return OK";
826 }
827
828 HWTEST(TestAudioSink, audio_sink_HandleEosInner, TestSize.Level1)
829 {
830 auto audioSink = AudioSinkCreate();
831 ASSERT_TRUE(audioSink != nullptr);
832 audioSink->eosInterruptType_ = AudioSink::EosInterruptState::INITIAL;
833 audioSink->HandleEosInner(true);
834 EXPECT_EQ(false, audioSink->eosDraining_);
835 EXPECT_EQ(audioSink->eosInterruptType_, AudioSink::EosInterruptState::NONE);
836
837 audioSink->eosInterruptType_ = AudioSink::EosInterruptState::RESUME;
838 audioSink->HandleEosInner(true);
839 EXPECT_EQ(false, audioSink->eosDraining_);
840 EXPECT_EQ(audioSink->eosInterruptType_, AudioSink::EosInterruptState::NONE);
841
842 audioSink->eosInterruptType_ = AudioSink::EosInterruptState::STOP;
843 audioSink->HandleEosInner(true);
844 EXPECT_EQ(false, audioSink->eosDraining_);
845
846 audioSink->eosInterruptType_ = AudioSink::EosInterruptState::INITIAL;
847 audioSink->eosTask_ = std::make_unique<Task>("OS_EOSa", "test", TaskType::AUDIO, TaskPriority::HIGH, false);
848 audioSink->HandleEosInner(false);
849 EXPECT_EQ(false, audioSink->eosDraining_);
850
851 audioSink->eosInterruptType_ = AudioSink::EosInterruptState::INITIAL;
852 audioSink->eosTask_ = nullptr;
853 audioSink->HandleEosInner(false);
854 EXPECT_EQ(false, audioSink->eosDraining_);
855 EXPECT_EQ(audioSink->eosInterruptType_, AudioSink::EosInterruptState::NONE);
856
857 std::shared_ptr<TestAudioSinkMock> plugin = std::make_shared<TestAudioSinkMock>("test");
858 audioSink->plugin_ = plugin;
859 audioSink->eosInterruptType_ = AudioSink::EosInterruptState::INITIAL;
860 audioSink->HandleEosInner(false);
861 EXPECT_EQ(false, audioSink->eosDraining_);
862 EXPECT_EQ(audioSink->eosInterruptType_, AudioSink::EosInterruptState::NONE);
863 }
864
865 HWTEST(TestAudioSink, audio_sink_DrainAndReportEosEvent, TestSize.Level1)
866 {
867 auto audioSink = AudioSinkCreate();
868 ASSERT_TRUE(audioSink != nullptr);
869
870 auto syncCenter = std::make_shared<Pipeline::MediaSyncManager>();
871 audioSink->SetSyncCenter(syncCenter);
872 audioSink->DrainAndReportEosEvent();
873 ASSERT_EQ(false, audioSink->eosDraining_);
874 }
875
876 // plugin_ == nullptr || inputBufferQueueConsumer_ == nullptr
877 HWTEST(TestAudioSink, audio_sink_DrainOutputBuffer_001, TestSize.Level1)
878 {
879 auto audioSink = std::make_shared<AudioSink>();
880 ASSERT_TRUE(audioSink != nullptr);
881 audioSink->plugin_ = nullptr;
882 audioSink->inputBufferQueueConsumer_ = nullptr;
883 audioSink->DrainOutputBuffer(true);
884 ASSERT_TRUE(audioSink->lastBufferWriteSuccess_);
885 }
886
887 // plugin_ != nullptr || inputBufferQueueConsumer_ == nullptr
888 HWTEST(TestAudioSink, audio_sink_DrainOutputBuffer_002, TestSize.Level1)
889 {
890 auto audioSink = std::make_shared<AudioSink>();
891 ASSERT_TRUE(audioSink != nullptr);
892 audioSink->inputBufferQueueConsumer_ = nullptr;
893 audioSink->DrainOutputBuffer(true);
894 ASSERT_TRUE(audioSink->lastBufferWriteSuccess_);
895 }
896
897 // plugin_ != nullptr || inputBufferQueueConsumer_ != nullptr, ret != Status::OK || filledOutputBuffer == nullptr
898 HWTEST(TestAudioSink, audio_sink_DrainOutputBuffer_003, TestSize.Level1)
899 {
900 auto audioSink = std::make_shared<AudioSink>();
901 ASSERT_TRUE(audioSink != nullptr);
902 audioSink->inputBufferQueue_ = AVBufferQueue::Create(5, MemoryType::SHARED_MEMORY, "test");
903 audioSink->inputBufferQueueConsumer_ = audioSink->inputBufferQueue_->GetConsumer();
904 audioSink->DrainOutputBuffer(true);
905 ASSERT_TRUE(audioSink->lastBufferWriteSuccess_);
906 }
907
908 HWTEST(TestAudioSink, audio_sink_ResetSyncInfo, TestSize.Level1)
909 {
910 auto audioSink = AudioSinkCreate();
911 ASSERT_TRUE(audioSink != nullptr);
912
913 auto syncCenter = std::make_shared<Pipeline::MediaSyncManager>();
914 audioSink->SetSyncCenter(syncCenter);
915 audioSink->ResetSyncInfo();
916 ASSERT_TRUE(!audioSink->syncCenter_.expired());
917 }
918
919 // lastAnchorClockTime_ != HST_TIME_NONE || forceUpdateTimeAnchorNextTime_ != true
920 HWTEST(TestAudioSink, audio_sink_DoSyncWrite_001, TestSize.Level1)
921 {
922 auto audioSink = AudioSinkCreate();
923 ASSERT_TRUE(audioSink != nullptr);
924
925 audioSink->firstPts_ = 0;
926 audioSink->lastAnchorClockTime_ = 0;
927 audioSink->forceUpdateTimeAnchorNextTime_ = false;
928 audioSink->playingBufferDurationUs_ = 1;
929 AVBufferConfig config;
930 config.size = 9;
931 config.capacity = 9;
932 config.memoryType = MemoryType::VIRTUAL_MEMORY;
933 std::shared_ptr<OHOS::Media::AVBuffer> buffer = AVBuffer::CreateAVBuffer(config);
934 ASSERT_EQ(0, audioSink->DoSyncWrite(buffer));
935 }
936
937 // lastAnchorClockTime_ != HST_TIME_NONE || forceUpdateTimeAnchorNextTime_ == true
938 HWTEST(TestAudioSink, audio_sink_DoSyncWrite_002, TestSize.Level1)
939 {
940 auto audioSink = AudioSinkCreate();
941 ASSERT_TRUE(audioSink != nullptr);
942
943 audioSink->firstPts_ = 0;
944 audioSink->lastAnchorClockTime_ = 0;
945 audioSink->forceUpdateTimeAnchorNextTime_ = true;
946 audioSink->playingBufferDurationUs_ = 1;
947 AVBufferConfig config;
948 config.size = 9;
949 config.capacity = 9;
950 config.memoryType = MemoryType::VIRTUAL_MEMORY;
951 std::shared_ptr<OHOS::Media::AVBuffer> buffer = AVBuffer::CreateAVBuffer(config);
952 ASSERT_EQ(0, audioSink->DoSyncWrite(buffer));
953 }
954
955 HWTEST(TestAudioSink, audio_sink_SetSpeed_001, TestSize.Level1)
956 {
957 auto audioSink = AudioSinkCreate();
958 ASSERT_TRUE(audioSink != nullptr);
959
960 audioSink->plugin_ = nullptr;
961 ASSERT_EQ(Status::ERROR_NULL_POINTER, audioSink->SetSpeed(0));
962 }
963
964 HWTEST(TestAudioSink, audio_sink_SetSpeed_002, TestSize.Level1)
965 {
966 auto audioSink = AudioSinkCreate();
967 ASSERT_TRUE(audioSink != nullptr);
968 std::shared_ptr<TestAudioSinkMock> plugin = std::make_shared<TestAudioSinkMock>("test");
969 audioSink->plugin_ = plugin;
970
971 ASSERT_EQ(Status::ERROR_INVALID_PARAMETER, audioSink->SetSpeed(0));
972 }
973
974 HWTEST(TestAudioSink, audio_sink_SetAudioEffectMode, TestSize.Level1)
975 {
976 auto audioSink = AudioSinkCreate();
977 ASSERT_TRUE(audioSink != nullptr);
978 audioSink->plugin_ = nullptr;
979
980 ASSERT_EQ(Status::ERROR_NULL_POINTER, audioSink->SetAudioEffectMode(0));
981 }
982
983 HWTEST(TestAudioSink, audio_sink_GetAudioEffectMode, TestSize.Level1)
984 {
985 auto audioSink = AudioSinkCreate();
986 ASSERT_TRUE(audioSink != nullptr);
987 audioSink->plugin_ = nullptr;
988 int32_t effectMode = 0;
989 ASSERT_EQ(Status::ERROR_NULL_POINTER, audioSink->GetAudioEffectMode(effectMode));
990 }
991
992 HWTEST(TestAudioSink, audio_sink_getPendingAudioPlayoutDurationUs_001, TestSize.Level1)
993 {
994 auto audioSink = AudioSinkCreate();
995 ASSERT_TRUE(audioSink != nullptr);
996 audioSink->numFramesWritten_ = 10;
997 audioSink->samplePerFrame_ = 10;
998 audioSink->sampleRate_ = 1;
999 int64_t nowUs = 0;
1000 ASSERT_EQ(100000000, audioSink->getPendingAudioPlayoutDurationUs(nowUs));
1001 }
1002
1003 HWTEST(TestAudioSink, audio_sink_getPendingAudioPlayoutDurationUs_002, TestSize.Level1)
1004 {
1005 auto audioSink = AudioSinkCreate();
1006 ASSERT_TRUE(audioSink != nullptr);
1007 audioSink->numFramesWritten_ = -10;
1008 audioSink->samplePerFrame_ = 10;
1009 audioSink->sampleRate_ = 1;
1010 int64_t nowUs = 0;
1011 ASSERT_EQ(0, audioSink->getPendingAudioPlayoutDurationUs(nowUs));
1012 }
1013
1014 HWTEST(TestAudioSink, audio_sink_getDurationUsPlayedAtSampleRate_001, TestSize.Level1)
1015 {
1016 auto audioSink = AudioSinkCreate();
1017 ASSERT_TRUE(audioSink != nullptr);
1018
1019 std::shared_ptr<TestAudioSinkMock> plugin = std::make_shared<TestAudioSinkMock>("test");
1020 audioSink->plugin_ = plugin;
1021 uint32_t numFrames = 0;
1022 ASSERT_EQ(0, audioSink->getDurationUsPlayedAtSampleRate(numFrames));
1023 }
1024
1025 HWTEST(TestAudioSink, audio_sink_getDurationUsPlayedAtSampleRate_002, TestSize.Level1)
1026 {
1027 auto audioSink = AudioSinkCreate();
1028 ASSERT_TRUE(audioSink != nullptr);
1029
1030 std::shared_ptr<TestAudioSinkMock> plugin = std::make_shared<TestAudioSinkMock>("test");
1031 audioSink->plugin_ = plugin;
1032 uint32_t numFrames = 0;
1033 ASSERT_EQ(0, audioSink->getDurationUsPlayedAtSampleRate(numFrames));
1034 }
1035
1036 HWTEST(TestAudioSink, audio_sink_ChangeTrack_001, TestSize.Level1)
1037 {
1038 auto audioSink = AudioSinkCreate();
1039 ASSERT_TRUE(audioSink != nullptr);
1040 audioSink->plugin_ = nullptr;
1041 audioSink->volume_ = 0;
1042 audioSink->speed_ = -1;
1043 audioSink->effectMode_ = -1;
1044 audioSink->state_ = Pipeline::FilterState::RUNNING;
1045 std::shared_ptr<Meta> meta = std::make_shared<Meta>();
1046 ASSERT_EQ(Status::OK, audioSink->ChangeTrack(meta, nullptr));
1047 }
1048
1049 HWTEST(TestAudioSink, audio_sink_ChangeTrack_002, TestSize.Level1)
1050 {
1051 auto audioSink = AudioSinkCreate();
1052 ASSERT_TRUE(audioSink != nullptr);
1053 audioSink->plugin_ = nullptr;
1054 audioSink->volume_ = 0;
1055 audioSink->speed_ = -1;
1056 audioSink->effectMode_ = 0;
1057 audioSink->state_ = Pipeline::FilterState::RUNNING;
1058 std::shared_ptr<Meta> meta = std::make_shared<Meta>();
1059 ASSERT_EQ(Status::OK, audioSink->ChangeTrack(meta, nullptr));
1060 }
1061
1062 HWTEST(TestAudioSink, audio_sink_CalcMaxAmplitude_001, TestSize.Level1)
1063 {
1064 auto audioSink = std::make_shared<AudioSink>();
1065 ASSERT_TRUE(audioSink != nullptr);
1066 AVBufferConfig config;
1067 config.size = 1;
1068 config.capacity = 1;
1069 config.memoryType = MemoryType::VIRTUAL_MEMORY;
1070 std::shared_ptr<OHOS::Media::AVBuffer> buffer = AVBuffer::CreateAVBuffer(config);
1071 audioSink->CalcMaxAmplitude(buffer);
1072 ASSERT_EQ(0, audioSink->DoSyncWrite(buffer));
1073 }
1074
1075 HWTEST(TestAudioSink, audio_sink_CheckUpdateState_001, TestSize.Level1)
1076 {
1077 auto audioSink = std::make_shared<AudioSink>();
1078 ASSERT_TRUE(audioSink != nullptr);
1079 int8_t frame[] = {0, 127};
1080 audioSink->CheckUpdateState(reinterpret_cast<char*>(frame), sizeof(frame), 0);
1081 audioSink->UpdateAmplitude();
1082 float amplitude = 0.0f;
1083 amplitude = audioSink->GetMaxAmplitude();
1084 ASSERT_EQ(true, fabs(amplitude - 1.0) <= 1e-6);
1085 }
1086
1087 HWTEST(TestAudioSink, audio_sink_CheckUpdateState_002, TestSize.Level1)
1088 {
1089 auto audioSink = std::make_shared<AudioSink>();
1090 ASSERT_TRUE(audioSink != nullptr);
1091 int8_t frame[] = {0, -127};
1092 audioSink->CheckUpdateState(reinterpret_cast<char*>(frame), sizeof(frame), 0);
1093 audioSink->UpdateAmplitude();
1094 float amplitude = 0.0f;
1095 amplitude = audioSink->GetMaxAmplitude();
1096 ASSERT_EQ(true, fabs(amplitude - 1.0) <= 1e-6);
1097 }
1098
1099 HWTEST(TestAudioSink, audio_sink_CheckUpdateState_003, TestSize.Level1)
1100 {
1101 auto audioSink = std::make_shared<AudioSink>();
1102 ASSERT_TRUE(audioSink != nullptr);
1103 int16_t frame[] = {0, -32767};
1104 audioSink->CheckUpdateState(reinterpret_cast<char*>(frame), sizeof(frame), 1);
1105 audioSink->UpdateAmplitude();
1106 float amplitude = 0.0f;
1107 amplitude = audioSink->GetMaxAmplitude();
1108 ASSERT_EQ(true, fabs(amplitude - 1.0) <= 1e-6);
1109 }
1110
1111 HWTEST(TestAudioSink, audio_sink_CheckUpdateState_004, TestSize.Level1)
1112 {
1113 auto audioSink = std::make_shared<AudioSink>();
1114 ASSERT_TRUE(audioSink != nullptr);
1115 int16_t frame[] = {0, 32767};
1116 audioSink->CheckUpdateState(reinterpret_cast<char*>(frame), sizeof(frame), 1);
1117 audioSink->UpdateAmplitude();
1118 float amplitude = 0.0f;
1119 amplitude = audioSink->GetMaxAmplitude();
1120 ASSERT_EQ(true, fabs(amplitude - 1.0) <= 1e-6);
1121 }
1122
1123 HWTEST(TestAudioSink, audio_sink_CheckUpdateState_005, TestSize.Level1)
1124 {
1125 auto audioSink = std::make_shared<AudioSink>();
1126 ASSERT_TRUE(audioSink != nullptr);
1127 int8_t frame[] = {0, 0, 0, 1, 0, 0x80};
1128 audioSink->CheckUpdateState(reinterpret_cast<char*>(frame), sizeof(frame), 2);
1129 audioSink->UpdateAmplitude();
1130 float amplitude = 0.0f;
1131 amplitude = audioSink->GetMaxAmplitude();
1132 ASSERT_EQ(true, fabs(amplitude - 1.0) <= 1e-6);
1133 }
1134
1135 HWTEST(TestAudioSink, audio_sink_CheckUpdateState_006, TestSize.Level1)
1136 {
1137 auto audioSink = std::make_shared<AudioSink>();
1138 ASSERT_TRUE(audioSink != nullptr);
1139 int8_t frame[] = {0, 0, 0, 0xff, 0xff, 0x7f};
1140 audioSink->CheckUpdateState(reinterpret_cast<char*>(frame), sizeof(frame), 2);
1141 audioSink->UpdateAmplitude();
1142 float amplitude = 0.0f;
1143 amplitude = audioSink->GetMaxAmplitude();
1144 ASSERT_EQ(true, fabs(amplitude - 1.0) <= 1e-6);
1145 }
1146
1147 HWTEST(TestAudioSink, audio_sink_CheckUpdateState_007, TestSize.Level1)
1148 {
1149 auto audioSink = std::make_shared<AudioSink>();
1150 ASSERT_TRUE(audioSink != nullptr);
1151 int32_t frame[] = {0, -2147483647};
1152 audioSink->CheckUpdateState(reinterpret_cast<char*>(frame), sizeof(frame), 3);
1153 audioSink->UpdateAmplitude();
1154 float amplitude = 0.0f;
1155 amplitude = audioSink->GetMaxAmplitude();
1156 ASSERT_EQ(true, fabs(amplitude - 1.0) <= 1e-6);
1157 }
1158
1159 HWTEST(TestAudioSink, audio_sink_CheckUpdateState_008, TestSize.Level1)
1160 {
1161 auto audioSink = std::make_shared<AudioSink>();
1162 ASSERT_TRUE(audioSink != nullptr);
1163 int32_t frame[] = {0, 2147483647};
1164 audioSink->CheckUpdateState(reinterpret_cast<char*>(frame), sizeof(frame), 3);
1165 audioSink->UpdateAmplitude();
1166 float amplitude = 0.0f;
1167 amplitude = audioSink->GetMaxAmplitude();
1168 ASSERT_EQ(true, fabs(amplitude - 1.0) <= 1e-6);
1169 }
1170
1171 HWTEST(TestAudioSink, audio_sink_CheckUpdateState_009, TestSize.Level1)
1172 {
1173 auto audioSink = std::make_shared<AudioSink>();
1174 ASSERT_TRUE(audioSink != nullptr);
1175 int32_t frame[] = {0, 2147483647};
1176 audioSink->CheckUpdateState(reinterpret_cast<char*>(frame), sizeof(frame), -1);
1177 audioSink->UpdateAmplitude();
1178 float amplitude = 0.0f;
1179 amplitude = audioSink->GetMaxAmplitude();
1180 ASSERT_EQ(true, fabs(amplitude) <= 1e-6);
1181 }
1182
1183 HWTEST(TestAudioSink, audio_sink_SetPlayRange, TestSize.Level1)
1184 {
1185 auto audioSink = AudioSinkCreate();
1186 ASSERT_TRUE(audioSink != nullptr);
1187
1188 auto setPlayRangeStatus = audioSink->SetPlayRange(0, 100);
1189 ASSERT_EQ(setPlayRangeStatus, Status::OK);
1190 }
1191
1192 HWTEST(TestAudioSink, audio_sink_Resume, TestSize.Level1)
1193 {
1194 std::shared_ptr<AudioSink> audioSink = AudioSinkCreate();
1195 ASSERT_TRUE(audioSink != nullptr);
1196 auto preStatus = audioSink->Prepare();
1197 ASSERT_TRUE(preStatus == Status::OK);
1198 auto startStatus = audioSink->Start();
1199 ASSERT_TRUE(startStatus == Status::OK);
1200 auto pauseStatus = audioSink->Pause();
1201 ASSERT_TRUE(pauseStatus == Status::OK);
1202 auto stopStatus = audioSink->Stop();
1203 ASSERT_TRUE(stopStatus == Status::OK);
1204 auto flushStatus = audioSink->Flush();
1205 ASSERT_TRUE(flushStatus == Status::OK);
1206 audioSink->eosInterruptType_ = AudioSink::EosInterruptState::PAUSE;
1207 auto resumeStatus = audioSink->Resume();
1208 ASSERT_TRUE(resumeStatus == Status::OK);
1209 auto freeStatus = audioSink->Release();
1210 ASSERT_TRUE(freeStatus == Status::OK);
1211 }
1212
1213 HWTEST(TestAudioSink, audio_sink_DropApeBuffer_001, TestSize.Level1)
1214 {
1215 auto audioSink = AudioSinkCreate();
1216 ASSERT_TRUE(audioSink != nullptr);
1217 audioSink->inputBufferQueue_ = AVBufferQueue::Create(5, MemoryType::SHARED_MEMORY, "test");
1218 audioSink->inputBufferQueueConsumer_ = audioSink->inputBufferQueue_->GetConsumer();
1219
1220 AVBufferConfig config;
1221 config.size = 9;
1222 config.capacity = 9;
1223 config.memoryType = MemoryType::VIRTUAL_MEMORY;
1224 std::shared_ptr<OHOS::Media::AVBuffer> buffer = AVBuffer::CreateAVBuffer(config);
1225
1226 audioSink->isApe_ = false;
1227 audioSink->seekTimeUs_ = HST_TIME_NONE;
1228 ASSERT_FALSE(audioSink->DropApeBuffer(buffer));
1229 }
1230
1231 HWTEST(TestAudioSink, audio_sink_DropApeBuffer_002, TestSize.Level1)
1232 {
1233 auto audioSink = AudioSinkCreate();
1234 ASSERT_TRUE(audioSink != nullptr);
1235 audioSink->inputBufferQueue_ = AVBufferQueue::Create(5, MemoryType::SHARED_MEMORY, "test");
1236 audioSink->inputBufferQueueConsumer_ = audioSink->inputBufferQueue_->GetConsumer();
1237
1238 AVBufferConfig config;
1239 config.size = 9;
1240 config.capacity = 9;
1241 config.memoryType = MemoryType::VIRTUAL_MEMORY;
1242 std::shared_ptr<OHOS::Media::AVBuffer> buffer = AVBuffer::CreateAVBuffer(config);
1243
1244 audioSink->isApe_ = true;
1245 audioSink->seekTimeUs_ = HST_TIME_NONE;
1246 ASSERT_FALSE(audioSink->DropApeBuffer(buffer));
1247 }
1248
1249 HWTEST(TestAudioSink, audio_sink_DropApeBuffer_003, TestSize.Level1)
1250 {
1251 auto audioSink = AudioSinkCreate();
1252 ASSERT_TRUE(audioSink != nullptr);
1253 audioSink->inputBufferQueue_ = AVBufferQueue::Create(5, MemoryType::SHARED_MEMORY, "test");
1254 audioSink->inputBufferQueueConsumer_ = audioSink->inputBufferQueue_->GetConsumer();
1255
1256 AVBufferConfig config;
1257 config.size = 9;
1258 config.capacity = 9;
1259 config.memoryType = MemoryType::VIRTUAL_MEMORY;
1260 std::shared_ptr<OHOS::Media::AVBuffer> buffer = AVBuffer::CreateAVBuffer(config);
1261
1262 audioSink->isApe_ = true;
1263 audioSink->seekTimeUs_ = 10 * HST_NSECOND;
1264 buffer->pts_ = 20 * HST_NSECOND;
1265 ASSERT_FALSE(audioSink->DropApeBuffer(buffer));
1266 }
1267
1268 HWTEST(TestAudioSink, audio_sink_DropApeBuffer_004, TestSize.Level1)
1269 {
1270 auto audioSink = AudioSinkCreate();
1271 ASSERT_TRUE(audioSink != nullptr);
1272 audioSink->inputBufferQueue_ = AVBufferQueue::Create(5, MemoryType::SHARED_MEMORY, "test");
1273 audioSink->inputBufferQueueConsumer_ = audioSink->inputBufferQueue_->GetConsumer();
1274
1275 AVBufferConfig config;
1276 config.size = 9;
1277 config.capacity = 9;
1278 config.memoryType = MemoryType::VIRTUAL_MEMORY;
1279 std::shared_ptr<OHOS::Media::AVBuffer> buffer = AVBuffer::CreateAVBuffer(config);
1280
1281 audioSink->isApe_ = true;
1282 audioSink->seekTimeUs_ = 10 * HST_NSECOND;
1283 buffer->pts_ = 5 * HST_NSECOND;
1284 ASSERT_TRUE(audioSink->DropApeBuffer(buffer));
1285 }
1286
1287 HWTEST(TestAudioSink, audio_sink_SetIsTransitent_001, TestSize.Level1)
1288 {
1289 auto audioSink = AudioSinkCreate();
1290 auto ret = audioSink->SetIsTransitent(true);
1291 ASSERT_TRUE(ret == Status::OK);
1292 }
1293
1294 HWTEST(TestAudioSink, audio_sink_GetSyncCenterClockTime_001, TestSize.Level1)
1295 {
1296 auto audioSink = AudioSinkCreate();
1297 int64_t clockTime = 0;
1298 auto ret = audioSink->SetIsTransitent(clockTime);
1299 ASSERT_TRUE(ret == Status::OK);
1300 }
1301
1302 HWTEST(TestAudioSink, audio_sink_SetMuted_001, TestSize.Level1)
1303 {
1304 auto audioSink = AudioSinkCreate();
1305 auto ret = audioSink->SetMuted(true);
1306 ASSERT_TRUE(ret == Status::OK);
1307 }
1308
1309 HWTEST(TestAudioSink, audio_sink_SetSeekTime_001, TestSize.Level1)
1310 {
1311 auto audioSink = AudioSinkCreate();
1312 int64_t seekTime = 0;
1313 auto ret = audioSink->SetSeekTime(seekTime);
1314 ASSERT_TRUE(ret == Status::OK);
1315 }
1316
1317 HWTEST(TestAudioSink, UpdateLastBufferPTS_001, TestSize.Level1)
1318 {
1319 auto audioSink = AudioSinkCreate();
1320 std::unique_ptr<AudioSink::AudioDataSynchroizer> innerSynchroizer =
1321 std::make_unique<AudioSink::AudioDataSynchroizer>();
1322 innerSynchroizer->curBufferPTS_ = 123;
1323 innerSynchroizer->lastBufferOffset_ = 12;
1324 innerSynchroizer->bufferDuration_ = 456;
1325 innerSynchroizer->lastBufferPTS_ = 123456;
1326 int64_t tempPTS =
1327 innerSynchroizer->curBufferPTS_ + innerSynchroizer->lastBufferOffset_ + innerSynchroizer->bufferDuration_;
1328 int64_t bufferOffset = 0;
1329 float speed = 2;
1330 innerSynchroizer->UpdateLastBufferPTS(bufferOffset, speed);
1331 EXPECT_EQ(innerSynchroizer->lastBufferPTS_, tempPTS);
1332 }
1333
1334 HWTEST(TestAudioSink, audio_sink_SetAudioSinkPluginParameters_001, TestSize.Level1)
1335 {
1336 auto audioSink = AudioSinkCreate();
1337 auto ret = audioSink->SetAudioSinkPluginParameters(audioSink->plugin_);
1338 ASSERT_TRUE(ret == Status::OK);
1339 }
1340
1341 HWTEST(TestAudioSink, audio_sink_PreCreateAndStartNewPlugin_001, TestSize.Level1)
1342 {
1343 auto audioSink = AudioSinkCreate();
1344 ASSERT_TRUE(audioSink != nullptr);
1345 audioSink->volume_ = 0;
1346 audioSink->speed_ = -1;
1347 audioSink->effectMode_ = -1;
1348 audioSink->state_ = Pipeline::FilterState::RUNNING;
1349 std::shared_ptr<Meta> meta = std::make_shared<Meta>();
1350 auto plugin = audioSink->PreCreateAndStartNewPlugin(meta, nullptr);
1351 ASSERT_TRUE(plugin != nullptr);
1352 }
1353
1354 HWTEST(TestAudioSink, audio_sink_HandleFormatChange_001, TestSize.Level1)
1355 {
1356 auto audioSink = AudioSinkCreate();
1357 ASSERT_TRUE(audioSink != nullptr);
1358 audioSink->volume_ = 0;
1359 audioSink->speed_ = -1;
1360 audioSink->effectMode_ = -1;
1361 audioSink->state_ = Pipeline::FilterState::RUNNING;
1362 std::shared_ptr<TestAudioSinkMock> plugin = std::make_shared<TestAudioSinkMock>("test");
1363 audioSink->plugin_ = plugin;
1364 audioSink->SetThreadGroupId("HiPlayer_1");
1365 std::shared_ptr<Meta> meta = std::make_shared<Meta>();
1366 auto ret = audioSink->HandleFormatChange(meta, nullptr);
1367 ASSERT_TRUE(ret == Status::OK);
1368 }
1369
1370 HWTEST(TestAudioSink, audio_sink_ChangeTrackForFormatChange_001, TestSize.Level1)
1371 {
1372 auto audioSink = AudioSinkCreate();
1373 ASSERT_TRUE(audioSink != nullptr);
1374 audioSink->SetThreadGroupId("HiPlayer_1");
1375 audioSink->hasPluginCreateTaskFinished_ = true;
1376 auto ret = audioSink->ChangeTrackForFormatChange();
1377 ASSERT_TRUE(ret == Status::ERROR_NULL_POINTER);
1378 }
1379 } // namespace Test
1380 } // namespace Media
1381 } // namespace OHOS