4 #include <boost/test/included/unit_test.hpp>
5 #include <boost/archive/text_oarchive.hpp>
6 #include <boost/archive/text_iarchive.hpp>
7 #include <boost/thread.hpp>
10 #include "virtualservice.h"
13 #include "protocol_module_test1.h"
14 #include "schedule_module_test1.h"
16 using namespace boost::unit_test;
18 typedef boost::asio::ip::tcp::endpoint tcp_ep_type;
19 typedef boost::asio::ip::udp::endpoint udp_ep_type;
25 boost::system::error_code b_err;
27 boost::asio::io_service dispatcher;
28 boost::asio::ip::tcp::socket sock( dispatcher );
29 sock.connect( tcp_ep_type( boost::asio::ip::address_v4::loopback(), (60000) ), b_err );
30 std::cout << "connect" << std::endl;
39 boost::asio::io_service dispatcher;
43 l7vs::replication* rep;
44 l7vs::error_code vs_err;
46 boost::condition cond;
48 vs_access() : vs( NULL ), rep( NULL ) {}
51 void initialize( l7vs::virtualservice_element& in_elem ){
52 rep = new l7vs::replication();
53 vs = new l7vs::vs_tcp( vsd, *rep, in_elem );
57 vs->finalize( vs_err );
77 l7vs::vs_tcp* get_vs(){
82 boost::system::error_code b_err;
84 boost::asio::io_service client_io;
85 boost::asio::ip::tcp::socket sock( client_io );
87 boost::mutex::scoped_lock lk( mtx );
90 sock.connect( tcp_ep_type( boost::asio::ip::address_v4::loopback(), (60000) ), b_err );
91 std::cout << "connect" << std::endl;
100 boost::mutex::scoped_lock lk( mtx );
104 // std::cout << "" << std::endl;
106 void rs_list_unlock(){
108 boost::mutex::scoped_lock lk( mtx );
111 vs->rs_list_unlock();
115 void get_element( l7vs::virtualservice_element* elem ){
117 boost::mutex::scoped_lock lk( mtx );
120 *(elem) = vs->get_element();
124 void get_qos_upstream( unsigned long long* val ){
126 boost::mutex::scoped_lock lk( mtx );
129 *val = vs->get_qos_upstream();
132 void get_qos_downstream( unsigned long long* val ){
134 boost::mutex::scoped_lock lk( mtx );
137 *val = vs->get_qos_downstream();
140 void get_throughput_upstream( unsigned long long* val ){
142 boost::mutex::scoped_lock lk( mtx );
145 *val = vs->get_throughput_upstream();
148 void get_throughput_downstream( unsigned long long* val ){
150 boost::mutex::scoped_lock lk( mtx );
153 *val = vs->get_throughput_downstream();
156 void get_up_recv_size( unsigned long long* val ){
158 boost::mutex::scoped_lock lk( mtx );
161 *val = vs->get_up_recv_size();
164 void get_up_send_size( unsigned long long* val ){
166 boost::mutex::scoped_lock lk( mtx );
169 *val = vs->get_up_send_size();
172 void get_down_recv_size( unsigned long long* val ){
174 boost::mutex::scoped_lock lk( mtx );
177 *val = vs->get_down_recv_size();
180 void get_down_send_size( unsigned long long* val ){
182 boost::mutex::scoped_lock lk( mtx );
185 *val = vs->get_down_send_size();
189 void update_up_recv_size( unsigned long long size ){
191 boost::mutex::scoped_lock lk( mtx );
194 vs->update_up_recv_size( size );
197 void update_up_send_size( unsigned long long size ){
199 boost::mutex::scoped_lock lk( mtx );
202 vs->update_up_send_size( size );
205 void update_down_recv_size( unsigned long long size ){
207 boost::mutex::scoped_lock lk( mtx );
210 vs->update_down_recv_size( size );
213 void update_down_send_size( unsigned long long size ){
215 boost::mutex::scoped_lock lk( mtx );
218 vs->update_down_send_size( size );
222 void get_protocol_module( l7vs::protocol_module_base* in_pm ){
224 boost::mutex::scoped_lock lk( mtx );
227 in_pm = vs->get_protocol_module();
230 void get_schedule_module( l7vs::schedule_module_base* in_sm ){
232 boost::mutex::scoped_lock lk( mtx );
235 in_sm = vs->get_schedule_module();
239 void vs_initialize(){
240 l7vs::error_code vs_err;
242 boost::mutex::scoped_lock lk( mtx );
245 vs->initialize( vs_err );
249 l7vs::error_code vs_err;
251 boost::mutex::scoped_lock lk( mtx );
254 vs->finalize( vs_err );
256 BOOST_MESSAGE( "finalize." << boost::this_thread::get_id() );
259 void vs_eq( const l7vs::virtualservice_base* in_vs, bool* ret ){
261 boost::mutex::scoped_lock lk( mtx );
264 *ret = vs->operator==(*in_vs);
267 void vs_ne( const l7vs::virtualservice_base* in_vs, bool* ret ){
269 boost::mutex::scoped_lock lk( mtx );
272 *ret = vs->operator!=(*in_vs);
276 void set_virtualservice( const l7vs::virtualservice_element& elem ){
277 l7vs::error_code vs_err;
279 boost::mutex::scoped_lock lk( mtx );
282 vs->set_virtualservice( elem, vs_err );
285 void edit_virtualservice( const l7vs::virtualservice_element& elem ){
286 l7vs::error_code vs_err;
288 boost::mutex::scoped_lock lk( mtx );
291 vs->edit_virtualservice( elem, vs_err );
295 void add_realserver( const l7vs::virtualservice_element& elem ){
296 l7vs::error_code vs_err;
298 boost::mutex::scoped_lock lk( mtx );
301 vs->add_realserver( elem, vs_err );
304 void edit_realserver( const l7vs::virtualservice_element& elem ){
305 l7vs::error_code vs_err;
307 boost::mutex::scoped_lock lk( mtx );
310 vs->edit_realserver( elem, vs_err );
313 void del_realserver( const l7vs::virtualservice_element& elem ){
314 l7vs::error_code vs_err;
316 boost::mutex::scoped_lock lk( mtx );
319 vs->del_realserver( elem, vs_err );
328 boost::mutex::scoped_lock lk( mtx );
335 void connection_active( const tcp_ep_type& ep ){
337 boost::mutex::scoped_lock lk( mtx );
340 vs->connection_active( ep );
343 void connection_inactive( const tcp_ep_type& ep ){
345 boost::mutex::scoped_lock lk( mtx );
348 vs->connection_inactive( ep );
351 void release_session( const l7vs::tcp_session* session_ptr ){
353 boost::mutex::scoped_lock lk( mtx );
356 vs->release_session( session_ptr );
360 //test case1 create,initialize,run,stop,finalize,destroy(normal case)
361 void virtualservice_tcp_test1(){
364 //replicationエリアを作成しておく
365 debugg_flug_struct::getInstance().create_rep_area();
367 boost::asio::io_service dispatcher;
370 l7vs::replication rep;
372 debugg_flug_struct::getInstance().pmcontrol_err_flag() = false;
373 debugg_flug_struct::getInstance().smcontrol_err_flag() = false;
374 debugg_flug_struct::getInstance().param_exist_flag() = false;
376 l7vs::error_code vs_err;
377 boost::system::error_code test_err;
379 std::stringstream tmp_tcp_ep;
380 std::stringstream tmp_udp_ep;
381 std::stringstream tmp_sorry_ep;
383 l7vs::virtualservice_element elem1;
386 elem1.udpmode = false;
387 elem1.tcp_accept_endpoint =
388 tcp_ep_type( boost::asio::ip::address_v4::loopback(), (60000) );
389 elem1.udp_recv_endpoint = udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.87" ), (50000) );
390 elem1.realserver_vector.clear();
391 elem1.protocol_module_name = "PMtest1";
392 elem1.schedule_module_name = "SMtest1";
393 elem1.protocol_args.clear();
394 elem1.sorry_maxconnection = 1234LL;
395 elem1.sorry_endpoint = tcp_ep_type();
396 elem1.sorry_flag = false;
397 elem1.qos_upstream = 65535ULL;
398 elem1.qos_downstream = 32767ULL;
403 vst.initialize( elem1 );
404 vst.get_vs()->initialize( vs_err );
409 // unit_test[1] operator==に2スレッドから同時アクセス
410 std::cout << counter++ << std::endl;
412 l7vs::virtualservice_element elem2;
413 elem2.udpmode = false;
414 elem2.tcp_accept_endpoint =
415 tcp_ep_type( boost::asio::ip::address::from_string( "10.144.169.30" ), (40000) );
416 elem2.udp_recv_endpoint = udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
417 elem2.realserver_vector.clear();
418 elem2.protocol_module_name = "PMtest1";
419 elem2.schedule_module_name = "SMtest1";
420 elem2.protocol_args.clear();
421 elem2.sorry_maxconnection = 1234LL;
422 elem2.sorry_endpoint = tcp_ep_type();
423 elem2.sorry_flag = false;
424 elem2.qos_upstream = 65535ULL;
425 elem2.qos_downstream = 32767ULL;
427 l7vs::vs_tcp* vs1 = new l7vs::vs_tcp( vsd, rep, elem1 );
428 l7vs::vs_tcp* vs2 = new l7vs::vs_tcp( vsd, rep, elem2 );
429 bool retbool1 = true;
430 bool retbool2 = true;
432 BOOST_CHECK( vst.get_vs()->get_element().udpmode == elem1.udpmode );
433 BOOST_CHECK( vst.get_vs()->get_element().tcp_accept_endpoint == elem1.tcp_accept_endpoint );
434 BOOST_CHECK( vst.get_vs()->get_element().udp_recv_endpoint == elem1.udp_recv_endpoint );
435 BOOST_CHECK( vst.get_vs()->get_element().protocol_module_name == elem1.protocol_module_name );
438 boost::thread eq1( &vs_access::vs_eq, &vst, vs1, &retbool1 );
439 boost::thread eq2( &vs_access::vs_eq, &vst, vs2, &retbool2 );
448 BOOST_CHECK( retbool1 );
449 BOOST_CHECK( !retbool2 );
451 // unit_test[2] operator!=に2スレッドから同時アクセス
452 std::cout << counter++ << std::endl;
454 boost::thread ne1( &vs_access::vs_ne, &vst, vs1, &retbool1 );
455 boost::thread ne2( &vs_access::vs_ne, &vst, vs2, &retbool2 );
464 BOOST_CHECK( !retbool1 );
465 BOOST_CHECK( retbool2 );
467 // unit_test[3] rs_list_lockに2スレッドから同時アクセス
468 std::cout << counter++ << std::endl;
470 boost::thread lk1( &vs_access::rs_list_lock, &vst );
471 boost::thread lk2( &vs_access::rs_list_lock, &vst );
479 BOOST_CHECK( vst.get_vs()->get_ref_count() == 2ULL );
481 // unit_test[4] rs_list_unlockに2スレッドから同時アクセス
482 std::cout << counter++ << std::endl;
484 boost::thread ulk1( &vs_access::rs_list_unlock, &vst );
485 boost::thread ulk2( &vs_access::rs_list_unlock, &vst );
493 BOOST_CHECK( vst.get_vs()->get_ref_count() == 0ULL );
495 // unit_test[5] get_elementに2スレッドから同時アクセス
496 l7vs::virtualservice_element test_elem1;
497 l7vs::virtualservice_element test_elem2;
498 std::cout << counter++ << std::endl;
500 boost::thread get_elem1( &vs_access::get_element, &vst, &test_elem1 );
501 boost::thread get_elem2( &vs_access::get_element, &vst, &test_elem2 );
509 BOOST_CHECK( test_elem1 == test_elem2 );
511 // unit_test[6] connection_activeに2スレッドから同時アクセス
512 std::cout << counter++ << std::endl;
514 l7vs::virtualservice_element elem3;
516 elem3.udpmode = false;
517 elem3.tcp_accept_endpoint =
518 tcp_ep_type( boost::asio::ip::address_v4::loopback(), (60000) );
519 elem3.udp_recv_endpoint = udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
520 elem3.realserver_vector.clear();
521 elem3.protocol_module_name = "PMtest1";
522 elem3.schedule_module_name = "SMtest1";
523 elem3.protocol_args.clear();
524 elem3.sorry_maxconnection = 1234LL;
525 elem3.sorry_endpoint = tcp_ep_type();
526 elem3.sorry_flag = false;
527 elem3.qos_upstream = 65535ULL;
528 elem3.qos_downstream = 32767ULL;
529 for( size_t i = 0; i < 2; ++i ){
530 l7vs::realserver_element rs_elem;
531 rs_elem.tcp_endpoint = tcp_ep_type( boost::asio::ip::address::from_string( "192.168.10.10" ), (i+8080) );
532 elem3.realserver_vector.push_back( rs_elem );
534 vst.get_vs()->add_realserver( elem3, vs_err );
535 BOOST_CHECK( vst.get_vs()->get_rs_list().size() == 2 );
536 tcp_ep_type ep1 = elem3.realserver_vector[0].tcp_endpoint;
537 tcp_ep_type ep2 = elem3.realserver_vector[1].tcp_endpoint;
539 boost::thread con_act1( &vs_access::connection_active, &vst, ep1 );
540 boost::thread con_act2( &vs_access::connection_active, &vst, ep2 );
548 BOOST_CHECK( vst.get_vs()->get_element().realserver_vector[0].get_active() == 1 );
549 BOOST_CHECK( vst.get_vs()->get_element().realserver_vector[1].get_active() == 1 );
551 // unit_test[7] connection_inactiveに2スレッドから同時アクセス
552 std::cout << counter++ << std::endl;
554 boost::thread con_inact1( &vs_access::connection_inactive, &vst, ep2 );
555 boost::thread con_inact2( &vs_access::connection_inactive, &vst, ep1 );
563 BOOST_CHECK( vst.get_vs()->get_element().realserver_vector[0].get_active() == 0 );
564 BOOST_CHECK( vst.get_vs()->get_element().realserver_vector[1].get_active() == 0 );
565 BOOST_CHECK( vst.get_vs()->get_element().realserver_vector[0].get_inact() == 1 );
566 BOOST_CHECK( vst.get_vs()->get_element().realserver_vector[1].get_inact() == 1 );
569 // vst.get_vs()->initialize( vs_err );
570 boost::thread vs_run( &vs_access::run, &vst );
572 BOOST_MESSAGE( vst.get_vs()->get_pool_sessions().size() );
573 BOOST_CHECK( vst.get_vs()->get_pool_sessions().size() == (l7vs::virtualservice_base::SESSION_POOL_NUM_DEFAULT - 1) );
575 // unit_test[8] release_sessionに2スレッドから同時アクセス
576 // unit_test[9] stopに2スレッドから同時アクセス
577 //あらかじめclientからconnectして、ActiveSessionを2つ以上にしておく
578 std::cout << counter++ << std::endl;
579 std::cout << counter++ << std::endl;
582 boost::thread cl1( &client );
583 boost::thread cl2( &client );
586 BOOST_CHECK( vst.get_vs()->get_pool_sessions().size() == l7vs::virtualservice_base::SESSION_POOL_NUM_DEFAULT-3 );
587 BOOST_CHECK( vst.get_vs()->get_waiting_sessions().size() == 1 );
588 BOOST_CHECK( vst.get_vs()->get_active_sessions().size() == 2 );
594 boost::thread stop1( &vs_access::stop, &vst );
595 boost::thread stop2( &vs_access::stop, &vst );
600 //stopの流れでrelease_sessionも呼ばれる
604 std::cout << vst.get_vs()->get_pool_sessions().size() << std::endl;
605 BOOST_CHECK( vst.get_vs()->get_pool_sessions().size() == l7vs::virtualservice_base::SESSION_POOL_NUM_DEFAULT-1 );
606 std::cout << vst.get_vs()->get_waiting_sessions().size() << std::endl;
607 BOOST_CHECK( vst.get_vs()->get_waiting_sessions().size() == 1 );
610 // unit_test[10] get_qos_upstreamに2スレッドから同時アクセス
611 std::cout << counter++ << std::endl;
612 unsigned long long qos1 = 0;
613 unsigned long long qos2 = 0;
615 boost::thread qosup1( &vs_access::get_qos_upstream, &vst, &qos1 );
616 boost::thread qosup2( &vs_access::get_qos_upstream, &vst, &qos2 );
624 BOOST_CHECK( qos1 == elem1.qos_upstream );
625 BOOST_CHECK( qos2 == elem1.qos_upstream );
627 // unit_test[11] get_qos_downstreamに2スレッドから同時アクセス
628 std::cout << counter++ << std::endl;
630 boost::thread qosdown1( &vs_access::get_qos_downstream, &vst, &qos1 );
631 boost::thread qosdown2( &vs_access::get_qos_downstream, &vst, &qos2 );
639 BOOST_CHECK( qos1 == elem1.qos_downstream );
640 BOOST_CHECK( qos2 == elem1.qos_downstream );
642 // unit_test[12] get_throughput_upstreamに2スレッドから同時アクセス
643 std::cout << counter++ << std::endl;
644 unsigned long long throughput1 = 65535ULL;
645 unsigned long long throughput2 = 65535ULL;
647 boost::thread get_throughput1( &vs_access::get_throughput_upstream, &vst, &throughput1 );
648 boost::thread get_throughput2( &vs_access::get_throughput_upstream, &vst, &throughput2 );
653 get_throughput1.join();
654 get_throughput2.join();
656 BOOST_CHECK( throughput1 == 0ULL );
657 BOOST_CHECK( throughput1 == 0ULL );
659 // unit_test[13] get_throughput_downstreamに2スレッドから同時アクセス
660 std::cout << counter++ << std::endl;
661 throughput1 = 65535ULL;
662 throughput2 = 65535ULL;
664 boost::thread thread1( &vs_access::get_throughput_downstream, &vst, &throughput1 );
665 boost::thread thread2( &vs_access::get_throughput_downstream, &vst, &throughput2 );
673 BOOST_CHECK( throughput1 == 0ULL );
674 BOOST_CHECK( throughput1 == 0ULL );
676 // unit_test[14] get_up_recv_sizeに2スレッドから同時アクセス
677 std::cout << counter++ << std::endl;
678 unsigned long long recv_size1 = 65535ULL;
679 unsigned long long recv_size2 = 65535ULL;
681 boost::thread thread1( &vs_access::get_up_recv_size, &vst, &recv_size1 );
682 boost::thread thread2( &vs_access::get_up_recv_size, &vst, &recv_size2 );
690 BOOST_CHECK( recv_size1 == 0ULL );
691 BOOST_CHECK( recv_size2 == 0ULL );
693 // unit_test[15] get_up_send_sizeに2スレッドから同時アクセス
694 std::cout << counter++ << std::endl;
695 recv_size1 = 65535ULL;
696 recv_size2 = 65535ULL;
698 boost::thread thread1( &vs_access::get_up_send_size, &vst, &recv_size1 );
699 boost::thread thread2( &vs_access::get_up_send_size, &vst, &recv_size2 );
707 BOOST_CHECK( recv_size1 == 0ULL );
708 BOOST_CHECK( recv_size2 == 0ULL );
710 // unit_test[16] get_down_recv_sizeに2スレッドから同時アクセス
711 std::cout << counter++ << std::endl;
712 recv_size1 = 65535ULL;
713 recv_size2 = 65535ULL;
715 boost::thread thread1( &vs_access::get_down_recv_size, &vst, &recv_size1 );
716 boost::thread thread2( &vs_access::get_down_recv_size, &vst, &recv_size2 );
724 BOOST_CHECK( recv_size1 == 0ULL );
725 BOOST_CHECK( recv_size2 == 0ULL );
727 // unit_test[17] get_down_send_sizeに2スレッドから同時アクセス
728 std::cout << counter++ << std::endl;
729 recv_size1 = 65535ULL;
730 recv_size2 = 65535ULL;
732 boost::thread thread1( &vs_access::get_down_send_size, &vst, &recv_size1 );
733 boost::thread thread2( &vs_access::get_down_send_size, &vst, &recv_size2 );
741 BOOST_CHECK( recv_size1 == 0ULL );
742 BOOST_CHECK( recv_size2 == 0ULL );
744 // unit_test[18] update_up_recv_sizeに2スレッドから同時アクセス
745 std::cout << counter++ << std::endl;
747 boost::thread thread1( &vs_access::update_up_recv_size, &vst, 1000ULL );
748 boost::thread thread2( &vs_access::update_up_recv_size, &vst, 200ULL );
756 recv_size1 = vst.get_vs()->get_up_recv_size();
757 BOOST_CHECK( recv_size1 == 1200ULL );
759 // unit_test[19] update_up_send_sizeに2スレッドから同時アクセス
760 std::cout << counter++ << std::endl;
762 boost::thread thread1( &vs_access::update_up_send_size, &vst, 100ULL );
763 boost::thread thread2( &vs_access::update_up_send_size, &vst, 300ULL );
771 recv_size1 = vst.get_vs()->get_up_send_size();
772 BOOST_CHECK( recv_size1 == 400ULL );
774 // unit_test[20] update_down_recv_sizeに2スレッドから同時アクセス
775 std::cout << counter++ << std::endl;
777 boost::thread thread1( &vs_access::update_down_recv_size, &vst, 10ULL );
778 boost::thread thread2( &vs_access::update_down_recv_size, &vst, 500ULL );
786 recv_size1 = vst.get_vs()->get_down_recv_size();
787 BOOST_CHECK( recv_size1 == 510ULL );
789 // unit_test[21] update_down_send_sizeに2スレッドから同時アクセス
790 std::cout << counter++ << std::endl;
792 boost::thread thread1( &vs_access::update_down_send_size, &vst, 8000ULL );
793 boost::thread thread2( &vs_access::update_down_send_size, &vst, 5000ULL );
801 recv_size1 = vst.get_vs()->get_down_send_size();
802 BOOST_CHECK( recv_size1 == 13000ULL );
804 // unit_test[22] get_protocol_moduleに2スレッドから同時アクセス
805 std::cout << counter++ << std::endl;
806 l7vs::protocol_module_base* pmb1 = NULL;
807 l7vs::protocol_module_base* pmb2 = NULL;
809 boost::thread thread1( &vs_access::get_protocol_module, &vst, pmb1 );
810 boost::thread thread2( &vs_access::get_protocol_module, &vst, pmb2 );
818 BOOST_CHECK( pmb1 == pmb2 );
820 // unit_test[23] get_schedule_moduleに2スレッドから同時アクセス
821 std::cout << counter++ << std::endl;
822 l7vs::schedule_module_base* smb1 = NULL;
823 l7vs::schedule_module_base* smb2 = NULL;
825 boost::thread thread1( &vs_access::get_schedule_module, &vst, smb1 );
826 boost::thread thread2( &vs_access::get_schedule_module, &vst, smb2 );
834 BOOST_CHECK( smb1 == smb2 );
839 //replicationエリアを開放する
840 debugg_flug_struct::getInstance().destroy_rep_area();
844 void virtualservice_tcp_test2(){
845 //replicationエリアを作成しておく
846 debugg_flug_struct::getInstance().create_rep_area();
848 boost::asio::io_service dispatcher;
851 l7vs::replication rep();
853 debugg_flug_struct::getInstance().pmcontrol_err_flag() = false;
854 debugg_flug_struct::getInstance().smcontrol_err_flag() = false;
855 debugg_flug_struct::getInstance().param_exist_flag() = false;
857 l7vs::error_code vs_err;
858 boost::system::error_code test_err;
860 std::stringstream tmp_tcp_ep;
861 std::stringstream tmp_udp_ep;
862 std::stringstream tmp_sorry_ep;
864 l7vs::virtualservice_element elem1;
867 elem1.udpmode = false;
868 elem1.tcp_accept_endpoint =
869 tcp_ep_type( boost::asio::ip::address_v4::loopback(), (60000) );
870 elem1.udp_recv_endpoint = udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
871 elem1.realserver_vector.clear();
872 elem1.protocol_module_name = "PMtest1";
873 elem1.schedule_module_name = "SMtest1";
874 elem1.protocol_args.clear();
875 elem1.sorry_maxconnection = 1234LL;
876 elem1.sorry_endpoint = tcp_ep_type();
877 elem1.sorry_flag = false;
878 elem1.qos_upstream = 65535ULL;
879 elem1.qos_downstream = 32767ULL;
883 vst.initialize( elem1 );
884 vst.get_vs()->initialize( vs_err );
886 boost::thread vs_run( &vs_access::run, &vst );
889 // unit_test[24] sessionがActiveになるときに、release_sessionされるケース
890 // unit_test[25] sessionがActiveになるときにfinalize
891 // unit_test[26] release_sessionされるときにfinalize
892 std::cout << counter++ << std::endl;
893 std::cout << counter++ << std::endl;
894 std::cout << counter++ << std::endl;
895 // finalizeを呼べば、stopされてrelease_sessionされる。
897 boost::thread thread1( &vs_access::client, &vst );
898 boost::thread thread2( &vs_access::vs_finalize, &vst );
907 vst.get_vs()->stop();
914 //replicationエリアを開放する
915 debugg_flug_struct::getInstance().destroy_rep_area();
918 void virtualservice_tcp_test3(){
919 //replicationエリアを作成しておく
920 debugg_flug_struct::getInstance().create_rep_area();
922 // boost::asio::io_service dispatcher;
925 l7vs::replication rep();
927 debugg_flug_struct::getInstance().pmcontrol_err_flag() = false;
928 debugg_flug_struct::getInstance().smcontrol_err_flag() = false;
929 debugg_flug_struct::getInstance().param_exist_flag() = false;
931 l7vs::error_code vs_err;
932 boost::system::error_code test_err;
934 std::stringstream tmp_tcp_ep;
935 std::stringstream tmp_udp_ep;
936 std::stringstream tmp_sorry_ep;
938 l7vs::virtualservice_element elem1;
941 elem1.udpmode = false;
942 elem1.tcp_accept_endpoint =
943 tcp_ep_type( boost::asio::ip::address_v4::loopback(), (60000) );
944 elem1.udp_recv_endpoint = udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
945 elem1.realserver_vector.clear();
946 elem1.protocol_module_name = "PMtest1";
947 elem1.schedule_module_name = "SMtest1";
948 elem1.protocol_args.clear();
949 elem1.sorry_maxconnection = 1234LL;
950 elem1.sorry_endpoint = tcp_ep_type();
951 elem1.sorry_flag = false;
952 elem1.qos_upstream = 65535ULL;
953 elem1.qos_downstream = 32767ULL;
957 vst.initialize( elem1 );
960 // unit_test[27] add_rsとrs_list_lock
961 std::cout << counter++ << std::endl;
963 l7vs::virtualservice_element elem2;
965 elem2.udpmode = false;
966 elem2.tcp_accept_endpoint =
967 tcp_ep_type( boost::asio::ip::address_v4::loopback(), (60000) );
968 elem2.udp_recv_endpoint = udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
969 elem2.realserver_vector.clear();
970 elem2.protocol_module_name = "PMtest1";
971 elem2.schedule_module_name = "SMtest1";
972 elem2.protocol_args.clear();
973 elem2.sorry_maxconnection = 1234LL;
974 elem2.sorry_endpoint = tcp_ep_type();
975 elem2.sorry_flag = false;
976 elem2.qos_upstream = 65535ULL;
977 elem2.qos_downstream = 32767ULL;
978 for( size_t i = 0; i < 2; ++i ){
979 l7vs::realserver_element rs_elem;
980 rs_elem.tcp_endpoint = tcp_ep_type( boost::asio::ip::address::from_string( "192.168.10.10" ), (i+8080) );
981 rs_elem.weight = 10+i;
982 elem2.realserver_vector.push_back( rs_elem );
985 boost::thread thread1( &vs_access::rs_list_lock, &vst );
986 boost::thread thread2( &vs_access::add_realserver, &vst, elem2 );
991 BOOST_CHECK( vst.get_vs()->get_ref_count() == 1 );
992 //ref_countが1のままだとadd_realserverができないのでunlockする
993 vst.get_vs()->rs_list_unlock();
998 BOOST_CHECK( vst.get_vs()->get_rs_list().size() == 2 );
999 BOOST_CHECK( vst.get_vs()->get_ref_count() == 0 );
1002 vst.get_vs()->del_realserver( elem2, vs_err );
1004 // unit_test[28] add_rsとrs_list_unlock(ref_countが1でスタートした場合)
1005 std::cout << counter++ << std::endl;
1007 //あらかじめlockしておいてref_countを1にしておく
1008 vst.get_vs()->rs_list_lock();
1009 BOOST_CHECK( vst.get_vs()->get_ref_count() == 1 );
1011 boost::thread thread1( &vs_access::add_realserver, &vst, elem2 );
1012 boost::thread thread2( &vs_access::rs_list_unlock, &vst );
1020 BOOST_CHECK( vst.get_vs()->get_rs_list().size() == 2 );
1021 BOOST_CHECK( vst.get_vs()->get_ref_count() == 0 );
1023 // unit_test[29] add_rsとconnection_active
1024 std::cout << counter++ << std::endl;
1026 l7vs::virtualservice_element elem3;
1028 elem3.udpmode = false;
1029 elem3.tcp_accept_endpoint =
1030 tcp_ep_type( boost::asio::ip::address_v4::loopback(), (60000) );
1031 elem3.udp_recv_endpoint = udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
1032 elem3.realserver_vector.clear();
1033 elem3.protocol_module_name = "PMtest1";
1034 elem3.schedule_module_name = "SMtest1";
1035 elem3.protocol_args.clear();
1036 elem3.sorry_maxconnection = 1234LL;
1037 elem3.sorry_endpoint = tcp_ep_type();
1038 elem3.sorry_flag = false;
1039 elem3.qos_upstream = 65535ULL;
1040 elem3.qos_downstream = 32767ULL;
1041 for( size_t i = 0; i < 2; ++i ){
1042 l7vs::realserver_element rs_elem;
1043 rs_elem.tcp_endpoint = tcp_ep_type( boost::asio::ip::address::from_string( "192.168.10.10" ), (i+8090) );
1044 rs_elem.weight = 5+i;
1045 elem3.realserver_vector.push_back( rs_elem );
1048 boost::thread thread1( &vs_access::add_realserver, &vst, elem3 );
1049 boost::thread thread2( &vs_access::connection_active, &vst, elem2.realserver_vector[0].tcp_endpoint );
1058 BOOST_CHECK( vst.get_vs()->get_rs_list().size() == 4 );
1059 for( std::list<l7vs::realserver>::iterator itr = vst.get_vs()->get_rs_list().begin();
1060 itr != vst.get_vs()->get_rs_list().end(); ++itr ){
1061 if( itr->tcp_endpoint == elem2.realserver_vector[0].tcp_endpoint ){
1062 std::cout << "active_conn check" << std::endl;
1063 BOOST_CHECK( itr->get_active() == 1 );
1064 BOOST_CHECK( itr->get_inact() == 0 );
1070 vst.get_vs()->del_realserver( elem3, vs_err );
1072 // unit_test[30] add_rsとconnection_inactive
1073 std::cout << counter++ << std::endl;
1075 boost::thread thread1( &vs_access::add_realserver, &vst, elem3 );
1076 boost::thread thread2( &vs_access::connection_inactive, &vst, elem2.realserver_vector[0].tcp_endpoint );
1085 BOOST_CHECK( vst.get_vs()->get_rs_list().size() == 4 );
1086 for( std::list<l7vs::realserver>::iterator itr = vst.get_vs()->get_rs_list().begin();
1087 itr != vst.get_vs()->get_rs_list().end(); ++itr ){
1088 if( itr->tcp_endpoint == elem2.realserver_vector[0].tcp_endpoint ){
1089 std::cout << "inactive_conn check" << std::endl;
1090 BOOST_CHECK( itr->get_active() == 0 );
1091 BOOST_CHECK( itr->get_inact() == 1 );
1097 // unit_test[31] edit_rsとrs_list_lock
1098 std::cout << counter++ << std::endl;
1100 l7vs::virtualservice_element elem4;
1102 elem4.udpmode = false;
1103 elem4.tcp_accept_endpoint =
1104 tcp_ep_type( boost::asio::ip::address_v4::loopback(), (60000) );
1105 elem4.udp_recv_endpoint = udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
1106 elem4.realserver_vector.clear();
1107 elem4.protocol_module_name = "PMtest1";
1108 elem4.schedule_module_name = "SMtest1";
1109 elem4.protocol_args.clear();
1110 elem4.sorry_maxconnection = 1234LL;
1111 elem4.sorry_endpoint = tcp_ep_type();
1112 elem4.sorry_flag = false;
1113 elem4.qos_upstream = 65535ULL;
1114 elem4.qos_downstream = 32767ULL;
1115 for( size_t i = 0; i < 2; ++i ){
1116 l7vs::realserver_element rs_elem;
1117 rs_elem.tcp_endpoint = tcp_ep_type( boost::asio::ip::address::from_string( "192.168.10.10" ), (i+8080) );
1118 rs_elem.weight = 5+i;
1119 elem4.realserver_vector.push_back( rs_elem );
1122 boost::thread thread1( &vs_access::edit_realserver, &vst, elem4 );
1123 boost::thread thread2( &vs_access::rs_list_lock, &vst );
1128 BOOST_CHECK( vst.get_vs()->get_ref_count() == 1 );
1129 //ref_countが1のままだとedit_realserverができないのでunlockする
1130 vst.get_vs()->rs_list_unlock();
1131 BOOST_CHECK( vst.get_vs()->get_ref_count() == 0 );
1136 BOOST_CHECK( vst.get_vs()->get_rs_list().size() == 4 );
1138 // unit_test[32] edit_rsとrs_list_unlock
1139 std::cout << counter++ << std::endl;
1141 //あらかじめlockしておいてref_countを1にしておく
1142 vst.get_vs()->rs_list_lock();
1143 BOOST_CHECK( vst.get_vs()->get_ref_count() == 1 );
1145 boost::thread thread1( &vs_access::edit_realserver, &vst, elem2 );
1146 boost::thread thread2( &vs_access::rs_list_unlock, &vst );
1153 BOOST_CHECK( vst.get_vs()->get_rs_list().size() == 4 );
1154 BOOST_CHECK( vst.get_vs()->get_ref_count() == 0 );
1156 // unit_test[33] edit_rsとconnection_active
1157 std::cout << counter++ << std::endl;
1158 elem4.realserver_vector.clear();
1159 for( size_t i = 0; i < 2; ++i ){
1160 l7vs::realserver_element rs_elem;
1161 rs_elem.tcp_endpoint = tcp_ep_type( boost::asio::ip::address::from_string( "192.168.10.10" ), (i+8080) );
1162 rs_elem.weight = 100+i;
1163 elem4.realserver_vector.push_back( rs_elem );
1166 boost::thread thread1( &vs_access::edit_realserver, &vst, elem4 );
1167 boost::thread thread2( &vs_access::connection_active, &vst, elem2.realserver_vector[0].tcp_endpoint );
1176 BOOST_CHECK( vst.get_vs()->get_rs_list().size() == 4 );
1177 for( std::list<l7vs::realserver>::iterator itr = vst.get_vs()->get_rs_list().begin();
1178 itr != vst.get_vs()->get_rs_list().end(); ++itr ){
1179 if( itr->tcp_endpoint == elem2.realserver_vector[0].tcp_endpoint ){
1180 std::cout << "active_conn check" << std::endl;
1181 BOOST_CHECK( itr->get_active() == 1 );
1182 BOOST_CHECK( itr->get_inact() == 1 );
1186 // unit_test[34] edit_rsとconnection_inactive
1187 std::cout << counter++ << std::endl;
1189 boost::thread thread1( &vs_access::edit_realserver, &vst, elem4 );
1190 boost::thread thread2( &vs_access::connection_inactive, &vst, elem2.realserver_vector[0].tcp_endpoint );
1199 BOOST_CHECK( vst.get_vs()->get_rs_list().size() == 4 );
1200 for( std::list<l7vs::realserver>::iterator itr = vst.get_vs()->get_rs_list().begin();
1201 itr != vst.get_vs()->get_rs_list().end(); ++itr ){
1202 if( itr->tcp_endpoint == elem2.realserver_vector[0].tcp_endpoint ){
1203 std::cout << "inactive_conn check" << std::endl;
1204 BOOST_CHECK( itr->get_active() == 0 );
1205 BOOST_CHECK( itr->get_inact() == 2 );
1211 // unit_test[35] del_rsとrs_list_lock
1212 std::cout << counter++ << std::endl;
1214 boost::thread thread1( &vs_access::del_realserver, &vst, elem4 );
1215 boost::thread thread2( &vs_access::rs_list_lock, &vst );
1220 BOOST_CHECK( vst.get_vs()->get_ref_count() == 1 );
1221 //ref_countが1のままだとedit_realserverができないのでunlockする
1222 vst.get_vs()->rs_list_unlock();
1223 BOOST_CHECK( vst.get_vs()->get_ref_count() == 0 );
1228 BOOST_CHECK( vst.get_vs()->get_rs_list().size() == 2 );
1231 vst.get_vs()->add_realserver( elem4, vs_err );
1233 // unit_test[36] del_rsとrs_list_unlock
1234 std::cout << counter++ << std::endl;
1236 //あらかじめlockしておいてref_countを1にしておく
1237 vst.get_vs()->rs_list_lock();
1238 BOOST_CHECK( vst.get_vs()->get_ref_count() == 1 );
1240 boost::thread thread1( &vs_access::del_realserver, &vst, elem4 );
1241 boost::thread thread2( &vs_access::rs_list_unlock, &vst );
1248 BOOST_CHECK( vst.get_vs()->get_rs_list().size() == 2 );
1249 BOOST_CHECK( vst.get_vs()->get_ref_count() == 0 );
1252 vst.get_vs()->add_realserver( elem4, vs_err );
1254 //del_rsとconnection_active
1256 boost::thread thread1( &vs_access::del_realserver, &vst, elem4 );
1257 boost::thread thread2( &vs_access::connection_active, &vst, elem3.realserver_vector[0].tcp_endpoint );
1266 BOOST_CHECK( vst.get_vs()->get_rs_list().size() == 2 );
1267 for( std::list<l7vs::realserver>::iterator itr = vst.get_vs()->get_rs_list().begin();
1268 itr != vst.get_vs()->get_rs_list().end(); ++itr ){
1269 if( itr->tcp_endpoint == elem2.realserver_vector[0].tcp_endpoint ){
1270 std::cout << "active_conn check" << std::endl;
1271 BOOST_CHECK( itr->get_active() == 1 );
1272 BOOST_CHECK( itr->get_inact() == 0 );
1278 vst.get_vs()->add_realserver( elem4, vs_err );
1279 //del_rsとconnection_inactive
1281 boost::thread thread1( &vs_access::del_realserver, &vst, elem4 );
1282 boost::thread thread2( &vs_access::connection_inactive, &vst, elem3.realserver_vector[0].tcp_endpoint );
1291 BOOST_CHECK( vst.get_vs()->get_rs_list().size() == 2 );
1292 for( std::list<l7vs::realserver>::iterator itr = vst.get_vs()->get_rs_list().begin();
1293 itr != vst.get_vs()->get_rs_list().end(); ++itr ){
1294 if( itr->tcp_endpoint == elem2.realserver_vector[0].tcp_endpoint ){
1295 std::cout << "inactive_conn check" << std::endl;
1296 BOOST_CHECK( itr->get_active() == 0 );
1297 BOOST_CHECK( itr->get_inact() == 1 );
1303 //replicationエリアを開放する
1304 debugg_flug_struct::getInstance().destroy_rep_area();
1308 test_suite* init_unit_test_suite( int argc, char* argv[] ){
1310 // create unit test suite
1311 test_suite* ts = BOOST_TEST_SUITE( "virtualservice_base_test" );
1313 // add test case to test suite
1314 ts->add( BOOST_TEST_CASE( &virtualservice_tcp_test1 ) );
1315 ts->add( BOOST_TEST_CASE( &virtualservice_tcp_test2 ) );
1316 // ts->add( BOOST_TEST_CASE( &virtualservice_tcp_test3 ) );
1318 framework::master_test_suite().add( ts );