• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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