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