1 /*
2 * Copyright (C) 2023 Huawei Device Co., Ltd.
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 #include <gtest/gtest.h>
16 #include <gmock/gmock.h>
17 #include <unistd.h>
18 #include <fcntl.h>
19 #include <cstddef>
20 #include <cstdint>
21 #include <sys/stat.h>
22 #include <sys/socket.h>
23 #include <linux/rtnetlink.h>
24 #include <netinet/in.h>
25 #include <arpa/inet.h>
26 #include "securec.h"
27 #include "dhcp_logger.h"
28 #include "dhcp_function.h"
29 #include "dhcp_ipv6_client.h"
30
31 DEFINE_DHCPLOG_DHCP_LABEL("DhcpIpv6ClientTest");
32
33 using ::testing::_;
34 using ::testing::AtLeast;
35 using ::testing::DoAll;
36 using ::testing::Eq;
37 using ::testing::Ref;
38 using ::testing::Return;
39 using ::testing::SetArgReferee;
40 using ::testing::StrEq;
41 using ::testing::TypedEq;
42 using ::testing::ext::TestSize;
43
44 namespace OHOS {
45 namespace DHCP {
46 const int KERNEL_SOCKET_IFA_FAMILY = 10;
47 constexpr unsigned int IPV6_SCOPE_NODELOCAL = 0x01;
48 constexpr unsigned int IPV6_SCOPE_LINKLOCAL = 0x02;
49 constexpr unsigned int IPV6_SCOPE_SITELOCAL = 0x05;
50 constexpr unsigned int IPV6_SCOPE_OTHER = 0x08;
51 constexpr unsigned int PRE_FIX_LEN = 12;
52 constexpr unsigned int PRE_FIX_ADDRSTRLEN = 128;
53 constexpr int IPV6_RETURN_ZERO = 0x00000;
54 constexpr int IPV6_RETURN_65552 = 0x10010;
55 constexpr int IPV6_RETURN_131101 = 0x20020;
56 constexpr int IPV6_RETURN_1327744 = 0x50040;
57 constexpr int IPV6_RETURN_524288 = 0x80000;
58 constexpr int IPV6_RETURN_32 = 0x0020U;
59 constexpr int IPV6_OPT_FAILED = -1;
60 constexpr int IPV6_LEN_134 = 134;
61 constexpr int IPV6_LEN_24 = 24;
62 constexpr int IPV6_LEN_16 = 16;
63 constexpr int IPV6_LEN_10 = 10;
64 constexpr int BUF_LEN = 1024;
65 constexpr int BUF_LEN_2 = 2;
66 constexpr int DATA_SIZE = 8;
67 class DhcpIpv6ClientTest : public testing::Test {
68 public:
SetUpTestCase()69 static void SetUpTestCase()
70 {
71 }
TearDownTestCase()72 static void TearDownTestCase()
73 {
74 }
SetUp()75 virtual void SetUp()
76 {
77 std::string ifname = "wlan0";
78 ipv6Client = std::make_unique<OHOS::DHCP::DhcpIpv6Client>(ifname);
79 }
TearDown()80 virtual void TearDown()
81 {
82 if (ipv6Client != nullptr) {
83 ipv6Client.reset(nullptr);
84 }
85 }
86 public:
87 std::unique_ptr<OHOS::DHCP::DhcpIpv6Client> ipv6Client;
88 };
89
HWTEST_F(DhcpIpv6ClientTest, IsRunningTest, TestSize.Level1)90 HWTEST_F(DhcpIpv6ClientTest, IsRunningTest, TestSize.Level1)
91 {
92 ASSERT_TRUE(ipv6Client != nullptr);
93 DHCP_LOGE("IsRunningTest enter!");
94 ipv6Client->IsRunning();
95 }
96
HWTEST_F(DhcpIpv6ClientTest, DhcpIPV6StopTest, TestSize.Level1)97 HWTEST_F(DhcpIpv6ClientTest, DhcpIPV6StopTest, TestSize.Level1)
98 {
99 ASSERT_TRUE(ipv6Client != nullptr);
100 DHCP_LOGE("DhcpIPV6StopTest enter!");
101 ipv6Client->DhcpIPV6Stop();
102 }
103
HWTEST_F(DhcpIpv6ClientTest, ResetTest, TestSize.Level1)104 HWTEST_F(DhcpIpv6ClientTest, ResetTest, TestSize.Level1)
105 {
106 ASSERT_TRUE(ipv6Client != nullptr);
107 DHCP_LOGE("ResetTest enter!");
108 ipv6Client->Reset();
109 }
110
HWTEST_F(DhcpIpv6ClientTest, ipv6AddrScope2TypeTest, TestSize.Level1)111 HWTEST_F(DhcpIpv6ClientTest, ipv6AddrScope2TypeTest, TestSize.Level1)
112 {
113 ASSERT_TRUE(ipv6Client != nullptr);
114 DHCP_LOGE("ipv6AddrScope2TypeTest enter!");
115 EXPECT_EQ(IPV6_RETURN_65552, ipv6Client->ipv6AddrScope2Type(IPV6_SCOPE_NODELOCAL));
116 EXPECT_EQ(IPV6_RETURN_131101, ipv6Client->ipv6AddrScope2Type(IPV6_SCOPE_LINKLOCAL));
117 EXPECT_EQ(IPV6_RETURN_1327744, ipv6Client->ipv6AddrScope2Type(IPV6_SCOPE_SITELOCAL));
118 EXPECT_EQ(IPV6_RETURN_524288, ipv6Client->ipv6AddrScope2Type(IPV6_SCOPE_OTHER));
119 }
120
HWTEST_F(DhcpIpv6ClientTest, getAddrTypeTest, TestSize.Level1)121 HWTEST_F(DhcpIpv6ClientTest, getAddrTypeTest, TestSize.Level1)
122 {
123 ASSERT_TRUE(ipv6Client != nullptr);
124 DHCP_LOGE("getAddrTypeTest enter!");
125 struct in6_addr addr;
126 EXPECT_EQ(IPV6_RETURN_32, ipv6Client->getAddrType(nullptr));
127 EXPECT_EQ(IPV6_RETURN_ZERO, ipv6Client->getAddrType(&addr));
128 }
129
HWTEST_F(DhcpIpv6ClientTest, getAddrTypeTest1, TestSize.Level1)130 HWTEST_F(DhcpIpv6ClientTest, getAddrTypeTest1, TestSize.Level1)
131 {
132 ASSERT_TRUE(ipv6Client != nullptr);
133 DHCP_LOGE("getAddrTypeTest1 enter!");
134 struct in6_addr addr;
135 ipv6Client->getAddrType(&addr);
136
137 inet_pton(AF_INET6, "2001:0db8:85a3:0000:0000:8a2e:0370:7334", &addr);
138 ipv6Client->getAddrType(&addr);
139
140 inet_pton(AF_INET6, "ff02:0000:0000:0000:0000:0000:0000:0001", &addr);
141 ipv6Client->getAddrType(&addr);
142
143 inet_pton(AF_INET6, "fe80::", &addr);
144 ipv6Client->getAddrType(&addr);
145
146 inet_pton(AF_INET6, "fec0::", &addr);
147 ipv6Client->getAddrType(&addr);
148
149 inet_pton(AF_INET6, "::", &addr);
150 ipv6Client->getAddrType(&addr);
151
152 inet_pton(AF_INET6, "::1", &addr);
153 ipv6Client->getAddrType(&addr);
154
155 inet_pton(AF_INET6, "::ffff:192.0.2.128", &addr);
156 ipv6Client->getAddrType(&addr);
157
158 inet_pton(AF_INET6, "::ffff:192.0.2.128", &addr);
159 ipv6Client->getAddrType(&addr);
160 }
161
HWTEST_F(DhcpIpv6ClientTest, getAddrScopeTest, TestSize.Level1)162 HWTEST_F(DhcpIpv6ClientTest, getAddrScopeTest, TestSize.Level1)
163 {
164 ASSERT_TRUE(ipv6Client != nullptr);
165 DHCP_LOGE("getAddrScopeTest enter!");
166 struct in6_addr addr;
167 EXPECT_EQ(IPV6_RETURN_32, ipv6Client->getAddrScope(nullptr));
168 EXPECT_EQ(IPV6_RETURN_ZERO, ipv6Client->getAddrScope(&addr));
169 }
170
HWTEST_F(DhcpIpv6ClientTest, createKernelSocketTest, TestSize.Level1)171 HWTEST_F(DhcpIpv6ClientTest, createKernelSocketTest, TestSize.Level1)
172 {
173 ASSERT_TRUE(ipv6Client != nullptr);
174 DHCP_LOGE("createKernelSocketTest enter!");
175 ipv6Client->createKernelSocket();
176 }
177
HWTEST_F(DhcpIpv6ClientTest, GetIpv6PrefixTest, TestSize.Level1)178 HWTEST_F(DhcpIpv6ClientTest, GetIpv6PrefixTest, TestSize.Level1)
179 {
180 ASSERT_TRUE(ipv6Client != nullptr);
181 DHCP_LOGE("GetIpv6PrefixTest enter!");
182 char ipv6Addr[] = "192.168.1.10";
183 char ipv6PrefixBuf[] = "192.168.1.12";
184 ipv6Client->GetIpv6Prefix(nullptr, ipv6PrefixBuf, PRE_FIX_LEN);
185 ipv6Client->GetIpv6Prefix(ipv6Addr, nullptr, PRE_FIX_LEN);
186 ipv6Client->GetIpv6Prefix(ipv6Addr, ipv6PrefixBuf, PRE_FIX_ADDRSTRLEN);
187 ipv6Client->GetIpv6Prefix(ipv6Addr, ipv6PrefixBuf, PRE_FIX_LEN);
188 }
189
HWTEST_F(DhcpIpv6ClientTest, GetIpFromS6AddressTest, TestSize.Level1)190 HWTEST_F(DhcpIpv6ClientTest, GetIpFromS6AddressTest, TestSize.Level1)
191 {
192 ASSERT_TRUE(ipv6Client != nullptr);
193 DHCP_LOGE("GetIpFromS6AddressTest enter!");
194 char addr[] = "192.168.1.12";
195 char buf[BUF_LEN] = {0};
196 EXPECT_EQ(ipv6Client->GetIpFromS6Address(addr, 1, buf, BUF_LEN), IPV6_OPT_FAILED);
197 EXPECT_EQ(ipv6Client->GetIpFromS6Address(addr, 1, buf, BUF_LEN_2), IPV6_OPT_FAILED);
198 }
199
HWTEST_F(DhcpIpv6ClientTest, onIpv6AddressAddEventTest, TestSize.Level1)200 HWTEST_F(DhcpIpv6ClientTest, onIpv6AddressAddEventTest, TestSize.Level1)
201 {
202 ASSERT_TRUE(ipv6Client != nullptr);
203 DHCP_LOGE("onIpv6AddressAddEventTest enter!");
204 char data[] = "192.168.1.12";
205 ipv6Client->onIpv6AddressAddEvent(static_cast<void *>(data), PRE_FIX_LEN, 1);
206 ipv6Client->onIpv6AddressAddEvent(nullptr, PRE_FIX_LEN, 0);
207 ipv6Client->onIpv6AddressAddEvent(nullptr, PRE_FIX_LEN, 41);
208 }
209
HWTEST_F(DhcpIpv6ClientTest, onIpv6DnsAddEventTest, TestSize.Level1)210 HWTEST_F(DhcpIpv6ClientTest, onIpv6DnsAddEventTest, TestSize.Level1)
211 {
212 ASSERT_TRUE(ipv6Client != nullptr);
213 DHCP_LOGE("onIpv6DnsAddEventTest enter!");
214 char data[] = "192.168.1.12";
215 ipv6Client->onIpv6DnsAddEvent(static_cast<void *>(data), PRE_FIX_LEN, 1);
216 ipv6Client->onIpv6DnsAddEvent(nullptr, PRE_FIX_LEN, 0);
217 ipv6Client->onIpv6DnsAddEvent(nullptr, PRE_FIX_LEN, 41);
218 ipv6Client->onIpv6DnsAddEvent(static_cast<void *>(data), PRE_FIX_LEN, 41);
219 }
220
HWTEST_F(DhcpIpv6ClientTest, onIpv6RouteAddEventTest, TestSize.Level1)221 HWTEST_F(DhcpIpv6ClientTest, onIpv6RouteAddEventTest, TestSize.Level1)
222 {
223 ASSERT_TRUE(ipv6Client != nullptr);
224 DHCP_LOGE("onIpv6RouteAddEventTest enter!");
225 char gateway[] = "192.168.1.1";
226 char dst[] = "192.168.1.2";
227 ipv6Client->onIpv6RouteAddEvent(gateway, dst, 1);
228 ipv6Client->onIpv6RouteAddEvent(nullptr, dst, 41);
229 ipv6Client->onIpv6RouteAddEvent(gateway, nullptr, 41);
230 ipv6Client->onIpv6RouteAddEvent(gateway, dst, 41);
231 }
232
HWTEST_F(DhcpIpv6ClientTest, getIpv6RouteAddrTest, TestSize.Level1)233 HWTEST_F(DhcpIpv6ClientTest, getIpv6RouteAddrTest, TestSize.Level1)
234 {
235 ASSERT_TRUE(ipv6Client != nullptr);
236 DHCP_LOGE("getIpv6RouteAddrTest enter!");
237 ipv6Client->getIpv6RouteAddr();
238 }
239
HWTEST_F(DhcpIpv6ClientTest, setSocketFilterTest, TestSize.Level1)240 HWTEST_F(DhcpIpv6ClientTest, setSocketFilterTest, TestSize.Level1)
241 {
242 ASSERT_TRUE(ipv6Client != nullptr);
243 DHCP_LOGE("setSocketFilterTest enter!");
244 char addr[] = "192.168.1.2";
245 ipv6Client->setSocketFilter(nullptr);
246 ipv6Client->setSocketFilter(static_cast<void *>(addr));
247 }
248
HWTEST_F(DhcpIpv6ClientTest, parseNdUserOptMessageTest, TestSize.Level1)249 HWTEST_F(DhcpIpv6ClientTest, parseNdUserOptMessageTest, TestSize.Level1)
250 {
251 ASSERT_TRUE(ipv6Client != nullptr);
252 DHCP_LOGE("parseNdUserOptMessageTest enter!");
253 struct nduseroptmsg data;
254 data.nduseropt_opts_len = IPV6_LEN_16;
255 data.nduseropt_family = IPV6_LEN_10;
256 data.nduseropt_icmp_type = IPV6_LEN_134;
257 data.nduseropt_icmp_code = IPV6_RETURN_ZERO;
258 ipv6Client->parseNdUserOptMessage(nullptr, IPV6_LEN_24);
259 ipv6Client->parseNdUserOptMessage(static_cast<void *>(&data), IPV6_LEN_24);
260
261 data.nduseropt_opts_len = IPV6_LEN_24;
262 ipv6Client->parseNdUserOptMessage(static_cast<void *>(&data), IPV6_LEN_16);
263
264 data.nduseropt_opts_len = IPV6_LEN_16;
265 data.nduseropt_family = IPV6_LEN_16;
266 ipv6Client->parseNdUserOptMessage(static_cast<void *>(&data), IPV6_LEN_24);
267
268 data.nduseropt_opts_len = IPV6_LEN_16;
269 data.nduseropt_family = IPV6_LEN_10;
270 data.nduseropt_icmp_type = IPV6_LEN_16;
271 data.nduseropt_icmp_code = IPV6_LEN_16;
272 ipv6Client->parseNdUserOptMessage(static_cast<void *>(&data), IPV6_LEN_24);
273
274 data.nduseropt_opts_len = IPV6_LEN_16;
275 data.nduseropt_family = IPV6_LEN_10;
276 data.nduseropt_icmp_type = IPV6_LEN_134;
277 data.nduseropt_icmp_code = IPV6_LEN_16;
278 ipv6Client->parseNdUserOptMessage(static_cast<void *>(&data), IPV6_LEN_24);
279 }
280
HWTEST_F(DhcpIpv6ClientTest, parseNDRouteMessageTest, TestSize.Level1)281 HWTEST_F(DhcpIpv6ClientTest, parseNDRouteMessageTest, TestSize.Level1)
282 {
283 ASSERT_TRUE(ipv6Client != nullptr);
284 DHCP_LOGE("parseNDRouteMessageTest enter!");
285 struct nlmsghdr msg;
286 ipv6Client->parseNDRouteMessage(nullptr);
287 ipv6Client->parseNDRouteMessage(static_cast<void *>(&msg));
288 }
289
HWTEST_F(DhcpIpv6ClientTest, ParseNDRouteMessage_TEST1, TestSize.Level1)290 HWTEST_F(DhcpIpv6ClientTest, ParseNDRouteMessage_TEST1, TestSize.Level1)
291 {
292 ASSERT_TRUE(ipv6Client != nullptr);
293 DHCP_LOGE("ParseNDRouteMessage_TEST1 enter!");
294 nlmsghdr hdrMsg;
295 rtmsg rtMsg;
296 hdrMsg.nlmsg_len = sizeof(rtmsg);
297 rtMsg.rtm_protocol = RTPROT_BOOT;
298 rtMsg.rtm_scope = RT_SCOPE_SITE;
299 rtMsg.rtm_type = RTN_MULTICAST;
300 rtMsg.rtm_src_len = 1;
301 rtMsg.rtm_flags = RTM_F_PREFIX;
302 ipv6Client->parseNDRouteMessage(&hdrMsg);
303 }
304
HWTEST_F(DhcpIpv6ClientTest, ParseNDRouteMessage_TEST2, TestSize.Level1)305 HWTEST_F(DhcpIpv6ClientTest, ParseNDRouteMessage_TEST2, TestSize.Level1)
306 {
307 ASSERT_TRUE(ipv6Client != nullptr);
308 DHCP_LOGE("ParseNDRouteMessage_TEST2 enter!");
309 nlmsghdr hdrMsg;
310 rtmsg rtMsg;
311 hdrMsg.nlmsg_len = sizeof(rtmsg);
312 rtMsg.rtm_protocol = RTPROT_KERNEL;
313 rtMsg.rtm_scope = RT_SCOPE_UNIVERSE;
314 rtMsg.rtm_type = RTN_UNICAST;
315 rtMsg.rtm_src_len = 0;
316 rtMsg.rtm_flags = 0;
317 ipv6Client->parseNDRouteMessage(&hdrMsg);
318 }
319
HWTEST_F(DhcpIpv6ClientTest, parseNewneighMessageTest, TestSize.Level1)320 HWTEST_F(DhcpIpv6ClientTest, parseNewneighMessageTest, TestSize.Level1)
321 {
322 ASSERT_TRUE(ipv6Client != nullptr);
323 DHCP_LOGE("parseNewneighMessageTest enter!");
324 struct nlmsghdr msg;
325 ipv6Client->parseNewneighMessage(nullptr);
326 ipv6Client->parseNewneighMessage(static_cast<void *>(&msg));
327 }
328
HWTEST_F(DhcpIpv6ClientTest, ParseNewneighMessage_Test, TestSize.Level1)329 HWTEST_F(DhcpIpv6ClientTest, ParseNewneighMessage_Test, TestSize.Level1)
330 {
331 ASSERT_TRUE(ipv6Client != nullptr);
332 DHCP_LOGE("ParseNewneighMessage_Test enter!");
333 void* msg = new char[sizeof(nlmsghdr) + sizeof(ndmsg) + sizeof(rtattr) + sizeof(in6_addr)];
334 nlmsghdr* nlh = reinterpret_cast<nlmsghdr*>(msg);
335 ndmsg* ndm = reinterpret_cast<ndmsg*>((char*)msg + sizeof(nlmsghdr));
336 rtattr* rta = reinterpret_cast<rtattr*>((char*)msg + sizeof(nlmsghdr) + sizeof(ndmsg));
337 in6_addr* addr = reinterpret_cast<in6_addr*>((char*)msg + sizeof(nlmsghdr) + sizeof(ndmsg) + sizeof(rtattr));
338 nlh->nlmsg_type = RTM_NEWNEIGH;
339 ndm->ndm_family = KERNEL_SOCKET_IFA_FAMILY;
340 ndm->ndm_state = NUD_REACHABLE;
341 rta->rta_type = NDA_DST;
342 rta->rta_len = sizeof(rtattr) + sizeof(in6_addr);
343 ipv6Client->parseNewneighMessage(msg);
344 }
345
HWTEST_F(DhcpIpv6ClientTest, fillRouteDataTest, TestSize.Level1)346 HWTEST_F(DhcpIpv6ClientTest, fillRouteDataTest, TestSize.Level1)
347 {
348 ASSERT_TRUE(ipv6Client != nullptr);
349 DHCP_LOGE("fillRouteDataTest enter!");
350 int len = 0;
351 char buf[BUF_LEN] = {0};
352 ipv6Client->fillRouteData(nullptr, len);
353 ipv6Client->fillRouteData(buf, len);
354 }
355
HWTEST_F(DhcpIpv6ClientTest, handleKernelEventTest, TestSize.Level1)356 HWTEST_F(DhcpIpv6ClientTest, handleKernelEventTest, TestSize.Level1)
357 {
358 ASSERT_TRUE(ipv6Client != nullptr);
359 DHCP_LOGE("handleKernelEventTest enter!");
360 uint8_t data[] = "testcode";
361 ipv6Client->handleKernelEvent(nullptr, 0);
362 ipv6Client->handleKernelEvent(data, 1);
363 ipv6Client->handleKernelEvent(data, DATA_SIZE);
364 }
365
HWTEST_F(DhcpIpv6ClientTest, AddIpv6AddressTest, TestSize.Level1)366 HWTEST_F(DhcpIpv6ClientTest, AddIpv6AddressTest, TestSize.Level1)
367 {
368 DHCP_LOGI("AddIpv6Address enter!");
369 int len = 0;
370 ipv6Client->AddIpv6Address(nullptr, len);
371 EXPECT_EQ(0, len);
372 }
373
HWTEST_F(DhcpIpv6ClientTest, AddIpv6AddressTest1, TestSize.Level1)374 HWTEST_F(DhcpIpv6ClientTest, AddIpv6AddressTest1, TestSize.Level1)
375 {
376 DHCP_LOGI("AddIpv6Address1 enter!");
377 char ipv6Addr[128] = "1001:0db8:85a3:0000:0000:8a2e:0370:7334";
378 int len = DHCP_INET6_ADDRSTRLEN - 1;
379 ipv6Client->AddIpv6Address(nullptr, len);
380 EXPECT_EQ(127, len);
381 }
382
HWTEST_F(DhcpIpv6ClientTest, IsEui64ModeIpv6AddressTest, TestSize.Level1)383 HWTEST_F(DhcpIpv6ClientTest, IsEui64ModeIpv6AddressTest, TestSize.Level1)
384 {
385 DHCP_LOGI("IsEui64ModeIpv6AddressTest enter!");
386 char data[] = "2408:8471:a02:8fc0:200:52ff:fe5d:003b";
387 EXPECT_EQ(ipv6Client->IsEui64ModeIpv6Address(nullptr, 0), false);
388 EXPECT_EQ(ipv6Client->IsEui64ModeIpv6Address(data, PRE_FIX_ADDRSTRLEN), false);
389 }
390 }
391 }
392