1 #include "node_sockaddr-inl.h"
2 #include "gtest/gtest.h"
3
4 using node::SocketAddress;
5 using node::SocketAddressBlockList;
6 using node::SocketAddressLRU;
7
TEST(SocketAddress,SocketAddress)8 TEST(SocketAddress, SocketAddress) {
9 CHECK(SocketAddress::is_numeric_host("123.123.123.123"));
10 CHECK(!SocketAddress::is_numeric_host("localhost"));
11
12 sockaddr_storage storage;
13 sockaddr_storage storage2;
14 SocketAddress::ToSockAddr(AF_INET, "123.123.123.123", 443, &storage);
15 SocketAddress::ToSockAddr(AF_INET, "1.1.1.1", 80, &storage2);
16
17 SocketAddress addr(reinterpret_cast<const sockaddr*>(&storage));
18 SocketAddress addr2(reinterpret_cast<const sockaddr*>(&storage2));
19
20 CHECK_EQ(addr.length(), sizeof(sockaddr_in));
21 CHECK_EQ(addr.family(), AF_INET);
22 CHECK_EQ(addr.address(), "123.123.123.123");
23 CHECK_EQ(addr.port(), 443);
24
25 addr.set_flow_label(12345);
26 CHECK_EQ(addr.flow_label(), 0);
27
28 CHECK_NE(addr, addr2);
29 CHECK_EQ(addr, addr);
30
31 CHECK_EQ(SocketAddress::Hash()(addr), SocketAddress::Hash()(addr));
32 CHECK_NE(SocketAddress::Hash()(addr), SocketAddress::Hash()(addr2));
33
34 addr.Update(reinterpret_cast<uint8_t*>(&storage2), sizeof(sockaddr_in));
35 CHECK_EQ(addr.length(), sizeof(sockaddr_in));
36 CHECK_EQ(addr.family(), AF_INET);
37 CHECK_EQ(addr.address(), "1.1.1.1");
38 CHECK_EQ(addr.port(), 80);
39
40 SocketAddress::Map<size_t> map;
41 map[addr]++;
42 map[addr]++;
43 CHECK_EQ(map[addr], 2);
44 }
45
TEST(SocketAddress,SocketAddressIPv6)46 TEST(SocketAddress, SocketAddressIPv6) {
47 sockaddr_storage storage;
48 SocketAddress::ToSockAddr(AF_INET6, "::1", 443, &storage);
49
50 SocketAddress addr(reinterpret_cast<const sockaddr*>(&storage));
51
52 CHECK_EQ(addr.length(), sizeof(sockaddr_in6));
53 CHECK_EQ(addr.family(), AF_INET6);
54 CHECK_EQ(addr.address(), "::1");
55 CHECK_EQ(addr.port(), 443);
56
57 addr.set_flow_label(12345);
58 CHECK_EQ(addr.flow_label(), 12345);
59 }
60
TEST(SocketAddressLRU,SocketAddressLRU)61 TEST(SocketAddressLRU, SocketAddressLRU) {
62 struct Foo {
63 int c;
64 bool expired;
65 };
66
67 struct FooLRUTraits {
68 using Type = Foo;
69
70 static bool CheckExpired(const SocketAddress& address, const Type& type) {
71 return type.expired;
72 }
73
74 static void Touch(const SocketAddress& address, Type* type) {
75 type->expired = false;
76 }
77 };
78
79 SocketAddressLRU<FooLRUTraits> lru(2);
80
81 sockaddr_storage storage[4];
82
83 SocketAddress::ToSockAddr(AF_INET, "123.123.123.123", 443, &storage[0]);
84 SocketAddress::ToSockAddr(AF_INET, "123.123.123.124", 443, &storage[1]);
85 SocketAddress::ToSockAddr(AF_INET, "123.123.123.125", 443, &storage[2]);
86 SocketAddress::ToSockAddr(AF_INET, "123.123.123.123", 443, &storage[3]);
87
88
89 SocketAddress addr1(reinterpret_cast<const sockaddr*>(&storage[0]));
90 SocketAddress addr2(reinterpret_cast<const sockaddr*>(&storage[1]));
91 SocketAddress addr3(reinterpret_cast<const sockaddr*>(&storage[2]));
92 SocketAddress addr4(reinterpret_cast<const sockaddr*>(&storage[3]));
93
94 Foo* foo = lru.Upsert(addr1);
95 CHECK_NOT_NULL(foo);
96 CHECK_EQ(foo->c, 0);
97 CHECK_EQ(foo->expired, false);
98
99 foo->c = 1;
100 foo->expired = true;
101
102 foo = lru.Upsert(addr1);
103 CHECK_NOT_NULL(lru.Peek(addr1));
104 CHECK_EQ(lru.Peek(addr1), lru.Peek(addr4));
105 CHECK_EQ(lru.Peek(addr1)->c, 1);
106 CHECK_EQ(lru.Peek(addr1)->expired, false);
107 CHECK_EQ(lru.size(), 1);
108
109 foo = lru.Upsert(addr2);
110 foo->c = 2;
111 foo->expired = true;
112 CHECK_NOT_NULL(lru.Peek(addr2));
113 CHECK_EQ(lru.Peek(addr2)->c, 2);
114 CHECK_EQ(lru.size(), 2);
115
116 foo->expired = true;
117
118 foo = lru.Upsert(addr3);
119 foo->c = 3;
120 foo->expired = false;
121 CHECK_NOT_NULL(lru.Peek(addr3));
122 CHECK_EQ(lru.Peek(addr3)->c, 3);
123 CHECK_EQ(lru.size(), 1);
124
125 // addr1 was removed because we exceeded size.
126 // addr2 was removed because it was expired.
127 CHECK_NULL(lru.Peek(addr1));
128 CHECK_NULL(lru.Peek(addr2));
129 }
130
TEST(SocketAddress,Comparison)131 TEST(SocketAddress, Comparison) {
132 sockaddr_storage storage[6];
133
134 SocketAddress::ToSockAddr(AF_INET, "10.0.0.1", 0, &storage[0]);
135 SocketAddress::ToSockAddr(AF_INET, "10.0.0.2", 0, &storage[1]);
136 SocketAddress::ToSockAddr(AF_INET6, "::1", 0, &storage[2]);
137 SocketAddress::ToSockAddr(AF_INET6, "::2", 0, &storage[3]);
138 SocketAddress::ToSockAddr(AF_INET6, "::ffff:10.0.0.1", 0, &storage[4]);
139 SocketAddress::ToSockAddr(AF_INET6, "::ffff:10.0.0.2", 0, &storage[5]);
140
141 SocketAddress addr1(reinterpret_cast<const sockaddr*>(&storage[0]));
142 SocketAddress addr2(reinterpret_cast<const sockaddr*>(&storage[1]));
143 SocketAddress addr3(reinterpret_cast<const sockaddr*>(&storage[2]));
144 SocketAddress addr4(reinterpret_cast<const sockaddr*>(&storage[3]));
145 SocketAddress addr5(reinterpret_cast<const sockaddr*>(&storage[4]));
146 SocketAddress addr6(reinterpret_cast<const sockaddr*>(&storage[5]));
147
148 CHECK_EQ(addr1.compare(addr1), SocketAddress::CompareResult::SAME);
149 CHECK_EQ(addr1.compare(addr2), SocketAddress::CompareResult::LESS_THAN);
150 CHECK_EQ(addr2.compare(addr1), SocketAddress::CompareResult::GREATER_THAN);
151 CHECK(addr1 <= addr1);
152 CHECK(addr1 < addr2);
153 CHECK(addr1 <= addr2);
154 CHECK(addr2 >= addr2);
155 CHECK(addr2 > addr1);
156 CHECK(addr2 >= addr1);
157
158 CHECK_EQ(addr3.compare(addr3), SocketAddress::CompareResult::SAME);
159 CHECK_EQ(addr3.compare(addr4), SocketAddress::CompareResult::LESS_THAN);
160 CHECK_EQ(addr4.compare(addr3), SocketAddress::CompareResult::GREATER_THAN);
161 CHECK(addr3 <= addr3);
162 CHECK(addr3 < addr4);
163 CHECK(addr3 <= addr4);
164 CHECK(addr4 >= addr4);
165 CHECK(addr4 > addr3);
166 CHECK(addr4 >= addr3);
167
168 // Not comparable
169 CHECK_EQ(addr1.compare(addr3), SocketAddress::CompareResult::NOT_COMPARABLE);
170 CHECK_EQ(addr3.compare(addr1), SocketAddress::CompareResult::NOT_COMPARABLE);
171 CHECK(!(addr1 < addr3));
172 CHECK(!(addr1 > addr3));
173 CHECK(!(addr1 >= addr3));
174 CHECK(!(addr1 <= addr3));
175 CHECK(!(addr3 < addr1));
176 CHECK(!(addr3 > addr1));
177 CHECK(!(addr3 >= addr1));
178 CHECK(!(addr3 <= addr1));
179
180 // Comparable
181 CHECK_EQ(addr1.compare(addr5), SocketAddress::CompareResult::SAME);
182 CHECK_EQ(addr2.compare(addr6), SocketAddress::CompareResult::SAME);
183 CHECK_EQ(addr1.compare(addr6), SocketAddress::CompareResult::LESS_THAN);
184 CHECK_EQ(addr6.compare(addr1), SocketAddress::CompareResult::GREATER_THAN);
185 CHECK(addr1 <= addr5);
186 CHECK(addr1 <= addr6);
187 CHECK(addr1 < addr6);
188 CHECK(addr6 > addr1);
189 CHECK(addr6 >= addr1);
190 CHECK(addr2 >= addr6);
191 CHECK(addr2 >= addr5);
192 }
193
TEST(SocketAddressBlockList,Simple)194 TEST(SocketAddressBlockList, Simple) {
195 SocketAddressBlockList bl;
196
197 sockaddr_storage storage[2];
198 SocketAddress::ToSockAddr(AF_INET, "10.0.0.1", 0, &storage[0]);
199 SocketAddress::ToSockAddr(AF_INET, "10.0.0.2", 0, &storage[1]);
200 std::shared_ptr<SocketAddress> addr1 =
201 std::make_shared<SocketAddress>(
202 reinterpret_cast<const sockaddr*>(&storage[0]));
203 std::shared_ptr<SocketAddress> addr2 =
204 std::make_shared<SocketAddress>(
205 reinterpret_cast<const sockaddr*>(&storage[1]));
206
207 bl.AddSocketAddress(addr1);
208 bl.AddSocketAddress(addr2);
209
210 CHECK(bl.Apply(addr1));
211 CHECK(bl.Apply(addr2));
212
213 bl.RemoveSocketAddress(addr1);
214
215 CHECK(!bl.Apply(addr1));
216 CHECK(bl.Apply(addr2));
217 }
218