]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // |
2 | // generic/raw_protocol.cpp | |
3 | // ~~~~~~~~~~~~~~~~~~~~~~~~ | |
4 | // | |
b32b8144 | 5 | // Copyright (c) 2003-2017 Christopher M. Kohlhoff (chris at kohlhoff dot com) |
7c673cae FG |
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/generic/raw_protocol.hpp> | |
18 | ||
19 | #include <cstring> | |
b32b8144 | 20 | #include <boost/asio/io_context.hpp> |
7c673cae FG |
21 | #include <boost/asio/ip/icmp.hpp> |
22 | #include "../unit_test.hpp" | |
23 | ||
24 | #if defined(__cplusplus_cli) || defined(__cplusplus_winrt) | |
25 | # define generic cpp_generic | |
26 | #endif | |
27 | ||
28 | //------------------------------------------------------------------------------ | |
29 | ||
30 | // generic_raw_protocol_socket_compile test | |
31 | // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
32 | // The following test checks that all public member functions on the class | |
33 | // generic::raw_socket::socket compile and link correctly. Runtime failures | |
34 | // are ignored. | |
35 | ||
36 | namespace generic_raw_protocol_socket_compile { | |
37 | ||
38 | void connect_handler(const boost::system::error_code&) | |
39 | { | |
40 | } | |
41 | ||
42 | void send_handler(const boost::system::error_code&, std::size_t) | |
43 | { | |
44 | } | |
45 | ||
46 | void receive_handler(const boost::system::error_code&, std::size_t) | |
47 | { | |
48 | } | |
49 | ||
50 | void test() | |
51 | { | |
52 | using namespace boost::asio; | |
53 | namespace generic = boost::asio::generic; | |
54 | typedef generic::raw_protocol rp; | |
55 | ||
56 | const int af_inet = BOOST_ASIO_OS_DEF(AF_INET); | |
57 | const int ipproto_icmp = BOOST_ASIO_OS_DEF(IPPROTO_ICMP); | |
58 | const int sock_raw = BOOST_ASIO_OS_DEF(SOCK_RAW); | |
59 | ||
60 | try | |
61 | { | |
b32b8144 | 62 | io_context ioc; |
7c673cae FG |
63 | char mutable_char_buffer[128] = ""; |
64 | const char const_char_buffer[128] = ""; | |
65 | socket_base::message_flags in_flags = 0; | |
66 | socket_base::send_buffer_size socket_option; | |
67 | socket_base::bytes_readable io_control_command; | |
68 | boost::system::error_code ec; | |
69 | ||
70 | // basic_raw_socket constructors. | |
71 | ||
b32b8144 FG |
72 | rp::socket socket1(ioc); |
73 | rp::socket socket2(ioc, rp(af_inet, ipproto_icmp)); | |
74 | rp::socket socket3(ioc, rp::endpoint()); | |
7c673cae FG |
75 | #if !defined(BOOST_ASIO_WINDOWS_RUNTIME) |
76 | rp::socket::native_handle_type native_socket1 | |
77 | = ::socket(af_inet, sock_raw, 0); | |
b32b8144 | 78 | rp::socket socket4(ioc, rp(af_inet, ipproto_icmp), native_socket1); |
7c673cae FG |
79 | #endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME) |
80 | ||
81 | #if defined(BOOST_ASIO_HAS_MOVE) | |
82 | rp::socket socket5(std::move(socket4)); | |
b32b8144 | 83 | boost::asio::ip::icmp::socket icmp_socket(ioc); |
7c673cae FG |
84 | rp::socket socket6(std::move(icmp_socket)); |
85 | #endif // defined(BOOST_ASIO_HAS_MOVE) | |
86 | ||
87 | // basic_datagram_socket operators. | |
88 | ||
89 | #if defined(BOOST_ASIO_HAS_MOVE) | |
b32b8144 | 90 | socket1 = rp::socket(ioc); |
7c673cae | 91 | socket1 = std::move(socket2); |
b32b8144 | 92 | socket1 = boost::asio::ip::icmp::socket(ioc); |
7c673cae FG |
93 | #endif // defined(BOOST_ASIO_HAS_MOVE) |
94 | ||
95 | // basic_io_object functions. | |
96 | ||
b32b8144 FG |
97 | rp::socket::executor_type ex = socket1.get_executor(); |
98 | (void)ex; | |
99 | ||
100 | #if !defined(BOOST_ASIO_NO_DEPRECATED) | |
101 | io_context& ioc_ref = socket1.get_io_context(); | |
102 | (void)ioc_ref; | |
103 | ||
104 | io_context& ioc_ref2 = socket1.get_io_service(); | |
105 | (void)ioc_ref2; | |
106 | #endif // !defined(BOOST_ASIO_NO_DEPRECATED) | |
7c673cae FG |
107 | |
108 | // basic_socket functions. | |
109 | ||
110 | rp::socket::lowest_layer_type& lowest_layer = socket1.lowest_layer(); | |
111 | (void)lowest_layer; | |
112 | ||
113 | socket1.open(rp(af_inet, ipproto_icmp)); | |
114 | socket1.open(rp(af_inet, ipproto_icmp), ec); | |
115 | ||
116 | #if !defined(BOOST_ASIO_WINDOWS_RUNTIME) | |
117 | rp::socket::native_handle_type native_socket2 | |
118 | = ::socket(af_inet, sock_raw, 0); | |
119 | socket1.assign(rp(af_inet, ipproto_icmp), native_socket2); | |
120 | rp::socket::native_handle_type native_socket3 | |
121 | = ::socket(af_inet, sock_raw, 0); | |
122 | socket1.assign(rp(af_inet, ipproto_icmp), native_socket3, ec); | |
123 | #endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME) | |
124 | ||
125 | bool is_open = socket1.is_open(); | |
126 | (void)is_open; | |
127 | ||
128 | socket1.close(); | |
129 | socket1.close(ec); | |
130 | ||
b32b8144 | 131 | rp::socket::native_handle_type native_socket4 = socket1.native_handle(); |
7c673cae FG |
132 | (void)native_socket4; |
133 | ||
134 | socket1.cancel(); | |
135 | socket1.cancel(ec); | |
136 | ||
137 | bool at_mark1 = socket1.at_mark(); | |
138 | (void)at_mark1; | |
139 | bool at_mark2 = socket1.at_mark(ec); | |
140 | (void)at_mark2; | |
141 | ||
142 | std::size_t available1 = socket1.available(); | |
143 | (void)available1; | |
144 | std::size_t available2 = socket1.available(ec); | |
145 | (void)available2; | |
146 | ||
147 | socket1.bind(rp::endpoint()); | |
148 | socket1.bind(rp::endpoint(), ec); | |
149 | ||
150 | socket1.connect(rp::endpoint()); | |
151 | socket1.connect(rp::endpoint(), ec); | |
152 | ||
153 | socket1.async_connect(rp::endpoint(), connect_handler); | |
154 | ||
155 | socket1.set_option(socket_option); | |
156 | socket1.set_option(socket_option, ec); | |
157 | ||
158 | socket1.get_option(socket_option); | |
159 | socket1.get_option(socket_option, ec); | |
160 | ||
161 | socket1.io_control(io_control_command); | |
162 | socket1.io_control(io_control_command, ec); | |
163 | ||
164 | rp::endpoint endpoint1 = socket1.local_endpoint(); | |
165 | rp::endpoint endpoint2 = socket1.local_endpoint(ec); | |
166 | ||
167 | rp::endpoint endpoint3 = socket1.remote_endpoint(); | |
168 | rp::endpoint endpoint4 = socket1.remote_endpoint(ec); | |
169 | ||
170 | socket1.shutdown(socket_base::shutdown_both); | |
171 | socket1.shutdown(socket_base::shutdown_both, ec); | |
172 | ||
173 | // basic_raw_socket functions. | |
174 | ||
175 | socket1.send(buffer(mutable_char_buffer)); | |
176 | socket1.send(buffer(const_char_buffer)); | |
177 | socket1.send(null_buffers()); | |
178 | socket1.send(buffer(mutable_char_buffer), in_flags); | |
179 | socket1.send(buffer(const_char_buffer), in_flags); | |
180 | socket1.send(null_buffers(), in_flags); | |
181 | socket1.send(buffer(mutable_char_buffer), in_flags, ec); | |
182 | socket1.send(buffer(const_char_buffer), in_flags, ec); | |
183 | socket1.send(null_buffers(), in_flags, ec); | |
184 | ||
185 | socket1.async_send(buffer(mutable_char_buffer), send_handler); | |
186 | socket1.async_send(buffer(const_char_buffer), send_handler); | |
187 | socket1.async_send(null_buffers(), send_handler); | |
188 | socket1.async_send(buffer(mutable_char_buffer), in_flags, send_handler); | |
189 | socket1.async_send(buffer(const_char_buffer), in_flags, send_handler); | |
190 | socket1.async_send(null_buffers(), in_flags, send_handler); | |
191 | ||
192 | socket1.send_to(buffer(mutable_char_buffer), | |
193 | rp::endpoint()); | |
194 | socket1.send_to(buffer(const_char_buffer), | |
195 | rp::endpoint()); | |
196 | socket1.send_to(null_buffers(), | |
197 | rp::endpoint()); | |
198 | socket1.send_to(buffer(mutable_char_buffer), | |
199 | rp::endpoint(), in_flags); | |
200 | socket1.send_to(buffer(const_char_buffer), | |
201 | rp::endpoint(), in_flags); | |
202 | socket1.send_to(null_buffers(), | |
203 | rp::endpoint(), in_flags); | |
204 | socket1.send_to(buffer(mutable_char_buffer), | |
205 | rp::endpoint(), in_flags, ec); | |
206 | socket1.send_to(buffer(const_char_buffer), | |
207 | rp::endpoint(), in_flags, ec); | |
208 | socket1.send_to(null_buffers(), | |
209 | rp::endpoint(), in_flags, ec); | |
210 | ||
211 | socket1.async_send_to(buffer(mutable_char_buffer), | |
212 | rp::endpoint(), send_handler); | |
213 | socket1.async_send_to(buffer(const_char_buffer), | |
214 | rp::endpoint(), send_handler); | |
215 | socket1.async_send_to(null_buffers(), | |
216 | rp::endpoint(), send_handler); | |
217 | socket1.async_send_to(buffer(mutable_char_buffer), | |
218 | rp::endpoint(), in_flags, send_handler); | |
219 | socket1.async_send_to(buffer(const_char_buffer), | |
220 | rp::endpoint(), in_flags, send_handler); | |
221 | socket1.async_send_to(null_buffers(), | |
222 | rp::endpoint(), in_flags, send_handler); | |
223 | ||
224 | socket1.receive(buffer(mutable_char_buffer)); | |
225 | socket1.receive(null_buffers()); | |
226 | socket1.receive(buffer(mutable_char_buffer), in_flags); | |
227 | socket1.receive(null_buffers(), in_flags); | |
228 | socket1.receive(buffer(mutable_char_buffer), in_flags, ec); | |
229 | socket1.receive(null_buffers(), in_flags, ec); | |
230 | ||
231 | socket1.async_receive(buffer(mutable_char_buffer), receive_handler); | |
232 | socket1.async_receive(null_buffers(), receive_handler); | |
233 | socket1.async_receive(buffer(mutable_char_buffer), in_flags, | |
234 | receive_handler); | |
235 | socket1.async_receive(null_buffers(), in_flags, receive_handler); | |
236 | ||
237 | rp::endpoint endpoint; | |
238 | socket1.receive_from(buffer(mutable_char_buffer), endpoint); | |
239 | socket1.receive_from(null_buffers(), endpoint); | |
240 | socket1.receive_from(buffer(mutable_char_buffer), endpoint, in_flags); | |
241 | socket1.receive_from(null_buffers(), endpoint, in_flags); | |
242 | socket1.receive_from(buffer(mutable_char_buffer), endpoint, in_flags, ec); | |
243 | socket1.receive_from(null_buffers(), endpoint, in_flags, ec); | |
244 | ||
245 | socket1.async_receive_from(buffer(mutable_char_buffer), | |
246 | endpoint, receive_handler); | |
247 | socket1.async_receive_from(null_buffers(), | |
248 | endpoint, receive_handler); | |
249 | socket1.async_receive_from(buffer(mutable_char_buffer), | |
250 | endpoint, in_flags, receive_handler); | |
251 | socket1.async_receive_from(null_buffers(), | |
252 | endpoint, in_flags, receive_handler); | |
253 | } | |
254 | catch (std::exception&) | |
255 | { | |
256 | } | |
257 | } | |
258 | ||
259 | } // namespace generic_raw_protocol_socket_compile | |
260 | ||
261 | //------------------------------------------------------------------------------ | |
262 | ||
263 | BOOST_ASIO_TEST_SUITE | |
264 | ( | |
265 | "generic/raw_protocol", | |
266 | BOOST_ASIO_TEST_CASE(generic_raw_protocol_socket_compile::test) | |
267 | ) |