| //===-- Unittests for netinet/in macro ------------------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "include/llvm-libc-macros/netinet-in-macros.h" | |
| #include "test/UnitTest/Test.h" | |
| TEST(LlvmLibcNetinetInTest, IN6Macro) { | |
| struct in6_addr addr = {}; | |
| const struct in6_addr *const_addr = &addr; | |
| EXPECT_TRUE(IN6_IS_ADDR_UNSPECIFIED(&addr)); | |
| EXPECT_TRUE(IN6_IS_ADDR_UNSPECIFIED(const_addr)); | |
| for (int i = 0; i < 16; ++i) { | |
| addr.s6_addr[i] = 1; | |
| EXPECT_FALSE(IN6_IS_ADDR_UNSPECIFIED(&addr)); | |
| addr.s6_addr[i] = 0; | |
| } | |
| EXPECT_FALSE(IN6_IS_ADDR_LOOPBACK(&addr)); | |
| addr.s6_addr[15] = 1; | |
| EXPECT_TRUE(IN6_IS_ADDR_LOOPBACK(&addr)); | |
| addr.s6_addr[15] = 0; | |
| EXPECT_FALSE(IN6_IS_ADDR_MULTICAST(&addr)); | |
| addr.s6_addr[0] = 0xff; | |
| EXPECT_TRUE(IN6_IS_ADDR_MULTICAST(&addr)); | |
| addr.s6_addr[0] = 0; | |
| addr.s6_addr[0] = 0xfe; | |
| addr.s6_addr[1] = 0x80; | |
| EXPECT_TRUE(IN6_IS_ADDR_LINKLOCAL(&addr)); | |
| addr.s6_addr[0] = 0xff; | |
| addr.s6_addr[1] = 0x80; | |
| EXPECT_FALSE(IN6_IS_ADDR_LINKLOCAL(&addr)); | |
| addr.s6_addr[0] = 0xfe; | |
| addr.s6_addr[1] = 0xc0; | |
| EXPECT_TRUE(IN6_IS_ADDR_SITELOCAL(&addr)); | |
| addr.s6_addr[0] = 0xff; | |
| addr.s6_addr[1] = 0x80; | |
| EXPECT_FALSE(IN6_IS_ADDR_SITELOCAL(&addr)); | |
| addr.s6_addr[0] = 0xff; | |
| addr.s6_addr[1] = 0x1; | |
| EXPECT_TRUE(IN6_IS_ADDR_MC_NODELOCAL(&addr)); | |
| addr.s6_addr[1] = 0x2; | |
| EXPECT_TRUE(IN6_IS_ADDR_MC_LINKLOCAL(&addr)); | |
| addr.s6_addr[1] = 0x5; | |
| EXPECT_TRUE(IN6_IS_ADDR_MC_SITELOCAL(&addr)); | |
| addr.s6_addr[1] = 0x8; | |
| EXPECT_TRUE(IN6_IS_ADDR_MC_ORGLOCAL(&addr)); | |
| addr.s6_addr[1] = 0xe; | |
| EXPECT_TRUE(IN6_IS_ADDR_MC_GLOBAL(&addr)); | |
| addr.s6_addr[1] = 0; | |
| addr.s6_addr[0] = 0; | |
| EXPECT_FALSE(IN6_IS_ADDR_V4MAPPED(&addr)); | |
| addr.s6_addr[10] = 0xff; | |
| addr.s6_addr[11] = 0xff; | |
| EXPECT_TRUE(IN6_IS_ADDR_V4MAPPED(&addr)); | |
| addr.s6_addr[10] = 0; | |
| addr.s6_addr[11] = 0; | |
| for (int i = 12; i < 16; ++i) { | |
| addr.s6_addr[i] ^= 42; | |
| EXPECT_TRUE(IN6_IS_ADDR_V4COMPAT(&addr)); | |
| addr.s6_addr[i] ^= 42; | |
| } | |
| for (int i = 0; i < 12; ++i) { | |
| addr.s6_addr[i] ^= 42; | |
| EXPECT_FALSE(IN6_IS_ADDR_V4COMPAT(&addr)); | |
| addr.s6_addr[i] ^= 42; | |
| } | |
| } |