• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }