]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/asio/test/ip/network_v4.cpp
5 // Copyright (c) 2003-2017 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6 // Copyright (c) 2014 Oliver Kowalke (oliver dot kowalke at gmail dot com)
8 // Distributed under the Boost Software License, Version 1.0. (See accompanying
9 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
12 // Disable autolinking for unit tests.
13 #if !defined(BOOST_ALL_NO_LIB)
14 #define BOOST_ALL_NO_LIB 1
15 #endif // !defined(BOOST_ALL_NO_LIB)
17 // Test that header file is self-contained.
18 #include <boost/asio/ip/network_v4.hpp>
20 #include "../unit_test.hpp"
23 //------------------------------------------------------------------------------
25 // ip_network_v4_compile test
26 // ~~~~~~~~~~~~~~~~~~~~~~~~~~
27 // The following test checks that all public member functions on the class
28 // ip::network_v4 compile and link correctly. Runtime failures are ignored.
30 namespace ip_network_v4_compile
{
34 using namespace boost::asio
;
35 namespace ip
= boost::asio::ip
;
39 boost::system::error_code ec
;
41 // network_v4 constructors.
43 ip::network_v4
net1(ip::make_address_v4("192.168.1.0"), 32);
44 ip::network_v4
net2(ip::make_address_v4("192.168.1.0"),
45 ip::make_address_v4("255.255.255.0"));
47 // network_v4 functions.
49 ip::address_v4 addr1
= net1
.address();
52 unsigned short prefix_len
= net1
.prefix_length();
55 ip::address_v4 addr2
= net1
.netmask();
58 ip::address_v4 addr3
= net1
.network();
61 ip::address_v4 addr4
= net1
.broadcast();
64 ip::address_v4_range hosts
= net1
.hosts();
67 ip::network_v4 net3
= net1
.canonical();
70 bool b1
= net1
.is_host();
73 bool b2
= net1
.is_subnet_of(net2
);
76 std::string s1
= net1
.to_string();
79 std::string s2
= net1
.to_string(ec
);
82 // network_v4 comparisons.
84 bool b3
= (net1
== net2
);
87 bool b4
= (net1
!= net2
);
90 // network_v4 creation functions.
92 net1
= ip::make_network_v4(ip::address_v4(), 24);
93 net1
= ip::make_network_v4(ip::address_v4(), ip::address_v4());
94 net1
= ip::make_network_v4("10.0.0.0/8");
95 net1
= ip::make_network_v4("10.0.0.0/8", ec
);
96 net1
= ip::make_network_v4(s1
);
97 net1
= ip::make_network_v4(s1
, ec
);
98 #if defined(BOOST_ASIO_HAS_STD_STRING_VIEW)
99 # if defined(BOOST_ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW)
100 std::experimental::string_view
string_view_value("10.0.0.0/8");
101 # else // defined(BOOST_ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW)
102 std::string_view
string_view_value("10.0.0.0/8");
103 # endif // defined(BOOST_ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW)
104 net1
= ip::make_network_v4(string_view_value
);
105 net1
= ip::make_network_v4(string_view_value
, ec
);
106 #endif // defined(BOOST_ASIO_HAS_STD_STRING_VIEW)
110 std::ostringstream os
;
113 #if !defined(BOOST_NO_STD_WSTREAMBUF)
114 std::wostringstream wos
;
116 #endif // !defined(BOOST_NO_STD_WSTREAMBUF)
118 catch (std::exception
&)
123 } // namespace ip_network_v4_compile
125 //------------------------------------------------------------------------------
127 // ip_network_v4_runtime test
128 // ~~~~~~~~~~~~~~~~~~~~~~~~~~
129 // The following test checks that the various public member functions meet the
130 // necessary postconditions.
132 namespace ip_network_v4_runtime
{
136 using boost::asio::ip::address_v4
;
137 using boost::asio::ip::make_address_v4
;
138 using boost::asio::ip::network_v4
;
139 using boost::asio::ip::make_network_v4
;
141 address_v4 addr
= make_address_v4("1.2.3.4");
143 // calculate prefix length
145 network_v4
net1(addr
, make_address_v4("255.255.255.0"));
146 BOOST_ASIO_CHECK(net1
.prefix_length() == 24);
148 network_v4
net2(addr
, make_address_v4("255.255.255.192"));
149 BOOST_ASIO_CHECK(net2
.prefix_length() == 26);
151 network_v4
net3(addr
, make_address_v4("128.0.0.0"));
152 BOOST_ASIO_CHECK(net3
.prefix_length() == 1);
157 make_network_v4(addr
, make_address_v4("255.255.255.1"));
159 catch(std::exception
& ex
)
163 BOOST_ASIO_CHECK(msg
== std::string("non-contiguous netmask"));
168 make_network_v4(addr
, make_address_v4("0.255.255.0"));
170 catch(std::exception
& ex
)
174 BOOST_ASIO_CHECK(msg
== std::string("non-contiguous netmask"));
178 network_v4
net4(addr
, 23);
179 BOOST_ASIO_CHECK(net4
.netmask() == make_address_v4("255.255.254.0"));
181 network_v4
net5(addr
, 12);
182 BOOST_ASIO_CHECK(net5
.netmask() == make_address_v4("255.240.0.0"));
184 network_v4
net6(addr
, 24);
185 BOOST_ASIO_CHECK(net6
.netmask() == make_address_v4("255.255.255.0"));
187 network_v4
net7(addr
, 16);
188 BOOST_ASIO_CHECK(net7
.netmask() == make_address_v4("255.255.0.0"));
190 network_v4
net8(addr
, 8);
191 BOOST_ASIO_CHECK(net8
.netmask() == make_address_v4("255.0.0.0"));
193 network_v4
net9(addr
, 32);
194 BOOST_ASIO_CHECK(net9
.netmask() == make_address_v4("255.255.255.255"));
196 network_v4
net10(addr
, 1);
197 BOOST_ASIO_CHECK(net10
.netmask() == make_address_v4("128.0.0.0"));
199 network_v4
net11(addr
, 0);
200 BOOST_ASIO_CHECK(net11
.netmask() == make_address_v4("0.0.0.0"));
205 make_network_v4(addr
, 33);
207 catch(std::out_of_range
& ex
)
211 BOOST_ASIO_CHECK(msg
== std::string("prefix length too large"));
213 // construct address range from address and prefix length
214 BOOST_ASIO_CHECK(network_v4(make_address_v4("192.168.77.100"), 32).network() == make_address_v4("192.168.77.100"));
215 BOOST_ASIO_CHECK(network_v4(make_address_v4("192.168.77.100"), 24).network() == make_address_v4("192.168.77.0"));
216 BOOST_ASIO_CHECK(network_v4(make_address_v4("192.168.77.128"), 25).network() == make_address_v4("192.168.77.128"));
218 // construct address range from string in CIDR notation
219 BOOST_ASIO_CHECK(make_network_v4("192.168.77.100/32").network() == make_address_v4("192.168.77.100"));
220 BOOST_ASIO_CHECK(make_network_v4("192.168.77.100/24").network() == make_address_v4("192.168.77.0"));
221 BOOST_ASIO_CHECK(make_network_v4("192.168.77.128/25").network() == make_address_v4("192.168.77.128"));
223 // construct network from invalid string
224 boost::system::error_code ec
;
225 make_network_v4("10.0.0.256/24", ec
);
226 BOOST_ASIO_CHECK(!!ec
);
227 make_network_v4("10.0.0.0/33", ec
);
228 BOOST_ASIO_CHECK(!!ec
);
229 make_network_v4("10.0.0.0/-1", ec
);
230 BOOST_ASIO_CHECK(!!ec
);
231 make_network_v4("10.0.0.0/", ec
);
232 BOOST_ASIO_CHECK(!!ec
);
233 make_network_v4("10.0.0.0", ec
);
234 BOOST_ASIO_CHECK(!!ec
);
237 BOOST_ASIO_CHECK(make_network_v4("193.99.144.80/24").prefix_length() == 24);
238 BOOST_ASIO_CHECK(network_v4(make_address_v4("193.99.144.80"), 24).prefix_length() == 24);
239 BOOST_ASIO_CHECK(network_v4(make_address_v4("192.168.77.0"), make_address_v4("255.255.255.0")).prefix_length() == 24);
242 std::string
a("192.168.77.0/32");
243 BOOST_ASIO_CHECK(make_network_v4(a
.c_str()).to_string() == a
);
244 BOOST_ASIO_CHECK(network_v4(make_address_v4("192.168.77.10"), 24).to_string() == std::string("192.168.77.10/24"));
247 BOOST_ASIO_CHECK(make_network_v4("192.168.77.11/24").address() == make_address_v4("192.168.77.11"));
249 // return host in CIDR notation
250 BOOST_ASIO_CHECK(make_network_v4("192.168.78.30/20").address().to_string() == "192.168.78.30");
252 // return network in CIDR notation
253 BOOST_ASIO_CHECK(make_network_v4("192.168.78.30/20").canonical().to_string() == "192.168.64.0/20");
256 BOOST_ASIO_CHECK(make_network_v4("192.168.77.0/32").is_host());
257 BOOST_ASIO_CHECK(!make_network_v4("192.168.77.0/31").is_host());
260 BOOST_ASIO_CHECK(make_network_v4("192.168.0.192/24").is_subnet_of(make_network_v4("192.168.0.0/16")));
261 BOOST_ASIO_CHECK(make_network_v4("192.168.0.0/24").is_subnet_of(make_network_v4("192.168.192.168/16")));
262 BOOST_ASIO_CHECK(make_network_v4("192.168.0.192/24").is_subnet_of(make_network_v4("192.168.192.168/16")));
263 BOOST_ASIO_CHECK(make_network_v4("192.168.0.0/24").is_subnet_of(make_network_v4("192.168.0.0/16")));
264 BOOST_ASIO_CHECK(make_network_v4("192.168.0.0/24").is_subnet_of(make_network_v4("192.168.0.0/23")));
265 BOOST_ASIO_CHECK(make_network_v4("192.168.0.0/24").is_subnet_of(make_network_v4("192.168.0.0/0")));
266 BOOST_ASIO_CHECK(make_network_v4("192.168.0.0/32").is_subnet_of(make_network_v4("192.168.0.0/24")));
268 BOOST_ASIO_CHECK(!make_network_v4("192.168.0.0/32").is_subnet_of(make_network_v4("192.168.0.0/32")));
269 BOOST_ASIO_CHECK(!make_network_v4("192.168.0.0/24").is_subnet_of(make_network_v4("192.168.1.0/24")));
270 BOOST_ASIO_CHECK(!make_network_v4("192.168.0.0/16").is_subnet_of(make_network_v4("192.168.1.0/24")));
272 network_v4
r(make_network_v4("192.168.0.0/24"));
273 BOOST_ASIO_CHECK(!r
.is_subnet_of(r
));
275 network_v4
net12(make_network_v4("192.168.0.2/24"));
276 network_v4
net13(make_network_v4("192.168.1.1/28"));
277 network_v4
net14(make_network_v4("192.168.1.21/28"));
279 BOOST_ASIO_CHECK(net12
.network() == make_address_v4("192.168.0.0"));
280 BOOST_ASIO_CHECK(net13
.network() == make_address_v4("192.168.1.0"));
281 BOOST_ASIO_CHECK(net14
.network() == make_address_v4("192.168.1.16"));
283 BOOST_ASIO_CHECK(net12
.netmask() == make_address_v4("255.255.255.0"));
284 BOOST_ASIO_CHECK(net13
.netmask() == make_address_v4("255.255.255.240"));
285 BOOST_ASIO_CHECK(net14
.netmask() == make_address_v4("255.255.255.240"));
287 BOOST_ASIO_CHECK(net12
.broadcast() == make_address_v4("192.168.0.255"));
288 BOOST_ASIO_CHECK(net13
.broadcast() == make_address_v4("192.168.1.15"));
289 BOOST_ASIO_CHECK(net14
.broadcast() == make_address_v4("192.168.1.31"));
291 BOOST_ASIO_CHECK(std::distance(net12
.hosts().begin(),net12
.hosts().end()) == 254);
292 BOOST_ASIO_CHECK(*net12
.hosts().begin() == make_address_v4("192.168.0.1"));
293 BOOST_ASIO_CHECK(net12
.hosts().end() != net12
.hosts().find(make_address_v4("192.168.0.10")));
294 BOOST_ASIO_CHECK(net12
.hosts().end() == net12
.hosts().find(make_address_v4("192.168.1.10")));
295 BOOST_ASIO_CHECK(std::distance(net13
.hosts().begin(),net13
.hosts().end()) == 14);
296 BOOST_ASIO_CHECK(*net13
.hosts().begin() == make_address_v4("192.168.1.1"));
297 BOOST_ASIO_CHECK(net13
.hosts().end() != net13
.hosts().find(make_address_v4("192.168.1.14")));
298 BOOST_ASIO_CHECK(net13
.hosts().end() == net13
.hosts().find(make_address_v4("192.168.1.15")));
299 BOOST_ASIO_CHECK(std::distance(net14
.hosts().begin(),net14
.hosts().end()) == 14);
300 BOOST_ASIO_CHECK(*net14
.hosts().begin() == make_address_v4("192.168.1.17"));
301 BOOST_ASIO_CHECK(net14
.hosts().end() != net14
.hosts().find(make_address_v4("192.168.1.30")));
302 BOOST_ASIO_CHECK(net14
.hosts().end() == net14
.hosts().find(make_address_v4("192.168.1.31")));
305 } // namespace ip_network_v4_runtime
307 //------------------------------------------------------------------------------
309 BOOST_ASIO_TEST_SUITE
312 BOOST_ASIO_TEST_CASE(ip_network_v4_compile::test
)
313 BOOST_ASIO_TEST_CASE(ip_network_v4_runtime::test
)