stream_protocol.cpp 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. //
  2. // generic/stream_protocol.cpp
  3. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2019 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. // Disable autolinking for unit tests.
  11. #if !defined(BOOST_ALL_NO_LIB)
  12. #define BOOST_ALL_NO_LIB 1
  13. #endif // !defined(BOOST_ALL_NO_LIB)
  14. // Test that header file is self-contained.
  15. #include <boost/asio/generic/stream_protocol.hpp>
  16. #include <cstring>
  17. #include <boost/asio/io_context.hpp>
  18. #include <boost/asio/ip/tcp.hpp>
  19. #include "../unit_test.hpp"
  20. #if defined(__cplusplus_cli) || defined(__cplusplus_winrt)
  21. # define generic cpp_generic
  22. #endif
  23. //------------------------------------------------------------------------------
  24. // generic_stream_protocol_socket_compile test
  25. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  26. // The following test checks that all public member functions on the class
  27. // generic::stream_protocol::socket compile and link correctly. Runtime
  28. // failures are ignored.
  29. namespace generic_stream_protocol_socket_compile {
  30. void connect_handler(const boost::system::error_code&)
  31. {
  32. }
  33. void send_handler(const boost::system::error_code&, std::size_t)
  34. {
  35. }
  36. void receive_handler(const boost::system::error_code&, std::size_t)
  37. {
  38. }
  39. void write_some_handler(const boost::system::error_code&, std::size_t)
  40. {
  41. }
  42. void read_some_handler(const boost::system::error_code&, std::size_t)
  43. {
  44. }
  45. void test()
  46. {
  47. using namespace boost::asio;
  48. namespace generic = boost::asio::generic;
  49. typedef generic::stream_protocol sp;
  50. const int af_inet = BOOST_ASIO_OS_DEF(AF_INET);
  51. const int ipproto_tcp = BOOST_ASIO_OS_DEF(IPPROTO_TCP);
  52. const int sock_stream = BOOST_ASIO_OS_DEF(SOCK_STREAM);
  53. try
  54. {
  55. io_context ioc;
  56. char mutable_char_buffer[128] = "";
  57. const char const_char_buffer[128] = "";
  58. socket_base::message_flags in_flags = 0;
  59. socket_base::keep_alive socket_option;
  60. socket_base::bytes_readable io_control_command;
  61. boost::system::error_code ec;
  62. // basic_stream_socket constructors.
  63. sp::socket socket1(ioc);
  64. sp::socket socket2(ioc, sp(af_inet, ipproto_tcp));
  65. sp::socket socket3(ioc, sp::endpoint());
  66. #if defined(BOOST_ASIO_WINDOWS_RUNTIME)
  67. Windows::Networking::Sockets::StreamSocket^ native_socket1 = nullptr;
  68. #else // defined(BOOST_ASIO_WINDOWS_RUNTIME)
  69. sp::socket::native_handle_type native_socket1
  70. = ::socket(af_inet, sock_stream, 0);
  71. #endif // defined(BOOST_ASIO_WINDOWS_RUNTIME)
  72. sp::socket socket4(ioc, sp(af_inet, ipproto_tcp), native_socket1);
  73. #if defined(BOOST_ASIO_HAS_MOVE)
  74. sp::socket socket5(std::move(socket4));
  75. boost::asio::ip::tcp::socket tcp_socket(ioc);
  76. sp::socket socket6(std::move(tcp_socket));
  77. #endif // defined(BOOST_ASIO_HAS_MOVE)
  78. // basic_stream_socket operators.
  79. #if defined(BOOST_ASIO_HAS_MOVE)
  80. socket1 = sp::socket(ioc);
  81. socket1 = std::move(socket2);
  82. socket1 = boost::asio::ip::tcp::socket(ioc);
  83. #endif // defined(BOOST_ASIO_HAS_MOVE)
  84. // basic_io_object functions.
  85. sp::socket::executor_type ex = socket1.get_executor();
  86. (void)ex;
  87. // basic_socket functions.
  88. sp::socket::lowest_layer_type& lowest_layer = socket1.lowest_layer();
  89. (void)lowest_layer;
  90. socket1.open(sp(af_inet, ipproto_tcp));
  91. socket1.open(sp(af_inet, ipproto_tcp), ec);
  92. #if defined(BOOST_ASIO_WINDOWS_RUNTIME)
  93. Windows::Networking::Sockets::StreamSocket^ native_socket2 = nullptr;
  94. #else // defined(BOOST_ASIO_WINDOWS_RUNTIME)
  95. sp::socket::native_handle_type native_socket2
  96. = ::socket(af_inet, sock_stream, 0);
  97. #endif // defined(BOOST_ASIO_WINDOWS_RUNTIME)
  98. socket1.assign(sp(af_inet, ipproto_tcp), native_socket2);
  99. #if defined(BOOST_ASIO_WINDOWS_RUNTIME)
  100. Windows::Networking::Sockets::StreamSocket^ native_socket3 = nullptr;
  101. #else // defined(BOOST_ASIO_WINDOWS_RUNTIME)
  102. sp::socket::native_handle_type native_socket3
  103. = ::socket(af_inet, sock_stream, 0);
  104. #endif // defined(BOOST_ASIO_WINDOWS_RUNTIME)
  105. socket1.assign(sp(af_inet, ipproto_tcp), native_socket3, ec);
  106. bool is_open = socket1.is_open();
  107. (void)is_open;
  108. socket1.close();
  109. socket1.close(ec);
  110. sp::socket::native_handle_type native_socket4 = socket1.native_handle();
  111. (void)native_socket4;
  112. socket1.cancel();
  113. socket1.cancel(ec);
  114. bool at_mark1 = socket1.at_mark();
  115. (void)at_mark1;
  116. bool at_mark2 = socket1.at_mark(ec);
  117. (void)at_mark2;
  118. std::size_t available1 = socket1.available();
  119. (void)available1;
  120. std::size_t available2 = socket1.available(ec);
  121. (void)available2;
  122. socket1.bind(sp::endpoint());
  123. socket1.bind(sp::endpoint(), ec);
  124. socket1.connect(sp::endpoint());
  125. socket1.connect(sp::endpoint(), ec);
  126. socket1.async_connect(sp::endpoint(), connect_handler);
  127. socket1.set_option(socket_option);
  128. socket1.set_option(socket_option, ec);
  129. socket1.get_option(socket_option);
  130. socket1.get_option(socket_option, ec);
  131. socket1.io_control(io_control_command);
  132. socket1.io_control(io_control_command, ec);
  133. sp::endpoint endpoint1 = socket1.local_endpoint();
  134. (void)endpoint1;
  135. sp::endpoint endpoint2 = socket1.local_endpoint(ec);
  136. (void)endpoint2;
  137. sp::endpoint endpoint3 = socket1.remote_endpoint();
  138. (void)endpoint3;
  139. sp::endpoint endpoint4 = socket1.remote_endpoint(ec);
  140. (void)endpoint4;
  141. socket1.shutdown(socket_base::shutdown_both);
  142. socket1.shutdown(socket_base::shutdown_both, ec);
  143. // basic_stream_socket functions.
  144. socket1.send(buffer(mutable_char_buffer));
  145. socket1.send(buffer(const_char_buffer));
  146. socket1.send(null_buffers());
  147. socket1.send(buffer(mutable_char_buffer), in_flags);
  148. socket1.send(buffer(const_char_buffer), in_flags);
  149. socket1.send(null_buffers(), in_flags);
  150. socket1.send(buffer(mutable_char_buffer), in_flags, ec);
  151. socket1.send(buffer(const_char_buffer), in_flags, ec);
  152. socket1.send(null_buffers(), in_flags, ec);
  153. socket1.async_send(buffer(mutable_char_buffer), send_handler);
  154. socket1.async_send(buffer(const_char_buffer), send_handler);
  155. socket1.async_send(null_buffers(), send_handler);
  156. socket1.async_send(buffer(mutable_char_buffer), in_flags, send_handler);
  157. socket1.async_send(buffer(const_char_buffer), in_flags, send_handler);
  158. socket1.async_send(null_buffers(), in_flags, send_handler);
  159. socket1.receive(buffer(mutable_char_buffer));
  160. socket1.receive(null_buffers());
  161. socket1.receive(buffer(mutable_char_buffer), in_flags);
  162. socket1.receive(null_buffers(), in_flags);
  163. socket1.receive(buffer(mutable_char_buffer), in_flags, ec);
  164. socket1.receive(null_buffers(), in_flags, ec);
  165. socket1.async_receive(buffer(mutable_char_buffer), receive_handler);
  166. socket1.async_receive(null_buffers(), receive_handler);
  167. socket1.async_receive(buffer(mutable_char_buffer), in_flags,
  168. receive_handler);
  169. socket1.async_receive(null_buffers(), in_flags, receive_handler);
  170. socket1.write_some(buffer(mutable_char_buffer));
  171. socket1.write_some(buffer(const_char_buffer));
  172. socket1.write_some(null_buffers());
  173. socket1.write_some(buffer(mutable_char_buffer), ec);
  174. socket1.write_some(buffer(const_char_buffer), ec);
  175. socket1.write_some(null_buffers(), ec);
  176. socket1.async_write_some(buffer(mutable_char_buffer), write_some_handler);
  177. socket1.async_write_some(buffer(const_char_buffer), write_some_handler);
  178. socket1.async_write_some(null_buffers(), write_some_handler);
  179. socket1.read_some(buffer(mutable_char_buffer));
  180. socket1.read_some(buffer(mutable_char_buffer), ec);
  181. socket1.read_some(null_buffers(), ec);
  182. socket1.async_read_some(buffer(mutable_char_buffer), read_some_handler);
  183. socket1.async_read_some(null_buffers(), read_some_handler);
  184. }
  185. catch (std::exception&)
  186. {
  187. }
  188. }
  189. } // namespace generic_stream_protocol_socket_compile
  190. //------------------------------------------------------------------------------
  191. BOOST_ASIO_TEST_SUITE
  192. (
  193. "generic/stream_protocol",
  194. BOOST_ASIO_TEST_CASE(generic_stream_protocol_socket_compile::test)
  195. )