1//
2// serial_port.cpp
3// ~~~~~~~~~~~~~~~
4//
5// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6// Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com)
7//
8// Distributed under the Boost Software License, Version 1.0. (See accompanying
9// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
10//
11
12// Disable autolinking for unit tests.
13#if !defined(BOOST_ALL_NO_LIB)
14#define BOOST_ALL_NO_LIB 1
15#endif // !defined(BOOST_ALL_NO_LIB)
16
17// Test that header file is self-contained.
18#include <boost/asio/serial_port.hpp>
19
20#include "archetypes/async_result.hpp"
21#include <boost/asio/io_context.hpp>
22#include "unit_test.hpp"
23
24//------------------------------------------------------------------------------
25
26// serial_port_compile test
27// ~~~~~~~~~~~~~~~~~~~~~~~~~~
28// The following test checks that all public member functions on the class
29// serial_port compile and link correctly. Runtime failures are ignored.
30
31namespace serial_port_compile {
32
33struct write_some_handler
34{
35 write_some_handler() {}
36 void operator()(const boost::system::error_code&, std::size_t) {}
37 write_some_handler(write_some_handler&&) {}
38private:
39 write_some_handler(const write_some_handler&);
40};
41
42struct read_some_handler
43{
44 read_some_handler() {}
45 void operator()(const boost::system::error_code&, std::size_t) {}
46 read_some_handler(read_some_handler&&) {}
47private:
48 read_some_handler(const read_some_handler&);
49};
50
51void test()
52{
53#if defined(BOOST_ASIO_HAS_SERIAL_PORT)
54 using namespace boost::asio;
55
56 try
57 {
58 io_context ioc;
59 const io_context::executor_type ioc_ex = ioc.get_executor();
60 char mutable_char_buffer[128] = "";
61 const char const_char_buffer[128] = "";
62 serial_port::baud_rate serial_port_option;
63 archetypes::lazy_handler lazy;
64 boost::system::error_code ec;
65
66 // basic_serial_port constructors.
67
68 serial_port port1(ioc);
69 serial_port port2(ioc, "null");
70 serial_port::native_handle_type native_port1 = port1.native_handle();
71#if defined(BOOST_ASIO_MSVC) && (_MSC_VER < 1910)
72 // Skip this on older MSVC due to mysterious ambiguous overload errors.
73#else
74 serial_port port3(ioc, native_port1);
75#endif
76
77 serial_port port4(ioc_ex);
78 serial_port port5(ioc_ex, "null");
79 serial_port::native_handle_type native_port2 = port1.native_handle();
80 serial_port port6(ioc_ex, native_port2);
81
82 serial_port port7(std::move(port6));
83
84 basic_serial_port<io_context::executor_type> port8(ioc);
85 serial_port port9(std::move(port8));
86
87 // basic_serial_port operators.
88
89 port1 = serial_port(ioc);
90 port1 = std::move(port2);
91 port1 = std::move(port8);
92
93 // basic_io_object functions.
94
95 serial_port::executor_type ex = port1.get_executor();
96 (void)ex;
97
98 // basic_serial_port functions.
99
100 serial_port::lowest_layer_type& lowest_layer = port1.lowest_layer();
101 (void)lowest_layer;
102
103 const serial_port& port10 = port1;
104 const serial_port::lowest_layer_type& lowest_layer2 = port10.lowest_layer();
105 (void)lowest_layer2;
106
107 port1.open(device: "null");
108 port1.open(device: "null", ec);
109
110 serial_port::native_handle_type native_port3 = port1.native_handle();
111 port1.assign(native_serial_port: native_port3);
112 serial_port::native_handle_type native_port4 = port1.native_handle();
113 port1.assign(native_serial_port: native_port4, ec);
114
115 bool is_open = port1.is_open();
116 (void)is_open;
117
118 port1.close();
119 port1.close(ec);
120
121 serial_port::native_handle_type native_port5 = port1.native_handle();
122 (void)native_port5;
123
124 port1.cancel();
125 port1.cancel(ec);
126
127 port1.set_option(serial_port_option);
128 port1.set_option(option: serial_port_option, ec);
129
130 port1.get_option(option&: serial_port_option);
131 port1.get_option(option&: serial_port_option, ec);
132
133 port1.send_break();
134 port1.send_break(ec);
135
136 port1.write_some(buffers: buffer(data&: mutable_char_buffer));
137 port1.write_some(buffers: buffer(data: const_char_buffer));
138 port1.write_some(buffers: buffer(data&: mutable_char_buffer), ec);
139 port1.write_some(buffers: buffer(data: const_char_buffer), ec);
140
141 port1.async_write_some(buffers: buffer(data&: mutable_char_buffer), token: write_some_handler());
142 port1.async_write_some(buffers: buffer(data: const_char_buffer), token: write_some_handler());
143 int i1 = port1.async_write_some(buffers: buffer(data&: mutable_char_buffer), token&: lazy);
144 (void)i1;
145 int i2 = port1.async_write_some(buffers: buffer(data: const_char_buffer), token&: lazy);
146 (void)i2;
147
148 port1.read_some(buffers: buffer(data&: mutable_char_buffer));
149 port1.read_some(buffers: buffer(data&: mutable_char_buffer), ec);
150
151 port1.async_read_some(buffers: buffer(data&: mutable_char_buffer), token: read_some_handler());
152 int i3 = port1.async_read_some(buffers: buffer(data&: mutable_char_buffer), token&: lazy);
153 (void)i3;
154 }
155 catch (std::exception&)
156 {
157 }
158#endif // defined(BOOST_ASIO_HAS_SERIAL_PORT)
159}
160
161} // namespace serial_port_compile
162
163//------------------------------------------------------------------------------
164
165BOOST_ASIO_TEST_SUITE
166(
167 "serial_port",
168 BOOST_ASIO_COMPILE_TEST_CASE(serial_port_compile::test)
169)
170

source code of boost/libs/asio/test/serial_port.cpp