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
32using namespace testing::ext;
33
34static const int MAX_SIZE = 128;
35
36class HatsSocketTest : public testing::Test {
37public:
38    static void SetUpTestCase();
39    static void TearDownTestCase();
40    void SetUp();
41    void TearDown();
42private:
43};
44void HatsSocketTest::SetUp()
45{
46}
47void HatsSocketTest::TearDown()
48{
49}
50void HatsSocketTest::SetUpTestCase()
51{
52}
53void HatsSocketTest::TearDownTestCase()
54{
55}
56
57struct 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
202struct 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 */
227HWTEST_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 */
249HWTEST_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}