1 | // |
2 | // address_v4.cpp |
3 | // ~~~~~~~~~~~~~~ |
4 | // |
5 | // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) |
6 | // |
7 | // Distributed under the Boost Software License, Version 1.0. (See accompanying |
8 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
9 | // |
10 | |
11 | // Disable autolinking for unit tests. |
12 | #if !defined(BOOST_ALL_NO_LIB) |
13 | #define BOOST_ALL_NO_LIB 1 |
14 | #endif // !defined(BOOST_ALL_NO_LIB) |
15 | |
16 | // Test that header file is self-contained. |
17 | #include <boost/asio/ip/address_v4.hpp> |
18 | |
19 | #include "../unit_test.hpp" |
20 | #include <sstream> |
21 | |
22 | //------------------------------------------------------------------------------ |
23 | |
24 | // ip_address_v4_compile test |
25 | // ~~~~~~~~~~~~~~~~~~~~~~~~~~ |
26 | // The following test checks that all public member functions on the class |
27 | // ip::address_v4 compile and link correctly. Runtime failures are ignored. |
28 | |
29 | namespace ip_address_v4_compile { |
30 | |
31 | void test() |
32 | { |
33 | using namespace boost::asio; |
34 | namespace ip = boost::asio::ip; |
35 | |
36 | try |
37 | { |
38 | boost::system::error_code ec; |
39 | |
40 | // address_v4 constructors. |
41 | |
42 | ip::address_v4 addr1; |
43 | const ip::address_v4::bytes_type const_bytes_value = { ._M_elems: { 127, 0, 0, 1 } }; |
44 | ip::address_v4 addr2(const_bytes_value); |
45 | const unsigned long const_ulong_value = 0x7F000001; |
46 | ip::address_v4 addr3(const_ulong_value); |
47 | |
48 | // address_v4 functions. |
49 | |
50 | bool b = addr1.is_loopback(); |
51 | (void)b; |
52 | |
53 | b = addr1.is_unspecified(); |
54 | (void)b; |
55 | |
56 | b = addr1.is_class_a(); |
57 | (void)b; |
58 | |
59 | b = addr1.is_class_b(); |
60 | (void)b; |
61 | |
62 | b = addr1.is_class_c(); |
63 | (void)b; |
64 | |
65 | b = addr1.is_multicast(); |
66 | (void)b; |
67 | |
68 | ip::address_v4::bytes_type bytes_value = addr1.to_bytes(); |
69 | (void)bytes_value; |
70 | |
71 | unsigned long ulong_value = addr1.to_ulong(); |
72 | (void)ulong_value; |
73 | |
74 | std::string string_value = addr1.to_string(); |
75 | string_value = addr1.to_string(ec); |
76 | |
77 | // address_v4 static functions. |
78 | |
79 | addr1 = ip::address_v4::from_string(str: "127.0.0.1" ); |
80 | addr1 = ip::address_v4::from_string(str: "127.0.0.1" , ec); |
81 | addr1 = ip::address_v4::from_string(str: string_value); |
82 | addr1 = ip::address_v4::from_string(str: string_value, ec); |
83 | |
84 | addr1 = ip::address_v4::any(); |
85 | |
86 | addr1 = ip::address_v4::loopback(); |
87 | |
88 | addr1 = ip::address_v4::broadcast(); |
89 | |
90 | addr1 = ip::address_v4::broadcast(addr: addr2, mask: addr3); |
91 | |
92 | addr1 = ip::address_v4::netmask(addr: addr2); |
93 | |
94 | // address_v4 comparisons. |
95 | |
96 | b = (addr1 == addr2); |
97 | (void)b; |
98 | |
99 | b = (addr1 != addr2); |
100 | (void)b; |
101 | |
102 | b = (addr1 < addr2); |
103 | (void)b; |
104 | |
105 | b = (addr1 > addr2); |
106 | (void)b; |
107 | |
108 | b = (addr1 <= addr2); |
109 | (void)b; |
110 | |
111 | b = (addr1 >= addr2); |
112 | (void)b; |
113 | |
114 | // address_v4 I/O. |
115 | |
116 | std::ostringstream os; |
117 | os << addr1; |
118 | |
119 | #if !defined(BOOST_NO_STD_WSTREAMBUF) |
120 | std::wostringstream wos; |
121 | wos << addr1; |
122 | #endif // !defined(BOOST_NO_STD_WSTREAMBUF) |
123 | } |
124 | catch (std::exception&) |
125 | { |
126 | } |
127 | } |
128 | |
129 | } // namespace ip_address_v4_compile |
130 | |
131 | //------------------------------------------------------------------------------ |
132 | |
133 | // ip_address_v4_runtime test |
134 | // ~~~~~~~~~~~~~~~~~~~~~~~~~~ |
135 | // The following test checks that the various public member functions meet the |
136 | // necessary postconditions. |
137 | |
138 | namespace ip_address_v4_runtime { |
139 | |
140 | void test() |
141 | { |
142 | using boost::asio::ip::address_v4; |
143 | |
144 | address_v4 a1; |
145 | BOOST_ASIO_CHECK(a1.to_bytes()[0] == 0); |
146 | BOOST_ASIO_CHECK(a1.to_bytes()[1] == 0); |
147 | BOOST_ASIO_CHECK(a1.to_bytes()[2] == 0); |
148 | BOOST_ASIO_CHECK(a1.to_bytes()[3] == 0); |
149 | BOOST_ASIO_CHECK(a1.to_ulong() == 0); |
150 | |
151 | address_v4::bytes_type b1 = {._M_elems: { 1, 2, 3, 4 }}; |
152 | address_v4 a2(b1); |
153 | BOOST_ASIO_CHECK(a2.to_bytes()[0] == 1); |
154 | BOOST_ASIO_CHECK(a2.to_bytes()[1] == 2); |
155 | BOOST_ASIO_CHECK(a2.to_bytes()[2] == 3); |
156 | BOOST_ASIO_CHECK(a2.to_bytes()[3] == 4); |
157 | BOOST_ASIO_CHECK(((a2.to_ulong() >> 24) & 0xFF) == b1[0]); |
158 | BOOST_ASIO_CHECK(((a2.to_ulong() >> 16) & 0xFF) == b1[1]); |
159 | BOOST_ASIO_CHECK(((a2.to_ulong() >> 8) & 0xFF) == b1[2]); |
160 | BOOST_ASIO_CHECK((a2.to_ulong() & 0xFF) == b1[3]); |
161 | |
162 | address_v4 a3(0x01020304); |
163 | BOOST_ASIO_CHECK(a3.to_bytes()[0] == 1); |
164 | BOOST_ASIO_CHECK(a3.to_bytes()[1] == 2); |
165 | BOOST_ASIO_CHECK(a3.to_bytes()[2] == 3); |
166 | BOOST_ASIO_CHECK(a3.to_bytes()[3] == 4); |
167 | BOOST_ASIO_CHECK(a3.to_ulong() == 0x01020304); |
168 | |
169 | BOOST_ASIO_CHECK(address_v4(0x7F000001).is_loopback()); |
170 | BOOST_ASIO_CHECK(address_v4(0x7F000002).is_loopback()); |
171 | BOOST_ASIO_CHECK(!address_v4(0x00000000).is_loopback()); |
172 | BOOST_ASIO_CHECK(!address_v4(0x01020304).is_loopback()); |
173 | |
174 | BOOST_ASIO_CHECK(address_v4(0x00000000).is_unspecified()); |
175 | BOOST_ASIO_CHECK(!address_v4(0x7F000001).is_unspecified()); |
176 | BOOST_ASIO_CHECK(!address_v4(0x01020304).is_unspecified()); |
177 | |
178 | BOOST_ASIO_CHECK(address_v4(0x01000000).is_class_a()); |
179 | BOOST_ASIO_CHECK(address_v4(0x7F000000).is_class_a()); |
180 | BOOST_ASIO_CHECK(!address_v4(0x80000000).is_class_a()); |
181 | BOOST_ASIO_CHECK(!address_v4(0xBFFF0000).is_class_a()); |
182 | BOOST_ASIO_CHECK(!address_v4(0xC0000000).is_class_a()); |
183 | BOOST_ASIO_CHECK(!address_v4(0xDFFFFF00).is_class_a()); |
184 | BOOST_ASIO_CHECK(!address_v4(0xE0000000).is_class_a()); |
185 | BOOST_ASIO_CHECK(!address_v4(0xEFFFFFFF).is_class_a()); |
186 | BOOST_ASIO_CHECK(!address_v4(0xF0000000).is_class_a()); |
187 | BOOST_ASIO_CHECK(!address_v4(0xFFFFFFFF).is_class_a()); |
188 | |
189 | BOOST_ASIO_CHECK(!address_v4(0x01000000).is_class_b()); |
190 | BOOST_ASIO_CHECK(!address_v4(0x7F000000).is_class_b()); |
191 | BOOST_ASIO_CHECK(address_v4(0x80000000).is_class_b()); |
192 | BOOST_ASIO_CHECK(address_v4(0xBFFF0000).is_class_b()); |
193 | BOOST_ASIO_CHECK(!address_v4(0xC0000000).is_class_b()); |
194 | BOOST_ASIO_CHECK(!address_v4(0xDFFFFF00).is_class_b()); |
195 | BOOST_ASIO_CHECK(!address_v4(0xE0000000).is_class_b()); |
196 | BOOST_ASIO_CHECK(!address_v4(0xEFFFFFFF).is_class_b()); |
197 | BOOST_ASIO_CHECK(!address_v4(0xF0000000).is_class_b()); |
198 | BOOST_ASIO_CHECK(!address_v4(0xFFFFFFFF).is_class_b()); |
199 | |
200 | BOOST_ASIO_CHECK(!address_v4(0x01000000).is_class_c()); |
201 | BOOST_ASIO_CHECK(!address_v4(0x7F000000).is_class_c()); |
202 | BOOST_ASIO_CHECK(!address_v4(0x80000000).is_class_c()); |
203 | BOOST_ASIO_CHECK(!address_v4(0xBFFF0000).is_class_c()); |
204 | BOOST_ASIO_CHECK(address_v4(0xC0000000).is_class_c()); |
205 | BOOST_ASIO_CHECK(address_v4(0xDFFFFF00).is_class_c()); |
206 | BOOST_ASIO_CHECK(!address_v4(0xE0000000).is_class_c()); |
207 | BOOST_ASIO_CHECK(!address_v4(0xEFFFFFFF).is_class_c()); |
208 | BOOST_ASIO_CHECK(!address_v4(0xF0000000).is_class_c()); |
209 | BOOST_ASIO_CHECK(!address_v4(0xFFFFFFFF).is_class_c()); |
210 | |
211 | BOOST_ASIO_CHECK(!address_v4(0x01000000).is_multicast()); |
212 | BOOST_ASIO_CHECK(!address_v4(0x7F000000).is_multicast()); |
213 | BOOST_ASIO_CHECK(!address_v4(0x80000000).is_multicast()); |
214 | BOOST_ASIO_CHECK(!address_v4(0xBFFF0000).is_multicast()); |
215 | BOOST_ASIO_CHECK(!address_v4(0xC0000000).is_multicast()); |
216 | BOOST_ASIO_CHECK(!address_v4(0xDFFFFF00).is_multicast()); |
217 | BOOST_ASIO_CHECK(address_v4(0xE0000000).is_multicast()); |
218 | BOOST_ASIO_CHECK(address_v4(0xEFFFFFFF).is_multicast()); |
219 | BOOST_ASIO_CHECK(!address_v4(0xF0000000).is_multicast()); |
220 | BOOST_ASIO_CHECK(!address_v4(0xFFFFFFFF).is_multicast()); |
221 | |
222 | address_v4 a4 = address_v4::any(); |
223 | BOOST_ASIO_CHECK(a4.to_bytes()[0] == 0); |
224 | BOOST_ASIO_CHECK(a4.to_bytes()[1] == 0); |
225 | BOOST_ASIO_CHECK(a4.to_bytes()[2] == 0); |
226 | BOOST_ASIO_CHECK(a4.to_bytes()[3] == 0); |
227 | BOOST_ASIO_CHECK(a4.to_ulong() == 0); |
228 | |
229 | address_v4 a5 = address_v4::loopback(); |
230 | BOOST_ASIO_CHECK(a5.to_bytes()[0] == 0x7F); |
231 | BOOST_ASIO_CHECK(a5.to_bytes()[1] == 0); |
232 | BOOST_ASIO_CHECK(a5.to_bytes()[2] == 0); |
233 | BOOST_ASIO_CHECK(a5.to_bytes()[3] == 0x01); |
234 | BOOST_ASIO_CHECK(a5.to_ulong() == 0x7F000001); |
235 | |
236 | address_v4 a6 = address_v4::broadcast(); |
237 | BOOST_ASIO_CHECK(a6.to_bytes()[0] == 0xFF); |
238 | BOOST_ASIO_CHECK(a6.to_bytes()[1] == 0xFF); |
239 | BOOST_ASIO_CHECK(a6.to_bytes()[2] == 0xFF); |
240 | BOOST_ASIO_CHECK(a6.to_bytes()[3] == 0xFF); |
241 | BOOST_ASIO_CHECK(a6.to_ulong() == 0xFFFFFFFF); |
242 | |
243 | address_v4 class_a_net(0xFF000000); |
244 | address_v4 class_b_net(0xFFFF0000); |
245 | address_v4 class_c_net(0xFFFFFF00); |
246 | address_v4 other_net(0xFFFFFFFF); |
247 | BOOST_ASIO_CHECK(address_v4::netmask(address_v4(0x01000000)) == class_a_net); |
248 | BOOST_ASIO_CHECK(address_v4::netmask(address_v4(0x7F000000)) == class_a_net); |
249 | BOOST_ASIO_CHECK(address_v4::netmask(address_v4(0x80000000)) == class_b_net); |
250 | BOOST_ASIO_CHECK(address_v4::netmask(address_v4(0xBFFF0000)) == class_b_net); |
251 | BOOST_ASIO_CHECK(address_v4::netmask(address_v4(0xC0000000)) == class_c_net); |
252 | BOOST_ASIO_CHECK(address_v4::netmask(address_v4(0xDFFFFF00)) == class_c_net); |
253 | BOOST_ASIO_CHECK(address_v4::netmask(address_v4(0xE0000000)) == other_net); |
254 | BOOST_ASIO_CHECK(address_v4::netmask(address_v4(0xEFFFFFFF)) == other_net); |
255 | BOOST_ASIO_CHECK(address_v4::netmask(address_v4(0xF0000000)) == other_net); |
256 | BOOST_ASIO_CHECK(address_v4::netmask(address_v4(0xFFFFFFFF)) == other_net); |
257 | } |
258 | |
259 | } // namespace ip_address_v4_runtime |
260 | |
261 | //------------------------------------------------------------------------------ |
262 | |
263 | BOOST_ASIO_TEST_SUITE |
264 | ( |
265 | "ip/address_v4" , |
266 | BOOST_ASIO_TEST_CASE(ip_address_v4_compile::test) |
267 | BOOST_ASIO_TEST_CASE(ip_address_v4_runtime::test) |
268 | ) |
269 | |