1 //
2 // datagram_protocol.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 "asio/local/datagram_protocol.hpp"
18 
19 #include <cstring>
20 #include "asio/io_context.hpp"
21 #include "../unit_test.hpp"
22 
23 //------------------------------------------------------------------------------
24 
25 // local_datagram_protocol_socket_compile test
26 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
27 // The following test checks that all public member functions on the class
28 // local::datagram_socket::socket compile and link correctly. Runtime failures
29 // are ignored.
30 
31 namespace local_datagram_protocol_socket_compile {
32 
connect_handler(const asio::error_code &)33 void connect_handler(const asio::error_code&)
34 {
35 }
36 
send_handler(const asio::error_code &,std::size_t)37 void send_handler(const asio::error_code&, std::size_t)
38 {
39 }
40 
receive_handler(const asio::error_code &,std::size_t)41 void receive_handler(const asio::error_code&, std::size_t)
42 {
43 }
44 
test()45 void test()
46 {
47 #if defined(ASIO_HAS_LOCAL_SOCKETS)
48   using namespace asio;
49   namespace local = asio::local;
50   typedef local::datagram_protocol dp;
51 
52   try
53   {
54     io_context ioc;
55     char mutable_char_buffer[128] = "";
56     const char const_char_buffer[128] = "";
57     socket_base::message_flags in_flags = 0;
58     socket_base::send_buffer_size socket_option;
59     socket_base::bytes_readable io_control_command;
60     asio::error_code ec;
61 
62     // basic_datagram_socket constructors.
63 
64     dp::socket socket1(ioc);
65     dp::socket socket2(ioc, dp());
66     dp::socket socket3(ioc, dp::endpoint(""));
67     int native_socket1 = ::socket(AF_UNIX, SOCK_DGRAM, 0);
68     dp::socket socket4(ioc, dp(), native_socket1);
69 
70     // basic_io_object functions.
71 
72     io_context& ioc_ref = socket1.get_io_context();
73     (void)ioc_ref;
74 
75     // basic_socket functions.
76 
77     dp::socket::lowest_layer_type& lowest_layer = socket1.lowest_layer();
78     (void)lowest_layer;
79 
80     socket1.open(dp());
81     socket1.open(dp(), ec);
82 
83     int native_socket2 = ::socket(AF_UNIX, SOCK_DGRAM, 0);
84     socket1.assign(dp(), native_socket2);
85     int native_socket3 = ::socket(AF_UNIX, SOCK_DGRAM, 0);
86     socket1.assign(dp(), native_socket3, ec);
87 
88     bool is_open = socket1.is_open();
89     (void)is_open;
90 
91     socket1.close();
92     socket1.close(ec);
93 
94     dp::socket::native_handle_type native_socket4 = socket1.native_handle();
95     (void)native_socket4;
96 
97     socket1.cancel();
98     socket1.cancel(ec);
99 
100     bool at_mark1 = socket1.at_mark();
101     (void)at_mark1;
102     bool at_mark2 = socket1.at_mark(ec);
103     (void)at_mark2;
104 
105     std::size_t available1 = socket1.available();
106     (void)available1;
107     std::size_t available2 = socket1.available(ec);
108     (void)available2;
109 
110     socket1.bind(dp::endpoint(""));
111     socket1.bind(dp::endpoint(""), ec);
112 
113     socket1.connect(dp::endpoint(""));
114     socket1.connect(dp::endpoint(""), ec);
115 
116     socket1.async_connect(dp::endpoint(""), connect_handler);
117 
118     socket1.set_option(socket_option);
119     socket1.set_option(socket_option, ec);
120 
121     socket1.get_option(socket_option);
122     socket1.get_option(socket_option, ec);
123 
124     socket1.io_control(io_control_command);
125     socket1.io_control(io_control_command, ec);
126 
127     dp::endpoint endpoint1 = socket1.local_endpoint();
128     dp::endpoint endpoint2 = socket1.local_endpoint(ec);
129 
130     dp::endpoint endpoint3 = socket1.remote_endpoint();
131     dp::endpoint endpoint4 = socket1.remote_endpoint(ec);
132 
133     socket1.shutdown(socket_base::shutdown_both);
134     socket1.shutdown(socket_base::shutdown_both, ec);
135 
136     // basic_datagram_socket functions.
137 
138     socket1.send(buffer(mutable_char_buffer));
139     socket1.send(buffer(const_char_buffer));
140     socket1.send(null_buffers());
141     socket1.send(buffer(mutable_char_buffer), in_flags);
142     socket1.send(buffer(const_char_buffer), in_flags);
143     socket1.send(null_buffers(), in_flags);
144     socket1.send(buffer(mutable_char_buffer), in_flags, ec);
145     socket1.send(buffer(const_char_buffer), in_flags, ec);
146     socket1.send(null_buffers(), in_flags, ec);
147 
148     socket1.async_send(buffer(mutable_char_buffer), send_handler);
149     socket1.async_send(buffer(const_char_buffer), send_handler);
150     socket1.async_send(null_buffers(), send_handler);
151     socket1.async_send(buffer(mutable_char_buffer), in_flags, send_handler);
152     socket1.async_send(buffer(const_char_buffer), in_flags, send_handler);
153     socket1.async_send(null_buffers(), in_flags, send_handler);
154 
155     socket1.send_to(buffer(mutable_char_buffer),
156         dp::endpoint(""));
157     socket1.send_to(buffer(const_char_buffer),
158         dp::endpoint(""));
159     socket1.send_to(null_buffers(),
160         dp::endpoint(""));
161     socket1.send_to(buffer(mutable_char_buffer),
162         dp::endpoint(""), in_flags);
163     socket1.send_to(buffer(const_char_buffer),
164         dp::endpoint(""), in_flags);
165     socket1.send_to(null_buffers(),
166         dp::endpoint(""), in_flags);
167     socket1.send_to(buffer(mutable_char_buffer),
168         dp::endpoint(""), in_flags, ec);
169     socket1.send_to(buffer(const_char_buffer),
170         dp::endpoint(""), in_flags, ec);
171     socket1.send_to(null_buffers(),
172         dp::endpoint(""), in_flags, ec);
173 
174     socket1.async_send_to(buffer(mutable_char_buffer),
175         dp::endpoint(""), send_handler);
176     socket1.async_send_to(buffer(const_char_buffer),
177         dp::endpoint(""), send_handler);
178     socket1.async_send_to(null_buffers(),
179         dp::endpoint(""), send_handler);
180     socket1.async_send_to(buffer(mutable_char_buffer),
181         dp::endpoint(""), in_flags, send_handler);
182     socket1.async_send_to(buffer(const_char_buffer),
183         dp::endpoint(""), in_flags, send_handler);
184     socket1.async_send_to(null_buffers(),
185         dp::endpoint(""), in_flags, send_handler);
186 
187     socket1.receive(buffer(mutable_char_buffer));
188     socket1.receive(null_buffers());
189     socket1.receive(buffer(mutable_char_buffer), in_flags);
190     socket1.receive(null_buffers(), in_flags);
191     socket1.receive(buffer(mutable_char_buffer), in_flags, ec);
192     socket1.receive(null_buffers(), in_flags, ec);
193 
194     socket1.async_receive(buffer(mutable_char_buffer), receive_handler);
195     socket1.async_receive(null_buffers(), receive_handler);
196     socket1.async_receive(buffer(mutable_char_buffer), in_flags,
197         receive_handler);
198     socket1.async_receive(null_buffers(), in_flags, receive_handler);
199 
200     dp::endpoint endpoint;
201     socket1.receive_from(buffer(mutable_char_buffer), endpoint);
202     socket1.receive_from(null_buffers(), endpoint);
203     socket1.receive_from(buffer(mutable_char_buffer), endpoint, in_flags);
204     socket1.receive_from(null_buffers(), endpoint, in_flags);
205     socket1.receive_from(buffer(mutable_char_buffer), endpoint, in_flags, ec);
206     socket1.receive_from(null_buffers(), endpoint, in_flags, ec);
207 
208     socket1.async_receive_from(buffer(mutable_char_buffer),
209         endpoint, receive_handler);
210     socket1.async_receive_from(null_buffers(),
211         endpoint, receive_handler);
212     socket1.async_receive_from(buffer(mutable_char_buffer),
213         endpoint, in_flags, receive_handler);
214     socket1.async_receive_from(null_buffers(),
215         endpoint, in_flags, receive_handler);
216   }
217   catch (std::exception&)
218   {
219   }
220 #endif // defined(ASIO_HAS_LOCAL_SOCKETS)
221 }
222 
223 } // namespace local_datagram_protocol_socket_compile
224 
225 //------------------------------------------------------------------------------
226 
227 ASIO_TEST_SUITE
228 (
229   "local/datagram_protocol",
230   ASIO_TEST_CASE(local_datagram_protocol_socket_compile::test)
231 )
232