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 90 HWTEST_F(DhcpIpv6ClientTest, IsRunningTest, TestSize.Level1) 91 { 92 ASSERT_TRUE(ipv6Client != nullptr); 93 DHCP_LOGE("IsRunningTest enter!"); 94 ipv6Client->IsRunning(); 95 } 96 97 HWTEST_F(DhcpIpv6ClientTest, DhcpIPV6StopTest, TestSize.Level1) 98 { 99 ASSERT_TRUE(ipv6Client != nullptr); 100 DHCP_LOGE("DhcpIPV6StopTest enter!"); 101 ipv6Client->DhcpIPV6Stop(); 102 } 103 104 HWTEST_F(DhcpIpv6ClientTest, ResetTest, TestSize.Level1) 105 { 106 ASSERT_TRUE(ipv6Client != nullptr); 107 DHCP_LOGE("ResetTest enter!"); 108 ipv6Client->Reset(); 109 } 110 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 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 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 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 171 HWTEST_F(DhcpIpv6ClientTest, createKernelSocketTest, TestSize.Level1) 172 { 173 ASSERT_TRUE(ipv6Client != nullptr); 174 DHCP_LOGE("createKernelSocketTest enter!"); 175 ipv6Client->createKernelSocket(); 176 } 177 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 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 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, 44); 208 } 209 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, 44); 218 ipv6Client->onIpv6DnsAddEvent(static_cast<void *>(data), PRE_FIX_LEN, 44); 219 } 220 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, 44); 229 ipv6Client->onIpv6RouteAddEvent(gateway, nullptr, 44); 230 ipv6Client->onIpv6RouteAddEvent(gateway, dst, 44); 231 } 232 233 HWTEST_F(DhcpIpv6ClientTest, getIpv6RouteAddrTest, TestSize.Level1) 234 { 235 ASSERT_TRUE(ipv6Client != nullptr); 236 DHCP_LOGE("getIpv6RouteAddrTest enter!"); 237 ipv6Client->getIpv6RouteAddr(); 238 } 239 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 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 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 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 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 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 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 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 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 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 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 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