blob: 5e0b92f24628a2fc2053fc8d3a4302e872edae3f [file] [log] [blame]
// 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));
}