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