• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <gtest/gtest.h>
17 #include <cmath>
18 #include <memory>
19 #include <vector>
20 #include "hpae_source_input_node.h"
21 #include "hpae_source_output_node.h"
22 #include "test_case_common.h"
23 #include "audio_errors.h"
24 #include "hpae_format_convert.h"
25 
26 using namespace OHOS;
27 using namespace AudioStandard;
28 using namespace HPAE;
29 using namespace testing::ext;
30 using namespace testing;
31 
32 namespace OHOS {
33 namespace AudioStandard {
34 namespace HPAE {
35 
36 const uint32_t DEFAULT_FRAME_LENGTH = 960;
37 const uint32_t DEFAULT_NODE_ID = 1243;
38 static std::string g_rootCapturerPath = "/data/source_file_io_48000_2_s16le.pcm";
39 
40 class HpaeSourceInputNodeTest : public testing::Test {
41 public:
42     void SetUp();
43     void TearDown();
44 };
45 
SetUp()46 void HpaeSourceInputNodeTest::SetUp()
47 {}
48 
TearDown()49 void HpaeSourceInputNodeTest::TearDown()
50 {}
51 
52 HWTEST_F(HpaeSourceInputNodeTest, constructHpaeSourceInputNode, TestSize.Level0)
53 {
54     HpaeNodeInfo nodeInfo;
55     nodeInfo.nodeId = DEFAULT_NODE_ID;
56     nodeInfo.frameLen = DEFAULT_FRAME_LENGTH;
57     nodeInfo.samplingRate = SAMPLE_RATE_48000;
58     nodeInfo.channels = STEREO;
59     nodeInfo.format = SAMPLE_F32LE;
60     std::shared_ptr<HpaeSourceInputNode> hpaeSourceInputNode = std::make_shared<HpaeSourceInputNode>(nodeInfo);
61     EXPECT_EQ(hpaeSourceInputNode->GetSampleRate(), nodeInfo.samplingRate);
62     EXPECT_EQ(hpaeSourceInputNode->GetFrameLen(), nodeInfo.frameLen);
63     EXPECT_EQ(hpaeSourceInputNode->GetChannelCount(), nodeInfo.channels);
64     EXPECT_EQ(hpaeSourceInputNode->GetBitWidth(), nodeInfo.format);
65     HpaeNodeInfo &retNi = hpaeSourceInputNode->GetNodeInfo();
66     EXPECT_EQ(retNi.samplingRate, nodeInfo.samplingRate);
67     EXPECT_EQ(retNi.frameLen, nodeInfo.frameLen);
68     EXPECT_EQ(retNi.channels, nodeInfo.channels);
69     EXPECT_EQ(retNi.format, nodeInfo.format);
70 }
71 
72 HWTEST_F(HpaeSourceInputNodeTest, testSourceInputOutputCase, TestSize.Level0)
73 {
74     HpaeNodeInfo nodeInfo;
75     nodeInfo.nodeId = DEFAULT_NODE_ID;
76     nodeInfo.frameLen = DEFAULT_FRAME_LENGTH;
77     nodeInfo.samplingRate = SAMPLE_RATE_48000;
78     nodeInfo.channels = STEREO;
79     nodeInfo.format = SAMPLE_F32LE;
80     std::shared_ptr<HpaeSourceInputNode> hpaeSourceInputNode = std::make_shared<HpaeSourceInputNode>(nodeInfo);
81     EXPECT_EQ(hpaeSourceInputNode.use_count(), 1);
82     {
83         std::shared_ptr<OutputNode<HpaePcmBuffer *>> outputNode = hpaeSourceInputNode;
84         EXPECT_EQ(hpaeSourceInputNode.use_count(), 2);  // 2 for test
85         std::shared_ptr<HpaeNode> hpaeNode = outputNode->GetSharedInstance();
86         EXPECT_EQ(hpaeSourceInputNode.use_count(), 3);  // 3 for test
87         EXPECT_EQ(hpaeNode->GetSampleRate(), nodeInfo.samplingRate);
88         EXPECT_EQ(hpaeNode->GetFrameLen(), nodeInfo.frameLen);
89         EXPECT_EQ(hpaeNode->GetChannelCount(), nodeInfo.channels);
90         EXPECT_EQ(hpaeNode->GetBitWidth(), nodeInfo.format);
91     }
92     EXPECT_EQ(hpaeSourceInputNode.use_count(), 1);
93     std::shared_ptr<HpaeSourceOutputNode> hpaeSourceOutputNode = std::make_shared<HpaeSourceOutputNode>(nodeInfo);
94     EXPECT_EQ(hpaeSourceOutputNode.use_count(), 1);
95     hpaeSourceOutputNode->Connect(hpaeSourceInputNode);
96     EXPECT_EQ(hpaeSourceOutputNode.use_count(), 1);
97     EXPECT_EQ(hpaeSourceInputNode.use_count(), 2);  // 2 for test
98     OutputPort<HpaePcmBuffer *> *outputPort = hpaeSourceInputNode->GetOutputPort();
99     EXPECT_EQ(outputPort->GetInputNum(), 1);
100     hpaeSourceOutputNode->DisConnect(hpaeSourceInputNode);
101     EXPECT_EQ(hpaeSourceInputNode.use_count(), 1);
102     outputPort = hpaeSourceInputNode->GetOutputPort();
103     EXPECT_EQ(outputPort->GetInputNum(), 0);
104 }
105 
InitAudioSourceAttr(IAudioSourceAttr & attr,const HpaeNodeInfo & nodeInfo)106 static void InitAudioSourceAttr(IAudioSourceAttr &attr, const HpaeNodeInfo &nodeInfo)
107 {
108     attr.adapterName = "";
109     attr.openMicSpeaker = 0;
110     attr.format = AudioSampleFormat::INVALID_WIDTH;
111     attr.sampleRate = nodeInfo.samplingRate;
112     attr.channel = nodeInfo.channels;
113     attr.volume = 0.0f;
114     attr.bufferSize = 0;
115     attr.isBigEndian = false;
116     attr.filePath = g_rootCapturerPath;
117     attr.deviceNetworkId = "";
118     attr.deviceType = 0;
119     attr.sourceType = 0;
120     attr.channelLayout = 0;
121     attr.audioStreamFlag = 0;
122 }
123 
124 HWTEST_F(HpaeSourceInputNodeTest, testWriteDataToSourceInputDataCase, TestSize.Level0)
125 {
126     HpaeNodeInfo nodeInfo;
127     nodeInfo.nodeId = DEFAULT_NODE_ID;
128     nodeInfo.frameLen = DEFAULT_FRAME_LENGTH;
129     nodeInfo.samplingRate = SAMPLE_RATE_48000;
130     nodeInfo.channels = STEREO;
131     nodeInfo.format = SAMPLE_S16LE;
132     nodeInfo.sourceBufferType = HPAE_SOURCE_BUFFER_TYPE_MIC;
133     nodeInfo.sourceInputNodeType = HPAE_SOURCE_MIC;
134     std::shared_ptr<HpaeSourceInputNode> hpaeSourceInputNode = std::make_shared<HpaeSourceInputNode>(nodeInfo);
135 
136     std::string deviceClass = "file_io";
137     std::string deviceNetId = "LocalDevice";
138     SourceType sourceType = SOURCE_TYPE_MIC;
139     std::string sourceName = "mic";
140     EXPECT_EQ(hpaeSourceInputNode->GetCapturerSourceInstance(deviceClass, deviceNetId, sourceType, sourceName), 0);
141     IAudioSourceAttr attr;
142     InitAudioSourceAttr(attr, nodeInfo);
143     EXPECT_EQ(hpaeSourceInputNode->CapturerSourceInit(attr), SUCCESS);
144     EXPECT_EQ(hpaeSourceInputNode->CapturerSourceInit(attr), SUCCESS);
145     EXPECT_EQ(hpaeSourceInputNode->CapturerSourceStart(), SUCCESS);
146     EXPECT_EQ(hpaeSourceInputNode->GetSourceState() == STREAM_MANAGER_RUNNING, true);
147     hpaeSourceInputNode->DoProcess();
148     EXPECT_EQ(hpaeSourceInputNode->CapturerSourceStop(), SUCCESS);
149     EXPECT_EQ(hpaeSourceInputNode->GetSourceState() == STREAM_MANAGER_SUSPENDED, true);
150     EXPECT_EQ(hpaeSourceInputNode->CapturerSourceDeInit(), SUCCESS);
151 }
152 
153 HWTEST_F(HpaeSourceInputNodeTest, testInterfaces_001, TestSize.Level0)
154 {
155     HpaeNodeInfo nodeInfo;
156     nodeInfo.nodeId = DEFAULT_NODE_ID;
157     nodeInfo.frameLen = DEFAULT_FRAME_LENGTH;
158     nodeInfo.samplingRate = SAMPLE_RATE_48000;
159     nodeInfo.channels = STEREO;
160     nodeInfo.format = SAMPLE_F32LE;
161     nodeInfo.sourceBufferType = HpaeSourceBufferType::HPAE_SOURCE_BUFFER_TYPE_MICREF;
162     std::vector<HpaeNodeInfo> nodeVector;
163     nodeVector.push_back(nodeInfo);
164     nodeInfo.sourceBufferType = HpaeSourceBufferType::HPAE_SOURCE_BUFFER_TYPE_MIC;
165     nodeVector.push_back(nodeInfo);
166     nodeInfo.sourceBufferType = HpaeSourceBufferType::HPAE_SOURCE_BUFFER_TYPE_EC;
167     nodeVector.push_back(nodeInfo);
168     std::shared_ptr<HpaeSourceInputNode> hpaeSourceInputNode = std::make_shared<HpaeSourceInputNode>(nodeVector);
169     std::shared_ptr<HpaeSourceOutputNode> hpaeSourceOutputNode = std::make_shared<HpaeSourceOutputNode>(nodeInfo);
170     EXPECT_EQ(hpaeSourceOutputNode.use_count(), 1);
171     hpaeSourceOutputNode->Connect(hpaeSourceInputNode);
172 
173     EXPECT_EQ(hpaeSourceInputNode->GetCapturerSourceInstance("file_io", "LocalDevice", SOURCE_TYPE_WAKEUP, ""), 0);
174     EXPECT_EQ(hpaeSourceInputNode->GetCapturerSourceInstance("file_io", "LocalDevice", SOURCE_TYPE_MIC, "mic"), 0);
175     hpaeSourceInputNode->SetSourceInputNodeType(HpaeSourceInputNodeType::HPAE_SOURCE_MIC_EC);
176     EXPECT_EQ(hpaeSourceInputNode->GetOutputPortBufferType(nodeInfo), HPAE_SOURCE_BUFFER_TYPE_EC);
177     nodeInfo.sourceBufferType = HPAE_SOURCE_BUFFER_TYPE_MIC;
178     EXPECT_EQ(hpaeSourceInputNode->GetOutputPortBufferType(nodeInfo), HPAE_SOURCE_BUFFER_TYPE_MIC);
179     EXPECT_NE(hpaeSourceInputNode->GetOutputPort(), nullptr);
180     EXPECT_NE(hpaeSourceInputNode->GetOutputPort(nodeInfo, false), nullptr);
181     EXPECT_EQ(hpaeSourceInputNode->GetOutputPortNum(), 0);
182     EXPECT_NE(hpaeSourceInputNode->GetCaptureId(), 0);
183     EXPECT_EQ(hpaeSourceInputNode->GetOutputPortNum(nodeInfo), 0);
184     hpaeSourceInputNode->GetNodeInfoWithInfo(nodeInfo.sourceBufferType);
185     hpaeSourceInputNode->DoProcess();
186     std::vector<int32_t> appsUid;
187     std::vector<int32_t> sessionsId;
188     constexpr int32_t testUid = 55;
189     constexpr int32_t testSessionId = 66;
190     appsUid.push_back(testUid);
191     sessionsId.push_back(testSessionId);
192     hpaeSourceInputNode->UpdateAppsUidAndSessionId(appsUid, sessionsId);
193     EXPECT_EQ(hpaeSourceInputNode->GetSourceInputNodeType(), HpaeSourceInputNodeType::HPAE_SOURCE_MIC_EC);
194     hpaeSourceInputNode->SetSourceInputNodeType(HpaeSourceInputNodeType::HPAE_SOURCE_MIC);
195     EXPECT_NE(hpaeSourceInputNode->GetOutputPortBufferType(nodeInfo), HPAE_SOURCE_BUFFER_TYPE_EC);
196     EXPECT_EQ(hpaeSourceInputNode->GetCapturerSourceInstance("file_io", "LocalDevice", SOURCE_TYPE_MIC, "mic"), 0);
197     EXPECT_EQ(hpaeSourceInputNode->GetOutputPortNum(), 1);
198     EXPECT_EQ(hpaeSourceInputNode->Reset(), true);
199     EXPECT_EQ(hpaeSourceInputNode->ResetAll(), true);
200 }
201 
202 HWTEST_F(HpaeSourceInputNodeTest, testInterfaces_002, TestSize.Level0)
203 {
204     HpaeNodeInfo nodeInfo;
205     nodeInfo.nodeId = DEFAULT_NODE_ID;
206     nodeInfo.frameLen = DEFAULT_FRAME_LENGTH;
207     nodeInfo.samplingRate = SAMPLE_RATE_48000;
208     nodeInfo.channels = STEREO;
209     nodeInfo.format = SAMPLE_F32LE;
210     std::shared_ptr<HpaeSourceInputNode> hpaeSourceInputNode = std::make_shared<HpaeSourceInputNode>(nodeInfo);
211     uint64_t requestBytes = nodeInfo.frameLen * nodeInfo.channels * GetSizeFromFormat(nodeInfo.format);
212     std::vector<char> testData(requestBytes);
213     std::string deviceClass = "file_io";
214     std::string deviceNetId = "LocalDevice";
215     SourceType sourceType = SOURCE_TYPE_MIC;
216     std::string sourceName = "mic";
217     EXPECT_EQ(hpaeSourceInputNode->GetCapturerSourceInstance(deviceClass, deviceNetId, sourceType, sourceName), 0);
218     IAudioSourceAttr attr;
219     attr.filePath = g_rootCapturerPath;
220     EXPECT_EQ(hpaeSourceInputNode->CapturerSourceInit(attr), SUCCESS);
221     EXPECT_EQ(hpaeSourceInputNode->CapturerSourcePause(), SUCCESS);
222     EXPECT_EQ(hpaeSourceInputNode->CapturerSourceFlush(), SUCCESS);
223     EXPECT_EQ(hpaeSourceInputNode->CapturerSourceResume(), SUCCESS);
224     EXPECT_EQ(hpaeSourceInputNode->CapturerSourceReset(), SUCCESS);
225     EXPECT_EQ(hpaeSourceInputNode->CapturerSourceDeInit(), SUCCESS);
226 
227     EXPECT_NE(hpaeSourceInputNode->CapturerSourcePause(), SUCCESS);
228     EXPECT_NE(hpaeSourceInputNode->CapturerSourceFlush(), SUCCESS);
229     EXPECT_NE(hpaeSourceInputNode->CapturerSourceResume(), SUCCESS);
230     EXPECT_NE(hpaeSourceInputNode->CapturerSourceReset(), SUCCESS);
231     EXPECT_NE(hpaeSourceInputNode->CapturerSourceDeInit(), SUCCESS);
232 
233     attr.filePath = "";
234     EXPECT_NE(hpaeSourceInputNode->CapturerSourceInit(attr), SUCCESS);
235     EXPECT_NE(hpaeSourceInputNode->CapturerSourceStart(), SUCCESS);
236     EXPECT_NE(hpaeSourceInputNode->CapturerSourceStop(), SUCCESS);
237     EXPECT_NE(hpaeSourceInputNode->CapturerSourceDeInit(), SUCCESS);
238 }
239 
240 HWTEST_F(HpaeSourceInputNodeTest, testDoprocess_001, TestSize.Level0)
241 {
242     std::vector<HpaeNodeInfo> vec;
243     HpaeNodeInfo nodeInfo;
244     nodeInfo.nodeId = DEFAULT_NODE_ID;
245     nodeInfo.frameLen = DEFAULT_FRAME_LENGTH;
246     nodeInfo.samplingRate = SAMPLE_RATE_48000;
247     nodeInfo.channels = STEREO;
248     nodeInfo.format = SAMPLE_S16LE;
249     nodeInfo.sourceBufferType = HPAE_SOURCE_BUFFER_TYPE_MIC;
250     nodeInfo.sourceInputNodeType = HPAE_SOURCE_MIC_EC;
251     vec.push_back(nodeInfo);
252     nodeInfo.sourceBufferType = HPAE_SOURCE_BUFFER_TYPE_EC;
253     vec.push_back(nodeInfo);
254     std::shared_ptr<HpaeSourceInputNode> hpaeSourceInputNode = std::make_shared<HpaeSourceInputNode>(vec);
255         std::string deviceClass = "file_io";
256     std::string deviceNetId = "LocalDevice";
257     SourceType sourceType = SOURCE_TYPE_MIC;
258     std::string sourceName = "mic";
259     EXPECT_EQ(hpaeSourceInputNode->GetCapturerSourceInstance(deviceClass, deviceNetId, sourceType, sourceName), 0);
260     IAudioSourceAttr attr;
261     attr.filePath = g_rootCapturerPath;
262     EXPECT_EQ(hpaeSourceInputNode->CapturerSourceInit(attr), SUCCESS);
263     hpaeSourceInputNode->DoProcess();
264     EXPECT_NE(hpaeSourceInputNode, nullptr);
265 }
266 
267 HWTEST_F(HpaeSourceInputNodeTest, testDoprocess_002, TestSize.Level0)
268 {
269     HpaeNodeInfo nodeInfo;
270     nodeInfo.nodeId = DEFAULT_NODE_ID;
271     nodeInfo.frameLen = DEFAULT_FRAME_LENGTH;
272     nodeInfo.samplingRate = SAMPLE_RATE_48000;
273     nodeInfo.channels = STEREO;
274     nodeInfo.format = SAMPLE_S16LE;
275     nodeInfo.sourceInputNodeType = HPAE_SOURCE_EC;
276     nodeInfo.sourceBufferType = HPAE_SOURCE_BUFFER_TYPE_EC;
277     std::shared_ptr<HpaeSourceInputNode> hpaeSourceInputNode = std::make_shared<HpaeSourceInputNode>(nodeInfo);
278         std::string deviceClass = "file_io";
279     std::string deviceNetId = "LocalDevice";
280     SourceType sourceType = SOURCE_TYPE_MIC;
281     std::string sourceName = "mic";
282     EXPECT_EQ(hpaeSourceInputNode->GetCapturerSourceInstance(deviceClass, deviceNetId, sourceType, sourceName), 0);
283     IAudioSourceAttr attr;
284     attr.filePath = g_rootCapturerPath;
285     EXPECT_EQ(hpaeSourceInputNode->CapturerSourceInit(attr), SUCCESS);
286     hpaeSourceInputNode->DoProcess();
287     EXPECT_NE(hpaeSourceInputNode, nullptr);
288 }
289 } // namespace HPAE
290 } // namespace AudioStandard
291 } // namespace OHOS