• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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