1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "platform/impl/socket_address_posix.h"
6 
7 #include "gmock/gmock.h"
8 #include "gtest/gtest.h"
9 
10 namespace openscreen {
11 
TEST(SocketAddressPosixTest,IPv4SocketAddressConvertsSuccessfully)12 TEST(SocketAddressPosixTest, IPv4SocketAddressConvertsSuccessfully) {
13   const SocketAddressPosix address(IPEndpoint{{1, 2, 3, 4}, 80});
14 
15   const sockaddr_in* v4_address =
16       reinterpret_cast<const sockaddr_in*>(address.address());
17 
18   EXPECT_EQ(v4_address->sin_family, AF_INET);
19   EXPECT_EQ(v4_address->sin_port, ntohs(80));
20 
21   // 67305985 == 1.2.3.4 in network byte order
22   EXPECT_EQ(v4_address->sin_addr.s_addr, 67305985u);
23 
24   EXPECT_EQ(address.version(), IPAddress::Version::kV4);
25 }
26 
TEST(SocketAddressPosixTest,IPv6SocketAddressConvertsSuccessfully)27 TEST(SocketAddressPosixTest, IPv6SocketAddressConvertsSuccessfully) {
28   const SocketAddressPosix address(IPEndpoint{
29       {0x0102, 0x0304, 0x0506, 0x0708, 0x090a, 0x0b0c, 0x0d0e, 0x0f10}, 80});
30 
31   const sockaddr_in6* v6_address =
32       reinterpret_cast<const sockaddr_in6*>(address.address());
33   EXPECT_EQ(v6_address->sin6_family, AF_INET6);
34   EXPECT_EQ(v6_address->sin6_port, ntohs(80));
35   EXPECT_EQ(v6_address->sin6_flowinfo, 0u);
36 
37   const unsigned char kExpectedAddress[16] = {1, 2,  3,  4,  5,  6,  7,  8,
38                                               9, 10, 11, 12, 13, 14, 15, 16};
39   EXPECT_THAT(v6_address->sin6_addr.s6_addr,
40               testing::ElementsAreArray(kExpectedAddress));
41   EXPECT_EQ(v6_address->sin6_scope_id, 0u);
42 
43   EXPECT_EQ(address.version(), IPAddress::Version::kV6);
44 }
45 
TEST(SocketAddressPosixTest,IPv4ConvertsSuccessfully)46 TEST(SocketAddressPosixTest, IPv4ConvertsSuccessfully) {
47   struct sockaddr_in address;
48   address.sin_family = AF_INET;
49   address.sin_port = ntohs(80);
50   address.sin_addr.s_addr = 67305985u;
51 
52   struct sockaddr* casted = reinterpret_cast<struct sockaddr*>(&address);
53   SocketAddressPosix address_posix(*casted);
54   const sockaddr_in* v4_address =
55       reinterpret_cast<const sockaddr_in*>(address_posix.address());
56 
57   EXPECT_EQ(v4_address->sin_family, address.sin_family);
58   EXPECT_EQ(v4_address->sin_port, address.sin_port);
59   EXPECT_EQ(v4_address->sin_addr.s_addr, address.sin_addr.s_addr);
60   IPEndpoint expected_address{{1, 2, 3, 4}, 80};
61   EXPECT_EQ(address_posix.endpoint(), expected_address);
62 }
63 
TEST(SocketAddressPosixTest,IPv6ConvertsSuccessfully)64 TEST(SocketAddressPosixTest, IPv6ConvertsSuccessfully) {
65   const unsigned char kExpectedAddress[16] = {1, 2,  3,  4,  5,  6,  7,  8,
66                                               9, 10, 11, 12, 13, 14, 15, 16};
67 
68   struct sockaddr_in6 address;
69   address.sin6_family = AF_INET6;
70   address.sin6_port = ntohs(80);
71   address.sin6_flowinfo = 0u;
72   address.sin6_scope_id = 0u;
73   memcpy(&address.sin6_addr.s6_addr, kExpectedAddress, 16);
74 
75   struct sockaddr* casted = reinterpret_cast<struct sockaddr*>(&address);
76   SocketAddressPosix address_posix(*casted);
77   const sockaddr_in6* v6_address =
78       reinterpret_cast<const sockaddr_in6*>(address_posix.address());
79 
80   EXPECT_EQ(v6_address->sin6_family, address.sin6_family);
81   EXPECT_EQ(v6_address->sin6_port, address.sin6_port);
82   EXPECT_EQ(v6_address->sin6_flowinfo, address.sin6_flowinfo);
83   EXPECT_EQ(v6_address->sin6_scope_id, address.sin6_scope_id);
84   EXPECT_THAT(v6_address->sin6_addr.s6_addr,
85               testing::ElementsAreArray(kExpectedAddress));
86   IPEndpoint expected_address{
87       {0x0102, 0x0304, 0x0506, 0x0708, 0x090a, 0x0b0c, 0x0d0e, 0x0f10}, 80};
88   EXPECT_EQ(address_posix.endpoint(), expected_address);
89 }
90 
91 }  // namespace openscreen
92