1 /*
2 	restinio
3 */
4 
5 /*!
6 	Tests for settings parameters that have default constructor.
7 */
8 
9 #include <catch2/catch.hpp>
10 
11 #include <restinio/all.hpp>
12 
13 using namespace restinio;
14 
15 #define RESTINIO_REQHANDLER_UTEST_INTERNALS \
16 auto operator () ( request_handle_t ) const \
17 {	return restinio::request_rejected(); }
18 
19 TEST_CASE( "Request handler" , "[settings][request_handler]" )
20 {
21 	SECTION( "Has default ctor" )
22 	{
23 		struct req_handler_t
24 		{
25 			const bool m_is_default_constructed;
26 
req_handler_treq_handler_t27 			req_handler_t()
28 				:	m_is_default_constructed{ true }
29 			{}
req_handler_treq_handler_t30 			req_handler_t( int )
31 				:	m_is_default_constructed{ false }
32 			{}
33 
34 			RESTINIO_REQHANDLER_UTEST_INTERNALS
35 		};
36 
37 		using settings_t =
38 			server_settings_t<
39 				traits_t<
40 					asio_timer_manager_t,
41 					null_logger_t,
42 					req_handler_t > >;
43 
44 		settings_t s{};
45 
46 		REQUIRE( s.request_handler()->m_is_default_constructed );
47 
48 		s.request_handler( 42 );
49 		REQUIRE_FALSE( s.request_handler()->m_is_default_constructed );
50 	}
51 
52 	SECTION( "No default ctor" )
53 	{
54 		struct req_handler_t
55 		{
req_handler_treq_handler_t56 			req_handler_t( int )
57 			{}
58 
59 			RESTINIO_REQHANDLER_UTEST_INTERNALS
60 		};
61 
62 		using settings_t =
63 			server_settings_t<
64 				traits_t<
65 					asio_timer_manager_t,
66 					null_logger_t,
67 					req_handler_t > >;
68 
69 		settings_t s{};
70 
71 		REQUIRE_THROWS_WITH(
72 			s.request_handler(),
73 			Catch::Matchers::Contains( "request handler" ) );
74 
75 		s.request_handler( 42 );
76 		REQUIRE_NOTHROW( s.request_handler() );
77 	}
78 
79 	SECTION( "std::function" )
80 	{
81 		using req_handler_t = default_request_handler_t;
82 
83 		using settings_t =
84 			server_settings_t<
85 				traits_t<
86 					asio_timer_manager_t,
87 					null_logger_t,
88 					req_handler_t > >;
89 
90 		settings_t s{};
91 
92 		REQUIRE_THROWS_WITH(
93 			s.request_handler(),
94 			Catch::Matchers::Contains( "request handler" ) );
95 
96 		s.request_handler(
__anon1fc478570102( request_handle_t )97 			[]( request_handle_t ){
98 				return restinio::request_rejected();
99 			} );
100 
101 		REQUIRE_NOTHROW( s.request_handler() );
102 	}
103 }
104 
105 #define RESTINIO_LOGGER_UTEST_INTERNALS \
106 template < typename MSG_BUILDER > \
107 constexpr void trace( MSG_BUILDER && ) const {} \
108 template < typename MSG_BUILDER > \
109 constexpr void info( MSG_BUILDER && ) const {} \
110 template < typename MSG_BUILDER > \
111 constexpr void warn( MSG_BUILDER && ) const {} \
112 template < typename MSG_BUILDER > \
113 constexpr void error( MSG_BUILDER && ) const {}
114 
115 struct logger1_t
116 {
117 	const bool m_is_default_constructed;
118 
logger1_tlogger1_t119 	logger1_t()
120 		:	m_is_default_constructed{ true }
121 	{}
logger1_tlogger1_t122 	logger1_t( int )
123 		:	m_is_default_constructed{ false }
124 	{}
125 
126 	RESTINIO_LOGGER_UTEST_INTERNALS
127 };
128 
129 struct logger2_t
130 {
logger2_tlogger2_t131 	logger2_t( int )
132 	{}
133 
134 	RESTINIO_LOGGER_UTEST_INTERNALS
135 };
136 
137 TEST_CASE( "Logger" , "[settings][logger]" )
138 {
139 	SECTION( "Has default ctor" )
140 	{
141 
142 
143 
144 		using settings_t =
145 			server_settings_t<
146 				traits_t<
147 					asio_timer_manager_t,
148 					logger1_t > >;
149 
150 		settings_t s{};
151 
152 		REQUIRE( s.logger()->m_is_default_constructed );
153 
154 		s.logger( 42 );
155 		REQUIRE_FALSE( s.logger()->m_is_default_constructed );
156 	}
157 
158 	SECTION( "No default ctor" )
159 	{
160 
161 		using settings_t =
162 			server_settings_t<
163 				traits_t<
164 					asio_timer_manager_t,
165 					logger2_t > >;
166 
167 		settings_t s{};
168 
169 		REQUIRE_THROWS_WITH(
170 			s.logger(),
171 			Catch::Matchers::Contains( "logger" ) );
172 
173 		s.logger( 42 );
174 		REQUIRE_NOTHROW( s.logger() );
175 	}
176 }
177 
178 #define RESTINIO_TIMERFACTORY_UTEST_INTERNALS \
179 struct timer_guard_t { \
180 		template <typename... Args > \
181 		constexpr void \
182 		schedule_operation_timeout_callback( Args &&... ) const \
183 		{} \
184 		constexpr void \
185 		cancel() const \
186 		{}\
187 }; \
188 	void start() const {} \
189 	void stop() const {}
190 
191 
192 struct timer_manager1_t
193 {
194 	const bool m_is_default_constructed;
195 
timer_manager1_ttimer_manager1_t196 	timer_manager1_t( bool is_default_constructed )
197 		:	m_is_default_constructed{ is_default_constructed }
198 	{}
199 
200 	RESTINIO_TIMERFACTORY_UTEST_INTERNALS
201 
202 	struct factory_t
203 	{
204 		const bool m_is_default_constructed;
205 
factory_ttimer_manager1_t::factory_t206 		factory_t()
207 			:	m_is_default_constructed{ true }
208 		{}
209 
factory_ttimer_manager1_t::factory_t210 		factory_t( int )
211 			:	m_is_default_constructed{ false }
212 		{}
213 
createtimer_manager1_t::factory_t214 		auto create( asio_ns::io_context & )
215 		{
216 			return std::make_shared< timer_manager1_t >( m_is_default_constructed );
217 		}
218 	};
219 };
220 
221 struct timer_manager2_t
222 {
223 	RESTINIO_TIMERFACTORY_UTEST_INTERNALS
224 
225 	struct factory_t
226 	{
factory_ttimer_manager2_t::factory_t227 		factory_t( int )
228 		{}
229 
createtimer_manager2_t::factory_t230 		auto create( asio_ns::io_context & )
231 		{
232 			return std::make_shared< timer_manager2_t >();
233 		}
234 	};
235 };
236 
237 TEST_CASE( "Timer factory" , "[settings][timer_factory]" )
238 {
239 	SECTION( "Has default ctor" )
240 	{
241 		using settings_t =
242 			server_settings_t<
243 				traits_t<
244 					timer_manager1_t,
245 					logger1_t > >;
246 
247 		settings_t s{};
248 
249 		asio_ns::io_context io_context;
250 
251 		REQUIRE( s.timer_factory()->create(io_context)->m_is_default_constructed );
252 
253 		s.timer_manager( 42 );
254 		REQUIRE_FALSE( s.timer_factory()->create(io_context)->m_is_default_constructed );
255 	}
256 
257 	SECTION( "No default ctor" )
258 	{
259 
260 		using settings_t =
261 			server_settings_t<
262 				traits_t<
263 					timer_manager2_t,
264 					logger2_t > >;
265 
266 		settings_t s{};
267 
268 		REQUIRE_THROWS_WITH(
269 			s.timer_factory(),
270 			Catch::Matchers::Contains( "timer manager" ) );
271 
272 		s.timer_manager( 42 );
273 		REQUIRE_NOTHROW( s.timer_factory() );
274 	}
275 }
276 
277 TEST_CASE( "Acceptor options" , "[settings][acceptor_options]" )
278 {
279 	using settings_t = server_settings_t< restinio::default_traits_t >;
280 
281 	settings_t s{};
282 
283 	auto acceptor_option_setter = s.acceptor_options_setter();
284 	REQUIRE( acceptor_option_setter );
285 
286 	bool lambda_was_called = false;
287 	s.acceptor_options_setter(
__anon1fc478570202( auto & )288 		[&]( auto & ){
289 			lambda_was_called = true;
290 		} );
291 
292 	acceptor_option_setter = s.acceptor_options_setter();
293 	restinio::acceptor_options_t
294 		acceptor_options{ *static_cast< asio_ns::ip::tcp::acceptor * >( nullptr ) };
295 
296 	(*acceptor_option_setter)( acceptor_options );
297 
298 	REQUIRE( lambda_was_called );
299 }
300 
301 TEST_CASE( "Socket options" , "[settings][socket_options]" )
302 {
303 	using settings_t = server_settings_t< restinio::default_traits_t >;
304 
305 	settings_t s{};
306 
307 	auto socket_option_setter = s.socket_options_setter();
308 	REQUIRE( socket_option_setter );
309 
310 	bool lambda_was_called = false;
311 	s.socket_options_setter(
__anon1fc478570302( auto & )312 		[&]( auto & ){
313 			lambda_was_called = true;
314 		} );
315 
316 	socket_option_setter = s.socket_options_setter();
317 	restinio::socket_options_t
318 		socket_options{ *static_cast< asio_ns::ip::tcp::socket * >( nullptr ) };
319 
320 	(*socket_option_setter)( socket_options );
321 
322 	REQUIRE( lambda_was_called );
323 }
324