4 #include <boost/thread/thread.hpp>
5 #include <boost/test/included/unit_test.hpp>
7 #include "tcp_ssl_socket.h"
11 #define DUMMI_SERVER_IP "127.0.0.1"
12 #define DUMMI_SERVER_PORT 7000
14 using namespace boost::unit_test_framework;
20 test_client(boost::asio::io_service& io_service, boost::asio::ssl::context& context) :
21 my_socket(io_service,context){
28 //! socket connect mutex
29 connect_mutex.wrlock();
30 //! socket handshake mutex
31 hadshake_mutex.wrlock();
34 //! socket write mutex
36 //! socket close mutex
42 void handshake_test_run(){
47 l7vs::rw_scoped_lock scope_lock(connect_mutex);
56 l7vs::rw_scoped_lock scope_lock(hadshake_mutex);
58 if(!handshake_test()){
65 l7vs::rw_scoped_lock scope_lock(write_mutex);
73 l7vs::rw_scoped_lock scope_lock(read_mutex);
82 l7vs::rw_scoped_lock scope_lock(close_mutex);
90 boost::system::error_code ec;
91 boost::asio::ip::tcp::endpoint connect_end(boost::asio::ip::address::from_string(DUMMI_SERVER_IP), DUMMI_SERVER_PORT);
92 my_socket.lowest_layer().connect(connect_end,ec);
95 std::cout << "dummy client connect Error!" << std::endl;
98 std::cout << "dummy client connect OK" << std::endl;
102 bool handshake_test(){
104 boost::system::error_code ec;
105 my_socket.handshake(boost::asio::ssl::stream_base::server, ec);
108 std::cout << "dummy client handshake Error!" << std::endl;
111 std::cout << "dummy client handshake OK" << std::endl;
117 boost::system::error_code ec;
118 my_socket.write_some(boost::asio::buffer(request,MAX_BUFFER_SIZE), ec);
121 std::cout << "dummy client send Error!" << std::endl;
124 std::cout << "dummy client send OK" << std::endl;
129 boost::system::error_code ec;
130 my_socket.read_some(boost::asio::buffer(response,MAX_BUFFER_SIZE), ec);
133 std::cout << "dummy client receive Error!" << std::endl;
136 std::cout << "dummy client receive OK" << std::endl;
141 boost::system::error_code ec;
142 my_socket.lowest_layer().close(ec);
145 std::cout << "dummy client close Error!" << std::endl;
148 std::cout << "dummy client close OK" << std::endl;
151 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> my_socket;
152 boost::array<char,MAX_BUFFER_SIZE> request;
153 boost::array<char,MAX_BUFFER_SIZE> response;
155 //! socket connect mutex
156 l7vs::wr_mutex connect_mutex;
157 //! socket handshake mutex
158 l7vs::wr_mutex handshake_mutex;
159 //! socket read mutex
160 l7vs::wr_mutex read_mutex;
161 //! socket write mutex
162 l7vs::wr_mutex write_mutex;
163 //! socket close mutex
164 l7vs::wr_mutex close_mutex;
168 class test_ssl_socket_class : public l7vs::tcp_ssl_socket{
171 test_ssl_socket_class(boost::asio::io_service& io,boost::asio::ssl::context& context,const l7vs::tcp_socket_option_info set_option) : l7vs::tcp_ssl_socket(io,context,set_option){
173 ~test_ssl_socket_class(){};
175 boost::asio::ip::tcp::endpoint get_local_end(){
176 return my_socket.lowest_layer().local_endpoint();
178 boost::asio::ip::tcp::endpoint get_remote_end(){
179 return my_socket.lowest_layer().remote_endpoint();
181 boost::asio::io_service& get_io(){
182 return my_socket.lowest_layer().get_io_service();
185 void test_close(boost::system::error_code& ec){
186 my_socket.lowest_layer().close(ec);
189 bool& get_open_flag(){
193 boost::asio::ssl::stream<boost::asio::ip::tcp::socket>* get_socket_pointer(){
197 l7vs::tcp_socket_option_info* get_opt_info(){
201 std::string get_password() const
210 void construcor_test(){
213 BOOST_MESSAGE( "----- construcor test start -----" );
215 boost::asio::io_service io;
217 l7vs::tcp_socket_option_info set_option;
218 //! TCP_NODELAY (false:not set,true:set option)
219 set_option.nodelay_opt = true;
220 //! TCP_NODELAY option value (false:off,true:on)
221 set_option.nodelay_val = true;
222 //! TCP_CORK (false:not set,true:set option)
223 set_option.cork_opt = true;
224 //! TCP_CORK option value (false:off,true:on)
225 set_option.cork_val = true;
226 //! TCP_QUICKACK (false:not set,true:set option)
227 set_option.quickack_opt = true;
228 //! TCP_QUICKACK option value (false:off,true:on)
229 set_option.quickack_val = true;
232 boost::asio::ssl::context server_ctx(io,boost::asio::ssl::context::sslv23);
234 test_ssl_socket_class test_obj(io,server_ctx,set_option);
236 // unit_test [1] construcor test set io object
237 std::cout << "[1] construcor test set io object" << std::endl;
238 boost::asio::io_service& set_io = test_obj.get_io();
239 BOOST_CHECK_EQUAL(&io , &set_io);
241 // unit_test [2] construcor test init open_flag
242 std::cout << "[2] construcor test init open_flag" << std::endl;
243 BOOST_CHECK(!test_obj.get_open_flag());
245 // unit_test [3] construcor test set socket option nodelay_opt
246 std::cout << "[3] construcor test set socket option nodelay_opt" << std::endl;
247 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->nodelay_opt , set_option.nodelay_opt);
249 // unit_test [4] construcor test set socket option nodelay_val
250 std::cout << "[4] construcor test set socket option nodelay_val" << std::endl;
251 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->nodelay_val , set_option.nodelay_val);
253 // unit_test [5] construcor test set socket option cork_opt
254 std::cout << "[5] construcor test set socket option cork_opt" << std::endl;
255 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->cork_opt , set_option.cork_opt);
257 // unit_test [6] construcor test set socket option cork_val
258 std::cout << "[6] construcor test set socket option cork_val" << std::endl;
259 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->cork_val , set_option.cork_val);
261 // unit_test [7] construcor test set socket option quickack_opt
262 std::cout << "[7] construcor test set socket option quickack_opt" << std::endl;
263 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->quickack_opt , set_option.quickack_opt);
265 // unit_test [8] construcor test set socket option quickack_val
266 std::cout << "[8] construcor test set socket option quickack_val" << std::endl;
267 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->quickack_val , set_option.quickack_val);
269 BOOST_MESSAGE( "----- construcor test end -----" );
273 void handshake_test(){
276 BOOST_MESSAGE( "----- handshake test start -----" );
278 boost::asio::io_service io;
279 boost::system::error_code ec;
281 l7vs::tcp_socket_option_info set_option;
282 //! TCP_NODELAY (false:not set,true:set option)
283 set_option.nodelay_opt = false;
284 //! TCP_NODELAY option value (false:off,true:on)
285 set_option.nodelay_val = false;
286 //! TCP_CORK (false:not set,true:set option)
287 set_option.cork_opt = false;
288 //! TCP_CORK option value (false:off,true:on)
289 set_option.cork_val = false;
290 //! TCP_QUICKACK (false:not set,true:set option)
291 set_option.quickack_opt = false;
292 //! TCP_QUICKACK option value (false:off,true:on)
293 set_option.quickack_val = false;
295 std::cout << "DEBUG TEST A" << std::endl;
298 boost::asio::ssl::context client_ctx(io,boost::asio::ssl::context::sslv23);
299 client_ctx.set_verify_mode(boost::asio::ssl::context::verify_peer);
300 client_ctx.load_verify_file("ca.pem");
304 std::cout << "DEBUG TEST B" << std::endl;
305 boost::asio::ssl::context server_ctx(io,boost::asio::ssl::context::sslv23);
306 test_ssl_socket_class test_obj(io,server_ctx,set_option);
308 std::cout << "DEBUG TEST C" << std::endl;
309 server_ctx.set_options(
310 boost::asio::ssl::context::default_workarounds
311 | boost::asio::ssl::context::no_sslv2
312 | boost::asio::ssl::context::single_dh_use);
313 server_ctx.set_password_callback(boost::bind(&test_ssl_socket_class::get_password, &test_obj));
314 server_ctx.use_certificate_chain_file("server.pem");
315 server_ctx.use_private_key_file("server.pem", boost::asio::ssl::context::pem);
316 server_ctx.use_tmp_dh_file("dh512.pem");
318 std::cout << "DEBUG TEST D" << std::endl;
319 boost::asio::ip::tcp::endpoint listen_end(boost::asio::ip::address::from_string(DUMMI_SERVER_IP), DUMMI_SERVER_PORT);
320 boost::asio::ip::tcp::acceptor test_acceptor(io,listen_end,ec);
322 std::cout << "DEBUG TEST E" << std::endl;
323 test_client dummy_cl(io,client_ctx);
324 std::cout << "DEBUG TEST F" << std::endl;
327 std::cout << "DEBUG TEST G" << std::endl;
330 boost::thread server_thread(boost::bind(&test_client::handshake_test_run,&dummy_cl));
331 std::cout << "DEBUG TEST H" << std::endl;
334 dummy_cl.connect_mutex.unlock();
335 test_acceptor.accept(test_obj.get_socket().lowest_layer(),ec);
337 std::cout << "dummy client connect ERROR" << std::endl;
339 std::cout << "dummy client connect OK" << std::endl;
344 std::cout << "DEBUG TEST I" << std::endl;
345 dummy_cl.handshake_mutex.unlock();
346 test_obj.handshake(ec);
348 std::cout << "dummy client handshake ERROR" << std::endl;
350 std::cout << "dummy client handshake OK" << std::endl;
355 std::cout << "DEBUG TEST J" << std::endl;
356 dummy_cl.close_mutex.unlock();
357 test_obj.get_socket().lowest_layer().close();
359 BOOST_MESSAGE( "----- handshake_test test end -----" );
363 test_suite* init_unit_test_suite( int argc, char* argv[] ){
365 test_suite* ts = BOOST_TEST_SUITE( "l7vs::tcp_ssl_socket class test" );
367 ts->add( BOOST_TEST_CASE( &construcor_test ) );
368 ts->add( BOOST_TEST_CASE( &handshake_test ) );
369 // ts->add( BOOST_TEST_CASE( &accept_test ) );
370 // ts->add( BOOST_TEST_CASE( &get_ssl_socket_test ) );
371 // ts->add( BOOST_TEST_CASE( &set_non_blocking_mode_test ) );
372 // ts->add( BOOST_TEST_CASE( &write_some_read_some_test ) );
373 // ts->add( BOOST_TEST_CASE( &close_test ) );
374 // ts->add( BOOST_TEST_CASE( &close_lock_test ) );
375 // ts->add( BOOST_TEST_CASE( &is_open_test ) );
377 framework::master_test_suite().add( ts );
393 // dummy mirror server
394 class test_mirror_server{
400 bool breq_close_wait_flag;
402 bool bdisconnect_flag;
403 boost::asio::ip::tcp::endpoint accept_end;
404 boost::asio::ip::tcp::endpoint connect_end;
410 test_mirror_server() :
413 breq_acc_flag(false),
414 breq_close_wait_flag(false),
415 bconnect_flag(false),
416 bdisconnect_flag(false),
417 accept_end(boost::asio::ip::address::from_string(DUMMI_SERVER_IP), DUMMI_SERVER_PORT),
418 connect_end(boost::asio::ip::address::from_string(DUMMI_SERVER_IP), DUMMI_SERVER_PORT),
425 ~test_mirror_server(){
435 std::cout << "dummy mirror server run start!" << std::endl;
438 bconnect_flag = false;
439 bdisconnect_flag = false;
440 boost::asio::io_service io;
441 boost::asio::ip::tcp::acceptor acc(io,accept_end);
442 boost::system::error_code ec;
444 boost::array<char,MAX_BUFFER_SIZE> buf;
446 size_t send_size = 0;
454 boost::asio::ip::tcp::socket con(io);
459 std::cout << "dummy mirror server accept NG!" << std::endl;
462 connect_end = con.remote_endpoint();
463 std::cout << "dummy mirror server accept OK! from " << connect_end << std::endl;
465 breq_acc_flag = false;
468 bconnect_flag = true;
470 for(int i = 0; i < req_recv_cnt ;i++){
471 while(!brecv_triger){
475 brecv_triger = false;
481 while(receive_size < data_size){
482 size_t ret_size = con.read_some(boost::asio::buffer(buf.data() + receive_size,data_size - receive_size),ec);
484 if(ec == boost::asio::error::eof || ec == boost::asio::error::connection_reset){
485 std::cout << "dummy mirror server detect client disconnect!" << std::endl;
486 bdisconnect_flag = true;
489 std::cout << "dummy mirror server receive NG!" << std::endl;
492 }else if(ret_size > 0){
493 receive_size += ret_size;
494 std::cout << "dummy mirror server receive " << receive_size << "Byte" << std::endl;
498 if(receive_size > 0){
501 while(send_size < receive_size){
502 size_t ret_size = con.write_some(boost::asio::buffer(buf.data() + send_size,receive_size - send_size),ec);
504 std::cout << "dummy mirror server send NG!" << std::endl;
506 }else if(ret_size > 0){
507 send_size += ret_size;
508 std::cout << "dummy mirror server send " << send_size << "Byte" << std::endl;
515 std::cout << "dummy mirror server connection close wait start" << std::endl;
516 while(breq_close_wait_flag){
519 std::cout << "dummy mirror server connection close wait end" << std::endl;
529 std::cout << "dummy mirror server run end!" << std::endl;
534 class test_socket_class : public l7vs::tcp_socket{
537 // test_socket_class(boost::asio::io_service& io) : l7vs::tcp_socket(io){
539 test_socket_class(boost::asio::io_service& io,const l7vs::tcp_socket_option_info set_option) : l7vs::tcp_socket(io,set_option){
541 ~test_socket_class(){};
543 boost::asio::ip::tcp::endpoint get_local_end(){
544 return my_socket.local_endpoint();
546 boost::asio::ip::tcp::endpoint get_remote_end(){
547 return my_socket.remote_endpoint();
549 boost::asio::io_service& get_io(){
550 return my_socket.get_io_service();
553 void test_close(boost::system::error_code& ec){
557 bool& get_open_flag(){
561 boost::asio::ip::tcp::socket* get_socket_pointer(){
565 l7vs::tcp_socket_option_info* get_opt_info(){
574 void construcor_test(){
577 BOOST_MESSAGE( "----- construcor test start -----" );
579 boost::asio::io_service io;
581 l7vs::tcp_socket_option_info set_option;
582 //! TCP_NODELAY (false:not set,true:set option)
583 set_option.nodelay_opt = true;
584 //! TCP_NODELAY option value (false:off,true:on)
585 set_option.nodelay_val = true;
586 //! TCP_CORK (false:not set,true:set option)
587 set_option.cork_opt = true;
588 //! TCP_CORK option value (false:off,true:on)
589 set_option.cork_val = true;
590 //! TCP_QUICKACK (false:not set,true:set option)
591 set_option.quickack_opt = true;
592 //! TCP_QUICKACK option value (false:off,true:on)
593 set_option.quickack_val = true;
595 test_socket_class test_obj(io,set_option);
597 // unit_test [1] construcor test set io object
598 std::cout << "[1] construcor test set io object" << std::endl;
599 boost::asio::io_service& set_io = test_obj.get_io();
600 BOOST_CHECK_EQUAL(&io , &set_io);
602 // unit_test [2] construcor test init open_flag
603 std::cout << "[2] construcor test init open_flag" << std::endl;
604 BOOST_CHECK(!test_obj.get_open_flag());
606 // unit_test [3] construcor test set socket option nodelay_opt
607 std::cout << "[3] construcor test set socket option nodelay_opt" << std::endl;
608 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->nodelay_opt , set_option.nodelay_opt);
610 // unit_test [4] construcor test set socket option nodelay_val
611 std::cout << "[4] construcor test set socket option nodelay_val" << std::endl;
612 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->nodelay_val , set_option.nodelay_val);
614 // unit_test [5] construcor test set socket option cork_opt
615 std::cout << "[5] construcor test set socket option cork_opt" << std::endl;
616 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->cork_opt , set_option.cork_opt);
618 // unit_test [6] construcor test set socket option cork_val
619 std::cout << "[6] construcor test set socket option cork_val" << std::endl;
620 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->cork_val , set_option.cork_val);
622 // unit_test [7] construcor test set socket option quickack_opt
623 std::cout << "[7] construcor test set socket option quickack_opt" << std::endl;
624 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->quickack_opt , set_option.quickack_opt);
626 // unit_test [8] construcor test set socket option quickack_val
627 std::cout << "[8] construcor test set socket option quickack_val" << std::endl;
628 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->quickack_val , set_option.quickack_val);
630 BOOST_MESSAGE( "----- construcor test end -----" );
635 BOOST_MESSAGE( "----- connect test start -----" );
638 test_mirror_server test_server;
641 test_server.breq_acc_flag = true;
643 test_server.breq_close_wait_flag = true;
646 boost::thread server_thread(boost::bind(&test_mirror_server::run,&test_server));
648 while( !test_server.brun_flag ){
652 std::cout << "ready dummy mirror server" << std::endl;
654 // unit_test [1] connect test connection success error_code object
655 std::cout << "[1] connect test connection success error_code object" << std::endl;
656 boost::asio::ip::tcp::endpoint connect_end(boost::asio::ip::address::from_string(DUMMI_SERVER_IP), DUMMI_SERVER_PORT);
657 boost::asio::io_service io;
658 boost::system::error_code ec;
660 l7vs::tcp_socket_option_info set_option;
661 //! TCP_NODELAY (false:not set,true:set option)
662 set_option.nodelay_opt = true;
663 //! TCP_NODELAY option value (false:off,true:on)
664 set_option.nodelay_val = true;
665 //! TCP_CORK (false:not set,true:set option)
666 set_option.cork_opt = true;
667 //! TCP_CORK option value (false:off,true:on)
668 set_option.cork_val = true;
669 //! TCP_QUICKACK (false:not set,true:set option)
670 set_option.quickack_opt = true;
671 //! TCP_QUICKACK option value (false:off,true:on)
672 set_option.quickack_val = true;
674 test_socket_class test_obj(io,set_option);
675 test_obj.connect(connect_end,ec);
678 // unit_test [2] connect test connection success open_flag
679 std::cout << "[2] connect test connection success open_flag" << std::endl;
680 BOOST_CHECK(test_obj.get_open_flag());
682 // TCP_NODELAY check!!
683 // unit_test [3] connect test set socket option TCP_NODELAY
684 std::cout << "[3] connect test set socket option TCP_NODELAY" << std::endl;
685 boost::asio::ip::tcp::no_delay get_option;
686 test_obj.get_socket_pointer()->get_option(get_option,ec);
688 BOOST_CHECK(get_option == set_option.nodelay_val);
691 // unit_test [4] connect test set socket option TCP_CORK
692 std::cout << "[4] connect test set socket option TCP_CORK" << std::endl;
694 size_t len = sizeof(val);
695 boost::asio::detail::socket_ops::getsockopt(test_obj.get_socket_pointer()->native(),IPPROTO_TCP,TCP_CORK,&val,&len,ec);
697 BOOST_CHECK((bool)val == set_option.cork_val);
700 while(!test_server.bconnect_flag){
704 boost::asio::ip::tcp::endpoint chk_end;
705 boost::asio::ip::tcp::endpoint ref_end;
707 // unit_test [5] connect test connect local endpoint
708 std::cout << "[5] connect test connect local endpoint" << std::endl;
709 chk_end = test_obj.get_local_end();
710 ref_end = test_server.connect_end;
711 BOOST_CHECK_EQUAL(chk_end , ref_end);
714 // unit_test [6] connect test connect remote endpoint
715 std::cout << "[6] connect test connect remote endpoint" << std::endl;
716 chk_end = test_obj.get_remote_end();
717 ref_end = connect_end;
718 BOOST_CHECK_EQUAL(chk_end , ref_end);
720 // unit_test [7] connect test connect recall check
721 std::cout << "[7] connect test connect recall check" << std::endl;
722 test_obj.connect(connect_end,ec);
724 BOOST_CHECK(test_obj.get_open_flag());
726 test_obj.test_close(ec);
727 test_obj.get_open_flag() = false;
729 test_server.breq_close_wait_flag = false;
730 test_server.bstop_flag = true;
731 server_thread.join();
733 // unit_test [8] connect test connection faile error_code object
734 std::cout << "[8] connect test connection faile error_code object" << std::endl;
735 test_obj.connect(connect_end,ec);
738 // unit_test [9] connect test connection faile open_flag
739 std::cout << "[9] connect test connection faile open_flag" << std::endl;
740 BOOST_CHECK(!test_obj.get_open_flag());
742 BOOST_MESSAGE( "----- connect test end -----" );
746 void set_non_blocking_mode_test(){
747 BOOST_MESSAGE( "----- set_non_blocking_mode test start -----" );
749 test_mirror_server test_server;
752 test_server.breq_acc_flag = true;
754 test_server.breq_close_wait_flag = true;
757 boost::thread server_thread(boost::bind(&test_mirror_server::run,&test_server));
759 while( !test_server.brun_flag ){
763 std::cout << "ready dummy mirror server" << std::endl;
767 boost::asio::ip::tcp::endpoint connect_end(boost::asio::ip::address::from_string(DUMMI_SERVER_IP), DUMMI_SERVER_PORT);
768 boost::asio::io_service io;
769 boost::system::error_code ec;
771 l7vs::tcp_socket_option_info set_option;
772 //! TCP_NODELAY (false:not set,true:set option)
773 set_option.nodelay_opt = false;
774 //! TCP_NODELAY option value (false:off,true:on)
775 set_option.nodelay_val = false;
776 //! TCP_CORK (false:not set,true:set option)
777 set_option.cork_opt = false;
778 //! TCP_CORK option value (false:off,true:on)
779 set_option.cork_val = false;
780 //! TCP_QUICKACK (false:not set,true:set option)
781 set_option.quickack_opt = false;
782 //! TCP_QUICKACK option value (false:off,true:on)
783 set_option.quickack_val = false;
785 test_socket_class test_obj(io,set_option);
786 test_obj.connect(connect_end,ec);
789 while(!test_server.bconnect_flag){
793 // unit_test [1] set_non_blocking_mode test set non blocking mode success error_code object
794 std::cout << "[1] set_non_blocking_mode test set non blocking mode success error_code object" << std::endl;
795 test_obj.set_non_blocking_mode(ec);
798 test_obj.test_close(ec);
800 test_server.breq_close_wait_flag = false;
801 test_server.bstop_flag = true;
802 server_thread.join();
804 // unit_test [2] set_non_blocking_mode test set non blocking mode faile error_code object
805 std::cout << "[2] set_non_blocking_mode test set non blocking mode faile error_code object" << std::endl;
806 test_obj.set_non_blocking_mode(ec);
809 BOOST_MESSAGE( "----- set_non_blocking_mode test end -----" );
813 void write_some_read_some_test(){
814 BOOST_MESSAGE( "----- write_some read_some test start -----" );
816 test_mirror_server test_server;
819 test_server.breq_acc_flag = true;
821 test_server.breq_close_wait_flag = true;
823 test_server.req_recv_cnt = 513;
827 boost::thread server_thread(boost::bind(&test_mirror_server::run,&test_server));
829 while( !test_server.brun_flag ){
833 std::cout << "ready dummy mirror server" << std::endl;
836 boost::asio::ip::tcp::endpoint connect_end(boost::asio::ip::address::from_string(DUMMI_SERVER_IP), DUMMI_SERVER_PORT);
837 boost::asio::io_service io;
838 boost::system::error_code ec;
840 l7vs::tcp_socket_option_info set_option;
841 //! TCP_NODELAY (false:not set,true:set option)
842 set_option.nodelay_opt = true;
843 //! TCP_NODELAY option value (false:off,true:on)
844 set_option.nodelay_val = true;
845 //! TCP_CORK (false:not set,true:set option)
846 set_option.cork_opt = true;
847 //! TCP_CORK option value (false:off,true:on)
848 set_option.cork_val = true;
849 //! TCP_QUICKACK (false:not set,true:set option)
850 set_option.quickack_opt = true;
851 //! TCP_QUICKACK option value (false:off,true:on)
852 set_option.quickack_val = true;
854 test_socket_class test_obj(io,set_option);
855 test_obj.connect(connect_end,ec);
858 while(!test_server.bconnect_flag){
862 test_obj.set_non_blocking_mode(ec);
865 boost::array<char,MAX_BUFFER_SIZE> send_buff;
866 boost::array<char,MAX_BUFFER_SIZE> recv_buff;
869 size_t send_data_size;
870 size_t receve_data_size;
873 // ## write some read some test [1] size 0
875 test_server.brecv_triger = true;
876 test_server.data_size = send_size;
878 res_size = test_obj.write_some(boost::asio::buffer(send_buff, send_size),ec);
880 if(ec == boost::asio::error::try_again){
886 // unit_test [1] write_some & read_some test size 0 write error_code object
887 std::cout << "[1] write_some & read_some test size 0 write error_code object" << std::endl;
890 // unit_test [2] write_some & read_some test size 0 write size
891 std::cout << "[2] write_some & read_some test size 0 write size" << std::endl;
892 BOOST_CHECK_EQUAL(res_size, send_size);
896 res_size = test_obj.read_some(boost::asio::buffer(recv_buff, MAX_BUFFER_SIZE),ec);
898 // unit_test [3] write_some & read_some test size 0 read error_code object
899 std::cout << "[3] write_some & read_some test size 0 read error_code object" << std::endl;
900 BOOST_CHECK_EQUAL(ec,boost::asio::error::try_again);
902 // unit_test [4] write_some & read_some test size 0 read size
903 std::cout << "[4] write_some & read_some test size 0 read size" << std::endl;
904 BOOST_CHECK_EQUAL(res_size,0UL);
908 test_server.data_size = send_size;
912 test_server.brecv_triger = true;
914 res_size = test_obj.write_some(boost::asio::buffer(send_buff, send_size),ec);
916 if(ec == boost::asio::error::try_again){
923 // unit_test [5] write_some & read_some test size 1 write error_code object
924 std::cout << "[5] write_some & read_some test size 1 write error_code object" << std::endl;
927 // unit_test [6] write_some & read_some test size 1 write send size
928 std::cout << "[6] write_some & read_some test size 1 write send size" << std::endl;
929 BOOST_CHECK_EQUAL(res_size, send_size);
932 res_size = test_obj.read_some(boost::asio::buffer(recv_buff, MAX_BUFFER_SIZE),ec);
934 if(ec == boost::asio::error::try_again){
941 // unit_test [7] write_some & read_some test size 1 read error_code object
942 std::cout << "[7] write_some & read_some test size 1 read error_code object" << std::endl;
945 // unit_test [8] write_some & read_some test size 1 read size
946 std::cout << "[8] write_some & read_some test size 1 read size" << std::endl;
947 BOOST_CHECK_EQUAL(res_size, send_size);
949 // unit_test [9] write_some & read_some test size 1 data check
950 std::cout << "[9] write_some & read_some test size 1 data check" << std::endl;
951 BOOST_CHECK_EQUAL(send_buff[0],recv_buff[0]);
954 // size MAX_BUFFER_SIZE
955 send_size = MAX_BUFFER_SIZE;
956 test_server.data_size = send_size;
957 for(int i = 0;i < (int)send_size;i++)
960 for(int i = 0;i < (int)send_size;i++)
964 receve_data_size = 0;
965 test_server.brecv_triger = true;
968 if(send_data_size == MAX_BUFFER_SIZE){
971 res_size = test_obj.write_some(boost::asio::buffer(send_buff.data() + send_data_size, send_size - send_data_size),ec);
973 send_data_size += res_size;
974 std::cout << send_data_size;
975 std::cout << " sending data" << std::endl;
977 if(ec != boost::asio::error::try_again){
983 // unit_test [10] write_some & read_some test size MAX_BUFFER_SIZE write error_code object
984 std::cout << "[10] write_some & read_some test size MAX_BUFFER_SIZE write error_code object" << std::endl;
987 // unit_test [11] write_some & read_some test size MAX_BUFFER_SIZE write size
988 std::cout << "[11] write_some & read_some test size MAX_BUFFER_SIZE write size" << std::endl;
989 BOOST_CHECK_EQUAL(send_data_size, send_size);
993 if(receve_data_size == MAX_BUFFER_SIZE){
996 res_size = test_obj.read_some(boost::asio::buffer(recv_buff.data() + receve_data_size, MAX_BUFFER_SIZE - receve_data_size),ec);
998 receve_data_size += res_size;
999 std::cout << receve_data_size;
1000 std::cout << " receiving data" << std::endl;
1002 if(ec != boost::asio::error::try_again){
1008 // unit_test [12] write_some & read_some test size MAX_BUFFER_SIZE read error_code object
1009 std::cout << "[12] write_some & read_some test size MAX_BUFFER_SIZE read error_code object" << std::endl;
1012 // unit_test [13] write_some & read_some test size MAX_BUFFER_SIZE read size
1013 std::cout << "[13] write_some & read_some test size MAX_BUFFER_SIZE read size" << std::endl;
1014 BOOST_CHECK_EQUAL(receve_data_size, send_size);
1016 // unit_test [14] write_some & read_some test size MAX_BUFFER_SIZE data check
1017 std::cout << "[14] write_some & read_some test size MAX_BUFFER_SIZE data check" << std::endl;
1018 for(int i = 0;i < (int)send_size;i++){
1019 BOOST_CHECK_EQUAL(send_buff[i],recv_buff[i]);
1020 if(send_buff[i] != recv_buff[i]) break;
1023 test_obj.test_close(ec);
1025 test_server.breq_close_wait_flag = false;
1026 test_server.bstop_flag = true;
1027 server_thread.join();
1029 BOOST_MESSAGE( "----- write_some & read_some test end -----" );
1034 BOOST_MESSAGE( "----- close test start -----" );
1036 test_mirror_server test_server;
1039 test_server.breq_acc_flag = true;
1041 test_server.breq_close_wait_flag = true;
1044 test_server.req_recv_cnt = 1;
1045 test_server.data_size = 1;
1047 // test server start
1048 boost::thread server_thread(boost::bind(&test_mirror_server::run,&test_server));
1050 while( !test_server.brun_flag ){
1054 std::cout << "ready dummy mirror server" << std::endl;
1058 boost::asio::ip::tcp::endpoint connect_end(boost::asio::ip::address::from_string(DUMMI_SERVER_IP), DUMMI_SERVER_PORT);
1059 boost::asio::io_service io;
1060 boost::system::error_code ec;
1062 l7vs::tcp_socket_option_info set_option;
1063 //! TCP_NODELAY (false:not set,true:set option)
1064 set_option.nodelay_opt = false;
1065 //! TCP_NODELAY option value (false:off,true:on)
1066 set_option.nodelay_val = false;
1067 //! TCP_CORK (false:not set,true:set option)
1068 set_option.cork_opt = false;
1069 //! TCP_CORK option value (false:off,true:on)
1070 set_option.cork_val = false;
1071 //! TCP_QUICKACK (false:not set,true:set option)
1072 set_option.quickack_opt = false;
1073 //! TCP_QUICKACK option value (false:off,true:on)
1074 set_option.quickack_val = false;
1076 test_socket_class test_obj(io,set_option);
1077 test_obj.connect(connect_end,ec);
1080 while(!test_server.bconnect_flag){
1084 BOOST_CHECK(test_obj.get_open_flag());
1086 BOOST_CHECK(!test_server.bdisconnect_flag);
1088 // unit_test [1] close test close success error_code object
1089 std::cout << "[1] close test close success error_code object" << std::endl;
1093 test_server.brecv_triger = true;
1096 // unit_test [2] close test open_flag set false
1097 std::cout << "[2] close test open_flag set false" << std::endl;
1098 BOOST_CHECK(!test_obj.get_open_flag());
1100 // unit_test [3] close test disconnect check
1101 std::cout << "[3] close test disconnect check" << std::endl;
1102 BOOST_CHECK(test_server.bdisconnect_flag);
1104 test_server.breq_close_wait_flag = false;
1105 test_server.bstop_flag = true;
1106 server_thread.join();
1107 BOOST_MESSAGE( "----- close test end -----" );
1110 void get_socket_test(){
1111 BOOST_MESSAGE( "----- get_socket test start -----" );
1113 boost::asio::io_service io;
1114 l7vs::tcp_socket_option_info set_option;
1115 //! TCP_NODELAY (false:not set,true:set option)
1116 set_option.nodelay_opt = false;
1117 //! TCP_NODELAY option value (false:off,true:on)
1118 set_option.nodelay_val = false;
1119 //! TCP_CORK (false:not set,true:set option)
1120 set_option.cork_opt = false;
1121 //! TCP_CORK option value (false:off,true:on)
1122 set_option.cork_val = false;
1123 //! TCP_QUICKACK (false:not set,true:set option)
1124 set_option.quickack_opt = false;
1125 //! TCP_QUICKACK option value (false:off,true:on)
1126 set_option.quickack_val = false;
1128 test_socket_class test_obj(io,set_option);
1130 // unit_test [1] get_socket socket check
1131 std::cout << "[1] get_socket socket check" << std::endl;
1133 boost::asio::ip::tcp::socket& chk_socket = test_obj.get_socket();
1134 boost::asio::ip::tcp::socket* pref_pointer = test_obj.get_socket_pointer();
1136 BOOST_CHECK_EQUAL(&chk_socket,pref_pointer);
1138 BOOST_MESSAGE( "----- get_socket test end -----" );
1142 class connect_lock_test_class : public l7vs::tcp_socket{
1144 boost::thread::id befor_thread_id;
1145 boost::thread::id after_thread_id;
1147 connect_lock_test_class(boost::asio::io_service& io,const l7vs::tcp_socket_option_info set_option) : l7vs::tcp_socket(io,set_option){
1150 ~connect_lock_test_class(){
1153 void connect(const boost::asio::ip::tcp::endpoint connect_endpoint,boost::system::error_code& ec){
1154 befor_thread_id = boost::this_thread::get_id();
1155 l7vs::tcp_socket::connect(connect_endpoint,ec);
1156 after_thread_id = boost::this_thread::get_id();
1160 close_mutex.wrlock();
1162 void mutex_unlock(){
1163 close_mutex.unlock();
1166 boost::mutex test_thread_wait;
1169 boost::mutex::scoped_lock scope_lock(test_thread_wait);
1170 boost::asio::ip::tcp::endpoint connect_end(boost::asio::ip::address::from_string(DUMMI_SERVER_IP), DUMMI_SERVER_PORT);
1171 boost::system::error_code ec;
1172 connect(connect_end,ec);
1179 void connect_lock_test(){
1180 BOOST_MESSAGE( "----- connetc lock test start -----" );
1182 boost::asio::io_service io;
1184 l7vs::tcp_socket_option_info set_option;
1185 //! TCP_NODELAY (false:not set,true:set option)
1186 set_option.nodelay_opt = false;
1187 //! TCP_NODELAY option value (false:off,true:on)
1188 set_option.nodelay_val = false;
1189 //! TCP_CORK (false:not set,true:set option)
1190 set_option.cork_opt = false;
1191 //! TCP_CORK option value (false:off,true:on)
1192 set_option.cork_val = false;
1193 //! TCP_QUICKACK (false:not set,true:set option)
1194 set_option.quickack_opt = false;
1195 //! TCP_QUICKACK option value (false:off,true:on)
1196 set_option.quickack_val = false;
1198 connect_lock_test_class test_obj(io,set_option);
1200 test_obj.test_thread_wait.lock();
1201 boost::thread::id proc_id = boost::this_thread::get_id();
1202 test_obj.befor_thread_id = proc_id;
1203 test_obj.after_thread_id = proc_id;
1204 test_obj.mutex_lock();
1206 boost::thread test_thread(boost::bind(&connect_lock_test_class::test_run,&test_obj));
1208 BOOST_CHECK(test_obj.befor_thread_id == proc_id);
1209 BOOST_CHECK(test_obj.after_thread_id == proc_id);
1211 boost::thread::id test_id = test_thread.get_id();
1213 BOOST_CHECK(test_id != proc_id);
1216 test_obj.test_thread_wait.unlock();
1219 // unit_test [1] connect lock test thread block test (mutex lock)
1220 std::cout << "[1] connect lock test thread block test (mutex lock)" << std::endl;
1221 BOOST_CHECK(test_obj.befor_thread_id == test_id);
1222 BOOST_CHECK(test_obj.after_thread_id == proc_id);
1224 test_obj.mutex_unlock();
1227 // unit_test [2] connect lock test thread run test (mutex unlock)
1228 std::cout << "[2] connect lock test thread run test (mutex unlock)" << std::endl;
1229 BOOST_CHECK(test_obj.befor_thread_id == test_id);
1230 BOOST_CHECK(test_obj.after_thread_id == test_id);
1233 BOOST_MESSAGE( "----- connetc lock test end -----" );
1237 class close_lock_test_class : public l7vs::tcp_socket{
1239 boost::thread::id befor_thread_id;
1240 boost::thread::id after_thread_id;
1242 close_lock_test_class(boost::asio::io_service& io,const l7vs::tcp_socket_option_info set_option) : l7vs::tcp_socket(io,set_option){
1245 ~close_lock_test_class(){
1248 void close(boost::system::error_code& ec){
1249 befor_thread_id = boost::this_thread::get_id();
1250 l7vs::tcp_socket::close(ec);
1251 after_thread_id = boost::this_thread::get_id();
1255 close_mutex.wrlock();
1257 void mutex_unlock(){
1258 close_mutex.unlock();
1261 boost::mutex test_thread_wait;
1264 boost::mutex::scoped_lock scope_lock(test_thread_wait);
1265 boost::system::error_code ec;
1272 void close_lock_test(){
1273 BOOST_MESSAGE( "----- close lock test start -----" );
1275 boost::asio::io_service io;
1276 l7vs::tcp_socket_option_info set_option;
1277 //! TCP_NODELAY (false:not set,true:set option)
1278 set_option.nodelay_opt = false;
1279 //! TCP_NODELAY option value (false:off,true:on)
1280 set_option.nodelay_val = false;
1281 //! TCP_CORK (false:not set,true:set option)
1282 set_option.cork_opt = false;
1283 //! TCP_CORK option value (false:off,true:on)
1284 set_option.cork_val = false;
1285 //! TCP_QUICKACK (false:not set,true:set option)
1286 set_option.quickack_opt = false;
1287 //! TCP_QUICKACK option value (false:off,true:on)
1288 set_option.quickack_val = false;
1290 close_lock_test_class test_obj(io,set_option);
1292 test_obj.test_thread_wait.lock();
1293 boost::thread::id proc_id = boost::this_thread::get_id();
1294 test_obj.befor_thread_id = proc_id;
1295 test_obj.after_thread_id = proc_id;
1296 test_obj.mutex_lock();
1298 boost::thread test_thread(boost::bind(&close_lock_test_class::test_run,&test_obj));
1300 BOOST_CHECK(test_obj.befor_thread_id == proc_id);
1301 BOOST_CHECK(test_obj.after_thread_id == proc_id);
1303 boost::thread::id test_id = test_thread.get_id();
1305 BOOST_CHECK(test_id != proc_id);
1308 test_obj.test_thread_wait.unlock();
1311 // unit_test [1] close lock test thread block test (mutex lock)
1312 std::cout << "[1] close lock test thread block test (mutex lock)" << std::endl;
1313 BOOST_CHECK(test_obj.befor_thread_id == test_id);
1314 BOOST_CHECK(test_obj.after_thread_id == proc_id);
1316 test_obj.mutex_unlock();
1319 // unit_test [2] close lock test thread run test (mutex unlock)
1320 std::cout << "[2] close lock test thread run test (mutex unlock)" << std::endl;
1321 BOOST_CHECK(test_obj.befor_thread_id == test_id);
1322 BOOST_CHECK(test_obj.after_thread_id == test_id);
1324 BOOST_MESSAGE( "----- close lock test end -----" );
1328 void is_open_test(){
1330 BOOST_MESSAGE( "----- is_open test start -----" );
1332 test_mirror_server test_server;
1335 test_server.breq_acc_flag = true;
1337 test_server.breq_close_wait_flag = true;
1340 test_server.req_recv_cnt = 1;
1341 test_server.data_size = 1;
1343 // test server start
1344 boost::thread server_thread(boost::bind(&test_mirror_server::run,&test_server));
1346 while( !test_server.brun_flag ){
1350 std::cout << "ready dummy mirror server" << std::endl;
1354 boost::asio::ip::tcp::endpoint connect_end(boost::asio::ip::address::from_string(DUMMI_SERVER_IP), DUMMI_SERVER_PORT);
1355 boost::asio::io_service io;
1356 boost::system::error_code ec;
1358 l7vs::tcp_socket_option_info set_option;
1359 //! TCP_NODELAY (false:not set,true:set option)
1360 set_option.nodelay_opt = false;
1361 //! TCP_NODELAY option value (false:off,true:on)
1362 set_option.nodelay_val = false;
1363 //! TCP_CORK (false:not set,true:set option)
1364 set_option.cork_opt = false;
1365 //! TCP_CORK option value (false:off,true:on)
1366 set_option.cork_val = false;
1367 //! TCP_QUICKACK (false:not set,true:set option)
1368 set_option.quickack_opt = false;
1369 //! TCP_QUICKACK option value (false:off,true:on)
1370 set_option.quickack_val = false;
1372 test_socket_class test_obj(io,set_option);
1374 // unit_test [1] is_open before connect check
1375 std::cout << "[1] is_open before connect check" << std::endl;
1376 BOOST_CHECK(!test_obj.is_open());
1378 test_obj.connect(connect_end,ec);
1381 // unit_test [2] is_open after connect check
1382 std::cout << "[2] is_open after connect check" << std::endl;
1383 BOOST_CHECK(test_obj.is_open());
1385 while(!test_server.bconnect_flag){
1389 BOOST_CHECK(test_obj.get_open_flag());
1391 BOOST_CHECK(!test_server.bdisconnect_flag);
1396 // unit_test [3] is_open close after check
1397 std::cout << "[3] is_open close after check" << std::endl;
1398 BOOST_CHECK(!test_obj.is_open());
1400 test_server.brecv_triger = true;
1403 test_server.breq_close_wait_flag = false;
1404 test_server.bstop_flag = true;
1405 server_thread.join();
1406 BOOST_MESSAGE( "----- is_open test end -----" );