1 /*
2 * Copyright (C) 2024 HiHope Open Source Organization.
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 <cerrno>
17 #include <cstdio>
18 #include <cstdlib>
19 #include <string>
20 #include <vector>
21 #include <fcntl.h>
22 #include <unistd.h>
23 #include <arpa/inet.h>
24 #include <gtest/gtest.h>
25 #include <linux/netlink.h>
26 #include <netinet/in.h>
27 #include <sys/stat.h>
28 #include <sys/socket.h>
29 #include <sys/types.h>
30 #include "securec.h"
31
32 using namespace testing::ext;
33
34 static const int MAX_SIZE = 128;
35 static const int ID_ONE = 88;
36 static const int ID_TWO = 98;
37
38 class HatsSocketTest : public testing::Test {
39 public:
40 static void SetUpTestCase();
41 static void TearDownTestCase();
42 void SetUp();
43 void TearDown();
44 private:
45 };
SetUp()46 void HatsSocketTest::SetUp()
47 {
48 }
TearDown()49 void HatsSocketTest::TearDown()
50 {
51 }
SetUpTestCase()52 void HatsSocketTest::SetUpTestCase()
53 {
54 }
TearDownTestCase()55 void HatsSocketTest::TearDownTestCase()
56 {
57 }
58
59 struct SetOptionSupportTest {
60 int id;
61 int domain;
62 int type;
63 int protocol;
64 } g_socketOpt[] = {
65 {0, AF_UNIX, SOCK_STREAM, NETLINK_ROUTE},
66 {1, AF_UNIX, SOCK_STREAM, IPPROTO_IP},
67 {2, AF_UNIX, SOCK_STREAM, IPPROTO_ICMP},
68 {3, AF_UNIX, SOCK_DGRAM, NETLINK_ROUTE},
69 {4, AF_UNIX, SOCK_DGRAM, IPPROTO_IP},
70 {5, AF_UNIX, SOCK_DGRAM, IPPROTO_ICMP},
71 {6, AF_UNIX, SOCK_SEQPACKET, NETLINK_ROUTE},
72 {7, AF_UNIX, SOCK_SEQPACKET, IPPROTO_IP},
73 {8, AF_UNIX, SOCK_SEQPACKET, IPPROTO_ICMP},
74 {10, AF_LOCAL, SOCK_STREAM, NETLINK_ROUTE},
75 {11, AF_LOCAL, SOCK_STREAM, IPPROTO_IP},
76 {12, AF_LOCAL, SOCK_STREAM, IPPROTO_ICMP},
77 {13, AF_LOCAL, SOCK_DGRAM, NETLINK_ROUTE},
78 {14, AF_LOCAL, SOCK_DGRAM, IPPROTO_IP},
79 {15, AF_LOCAL, SOCK_DGRAM, IPPROTO_ICMP},
80 {16, AF_LOCAL, SOCK_SEQPACKET, NETLINK_ROUTE},
81 {17, AF_LOCAL, SOCK_SEQPACKET, IPPROTO_IP},
82 {20, AF_LOCAL, SOCK_SEQPACKET, IPPROTO_ICMP},
83 {24, AF_INET, SOCK_STREAM, NETLINK_ROUTE},
84 {25, AF_INET, SOCK_STREAM, IPPROTO_IP},
85 {26, AF_INET, SOCK_STREAM, IPPROTO_TCP},
86 {27, AF_INET, SOCK_DGRAM, NETLINK_ROUTE},
87 {28, AF_INET, SOCK_DGRAM, IPPROTO_IP},
88 {29, AF_INET, SOCK_DGRAM, IPPROTO_ICMP},
89 {30, AF_INET, SOCK_DGRAM, IPPROTO_UDP},
90 {31, AF_INET, SOCK_RAW, NETLINK_FIREWALL},
91 {32, AF_INET, SOCK_RAW, NETLINK_SOCK_DIAG},
92 {33, AF_INET, SOCK_RAW, NETLINK_NFLOG},
93 {34, AF_INET, SOCK_RAW, NETLINK_AUDIT},
94 {35, AF_INET, SOCK_RAW, NETLINK_FIB_LOOKUP},
95 {36, AF_INET, SOCK_RAW, NETLINK_CONNECTOR},
96 {37, AF_INET, SOCK_RAW, NETLINK_NETFILTER},
97 {38, AF_INET, SOCK_RAW, NETLINK_KOBJECT_UEVENT},
98 {39, AF_INET, SOCK_RAW, NETLINK_GENERIC},
99 {40, AF_INET, SOCK_RAW, IPPROTO_ICMPV6},
100 {41, AF_INET, SOCK_RAW, IPPROTO_ICMP},
101 {42, AF_INET, SOCK_RAW, IPPROTO_TCP},
102 {43, AF_INET, SOCK_RAW, IPPROTO_UDP},
103 {44, AF_INET, SOCK_PACKET, NETLINK_ROUTE},
104 {45, AF_INET, SOCK_PACKET, NETLINK_FIREWALL},
105 {46, AF_INET, SOCK_PACKET, NETLINK_SOCK_DIAG},
106 {47, AF_INET, SOCK_PACKET, NETLINK_NFLOG},
107 {48, AF_INET, SOCK_PACKET, NETLINK_AUDIT},
108 {49, AF_INET, SOCK_PACKET, NETLINK_FIB_LOOKUP},
109 {50, AF_INET, SOCK_PACKET, NETLINK_CONNECTOR},
110 {51, AF_INET, SOCK_PACKET, NETLINK_NETFILTER},
111 {52, AF_INET, SOCK_PACKET, NETLINK_KOBJECT_UEVENT},
112 {53, AF_INET, SOCK_PACKET, NETLINK_GENERIC},
113 {54, AF_INET, SOCK_PACKET, IPPROTO_ICMPV6},
114 {55, AF_INET, SOCK_PACKET, IPPROTO_IP},
115 {56, AF_INET, SOCK_PACKET, IPPROTO_ICMP},
116 {57, AF_INET, SOCK_PACKET, IPPROTO_TCP},
117 {58, AF_INET, SOCK_PACKET, IPPROTO_UDP},
118 {59, AF_INET6, SOCK_STREAM, NETLINK_ROUTE},
119 {60, AF_INET6, SOCK_STREAM, IPPROTO_IP},
120 {61, AF_INET6, SOCK_STREAM, IPPROTO_TCP},
121 {62, AF_INET6, SOCK_DGRAM, NETLINK_ROUTE},
122 {63, AF_INET6, SOCK_DGRAM, IPPROTO_ICMPV6},
123 {64, AF_INET6, SOCK_DGRAM, IPPROTO_IP},
124 {65, AF_INET6, SOCK_DGRAM, IPPROTO_UDP},
125 {66, AF_INET6, SOCK_RAW, NETLINK_FIREWALL},
126 {67, AF_INET6, SOCK_RAW, NETLINK_SOCK_DIAG},
127 {68, AF_INET6, SOCK_RAW, NETLINK_NFLOG},
128 {69, AF_INET6, SOCK_RAW, NETLINK_AUDIT},
129 {70, AF_INET6, SOCK_RAW, NETLINK_FIB_LOOKUP},
130 {71, AF_INET6, SOCK_RAW, NETLINK_CONNECTOR},
131 {72, AF_INET6, SOCK_RAW, NETLINK_NETFILTER},
132 {73, AF_INET6, SOCK_RAW, NETLINK_KOBJECT_UEVENT},
133 {74, AF_INET6, SOCK_RAW, NETLINK_GENERIC},
134 {75, AF_INET6, SOCK_RAW, IPPROTO_ICMPV6},
135 {76, AF_INET6, SOCK_RAW, IPPROTO_ICMP},
136 {77, AF_INET6, SOCK_RAW, IPPROTO_TCP},
137 {78, AF_INET6, SOCK_RAW, IPPROTO_UDP},
138 {79, AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE},
139 {80, AF_NETLINK, SOCK_DGRAM, NETLINK_SOCK_DIAG},
140 {81, AF_NETLINK, SOCK_DGRAM, NETLINK_AUDIT},
141 {82, AF_NETLINK, SOCK_DGRAM, NETLINK_FIB_LOOKUP},
142 {84, AF_NETLINK, SOCK_DGRAM, NETLINK_NETFILTER},
143 {85, AF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT},
144 {86, AF_NETLINK, SOCK_DGRAM, NETLINK_GENERIC},
145 {87, AF_NETLINK, SOCK_DGRAM, IPPROTO_IP},
146 {88, AF_NETLINK, SOCK_DGRAM, NETLINK_XFRM},
147 {89, AF_NETLINK, SOCK_RAW, NETLINK_ROUTE},
148 {90, AF_NETLINK, SOCK_RAW, NETLINK_SOCK_DIAG},
149 {91, AF_NETLINK, SOCK_RAW, NETLINK_AUDIT},
150 {92, AF_NETLINK, SOCK_RAW, NETLINK_FIB_LOOKUP},
151 {94, AF_NETLINK, SOCK_RAW, NETLINK_NETFILTER},
152 {95, AF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT},
153 {96, AF_NETLINK, SOCK_RAW, NETLINK_GENERIC},
154 {97, AF_NETLINK, SOCK_RAW, IPPROTO_IP},
155 {98, AF_NETLINK, SOCK_RAW, NETLINK_XFRM},
156 {99, AF_PACKET, SOCK_DGRAM, NETLINK_ROUTE},
157 {110, AF_PACKET, SOCK_DGRAM, NETLINK_FIREWALL},
158 {111, AF_PACKET, SOCK_DGRAM, NETLINK_SOCK_DIAG},
159 {112, AF_PACKET, SOCK_DGRAM, NETLINK_NFLOG},
160 {113, AF_PACKET, SOCK_DGRAM, NETLINK_AUDIT},
161 {114, AF_PACKET, SOCK_DGRAM, NETLINK_FIB_LOOKUP},
162 {115, AF_PACKET, SOCK_DGRAM, NETLINK_CONNECTOR},
163 {116, AF_PACKET, SOCK_DGRAM, NETLINK_NETFILTER},
164 {117, AF_PACKET, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT},
165 {118, AF_PACKET, SOCK_DGRAM, NETLINK_GENERIC},
166 {119, AF_PACKET, SOCK_DGRAM, IPPROTO_ICMPV6},
167 {120, AF_PACKET, SOCK_DGRAM, IPPROTO_IP},
168 {121, AF_PACKET, SOCK_DGRAM, IPPROTO_ICMP},
169 {122, AF_PACKET, SOCK_DGRAM, IPPROTO_TCP},
170 {123, AF_PACKET, SOCK_DGRAM, IPPROTO_UDP},
171 {124, AF_PACKET, SOCK_RAW, NETLINK_ROUTE},
172 {125, AF_PACKET, SOCK_RAW, NETLINK_FIREWALL},
173 {126, AF_PACKET, SOCK_RAW, NETLINK_SOCK_DIAG},
174 {127, AF_PACKET, SOCK_RAW, NETLINK_NFLOG},
175 {128, AF_PACKET, SOCK_RAW, NETLINK_AUDIT},
176 {129, AF_PACKET, SOCK_RAW, NETLINK_FIB_LOOKUP},
177 {130, AF_PACKET, SOCK_RAW, NETLINK_CONNECTOR},
178 {131, AF_PACKET, SOCK_RAW, NETLINK_NETFILTER},
179 {132, AF_PACKET, SOCK_RAW, NETLINK_KOBJECT_UEVENT},
180 {133, AF_PACKET, SOCK_RAW, NETLINK_GENERIC},
181 {134, AF_PACKET, SOCK_RAW, IPPROTO_ICMPV6},
182 {135, AF_PACKET, SOCK_RAW, IPPROTO_IP},
183 {136, AF_PACKET, SOCK_RAW, IPPROTO_ICMP},
184 {137, AF_PACKET, SOCK_RAW, IPPROTO_TCP},
185 {138, AF_PACKET, SOCK_RAW, IPPROTO_UDP},
186 {139, AF_PACKET, SOCK_PACKET, NETLINK_ROUTE},
187 {140, AF_PACKET, SOCK_PACKET, NETLINK_FIREWALL},
188 {141, AF_PACKET, SOCK_PACKET, NETLINK_SOCK_DIAG},
189 {142, AF_PACKET, SOCK_PACKET, NETLINK_NFLOG},
190 {143, AF_PACKET, SOCK_PACKET, NETLINK_AUDIT},
191 {144, AF_PACKET, SOCK_PACKET, NETLINK_FIB_LOOKUP},
192 {145, AF_PACKET, SOCK_PACKET, NETLINK_CONNECTOR},
193 {146, AF_PACKET, SOCK_PACKET, NETLINK_NETFILTER},
194 {147, AF_PACKET, SOCK_PACKET, NETLINK_KOBJECT_UEVENT},
195 {148, AF_PACKET, SOCK_PACKET, NETLINK_GENERIC},
196 {149, AF_PACKET, SOCK_PACKET, IPPROTO_ICMPV6},
197 {150, AF_PACKET, SOCK_PACKET, IPPROTO_IP},
198 {151, AF_PACKET, SOCK_PACKET, IPPROTO_ICMP},
199 {152, AF_PACKET, SOCK_PACKET, IPPROTO_TCP},
200 {153, AF_PACKET, SOCK_PACKET, IPPROTO_UDP},
201 {154, AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, NETLINK_ROUTE},
202 };
203
204 struct SocketPairOptionSupportTest {
205 int id;
206 int domain;
207 int type;
208 } g_socketPairOpt[] = {
209 {1, AF_UNIX, SOCK_STREAM},
210 {2, AF_UNIX, SOCK_DGRAM},
211 {3, AF_UNIX, SOCK_SEQPACKET},
212 {4, AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK},
213 {5, AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC},
214 {6, AF_LOCAL, SOCK_STREAM},
215 {7, AF_LOCAL, SOCK_DGRAM},
216 {8, AF_LOCAL, SOCK_SEQPACKET},
217 {9, AF_LOCAL, SOCK_STREAM | SOCK_NONBLOCK},
218 {10, AF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC},
219 };
220
221 /*
222 * @tc.number : SUB_KERNEL_SYSCALL_SOCKET_0100
223 * @tc.name : SocketCreateFdSuccess_0001
224 * @tc.desc : socket create fd success.
225 * @tc.size : MediumTest
226 * @tc.type : Function
227 * @tc.level : Level 1
228 */
229 HWTEST_F(HatsSocketTest, SocketCreateFdSuccess_0001, Function | MediumTest | Level1)
230 {
231 int i;
232 int socketFd = -1;
233 const string path = "/proc/sys/net/core/xfrm_acq_expires";
234 for (i = 0; i < sizeof(g_socketOpt) / sizeof(g_socketOpt[0]); i++) {
235 if ((g_socketOpt[i].id == ID_ONE || g_socketOpt[i].id == ID_TWO) && access(path.c_str(), F_OK) == -1) {
236 continue;
237 }
238 socketFd = socket(g_socketOpt[i].domain, g_socketOpt[i].type, g_socketOpt[i].protocol);
239 if (socketFd <= 0) {
240 printf("id = %d\n", g_socketOpt[i].id);
241 printf("err = %s\n", strerror(errno));
242 }
243 EXPECT_TRUE(socketFd > 0);
244 close(socketFd);
245 }
246 }
247
248 /*
249 * @tc.number : SUB_KERNEL_SYSCALL_SOCKETPAIR_0200
250 * @tc.name : SocketpairCreateSuccess_0002
251 * @tc.desc : socketpair create success.
252 * @tc.size : MediumTest
253 * @tc.type : Function
254 * @tc.level : Level 1
255 */
256 HWTEST_F(HatsSocketTest, SocketpairCreateSuccess_0002, Function | MediumTest | Level1)
257 {
258 int i;
259 int ret;
260 ssize_t size;
261 char buf[MAX_SIZE] = {0};
262 int socketPair[2];
263 const char *content = "Hello, world!";
264
265 for (i = 0; i < sizeof(g_socketPairOpt) / sizeof(g_socketPairOpt[0]); i++) {
266 ret = socketpair(g_socketPairOpt[i].domain, g_socketPairOpt[i].type, 0, socketPair);
267 if (ret < 0) {
268 printf("id = %d, ret = %d\n", g_socketPairOpt[i].id, ret);
269 }
270 EXPECT_EQ(ret, 0);
271
272 size = write(socketPair[0], content, strlen(content));
273 EXPECT_EQ(size, strlen(content));
274
275 read(socketPair[1], buf, MAX_SIZE);
276 EXPECT_EQ(size, strlen(content));
277 EXPECT_STREQ(buf, content);
278
279 close(socketPair[0]);
280 close(socketPair[1]);
281 }
282 }