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 #include <gtest/gtest.h>
16 #include "forward.h"
17 #include "task.h"
18
19 using namespace testing::ext;
20 using namespace testing;
21
22 namespace Hdc {
23 class HdcForwardBaseTest : public ::testing::Test {
24 public:
25 static void SetUpTestCase(void);
26 static void TearDownTestCase(void);
27 void SetUp();
28 void TearDown();
29 };
30
SetUpTestCase()31 void HdcForwardBaseTest::SetUpTestCase() {}
TearDownTestCase()32 void HdcForwardBaseTest::TearDownTestCase() {}
SetUp()33 void HdcForwardBaseTest::SetUp() {}
TearDown()34 void HdcForwardBaseTest::TearDown() {}
35
36 HWTEST_F(HdcForwardBaseTest, HdcForwardBase_ConstructorInitializesFdsToMinusOne, TestSize.Level0)
37 {
38 HTaskInfo info = new TaskInformation();
39 HdcForwardBase forward(info);
40 EXPECT_EQ(forward.fds[0], -1);
41 EXPECT_EQ(forward.fds[1], -1);
42
43 delete info;
44 }
45
46 HWTEST_F(HdcForwardBaseTest, StopTask_WithTwoEntries, TestSize.Level0)
47 {
48 auto* ctx1 = new HdcForwardBase::ContextForward();
49 auto* ctx2 = new HdcForwardBase::ContextForward();
50 HTaskInfo info = new TaskInformation();
51 HdcForwardBase forward(info);
52
53 ctx1->id = 1;
54 ctx1->type = HdcForwardBase::FORWARD_TCP;
55 ctx1->thisClass = &forward;
56 ctx1->localArgs[0] = "tcp";
57 ctx1->localArgs[1] = "8080";
58 ctx1->remoteArgs[0] = "tcp";
59 ctx1->remoteArgs[1] = "remote:9090";
60 ctx1->tcp.data = ctx1; // 设置 data 为自身,供 uv_close 使用
61 ctx1->finish = true;
62
63 ctx2->id = 2;
64 ctx2->type = HdcForwardBase::FORWARD_ABSTRACT;
65 ctx2->thisClass = &forward;
66 ctx2->localArgs[0] = "localabstract";
67 ctx2->localArgs[1] = "sockname";
68 ctx2->pipe.data = ctx2;
69 ctx2->finish = true;
70
71 forward.mapCtxPoint[1] = ctx1;
72 forward.mapCtxPoint[2] = ctx2;
73
74 EXPECT_FALSE(forward.mapCtxPoint.empty());
75 forward.StopTask();
76 EXPECT_TRUE(forward.mapCtxPoint.empty());
77
78 delete ctx1;
79 delete ctx2;
80 delete info;
81 }
82
83 HWTEST_F(HdcForwardBaseTest, CheckNodeInfo_ValidTcp, TestSize.Level0)
84 {
85 std::string as[2];
86 HTaskInfo info = new TaskInformation();
87 HdcForwardBase forward(info);
88 EXPECT_TRUE(forward.CheckNodeInfo("tcp:1234", as));
89 EXPECT_EQ(as[0], "tcp");
90 EXPECT_EQ(as[1], "1234");
91
92 delete info;
93 }
94
95 HWTEST_F(HdcForwardBaseTest, CheckNodeInfo_InvalidFormat, TestSize.Level0)
96 {
97 std::string as[2];
98 HTaskInfo info = new TaskInformation();
99 HdcForwardBase forward(info);
100 EXPECT_FALSE(forward.CheckNodeInfo("tcp:", as));
101 EXPECT_FALSE(forward.CheckNodeInfo(":1234", as));
102 EXPECT_FALSE(forward.CheckNodeInfo("tcp", as));
103 EXPECT_FALSE(forward.CheckNodeInfo("", as));
104
105 delete info;
106 }
107
108 HWTEST_F(HdcForwardBaseTest, CheckNodeInfo_InvalidPort, TestSize.Level0)
109 {
110 std::string as[2];
111 HTaskInfo info = new TaskInformation();
112 HdcForwardBase forward(info);
113 EXPECT_FALSE(forward.CheckNodeInfo("tcp:0", as));
114 EXPECT_FALSE(forward.CheckNodeInfo("tcp:999999", as));
115
116 delete info;
117 }
118
119 HWTEST_F(HdcForwardBaseTest, AllocForwardBuf_SizeExceedsMaxBulk, TestSize.Level0)
120 {
121 size_t sizeSuggested = MAX_USBFFS_BULK + 1024;
122 uv_handle_t dummyHandle;
123 uv_buf_t buf;
124 HTaskInfo info = new TaskInformation();
125 HdcForwardBase forward(info);
126
127 forward.AllocForwardBuf(&dummyHandle, sizeSuggested, &buf);
128
129 ASSERT_NE(buf.base, nullptr);
130 EXPECT_EQ(buf.len, MAX_USBFFS_BULK - 1);
131
132 delete info;
133 delete[] buf.base;
134 }
135
136 HWTEST_F(HdcForwardBaseTest, AllocForwardBuf_NormalSize, TestSize.Level0)
137 {
138 size_t sizeSuggested = 1024;
139 uv_handle_t dummyHandle;
140 uv_buf_t buf;
141 HTaskInfo info = new TaskInformation();
142 HdcForwardBase forward(info);
143
144 forward.AllocForwardBuf(&dummyHandle, sizeSuggested, &buf);
145
146 ASSERT_NE(buf.base, nullptr);
147 EXPECT_EQ(buf.len, sizeSuggested - 1);
148
149 delete info;
150 delete[] buf.base;
151 }
152
153 HWTEST_F(HdcForwardBaseTest, AllocForwardBuf_ZeroSize, TestSize.Level0)
154 {
155 size_t sizeSuggested = 0;
156 uv_handle_t dummyHandle;
157 uv_buf_t buf;
158 HTaskInfo info = new TaskInformation();
159 HdcForwardBase forward(info);
160
161 forward.AllocForwardBuf(&dummyHandle, sizeSuggested, &buf);
162
163 ASSERT_NE(buf.base, nullptr);
164 EXPECT_EQ(buf.len, 0);
165
166 delete info;
167 delete[] buf.base;
168 }
169
170 HWTEST_F(HdcForwardBaseTest, AllocForwardBuf_ExactMaxBulkSize, TestSize.Level0)
171 {
172 size_t sizeSuggested = MAX_USBFFS_BULK;
173 uv_handle_t dummyHandle;
174 uv_buf_t buf;
175 HTaskInfo info = new TaskInformation();
176 HdcForwardBase forward(info);
177
178 forward.AllocForwardBuf(&dummyHandle, sizeSuggested, &buf);
179
180 ASSERT_NE(buf.base, nullptr);
181 EXPECT_EQ(buf.len, MAX_USBFFS_BULK - 1);
182
183 delete info;
184 delete[] buf.base;
185 }
186
187 HWTEST_F(HdcForwardBaseTest, CheckNodeInfo_NullInput, TestSize.Level0)
188 {
189 string result[2];
190 HTaskInfo info = new TaskInformation();
191 HdcForwardBase forward(info);
192 EXPECT_FALSE(forward.CheckNodeInfo(nullptr, result));
193
194 delete info;
195 }
196
197 HWTEST_F(HdcForwardBaseTest, CheckNodeInfo_EmptyString, TestSize.Level0)
198 {
199 string result[2];
200 HTaskInfo info = new TaskInformation();
201 HdcForwardBase forward(info);
202 EXPECT_FALSE(forward.CheckNodeInfo("", result));
203
204 delete info;
205 }
206
207 HWTEST_F(HdcForwardBaseTest, CheckNodeInfo_ColonAtStart, TestSize.Level0)
208 {
209 string result[2];
210 HTaskInfo info = new TaskInformation();
211 HdcForwardBase forward(info);
212 EXPECT_FALSE(forward.CheckNodeInfo(":8080", result));
213
214 delete info;
215 }
216
217 HWTEST_F(HdcForwardBaseTest, CheckNodeInfo_ColonAtEnd, TestSize.Level0)
218 {
219 string result[2];
220 HTaskInfo info = new TaskInformation();
221 HdcForwardBase forward(info);
222 EXPECT_FALSE(forward.CheckNodeInfo("tcp:", result));
223
224 delete info;
225 }
226
227 HWTEST_F(HdcForwardBaseTest, CheckNodeInfo_NoColon, TestSize.Level0)
228 {
229 string result[2];
230 HTaskInfo info = new TaskInformation();
231 HdcForwardBase forward(info);
232 EXPECT_FALSE(forward.CheckNodeInfo("tcp", result));
233
234 delete info;
235 }
236
237 HWTEST_F(HdcForwardBaseTest, CheckNodeInfo_TcpWithInvalidPortText, TestSize.Level0)
238 {
239 string result[2];
240 HTaskInfo info = new TaskInformation();
241 HdcForwardBase forward(info);
242 EXPECT_FALSE(forward.CheckNodeInfo("tcp:abc", result));
243
244 delete info;
245 }
246
247 HWTEST_F(HdcForwardBaseTest, CheckNodeInfo_TcpWithZeroPort, TestSize.Level0)
248 {
249 string result[2];
250 HTaskInfo info = new TaskInformation();
251 HdcForwardBase forward(info);
252 EXPECT_FALSE(forward.CheckNodeInfo("tcp:0", result));
253
254 delete info;
255 }
256
257 HWTEST_F(HdcForwardBaseTest, CheckNodeInfo_TcpWithPortExceedingMax, TestSize.Level0)
258 {
259 string result[2];
260 HTaskInfo info = new TaskInformation();
261 HdcForwardBase forward(info);
262 EXPECT_FALSE(forward.CheckNodeInfo("tcp:65536", result)); // MAX_IP_PORT = 65535
263
264 delete info;
265 }
266
267 HWTEST_F(HdcForwardBaseTest, CheckNodeInfo_TcpWithValidPort, TestSize.Level0)
268 {
269 string result[2];
270 HTaskInfo info = new TaskInformation();
271 HdcForwardBase forward(info);
272 EXPECT_TRUE(forward.CheckNodeInfo("tcp:8080", result));
273 EXPECT_EQ(result[0], "tcp");
274 EXPECT_EQ(result[1], "8080");
275
276 delete info;
277 }
278
279 HWTEST_F(HdcForwardBaseTest, CheckNodeInfo_NonTcpWithValidFormat, TestSize.Level0)
280 {
281 string result[2];
282 HTaskInfo info = new TaskInformation();
283 HdcForwardBase forward(info);
284 EXPECT_TRUE(forward.CheckNodeInfo("udp:192.168.1.1", result));
285 EXPECT_EQ(result[0], "udp");
286 EXPECT_EQ(result[1], "192.168.1.1");
287
288 delete info;
289 }
290
291 HWTEST_F(HdcForwardBaseTest, DetechForwardType_TC01_TCP, TestSize.Level0)
292 {
293 auto* ctx = new HdcForwardBase::ContextForward();
294 ctx->localArgs[0] = "tcp";
295 ctx->localArgs[1] = "any";
296 HTaskInfo info = new TaskInformation();
297 HdcForwardBase forward(info);
298 EXPECT_TRUE(forward.DetechForwardType(ctx));
299 EXPECT_EQ(ctx->type, HdcForwardBase::FORWARD_TCP);
300
301 delete info;
302 delete ctx;
303 }
304
305 HWTEST_F(HdcForwardBaseTest, DetectForwardType_TC02_DEV, TestSize.Level0)
306 {
307 auto* ctx = new HdcForwardBase::ContextForward();
308 ctx->localArgs[0] = "dev";
309 ctx->localArgs[1] = "any";
310 HTaskInfo info = new TaskInformation();
311 HdcForwardBase forward(info);
312 EXPECT_TRUE(forward.DetechForwardType(ctx));
313 EXPECT_EQ(ctx->type, HdcForwardBase::FORWARD_DEVICE);
314
315 delete info;
316 delete ctx;
317 }
318
319 HWTEST_F(HdcForwardBaseTest, DetectForwardType_TC03_LOCALABSTRACT, TestSize.Level0)
320 {
321 auto* ctx = new HdcForwardBase::ContextForward();
322 ctx->localArgs[0] = "localabstract";
323 ctx->localArgs[1] = "any";
324 HTaskInfo info = new TaskInformation();
325 HdcForwardBase forward(info);
326 EXPECT_TRUE(forward.DetechForwardType(ctx));
327 EXPECT_EQ(ctx->type, HdcForwardBase::FORWARD_ABSTRACT);
328
329 delete info;
330 delete ctx;
331 }
332
333 HWTEST_F(HdcForwardBaseTest, DetectForwardType_TC04_LOCALRESERVED, TestSize.Level0)
334 {
335 auto* ctx = new HdcForwardBase::ContextForward();
336 ctx->localArgs[0] = "localreserved";
337 ctx->localArgs[1] = "sockname";
338 HTaskInfo info = new TaskInformation();
339 HdcForwardBase forward(info);
340 EXPECT_TRUE(forward.DetechForwardType(ctx));
341 EXPECT_EQ(ctx->type, HdcForwardBase::FORWARD_RESERVED);
342 EXPECT_EQ(ctx->localArgs[1], "/dev/socket/sockname");
343
344 delete info;
345 delete ctx;
346 }
347
348 HWTEST_F(HdcForwardBaseTest, DetectForwardType_TC05_LOCALFILESYSTEM, TestSize.Level0)
349 {
350 auto* ctx = new HdcForwardBase::ContextForward();
351 ctx->localArgs[0] = "localfilesystem";
352 ctx->localArgs[1] = "path";
353 HTaskInfo info = new TaskInformation();
354 HdcForwardBase forward(info);
355 EXPECT_TRUE(forward.DetechForwardType(ctx));
356 EXPECT_EQ(ctx->type, HdcForwardBase::FORWARD_FILESYSTEM);
357 EXPECT_EQ(ctx->localArgs[1], "/tmp/path");
358
359 delete info;
360 delete ctx;
361 }
362
363 HWTEST_F(HdcForwardBaseTest, DetectForwardType_TC06_JDWP, TestSize.Level0)
364 {
365 auto* ctx = new HdcForwardBase::ContextForward();
366 ctx->localArgs[0] = "jdwp";
367 ctx->localArgs[1] = "any";
368 HTaskInfo info = new TaskInformation();
369 HdcForwardBase forward(info);
370 EXPECT_TRUE(forward.DetechForwardType(ctx));
371 EXPECT_EQ(ctx->type, HdcForwardBase::FORWARD_JDWP);
372
373 delete info;
374 delete ctx;
375 }
376
377 HWTEST_F(HdcForwardBaseTest, DetectForwardType_TC07_ARK, TestSize.Level0)
378 {
379 auto* ctx = new HdcForwardBase::ContextForward();
380 ctx->localArgs[0] = "ark";
381 ctx->localArgs[1] = "any";
382 HTaskInfo info = new TaskInformation();
383 HdcForwardBase forward(info);
384 EXPECT_TRUE(forward.DetechForwardType(ctx));
385 EXPECT_EQ(ctx->type, HdcForwardBase::FORWARD_ARK);
386
387 delete info;
388 delete ctx;
389 }
390
391 HWTEST_F(HdcForwardBaseTest, DetectForwardType_TC08_INVALID, TestSize.Level0)
392 {
393 auto* ctx = new HdcForwardBase::ContextForward();
394 ctx->localArgs[0] = "invalid";
395 ctx->localArgs[1] = "any";
396 HTaskInfo info = new TaskInformation();
397 HdcForwardBase forward(info);
398 EXPECT_FALSE(forward.DetechForwardType(ctx));
399
400 delete info;
401 delete ctx;
402 }
403
404 } // namespace Hdc