1 | // |
2 | // address_v6.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_v6.hpp> |
18 | |
19 | #include "../unit_test.hpp" |
20 | #include <sstream> |
21 | |
22 | //------------------------------------------------------------------------------ |
23 | |
24 | // ip_address_v6_compile test |
25 | // ~~~~~~~~~~~~~~~~~~~~~~~~~~ |
26 | // The following test checks that all public member functions on the class |
27 | // ip::address_v6 compile and link correctly. Runtime failures are ignored. |
28 | |
29 | namespace ip_address_v6_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_v6 constructors. |
41 | |
42 | ip::address_v6 addr1; |
43 | const ip::address_v6::bytes_type const_bytes_value = { ._M_elems: { 0 } }; |
44 | ip::address_v6 addr2(const_bytes_value); |
45 | |
46 | // address_v6 functions. |
47 | |
48 | unsigned long scope_id = addr1.scope_id(); |
49 | addr1.scope_id(id: scope_id); |
50 | |
51 | bool b = addr1.is_unspecified(); |
52 | (void)b; |
53 | |
54 | b = addr1.is_loopback(); |
55 | (void)b; |
56 | |
57 | b = addr1.is_multicast(); |
58 | (void)b; |
59 | |
60 | b = addr1.is_link_local(); |
61 | (void)b; |
62 | |
63 | b = addr1.is_site_local(); |
64 | (void)b; |
65 | |
66 | b = addr1.is_v4_mapped(); |
67 | (void)b; |
68 | |
69 | b = addr1.is_v4_compatible(); |
70 | (void)b; |
71 | |
72 | b = addr1.is_multicast_node_local(); |
73 | (void)b; |
74 | |
75 | b = addr1.is_multicast_link_local(); |
76 | (void)b; |
77 | |
78 | b = addr1.is_multicast_site_local(); |
79 | (void)b; |
80 | |
81 | b = addr1.is_multicast_org_local(); |
82 | (void)b; |
83 | |
84 | b = addr1.is_multicast_global(); |
85 | (void)b; |
86 | |
87 | ip::address_v6::bytes_type bytes_value = addr1.to_bytes(); |
88 | (void)bytes_value; |
89 | |
90 | std::string string_value = addr1.to_string(); |
91 | string_value = addr1.to_string(ec); |
92 | |
93 | ip::address_v4 addr3 = addr1.to_v4(); |
94 | |
95 | // address_v6 static functions. |
96 | |
97 | addr1 = ip::address_v6::from_string(str: "0::0" ); |
98 | addr1 = ip::address_v6::from_string(str: "0::0" , ec); |
99 | addr1 = ip::address_v6::from_string(str: string_value); |
100 | addr1 = ip::address_v6::from_string(str: string_value, ec); |
101 | |
102 | addr1 = ip::address_v6::any(); |
103 | |
104 | addr1 = ip::address_v6::loopback(); |
105 | |
106 | addr1 = ip::address_v6::v4_mapped(addr: addr3); |
107 | |
108 | addr1 = ip::address_v6::v4_compatible(addr: addr3); |
109 | |
110 | // address_v6 comparisons. |
111 | |
112 | b = (addr1 == addr2); |
113 | (void)b; |
114 | |
115 | b = (addr1 != addr2); |
116 | (void)b; |
117 | |
118 | b = (addr1 < addr2); |
119 | (void)b; |
120 | |
121 | b = (addr1 > addr2); |
122 | (void)b; |
123 | |
124 | b = (addr1 <= addr2); |
125 | (void)b; |
126 | |
127 | b = (addr1 >= addr2); |
128 | (void)b; |
129 | |
130 | // address_v6 I/O. |
131 | |
132 | std::ostringstream os; |
133 | os << addr1; |
134 | |
135 | #if !defined(BOOST_NO_STD_WSTREAMBUF) |
136 | std::wostringstream wos; |
137 | wos << addr1; |
138 | #endif // !defined(BOOST_NO_STD_WSTREAMBUF) |
139 | } |
140 | catch (std::exception&) |
141 | { |
142 | } |
143 | } |
144 | |
145 | } // namespace ip_address_v6_compile |
146 | |
147 | //------------------------------------------------------------------------------ |
148 | |
149 | // ip_address_v6_runtime test |
150 | // ~~~~~~~~~~~~~~~~~~~~~~~~~~ |
151 | // The following test checks that the various public member functions meet the |
152 | // necessary postconditions. |
153 | |
154 | namespace ip_address_v6_runtime { |
155 | |
156 | void test() |
157 | { |
158 | using boost::asio::ip::address_v6; |
159 | |
160 | address_v6 a1; |
161 | BOOST_ASIO_CHECK(a1.is_unspecified()); |
162 | BOOST_ASIO_CHECK(a1.scope_id() == 0); |
163 | |
164 | address_v6::bytes_type b1 = {._M_elems: { 1, 2, 3, 4, 5, |
165 | 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }}; |
166 | address_v6 a2(b1, 12345); |
167 | BOOST_ASIO_CHECK(a2.to_bytes()[0] == 1); |
168 | BOOST_ASIO_CHECK(a2.to_bytes()[1] == 2); |
169 | BOOST_ASIO_CHECK(a2.to_bytes()[2] == 3); |
170 | BOOST_ASIO_CHECK(a2.to_bytes()[3] == 4); |
171 | BOOST_ASIO_CHECK(a2.to_bytes()[4] == 5); |
172 | BOOST_ASIO_CHECK(a2.to_bytes()[5] == 6); |
173 | BOOST_ASIO_CHECK(a2.to_bytes()[6] == 7); |
174 | BOOST_ASIO_CHECK(a2.to_bytes()[7] == 8); |
175 | BOOST_ASIO_CHECK(a2.to_bytes()[8] == 9); |
176 | BOOST_ASIO_CHECK(a2.to_bytes()[9] == 10); |
177 | BOOST_ASIO_CHECK(a2.to_bytes()[10] == 11); |
178 | BOOST_ASIO_CHECK(a2.to_bytes()[11] == 12); |
179 | BOOST_ASIO_CHECK(a2.to_bytes()[12] == 13); |
180 | BOOST_ASIO_CHECK(a2.to_bytes()[13] == 14); |
181 | BOOST_ASIO_CHECK(a2.to_bytes()[14] == 15); |
182 | BOOST_ASIO_CHECK(a2.to_bytes()[15] == 16); |
183 | BOOST_ASIO_CHECK(a2.scope_id() == 12345); |
184 | |
185 | address_v6 a3; |
186 | a3.scope_id(id: 12345); |
187 | BOOST_ASIO_CHECK(a3.scope_id() == 12345); |
188 | |
189 | address_v6 unspecified_address; |
190 | address_v6::bytes_type loopback_bytes = {._M_elems: { 0 }}; |
191 | loopback_bytes[15] = 1; |
192 | address_v6 loopback_address(loopback_bytes); |
193 | address_v6::bytes_type link_local_bytes = {._M_elems: { 0xFE, 0x80, 1 }}; |
194 | address_v6 link_local_address(link_local_bytes); |
195 | address_v6::bytes_type site_local_bytes = {._M_elems: { 0xFE, 0xC0, 1 }}; |
196 | address_v6 site_local_address(site_local_bytes); |
197 | address_v6::bytes_type v4_mapped_bytes = {._M_elems: { 0 }}; |
198 | v4_mapped_bytes[10] = 0xFF, v4_mapped_bytes[11] = 0xFF; |
199 | v4_mapped_bytes[12] = 1, v4_mapped_bytes[13] = 2; |
200 | v4_mapped_bytes[14] = 3, v4_mapped_bytes[15] = 4; |
201 | address_v6 v4_mapped_address(v4_mapped_bytes); |
202 | address_v6::bytes_type v4_compat_bytes = {._M_elems: { 0 }}; |
203 | v4_compat_bytes[12] = 1, v4_compat_bytes[13] = 2; |
204 | v4_compat_bytes[14] = 3, v4_compat_bytes[15] = 4; |
205 | address_v6 v4_compat_address(v4_compat_bytes); |
206 | address_v6::bytes_type mcast_global_bytes = {._M_elems: { 0xFF, 0x0E, 1 }}; |
207 | address_v6 mcast_global_address(mcast_global_bytes); |
208 | address_v6::bytes_type mcast_link_local_bytes = {._M_elems: { 0xFF, 0x02, 1 }}; |
209 | address_v6 mcast_link_local_address(mcast_link_local_bytes); |
210 | address_v6::bytes_type mcast_node_local_bytes = {._M_elems: { 0xFF, 0x01, 1 }}; |
211 | address_v6 mcast_node_local_address(mcast_node_local_bytes); |
212 | address_v6::bytes_type mcast_org_local_bytes = {._M_elems: { 0xFF, 0x08, 1 }}; |
213 | address_v6 mcast_org_local_address(mcast_org_local_bytes); |
214 | address_v6::bytes_type mcast_site_local_bytes = {._M_elems: { 0xFF, 0x05, 1 }}; |
215 | address_v6 mcast_site_local_address(mcast_site_local_bytes); |
216 | |
217 | BOOST_ASIO_CHECK(!unspecified_address.is_loopback()); |
218 | BOOST_ASIO_CHECK(loopback_address.is_loopback()); |
219 | BOOST_ASIO_CHECK(!link_local_address.is_loopback()); |
220 | BOOST_ASIO_CHECK(!site_local_address.is_loopback()); |
221 | BOOST_ASIO_CHECK(!v4_mapped_address.is_loopback()); |
222 | BOOST_ASIO_CHECK(!v4_compat_address.is_loopback()); |
223 | BOOST_ASIO_CHECK(!mcast_global_address.is_loopback()); |
224 | BOOST_ASIO_CHECK(!mcast_link_local_address.is_loopback()); |
225 | BOOST_ASIO_CHECK(!mcast_node_local_address.is_loopback()); |
226 | BOOST_ASIO_CHECK(!mcast_org_local_address.is_loopback()); |
227 | BOOST_ASIO_CHECK(!mcast_site_local_address.is_loopback()); |
228 | |
229 | BOOST_ASIO_CHECK(unspecified_address.is_unspecified()); |
230 | BOOST_ASIO_CHECK(!loopback_address.is_unspecified()); |
231 | BOOST_ASIO_CHECK(!link_local_address.is_unspecified()); |
232 | BOOST_ASIO_CHECK(!site_local_address.is_unspecified()); |
233 | BOOST_ASIO_CHECK(!v4_mapped_address.is_unspecified()); |
234 | BOOST_ASIO_CHECK(!v4_compat_address.is_unspecified()); |
235 | BOOST_ASIO_CHECK(!mcast_global_address.is_unspecified()); |
236 | BOOST_ASIO_CHECK(!mcast_link_local_address.is_unspecified()); |
237 | BOOST_ASIO_CHECK(!mcast_node_local_address.is_unspecified()); |
238 | BOOST_ASIO_CHECK(!mcast_org_local_address.is_unspecified()); |
239 | BOOST_ASIO_CHECK(!mcast_site_local_address.is_unspecified()); |
240 | |
241 | BOOST_ASIO_CHECK(!unspecified_address.is_link_local()); |
242 | BOOST_ASIO_CHECK(!loopback_address.is_link_local()); |
243 | BOOST_ASIO_CHECK(link_local_address.is_link_local()); |
244 | BOOST_ASIO_CHECK(!site_local_address.is_link_local()); |
245 | BOOST_ASIO_CHECK(!v4_mapped_address.is_link_local()); |
246 | BOOST_ASIO_CHECK(!v4_compat_address.is_link_local()); |
247 | BOOST_ASIO_CHECK(!mcast_global_address.is_link_local()); |
248 | BOOST_ASIO_CHECK(!mcast_link_local_address.is_link_local()); |
249 | BOOST_ASIO_CHECK(!mcast_node_local_address.is_link_local()); |
250 | BOOST_ASIO_CHECK(!mcast_org_local_address.is_link_local()); |
251 | BOOST_ASIO_CHECK(!mcast_site_local_address.is_link_local()); |
252 | |
253 | BOOST_ASIO_CHECK(!unspecified_address.is_site_local()); |
254 | BOOST_ASIO_CHECK(!loopback_address.is_site_local()); |
255 | BOOST_ASIO_CHECK(!link_local_address.is_site_local()); |
256 | BOOST_ASIO_CHECK(site_local_address.is_site_local()); |
257 | BOOST_ASIO_CHECK(!v4_mapped_address.is_site_local()); |
258 | BOOST_ASIO_CHECK(!v4_compat_address.is_site_local()); |
259 | BOOST_ASIO_CHECK(!mcast_global_address.is_site_local()); |
260 | BOOST_ASIO_CHECK(!mcast_link_local_address.is_site_local()); |
261 | BOOST_ASIO_CHECK(!mcast_node_local_address.is_site_local()); |
262 | BOOST_ASIO_CHECK(!mcast_org_local_address.is_site_local()); |
263 | BOOST_ASIO_CHECK(!mcast_site_local_address.is_site_local()); |
264 | |
265 | BOOST_ASIO_CHECK(!unspecified_address.is_v4_mapped()); |
266 | BOOST_ASIO_CHECK(!loopback_address.is_v4_mapped()); |
267 | BOOST_ASIO_CHECK(!link_local_address.is_v4_mapped()); |
268 | BOOST_ASIO_CHECK(!site_local_address.is_v4_mapped()); |
269 | BOOST_ASIO_CHECK(v4_mapped_address.is_v4_mapped()); |
270 | BOOST_ASIO_CHECK(!v4_compat_address.is_v4_mapped()); |
271 | BOOST_ASIO_CHECK(!mcast_global_address.is_v4_mapped()); |
272 | BOOST_ASIO_CHECK(!mcast_link_local_address.is_v4_mapped()); |
273 | BOOST_ASIO_CHECK(!mcast_node_local_address.is_v4_mapped()); |
274 | BOOST_ASIO_CHECK(!mcast_org_local_address.is_v4_mapped()); |
275 | BOOST_ASIO_CHECK(!mcast_site_local_address.is_v4_mapped()); |
276 | |
277 | BOOST_ASIO_CHECK(!unspecified_address.is_v4_compatible()); |
278 | BOOST_ASIO_CHECK(!loopback_address.is_v4_compatible()); |
279 | BOOST_ASIO_CHECK(!link_local_address.is_v4_compatible()); |
280 | BOOST_ASIO_CHECK(!site_local_address.is_v4_compatible()); |
281 | BOOST_ASIO_CHECK(!v4_mapped_address.is_v4_compatible()); |
282 | BOOST_ASIO_CHECK(v4_compat_address.is_v4_compatible()); |
283 | BOOST_ASIO_CHECK(!mcast_global_address.is_v4_compatible()); |
284 | BOOST_ASIO_CHECK(!mcast_link_local_address.is_v4_compatible()); |
285 | BOOST_ASIO_CHECK(!mcast_node_local_address.is_v4_compatible()); |
286 | BOOST_ASIO_CHECK(!mcast_org_local_address.is_v4_compatible()); |
287 | BOOST_ASIO_CHECK(!mcast_site_local_address.is_v4_compatible()); |
288 | |
289 | BOOST_ASIO_CHECK(!unspecified_address.is_multicast()); |
290 | BOOST_ASIO_CHECK(!loopback_address.is_multicast()); |
291 | BOOST_ASIO_CHECK(!link_local_address.is_multicast()); |
292 | BOOST_ASIO_CHECK(!site_local_address.is_multicast()); |
293 | BOOST_ASIO_CHECK(!v4_mapped_address.is_multicast()); |
294 | BOOST_ASIO_CHECK(!v4_compat_address.is_multicast()); |
295 | BOOST_ASIO_CHECK(mcast_global_address.is_multicast()); |
296 | BOOST_ASIO_CHECK(mcast_link_local_address.is_multicast()); |
297 | BOOST_ASIO_CHECK(mcast_node_local_address.is_multicast()); |
298 | BOOST_ASIO_CHECK(mcast_org_local_address.is_multicast()); |
299 | BOOST_ASIO_CHECK(mcast_site_local_address.is_multicast()); |
300 | |
301 | BOOST_ASIO_CHECK(!unspecified_address.is_multicast_global()); |
302 | BOOST_ASIO_CHECK(!loopback_address.is_multicast_global()); |
303 | BOOST_ASIO_CHECK(!link_local_address.is_multicast_global()); |
304 | BOOST_ASIO_CHECK(!site_local_address.is_multicast_global()); |
305 | BOOST_ASIO_CHECK(!v4_mapped_address.is_multicast_global()); |
306 | BOOST_ASIO_CHECK(!v4_compat_address.is_multicast_global()); |
307 | BOOST_ASIO_CHECK(mcast_global_address.is_multicast_global()); |
308 | BOOST_ASIO_CHECK(!mcast_link_local_address.is_multicast_global()); |
309 | BOOST_ASIO_CHECK(!mcast_node_local_address.is_multicast_global()); |
310 | BOOST_ASIO_CHECK(!mcast_org_local_address.is_multicast_global()); |
311 | BOOST_ASIO_CHECK(!mcast_site_local_address.is_multicast_global()); |
312 | |
313 | BOOST_ASIO_CHECK(!unspecified_address.is_multicast_link_local()); |
314 | BOOST_ASIO_CHECK(!loopback_address.is_multicast_link_local()); |
315 | BOOST_ASIO_CHECK(!link_local_address.is_multicast_link_local()); |
316 | BOOST_ASIO_CHECK(!site_local_address.is_multicast_link_local()); |
317 | BOOST_ASIO_CHECK(!v4_mapped_address.is_multicast_link_local()); |
318 | BOOST_ASIO_CHECK(!v4_compat_address.is_multicast_link_local()); |
319 | BOOST_ASIO_CHECK(!mcast_global_address.is_multicast_link_local()); |
320 | BOOST_ASIO_CHECK(mcast_link_local_address.is_multicast_link_local()); |
321 | BOOST_ASIO_CHECK(!mcast_node_local_address.is_multicast_link_local()); |
322 | BOOST_ASIO_CHECK(!mcast_org_local_address.is_multicast_link_local()); |
323 | BOOST_ASIO_CHECK(!mcast_site_local_address.is_multicast_link_local()); |
324 | |
325 | BOOST_ASIO_CHECK(!unspecified_address.is_multicast_node_local()); |
326 | BOOST_ASIO_CHECK(!loopback_address.is_multicast_node_local()); |
327 | BOOST_ASIO_CHECK(!link_local_address.is_multicast_node_local()); |
328 | BOOST_ASIO_CHECK(!site_local_address.is_multicast_node_local()); |
329 | BOOST_ASIO_CHECK(!v4_mapped_address.is_multicast_node_local()); |
330 | BOOST_ASIO_CHECK(!v4_compat_address.is_multicast_node_local()); |
331 | BOOST_ASIO_CHECK(!mcast_global_address.is_multicast_node_local()); |
332 | BOOST_ASIO_CHECK(!mcast_link_local_address.is_multicast_node_local()); |
333 | BOOST_ASIO_CHECK(mcast_node_local_address.is_multicast_node_local()); |
334 | BOOST_ASIO_CHECK(!mcast_org_local_address.is_multicast_node_local()); |
335 | BOOST_ASIO_CHECK(!mcast_site_local_address.is_multicast_node_local()); |
336 | |
337 | BOOST_ASIO_CHECK(!unspecified_address.is_multicast_org_local()); |
338 | BOOST_ASIO_CHECK(!loopback_address.is_multicast_org_local()); |
339 | BOOST_ASIO_CHECK(!link_local_address.is_multicast_org_local()); |
340 | BOOST_ASIO_CHECK(!site_local_address.is_multicast_org_local()); |
341 | BOOST_ASIO_CHECK(!v4_mapped_address.is_multicast_org_local()); |
342 | BOOST_ASIO_CHECK(!v4_compat_address.is_multicast_org_local()); |
343 | BOOST_ASIO_CHECK(!mcast_global_address.is_multicast_org_local()); |
344 | BOOST_ASIO_CHECK(!mcast_link_local_address.is_multicast_org_local()); |
345 | BOOST_ASIO_CHECK(!mcast_node_local_address.is_multicast_org_local()); |
346 | BOOST_ASIO_CHECK(mcast_org_local_address.is_multicast_org_local()); |
347 | BOOST_ASIO_CHECK(!mcast_site_local_address.is_multicast_org_local()); |
348 | |
349 | BOOST_ASIO_CHECK(!unspecified_address.is_multicast_site_local()); |
350 | BOOST_ASIO_CHECK(!loopback_address.is_multicast_site_local()); |
351 | BOOST_ASIO_CHECK(!link_local_address.is_multicast_site_local()); |
352 | BOOST_ASIO_CHECK(!site_local_address.is_multicast_site_local()); |
353 | BOOST_ASIO_CHECK(!v4_mapped_address.is_multicast_site_local()); |
354 | BOOST_ASIO_CHECK(!v4_compat_address.is_multicast_site_local()); |
355 | BOOST_ASIO_CHECK(!mcast_global_address.is_multicast_site_local()); |
356 | BOOST_ASIO_CHECK(!mcast_link_local_address.is_multicast_site_local()); |
357 | BOOST_ASIO_CHECK(!mcast_node_local_address.is_multicast_site_local()); |
358 | BOOST_ASIO_CHECK(!mcast_org_local_address.is_multicast_site_local()); |
359 | BOOST_ASIO_CHECK(mcast_site_local_address.is_multicast_site_local()); |
360 | |
361 | BOOST_ASIO_CHECK(address_v6::loopback().is_loopback()); |
362 | } |
363 | |
364 | } // namespace ip_address_v6_runtime |
365 | |
366 | //------------------------------------------------------------------------------ |
367 | |
368 | BOOST_ASIO_TEST_SUITE |
369 | ( |
370 | "ip/address_v6" , |
371 | BOOST_ASIO_TEST_CASE(ip_address_v6_compile::test) |
372 | BOOST_ASIO_TEST_CASE(ip_address_v6_runtime::test) |
373 | ) |
374 | |