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