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