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