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