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