4 #include <boost/thread/thread.hpp>
5 #include <boost/test/included/unit_test.hpp>
7 #include "tcp_ssl_socket.h"
10 #define DUMMI_SERVER_IP "127.0.0.1"
11 #define DUMMI_SERVER_PORT 7000
13 using namespace boost::unit_test_framework;
19 test_client(boost::asio::io_service& io_service, boost::asio::ssl::context& context) :
20 my_socket(io_service,context){
27 //! socket connect mutex
28 connect_mutex.wrlock();
29 //! socket handshake mutex
30 hadshake_mutex.wrlock();
33 //! socket write mutex
35 //! socket close mutex
41 void handshake_test_run(){
46 rw_scoped_lock scope_lock(connect_mutex);
55 rw_scoped_lock scope_lock(hadshake_mutex);
57 if(!handshake_test()){
64 rw_scoped_lock scope_lock(write_mutex);
72 rw_scoped_lock scope_lock(read_mutex);
81 rw_scoped_lock scope_lock(close_mutex);
89 boost::system::error_code ec;
90 boost::asio::ip::tcp::endpoint connect_end(boost::asio::ip::address::from_string(DUMMI_SERVER_IP), DUMMI_SERVER_PORT);
91 my_socket.lowest_layer().connect(connect_end,ec);
94 std::cout << "dummy client connect Error!" << std::endl;
97 std::cout << "dummy client connect OK" << std::endl;
101 bool handshake_test(){
103 boost::system::error_code ec;
104 my_socket.handshake(boost::asio::ssl::stream_base::server, ec);
107 std::cout << "dummy client handshake Error!" << std::endl;
110 std::cout << "dummy client handshake OK" << std::endl;
116 boost::system::error_code ec;
117 my_socket.write_some(boost::asio::buffer(request,MAX_BUFFER_SIZE), ec);
120 std::cout << "dummy client send Error!" << std::endl;
123 std::cout << "dummy client send OK" << std::endl;
128 boost::system::error_code ec;
129 my_socket.read_some(boost::asio::buffer(response,MAX_BUFFER_SIZE), ec);
132 std::cout << "dummy client receive Error!" << std::endl;
135 std::cout << "dummy client receive OK" << std::endl;
140 boost::system::error_code ec;
141 my_socket.lowest_layer().close(ec);
144 std::cout << "dummy client close Error!" << std::endl;
147 std::cout << "dummy client close OK" << std::endl;
150 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> my_socket;
151 boost::array<char,MAX_BUFFER_SIZE> request;
152 boost::array<char,MAX_BUFFER_SIZE> response;
154 //! socket connect mutex
155 wr_mutex connect_mutex;
156 //! socket handshake mutex
157 wr_mutex hadshake_mutex;
158 //! socket read mutex
160 //! socket write mutex
161 wr_mutex write_mutex;
162 //! socket close mutex
163 wr_mutex close_mutex;
167 class test_ssl_socket_class : public l7vs::tcp_ssl_socket{
170 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){
172 ~test_ssl_socket_class(){};
174 boost::asio::ip::tcp::endpoint get_local_end(){
175 return my_socket.lowest_layer().local_endpoint();
177 boost::asio::ip::tcp::endpoint get_remote_end(){
178 return my_socket.lowest_layer().remote_endpoint();
180 boost::asio::io_service& get_io(){
181 return my_socket.lowest_layer().get_io_service();
184 void test_close(boost::system::error_code& ec){
185 my_socket.lowest_layer().close(ec);
188 bool& get_open_flag(){
192 boost::asio::ssl::stream<boost::asio::ip::tcp::socket>* get_socket_pointer(){
196 l7vs::tcp_socket_option_info* get_opt_info(){
200 std::string get_password() const
209 void construcor_test(){
212 BOOST_MESSAGE( "----- construcor test start -----" );
214 boost::asio::io_service io;
216 l7vs::tcp_socket_option_info set_option;
217 //! TCP_NODELAY (false:not set,true:set option)
218 set_option.nodelay_opt = true;
219 //! TCP_NODELAY option value (false:off,true:on)
220 set_option.nodelay_val = true;
221 //! TCP_CORK (false:not set,true:set option)
222 set_option.cork_opt = true;
223 //! TCP_CORK option value (false:off,true:on)
224 set_option.cork_val = true;
225 //! TCP_QUICKACK (false:not set,true:set option)
226 set_option.quickack_opt = true;
227 //! TCP_QUICKACK option value (false:off,true:on)
228 set_option.quickack_val = true;
231 boost::asio::ssl::context server_ctx(io,boost::asio::ssl::context::sslv23);
233 test_ssl_socket_class test_obj(io,server_ctx,set_option);
235 // unit_test [1] construcor test set io object
236 std::cout << "[1] construcor test set io object" << std::endl;
237 boost::asio::io_service& set_io = test_obj.get_io();
238 BOOST_CHECK_EQUAL(&io , &set_io);
240 // unit_test [2] construcor test init open_flag
241 std::cout << "[2] construcor test init open_flag" << std::endl;
242 BOOST_CHECK(!test_obj.get_open_flag());
244 // unit_test [3] construcor test set socket option nodelay_opt
245 std::cout << "[3] construcor test set socket option nodelay_opt" << std::endl;
246 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->nodelay_opt , set_option.nodelay_opt);
248 // unit_test [4] construcor test set socket option nodelay_val
249 std::cout << "[4] construcor test set socket option nodelay_val" << std::endl;
250 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->nodelay_val , set_option.nodelay_val);
252 // unit_test [5] construcor test set socket option cork_opt
253 std::cout << "[5] construcor test set socket option cork_opt" << std::endl;
254 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->cork_opt , set_option.cork_opt);
256 // unit_test [6] construcor test set socket option cork_val
257 std::cout << "[6] construcor test set socket option cork_val" << std::endl;
258 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->cork_val , set_option.cork_val);
260 // unit_test [7] construcor test set socket option quickack_opt
261 std::cout << "[7] construcor test set socket option quickack_opt" << std::endl;
262 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->quickack_opt , set_option.quickack_opt);
264 // unit_test [8] construcor test set socket option quickack_val
265 std::cout << "[8] construcor test set socket option quickack_val" << std::endl;
266 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->quickack_val , set_option.quickack_val);
268 BOOST_MESSAGE( "----- construcor test end -----" );
272 void handshake_test(){
275 BOOST_MESSAGE( "----- handshake test start -----" );
277 boost::asio::io_service io;
278 boost::system::error_code ec;
280 l7vs::tcp_socket_option_info set_option;
281 //! TCP_NODELAY (false:not set,true:set option)
282 set_option.nodelay_opt = false;
283 //! TCP_NODELAY option value (false:off,true:on)
284 set_option.nodelay_val = false;
285 //! TCP_CORK (false:not set,true:set option)
286 set_option.cork_opt = false;
287 //! TCP_CORK option value (false:off,true:on)
288 set_option.cork_val = false;
289 //! TCP_QUICKACK (false:not set,true:set option)
290 set_option.quickack_opt = false;
291 //! TCP_QUICKACK option value (false:off,true:on)
292 set_option.quickack_val = false;
295 boost::asio::ssl::context client_ctx(io,boost::asio::ssl::context::sslv23);
296 client_ctx.set_verify_mode(boost::asio::ssl::context::verify_peer);
297 client_ctx.load_verify_file("ca.pem");
301 boost::asio::ssl::context server_ctx(io,boost::asio::ssl::context::sslv23);
302 test_ssl_socket_class test_obj(io,server_ctx,set_option);
304 server_ctx.set_options(
305 boost::asio::ssl::context::default_workarounds
306 | boost::asio::ssl::context::no_sslv2
307 | boost::asio::ssl::context::single_dh_use);
308 server_ctx.set_password_callback(boost::bind(&test_ssl_socket_class::get_password, &test_obj));
309 server_ctx.use_certificate_chain_file("server.pem");
310 server_ctx.use_private_key_file("server.pem", boost::asio::ssl::context::pem);
311 server_ctx.use_tmp_dh_file("dh512.pem");
313 boost::asio::ip::tcp::endpoint listen_end(boost::asio::ip::address::from_string(DUMMI_SERVER_IP), DUMMI_SERVER_PORT);
314 boost::asio::ip::tcp::acceptor test_acceptor(io,listen_end,ec);
316 test_client dummy_cl(io,client_ctx);
321 boost::thread server_thread(boost::bind(&dummy_cl::handshake_test_run,&dummy_cl));
323 dummy_cl.connect_mutex.unlock();
324 test_acceptor.accept(test_obj.get_socket().lowest_layer(),ec);
326 std::cout << "dummy client connect OK" << std::endl;
328 std::cout << "dummy client connect ERROR" << std::endl;
332 // dummy client close
333 dummy_cl.close_mutex.unlock();
336 test_obj.get_socket().lowest_layer().close();
339 BOOST_MESSAGE( "----- handshake_test test end -----" );
343 test_suite* init_unit_test_suite( int argc, char* argv[] ){
345 test_suite* ts = BOOST_TEST_SUITE( "l7vs::tcp_ssl_socket class test" );
347 ts->add( BOOST_TEST_CASE( &construcor_test ) );
348 // ts->add( BOOST_TEST_CASE( &handshake_test ) );
349 // ts->add( BOOST_TEST_CASE( &accept_test ) );
350 // ts->add( BOOST_TEST_CASE( &get_ssl_socket_test ) );
351 // ts->add( BOOST_TEST_CASE( &set_non_blocking_mode_test ) );
352 // ts->add( BOOST_TEST_CASE( &write_some_read_some_test ) );
353 // ts->add( BOOST_TEST_CASE( &close_test ) );
354 // ts->add( BOOST_TEST_CASE( &close_lock_test ) );
355 // ts->add( BOOST_TEST_CASE( &is_open_test ) );
357 framework::master_test_suite().add( ts );
373 // dummy mirror server
374 class test_mirror_server{
380 bool breq_close_wait_flag;
382 bool bdisconnect_flag;
383 boost::asio::ip::tcp::endpoint accept_end;
384 boost::asio::ip::tcp::endpoint connect_end;
390 test_mirror_server() :
393 breq_acc_flag(false),
394 breq_close_wait_flag(false),
395 bconnect_flag(false),
396 bdisconnect_flag(false),
397 accept_end(boost::asio::ip::address::from_string(DUMMI_SERVER_IP), DUMMI_SERVER_PORT),
398 connect_end(boost::asio::ip::address::from_string(DUMMI_SERVER_IP), DUMMI_SERVER_PORT),
405 ~test_mirror_server(){
415 std::cout << "dummy mirror server run start!" << std::endl;
418 bconnect_flag = false;
419 bdisconnect_flag = false;
420 boost::asio::io_service io;
421 boost::asio::ip::tcp::acceptor acc(io,accept_end);
422 boost::system::error_code ec;
424 boost::array<char,MAX_BUFFER_SIZE> buf;
426 size_t send_size = 0;
434 boost::asio::ip::tcp::socket con(io);
439 std::cout << "dummy mirror server accept NG!" << std::endl;
442 connect_end = con.remote_endpoint();
443 std::cout << "dummy mirror server accept OK! from " << connect_end << std::endl;
445 breq_acc_flag = false;
448 bconnect_flag = true;
450 for(int i = 0; i < req_recv_cnt ;i++){
451 while(!brecv_triger){
455 brecv_triger = false;
461 while(receive_size < data_size){
462 size_t ret_size = con.read_some(boost::asio::buffer(buf.data() + receive_size,data_size - receive_size),ec);
464 if(ec == boost::asio::error::eof || ec == boost::asio::error::connection_reset){
465 std::cout << "dummy mirror server detect client disconnect!" << std::endl;
466 bdisconnect_flag = true;
469 std::cout << "dummy mirror server receive NG!" << std::endl;
472 }else if(ret_size > 0){
473 receive_size += ret_size;
474 std::cout << "dummy mirror server receive " << receive_size << "Byte" << std::endl;
478 if(receive_size > 0){
481 while(send_size < receive_size){
482 size_t ret_size = con.write_some(boost::asio::buffer(buf.data() + send_size,receive_size - send_size),ec);
484 std::cout << "dummy mirror server send NG!" << std::endl;
486 }else if(ret_size > 0){
487 send_size += ret_size;
488 std::cout << "dummy mirror server send " << send_size << "Byte" << std::endl;
495 std::cout << "dummy mirror server connection close wait start" << std::endl;
496 while(breq_close_wait_flag){
499 std::cout << "dummy mirror server connection close wait end" << std::endl;
509 std::cout << "dummy mirror server run end!" << std::endl;
514 class test_socket_class : public l7vs::tcp_socket{
517 // test_socket_class(boost::asio::io_service& io) : l7vs::tcp_socket(io){
519 test_socket_class(boost::asio::io_service& io,const l7vs::tcp_socket_option_info set_option) : l7vs::tcp_socket(io,set_option){
521 ~test_socket_class(){};
523 boost::asio::ip::tcp::endpoint get_local_end(){
524 return my_socket.local_endpoint();
526 boost::asio::ip::tcp::endpoint get_remote_end(){
527 return my_socket.remote_endpoint();
529 boost::asio::io_service& get_io(){
530 return my_socket.get_io_service();
533 void test_close(boost::system::error_code& ec){
537 bool& get_open_flag(){
541 boost::asio::ip::tcp::socket* get_socket_pointer(){
545 l7vs::tcp_socket_option_info* get_opt_info(){
554 void construcor_test(){
557 BOOST_MESSAGE( "----- construcor test start -----" );
559 boost::asio::io_service io;
561 l7vs::tcp_socket_option_info set_option;
562 //! TCP_NODELAY (false:not set,true:set option)
563 set_option.nodelay_opt = true;
564 //! TCP_NODELAY option value (false:off,true:on)
565 set_option.nodelay_val = true;
566 //! TCP_CORK (false:not set,true:set option)
567 set_option.cork_opt = true;
568 //! TCP_CORK option value (false:off,true:on)
569 set_option.cork_val = true;
570 //! TCP_QUICKACK (false:not set,true:set option)
571 set_option.quickack_opt = true;
572 //! TCP_QUICKACK option value (false:off,true:on)
573 set_option.quickack_val = true;
575 test_socket_class test_obj(io,set_option);
577 // unit_test [1] construcor test set io object
578 std::cout << "[1] construcor test set io object" << std::endl;
579 boost::asio::io_service& set_io = test_obj.get_io();
580 BOOST_CHECK_EQUAL(&io , &set_io);
582 // unit_test [2] construcor test init open_flag
583 std::cout << "[2] construcor test init open_flag" << std::endl;
584 BOOST_CHECK(!test_obj.get_open_flag());
586 // unit_test [3] construcor test set socket option nodelay_opt
587 std::cout << "[3] construcor test set socket option nodelay_opt" << std::endl;
588 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->nodelay_opt , set_option.nodelay_opt);
590 // unit_test [4] construcor test set socket option nodelay_val
591 std::cout << "[4] construcor test set socket option nodelay_val" << std::endl;
592 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->nodelay_val , set_option.nodelay_val);
594 // unit_test [5] construcor test set socket option cork_opt
595 std::cout << "[5] construcor test set socket option cork_opt" << std::endl;
596 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->cork_opt , set_option.cork_opt);
598 // unit_test [6] construcor test set socket option cork_val
599 std::cout << "[6] construcor test set socket option cork_val" << std::endl;
600 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->cork_val , set_option.cork_val);
602 // unit_test [7] construcor test set socket option quickack_opt
603 std::cout << "[7] construcor test set socket option quickack_opt" << std::endl;
604 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->quickack_opt , set_option.quickack_opt);
606 // unit_test [8] construcor test set socket option quickack_val
607 std::cout << "[8] construcor test set socket option quickack_val" << std::endl;
608 BOOST_CHECK_EQUAL(test_obj.get_opt_info()->quickack_val , set_option.quickack_val);
610 BOOST_MESSAGE( "----- construcor test end -----" );
615 BOOST_MESSAGE( "----- connect test start -----" );
618 test_mirror_server test_server;
621 test_server.breq_acc_flag = true;
623 test_server.breq_close_wait_flag = true;
626 boost::thread server_thread(boost::bind(&test_mirror_server::run,&test_server));
628 while( !test_server.brun_flag ){
632 std::cout << "ready dummy mirror server" << std::endl;
634 // unit_test [1] connect test connection success error_code object
635 std::cout << "[1] connect test connection success error_code object" << std::endl;
636 boost::asio::ip::tcp::endpoint connect_end(boost::asio::ip::address::from_string(DUMMI_SERVER_IP), DUMMI_SERVER_PORT);
637 boost::asio::io_service io;
638 boost::system::error_code ec;
640 l7vs::tcp_socket_option_info set_option;
641 //! TCP_NODELAY (false:not set,true:set option)
642 set_option.nodelay_opt = true;
643 //! TCP_NODELAY option value (false:off,true:on)
644 set_option.nodelay_val = true;
645 //! TCP_CORK (false:not set,true:set option)
646 set_option.cork_opt = true;
647 //! TCP_CORK option value (false:off,true:on)
648 set_option.cork_val = true;
649 //! TCP_QUICKACK (false:not set,true:set option)
650 set_option.quickack_opt = true;
651 //! TCP_QUICKACK option value (false:off,true:on)
652 set_option.quickack_val = true;
654 test_socket_class test_obj(io,set_option);
655 test_obj.connect(connect_end,ec);
658 // unit_test [2] connect test connection success open_flag
659 std::cout << "[2] connect test connection success open_flag" << std::endl;
660 BOOST_CHECK(test_obj.get_open_flag());
662 // TCP_NODELAY check!!
663 // unit_test [3] connect test set socket option TCP_NODELAY
664 std::cout << "[3] connect test set socket option TCP_NODELAY" << std::endl;
665 boost::asio::ip::tcp::no_delay get_option;
666 test_obj.get_socket_pointer()->get_option(get_option,ec);
668 BOOST_CHECK(get_option == set_option.nodelay_val);
671 // unit_test [4] connect test set socket option TCP_CORK
672 std::cout << "[4] connect test set socket option TCP_CORK" << std::endl;
674 size_t len = sizeof(val);
675 boost::asio::detail::socket_ops::getsockopt(test_obj.get_socket_pointer()->native(),IPPROTO_TCP,TCP_CORK,&val,&len,ec);
677 BOOST_CHECK((bool)val == set_option.cork_val);
680 while(!test_server.bconnect_flag){
684 boost::asio::ip::tcp::endpoint chk_end;
685 boost::asio::ip::tcp::endpoint ref_end;
687 // unit_test [5] connect test connect local endpoint
688 std::cout << "[5] connect test connect local endpoint" << std::endl;
689 chk_end = test_obj.get_local_end();
690 ref_end = test_server.connect_end;
691 BOOST_CHECK_EQUAL(chk_end , ref_end);
694 // unit_test [6] connect test connect remote endpoint
695 std::cout << "[6] connect test connect remote endpoint" << std::endl;
696 chk_end = test_obj.get_remote_end();
697 ref_end = connect_end;
698 BOOST_CHECK_EQUAL(chk_end , ref_end);
700 // unit_test [7] connect test connect recall check
701 std::cout << "[7] connect test connect recall check" << std::endl;
702 test_obj.connect(connect_end,ec);
704 BOOST_CHECK(test_obj.get_open_flag());
706 test_obj.test_close(ec);
707 test_obj.get_open_flag() = false;
709 test_server.breq_close_wait_flag = false;
710 test_server.bstop_flag = true;
711 server_thread.join();
713 // unit_test [8] connect test connection faile error_code object
714 std::cout << "[8] connect test connection faile error_code object" << std::endl;
715 test_obj.connect(connect_end,ec);
718 // unit_test [9] connect test connection faile open_flag
719 std::cout << "[9] connect test connection faile open_flag" << std::endl;
720 BOOST_CHECK(!test_obj.get_open_flag());
722 BOOST_MESSAGE( "----- connect test end -----" );
726 void set_non_blocking_mode_test(){
727 BOOST_MESSAGE( "----- set_non_blocking_mode test start -----" );
729 test_mirror_server test_server;
732 test_server.breq_acc_flag = true;
734 test_server.breq_close_wait_flag = true;
737 boost::thread server_thread(boost::bind(&test_mirror_server::run,&test_server));
739 while( !test_server.brun_flag ){
743 std::cout << "ready dummy mirror server" << std::endl;
747 boost::asio::ip::tcp::endpoint connect_end(boost::asio::ip::address::from_string(DUMMI_SERVER_IP), DUMMI_SERVER_PORT);
748 boost::asio::io_service io;
749 boost::system::error_code ec;
751 l7vs::tcp_socket_option_info set_option;
752 //! TCP_NODELAY (false:not set,true:set option)
753 set_option.nodelay_opt = false;
754 //! TCP_NODELAY option value (false:off,true:on)
755 set_option.nodelay_val = false;
756 //! TCP_CORK (false:not set,true:set option)
757 set_option.cork_opt = false;
758 //! TCP_CORK option value (false:off,true:on)
759 set_option.cork_val = false;
760 //! TCP_QUICKACK (false:not set,true:set option)
761 set_option.quickack_opt = false;
762 //! TCP_QUICKACK option value (false:off,true:on)
763 set_option.quickack_val = false;
765 test_socket_class test_obj(io,set_option);
766 test_obj.connect(connect_end,ec);
769 while(!test_server.bconnect_flag){
773 // unit_test [1] set_non_blocking_mode test set non blocking mode success error_code object
774 std::cout << "[1] set_non_blocking_mode test set non blocking mode success error_code object" << std::endl;
775 test_obj.set_non_blocking_mode(ec);
778 test_obj.test_close(ec);
780 test_server.breq_close_wait_flag = false;
781 test_server.bstop_flag = true;
782 server_thread.join();
784 // unit_test [2] set_non_blocking_mode test set non blocking mode faile error_code object
785 std::cout << "[2] set_non_blocking_mode test set non blocking mode faile error_code object" << std::endl;
786 test_obj.set_non_blocking_mode(ec);
789 BOOST_MESSAGE( "----- set_non_blocking_mode test end -----" );
793 void write_some_read_some_test(){
794 BOOST_MESSAGE( "----- write_some read_some test start -----" );
796 test_mirror_server test_server;
799 test_server.breq_acc_flag = true;
801 test_server.breq_close_wait_flag = true;
803 test_server.req_recv_cnt = 513;
807 boost::thread server_thread(boost::bind(&test_mirror_server::run,&test_server));
809 while( !test_server.brun_flag ){
813 std::cout << "ready dummy mirror server" << std::endl;
816 boost::asio::ip::tcp::endpoint connect_end(boost::asio::ip::address::from_string(DUMMI_SERVER_IP), DUMMI_SERVER_PORT);
817 boost::asio::io_service io;
818 boost::system::error_code ec;
820 l7vs::tcp_socket_option_info set_option;
821 //! TCP_NODELAY (false:not set,true:set option)
822 set_option.nodelay_opt = true;
823 //! TCP_NODELAY option value (false:off,true:on)
824 set_option.nodelay_val = true;
825 //! TCP_CORK (false:not set,true:set option)
826 set_option.cork_opt = true;
827 //! TCP_CORK option value (false:off,true:on)
828 set_option.cork_val = true;
829 //! TCP_QUICKACK (false:not set,true:set option)
830 set_option.quickack_opt = true;
831 //! TCP_QUICKACK option value (false:off,true:on)
832 set_option.quickack_val = true;
834 test_socket_class test_obj(io,set_option);
835 test_obj.connect(connect_end,ec);
838 while(!test_server.bconnect_flag){
842 test_obj.set_non_blocking_mode(ec);
845 boost::array<char,MAX_BUFFER_SIZE> send_buff;
846 boost::array<char,MAX_BUFFER_SIZE> recv_buff;
849 size_t send_data_size;
850 size_t receve_data_size;
853 // ## write some read some test [1] size 0
855 test_server.brecv_triger = true;
856 test_server.data_size = send_size;
858 res_size = test_obj.write_some(boost::asio::buffer(send_buff, send_size),ec);
860 if(ec == boost::asio::error::try_again){
866 // unit_test [1] write_some & read_some test size 0 write error_code object
867 std::cout << "[1] write_some & read_some test size 0 write error_code object" << std::endl;
870 // unit_test [2] write_some & read_some test size 0 write size
871 std::cout << "[2] write_some & read_some test size 0 write size" << std::endl;
872 BOOST_CHECK_EQUAL(res_size, send_size);
876 res_size = test_obj.read_some(boost::asio::buffer(recv_buff, MAX_BUFFER_SIZE),ec);
878 // unit_test [3] write_some & read_some test size 0 read error_code object
879 std::cout << "[3] write_some & read_some test size 0 read error_code object" << std::endl;
880 BOOST_CHECK_EQUAL(ec,boost::asio::error::try_again);
882 // unit_test [4] write_some & read_some test size 0 read size
883 std::cout << "[4] write_some & read_some test size 0 read size" << std::endl;
884 BOOST_CHECK_EQUAL(res_size,0UL);
888 test_server.data_size = send_size;
892 test_server.brecv_triger = true;
894 res_size = test_obj.write_some(boost::asio::buffer(send_buff, send_size),ec);
896 if(ec == boost::asio::error::try_again){
903 // unit_test [5] write_some & read_some test size 1 write error_code object
904 std::cout << "[5] write_some & read_some test size 1 write error_code object" << std::endl;
907 // unit_test [6] write_some & read_some test size 1 write send size
908 std::cout << "[6] write_some & read_some test size 1 write send size" << std::endl;
909 BOOST_CHECK_EQUAL(res_size, send_size);
912 res_size = test_obj.read_some(boost::asio::buffer(recv_buff, MAX_BUFFER_SIZE),ec);
914 if(ec == boost::asio::error::try_again){
921 // unit_test [7] write_some & read_some test size 1 read error_code object
922 std::cout << "[7] write_some & read_some test size 1 read error_code object" << std::endl;
925 // unit_test [8] write_some & read_some test size 1 read size
926 std::cout << "[8] write_some & read_some test size 1 read size" << std::endl;
927 BOOST_CHECK_EQUAL(res_size, send_size);
929 // unit_test [9] write_some & read_some test size 1 data check
930 std::cout << "[9] write_some & read_some test size 1 data check" << std::endl;
931 BOOST_CHECK_EQUAL(send_buff[0],recv_buff[0]);
934 // size MAX_BUFFER_SIZE
935 send_size = MAX_BUFFER_SIZE;
936 test_server.data_size = send_size;
937 for(int i = 0;i < (int)send_size;i++)
940 for(int i = 0;i < (int)send_size;i++)
944 receve_data_size = 0;
945 test_server.brecv_triger = true;
948 if(send_data_size == MAX_BUFFER_SIZE){
951 res_size = test_obj.write_some(boost::asio::buffer(send_buff.data() + send_data_size, send_size - send_data_size),ec);
953 send_data_size += res_size;
954 std::cout << send_data_size;
955 std::cout << " sending data" << std::endl;
957 if(ec != boost::asio::error::try_again){
963 // unit_test [10] write_some & read_some test size MAX_BUFFER_SIZE write error_code object
964 std::cout << "[10] write_some & read_some test size MAX_BUFFER_SIZE write error_code object" << std::endl;
967 // unit_test [11] write_some & read_some test size MAX_BUFFER_SIZE write size
968 std::cout << "[11] write_some & read_some test size MAX_BUFFER_SIZE write size" << std::endl;
969 BOOST_CHECK_EQUAL(send_data_size, send_size);
973 if(receve_data_size == MAX_BUFFER_SIZE){
976 res_size = test_obj.read_some(boost::asio::buffer(recv_buff.data() + receve_data_size, MAX_BUFFER_SIZE - receve_data_size),ec);
978 receve_data_size += res_size;
979 std::cout << receve_data_size;
980 std::cout << " receiving data" << std::endl;
982 if(ec != boost::asio::error::try_again){
988 // unit_test [12] write_some & read_some test size MAX_BUFFER_SIZE read error_code object
989 std::cout << "[12] write_some & read_some test size MAX_BUFFER_SIZE read error_code object" << std::endl;
992 // unit_test [13] write_some & read_some test size MAX_BUFFER_SIZE read size
993 std::cout << "[13] write_some & read_some test size MAX_BUFFER_SIZE read size" << std::endl;
994 BOOST_CHECK_EQUAL(receve_data_size, send_size);
996 // unit_test [14] write_some & read_some test size MAX_BUFFER_SIZE data check
997 std::cout << "[14] write_some & read_some test size MAX_BUFFER_SIZE data check" << std::endl;
998 for(int i = 0;i < (int)send_size;i++){
999 BOOST_CHECK_EQUAL(send_buff[i],recv_buff[i]);
1000 if(send_buff[i] != recv_buff[i]) break;
1003 test_obj.test_close(ec);
1005 test_server.breq_close_wait_flag = false;
1006 test_server.bstop_flag = true;
1007 server_thread.join();
1009 BOOST_MESSAGE( "----- write_some & read_some test end -----" );
1014 BOOST_MESSAGE( "----- close test start -----" );
1016 test_mirror_server test_server;
1019 test_server.breq_acc_flag = true;
1021 test_server.breq_close_wait_flag = true;
1024 test_server.req_recv_cnt = 1;
1025 test_server.data_size = 1;
1027 // test server start
1028 boost::thread server_thread(boost::bind(&test_mirror_server::run,&test_server));
1030 while( !test_server.brun_flag ){
1034 std::cout << "ready dummy mirror server" << std::endl;
1038 boost::asio::ip::tcp::endpoint connect_end(boost::asio::ip::address::from_string(DUMMI_SERVER_IP), DUMMI_SERVER_PORT);
1039 boost::asio::io_service io;
1040 boost::system::error_code ec;
1042 l7vs::tcp_socket_option_info set_option;
1043 //! TCP_NODELAY (false:not set,true:set option)
1044 set_option.nodelay_opt = false;
1045 //! TCP_NODELAY option value (false:off,true:on)
1046 set_option.nodelay_val = false;
1047 //! TCP_CORK (false:not set,true:set option)
1048 set_option.cork_opt = false;
1049 //! TCP_CORK option value (false:off,true:on)
1050 set_option.cork_val = false;
1051 //! TCP_QUICKACK (false:not set,true:set option)
1052 set_option.quickack_opt = false;
1053 //! TCP_QUICKACK option value (false:off,true:on)
1054 set_option.quickack_val = false;
1056 test_socket_class test_obj(io,set_option);
1057 test_obj.connect(connect_end,ec);
1060 while(!test_server.bconnect_flag){
1064 BOOST_CHECK(test_obj.get_open_flag());
1066 BOOST_CHECK(!test_server.bdisconnect_flag);
1068 // unit_test [1] close test close success error_code object
1069 std::cout << "[1] close test close success error_code object" << std::endl;
1073 test_server.brecv_triger = true;
1076 // unit_test [2] close test open_flag set false
1077 std::cout << "[2] close test open_flag set false" << std::endl;
1078 BOOST_CHECK(!test_obj.get_open_flag());
1080 // unit_test [3] close test disconnect check
1081 std::cout << "[3] close test disconnect check" << std::endl;
1082 BOOST_CHECK(test_server.bdisconnect_flag);
1084 test_server.breq_close_wait_flag = false;
1085 test_server.bstop_flag = true;
1086 server_thread.join();
1087 BOOST_MESSAGE( "----- close test end -----" );
1090 void get_socket_test(){
1091 BOOST_MESSAGE( "----- get_socket test start -----" );
1093 boost::asio::io_service io;
1094 l7vs::tcp_socket_option_info set_option;
1095 //! TCP_NODELAY (false:not set,true:set option)
1096 set_option.nodelay_opt = false;
1097 //! TCP_NODELAY option value (false:off,true:on)
1098 set_option.nodelay_val = false;
1099 //! TCP_CORK (false:not set,true:set option)
1100 set_option.cork_opt = false;
1101 //! TCP_CORK option value (false:off,true:on)
1102 set_option.cork_val = false;
1103 //! TCP_QUICKACK (false:not set,true:set option)
1104 set_option.quickack_opt = false;
1105 //! TCP_QUICKACK option value (false:off,true:on)
1106 set_option.quickack_val = false;
1108 test_socket_class test_obj(io,set_option);
1110 // unit_test [1] get_socket socket check
1111 std::cout << "[1] get_socket socket check" << std::endl;
1113 boost::asio::ip::tcp::socket& chk_socket = test_obj.get_socket();
1114 boost::asio::ip::tcp::socket* pref_pointer = test_obj.get_socket_pointer();
1116 BOOST_CHECK_EQUAL(&chk_socket,pref_pointer);
1118 BOOST_MESSAGE( "----- get_socket test end -----" );
1122 class connect_lock_test_class : public l7vs::tcp_socket{
1124 boost::thread::id befor_thread_id;
1125 boost::thread::id after_thread_id;
1127 connect_lock_test_class(boost::asio::io_service& io,const l7vs::tcp_socket_option_info set_option) : l7vs::tcp_socket(io,set_option){
1130 ~connect_lock_test_class(){
1133 void connect(const boost::asio::ip::tcp::endpoint connect_endpoint,boost::system::error_code& ec){
1134 befor_thread_id = boost::this_thread::get_id();
1135 l7vs::tcp_socket::connect(connect_endpoint,ec);
1136 after_thread_id = boost::this_thread::get_id();
1140 close_mutex.wrlock();
1142 void mutex_unlock(){
1143 close_mutex.unlock();
1146 boost::mutex test_thread_wait;
1149 boost::mutex::scoped_lock scope_lock(test_thread_wait);
1150 boost::asio::ip::tcp::endpoint connect_end(boost::asio::ip::address::from_string(DUMMI_SERVER_IP), DUMMI_SERVER_PORT);
1151 boost::system::error_code ec;
1152 connect(connect_end,ec);
1159 void connect_lock_test(){
1160 BOOST_MESSAGE( "----- connetc lock test start -----" );
1162 boost::asio::io_service io;
1164 l7vs::tcp_socket_option_info set_option;
1165 //! TCP_NODELAY (false:not set,true:set option)
1166 set_option.nodelay_opt = false;
1167 //! TCP_NODELAY option value (false:off,true:on)
1168 set_option.nodelay_val = false;
1169 //! TCP_CORK (false:not set,true:set option)
1170 set_option.cork_opt = false;
1171 //! TCP_CORK option value (false:off,true:on)
1172 set_option.cork_val = false;
1173 //! TCP_QUICKACK (false:not set,true:set option)
1174 set_option.quickack_opt = false;
1175 //! TCP_QUICKACK option value (false:off,true:on)
1176 set_option.quickack_val = false;
1178 connect_lock_test_class test_obj(io,set_option);
1180 test_obj.test_thread_wait.lock();
1181 boost::thread::id proc_id = boost::this_thread::get_id();
1182 test_obj.befor_thread_id = proc_id;
1183 test_obj.after_thread_id = proc_id;
1184 test_obj.mutex_lock();
1186 boost::thread test_thread(boost::bind(&connect_lock_test_class::test_run,&test_obj));
1188 BOOST_CHECK(test_obj.befor_thread_id == proc_id);
1189 BOOST_CHECK(test_obj.after_thread_id == proc_id);
1191 boost::thread::id test_id = test_thread.get_id();
1193 BOOST_CHECK(test_id != proc_id);
1196 test_obj.test_thread_wait.unlock();
1199 // unit_test [1] connect lock test thread block test (mutex lock)
1200 std::cout << "[1] connect lock test thread block test (mutex lock)" << std::endl;
1201 BOOST_CHECK(test_obj.befor_thread_id == test_id);
1202 BOOST_CHECK(test_obj.after_thread_id == proc_id);
1204 test_obj.mutex_unlock();
1207 // unit_test [2] connect lock test thread run test (mutex unlock)
1208 std::cout << "[2] connect lock test thread run test (mutex unlock)" << std::endl;
1209 BOOST_CHECK(test_obj.befor_thread_id == test_id);
1210 BOOST_CHECK(test_obj.after_thread_id == test_id);
1213 BOOST_MESSAGE( "----- connetc lock test end -----" );
1217 class close_lock_test_class : public l7vs::tcp_socket{
1219 boost::thread::id befor_thread_id;
1220 boost::thread::id after_thread_id;
1222 close_lock_test_class(boost::asio::io_service& io,const l7vs::tcp_socket_option_info set_option) : l7vs::tcp_socket(io,set_option){
1225 ~close_lock_test_class(){
1228 void close(boost::system::error_code& ec){
1229 befor_thread_id = boost::this_thread::get_id();
1230 l7vs::tcp_socket::close(ec);
1231 after_thread_id = boost::this_thread::get_id();
1235 close_mutex.wrlock();
1237 void mutex_unlock(){
1238 close_mutex.unlock();
1241 boost::mutex test_thread_wait;
1244 boost::mutex::scoped_lock scope_lock(test_thread_wait);
1245 boost::system::error_code ec;
1252 void close_lock_test(){
1253 BOOST_MESSAGE( "----- close lock test start -----" );
1255 boost::asio::io_service io;
1256 l7vs::tcp_socket_option_info set_option;
1257 //! TCP_NODELAY (false:not set,true:set option)
1258 set_option.nodelay_opt = false;
1259 //! TCP_NODELAY option value (false:off,true:on)
1260 set_option.nodelay_val = false;
1261 //! TCP_CORK (false:not set,true:set option)
1262 set_option.cork_opt = false;
1263 //! TCP_CORK option value (false:off,true:on)
1264 set_option.cork_val = false;
1265 //! TCP_QUICKACK (false:not set,true:set option)
1266 set_option.quickack_opt = false;
1267 //! TCP_QUICKACK option value (false:off,true:on)
1268 set_option.quickack_val = false;
1270 close_lock_test_class test_obj(io,set_option);
1272 test_obj.test_thread_wait.lock();
1273 boost::thread::id proc_id = boost::this_thread::get_id();
1274 test_obj.befor_thread_id = proc_id;
1275 test_obj.after_thread_id = proc_id;
1276 test_obj.mutex_lock();
1278 boost::thread test_thread(boost::bind(&close_lock_test_class::test_run,&test_obj));
1280 BOOST_CHECK(test_obj.befor_thread_id == proc_id);
1281 BOOST_CHECK(test_obj.after_thread_id == proc_id);
1283 boost::thread::id test_id = test_thread.get_id();
1285 BOOST_CHECK(test_id != proc_id);
1288 test_obj.test_thread_wait.unlock();
1291 // unit_test [1] close lock test thread block test (mutex lock)
1292 std::cout << "[1] close lock test thread block test (mutex lock)" << std::endl;
1293 BOOST_CHECK(test_obj.befor_thread_id == test_id);
1294 BOOST_CHECK(test_obj.after_thread_id == proc_id);
1296 test_obj.mutex_unlock();
1299 // unit_test [2] close lock test thread run test (mutex unlock)
1300 std::cout << "[2] close lock test thread run test (mutex unlock)" << std::endl;
1301 BOOST_CHECK(test_obj.befor_thread_id == test_id);
1302 BOOST_CHECK(test_obj.after_thread_id == test_id);
1304 BOOST_MESSAGE( "----- close lock test end -----" );
1308 void is_open_test(){
1310 BOOST_MESSAGE( "----- is_open test start -----" );
1312 test_mirror_server test_server;
1315 test_server.breq_acc_flag = true;
1317 test_server.breq_close_wait_flag = true;
1320 test_server.req_recv_cnt = 1;
1321 test_server.data_size = 1;
1323 // test server start
1324 boost::thread server_thread(boost::bind(&test_mirror_server::run,&test_server));
1326 while( !test_server.brun_flag ){
1330 std::cout << "ready dummy mirror server" << std::endl;
1334 boost::asio::ip::tcp::endpoint connect_end(boost::asio::ip::address::from_string(DUMMI_SERVER_IP), DUMMI_SERVER_PORT);
1335 boost::asio::io_service io;
1336 boost::system::error_code ec;
1338 l7vs::tcp_socket_option_info set_option;
1339 //! TCP_NODELAY (false:not set,true:set option)
1340 set_option.nodelay_opt = false;
1341 //! TCP_NODELAY option value (false:off,true:on)
1342 set_option.nodelay_val = false;
1343 //! TCP_CORK (false:not set,true:set option)
1344 set_option.cork_opt = false;
1345 //! TCP_CORK option value (false:off,true:on)
1346 set_option.cork_val = false;
1347 //! TCP_QUICKACK (false:not set,true:set option)
1348 set_option.quickack_opt = false;
1349 //! TCP_QUICKACK option value (false:off,true:on)
1350 set_option.quickack_val = false;
1352 test_socket_class test_obj(io,set_option);
1354 // unit_test [1] is_open before connect check
1355 std::cout << "[1] is_open before connect check" << std::endl;
1356 BOOST_CHECK(!test_obj.is_open());
1358 test_obj.connect(connect_end,ec);
1361 // unit_test [2] is_open after connect check
1362 std::cout << "[2] is_open after connect check" << std::endl;
1363 BOOST_CHECK(test_obj.is_open());
1365 while(!test_server.bconnect_flag){
1369 BOOST_CHECK(test_obj.get_open_flag());
1371 BOOST_CHECK(!test_server.bdisconnect_flag);
1376 // unit_test [3] is_open close after check
1377 std::cout << "[3] is_open close after check" << std::endl;
1378 BOOST_CHECK(!test_obj.is_open());
1380 test_server.brecv_triger = true;
1383 test_server.breq_close_wait_flag = false;
1384 test_server.bstop_flag = true;
1385 server_thread.join();
1386 BOOST_MESSAGE( "----- is_open test end -----" );