1 /**
2 * Copyright (c) 2020-2021 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 <sys/socket.h>
18 #include <arpa/inet.h>
19 #include <netinet/tcp.h>
20 #include <sys/wait.h>
21 #include <string.h>
22 #include <errno.h>
23 #include <stdlib.h>
24 #include <signal.h>
25 #include "securec.h"
26
27 using namespace std;
28 using namespace testing::ext;
29
30 static const int TEST_FD_COUNT = 10;
31 static const int STACK_PORT = 2277;
32 static const int PEER_PORT = 2277;
33 static const int BUF_SIZE = (1024 * 8);
34 static const char* g_udpMsg = "Hi, I am UDP";
35 static const char* g_srvMsg = "Hi, I am TCP server";
36 static const char* g_cliMsg = "Hi, I am TCP client";
37 static const char* g_localHost = "127.0.0.1";
38
39 static pthread_barrier_t g_barrier;
40 #define WAIT() pthread_barrier_wait(&g_barrier)
41
42 class ActsLwipTest : public testing::Test {
43 protected:
44 // SetUpTestCase: Testsuit setup, run before 1st testcase
SetUpTestCase(void)45 static void SetUpTestCase(void)
46 {
47 // Ignore SIGPIPE Signals
48 signal(SIGPIPE, SIG_IGN);
49 }
50 // TearDownTestCase: Testsuit teardown, run after last testcase
TearDownTestCase(void)51 static void TearDownTestCase(void) {}
52 // Testcase setup
SetUp()53 virtual void SetUp() {}
54 // Testcase teardown
TearDown()55 virtual void TearDown() {}
56 };
57
CommInitTcpServer(int port)58 static int CommInitTcpServer(int port)
59 {
60 int srvFd = socket(AF_INET, SOCK_STREAM, 0);
61 if (srvFd == -1) {
62 printf("CommInitTcpServer]socket fail!\n");
63 return -1;
64 }
65 int flag = 1;
66 int ret = setsockopt(srvFd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(int));
67 if (ret != 0) {
68 printf("[CommInitTcpServer]setsockopt fail, ret[%d]!\n", ret);
69 }
70 struct sockaddr_in srvAddr = {0};
71 srvAddr.sin_family = AF_INET;
72 srvAddr.sin_addr.s_addr = inet_addr(g_localHost);
73 srvAddr.sin_port = htons(port);
74 ret = ::bind(srvFd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
75 if (ret != 0) {
76 printf("[CommInitTcpServer]::bind fail!\n");
77 close(srvFd);
78 return -1;
79 }
80 int backlog = 5;
81 ret = listen(srvFd, backlog);
82 if (ret != 0) {
83 printf("[CommInitTcpServer]listen fail!\n");
84 close(srvFd);
85 return -1;
86 }
87 printf("[CommInitTcpServer]success,Fd[%d]\n", srvFd);
88 return srvFd;
89 }
90
CommTcpClientTask(void * param)91 static void* CommTcpClientTask(void* param)
92 {
93 int* ret = (int *)malloc(sizeof(int));
94 if (ret == nullptr) {
95 printf("[comm client]malloc fail\n");
96 return nullptr;
97 }
98 *ret = 0;
99 int clnFd = socket(AF_INET, SOCK_STREAM, 0);
100 if (clnFd == -1) {
101 printf("[comm client]socket fail\n");
102 *ret = -1;
103 return ret;
104 }
105 struct sockaddr_in srvAddr = {0};
106 srvAddr.sin_family = AF_INET;
107 srvAddr.sin_addr.s_addr = inet_addr(g_localHost);
108 srvAddr.sin_port = htons(PEER_PORT + 1);
109 int rst = connect(clnFd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
110 if (rst != 0) {
111 printf("[comm client]connect fail\n");
112 close(clnFd);
113 *ret = -1;
114 return ret;
115 }
116 int sleepSecond = *((int *)param);
117 int count = 4;
118 char dataBuf[50] = {0};
119 char sendMsgList[5][50] = {"Hi, I'm client,FD:[%d]", "client:123456789abcdefg,FD:[%d]",
120 "client:!!@@##$$%%^^&&**(()),FD:[%d]", "client:(((112233445566778899))),FD:[%d]", "bye"};
121 for (int i = 0; i < count; i++) {
122 sleep(sleepSecond);
123 memset_s(dataBuf, sizeof(dataBuf), 0, sizeof(dataBuf));
124 rst = sprintf_s(dataBuf, sizeof(dataBuf), sendMsgList[i], clnFd);
125 if (rst < 0) {
126 printf("[comm client]sprintf_s error!\n");
127 continue;
128 }
129 rst = send(clnFd, dataBuf, strlen(dataBuf), 0);
130 if (rst <= 0) {
131 *ret = -1;
132 printf("[comm client][%d]send fail\n", clnFd);
133 }
134 memset_s(dataBuf, sizeof(dataBuf), 0, sizeof(dataBuf));
135 rst = recv(clnFd, dataBuf, sizeof(dataBuf), 0);
136 if (rst > 0) {
137 printf("[comm client][%d]recv msg[%s]\n", clnFd, dataBuf);
138 } else {
139 printf("[comm client][%d]recv no data\n", clnFd);
140 }
141 }
142 // send 'bye', finish
143 rst = send(clnFd, sendMsgList[count], strlen(sendMsgList[count]), 0);
144 if (rst <= 0) {
145 *ret = -1;
146 printf("[comm client][%d]send fail\n", clnFd);
147 }
148 rst = close(clnFd);
149 if (rst != 0) {
150 *ret = -1;
151 printf("[comm client][%d]close fd fail\n", clnFd);
152 }
153 return ret;
154 }
155
SampleTcpServerTask(void * p)156 static void* SampleTcpServerTask(void* p)
157 {
158 int srvFd = CommInitTcpServer(STACK_PORT);
159 EXPECT_NE(-1, srvFd);
160
161 WAIT();
162 struct sockaddr_in clnAddr = {0};
163 socklen_t clnAddrLen = sizeof(clnAddr);
164 int clnFd = accept(srvFd, (struct sockaddr*)&clnAddr, &clnAddrLen);
165 printf("[tcp server]accept <%s:%d>\n", inet_ntoa(clnAddr.sin_addr), ntohs(clnAddr.sin_port));
166 EXPECT_NE(-1, clnFd);
167 printf("[tcp server]lsfd[%d], sfd[%d]\n", srvFd, clnFd);
168
169 struct sockaddr addr = {0};
170 socklen_t addrLen = sizeof(addr);
171 int ret = getsockname(clnFd, &addr, &addrLen);
172 printf("[tcp server]getsockname %s:%d\n", inet_ntoa(((struct sockaddr_in*)&addr)->sin_addr),
173 ntohs(((struct sockaddr_in*)&addr)->sin_port));
174 EXPECT_EQ(0, ret);
175 EXPECT_EQ(inet_addr(g_localHost), ((struct sockaddr_in*)&addr)->sin_addr.s_addr);
176
177 ret = getpeername(clnFd, &addr, &addrLen);
178 printf("[tcp server]getpeername %s:%d\n", inet_ntoa(((struct sockaddr_in*)&addr)->sin_addr),
179 ntohs(((struct sockaddr_in*)&addr)->sin_port));
180 EXPECT_EQ(0, ret);
181 EXPECT_EQ(inet_addr(g_localHost), ((struct sockaddr_in*)&addr)->sin_addr.s_addr);
182
183 static char buf[BUF_SIZE + 1] = {0};
184 unsigned int srvMsgLen = strlen(g_srvMsg);
185 memset_s(buf, BUF_SIZE, 0, BUF_SIZE);
186 ret = strcpy_s(buf, BUF_SIZE, g_srvMsg);
187 EXPECT_EQ(0, ret);
188 ret = send(clnFd, buf, srvMsgLen, 0);
189 printf("[tcp server]send, ret=%d\n", ret);
190 EXPECT_EQ(srvMsgLen, (unsigned int)ret);
191
192 memset_s(buf, BUF_SIZE, 0, BUF_SIZE);
193 ret = recv(clnFd, buf, sizeof(buf), 0);
194 printf("[tcp server]recv, ret=%d, msg[%s]\n", ret, buf);
195 EXPECT_EQ(strlen(g_cliMsg), (unsigned int)ret);
196
197 WAIT();
198 int len = 2;
199 struct msghdr msg = {0};
200 struct iovec iov[2] = {0};
201 clnAddr.sin_family = AF_INET;
202 clnAddr.sin_addr.s_addr = inet_addr(g_localHost);
203 clnAddr.sin_port = htons(PEER_PORT);
204 memset_s(buf, BUF_SIZE, 0, BUF_SIZE);
205 ret = strcpy_s(buf, BUF_SIZE, g_srvMsg);
206 EXPECT_EQ(0, ret);
207 msg.msg_name = &clnAddr;
208 msg.msg_namelen = sizeof(clnAddr);
209 msg.msg_iov = iov;
210 msg.msg_iovlen = len;
211 iov[0].iov_base = buf;
212 iov[0].iov_len = srvMsgLen;
213 iov[1].iov_base = buf;
214 iov[1].iov_len = srvMsgLen;
215 ret = sendmsg(clnFd, &msg, 0);
216 printf("[tcp server]sendmsg, ret=%d\n", ret);
217 EXPECT_EQ(len * srvMsgLen, (unsigned int)ret);
218
219 WAIT();
220 memset_s(buf, BUF_SIZE, 0, BUF_SIZE);
221 memset_s(&msg, sizeof(msg), 0, sizeof(msg));
222 msg.msg_name = &clnAddr;
223 msg.msg_namelen = sizeof(clnAddr);
224 msg.msg_iov = iov;
225 msg.msg_iovlen = 1;
226 iov[0].iov_base = buf;
227 iov[0].iov_len = sizeof(buf);
228 ret = recvmsg(clnFd, &msg, 0);
229 printf("[tcp server]recvmsg on socket %d:%d, msg[%s]\n", clnFd, ret, buf);
230 EXPECT_EQ(len * strlen(g_cliMsg), (unsigned int)ret);
231
232 ret = shutdown(clnFd, SHUT_RDWR);
233 printf("[tcp server]shutdown\n");
234 EXPECT_EQ(0, ret);
235 ret = close(clnFd);
236 EXPECT_NE(-1, ret);
237 ret = close(srvFd);
238 EXPECT_NE(-1, ret);
239 return nullptr;
240 }
241
SampleTcpClientTask(void * p)242 static void* SampleTcpClientTask(void* p)
243 {
244 int clnFd = socket(AF_INET, SOCK_STREAM, 0);
245 printf("[tcp client]create socket\n");
246 EXPECT_NE(-1, clnFd);
247
248 WAIT();
249 struct sockaddr_in srvAddr = {0};
250 srvAddr.sin_family = AF_INET;
251 srvAddr.sin_addr.s_addr = inet_addr(g_localHost);
252 srvAddr.sin_port = htons(PEER_PORT);
253 int ret = connect(clnFd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
254 printf("[tcp client]connect %s:%d, fd[%d]\n", inet_ntoa(srvAddr.sin_addr), ntohs(srvAddr.sin_port), clnFd);
255 EXPECT_EQ(0, ret);
256
257 struct sockaddr addr = {0};
258 socklen_t addrLen = sizeof(addr);
259 ret = getpeername(clnFd, &addr, &addrLen);
260 printf("[tcp client]getpeername %s:%d\n", inet_ntoa(((struct sockaddr_in*)&addr)->sin_addr),
261 ntohs(((struct sockaddr_in*)&addr)->sin_port));
262 EXPECT_EQ(0, ret);
263 EXPECT_EQ(inet_addr(g_localHost), ((struct sockaddr_in*)&addr)->sin_addr.s_addr);
264
265 ret = getsockname(clnFd, &addr, &addrLen);
266 printf("[tcp client]getsockname %s:%d\n", inet_ntoa(((struct sockaddr_in*)&addr)->sin_addr),
267 ntohs(((struct sockaddr_in*)&addr)->sin_port));
268 EXPECT_EQ(0, ret);
269 EXPECT_EQ(inet_addr(g_localHost), ((struct sockaddr_in*)&addr)->sin_addr.s_addr);
270
271 static char buf[BUF_SIZE + 1] = {0};
272 unsigned int cliMsgLen = strlen(g_cliMsg);
273 memset_s(buf, BUF_SIZE, 0, BUF_SIZE);
274 ret = strcpy_s(buf, BUF_SIZE, g_cliMsg);
275 EXPECT_EQ(0, ret);
276 ret = send(clnFd, buf, cliMsgLen, 0);
277 printf("[tcp client]send, ret=%d\n", ret);
278 EXPECT_EQ(cliMsgLen, (unsigned int)ret);
279
280 memset_s(buf, BUF_SIZE, 0, BUF_SIZE);
281 ret = recv(clnFd, buf, sizeof(buf), 0);
282 printf("[tcp client]recv, ret=%d, msg[%s]\n", ret, buf);
283 EXPECT_EQ(strlen(g_srvMsg), (unsigned int)ret);
284
285 WAIT();
286 int len = 2;
287 struct msghdr msg = {0};
288 struct iovec iov[2] = {0};
289 struct sockaddr_in clnAddr = {0};
290 clnAddr.sin_family = AF_INET;
291 clnAddr.sin_addr.s_addr = inet_addr(g_localHost);
292 clnAddr.sin_port = htons(PEER_PORT);
293 memset_s(buf, BUF_SIZE, 0, BUF_SIZE);
294 ret = strcpy_s(buf, BUF_SIZE, g_cliMsg);
295 EXPECT_EQ(0, ret);
296 msg.msg_name = &clnAddr;
297 msg.msg_namelen = sizeof(clnAddr);
298 msg.msg_iov = iov;
299 msg.msg_iovlen = len;
300 iov[0].iov_base = buf;
301 iov[0].iov_len = cliMsgLen;
302 iov[1].iov_base = buf;
303 iov[1].iov_len = cliMsgLen;
304 ret = sendmsg(clnFd, &msg, 0);
305 printf("[tcp client]sendmsg, ret=%d\n", ret);
306 EXPECT_EQ(len * cliMsgLen, (unsigned int)ret);
307
308 WAIT();
309 memset_s(buf, BUF_SIZE, 0, BUF_SIZE);
310 memset_s(&msg, sizeof(msg), 0, sizeof(msg));
311 msg.msg_name = &clnAddr;
312 msg.msg_namelen = sizeof(clnAddr);
313 msg.msg_iov = iov;
314 msg.msg_iovlen = 1;
315 iov[0].iov_base = buf;
316 iov[0].iov_len = sizeof(buf);
317 ret = recvmsg(clnFd, &msg, 0);
318 printf("[tcp client]recvmsg, ret=%d, msg[%s]\n", ret, buf);
319 EXPECT_EQ(len * strlen(g_srvMsg), (unsigned int)ret);
320
321 ret = shutdown(clnFd, SHUT_RDWR);
322 printf("[tcp client]shutdown\n");
323 EXPECT_EQ(0, ret);
324 ret = close(clnFd);
325 EXPECT_NE(-1, ret);
326 return nullptr;
327 }
328
TcpServerForFork()329 static int TcpServerForFork()
330 {
331 int timeout = 10;
332 char dataBuf[50] = {0};
333 int srvFd = CommInitTcpServer(STACK_PORT + 1);
334 if (srvFd == -1) {
335 return -1;
336 }
337 printf("[server process]wait client...\n");
338 int ret = -1;
339 struct sockaddr_in clnAddr = {0};
340 socklen_t clnAddrLen = sizeof(clnAddr);
341 int cliFd = accept(srvFd, (struct sockaddr*)&clnAddr, &clnAddrLen);
342 if (cliFd == -1) {
343 printf("[server process]accept fail!\n");
344 goto FINALLY;
345 }
346 while (timeout > 0) {
347 memset_s(dataBuf, sizeof(dataBuf), 0, sizeof(dataBuf));
348 ret = recv(cliFd, dataBuf, sizeof(dataBuf), 0);
349 if (ret > 0) {
350 printf("[server process]recv msg[%s]\n", dataBuf);
351 if (strcmp(dataBuf, "bye") == 0) {
352 printf("[server process]break\n");
353 break;
354 }
355 } else {
356 printf("[server process]recv no data\n");
357 }
358 memset_s(dataBuf, sizeof(dataBuf), 0, sizeof(dataBuf));
359 sprintf_s(dataBuf, sizeof(dataBuf), "server timeout:%d", timeout);
360 ret = send(cliFd, dataBuf, strlen(dataBuf), 0);
361 if (ret > 0) {
362 printf("[server process]send success, msg[%s]\n", dataBuf);
363 } else {
364 printf("[server process]send fail!\n");
365 }
366 timeout--;
367 }
368 close(cliFd);
369 printf("[server process]over\n");
370
371 FINALLY:
372 close(srvFd);
373 return ret;
374 }
375
WaitProcessExit(int pid,int * code)376 static int WaitProcessExit(int pid, int* code)
377 {
378 int status;
379 int rt = waitpid(pid, &status, 0);
380 errno = 0;
381 int retError = -2;
382 if (rt == -1) {
383 printf("[WaitProcessExit]waitpid return -1, errno=%d:%s\n", errno, strerror(errno));
384 return -1;
385 } else if (rt == 0) {
386 return 0;
387 } else if (rt != pid) { // waitpid return error
388 printf("[WaitProcessExit]waitpid error\n");
389 return retError;
390 }
391
392 int retWterm = 2;
393 int retWstop = 3;
394 int other = 4;
395 if (WIFEXITED(status)) {
396 *code = WEXITSTATUS(status);
397 return 1;
398 } else if (WIFSIGNALED(status)) {
399 *code = WTERMSIG(status);
400 return retWterm;
401 } else if (WIFSTOPPED(status)) {
402 *code = WSTOPSIG(status);
403 return retWstop;
404 }
405 return other;
406 }
407
SelectServerForFork(unsigned int timeoutSec)408 static int SelectServerForFork(unsigned int timeoutSec)
409 {
410 int srvFd = CommInitTcpServer(STACK_PORT + 1);
411 if (srvFd == -1) {
412 return -1;
413 }
414 int ret;
415 int cliCount = 0;
416 int maxFd = srvFd;
417 fd_set readSet;
418 char dataBuf[50] = {0};
419 int fds[TEST_FD_COUNT] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
420 fds[0] = srvFd;
421 long timeout = static_cast<long>(timeoutSec);
422 struct timeval timev = {.tv_sec = timeout, .tv_usec = 0};
423 struct sockaddr_in clnAddr = {0};
424 socklen_t clnAddrLen = sizeof(clnAddr);
425 while (1) {
426 FD_ZERO(&readSet);
427 for (int i = 0; i < TEST_FD_COUNT; i++) {
428 if (fds[i] != -1) {
429 FD_SET(fds[i], &readSet);
430 if (maxFd < fds[i]) {
431 maxFd = fds[i];
432 }
433 printf("[select process]fd info[%d:%d]\n", i, fds[i]);
434 }
435 }
436 ret = select(maxFd + 1, &readSet, NULL, NULL, &timev);
437 if (ret == 0) {
438 printf("[select process]select timeout!\n");
439 ret = -2;
440 break;
441 }
442 if (ret == -1) {
443 fprintf(stderr, "[select process]select fail[%s]\n", strerror(errno));
444 break;
445 }
446 if (FD_ISSET(srvFd, &readSet)) {
447 int cliFd = accept(srvFd, (struct sockaddr*)&clnAddr, &clnAddrLen);
448 if (cliFd == -1) {
449 printf("[select process]accept fail!\n");
450 ret = -1;
451 break;
452 } else {
453 for (int i = 0; i < TEST_FD_COUNT; i++) {
454 if (fds[i] == -1) {
455 fds[i] = cliFd;
456 break;
457 }
458 }
459 cliCount++;
460 printf("[select process]accept success, cliCount[%d]\n", cliCount);
461 }
462 continue;
463 }
464 for (int i = 0; i < TEST_FD_COUNT; i++) {
465 if (fds[i] == -1) {
466 continue;
467 }
468 if (FD_ISSET(fds[i], &readSet)) {
469 memset_s(dataBuf, sizeof(dataBuf), 0, sizeof(dataBuf));
470 int len = recv(fds[i], dataBuf, sizeof(dataBuf), 0);
471 if (len > 0) {
472 printf("[select process][%d]recv msg[%s]\n", fds[i], dataBuf);
473 if (strcmp(dataBuf, "bye") == 0) {
474 printf("[select process][%d]client bye,cliCount[%d]\n", fds[i], cliCount);
475 FD_CLR(fds[i], &readSet);
476 close(fds[i]);
477 fds[i] = -1;
478 cliCount--;
479 continue;
480 }
481 len = send(fds[i], dataBuf, strlen(dataBuf), 0);
482 if (len > 0) {
483 printf("[select process][%d]send success\n", fds[i]);
484 } else {
485 printf("[select process][%d]send fail\n", fds[i]);
486 }
487 }
488 }
489 }
490 if (cliCount == 0) {
491 ret = 0;
492 printf("[select process]cliCount=0, over!\n");
493 break;
494 }
495 }
496 close(srvFd);
497 return ret;
498 }
499
500 /**
501 * @tc.number : SUB_COMMUNICATION_LWIP_SDK_0100
502 * @tc.name : sample test tcp
503 * @tc.desc : [C- SOFTWARE -0200]
504 */
505 HWTEST_F(ActsLwipTest, testTcpSample, Function | MediumTest | Level1)
506 {
507 pthread_t srv;
508 pthread_t cli;
509
510 int ret = pthread_barrier_init(&g_barrier, 0, 2);
511 EXPECT_EQ(0, ret);
512
513 ret = pthread_create(&srv, nullptr, SampleTcpServerTask, nullptr);
514 EXPECT_EQ(0, ret);
515 ret = pthread_create(&cli, nullptr, SampleTcpClientTask, nullptr);
516 EXPECT_EQ(0, ret);
517
518 ret = pthread_join(cli, nullptr);
519 EXPECT_EQ(0, ret);
520 ret = pthread_join(srv, nullptr);
521 EXPECT_EQ(0, ret);
522
523 ret = pthread_barrier_destroy(&g_barrier);
524 EXPECT_EQ(0, ret);
525 }
526
527 /**
528 * @tc.number : SUB_COMMUNICATION_LWIP_SDK_0200
529 * @tc.name : sample test udp
530 * @tc.desc : [C- SOFTWARE -0200]
531 */
532 HWTEST_F(ActsLwipTest, testUdpSample, Function | MediumTest | Level2)
533 {
534 int len = 2;
535 char buf[BUF_SIZE + 1];
536 struct msghdr msg = {0};
537 struct iovec iov[2] = {0};
538 struct sockaddr_in srvAddr = {0};
539 struct sockaddr_in clnAddr = {0};
540 socklen_t clnAddrLen = sizeof(clnAddr);
541
542 int sfd = socket(AF_INET, SOCK_DGRAM, 0);
543 ASSERT_NE(-1, sfd);
544 srvAddr.sin_family = AF_INET;
545 srvAddr.sin_addr.s_addr = inet_addr(g_localHost);
546 srvAddr.sin_port = htons(STACK_PORT);
547 int ret = ::bind(sfd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
548 ASSERT_EQ(0, ret);
549
550 clnAddr.sin_family = AF_INET;
551 clnAddr.sin_addr.s_addr = inet_addr(g_localHost);
552 clnAddr.sin_port = htons(PEER_PORT);
553 memset_s(buf, BUF_SIZE, 0, BUF_SIZE);
554 ret = strcpy_s(buf, BUF_SIZE, g_udpMsg);
555 EXPECT_EQ(0, ret);
556 ret = sendto(sfd, buf, strlen(g_udpMsg), 0, (struct sockaddr*)&clnAddr, (socklen_t)sizeof(clnAddr));
557 EXPECT_NE(-1, ret);
558
559 memset_s(buf, BUF_SIZE, 0, BUF_SIZE);
560 ret = recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&clnAddr, &clnAddrLen);
561 EXPECT_EQ(strlen(g_udpMsg), (unsigned int)ret);
562
563 clnAddr.sin_family = AF_INET;
564 clnAddr.sin_addr.s_addr = inet_addr(g_localHost);
565 clnAddr.sin_port = htons(PEER_PORT);
566 memset_s(buf, BUF_SIZE, 0, BUF_SIZE);
567 ret = strcpy_s(buf, BUF_SIZE, g_udpMsg);
568 EXPECT_EQ(0, ret);
569 msg.msg_name = &clnAddr;
570 msg.msg_namelen = sizeof(clnAddr);
571 msg.msg_iov = iov;
572 msg.msg_iovlen = len;
573 iov[0].iov_base = buf;
574 iov[0].iov_len = strlen(g_udpMsg);
575 iov[1].iov_base = buf;
576 iov[1].iov_len = strlen(g_udpMsg);
577 ret = sendmsg(sfd, &msg, 0);
578 EXPECT_EQ(len*strlen(g_udpMsg), (unsigned int)ret);
579
580 ret = close(sfd);
581 EXPECT_NE(-1, ret);
582 }
583
584 /**
585 * @tc.number : SUB_COMMUNICATION_LWIP_SDK_0300
586 * @tc.name : test inter-process network communication
587 * @tc.desc : [C- SOFTWARE -0200]
588 */
589 HWTEST_F(ActsLwipTest, testInterProcessComm, Function | MediumTest | Level2)
590 {
591 pid_t pid = fork();
592 ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
593 if (pid == 0) {
594 // child:tcp server
595 int exitCode = 0;
596 int ret = TcpServerForFork();
597 if (ret == -1) {
598 printf("[tcp server]run fail\n");
599 exitCode = 1;
600 }
601 exit(exitCode);
602 } else {
603 // parent:tcp client
604 sleep(2);
605 int second = 1;
606 void *ret = CommTcpClientTask(&second);
607 if (ret == nullptr) {
608 printf("[test select]CommClientTask ret is null\n");
609 EXPECT_TRUE(0);
610 } else {
611 printf("[test select]CommClientTask ret...\n");
612 int rst = *((int *)ret);
613 printf("[test select]CommClientTask ret [%d]\n", rst);
614 EXPECT_EQ(0, rst);
615 free(ret);
616 }
617 int exitCode;
618 int procStat = WaitProcessExit(pid, &exitCode);
619 ASSERT_EQ(1, procStat);
620 ASSERT_EQ(0, exitCode);
621 }
622 }
623
624 /**
625 * @tc.number : SUB_COMMUNICATION_LWIP_SDK_0400
626 * @tc.name : test select timeout
627 * @tc.desc : [C- SOFTWARE -0200]
628 */
629 HWTEST_F(ActsLwipTest, testSelectTimeout, Function | MediumTest | Level2)
630 {
631 pid_t pid = fork();
632 ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
633 if (pid == 0) {
634 // child: server
635 int ret = SelectServerForFork(2);
636 if (ret == -2) {
637 exit(0);
638 } else {
639 printf("[select server]fail, ret is[%d]\n", ret);
640 exit(1);
641 }
642 } else {
643 int exitCode;
644 int procStat = WaitProcessExit(pid, &exitCode);
645 ASSERT_EQ(procStat, 1);
646 ASSERT_EQ(exitCode, 0);
647 }
648 }
649
650 /**
651 * @tc.number : SUB_COMMUNICATION_LWIP_SDK_0500
652 * @tc.name : test select with one client
653 * @tc.desc : [C- SOFTWARE -0200]
654 */
655 HWTEST_F(ActsLwipTest, testSelectOneClient, Function | MediumTest | Level2)
656 {
657 pid_t pid = fork();
658 ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
659 if (pid == 0) {
660 // child: server
661 int exitCode = 0;
662 int ret = SelectServerForFork(15);
663 if (ret != 0) {
664 printf("[select server]run fail\n");
665 exitCode = 1;
666 }
667 printf("[select server]ret[%d]\n", ret);
668 exit(exitCode);
669 } else {
670 // parent: client
671 sleep(2);
672 int second = 1;
673 void *ret = CommTcpClientTask(&second);
674 if (ret == nullptr) {
675 printf("[test select]CommClientTask ret is null\n");
676 EXPECT_TRUE(0);
677 } else {
678 int rst = *((int *)ret);
679 printf("[test select]CommClientTask ret [%d]\n", rst);
680 EXPECT_EQ(0, rst);
681 free(ret);
682 }
683 int exitCode;
684 int procStat = WaitProcessExit(pid, &exitCode);
685 ASSERT_EQ(1, procStat);
686 ASSERT_EQ(0, exitCode);
687 }
688 }
689
690 /**
691 * @tc.number : SUB_COMMUNICATION_LWIP_SDK_0600
692 * @tc.name : test select with multi clients
693 * @tc.desc : [C- SOFTWARE -0200]
694 */
695 HWTEST_F(ActsLwipTest, testSelectMultiClients, Function | MediumTest | Level2)
696 {
697 pid_t pid = fork();
698 ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
699 if (pid == 0) {
700 // child: server
701 int exitCode = 0;
702 int ret = SelectServerForFork(15);
703 if (ret != 0) {
704 printf("[select server]run fail\n");
705 exitCode = 1;
706 }
707 printf("[select server]ret[%d]\n", ret);
708 exit(exitCode);
709 } else {
710 // parent: client
711 sleep(2);
712 int ret;
713 pthread_t pCli[4];
714 int interval[4] = {2, 1, 3, 1};
715 for (int i = 0; i < 4; i++) {
716 ret = pthread_create(&pCli[i], nullptr, CommTcpClientTask, &interval[i]);
717 EXPECT_EQ(0, ret) << "Errinfo:pthread_create index is [" << i << "]";
718 }
719
720 void *rst = nullptr;
721 for (int i = 0; i < 4; i++) {
722 ret = pthread_join(pCli[i], &rst);
723 EXPECT_EQ(0, ret) << "Errinfo:pthread_join index is [" << i << "]";
724 if (rst != nullptr) {
725 printf("[test select]client thread[%d] return[%d]\n", i, *((int *)rst));
726 EXPECT_EQ(0, *((int *)rst));
727 free(rst);
728 }
729 }
730 int exitCode;
731 int procStat = WaitProcessExit(pid, &exitCode);
732 ASSERT_EQ(1, procStat);
733 ASSERT_EQ(0, exitCode);
734 }
735 }
736
737 /**
738 * @tc.number : SUB_COMMUNICATION_LWIP_SDK_0700
739 * @tc.name : test socket operation
740 * @tc.desc : [C- SOFTWARE -0200]
741 */
742 HWTEST_F(ActsLwipTest, testSocketOpt, Function | MediumTest | Level2)
743 {
744 socklen_t len;
745 struct timeval timeout = {0};
746 int fd = socket(AF_INET, SOCK_STREAM, 0);
747 EXPECT_NE(-1, fd);
748
749 int error = -1;
750 len = sizeof(error);
751 int ret = getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len);
752 EXPECT_EQ(0, ret);
753 EXPECT_EQ(0, error);
754
755 len = sizeof(timeout);
756 ret = getsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, &len);
757 EXPECT_EQ(0, ret);
758
759 timeout.tv_sec = 1000;
760 len = sizeof(timeout);
761 ret = setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, len);
762 EXPECT_EQ(0, ret);
763
764 memset_s(&timeout, len, 0, len);
765 ret = getsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, &len);
766 EXPECT_EQ(0, ret);
767 EXPECT_EQ(1000, timeout.tv_sec);
768
769 int flag = 1;
770 ret = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag));
771 EXPECT_EQ(0, ret);
772
773 flag = 0;
774 len = sizeof(flag);
775 ret = getsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &flag, &len);
776 EXPECT_EQ(0, ret);
777 EXPECT_EQ(1, flag);
778
779 error = -1;
780 len = sizeof(error);
781 ret = getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len);
782 EXPECT_EQ(0, ret);
783 EXPECT_EQ(0, error);
784
785 ret = close(fd);
786 EXPECT_EQ(0, ret);
787 }
788
789 /**
790 * @tc.number : SUB_COMMUNICATION_LWIP_SDK_0800
791 * @tc.name : test getsockname and getpeername invalid input
792 * @tc.desc : [C- SOFTWARE -0200]
793 */
794 HWTEST_F(ActsLwipTest, testGetSocketNameInvalidInput, Function | MediumTest | Level3)
795 {
796 struct sockaddr addr = {0};
797 socklen_t addrLen = sizeof(addr);
798 int ret = getsockname(-1, &addr, &addrLen);
799 EXPECT_EQ(-1, ret);
800 ret = getpeername(-1, &addr, &addrLen);
801 EXPECT_EQ(-1, ret);
802 ret = getsockname(0, &addr, &addrLen);
803 EXPECT_EQ(-1, ret);
804 ret = getpeername(0, &addr, &addrLen);
805 EXPECT_EQ(-1, ret);
806 ret = getsockname(1, &addr, &addrLen);
807 EXPECT_EQ(-1, ret);
808 ret = getpeername(1, &addr, &addrLen);
809 EXPECT_EQ(-1, ret);
810 ret = getsockname(130, &addr, &addrLen);
811 EXPECT_EQ(-1, ret);
812 ret = getpeername(130, &addr, &addrLen);
813 EXPECT_EQ(-1, ret);
814 ret = getsockname(10, nullptr, &addrLen);
815 EXPECT_EQ(-1, ret);
816 ret = getpeername(10, nullptr, &addrLen);
817 EXPECT_EQ(-1, ret);
818 ret = getsockname(10, &addr, nullptr);
819 EXPECT_EQ(-1, ret);
820 ret = getpeername(10, &addr, nullptr);
821 EXPECT_EQ(-1, ret);
822 }
823
824 /**
825 * @tc.number : SUB_COMMUNICATION_LWIP_SDK_0900
826 * @tc.name : test inet_pton IPv4 normal
827 * @tc.desc : [C- SOFTWARE -0200]
828 */
829 HWTEST_F(ActsLwipTest, testInetPtonIpv4Normal, Function | MediumTest | Level2)
830 {
831 int ret;
832 struct in_addr rst = {0};
833 char cpAddrs[4][16] = {"10.58.212.100", "0.0.0.0", "255.0.0.0", "255.255.255.255"};
834 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
835 unsigned int expectLittle[4] = {1691630090, 0, 255, 4294967295};
836 #else
837 unsigned int expectBig[4] = {171627620, 0, 4278190080, 4294967295};
838 #endif
839
840 for (int i = 0; i < 4; i++) {
841 ret = inet_pton(AF_INET, cpAddrs[i], &rst);
842 EXPECT_EQ(1, ret);
843 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
844 EXPECT_EQ(expectLittle[i], rst.s_addr);
845 #else
846 EXPECT_EQ(expectBig[i], rst.s_addr);
847 #endif
848 printf("inet_pton %s: un[%u],s[%d],hex[%x]\n", cpAddrs[i], rst.s_addr, rst.s_addr, rst.s_addr);
849 }
850 }
851
852 /**
853 * @tc.number : SUB_COMMUNICATION_LWIP_SDK_1000
854 * @tc.name : test inet_pton IPv4 abnormal
855 * @tc.desc : [C- SOFTWARE -0200]
856 */
857 HWTEST_F(ActsLwipTest, testInetPtonIpv4Abnormal, Function | MediumTest | Level2)
858 {
859 int ret;
860 struct in_addr rst = {0};
861 char cpAddrs[6][16] = {"256.0.0.1", "a.a.a.a", "....", "#", "127.0.0.f", "0:0:0:0:0:0:0:1"};
862 for (int i = 0; i < 6; i++) {
863 ret = inet_pton(AF_INET, cpAddrs[i], &rst);
864 EXPECT_EQ(0, ret) << "ErrInfo:inet_pton abnormal [" << cpAddrs[i] << "]";
865 }
866 }
867
868 /**
869 * @tc.number : SUB_COMMUNICATION_LWIP_SDK_1100
870 * @tc.name : test inet_pton IPv6 normal
871 * @tc.desc : [C- SOFTWARE -0200]
872 */
873 HWTEST_F(ActsLwipTest, testInetPtonIpv6Normal, Function | MediumTest | Level2)
874 {
875 int ret;
876 struct in6_addr rst = {0};
877 char cpAddrs[6][40] = {"fc00:0101:0011:0011:0011:0011:0011:0011", "0:0:0:0:0:0:0:0",
878 "FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF", "::", "1::", "fc00:0011:0011:0011:0011:11:11:11"};
879 for (int i = 0; i < 6; i++) {
880 ret = inet_pton(AF_INET6, cpAddrs[i], &rst);
881 EXPECT_EQ(1, ret) << "ErrInfo:inet_pton [" << cpAddrs[i] << "]";
882 }
883 }
884
885 /**
886 * @tc.number : SUB_COMMUNICATION_LWIP_SDK_1200
887 * @tc.name : test inet_pton IPv6 abnormal
888 * @tc.desc : [C- SOFTWARE -0200]
889 */
890 HWTEST_F(ActsLwipTest, testInetPtonIpv6Abnormal, Function | MediumTest | Level2)
891 {
892 int ret;
893 struct in6_addr rst = {0};
894 char cpAddrs[7][40] = {"127.0.0.1", "f", ":", "0:0", "1:::", ":::::::",
895 "1111:1111:1111:1111:1111:1111:1111:111G"};
896 for (int i = 0; i < 7; i++) {
897 ret = inet_pton(AF_INET6, cpAddrs[i], &rst);
898 EXPECT_EQ(0, ret) << "ErrInfo:inet_pton abnormal [" << cpAddrs[i] << "]";
899 }
900 }
901
902 /**
903 * @tc.number : SUB_COMMUNICATION_LWIP_SDK_1300
904 * @tc.name : test inet_pton with invalid family
905 * @tc.desc : [C- SOFTWARE -0200]
906 */
907 HWTEST_F(ActsLwipTest, testInetPtonInvalidFamily, Function | MediumTest | Level2)
908 {
909 struct in_addr rst = {0};
910 int ret = inet_pton(AF_IPX, "127.0.0.1", &rst);
911 EXPECT_EQ(-1, ret);
912 ret = inet_pton(-1, "127.0.0.1", &rst);
913 EXPECT_EQ(-1, ret);
914 }
915
916 /**
917 * @tc.number : SUB_COMMUNICATION_LWIP_SDK_1400
918 * @tc.name : test inet_ntop IPv4 normal
919 * @tc.desc : [C- SOFTWARE -0200]
920 */
921 HWTEST_F(ActsLwipTest, testInetNtopIpv4Normal, Function | MediumTest | Level2)
922 {
923 const char* ret = nullptr;
924 struct in_addr inputAddr = {0};
925 char rstBuff[INET_ADDRSTRLEN];
926 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
927 unsigned int inputLittle[4] = {0x64d43a0a, 0, 255, 4294967295};
928 #else
929 unsigned int inputBig[4] = {171627620, 0, 4278190080, 4294967295};
930 #endif
931
932 char expectAddrs[4][16] = {"10.58.212.100", "0.0.0.0", "255.0.0.0", "255.255.255.255"};
933 for (int i = 0; i < 4; i++) {
934 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
935 inputAddr.s_addr = inputLittle[i];
936 #else
937 inputAddr.s_addr = inputBig[i];
938 #endif
939 ret = inet_ntop(AF_INET, &inputAddr, rstBuff, sizeof(rstBuff));
940 ASSERT_NE(ret, nullptr);
941 printf("inet_ntop expect [%s]: ret[%s], buf[%s]\n", expectAddrs[i], ret, rstBuff);
942 EXPECT_STREQ(expectAddrs[i], ret);
943 EXPECT_STREQ(expectAddrs[i], rstBuff);
944 }
945 }
946
947 /**
948 * @tc.number : SUB_COMMUNICATION_LWIP_SDK_1500
949 * @tc.name : test inet_ntop IPv4 boundary input
950 * @tc.desc : [C- SOFTWARE -0200]
951 */
952 HWTEST_F(ActsLwipTest, testInetNtopIpv4Abnormal, Function | MediumTest | Level2)
953 {
954 const char* ret = nullptr;
955 struct in_addr inputAddr = {0};
956 char rstBuff[INET_ADDRSTRLEN];
957 char expectStr[2][16] = {"255.255.255.255", "0.0.0.0"};
958 for (int i = 0; i < 2; i++) {
959 inputAddr.s_addr = (i == 0 ? -1 : 4294967296);
960 ret = inet_ntop(AF_INET, &inputAddr, rstBuff, sizeof(rstBuff));
961 ASSERT_TRUE(ret != NULL);
962 EXPECT_STREQ(expectStr[i], ret);
963 EXPECT_STREQ(expectStr[i], rstBuff);
964 }
965 }
966
967 /**
968 * @tc.number : SUB_COMMUNICATION_LWIP_SDK_1600
969 * @tc.name : test inet_ntop IPv6 normal
970 * @tc.desc : [C- SOFTWARE -0200]
971 */
972 HWTEST_F(ActsLwipTest, testInetNtopIpv6Normal, Function | MediumTest | Level2)
973 {
974 int iret;
975 const char* ret = nullptr;
976 struct in6_addr inputAddr = {0};
977 char rstBuff[INET6_ADDRSTRLEN];
978 char inputAddrs[6][40] = {"fc00:0101:0011:0011:0011:0011:0011:0011", "0:0:0:0:0:0:0:0",
979 "FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF", "::", "1::", "fc00:0011:0011:0011:1100:11:11:11"};
980 char expectAddrs[6][40] = {"fc00:101:11:11:11:11:11:11", "::",
981 "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", "::", "1::", "fc00:11:11:11:1100:11:11:11"};
982 for (int i = 0; i < 6; i++) {
983 iret = inet_pton(AF_INET6, inputAddrs[i], &inputAddr);
984 ASSERT_EQ(1, iret);
985 ret = inet_ntop(AF_INET6, &inputAddr, rstBuff, sizeof(rstBuff));
986 if (ret == nullptr) {
987 EXPECT_TRUE(ret != NULL) << "ErrInfo:inet_ntop NULL [" << expectAddrs[i] << "]";
988 } else {
989 printf("inet_ntop expect [%s]: ret[%s], buf[%s]\n", expectAddrs[i], ret, rstBuff);
990 EXPECT_STREQ(expectAddrs[i], ret);
991 EXPECT_STREQ(expectAddrs[i], rstBuff);
992 }
993 }
994 }
995
996 /**
997 * @tc.number : SUB_COMMUNICATION_LWIP_SDK_1700
998 * @tc.name : test inet_ntop IPv6 boundary input
999 * @tc.desc : [C- SOFTWARE -0200]
1000 */
1001 HWTEST_F(ActsLwipTest, testInetNtopIpv6Abnormal, Function | MediumTest | Level2)
1002 {
1003 const char* ret = nullptr;
1004 struct in6_addr inputAddr = {0};
1005 char rstBuff[INET6_ADDRSTRLEN];
1006 char expectStr[2][40] = {"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", "::"};
1007 for (int i = 0; i < 2; i++) {
1008 for (int j = 0; j < 16; j++) {
1009 inputAddr.s6_addr[j] = (i == 0 ? -1 : 256);
1010 }
1011 ret = inet_ntop(AF_INET6, &inputAddr, rstBuff, sizeof(rstBuff));
1012 ASSERT_TRUE(ret != NULL);
1013 EXPECT_STREQ(expectStr[i], ret);
1014 EXPECT_STREQ(expectStr[i], rstBuff);
1015 }
1016 }
1017
1018 /**
1019 * @tc.number : SUB_COMMUNICATION_LWIP_SDK_1800
1020 * @tc.name : test inet_ntop with invalid family
1021 * @tc.desc : [C- SOFTWARE -0200]
1022 */
1023 HWTEST_F(ActsLwipTest, testInetNtopInvalidFamily, Function | MediumTest | Level2)
1024 {
1025 int iret;
1026 const char* ret = nullptr;
1027 struct in6_addr inputAddr = {0};
1028 char rstBuff[INET6_ADDRSTRLEN];
1029
1030 iret = inet_pton(AF_INET6, "1::", &inputAddr);
1031 ASSERT_EQ(1, iret);
1032 ret = inet_ntop(AF_IPX, &inputAddr, rstBuff, sizeof(rstBuff));
1033 EXPECT_TRUE(ret == NULL);
1034 ret = inet_ntop(-1, &inputAddr, rstBuff, sizeof(rstBuff));
1035 EXPECT_TRUE(ret == NULL);
1036 }
1037
1038 /**
1039 * @tc.number : SUB_COMMUNICATION_LWIP_SDK_1900
1040 * @tc.name : test invalid parameter
1041 * @tc.desc : [C- SOFTWARE -0200]
1042 */
1043 HWTEST_F(ActsLwipTest, testInvalidParameter, Function | MediumTest | Level3)
1044 {
1045 int ret;
1046 int fdFail = -1;
1047 int fdSuccess = -1;
1048
1049 fdFail = socket(0, 0, 0);
1050 EXPECT_EQ(-1, fdFail);
1051 fdSuccess = socket(AF_INET, SOCK_STREAM, 0);
1052 EXPECT_NE(-1, fdSuccess);
1053
1054 ret = ::bind(fdFail, nullptr, sizeof(struct sockaddr_in));
1055 EXPECT_EQ(-1, ret);
1056 ret = ::bind(fdSuccess, nullptr, sizeof(struct sockaddr_in));
1057 EXPECT_EQ(-1, ret);
1058
1059 ret = connect(fdFail, nullptr, sizeof(struct sockaddr));
1060 EXPECT_EQ(-1, ret);
1061 ret = connect(fdSuccess, nullptr, sizeof(struct sockaddr));
1062 EXPECT_EQ(-1, ret);
1063
1064 ret = accept(fdFail, nullptr, nullptr);
1065 EXPECT_EQ(-1, ret);
1066 ret = accept(fdSuccess, nullptr, nullptr);
1067 EXPECT_EQ(-1, ret);
1068
1069 ret = getsockname(fdFail, nullptr, nullptr);
1070 EXPECT_EQ(-1, ret);
1071 ret = getsockname(fdSuccess, nullptr, nullptr);
1072 EXPECT_EQ(-1, ret);
1073
1074 ret = getpeername(fdFail, nullptr, nullptr);
1075 EXPECT_EQ(-1, ret);
1076 ret = getpeername(fdSuccess, nullptr, nullptr);
1077 EXPECT_EQ(-1, ret);
1078
1079 ret = send(fdFail, nullptr, strlen(g_srvMsg), 0);
1080 EXPECT_EQ(-1, ret);
1081 ret = send(fdSuccess, nullptr, strlen(g_srvMsg), 0);
1082 EXPECT_EQ(-1, ret);
1083
1084 ret = sendto(fdFail, nullptr, strlen(g_srvMsg), 0, nullptr, (socklen_t)sizeof(struct sockaddr_in));
1085 EXPECT_EQ(-1, ret);
1086 ret = sendto(fdSuccess, nullptr, strlen(g_srvMsg), 0, nullptr, (socklen_t)sizeof(struct sockaddr_in));
1087 EXPECT_EQ(-1, ret);
1088
1089 ret = recv(fdFail, nullptr, strlen(g_srvMsg), 0);
1090 EXPECT_EQ(-1, ret);
1091 ret = recv(fdSuccess, nullptr, strlen(g_srvMsg), 0);
1092 EXPECT_EQ(-1, ret);
1093
1094 struct msghdr msg = {0};
1095 ret = recvmsg(fdFail, &msg, 0);
1096 EXPECT_EQ(-1, ret);
1097 ret = recvmsg(fdSuccess, &msg, 0);
1098 EXPECT_EQ(-1, ret);
1099
1100 ret = recvfrom(fdFail, nullptr, strlen(g_srvMsg), 0, nullptr, nullptr);
1101 EXPECT_EQ(-1, ret);
1102 ret = recvfrom(fdSuccess, nullptr, strlen(g_srvMsg), 0, nullptr, nullptr);
1103 EXPECT_EQ(-1, ret);
1104
1105 ret = setsockopt(fdFail, SOL_SOCKET, SO_RCVTIMEO, nullptr, (socklen_t)sizeof(struct timeval));
1106 EXPECT_EQ(-1, ret);
1107 ret = setsockopt(fdSuccess, SOL_SOCKET, SO_RCVTIMEO, nullptr, (socklen_t)sizeof(struct timeval));
1108 EXPECT_EQ(-1, ret);
1109 ret = getsockopt(fdFail, SOL_SOCKET, SO_RCVTIMEO, nullptr, (socklen_t*)sizeof(struct timeval));
1110 EXPECT_EQ(-1, ret);
1111 ret = getsockopt(fdSuccess, SOL_SOCKET, SO_RCVTIMEO, nullptr, (socklen_t*)sizeof(struct timeval));
1112 EXPECT_EQ(-1, ret);
1113
1114 ret = sendmsg(fdFail, nullptr, 0);
1115 EXPECT_EQ(-1, ret);
1116 ret = sendmsg(fdSuccess, nullptr, 0);
1117 EXPECT_EQ(-1, ret);
1118
1119 ret = listen(fdFail, 0);
1120 EXPECT_EQ(-1, ret);
1121 ret = select(fdFail, nullptr, nullptr, nullptr, nullptr);
1122 EXPECT_EQ(-1, ret);
1123
1124 ret = shutdown(fdFail, SHUT_RD);
1125 EXPECT_EQ(-1, ret);
1126 ret = shutdown(fdSuccess, -1);
1127 EXPECT_EQ(-1, ret);
1128
1129 ret = close(fdSuccess);
1130 EXPECT_EQ(0, ret);
1131 }
1132