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