1 /*
2   Copyright (c) DataStax, Inc.
3 
4   Licensed under the Apache License, Version 2.0 (the "License");
5   you may not use this file except in compliance with the License.
6   You may obtain a copy of the License at
7 
8   http://www.apache.org/licenses/LICENSE-2.0
9 
10   Unless required by applicable law or agreed to in writing, software
11   distributed under the License is distributed on an "AS IS" BASIS,
12   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   See the License for the specific language governing permissions and
14   limitations under the License.
15 */
16 
17 #include <gtest/gtest.h>
18 
19 #include "address.hpp"
20 
21 using datastax::internal::core::Address;
22 using datastax::internal::core::AddressSet;
23 
TEST(AddressUnitTest,FromString)24 TEST(AddressUnitTest, FromString) {
25   EXPECT_TRUE(Address("127.0.0.1", 9042).is_resolved());
26   EXPECT_TRUE(Address("0.0.0.0", 9042).is_resolved());
27   EXPECT_TRUE(Address("::", 9042).is_resolved());
28   EXPECT_TRUE(Address("::1", 9042).is_resolved());
29   EXPECT_TRUE(Address("2001:0db8:85a3:0000:0000:8a2e:0370:7334", 9042).is_resolved());
30 
31   EXPECT_FALSE(Address().is_resolved());
32   EXPECT_FALSE(Address("localhost", 9042).is_resolved());
33   EXPECT_FALSE(Address("datastax.com", 9042).is_resolved());
34 }
35 
TEST(AddressUnitTest,CompareIPv4)36 TEST(AddressUnitTest, CompareIPv4) {
37   EXPECT_LT(Address("0.0.0.0", 9042), Address("255.255.255.255", 9042));
38   EXPECT_EQ(Address("1.2.3.4", 9042), Address("1.2.3.4", 9042));
39   EXPECT_NE(Address("1.2.3.4", 9042), Address("5.6.7.8", 9042));
40 
41   EXPECT_LT(Address("0.0.0.0", 9041), Address("0.0.0.0", 9042));
42   EXPECT_NE(Address("0.0.0.0", 9041), Address("0.0.0.0", 9042));
43 
44   // Without comparing port
45   EXPECT_TRUE(Address("0.0.0.0", 9041).equals(Address("0.0.0.0", 9042), false));
46   EXPECT_FALSE(Address("127.0.0.1", 9042).equals(Address("0.0.0.0", 9042), false));
47 }
48 
TEST(AddressUnitTest,CompareIPv6)49 TEST(AddressUnitTest, CompareIPv6) {
50   EXPECT_LT(Address("0:0:0:0:0:0:0:0", 9042), Address("0:0:0:0:0:0:0:FFFF", 9042));
51   EXPECT_EQ(Address("0:0:0:0:0:0:0:1234", 9042), Address("0:0:0:0:0:0:0:1234", 9042));
52   EXPECT_NE(Address("0:0:0:0:0:0:0:1234", 9042), Address("0:0:0:0:0:0:0:5678", 9042));
53 
54   EXPECT_LT(Address("0:0:0:0:0:0:0:0", 9041), Address("0:0:0:0:0:0:0:0", 9042));
55   EXPECT_NE(Address("0:0:0:0:0:0:0:0", 9041), Address("0:0:0:0:0:0:0:0", 9042));
56 
57   // Without comparing port
58   EXPECT_TRUE(Address("::", 9041).equals(Address("::", 9042), false));
59   EXPECT_FALSE(Address("::1", 9042).equals(Address("::", 9042), false));
60 
61   EXPECT_EQ(Address("0:0:0:0:0:0:0:0", 9042), Address("::", 9042)); // Normalization
62 }
63 
TEST(AddressUnitTest,ToSockAddrIPv4)64 TEST(AddressUnitTest, ToSockAddrIPv4) {
65   Address expected("127.0.0.1", 9042);
66   Address::SocketStorage storage;
67   Address actual(expected.to_sockaddr(&storage));
68   EXPECT_EQ(expected, actual);
69 }
70 
TEST(AddressUnitTest,ToSockAddrIPv6)71 TEST(AddressUnitTest, ToSockAddrIPv6) {
72   Address expected("::1", 9042);
73   Address::SocketStorage storage;
74   Address actual(expected.to_sockaddr(&storage));
75   EXPECT_EQ(expected, actual);
76 }
77 
TEST(AddressUnitTest,ToInetIPv4)78 TEST(AddressUnitTest, ToInetIPv4) {
79   Address expected("127.0.0.1", 9042);
80 
81   uint8_t inet_address[4];
82   uint8_t inet_address_length = expected.to_inet(inet_address);
83   EXPECT_EQ(inet_address_length, 4u);
84 
85   Address actual(inet_address, inet_address_length, 9042);
86   EXPECT_EQ(expected, actual);
87 }
88 
TEST(AddressUnitTest,ToInetIPv6)89 TEST(AddressUnitTest, ToInetIPv6) {
90   Address expected("::1", 9042);
91 
92   uint8_t inet_address[16];
93   uint8_t inet_address_length = expected.to_inet(inet_address);
94   EXPECT_EQ(inet_address_length, 16u);
95 
96   Address actual(inet_address, inet_address_length, 9042);
97   EXPECT_EQ(expected, actual);
98 }
99 
TEST(AddressUnitTest,ToString)100 TEST(AddressUnitTest, ToString) {
101   // Only hostname/address
102   EXPECT_EQ(Address("127.0.0.1", 9042).hostname_or_address(), "127.0.0.1");
103   EXPECT_EQ(Address("::1", 9042).hostname_or_address(), "::1");
104   EXPECT_EQ(Address("0:0:0:0:0:0:0:1", 9042).hostname_or_address(), "::1"); // IPv6 normalization
105   EXPECT_EQ(Address("0:0:0:0:0:0:0:0", 9042).hostname_or_address(), "::");  // IPv6 normalization
106   EXPECT_EQ(Address("datastax.com", 9042).hostname_or_address(), "datastax.com");
107 
108   // w/o port
109   EXPECT_EQ(Address("127.0.0.1", 9042).to_string(), "127.0.0.1");
110   EXPECT_EQ(Address("::1", 9042).to_string(), "::1");
111   EXPECT_EQ(Address("datastax.com", 9042).to_string(), "datastax.com");
112 
113   // w/ port
114   EXPECT_EQ(Address("127.0.0.1", 9042).to_string(true), "127.0.0.1:9042");
115   EXPECT_EQ(Address("::1", 9042).to_string(true), "[::1]:9042");
116   EXPECT_EQ(Address("datastax.com", 9042).to_string(true), "datastax.com:9042");
117 
118   // w/ servername
119   EXPECT_EQ(Address("127.0.0.1", 9042, "d1f1884b-6e05-4b3f-9e88-8a93904bb0e5").to_string(),
120             "127.0.0.1 (d1f1884b-6e05-4b3f-9e88-8a93904bb0e5)");
121   EXPECT_EQ(Address("::1", 9042, "d1f1884b-6e05-4b3f-9e88-8a93904bb0e5").to_string(),
122             "::1 (d1f1884b-6e05-4b3f-9e88-8a93904bb0e5)");
123   EXPECT_EQ(Address("datastax.com", 9042, "d1f1884b-6e05-4b3f-9e88-8a93904bb0e5").to_string(),
124             "datastax.com (d1f1884b-6e05-4b3f-9e88-8a93904bb0e5)");
125 
126   // w/ servername and port
127   EXPECT_EQ(Address("127.0.0.1", 9042, "d1f1884b-6e05-4b3f-9e88-8a93904bb0e5").to_string(true),
128             "127.0.0.1:9042 (d1f1884b-6e05-4b3f-9e88-8a93904bb0e5)");
129   EXPECT_EQ(Address("::1", 9042, "d1f1884b-6e05-4b3f-9e88-8a93904bb0e5").to_string(true),
130             "[::1]:9042 (d1f1884b-6e05-4b3f-9e88-8a93904bb0e5)");
131   EXPECT_EQ(Address("datastax.com", 9042, "d1f1884b-6e05-4b3f-9e88-8a93904bb0e5").to_string(true),
132             "datastax.com:9042 (d1f1884b-6e05-4b3f-9e88-8a93904bb0e5)");
133 }
134 
TEST(AddressUnitTest,Hash)135 TEST(AddressUnitTest, Hash) {
136   AddressSet set;
137 
138   EXPECT_EQ(set.size(), 0u); // Empty
139 
140   set.insert(Address("0.0.0.0", 9042));
141   EXPECT_EQ(set.size(), 1u); // Added
142 
143   // Reinsert
144   set.insert(Address("0.0.0.0", 9042));
145   EXPECT_EQ(set.size(), 1u); // No change
146 
147   // Remove
148   set.erase(Address("0.0.0.0", 9042));
149   EXPECT_EQ(set.size(), 0u); // Removed
150 
151   // Multiple
152   set.insert(Address("0.0.0.0", 9042));
153   set.insert(Address("127.0.0.1", 9042));
154   set.insert(Address("localhost", 9042));
155   set.insert(Address("::1", 9042));
156   EXPECT_EQ(set.size(), 4u); // Added
157   EXPECT_EQ(set.count(Address("0.0.0.0", 9042)), 1u);
158   EXPECT_EQ(set.count(Address("127.0.0.1", 9042)), 1u);
159   EXPECT_EQ(set.count(Address("localhost", 9042)), 1u);
160   EXPECT_EQ(set.count(Address("::1", 9042)), 1u);
161 
162   // Different port
163   set.insert(Address("0.0.0.0", 9041));
164   EXPECT_EQ(set.size(), 5u); // Added
165 }
166 
TEST(AddressUnitTest,StrictWeakOrder)167 TEST(AddressUnitTest, StrictWeakOrder) {
168   { // Family
169     Address a("localhost", 9042);
170     Address b("127.0.0.1", 30002, "a");
171     ASSERT_NE(a, b);
172     ASSERT_TRUE(a < b);
173     ASSERT_FALSE(b < a);
174   }
175 
176   { // Port
177     Address a("localhost", 9042, "b");
178     Address b("localhost", 30002, "a");
179     ASSERT_NE(a, b);
180     ASSERT_TRUE(a < b);
181     ASSERT_FALSE(b < a);
182   }
183 
184   { // Server name
185     Address a("127.0.0.2", 9042, "a");
186     Address b("127.0.0.1", 9042, "b");
187     ASSERT_NE(a, b);
188     ASSERT_TRUE(a < b);
189     ASSERT_FALSE(b < a);
190   }
191 
192   { // Hostname or address
193     Address a("127.0.0.1", 9042, "a");
194     Address b("127.0.0.2", 9042, "a");
195     ASSERT_NE(a, b);
196     ASSERT_TRUE(a < b);
197     ASSERT_FALSE(b < a);
198   }
199 }
200