1 /*
2 * Copyright (c) 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 <iostream>
17 #include <gtest/gtest.h>
18 #include <gmock/gmock.h>
19 #include "audio_utils.h"
20 #include "audio_primary_source_clock.h"
21 #include "capturer_clock_manager.h"
22
23 using namespace testing::ext;
24 using namespace std;
25
26 namespace OHOS {
27 namespace AudioStandard {
28
29 constexpr uint64_t MOCK_FIRST_TIMESTAMP = 1000'000;
30 constexpr uint64_t MOCK_POSITION_INC = 960 * 2 * 2;
31 constexpr size_t REGULAR_TIME_DETLA = 20'000;
32 constexpr uint32_t MOCK_SAMPLE_RATE = 48'000;
33 constexpr AudioSampleFormat MOCK_FORMAT = AudioSampleFormat::SAMPLE_S16LE;
34 constexpr uint32_t MOCK_CHANNEL = 2;
35
36 class AudioPrimarySourceClockUnitTest : public testing::Test {
37 public:
38 static void SetUpTestCase();
39 static void TearDownTestCase();
40 virtual void SetUp();
TearDown()41 virtual void TearDown() {}
42 private:
43 static std::shared_ptr<AudioCapturerSourceClock> srcClock_;
44 };
45
46 std::shared_ptr<AudioCapturerSourceClock> AudioPrimarySourceClockUnitTest::srcClock_ = nullptr;
47
SetUpTestCase()48 void AudioPrimarySourceClockUnitTest::SetUpTestCase()
49 {
50 srcClock_ = std::make_shared<AudioCapturerSourceClock>();
51 CapturerClockManager::GetInstance().RegisterAudioSourceClock(1, srcClock_);
52 srcClock_->Init(MOCK_SAMPLE_RATE, MOCK_FORMAT, MOCK_CHANNEL);
53 }
54
TearDownTestCase()55 void AudioPrimarySourceClockUnitTest::TearDownTestCase()
56 {
57 CapturerClockManager::GetInstance().DeleteAudioSourceClock(1);
58 }
59
SetUp()60 void AudioPrimarySourceClockUnitTest::SetUp()
61 {
62 if (srcClock_ == nullptr) {
63 return;
64 }
65 srcClock_->Reset();
66 }
67
68 /**
69 * @tc.name : Test Audio primary source clock
70 * @tc.number : AudioPrimarySourceClockUnitTest_001
71 * @tc.desc : Test Audio primary source clock normal case
72 */
73 HWTEST_F(AudioPrimarySourceClockUnitTest, AudioPrimarySourceClockUnitTest_001, TestSize.Level1)
74 {
75 EXPECT_EQ(srcClock_->GetFrameCnt(), 0);
76 srcClock_->SetFirstTimestampFromHdi(MOCK_FIRST_TIMESTAMP);
77 srcClock_->Renew(0);
78 EXPECT_EQ(srcClock_->lastTs_, 0);
79 EXPECT_EQ(srcClock_->firstTimeStamp_, MOCK_FIRST_TIMESTAMP);
80 srcClock_->Renew(MOCK_POSITION_INC);
81 EXPECT_EQ(srcClock_->GetFrameCnt(), 1);
82 EXPECT_TRUE(srcClock_->lastTs_ > 0);
83 }
84
85 /**
86 * @tc.name : Test Audio primary source clock
87 * @tc.number : AudioPrimarySourceClockUnitTest_002
88 * @tc.desc : Test Audio primary source clock normal case 2
89 */
90 HWTEST_F(AudioPrimarySourceClockUnitTest, AudioPrimarySourceClockUnitTest_002, TestSize.Level1)
91 {
92 EXPECT_EQ(srcClock_->GetFrameCnt(), 0);
93 srcClock_->SetFirstTimestampFromHdi(MOCK_FIRST_TIMESTAMP);
94 EXPECT_FALSE(srcClock_->isGetTimeStampFromSystemClock_);
95 // 10 : loop cnt
96 for (size_t i = 0; i < 10; i++) {
97 srcClock_->Renew(MOCK_POSITION_INC);
98 }
99 EXPECT_FALSE(srcClock_->isGetTimeStampFromSystemClock_);
100 // 20 : loop cnt
101 for (size_t i = 0; i < 20; i++) {
102 srcClock_->Renew(MOCK_POSITION_INC);
103 }
104 // 21: 20 frames from first ts and 1 for last one
105 EXPECT_EQ(srcClock_->GetFrameCnt(), 21);
106 EXPECT_TRUE(srcClock_->isGetTimeStampFromSystemClock_);
107 }
108
109 /**
110 * @tc.name : Test Audio primary source clock
111 * @tc.number : AudioPrimarySourceClockUnitTest_003
112 * @tc.desc : Test get timestamp when first timestamp set 0
113 */
114 HWTEST_F(AudioPrimarySourceClockUnitTest, AudioPrimarySourceClockUnitTest_003, TestSize.Level1)
115 {
116 EXPECT_EQ(srcClock_->GetFrameCnt(), 0);
117 srcClock_->SetFirstTimestampFromHdi(0);
118 srcClock_->Renew(MOCK_POSITION_INC);
119 EXPECT_TRUE(srcClock_->isGetTimeStampFromSystemClock_);
120 }
121
122 /**
123 * @tc.name : Test Audio primary source clock
124 * @tc.number : AudioPrimarySourceClockUnitTest_004
125 * @tc.desc : Test Audio primary source clock normal case 4
126 */
127 HWTEST_F(AudioPrimarySourceClockUnitTest, AudioPrimarySourceClockUnitTest_004, TestSize.Level1)
128 {
129 EXPECT_EQ(srcClock_->GetFrameCnt(), 0);
130 srcClock_->SetFirstTimestampFromHdi(MOCK_FIRST_TIMESTAMP);
131 EXPECT_FALSE(srcClock_->isGetTimeStampFromSystemClock_);
132 srcClock_->Renew(MOCK_POSITION_INC);
133 usleep(REGULAR_TIME_DETLA);
134 srcClock_->Renew(MOCK_POSITION_INC);
135 EXPECT_TRUE(srcClock_->isGetTimeStampFromSystemClock_);
136 }
137
138 } // namespace AudioStandard
139 } // namespace OHOS
140