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 }