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