|  | // Copyright 2019 The Fuchsia Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "addr.h" | 
|  |  | 
|  | #include <gtest/gtest.h> | 
|  |  | 
|  | TEST(AddrTest, TestInAddr) { | 
|  | InAddr addr; | 
|  | EXPECT_FALSE(addr.IsSet()); | 
|  | EXPECT_EQ(addr.Name(), "<unspec>"); | 
|  | EXPECT_TRUE(addr.Set("192.168.0.1")); | 
|  | EXPECT_TRUE(addr.IsAddr4()); | 
|  | EXPECT_EQ(addr.Name(), "192.168.0.1"); | 
|  | union { | 
|  | uint8_t b[4]; | 
|  | uint32_t x; | 
|  | } ip4 = {{192, 168, 0, 1}}; | 
|  | EXPECT_EQ(addr.GetAddr4().s_addr, ip4.x); | 
|  | EXPECT_TRUE(addr.Set("FF01:0:0:0:0:0:0:1")); | 
|  | EXPECT_TRUE(addr.IsAddr6()); | 
|  | EXPECT_EQ(addr.Name(), "[FF01:0:0:0:0:0:0:1]"); | 
|  | const uint8_t cmp[] = {0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 
|  | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}; | 
|  | EXPECT_EQ(memcmp(addr.GetAddr6().s6_addr, cmp, 16), 0); | 
|  | EXPECT_TRUE(addr.Set("null")); | 
|  | EXPECT_FALSE(addr.IsSet()); | 
|  | EXPECT_TRUE(addr.Set("any")); | 
|  | EXPECT_TRUE(addr.IsAddr4()); | 
|  | EXPECT_EQ(addr.GetAddr4().s_addr, 0u); | 
|  | EXPECT_TRUE(addr.Set("any6")); | 
|  | EXPECT_TRUE(addr.IsAddr6()); | 
|  | const uint8_t zeros[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 
|  | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; | 
|  | EXPECT_EQ(memcmp(addr.GetAddr6().s6_addr, zeros, 16), 0); | 
|  |  | 
|  | EXPECT_FALSE(addr.Set("bad")); | 
|  | EXPECT_FALSE(addr.Set("192.168.0.")); | 
|  | EXPECT_FALSE(addr.Set("FF01::jk")); | 
|  | } | 
|  |  | 
|  | TEST(AddrTest, LocalIfAddr) { | 
|  | LocalIfAddr addr; | 
|  | EXPECT_FALSE(addr.IsSet()); | 
|  | EXPECT_FALSE(addr.HasAddr4()); | 
|  | EXPECT_FALSE(addr.HasAddr6()); | 
|  | EXPECT_FALSE(addr.HasId()); | 
|  | EXPECT_TRUE(addr.Set("192.168.0.1%2")); | 
|  | EXPECT_TRUE(addr.HasAddr4()); | 
|  | EXPECT_TRUE(addr.HasId()); | 
|  | EXPECT_EQ(addr.Name(), "192.168.0.1%2"); | 
|  | EXPECT_EQ(addr.GetId(), 2); | 
|  | EXPECT_TRUE(addr.Set("192.168.0.1")); | 
|  | EXPECT_TRUE(addr.HasAddr4()); | 
|  | EXPECT_FALSE(addr.HasId()); | 
|  | EXPECT_EQ(addr.Name(), "192.168.0.1"); | 
|  | EXPECT_TRUE(addr.Set("FF01:0:0:0:0:0:0:1%3")); | 
|  | EXPECT_TRUE(addr.HasAddr6()); | 
|  | EXPECT_TRUE(addr.HasId()); | 
|  | EXPECT_EQ(addr.GetId(), 3); | 
|  | EXPECT_EQ(addr.Name(), "[FF01:0:0:0:0:0:0:1]%3"); | 
|  | EXPECT_FALSE(addr.Set("192.168.0.1%abc")); | 
|  | } | 
|  |  | 
|  | TEST(AddrTest, SockAddrIn) { | 
|  | SockAddrIn addr; | 
|  | EXPECT_TRUE(addr.Set("192.168.0.1:2020")); | 
|  | EXPECT_EQ(addr.Name(), "192.168.0.1:2020"); | 
|  | struct sockaddr_storage store {}; | 
|  | auto* sock = reinterpret_cast<struct sockaddr*>(&store); | 
|  | int l = sizeof(store); | 
|  | EXPECT_TRUE(addr.Fill(sock, &l)); | 
|  | EXPECT_EQ(sock->sa_family, AF_INET); | 
|  | union { | 
|  | uint8_t b[4]; | 
|  | uint32_t x; | 
|  | } ip4 = {{192, 168, 0, 1}}; | 
|  | auto* addr_in = reinterpret_cast<struct sockaddr_in*>(&store); | 
|  | EXPECT_EQ(addr_in->sin_addr.s_addr, ip4.x); | 
|  | EXPECT_EQ(addr_in->sin_port, htons(2020)); | 
|  | EXPECT_TRUE(addr.Set("[FF01:0:0:0:0:0:0:1]:4040")); | 
|  | EXPECT_EQ(addr.Name(), "[FF01:0:0:0:0:0:0:1]:4040"); | 
|  | l = sizeof(store); | 
|  | EXPECT_TRUE(addr.Fill(sock, &l)); | 
|  | auto* addr_in6 = reinterpret_cast<struct sockaddr_in6*>(&store); | 
|  | const uint8_t cmp[] = {0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 
|  | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}; | 
|  | EXPECT_EQ(memcmp(addr_in6->sin6_addr.s6_addr, cmp, 16), 0); | 
|  | EXPECT_EQ(addr_in6->sin6_port, htons(4040)); | 
|  | } |