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