OSDN Git Service

vs_tcpメソッドテスト追加
authorokada <okada@1ed66053-1c2d-0410-8867-f7571e6e31d3>
Tue, 10 Feb 2009 12:29:09 +0000 (12:29 +0000)
committerokada <okada@1ed66053-1c2d-0410-8867-f7571e6e31d3>
Tue, 10 Feb 2009 12:29:09 +0000 (12:29 +0000)
git-svn-id: http://10.144.169.20/repos/um/branches/l7vsd-3.x-shamshel@6746 1ed66053-1c2d-0410-8867-f7571e6e31d3

12 files changed:
include/virtualservice.h
src/virtualservice.cpp
unit_tests/session_thread_control_test/stc_test.cpp
unit_tests/session_thread_control_test/stub.cpp
unit_tests/virtualservice_test/Makefile
unit_tests/virtualservice_test/protocol_module_test1.h
unit_tests/virtualservice_test/stub.cpp
unit_tests/virtualservice_test/stub.h
unit_tests/virtualservice_test/vs_base_test.cpp
unit_tests/virtualservice_test/vs_tcp.h
unit_tests/virtualservice_test/vs_tcp_test.cpp
unit_tests/virtualservice_test/vs_test.h

index 480fa95..da3fbaa 100644 (file)
@@ -63,16 +63,10 @@ public:
 
        typedef boost::shared_ptr<boost::mutex>                                 mutex_ptr;
 
-       const static int        SESSION_POOL_NUM_DEFAULT        = 256;          //! Default count for number of session-pool size
-       const static long       BPS_INTERVAL_DEFAULT            = 500;          //! bps calcurate interval(500ms)
-       const static long       REP_INTERVAL_DEFAULT            = 500;          //! replication-data create interval(500ms)
-       const static int        MAX_REPLICATION_DATA_NUM        = 64;           //! Maximum count value of replication data array
-       const static int        OPERATION_TIMEOUT                       = 1;            //! Operation timed out value
-       const static int        REFCOUNT_WAIT_INTERVAL          = 10000;        //! wait interval for rs_ref_count check
-protected:
        //!     @struct replication_header replication header structure
        struct  replication_header{
                unsigned int    data_num;
+               replication_header() : data_num( 0 ) {}
        };
        //!     @struct replication_data replication data structure
        struct  replication_data{
@@ -86,6 +80,14 @@ protected:
                unsigned long long      qos_down;
        };
 
+       const static int        SESSION_POOL_NUM_DEFAULT        = 256;          //! Default count for number of session-pool size
+       const static long       BPS_INTERVAL_DEFAULT            = 500;          //! bps calcurate interval(500ms)
+       const static long       REP_INTERVAL_DEFAULT            = 500;          //! replication-data create interval(500ms)
+       const static int        MAX_REPLICATION_DATA_NUM        = 64;           //! Maximum count value of replication data array
+       const static int        OPERATION_TIMEOUT                       = 1;            //! Operation timed out value
+       const static int        REFCOUNT_WAIT_INTERVAL          = 10000;        //! wait interval for rs_ref_count check
+protected:
+
        struct  parameter_data{
                int             session_pool_size;
                long    bps_interval;
@@ -98,6 +100,8 @@ protected:
        const   l7vsd&                          vsd;                    //! l7vsd reference
        const   replication&            rep;                    //! replication reference
 
+       Logger                                          log;
+
        boost::asio::io_service         dispatcher;             //! dispatcer service
        deadline_timer_ptr_type         calc_bps_timer; //! timer object
        deadline_timer_ptr_type         replication_timer;      //! timer object
@@ -138,13 +142,30 @@ protected:
        void                                            load_parameter();
 
        virtual void                            handle_replication_interrupt( const boost::system::error_code& ) = 0;
-       virtual bool                            read_replicationdata( replication_data& ) = 0;
+       virtual void                            read_replicationdata() = 0;
 
        void                                            handle_protomod_replication( const boost::system::error_code& );
        void                                            handle_schedmod_replication( const boost::system::error_code& );
 
        void                                            handle_throughput_update( const boost::system::error_code& );
 
+       std::list<realserver>::iterator
+                                                               rs_list_begin(){
+               return rs_list.begin();
+       }
+       std::list<realserver>::iterator
+                                                               rs_list_end(){
+               return rs_list.end();
+       }
+       std::list<realserver>::iterator
+                                                               rs_list_next( std::list<realserver>::iterator in_itr ){
+               return ++in_itr;
+       }
+       void*                                           replication_pay_memory( const std::string& inid, unsigned int* outsize ){
+               l7vs::replication&      tmp_rep = const_cast<l7vs::replication&>( rep );
+               return tmp_rep.pay_memory( inid, *outsize );
+       }
+
 public:
        virtualservice_base(    const l7vsd&,
                                                        const replication&,
@@ -210,9 +231,10 @@ protected:
 
        session_map_type                        pool_sessions;
        session_map_type                        active_sessions;
+       boost::mutex                            sessions_mutex;
 
        void                                            handle_replication_interrupt( const boost::system::error_code& );
-       bool                                            read_replicationdata( replication_data& );
+       void                                            read_replicationdata();
 
        void                                            handle_accept(  const session_thread_control_ptr,
                                                                                                const boost::system::error_code& );
@@ -253,7 +275,7 @@ protected:
                                                                session;
 
        void                                            handle_replication_interrupt( const boost::system::error_code& );
-       bool                                            read_replicationdata( virtualservice_base::replication_data& );
+       void                                            read_replicationdata();
 
 public:
        virtualservice_udp(             const l7vsd&,
index bb8dc86..2a758bb 100644 (file)
@@ -9,9 +9,11 @@
 //     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt
 //
 
+#include <new>
 #include <vector>
 #include <sstream>
 #include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/bind.hpp>
 
 #include "virtualservice.h"
 #include "logger_enum.h"
@@ -411,6 +413,12 @@ l7vs::virtualservice_tcp::~virtualservice_tcp(){
        stop();
 }
 
+/*!
+ * replication interrupt event
+ *
+ * @param   err
+ * @return  void
+ */
 void   l7vs::virtualservice_tcp::handle_replication_interrupt( const boost::system::error_code& in ){
        bool    newdata = true;
        l7vs::replication&      replication = const_cast<l7vs::replication&>( rep );
@@ -425,7 +433,7 @@ void        l7vs::virtualservice_tcp::handle_replication_interrupt( const boost::system
        //get replication area
        unsigned int    rep_size = 0;
        replication_header*     rep_header_ptr = reinterpret_cast<replication_header*>( replication.pay_memory( REP_AREA_NAME, rep_size) );
-       if( 0 == rep_size ){
+       if( (rep_header_ptr == NULL) || (0 == rep_size) ){
                l7vs::Logger::putLogError( l7vs::LOG_CAT_L7VSD_VIRTUALSERVICE, 0, REP_BLOCK_SIZE_ERR_MSG, __FILE__, __LINE__ );
                return;
        }
@@ -442,6 +450,9 @@ void        l7vs::virtualservice_tcp::handle_replication_interrupt( const boost::system
 
        //read header value and set loop count
        unsigned int loop_cnt = rep_header_ptr->data_num;
+       //if data_num over MAX_REPLICATION_DATA_NUM, data_num = 0
+       if( static_cast<unsigned int>(MAX_REPLICATION_DATA_NUM) < loop_cnt )
+               loop_cnt = 0;
 
        //set start pointer(pointer of replication_data)
        replication_data*       rep_data_ptr = reinterpret_cast<replication_data*>( ++rep_header_ptr );
@@ -467,7 +478,7 @@ void        l7vs::virtualservice_tcp::handle_replication_interrupt( const boost::system
        rep_data_ptr->udpmode           = element.udpmode;
        memset( rep_data_ptr->tcp_endpoint, 0, 48 );
        memcpy( rep_data_ptr->tcp_endpoint, tmp_tcp_ep.str().c_str(), 47 );
-       memset( rep_data_ptr->tcp_endpoint, 0, 48 );
+       memset( rep_data_ptr->udp_endpoint, 0, 48 );
        memcpy( rep_data_ptr->udp_endpoint, tmp_udp_ep.str().c_str(), 47 );
        rep_data_ptr->sorry_maxconnection       = element.sorry_maxconnection;
        memset( rep_data_ptr->sorry_endpoint, 0, 48 );
@@ -484,10 +495,87 @@ void      l7vs::virtualservice_tcp::handle_replication_interrupt( const boost::system
        replication_timer->async_wait( boost::bind( &l7vs::virtualservice_tcp::handle_replication_interrupt, 
                                                                                         this, boost::asio::placeholders::error ) );
 }
-bool   l7vs::virtualservice_tcp::read_replicationdata( l7vs::virtualservice_base::replication_data& out ){
-       return true;
+
+/*!
+ * read replication data
+ *
+ * @param   session_thread_control
+ * @param      error_code
+ * @return  void
+ */
+void   l7vs::virtualservice_tcp::read_replicationdata(){
+       l7vs::replication&      replication = const_cast<l7vs::replication&>( rep );
+
+       unsigned int    rep_size = 0;
+       replication_header*     rep_header_ptr = reinterpret_cast<replication_header*>( replication.pay_memory( REP_AREA_NAME, rep_size) );
+       if( (rep_header_ptr == NULL) || (0 == rep_size) ){
+               l7vs::Logger::putLogError( l7vs::LOG_CAT_L7VSD_VIRTUALSERVICE, 0, REP_BLOCK_SIZE_ERR_MSG, __FILE__, __LINE__ );
+               return;
+       }
+
+       //check maxdatasize
+       if( ( rep_size * DATA_SIZE ) <
+               ((sizeof(replication_data) * MAX_REPLICATION_DATA_NUM) + sizeof(replication_header)) ){
+               l7vs::Logger::putLogError( l7vs::LOG_CAT_L7VSD_VIRTUALSERVICE, 0, REP_AREA_SIZE_ERR_MSG, __FILE__, __LINE__ );
+               return;
+       }
+       //lock replication area
+       replication.lock( REP_AREA_NAME );
+
+       //read header value and set loop count
+       unsigned int loop_cnt = rep_header_ptr->data_num;
+       //if data_num over MAX_REPLICATION_DATA_NUM, data_num = 0
+       if( static_cast<unsigned int>(MAX_REPLICATION_DATA_NUM) < loop_cnt ){
+               l7vs::Logger::putLogError( l7vs::LOG_CAT_L7VSD_VIRTUALSERVICE, 0, REP_BLOCK_SIZE_ERR_MSG, __FILE__, __LINE__ );
+               return;
+       }
+
+       //set start pointer(pointer of replication_data)
+       replication_data*       rep_data_ptr = reinterpret_cast<replication_data*>( ++rep_header_ptr );
+
+       //find vs(loop)
+       for( unsigned int i = 0; i < loop_cnt; ++i ){
+               //get tcp endpointdata
+               std::string     tmpstr = rep_data_ptr->tcp_endpoint;
+               std::string     ipaddr;
+               if( tmpstr[0] == '[' ){
+                       //IPv6 endpoint
+               }else{
+                       //IPv4 endpoint
+//                     ipaddr  = tmpstr.substr();
+               }
+//             //check equal udpmode and tcp_accept_endpoint
+//             if( (rep_data_ptr->udpmode == element.udpmode )&&
+//                     ( 0 == strncmp( rep_data_ptr->tcp_endpoint, tmp_tcp_ep.str().c_str(), 47 ) ) ){
+//                     
+//                     if(){
+//                             element.sorry_maxconnection     = rep_data_ptr->sorry_maxconnection;
+//                             
+//                             element.sorry_endpoint          = 
+//                                             tcp_endpoint_type( boost::asio::ip::address::from_string(  ), ());
+//                             memset( rep_data_ptr->sorry_endpoint, 0, 48 );
+//                             memcpy( rep_data_ptr->sorry_endpoint, tmp_sorry_ep.str().c_str(), 47 );
+//                     }
+//                     rep_data_ptr->sorry_flag        = element.sorry_flag;
+//                     element.qos_upstream            = rep_data_ptr->qos_up;
+//                     element.qos_downstream          = rep_data_ptr->qos_down;
+//                     break;
+//             }
+//             //increment data pointer
+//             ++rep_data_ptr;
+       }
+
+       //unlock replication area
+       replication.unlock( REP_AREA_NAME );
 }
 
+/*!
+ * accept event
+ *
+ * @param   session_thread_control
+ * @param      error_code
+ * @return  void
+ */
 void   l7vs::virtualservice_tcp::handle_accept(        const l7vs::virtualservice_tcp::session_thread_control_ptr in_session,
                                                                                                        const boost::system::error_code& in_error ){
 
@@ -498,11 +586,14 @@ void      l7vs::virtualservice_tcp::handle_accept(        const l7vs::virtualservice_tcp::se
        //switch active a session
        boost::thread::id                       t_id;
        session_thread_control_ptr      stc_ptr;
-       t_id    = pool_sessions.begin()->first;
-       stc_ptr = pool_sessions.begin()->second;
-
-       pool_sessions.erase( t_id );
-       active_sessions.insert( session_map_pair_type( stc_ptr->get_upthread_id(), stc_ptr ) );
+       {
+               boost::mutex::scoped_lock lk( sessions_mutex );
+               t_id    = pool_sessions.begin()->first;
+               stc_ptr = pool_sessions.begin()->second;
+       
+               pool_sessions.erase( t_id );
+               active_sessions.insert( session_map_pair_type( stc_ptr->get_upthread_id(), stc_ptr ) );
+       }
 
        //regist accept event handler
        acceptor_.async_accept( stc_ptr->get_session()->get_client_socket(),
@@ -516,9 +607,13 @@ void       l7vs::virtualservice_tcp::handle_accept(        const l7vs::virtualservice_tcp::se
  * @return  void
  */
 void   l7vs::virtualservice_tcp::initialize( l7vs::error_code& err ){
+//     l7vs::replication&      tmp_rep = const_cast<l7vs::replication&>( rep );
        //load parameter value
        load_parameter();
 
+       //read replication data
+       
+
        //load protocol module
        protomod = l7vs::protocol_module_control::getInstance().load_module( element.protocol_module_name );
        if( NULL == protomod ){
@@ -526,6 +621,37 @@ void       l7vs::virtualservice_tcp::initialize( l7vs::error_code& err ){
                return;
        }
        //Protocol Module Initialize
+       protomod->init_logger_functions(
+                                       boost::bind( &l7vs::Logger::getLogLevel, l7vs::LOG_CAT_PROTOCOL ),
+                                       boost::bind( &l7vs::Logger::putLogFatal, l7vs::LOG_CAT_PROTOCOL, _1, _2, _3, _4 ),
+                                       boost::bind( &l7vs::Logger::putLogError, l7vs::LOG_CAT_PROTOCOL, _1, _2, _3, _4 ),
+                                       boost::bind( &l7vs::Logger::putLogWarn, l7vs::LOG_CAT_PROTOCOL, _1, _2, _3, _4 ),
+                                       boost::bind( &l7vs::Logger::putLogInfo, l7vs::LOG_CAT_PROTOCOL, _1, _2, _3, _4 ),
+                                       boost::bind( &l7vs::Logger::putLogDebug, l7vs::LOG_CAT_PROTOCOL, _1, _2, _3, _4 ) );
+       protomod->initialize(
+                                       boost::bind( &l7vs::virtualservice_tcp::rs_list_begin, this ),
+                                       boost::bind( &l7vs::virtualservice_tcp::rs_list_end, this ),
+                                       boost::bind( &l7vs::virtualservice_tcp::rs_list_next, this, _1 ),
+                                       boost::bind( &l7vs::virtualservice_tcp::rs_list_lock, this ),
+                                       boost::bind( &l7vs::virtualservice_tcp::rs_list_unlock, this ) );
+       protomod->init_replication_functions(
+                                       boost::bind( &l7vs::virtualservice_tcp::replication_pay_memory, this, _1, _2 ),
+                                       boost::bind( &l7vs::virtualservice_tcp::rs_list_lock, this ),
+                                       boost::bind( &l7vs::virtualservice_tcp::rs_list_unlock, this ),
+                                       element.tcp_accept_endpoint,
+                                       element.udp_recv_endpoint );
+
+       l7vs::protocol_module_base::check_message_result pm_result;
+       pm_result       =       protomod->check_parameter( element.protocol_args );
+       if( !pm_result.flag ){
+               err.setter( true, "Protocol Module argument error." );
+               return;
+       }
+       pm_result       =       protomod->set_parameter( element.protocol_args );
+       if( !pm_result.flag ){
+               err.setter( true, "Protocol Module argument error." );
+               return;
+       }
 
        //load schedule module  
        schedmod = l7vs::schedule_module_control::getInstance().load_module( element.schedule_module_name );
@@ -533,25 +659,42 @@ void      l7vs::virtualservice_tcp::initialize( l7vs::error_code& err ){
                err.setter( true, SCHEDMOD_LOAD_ERROR_MSG );
                return;
        }
-
        //Schedule Module Initialize
+       schedmod->init_logger_functions(
+                                       boost::bind( &l7vs::Logger::getLogLevel, l7vs::LOG_CAT_SCHEDULE ),
+                                       boost::bind( &l7vs::Logger::putLogFatal, l7vs::LOG_CAT_SCHEDULE, _1, _2, _3, _4 ),
+                                       boost::bind( &l7vs::Logger::putLogError, l7vs::LOG_CAT_SCHEDULE, _1, _2, _3, _4 ),
+                                       boost::bind( &l7vs::Logger::putLogWarn, l7vs::LOG_CAT_SCHEDULE, _1, _2, _3, _4 ),
+                                       boost::bind( &l7vs::Logger::putLogInfo, l7vs::LOG_CAT_SCHEDULE, _1, _2, _3, _4 ),
+                                       boost::bind( &l7vs::Logger::putLogDebug, l7vs::LOG_CAT_SCHEDULE, _1, _2, _3, _4 ) );
+       schedmod->initialize();
+       schedmod->init_replication_functions(
+                                       boost::bind( &l7vs::virtualservice_tcp::replication_pay_memory, this, _1, _2 ),
+                                       boost::bind( &l7vs::virtualservice_tcp::rs_list_lock, this ),
+                                       boost::bind( &l7vs::virtualservice_tcp::rs_list_unlock, this ),
+                                       element.tcp_accept_endpoint,
+                                       element.udp_recv_endpoint );
+
 
        //create session pool
-       for( int i = 0; i < param_data.session_pool_size; ++i ){
-               l7vs::tcp_session*      sess;
-               try{
-                       sess    = new l7vs::tcp_session( *this, dispatcher );
-               }
-               catch( ... ){ //bad alloc exception catch
-                       err.setter( true, "error, create session pool." );
-                       return;
-               }
-               boost::shared_ptr<session_thread_control>       stc( new l7vs::session_thread_control( sess ) );
-               std::pair<session_map_type::iterator,bool> retval;
-               retval  = pool_sessions.insert( session_map_pair_type(stc->get_upthread_id(), stc) );
-               if( !retval.second ){
-                       err.setter( true, "error, create session pool." );
-                       return;
+       {
+               boost::mutex::scoped_lock lk( sessions_mutex );
+               for( int i = 0; i < param_data.session_pool_size; ++i ){
+                       l7vs::tcp_session*      sess;
+                       try{
+                               sess    = new l7vs::tcp_session( *this, dispatcher );
+                       }
+                       catch( std::bad_alloc ){ //bad alloc exception catch
+                               err.setter( true, "error, create session pool." );
+                               return;
+                       }
+                       boost::shared_ptr<session_thread_control>       stc( new l7vs::session_thread_control( sess ) );
+                       std::pair<session_map_type::iterator,bool> retval;
+                       retval  = pool_sessions.insert( session_map_pair_type(stc->get_upthread_id(), stc) );
+                       if( !retval.second ){
+                               err.setter( true, "error, create session pool." );
+                               return;
+                       }
                }
        }
 
@@ -559,6 +702,36 @@ void       l7vs::virtualservice_tcp::initialize( l7vs::error_code& err ){
 }
 
 void           l7vs::virtualservice_tcp::finalize( l7vs::error_code& err ){
+
+       //stop main loop
+       stop();
+
+       if( protomod ){
+               //finalize ProtocolModule
+               protomod->finalize();
+               //unload ProtocolModule
+               l7vs::protocol_module_control::getInstance().unload_module( protomod );
+       }
+       //unload ScheduleModule
+       if( protomod )
+               l7vs::schedule_module_control::getInstance().unload_module( schedmod );
+
+       //セッションプール開放
+       boost::mutex::scoped_lock lk( sessions_mutex );
+
+       for( session_map_type::iterator itr = pool_sessions.begin();
+                itr != pool_sessions.end();
+                ++itr ){
+               itr->second->join();
+       }
+       for( session_map_type::iterator itr = active_sessions.begin();
+                itr != active_sessions.end();
+                ++itr ){
+               itr->second->join();
+       }
+       active_sessions.clear();
+       pool_sessions.clear();
+
        err.setter( false, "" );
 }
 
@@ -614,7 +787,7 @@ void        l7vs::virtualservice_tcp::edit_virtualservice( const l7vs::virtualservice_e
                err.setter( true, "Virtual Service does not exist." );
                return;
        }
-       //scuedule_moduleが変更されていたらロードしなおす
+       //if change ScueduleModule Name, unload old ScheduleModule and load new ScheduleModule
        if( element.schedule_module_name != elem.schedule_module_name ){
                schedule_module_control::getInstance().unload_module( schedmod );
                schedmod = schedule_module_control::getInstance().load_module( elem.schedule_module_name );
@@ -637,12 +810,23 @@ void      l7vs::virtualservice_tcp::edit_virtualservice( const l7vs::virtualservice_e
                        }
                }
        }
-       //変更可能な値を上書きする
-       element.sorry_maxconnection     = elem.sorry_maxconnection;
-       element.sorry_endpoint          = elem.sorry_endpoint;
-       element.sorry_flag                      = elem.sorry_flag;
-       element.qos_upstream            = elem.qos_upstream;
-       element.qos_downstream          = elem.qos_downstream;
+
+       //update values
+       element.qos_upstream    = elem.qos_upstream;
+       element.qos_downstream  = elem.qos_downstream;
+       //if endpoint of SorryServer equal 255.255.255.255:0,not update
+       if( elem.sorry_endpoint !=
+                       boost::asio::ip::tcp::endpoint( boost::asio::ip::address::from_string( "255.255.255.255" ), (0)) ){
+               element.sorry_endpoint          = elem.sorry_endpoint;
+               //if equal endpoint 255.255.255.255:0, clear sorry parameters
+               if( elem.sorry_endpoint == boost::asio::ip::tcp::endpoint() ){
+                       element.sorry_maxconnection     = 0LL;
+                       element.sorry_flag                      = false;
+               }else{
+                       element.sorry_maxconnection     = elem.sorry_maxconnection;
+                       element.sorry_flag                      = elem.sorry_flag;
+               }
+       }
 
        err.setter( false, "" );
 }
@@ -655,12 +839,18 @@ void      l7vs::virtualservice_tcp::edit_virtualservice( const l7vs::virtualservice_e
  * @return  void
  */
 void   l7vs::virtualservice_tcp::add_realserver( const l7vs::virtualservice_element& in, l7vs::error_code& err ){
+       l7vs::virtualservice_element&   in_element = const_cast<l7vs::virtualservice_element&>( in );
+
        //check equal virtualservice
        if( (element.udpmode != in.udpmode) || (element.tcp_accept_endpoint != in.tcp_accept_endpoint) ){
                err.setter( true, "Virtual Service does not exist." );
                return;
        }       
-
+       //check rs num
+       if( in.realserver_vector.size() == 0U ){
+               err.setter( true, "." );
+               return;
+       }
        //lock rs_list_ref_count_inc_mutex
        boost::mutex::scoped_lock inc_lock( rs_list_ref_count_inc_mutex );
 
@@ -675,8 +865,6 @@ void        l7vs::virtualservice_tcp::add_realserver( const l7vs::virtualservice_elemen
                cond.timed_wait( lk, interval );
        }
 
-       l7vs::virtualservice_element&   in_element = const_cast<l7vs::virtualservice_element&>( in );
-
        //check duplication realserver
        for( std::vector<realserver_element>::iterator itr = in_element.realserver_vector.begin();
                 itr != in_element.realserver_vector.end();
@@ -717,17 +905,56 @@ void      l7vs::virtualservice_tcp::add_realserver( const l7vs::virtualservice_elemen
  * @return  void
  */
 void   l7vs::virtualservice_tcp::edit_realserver( const l7vs::virtualservice_element& in, l7vs::error_code& err ){
+       //check equal virtualservice
+       if( (element.udpmode != in.udpmode) || (element.tcp_accept_endpoint != in.tcp_accept_endpoint) ){
+               err.setter( true, "Virtual Service does not exist." );
+               return;
+       }       
+
        //lock rs_list_ref_count_inc_mutex
        boost::mutex::scoped_lock inc_lock( rs_list_ref_count_inc_mutex );
 
        //waiting, rs_list_ref_count become 0
+       boost::xtime            interval;
+       boost::mutex            mtx;
+       boost::condition        cond;
+
+       interval.nsec = virtualservice_base::REFCOUNT_WAIT_INTERVAL;
+       boost::mutex::scoped_lock lk( mtx );
+       while( 0ULL != rs_list_ref_count ){
+               cond.timed_wait( lk, interval );
+       }
 
        l7vs::virtualservice_element&   in_element = const_cast<l7vs::virtualservice_element&>( in );
 
+       //check is exist realserver
+       for( std::vector<realserver_element>::iterator itr = in_element.realserver_vector.begin();
+                itr != in_element.realserver_vector.end();
+                ++itr ){
+               bool    exist_flag = false;
+               for( std::list<realserver>::iterator rs_itr = rs_list.begin();
+                        rs_itr != rs_list.end(); ++rs_itr ){
+                       if( itr->tcp_endpoint == rs_itr->tcp_endpoint ){
+                               exist_flag = true;
+                       }
+               }
+               if( !exist_flag ){
+                       err.setter( true, "Real Server does not exist." );
+                       return;
+               }
+       }
        //edit realserver
        for( std::vector<realserver_element>::iterator itr = in_element.realserver_vector.begin();
                 itr != in_element.realserver_vector.end();
                 ++itr ){
+               for( std::list<realserver>::iterator rs_itr = rs_list.begin();
+                        rs_itr != rs_list.end(); ++rs_itr ){
+                       if( itr->tcp_endpoint == rs_itr->tcp_endpoint ){
+                               rs_itr->tcp_endpoint    = itr->tcp_endpoint;
+                               rs_itr->udp_endpoint    = itr->udp_endpoint;
+                               rs_itr->weight                  = itr->weight;
+                       }
+               }
        }
        err.setter( false, "" );
 }
@@ -816,11 +1043,14 @@ void     l7vs::virtualservice_tcp::run(){
        //switch active a session
        boost::thread::id                       t_id;
        session_thread_control_ptr      stc_ptr;
-       t_id    = pool_sessions.begin()->first;
-       stc_ptr = pool_sessions.begin()->second;
-
-       pool_sessions.erase( t_id );
-       active_sessions.insert( session_map_pair_type( stc_ptr->get_upthread_id(), stc_ptr ) );
+       {
+               boost::mutex::scoped_lock       lk( sessions_mutex );
+               t_id    = pool_sessions.begin()->first;
+               stc_ptr = pool_sessions.begin()->second;
+       
+               pool_sessions.erase( t_id );
+               active_sessions.insert( session_map_pair_type( stc_ptr->get_upthread_id(), stc_ptr ) );
+       }
 
        //regist accept event handler
        acceptor_.async_accept( stc_ptr->get_session()->get_client_socket(),
@@ -913,7 +1143,23 @@ void      l7vs::virtualservice_tcp::connection_inactive( const boost::asio::ip::tcp::
        rs_list_unlock();
 }
 
-void   l7vs::virtualservice_tcp::release_session( const boost::thread::id thread_id ){}
+/*!
+ * increment in-active-connection (and decrement active-connection count)
+ *
+ * @param   endpoint
+ * @return  void
+ */
+void   l7vs::virtualservice_tcp::release_session( const boost::thread::id thread_id ){
+       boost::mutex::scoped_lock lk( sessions_mutex );
+       session_map_type::iterator      itr = active_sessions.find( thread_id );
+       if( itr != active_sessions.end() ){
+               session_thread_control_ptr      stc_ptr;
+               stc_ptr = itr->second;
+       
+               active_sessions.erase( thread_id );
+               pool_sessions.insert( session_map_pair_type( stc_ptr->get_upthread_id(), stc_ptr ) );
+       }
+}
 
 
 
@@ -929,8 +1175,7 @@ l7vs::virtualservice_udp::~virtualservice_udp(){}
 
 void   l7vs::virtualservice_udp::handle_replication_interrupt( const boost::system::error_code& in ){
 }
-bool   l7vs::virtualservice_udp::read_replicationdata( l7vs::virtualservice_base::replication_data& out ){
-       return true;
+void   l7vs::virtualservice_udp::read_replicationdata(){
 }
 
 void   l7vs::virtualservice_udp::initialize( l7vs::error_code& err ){
index b8293c7..549ef0d 100644 (file)
@@ -3,7 +3,9 @@
 #include <boost/test/included/unit_test.hpp>
 #include <boost/shared_ptr.hpp>
 #include <boost/thread.hpp>
+
 #include "session_thread_control.h"
+#include "l7vsd.h"
 
 using namespace boost::unit_test;
 
index 134c63e..38b97e2 100644 (file)
@@ -1,5 +1,6 @@
 #include <boost/asio.hpp>
 
+#include "l7vsd.h"
 #include "data_buff_base.h"
 #include "tcp_thread_message.h"
 #include "tcp_thread_message_que.h"
@@ -8,6 +9,9 @@
 #include "tcp_session.h"
 #include "udp_session.h"
 #include "parameter.h"
+#include "replication.h"
+#include "protocol_module_control.h"
+#include "schedule_module_control.h"
 #include "stub.h"
 
 // protocol_module_control STUB code
@@ -326,6 +330,50 @@ void       l7vs::tcp_session::down_thread_run(void){
        std::cout << "DOWN:STOP(" << i << ")" << std::endl;
 }
 
+void   l7vs::tcp_session::thread_state_update(const std::bitset<TCP_SESSION_THREAD_STATE_BIT> thread_flag,const bool regist){}
+void   l7vs::tcp_session::up_thread_client_accept_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_client_receive(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_client_respond(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_client_respond_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_client_disconnect(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_client_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_realserver_send(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_realserver_get_destination_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_realserver_connect(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_realserver_connect_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_realserver_connection_fail_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_realserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_realserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_all_realserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_sorryserver_send(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_sorryserver_get_destination_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_sorryserver_connect(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_sorryserver_connect_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_sorryserver_connection_fail_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_sorryserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_sorryserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_sorry_enable_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_sorry_disable_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_all_socket_close(void){}
+
+void   l7vs::tcp_session::down_thread_realserver_receive(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_realserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_realserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_all_realserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_client_connection_chk_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_client_respond_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_client_send(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_client_disconnect(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_client_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_sorryserver_receive(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_sorryserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_sorryserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_sorry_enable_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_sorry_disable_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_all_socket_close(){}
+
 
 l7vs::udp_session::udp_session(virtualservice_udp& vs, boost::asio::io_service& session_io) :  io( session_io ),
                                                                                                                                                                                                parent_service( vs ),
index af16ba7..822b8ea 100644 (file)
@@ -3,7 +3,7 @@
 #      Makefile for module_control unit test frameworks.
 #
 #
-TARGET         = vs_base_ut vs_tcp_ut
+TARGET         = vs_base_ut vs_tcp_ut vs_tcp_thread_ut
 CPP                    = g++
 CPPFLAGS       = -O0 -g -Wall -Werror -pthread -DMAX_BUFFER_SIZE=65535 -DDEBUG
 INCLUDES       =       -I../../logger \
@@ -29,6 +29,11 @@ TCPSRCS              =       \
                                ../../src/virtualservice.cpp \
                                vs_tcp_test.cpp
 
+TCPTSRCS               =       \
+                               stub.cpp \
+                               ../../src/virtualservice.cpp \
+                               vs_tcp_thread_test.cpp
+
 # UDPSRCS              =       \
 #                              stub.cpp \
 #                              ../../src/virtualservice.cpp \
@@ -42,6 +47,8 @@ BASEOBJS      = $(BASESRCS:.cpp=.o)
 
 TCPOBJS                = $(TCPSRCS:.cpp=.o)
 
+TPCTOBJS       = $(TCPTSRCS:.cpp=.o)
+
 # UDPOBJS              = $(UDPSRCS:.cpp=.o)
 
 all:   $(TARGET)
@@ -52,6 +59,10 @@ vs_base_ut:  $(BASEOBJS)
 vs_tcp_ut:     $(TCPOBJS)
        $(CPP) $(INCLUDES) -o vs_tcp_ut $(TCPOBJS) $(LDFLAGS) $(LIBS)
 
+vs_tcp_thread_ut: $(TPCTOBJS)
+       $(CPP) $(INCLUDES) -o vs_tcp_thread_ut $(TPCTOBJS) $(LDFLAGS) $(LIBS)
+
+
 # $(TARGET):   $(OBJS)
 #      $(CPP) $(INCLUDES) -o $@ $(OBJS) $(LIBS)
 
index 1ec8bac..8c3fa78 100644 (file)
@@ -31,6 +31,7 @@ public:
        check_message_result    check_parameter( const std::vector<std::string>& args ){
                protocol_module_base::check_message_result      result;
                result.flag = true;
+               std::cout << "ProtocolModule check parameter called." << std::endl;
                return result;
        }
 
@@ -39,11 +40,13 @@ public:
        check_message_result    set_parameter( const std::vector<std::string>& args ){
                protocol_module_base::check_message_result      result;
                result.flag = true;
+               std::cout << "ProtocolModule set parameter called." << std::endl;
                return result;
        }
        check_message_result    add_parameter( const std::vector<std::string>& args ){
                protocol_module_base::check_message_result      result;
                result.flag = false;
+               std::cout << "ProtocolModule add parameter called." << std::endl;
                return result;
        }
 
index 3924ad0..da0dea3 100644 (file)
@@ -1,4 +1,5 @@
 #include <boost/asio.hpp>
+#include <boost/thread.hpp>
 
 #include "data_buff_base.h"
 #include "tcp_thread_message.h"
@@ -61,7 +62,9 @@ void  l7vs::replication::finalize(){}
 void   l7vs::replication::switch_to_master(){}
 void   l7vs::replication::switch_to_slave(){}
 void*  l7vs::replication::pay_memory( const std::string& inid, unsigned int& outsize ){
-       return NULL;
+       void* retval = debugg_flug_struct::getInstance().get_rep_area();
+       outsize = l7vs::virtualservice_base::MAX_REPLICATION_DATA_NUM;
+       return retval;
 }
 void   l7vs::replication::dump_memory(){}
 void   l7vs::replication::start(){}
@@ -342,56 +345,65 @@ bool      l7vs::tcp_session::is_thread_wait(void){
        return true;
 }
 
-void   l7vs::tcp_session::set_virtual_service_message(const TCP_VIRTUAL_SERVICE_MESSAGE_TAG  message){}
+void   l7vs::tcp_session::set_virtual_service_message(const TCP_VIRTUAL_SERVICE_MESSAGE_TAG  message){
+       if( message == SESSION_END ){
+               exit_flag = true;
+       }
+}
 
-void   l7vs::tcp_session::up_thread_run(void){}
+void   l7vs::tcp_session::up_thread_run(void){
+       exit_flag = false;
+       while(!exit_flag){
+               
+       }
+       parent_service.release_session( boost::this_thread::get_id() );
+}
 
 void   l7vs::tcp_session::down_thread_run(void){}
 
-// void        thread_state_update(const std::bitset<TCP_SESSION_THREAD_STATE_BIT> thread_flag,const bool regist);
-// 
-// void        up_thread_client_accept_event(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_client_receive(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_client_respond(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_client_respond_event(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_client_disconnect(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_client_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_realserver_send(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_realserver_get_distination_event(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_realserver_connect(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_realserver_connect_event(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_realserver_connection_fail_event(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_realserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_realserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_all_realserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_sorryserver_send(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_sorryserver_get_destination_event(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_sorryserver_connect(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_sorryserver_connect_event(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_sorryserver_connection_fail_event(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_sorryserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_sorryserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_sorry_enable_event(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_sorry_disable_event(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_exit(const TCP_PROCESS_TYPE_TAG process_type);
-// void        up_thread_all_socket_close(void);
-// 
-// void        down_thread_realserver_receive(const TCP_PROCESS_TYPE_TAG process_type);
-// void        down_thread_realserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type);
-// void        down_thread_realserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type);
-// void        down_thread_all_realserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type);
-// void        down_thread_client_connection_chk_event(const TCP_PROCESS_TYPE_TAG process_type);
-// void        down_thread_client_respond_event(const TCP_PROCESS_TYPE_TAG process_type);
-// void        down_thread_client_send(const TCP_PROCESS_TYPE_TAG process_type);
-// void        down_thread_client_disconnect(const TCP_PROCESS_TYPE_TAG process_type);
-// void        down_thread_client_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type);
-// void        down_thread_sorryserver_receive(const TCP_PROCESS_TYPE_TAG process_type);
-// void        down_thread_sorryserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type);
-// void        down_thread_sorryserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type);
-// void        down_thread_sorry_enable_event(const TCP_PROCESS_TYPE_TAG process_type);
-// void        down_thread_sorry_disable_event(const TCP_PROCESS_TYPE_TAG process_type);
-// void        down_thread_exit(const TCP_PROCESS_TYPE_TAG process_type);
-// void        down_thread_all_socket_close(void);
+void   l7vs::tcp_session::thread_state_update(const std::bitset<TCP_SESSION_THREAD_STATE_BIT> thread_flag,const bool regist){}
+void   l7vs::tcp_session::up_thread_client_accept_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_client_receive(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_client_respond(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_client_respond_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_client_disconnect(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_client_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_realserver_send(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_realserver_get_destination_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_realserver_connect(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_realserver_connect_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_realserver_connection_fail_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_realserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_realserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_all_realserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_sorryserver_send(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_sorryserver_get_destination_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_sorryserver_connect(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_sorryserver_connect_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_sorryserver_connection_fail_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_sorryserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_sorryserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_sorry_enable_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_sorry_disable_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::up_thread_all_socket_close(void){}
+
+void   l7vs::tcp_session::down_thread_realserver_receive(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_realserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_realserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_all_realserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_client_connection_chk_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_client_respond_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_client_send(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_client_disconnect(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_client_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_sorryserver_receive(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_sorryserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_sorryserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_sorry_enable_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_sorry_disable_event(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){}
+void   l7vs::tcp_session::down_thread_all_socket_close(){}
 
 
 l7vs::udp_session::udp_session(virtualservice_udp& vs, boost::asio::io_service& session_io) :  io( session_io ),
index 21f9d38..4ce6713 100644 (file)
@@ -21,7 +21,7 @@ protected:
                                                                pm_rep_count( 0 ),
                                                                sm_rep_count( 0 ) {
        }
-       debugg_flug_struct( const debugg_flug_struct & in ){}
+       debugg_flug_struct( const debugg_flug_struct & in ){ rep_area = NULL; }
        debugg_flug_struct& operator=( const debugg_flug_struct & in ){ return *this; }
 public:
        static debugg_flug_struct&      getInstance(){
@@ -53,13 +53,16 @@ public:
                return sm_rep_count;
        }
        void    create_rep_area(){
-               rep_area = new char[(l7vs::virtualservice_base::MAX_REPLICATION_DATA_NUM)*480];
+               if( NULL == rep_area )
+                       rep_area = new char[(l7vs::virtualservice_base::MAX_REPLICATION_DATA_NUM)*480];
+                       memset( rep_area, 0, (sizeof(char)*480*l7vs::virtualservice_base::MAX_REPLICATION_DATA_NUM) );
        }
        void*   get_rep_area(){
                return reinterpret_cast<void*>( rep_area );
        }
        void    destroy_rep_area(){
-               delete [] rep_area;
+               if( NULL != rep_area )
+                       delete [] rep_area;
        }
 };
 
index 473c611..84669c3 100644 (file)
@@ -116,6 +116,7 @@ void        virtualservice_base_test2(){
        BOOST_MESSAGE( "-------17" );
        vs->update_up_recv_size( 12ULL );
        // unit_test[18]  get_up_recv_sizeメソッドで上り総受信サイズを取得
+       BOOST_MESSAGE( "-------18" );
        BOOST_CHECK( 12ULL == vs->get_up_recv_size() );
        BOOST_MESSAGE( "up recv size : " << vs->get_up_recv_size() );
        // unit_test[19]  update_up_recv_sizeメソッド(以前の値に加算されることを確認)
@@ -124,64 +125,67 @@ void      virtualservice_base_test2(){
        BOOST_CHECK( 40ULL == vs->get_up_recv_size() );
        BOOST_MESSAGE( "up recv size : " << vs->get_up_recv_size() );
        // unit_test[20]  update_up_recv_sizeメソッド上限境界値(加算するとULLONG_MAXを越える場合)
-       BOOST_MESSAGE( "-------19" );
+       BOOST_MESSAGE( "-------20" );
        vs->update_up_recv_size( ULLONG_MAX );
        BOOST_CHECK( 40ULL == vs->get_up_recv_size() );
        BOOST_MESSAGE( "up recv size : " << vs->get_up_recv_size() );
 
        // unit_test[21]  update_up_send_sizeメソッド(Updateされることを確認)
-       BOOST_MESSAGE( "-------20" );
+       BOOST_MESSAGE( "-------21" );
        vs->update_up_send_size( 1024ULL );
        // unit_test[22]  get_up_send_sizeメソッドで上り総送信サイズを取得
+       BOOST_MESSAGE( "-------22" );
        BOOST_CHECK( 1024ULL == vs->get_up_send_size() );
        BOOST_MESSAGE( "up send size : " << vs->get_up_send_size() );
        // unit_test[23]  update_up_send_sizeメソッド(以前の値に加算されることを確認)
-       BOOST_MESSAGE( "-------21" );
+       BOOST_MESSAGE( "-------23" );
        vs->update_up_send_size( 2048ULL );
        BOOST_CHECK( 3072ULL == vs->get_up_send_size() );
        BOOST_MESSAGE( "up send size : " << vs->get_up_send_size() );
        // unit_test[24]  update_up_send_sizeメソッド上限境界値(加算するとULLONG_MAXを越える場合)
-       BOOST_MESSAGE( "-------22" );
+       BOOST_MESSAGE( "-------24" );
        vs->update_up_send_size( ULLONG_MAX );
        BOOST_CHECK( 3072ULL == vs->get_up_send_size() );
        BOOST_MESSAGE( "up send size : " << vs->get_up_send_size() );
 
        // unit_test[25]  update_down_recv_sizeメソッド(Updateされることを確認)
-       BOOST_MESSAGE( "-------24" );
+       BOOST_MESSAGE( "-------25" );
        vs->update_down_recv_size( 101010ULL );
        // unit_test[26]  get_down_recv_sizeメソッドで下り総受信サイズを取得
+       BOOST_MESSAGE( "-------26" );
        BOOST_CHECK( 101010ULL == vs->get_down_recv_size() );
        BOOST_MESSAGE( "down recv size : " << vs->get_down_recv_size() );
        // unit_test[27]  update_down_recv_sizeメソッド(以前の値に加算されることを確認)
-       BOOST_MESSAGE( "-------25" );
+       BOOST_MESSAGE( "-------27" );
        vs->update_down_recv_size( 505050ULL );
        BOOST_CHECK( 606060ULL == vs->get_down_recv_size() );
        BOOST_MESSAGE( "down recv size : " << vs->get_down_recv_size() );
        // unit_test[28]  update_down_recv_sizeメソッド上限境界値(加算するとULLONG_MAXを越える場合)
-       BOOST_MESSAGE( "-------26" );
+       BOOST_MESSAGE( "-------28" );
        vs->update_down_recv_size( ULLONG_MAX );
        BOOST_CHECK( 606060ULL == vs->get_down_recv_size() );
        BOOST_MESSAGE( "down recv size : " << vs->get_down_recv_size() );
 
        // unit_test[29]  update_down_send_sizeメソッド(Updateされることを確認)
-       BOOST_MESSAGE( "-------27" );
+       BOOST_MESSAGE( "-------29" );
        vs->update_down_send_size( 123456789ULL );
        // unit_test[30]  get_down_send_sizeメソッドで下り総送信サイズを取得
+       BOOST_MESSAGE( "-------30" );
        BOOST_CHECK( 123456789ULL == vs->get_down_send_size() );
        BOOST_MESSAGE( "down send size : " << vs->get_down_send_size() );
        // unit_test[31]  update_down_send_sizeメソッド(以前の値に加算されることを確認)
-       BOOST_MESSAGE( "-------28" );
+       BOOST_MESSAGE( "-------31" );
        vs->update_down_send_size( 987654321ULL );
        BOOST_CHECK( 1111111110ULL == vs->get_down_send_size() );
        BOOST_MESSAGE( "down send size : " << vs->get_down_send_size() );
        // unit_test[32]  update_down_send_sizeメソッド上限境界値(加算するとULLONG_MAXを越える場合)
-       BOOST_MESSAGE( "-------29" );
+       BOOST_MESSAGE( "-------32" );
        vs->update_down_send_size( ULLONG_MAX );
        BOOST_CHECK( 1111111110ULL == vs->get_down_send_size() );
        BOOST_MESSAGE( "down send size : " << vs->get_down_send_size() );
 
        // unit_test[33]  スループット計算のテスト
-       BOOST_MESSAGE( "-------30" );
+       BOOST_MESSAGE( "-------33" );
        //計算(curr_sizeクリアのため)
        vs->call_handle_throughput_update( test_err );
        //のぼり受信データサイズ更新
@@ -191,13 +195,14 @@ void      virtualservice_base_test2(){
        vs->call_handle_throughput_update( test_err );
        //コンソールに出して確認
        // unit_test[34]  get_throughput_upstreamメソッドで値を取得
-       BOOST_MESSAGE( "-------31" );
+       BOOST_MESSAGE( "-------34" );
        BOOST_MESSAGE( "bps up   : " << vs->get_throughput_upstream() );
        // unit_test[35]  get_throughput_downstreamメソッドで値を取得
-       BOOST_MESSAGE( "-------32" );
+       BOOST_MESSAGE( "-------35" );
        BOOST_MESSAGE( "bps down : " << vs->get_throughput_downstream() );
 
        // unit_test[36]  load_parameterでパラメータをロードする(パラメータが存在しないケース)
+       BOOST_MESSAGE( "-------36" );
        debugg_flug_struct::getInstance().param_exist_flag() = false;
        vs->call_load_parameter();
        BOOST_CHECK( vs->get_param_data().session_pool_size == l7vs::virtualservice_base::SESSION_POOL_NUM_DEFAULT );
index 798175c..a39f120 100644 (file)
@@ -22,8 +22,8 @@ public:
                handle_replication_interrupt( in_err );
        }
 
-       bool    call_read_replicationdata( replication_data& in_rep ){
-               return  read_replicationdata( in_rep );
+       void    call_read_replicationdata(){
+               read_replicationdata();
        }
 
        void    call_handle_accept(     const session_thread_control_ptr,
@@ -38,6 +38,16 @@ public:
        std::list<realserver>&  get_rs_list(){
                return rs_list;
        }
+       void    release_session( const boost::thread::id in_id ){
+               std::cout << "release_session called." << std::endl;
+               virtualservice_tcp::release_session( in_id );
+       }
+       void    handle_accept(  const session_thread_control_ptr stc_ptr,
+                                                       const boost::system::error_code& err ){
+               std::cout << "handle accept called." << std::endl;
+               virtualservice_tcp::handle_accept( stc_ptr, err );
+       }
+
 };
 
 }
index ac6fbac..ba1dec7 100644 (file)
@@ -17,6 +17,21 @@ using namespace boost::unit_test;
 typedef        boost::asio::ip::tcp::endpoint  tcp_ep_type;
 typedef        boost::asio::ip::udp::endpoint  udp_ep_type;
 
+
+//Acceptテスト用Client
+void   client(){
+//     boost::system::error_code       b_err;
+// 
+//     boost::asio::io_service dispatcher;
+//     boost::asio::ip::tcp::socket    sock( dispatcher );
+//     sock.bind( tcp_ep_type( boost::asio::ip::address::from_string( "10.144.169.87" ), (60000) ) );
+//     sock.open();
+
+       boost::asio::ip::tcp::iostream  s( "10.144.169.87", "60000" );
+       
+}
+
+
 //test case1  create,initialize,run,stop,finalize,destroy(normal case)
 void   virtualservice_tcp_test1(){
        debugg_flug_struct::getInstance().pmcontrol_err_flag()  = false;
@@ -28,8 +43,20 @@ void virtualservice_tcp_test1(){
        l7vs::replication                       rep( dispatcher );
        l7vs::virtualservice_element    element;
        //set element value
-       element.protocol_module_name    = "pmtest1";
-       element.schedule_module_name    = "smtest1";
+       element.udpmode                                 = false;
+       element.tcp_accept_endpoint             = tcp_ep_type( boost::asio::ip::address::from_string( "10.144.169.87" ), (60000) );
+       element.udp_recv_endpoint               = udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
+       element.realserver_vector.clear();
+       element.protocol_module_name    = "PMtest1";
+       element.schedule_module_name    = "SMtest1";
+       element.protocol_args.clear();
+       element.protocol_args.push_back( "testarg" );
+       element.protocol_args.push_back( "testarg2" );
+       element.sorry_maxconnection             = 1234LL;
+       element.sorry_endpoint                  = tcp_ep_type( boost::asio::ip::address::from_string( "10.144.169.87" ), (8080) );
+       element.sorry_flag                              = false;
+       element.qos_upstream                    = 65535ULL;
+       element.qos_downstream                  = 32767ULL;
        
        // unit_test[1]  object create
        BOOST_MESSAGE( "-------1" );
@@ -70,19 +97,28 @@ void        virtualservice_tcp_test1(){
        // unit_test[4]  stop method test
        BOOST_MESSAGE( "-------4" );
        vs->stop();
+       usleep( 1000 );
 
-       // unit_test[5]  stop method test(call twice)
+       // unit_test[5]  release_session method test(stopすると、sessionスレッドからrelease_sessionが呼ばれる)
        BOOST_MESSAGE( "-------5" );
+       BOOST_CHECK( vs->get_pool_sessions().size() == (l7vs::virtualservice_base::SESSION_POOL_NUM_DEFAULT-1) );
+       BOOST_CHECK( vs->get_active_sessions().size() == 1 );
+       vs->release_session( vs->get_active_sessions().begin()->second->get_upthread_id() );
+       BOOST_CHECK( vs->get_pool_sessions().size() == static_cast<size_t>( l7vs::virtualservice_base::SESSION_POOL_NUM_DEFAULT) );
+       BOOST_CHECK( vs->get_active_sessions().size() == 0 );
+
+       // unit_test[6]  stop method test(call twice)
+       BOOST_MESSAGE( "-------6" );
        vs->stop();
 
        vs_main.join();
 
-       // unit_test[6]  finalize method call
-       BOOST_MESSAGE( "-------" );
+       // unit_test[7]  finalize method call
+       BOOST_MESSAGE( "-------7" );
        vs->finalize( vs_err );
 
-       // unit_test[7]  object destroy
-       BOOST_MESSAGE( "-------" );
+       // unit_test[8]  object destroy
+       BOOST_MESSAGE( "-------8" );
        delete vs;
 }
 
@@ -99,20 +135,21 @@ void       virtualservice_tcp_test2(){
 
 
        l7vs::vs_tcp*   vs = new l7vs::vs_tcp( vsd, rep, element );
-       // unit_test[8]  initialize method call(poolsize from parameter file:value = 512)
-       BOOST_MESSAGE( "-------" );
+       // unit_test[9]  initialize method call(poolsize from parameter file:value = 512)
+       BOOST_MESSAGE( "-------9" );
        debugg_flug_struct::getInstance().param_exist_flag() = true;
        debugg_flug_struct::getInstance().pmcontrol_err_flag()  = false;
        debugg_flug_struct::getInstance().smcontrol_err_flag()  = false;
        vs->initialize( vs_err );
        BOOST_CHECK( SESSION_POOL_NUM_PARAM == vs->get_pool_sessions().size() );
        BOOST_CHECK( vs_err == false );
+       vs->finalize( vs_err );
        delete vs;
-
+       vs = NULL;
 
        vs = new l7vs::vs_tcp( vsd, rep, element );
-       // unit_test[9]  initialize method call(procotol_module_control::module_load error case)
-       BOOST_MESSAGE( "-------" );
+       // unit_test[10]  initialize method call(procotol_module_control::module_load error case)
+       BOOST_MESSAGE( "-------10" );
        debugg_flug_struct::getInstance().param_exist_flag() = false;
        debugg_flug_struct::getInstance().pmcontrol_err_flag()  = true;
        debugg_flug_struct::getInstance().smcontrol_err_flag()  = false;
@@ -125,11 +162,12 @@ void      virtualservice_tcp_test2(){
        BOOST_MESSAGE( vs_err.get_message() );
        BOOST_CHECK( PROTOMOD_LOAD_ERROR_MSG == vs_err.get_message() );
 
+       vs->finalize( vs_err );
        delete vs;
 
        vs = new l7vs::vs_tcp( vsd, rep, element );
-       // unit_test[10]  initialize method call(procotol_module_control::module_load error case)
-       BOOST_MESSAGE( "-------" );
+       // unit_test[11]  initialize method call(procotol_module_control::module_load error case)
+       BOOST_MESSAGE( "-------11" );
        debugg_flug_struct::getInstance().pmcontrol_err_flag()  = false;
        debugg_flug_struct::getInstance().smcontrol_err_flag()  = true;
        BOOST_CHECK( NULL == vs->get_protocol_module() );
@@ -141,31 +179,45 @@ void      virtualservice_tcp_test2(){
        BOOST_MESSAGE( vs_err.get_message() );
        BOOST_CHECK( SCHEDMOD_LOAD_ERROR_MSG == vs_err.get_message() );
 
+       vs->finalize( vs_err );
        delete vs;
 
        vs = new l7vs::vs_tcp( vsd, rep, element );
+       vs->initialize( vs_err );
        l7vs::vs_tcp*   vs2 = new l7vs::vs_tcp( vsd, rep, element );
-       // unit_test[11]  initialize method call(procotol_module_control::module_load error case)
-       BOOST_MESSAGE( "-------" );
+       vs2->initialize( vs_err );
+       // unit_test[12]  initialize method call(procotol_module_control::module_load error case)
+       BOOST_MESSAGE( "-------12" );
        BOOST_CHECK( *vs == *vs2 );
+       vs->finalize( vs_err );
        delete vs;
+       vs2->finalize( vs_err );
        delete vs2;
-       // unit_test[12]  initialize method call(procotol_module_control::module_load error case)
+
+       // unit_test[13]  initialize method call(procotol_module_control::module_load error case)
+       BOOST_MESSAGE( "-------13" );
        element.udpmode = false;
        element.tcp_accept_endpoint     = tcp_ep_type( boost::asio::ip::address::from_string( "192.168.10.10" ), (8080) );
        vs = new l7vs::vs_tcp( vsd, rep, element );
+       vs->initialize( vs_err );
+
        element.tcp_accept_endpoint     = tcp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (80) );
        vs2 = new l7vs::vs_tcp( vsd, rep, element );
-       BOOST_MESSAGE( "-------" );
+       vs2->initialize( vs_err );
+
        BOOST_CHECK( *vs != *vs2 );
+       vs->finalize( vs_err );
        delete vs;
+       vs2->finalize( vs_err );
        delete vs2;
 
        element.udpmode = false;
        element.tcp_accept_endpoint     = tcp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (80) );
        vs = new l7vs::vs_tcp( vsd, rep, element );
-       // unit_test[13]  add_realserver method call
-       BOOST_MESSAGE( "-------" );
+       vs->initialize( vs_err );
+
+       // unit_test[14]  add_realserver method call
+       BOOST_MESSAGE( "-------14" );
        l7vs::virtualservice_element    add_element;
        add_element.udpmode = false;
        add_element.tcp_accept_endpoint = element.tcp_accept_endpoint;
@@ -194,7 +246,9 @@ void        virtualservice_tcp_test2(){
                        }
                }
        }
-       // unit_test[14]  add_realserver method call(VSのEndpointが違う場合はエラーが返ること)
+
+       // unit_test[15]  add_realserver method call(VSのEndpointが違う場合はエラーが返ること)
+       BOOST_MESSAGE( "-------15" );
        l7vs::virtualservice_element    add_err_element;
        add_err_element.tcp_accept_endpoint = tcp_ep_type( boost::asio::ip::address::from_string( "10.144.169.87" ), (80) );
        l7vs::realserver_element                rs_adderr_elem;
@@ -207,7 +261,8 @@ void        virtualservice_tcp_test2(){
        BOOST_CHECK( vs_err == true );
        BOOST_MESSAGE( vs_err.get_message() );
 
-       // unit_test[15]  add_realserver method call(既にあるRS(エンドポイントが同じ)追加はエラーが返ること)
+       // unit_test[16]  add_realserver method call(既にあるRS(エンドポイントが同じ)追加はエラーが返ること)
+       BOOST_MESSAGE( "-------16" );
        add_err_element.tcp_accept_endpoint = tcp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (80) );
        rs_adderr_elem.tcp_endpoint = tcp_ep_type( boost::asio::ip::address::from_string( "192.168.10.10" ), (8080) );
        add_err_element.realserver_vector.clear();
@@ -219,7 +274,8 @@ void        virtualservice_tcp_test2(){
        BOOST_CHECK( vs_err == true );
        BOOST_MESSAGE( vs_err.get_message() );
 
-       // unit_test[16]  del_realserver method call(VSのエンドポイントが異なる場合はエラーが返ること)
+       // unit_test[17]  del_realserver method call(VSのエンドポイントが異なる場合はエラーが返ること)
+       BOOST_MESSAGE( "-------17" );
        l7vs::virtualservice_element    del_err_element;
        l7vs::realserver_element                rs_delerr_elem;
        del_err_element.tcp_accept_endpoint     = tcp_ep_type( boost::asio::ip::address::from_string( "10.144.169.87" ), (80) );
@@ -233,7 +289,8 @@ void        virtualservice_tcp_test2(){
        BOOST_CHECK( vs_err == true );
        BOOST_MESSAGE( vs_err.get_message() );
 
-       // unit_test[17]  del_realserver method call(一致するRSが無い場合はエラーが返ること)
+       // unit_test[18]  del_realserver method call(一致するRSが無い場合はエラーが返ること)
+       BOOST_MESSAGE( "-------18" );
        del_err_element.tcp_accept_endpoint     = tcp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (80) );
        rs_delerr_elem.tcp_endpoint = tcp_ep_type( boost::asio::ip::address::from_string( "100.90.80.70" ), (60000) );
        del_err_element.realserver_vector.clear();
@@ -245,9 +302,9 @@ void        virtualservice_tcp_test2(){
        BOOST_CHECK( vs_err == true );
        BOOST_MESSAGE( vs_err.get_message() );
 
-       // unit_test[18]  del_realserver method call
+       // unit_test[19]  del_realserver method call
        //addしたものと同じものを指定して、全削除されることを確認
-       BOOST_MESSAGE( "-------" );
+       BOOST_MESSAGE( "-------19" );
        vs->del_realserver( add_element, vs_err );
        //RSの数が0であることを確認
        BOOST_CHECK( 0 == rslist.size() );
@@ -256,8 +313,8 @@ void        virtualservice_tcp_test2(){
        BOOST_MESSAGE( vs_err.get_message() );
        BOOST_CHECK( vs_err.get_message() == "" );
 
-       // unit_test[19]  add_realserver method call(再度追加)
-       BOOST_MESSAGE( "-------" );
+       // unit_test[20]  add_realserver method call(再度追加)
+       BOOST_MESSAGE( "-------20" );
        vs->add_realserver( add_element, vs_err );
        //RSの数が10であることを確認
        BOOST_CHECK( 10 == rslist.size() );
@@ -273,7 +330,8 @@ void        virtualservice_tcp_test2(){
                }
        }
 
-       // unit_test[20]  connection_active method call
+       // unit_test[21]  connection_active method call
+       BOOST_MESSAGE( "-------21" );
        tcp_ep_type     ep = tcp_ep_type( boost::asio::ip::address::from_string( "192.168.10.10" ), (8080) );
        vs->connection_active( ep );
        for( std::list<l7vs::realserver>::iterator      itr = rslist.begin();
@@ -283,7 +341,8 @@ void        virtualservice_tcp_test2(){
                        break;
                }
        }
-       // unit_test[21]  connection_inactive method call
+       // unit_test[22]  connection_inactive method call
+       BOOST_MESSAGE( "-------22" );
        vs->connection_inactive( ep );
        for( std::list<l7vs::realserver>::iterator      itr = rslist.begin();
                 itr != rslist.end(); ++itr ){
@@ -294,12 +353,19 @@ void      virtualservice_tcp_test2(){
                }
        }
 
+       vs->finalize( vs_err );
        delete vs;
 }
 
 //test case3
 void   virtualservice_tcp_test3(){
-       l7vs::error_code        vs_err;
+       l7vs::error_code                        vs_err;
+       boost::system::error_code       test_err;
+       debugg_flug_struct::getInstance().param_exist_flag() = false;
+
+       std::stringstream       tmp_tcp_ep;
+       std::stringstream       tmp_udp_ep;
+       std::stringstream       tmp_sorry_ep;
 
        l7vs::l7vsd                                     vsd;
        boost::asio::io_service         dispatcher;
@@ -324,20 +390,41 @@ void      virtualservice_tcp_test3(){
        vs->initialize( vs_err );
 
        // unit_test[22]  replication dataが作成できるか確認(初回作成)
+       BOOST_MESSAGE( "-------22" );
        //まず、stubのレプリケーションエリア作成をする
        debugg_flug_struct::getInstance().create_rep_area();
-       //data_numが1になってることを確認
-       
+
+       //レプリケーションデータ作成
+       vs->call_handle_replication_interrupt( test_err );
+
+       l7vs::virtualservice_base::replication_header*  rep_head =
+               reinterpret_cast<l7vs::virtualservice_base::replication_header*>( debugg_flug_struct::getInstance().get_rep_area() );
+       //data_numが0になってることを確認
+       BOOST_CHECK( rep_head->data_num == 1 );
+       l7vs::virtualservice_base::replication_data*    rep_data =
+               reinterpret_cast<l7vs::virtualservice_base::replication_data*>( ++rep_head );
        //udpmode
+       BOOST_CHECK( rep_data->udpmode == false );
        //tcp_endpoint
+       tmp_tcp_ep << element.tcp_accept_endpoint;
+       BOOST_CHECK( 0 == strncmp( rep_data->tcp_endpoint, tmp_tcp_ep.str().c_str(), 47 ) );
        //udp_endpoint
+       tmp_udp_ep << element.udp_recv_endpoint;
+       BOOST_CHECK( 0 == strncmp( rep_data->udp_endpoint, tmp_udp_ep.str().c_str(), 47 ) );
        //sorry_maxconnection
+       BOOST_CHECK( rep_data->sorry_maxconnection == 1234LL );
        //sorry_endpoint
+       tmp_sorry_ep << element.sorry_endpoint;
+       BOOST_CHECK( 0 == strncmp( rep_data->sorry_endpoint, tmp_sorry_ep.str().c_str(), 47 ) );
        //sorry_flag
+       BOOST_CHECK( rep_data->sorry_flag == false );
        //qos_up
+       BOOST_CHECK( rep_data->qos_up == 65535ULL );
        //qos_down
+       BOOST_CHECK( rep_data->qos_down == 32767ULL );
 
        // unit_test[23]  edit_virtualserviceのテスト
+       BOOST_MESSAGE( "-------23" );
        //変更前の値確認
        BOOST_CHECK( false == vs->get_element().udpmode );
        BOOST_CHECK( tcp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (60000) ) ==  vs->get_element().tcp_accept_endpoint );
@@ -382,6 +469,7 @@ void        virtualservice_tcp_test3(){
        BOOST_CHECK( 4096ULL == vs->get_element().qos_downstream );
 
        // unit_test[24]  edit_virtualserviceのテスト(udpmodeが一致しないものはエラーが返る&値が反映されない)
+       BOOST_MESSAGE( "-------24" );
        l7vs::virtualservice_element    elem3;
        elem3.udpmode                                   = true;
        elem3.tcp_accept_endpoint               = tcp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (60000) );
@@ -412,6 +500,7 @@ void        virtualservice_tcp_test3(){
        BOOST_CHECK( 4096ULL == vs->get_element().qos_downstream );
 
        // unit_test[25]  edit_virtualserviceのテスト(tcp_accept_endpointが一致しないものはエラーが返る&値が反映されない)
+       BOOST_MESSAGE( "-------25" );
        elem3.udpmode                                   = false;
        elem3.tcp_accept_endpoint               = tcp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (8080) );
        elem3.udp_recv_endpoint                 = udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (40000) );
@@ -433,6 +522,7 @@ void        virtualservice_tcp_test3(){
        BOOST_CHECK( 4096ULL == vs->get_element().qos_downstream );
 
        // unit_test[26]  edit_virtualserviceのテスト(protocol_module_nameが一致しないものはエラーが返る&値が反映されない)
+       BOOST_MESSAGE( "-------26" );
        elem3.udpmode                                   = false;
        elem3.tcp_accept_endpoint               = tcp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (60000) );
        elem3.udp_recv_endpoint                 = udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (40000) );
@@ -453,92 +543,602 @@ void     virtualservice_tcp_test3(){
        BOOST_CHECK( 1024ULL == vs->get_element().qos_upstream );
        BOOST_CHECK( 4096ULL == vs->get_element().qos_downstream );
 
-       // unit_test[]  replication dataが作成できるか確認(既にあるデータを上書き)
-       //data_numが1になってることを確認
+       // unit_test[27]  edit_virtualserviceのテスト(sorry_endpointの変更無し)
+       BOOST_MESSAGE( "-------27" );
+       elem2.udpmode                                   = false;
+       elem2.tcp_accept_endpoint               = tcp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (60000) );
+       elem2.udp_recv_endpoint                 = udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (40000) );
+       elem2.realserver_vector.clear();
+       elem2.protocol_module_name              = "PMtest1";
+       elem2.schedule_module_name              = "SMtest2";
+       elem2.protocol_args.clear();
+       elem2.sorry_maxconnection               = 5678LL;
+       elem2.sorry_endpoint                    = tcp_ep_type( boost::asio::ip::address::from_string( "255.255.255.255" ), (0) );
+       elem2.sorry_flag                                = true;
+       elem2.qos_upstream                              = 1024ULL;
+       elem2.qos_downstream                    = 4096ULL;
+
+       vs->edit_virtualservice( elem2, vs_err );
+       //vs_errがtrueなのをチェック
+       BOOST_CHECK( vs_err == false );
+
+       BOOST_CHECK( false == vs->get_element().udpmode );
+       BOOST_CHECK( elem2.tcp_accept_endpoint  ==  vs->get_element().tcp_accept_endpoint );
+       BOOST_CHECK( element.udp_recv_endpoint  ==  vs->get_element().udp_recv_endpoint );
+       BOOST_CHECK( "PMtest1" == vs->get_element().protocol_module_name );
+       BOOST_CHECK( "SMtest2" == vs->get_element().schedule_module_name );
+       BOOST_CHECK( 5678LL == vs->get_element().sorry_maxconnection );
+       BOOST_CHECK( tcp_ep_type( boost::asio::ip::address::from_string( "10.144.169.86" ), (80) ) == vs->get_element().sorry_endpoint );
+       BOOST_CHECK( true == vs->get_element().sorry_flag );
+       BOOST_CHECK( 1024ULL == vs->get_element().qos_upstream );
+       BOOST_CHECK( 4096ULL == vs->get_element().qos_downstream );
+
+       // unit_test[28]  edit_virtualserviceのテスト(sorry_endpointクリア)
+       BOOST_MESSAGE( "-------28" );
+       elem2.udpmode                                   = false;
+       elem2.tcp_accept_endpoint               = tcp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (60000) );
+       elem2.udp_recv_endpoint                 = udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (40000) );
+       elem2.realserver_vector.clear();
+       elem2.protocol_module_name              = "PMtest1";
+       elem2.schedule_module_name              = "SMtest2";
+       elem2.protocol_args.clear();
+       elem2.sorry_maxconnection               = 5678LL;
+       elem2.sorry_endpoint                    = tcp_ep_type();
+       elem2.sorry_flag                                = true;
+       elem2.qos_upstream                              = 1024ULL;
+       elem2.qos_downstream                    = 4096ULL;
+
+       vs->edit_virtualservice( elem2, vs_err );
+       //vs_errがtrueなのをチェック
+       BOOST_CHECK( vs_err == false );
+
+       BOOST_CHECK( false == vs->get_element().udpmode );
+       BOOST_CHECK( elem2.tcp_accept_endpoint  ==  vs->get_element().tcp_accept_endpoint );
+       BOOST_CHECK( element.udp_recv_endpoint  ==  vs->get_element().udp_recv_endpoint );
+       BOOST_CHECK( "PMtest1" == vs->get_element().protocol_module_name );
+       BOOST_CHECK( "SMtest2" == vs->get_element().schedule_module_name );
+       BOOST_CHECK( 0LL == vs->get_element().sorry_maxconnection );
+       BOOST_CHECK( tcp_ep_type() == vs->get_element().sorry_endpoint );
+       BOOST_CHECK( false == vs->get_element().sorry_flag );
+       BOOST_CHECK( 1024ULL == vs->get_element().qos_upstream );
+       BOOST_CHECK( 4096ULL == vs->get_element().qos_downstream );
+
+       // unit_test[29]  replication dataが作成できるか確認(既にあるデータを上書き)
+       BOOST_MESSAGE( "-------29" );
+       vs->call_handle_replication_interrupt( test_err );
+       rep_head =      reinterpret_cast<l7vs::virtualservice_base::replication_header*>( debugg_flug_struct::getInstance().get_rep_area() );
+       //data_numが0になってることを確認
+       BOOST_CHECK( rep_head->data_num == 1 );
+       rep_data =      reinterpret_cast<l7vs::virtualservice_base::replication_data*>( ++rep_head );
        //udpmode
+       BOOST_CHECK( rep_data->udpmode == false );
        //tcp_endpoint
+       tmp_tcp_ep.str( "" );
+       tmp_tcp_ep << elem2.tcp_accept_endpoint;
+       BOOST_CHECK( 0 == strncmp( rep_data->tcp_endpoint, tmp_tcp_ep.str().c_str(), 47 ) );
        //udp_endpoint
+       tmp_udp_ep.str( "" );
+       tmp_udp_ep << element.udp_recv_endpoint;
+       BOOST_CHECK( 0 == strncmp( rep_data->udp_endpoint, tmp_udp_ep.str().c_str(), 47 ) );
        //sorry_maxconnection
+       BOOST_CHECK( rep_data->sorry_maxconnection == 0LL );
        //sorry_endpoint
+       tmp_sorry_ep.str( "" );
+       tmp_sorry_ep << tcp_ep_type();
+       BOOST_CHECK( 0 == strncmp( rep_data->sorry_endpoint, tmp_sorry_ep.str().c_str(), 47 ) );
        //sorry_flag
+       BOOST_CHECK( rep_data->sorry_flag == false );
        //qos_up
+       BOOST_CHECK( rep_data->qos_up == 1024ULL );
        //qos_down
+       BOOST_CHECK( rep_data->qos_down == 4096ULL );
 
-       // unit_test[]  vsをもう一つ作って、そこからもレプリケーションデータを作成する
-       l7vs::vs_tcp*   vs2 = new l7vs::vs_tcp( vsd, rep, element );
+       // unit_test[30]  vsをもう一つ作って、そこからもレプリケーションデータを作成する
+       BOOST_MESSAGE( "-------" );
+       elem3.udpmode                                   = false;
+       elem3.tcp_accept_endpoint               = tcp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (8080) );
+       elem3.udp_recv_endpoint                 = udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (40000) );
+       elem3.realserver_vector.clear();
+       elem3.protocol_module_name              = "PMtest1";
+       elem3.schedule_module_name              = "SMtest1";
+       elem3.protocol_args.clear();
+       elem3.sorry_maxconnection               = 7890LL;
+       elem3.sorry_endpoint                    = tcp_ep_type( boost::asio::ip::address::from_string( "10.144.169.86" ), (80) );
+       elem3.sorry_flag                                = false;
+       elem3.qos_upstream                              = 14142ULL;
+       elem3.qos_downstream                    = 22362ULL;
+
+
+       l7vs::vs_tcp*   vs2 = new l7vs::vs_tcp( vsd, rep, elem3 );
+
+       vs2->initialize( vs_err );
+       BOOST_CHECK( vs_err == false );
+       BOOST_MESSAGE( vs_err.get_message() );
 
        //data_numが2になってることを確認
+       vs2->call_handle_replication_interrupt( test_err );
+       rep_head =      reinterpret_cast<l7vs::virtualservice_base::replication_header*>( debugg_flug_struct::getInstance().get_rep_area() );
+       //data_numが0になってることを確認
+       BOOST_CHECK( rep_head->data_num == 2 );
+       rep_data =      reinterpret_cast<l7vs::virtualservice_base::replication_data*>( ++rep_head );
+       ++rep_data;
        //udpmode
+       BOOST_CHECK( rep_data->udpmode == false );
        //tcp_endpoint
+       tmp_tcp_ep.str( "" );
+       tmp_tcp_ep << elem3.tcp_accept_endpoint;
+       BOOST_CHECK( 0 == strncmp( rep_data->tcp_endpoint, tmp_tcp_ep.str().c_str(), 47 ) );
        //udp_endpoint
+       tmp_udp_ep.str( "" );
+       tmp_udp_ep << elem3.udp_recv_endpoint;
+       BOOST_CHECK( 0 == strncmp( rep_data->udp_endpoint, tmp_udp_ep.str().c_str(), 47 ) );
        //sorry_maxconnection
+       BOOST_CHECK( rep_data->sorry_maxconnection == 7890LL );
        //sorry_endpoint
+       tmp_sorry_ep.str( "" );
+       tmp_sorry_ep << elem3.sorry_endpoint;
+       BOOST_CHECK( 0 == strncmp( rep_data->sorry_endpoint, tmp_sorry_ep.str().c_str(), 47 ) );
        //sorry_flag
+       BOOST_CHECK( rep_data->sorry_flag == false );
        //qos_up
+       BOOST_CHECK( rep_data->qos_up == 14142ULL );
        //qos_down
+       BOOST_CHECK( rep_data->qos_down == 22362ULL );
+
+       //一端削除
+       vs->finalize( vs_err );
+       delete vs;
+
+       // unit_test[31]  VSを再度作りなおして、レプリケーションデータが読み出せるか
+       BOOST_MESSAGE( "-------31" );
+       vs = new l7vs::vs_tcp( vsd, rep, element );
+       vs->initialize( vs_err );
+       //replication dataの確認
+       vs2->call_handle_replication_interrupt( test_err );
+       rep_head =      reinterpret_cast<l7vs::virtualservice_base::replication_header*>( debugg_flug_struct::getInstance().get_rep_area() );
+       //data_numが0になってることを確認
+       BOOST_CHECK( rep_head->data_num == 2 );
+       rep_data =      reinterpret_cast<l7vs::virtualservice_base::replication_data*>( ++rep_head );
+       //udpmode
+       BOOST_CHECK( rep_data->udpmode == element.udpmode );
+       //tcp_endpoint
+       tmp_tcp_ep.str( "" );
+       tmp_tcp_ep << element.tcp_accept_endpoint;
+       BOOST_CHECK( 0 == strncmp( rep_data->tcp_endpoint, tmp_tcp_ep.str().c_str(), 47 ) );
+       //udp_endpoint
+       tmp_udp_ep.str( "" );
+       tmp_udp_ep << element.udp_recv_endpoint;
+       BOOST_CHECK( 0 == strncmp( rep_data->udp_endpoint, tmp_udp_ep.str().c_str(), 47 ) );
+       //sorry_maxconnection
+       BOOST_CHECK( rep_data->sorry_maxconnection == 0LL );
+       //sorry_endpoint
+       tmp_sorry_ep.str( "" );
+       tmp_sorry_ep << tcp_ep_type();
+       BOOST_CHECK( 0 == strncmp( rep_data->sorry_endpoint, tmp_sorry_ep.str().c_str(), 47 ) );
+       //sorry_flag
+       BOOST_CHECK( rep_data->sorry_flag == false );
+       //qos_up
+       BOOST_CHECK( rep_data->qos_up == 1024ULL );
+       //qos_down
+       BOOST_CHECK( rep_data->qos_down == 4096ULL );
+
+       //反映されたデータの確認
+       BOOST_MESSAGE( "sorry max_conn : " << vs->get_element().sorry_maxconnection );
+       BOOST_CHECK( 0LL == vs->get_element().sorry_maxconnection );
+       BOOST_MESSAGE( "sorry endpoint : " << vs->get_element().sorry_endpoint );
+       BOOST_CHECK( tcp_ep_type() == vs->get_element().sorry_endpoint );
+       BOOST_MESSAGE( "sorry flag     : " << vs->get_element().sorry_flag );
+       BOOST_CHECK( false == vs->get_element().sorry_flag );
+       BOOST_MESSAGE( "QoS upstream   : " << vs->get_element().qos_upstream );
+       BOOST_CHECK( 1024ULL == vs->get_element().qos_upstream );
+       BOOST_MESSAGE( "QoS downstream : " << vs->get_element().qos_downstream );
+       BOOST_CHECK( 4096ULL == vs->get_element().qos_downstream );
 
 
        //テストが終わったらStubのレプリケーションエリアを削除
        debugg_flug_struct::getInstance().create_rep_area();
 
-       // unit_test[]  edit_virtualserviceのテスト(schedule_moduleのロードに失敗するケース:致命的エラー)
-       debugg_flug_struct::getInstance().smcontrol_err_flag() = false;
+       // unit_test[32]  edit_virtualserviceのテスト(schedule_moduleのロードに失敗するケース:致命的エラー)
+       BOOST_MESSAGE( "-------32" );
+       debugg_flug_struct::getInstance().smcontrol_err_flag() = true;
+       elem2.schedule_module_name              = "SMtest3";
+       vs->edit_virtualservice( elem2, vs_err );
+       //vs_errがtrueなのをチェック
+       BOOST_CHECK( vs_err == true );
+       BOOST_MESSAGE( vs_err.get_message() );
 
+       vs2->finalize( vs_err );
        delete vs2;
+       vs->finalize( vs_err );
        delete vs;
 }
 
-void   session_pool_access_test(){
-       //sessionがActiveになるときに、release_sessionされるケース
-       //sessionがActiveになるときにfinalize
-       //release_sessionされるときにfinalize
-}
+//IPv6関係のテスト
+void   virtualservice_tcp_test4(){
+       debugg_flug_struct::getInstance().param_exist_flag() = false;
+       debugg_flug_struct::getInstance().pmcontrol_err_flag()  = false;
+       debugg_flug_struct::getInstance().smcontrol_err_flag()  = false;
 
-void   rslist_access_test(){
-       //rs追加
-       //add_rsとrs_list_lock
-       //add_rsとrs_list_unlock
-       //add_rsとconnection_active
-       //add_rsとconnection_inactive
-       //rs変更
-       //edit_rsとrs_list_lock
-       //edit_rsとrs_list_unlock
-       //edit_rsとconnection_active
-       //edit_rsとconnection_inactive
-       //rs削除
-       //del_rsとrs_list_lock
-       //del_rsとrs_list_unlock
-       //del_rsとconnection_active
-       //del_rsとconnection_inactive
-       //rs_list_lockを複数スレッドから同時に呼ぶ
-       //rs_list_unlockを複数スレッドから同時に呼ぶ
-       //rs_list_lockとrs_list_unlockを複数スレッドから同時に呼ぶ
-       //connection_activeを複数スレッドから同時に呼ぶ
-       //connection_inactiveを複数スレッドから同時に呼ぶ
-       //connection_activeとconnection_inactiveを複数スレッドから同時に呼ぶ
-       //rs_list_lockとconnection_activeを複数スレッドから同時に呼ぶ
-       //rs_list_unlockとrs_list_unlockを複数スレッドから同時に呼ぶ
-       //rs_list_lockとconnection_inactiveを複数スレッドから同時に呼ぶ
-       //rs_list_unlockとconnection_activeを複数スレッドから同時に呼ぶ
-}
+       l7vs::error_code                        vs_err;
+       boost::system::error_code       test_err;
+
+       std::stringstream       tmp_tcp_ep;
+       std::stringstream       tmp_udp_ep;
+       std::stringstream       tmp_sorry_ep;
+
+       l7vs::l7vsd                                     vsd;
+       boost::asio::io_service         dispatcher;
+       l7vs::replication                       rep( dispatcher );
+       l7vs::virtualservice_element    elem1;
+
+       //set element value
+       elem1.udpmode                                   = false;
+       elem1.tcp_accept_endpoint               = 
+                       tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678:90AB:CDEF:0000:0000:FEDC:BA09" ), (60000) );
+       elem1.udp_recv_endpoint                 = udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
+       elem1.realserver_vector.clear();
+       elem1.protocol_module_name              = "PMtest1";
+       elem1.schedule_module_name              = "SMtest1";
+       elem1.protocol_args.clear();
+       elem1.sorry_maxconnection               = 1234LL;
+       elem1.sorry_endpoint                    = 
+                       tcp_ep_type( boost::asio::ip::address::from_string( "AFAF:0E08::8FDE" ), (8080) );
+       elem1.sorry_flag                                = false;
+       elem1.qos_upstream                              = 65535ULL;
+       elem1.qos_downstream                    = 32767ULL;
+
+       // unit_test[33]  IPv6アドレスでVS作成
+       BOOST_MESSAGE( "-------33" );
+       l7vs::vs_tcp*   vs = new l7vs::vs_tcp( vsd, rep, elem1 );
+       BOOST_CHECK( vs_err == false );
+       vs->initialize( vs_err );
+       BOOST_CHECK( vs_err == false );
+       BOOST_MESSAGE( vs_err.get_message() );
+
+       //比較用VS作成
+       l7vs::vs_tcp*   vs2 = new l7vs::vs_tcp( vsd, rep, elem1 );
+       bool    chkflg;
+       // unit_test[34]  IPv6アドレスでoperator==のテスト(VSが一致するケース)
+       BOOST_MESSAGE( "-------34" );
+       chkflg = ( *vs == *vs2 );
+       BOOST_CHECK( chkflg );
+       // unit_test[35]  IPv6アドレスでoperator!=のテスト(VSが一致するケース)
+       BOOST_MESSAGE( "-------35" );
+       chkflg = ( *vs != *vs2 );
+       BOOST_CHECK( !chkflg );
+       delete vs2;
+       vs2 = NULL;
+
+       //比較用VS作成
+       //set element-2
+       l7vs::virtualservice_element    elem2;
+       elem2.udpmode                                   = false;
+       elem2.tcp_accept_endpoint               = 
+                       tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678:90AB:CDEF:0000:0000:FEDC:BA00" ), (60000) );
+       elem2.udp_recv_endpoint                 = udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
+       elem2.realserver_vector.clear();
+       elem2.protocol_module_name              = "PMtest1";
+       elem2.schedule_module_name              = "SMtest1";
+       elem2.protocol_args.clear();
+       elem2.sorry_maxconnection               = 1234LL;
+       elem2.sorry_endpoint                    = 
+                       tcp_ep_type( boost::asio::ip::address::from_string( "AFAF:0E08::8FDE" ), (8080) );
+       elem2.sorry_flag                                = false;
+       elem2.qos_upstream                              = 65535ULL;
+       elem2.qos_downstream                    = 32767ULL;
+       vs2 = new l7vs::vs_tcp( vsd, rep, elem2 );
+       // unit_test[36]  IPv6アドレスでoperator==のテスト(VSが一致しないケース)
+       BOOST_MESSAGE( "-------36" );
+       chkflg = ( *vs == *vs2 );
+       BOOST_CHECK( !chkflg );
+       // unit_test[37]  IPv6アドレスでoperator!=のテスト(VSが一致しないケース)
+       BOOST_MESSAGE( "-------37" );
+       chkflg = ( *vs != *vs2 );
+       BOOST_CHECK( chkflg );
+       delete vs2;
+       vs2 = NULL;
 
-void   element_access_test(){
-       //get_qos_upを複数スレッドから同時に呼ぶ
-       //get_qos_downを複数スレッドから同時に呼ぶ
-       //get_qos_upとget_qos_downを複数スレッドから同時に呼ぶ
+       // unit_test[38]  IPv6アドレスでVS編集
+       BOOST_MESSAGE( "-------38" );
+       l7vs::virtualservice_element    elem3;
+       elem3.udpmode                                   = false;
+       elem3.tcp_accept_endpoint               = 
+                       tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678:90AB:CDEF:0000:0000:FEDC:BA09" ), (60000) );
+       elem3.udp_recv_endpoint                 = 
+                       udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
+       elem3.realserver_vector.clear();
+       elem3.protocol_module_name              = "PMtest1";
+       elem3.schedule_module_name              = "SMtest1";
+       elem3.protocol_args.clear();
+       elem3.sorry_maxconnection               = 3333LL;
+       elem3.sorry_endpoint                    = tcp_ep_type();
+       elem3.sorry_flag                                = true;
+       elem3.qos_upstream                              = 65535ULL;
+       elem3.qos_downstream                    = 32767ULL;
+
+       vs->edit_virtualservice( elem3, vs_err );
+       BOOST_CHECK( vs_err == false );
+       BOOST_CHECK( vs->get_element().sorry_endpoint == tcp_ep_type() );
+       BOOST_CHECK( vs->get_element().sorry_maxconnection == 0LL );
+       BOOST_CHECK( vs->get_element().sorry_flag == false );
+       BOOST_CHECK( vs->get_element().qos_upstream == elem3.qos_upstream );
+       BOOST_CHECK( vs->get_element().qos_downstream == elem3.qos_downstream );
+
+
+       // unit_test[39]  IPv6アドレスでVS変更(TCP endpoint不一致による失敗ケース)
+       BOOST_MESSAGE( "-------39" );
+       l7vs::virtualservice_element    elem4;
+       elem4.udpmode                                   = false;
+       elem4.tcp_accept_endpoint               = 
+                       tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678:90AB:CDEF:0000:0000:FEDC:BA00" ), (60000) );
+       elem4.udp_recv_endpoint                 = 
+                       udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
+       elem4.realserver_vector.clear();
+       elem4.protocol_module_name              = "PMtest1";
+       elem4.schedule_module_name              = "SMtest1";
+       elem4.protocol_args.clear();
+       elem4.sorry_maxconnection               = 3333LL;
+       elem4.sorry_endpoint                    = tcp_ep_type();
+       elem4.sorry_flag                                = true;
+       elem4.qos_upstream                              = 65535ULL;
+       elem4.qos_downstream                    = 32767ULL;
+
+       vs->edit_virtualservice( elem4, vs_err );
+       BOOST_CHECK( vs_err == true );
+       BOOST_CHECK( vs->get_element().sorry_endpoint == tcp_ep_type() );
+       BOOST_CHECK( vs->get_element().sorry_maxconnection == 0LL );
+       BOOST_CHECK( vs->get_element().sorry_flag == false );
+       BOOST_CHECK( vs->get_element().qos_upstream == elem3.qos_upstream );
+       BOOST_CHECK( vs->get_element().qos_downstream == elem3.qos_downstream );
+
+       // unit_test[40]  IPv6アドレスでRS追加
+       BOOST_MESSAGE( "-------40" );
+       //RSパラメータ設定
+       l7vs::virtualservice_element    elem_add_rs1;
+       elem_add_rs1.udpmode                                    = false;
+       elem_add_rs1.tcp_accept_endpoint                = 
+                       tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678:90AB:CDEF:0000:0000:FEDC:BA09" ), (60000) );
+       elem_add_rs1.udp_recv_endpoint                  = 
+                       udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
+       elem_add_rs1.realserver_vector.clear();
+       elem_add_rs1.protocol_module_name               = "PMtest1";
+       elem_add_rs1.schedule_module_name               = "SMtest1";
+       elem_add_rs1.protocol_args.clear();
+       elem_add_rs1.sorry_maxconnection                = 1234LL;
+       elem_add_rs1.sorry_endpoint                             = tcp_ep_type();
+       elem_add_rs1.sorry_flag                                 = false;
+       elem_add_rs1.qos_upstream                               = 65535ULL;
+       elem_add_rs1.qos_downstream                             = 32767ULL;
+       for( size_t i = 0; i < 10; ++i ){
+               l7vs::realserver_element        rs_elem;
+               rs_elem.tcp_endpoint = 
+                       tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678::0000:0000:90AB:CDEF" ), (i+8080) );
+               elem_add_rs1.realserver_vector.push_back( rs_elem );
+               rs_elem.weight  = i+1;
+       }
+       vs->add_realserver( elem_add_rs1, vs_err );
+       BOOST_CHECK( vs_err == false );
+
+       // unit_test[41]  IPv6アドレスでRS追加(既に追加されているendpointを追加しようとして失敗ケース)
+       BOOST_MESSAGE( "-------41" );
+       //RSパラメータ設定
+       l7vs::virtualservice_element    elem_add_rs2;
+       {
+               elem_add_rs2.udpmode                                    = false;
+               elem_add_rs2.tcp_accept_endpoint                = 
+                               tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678:90AB:CDEF:0000:0000:FEDC:BA09" ), (60000) );
+               elem_add_rs2.udp_recv_endpoint                  = 
+                               udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
+               elem_add_rs2.realserver_vector.clear();
+               elem_add_rs2.protocol_module_name               = "PMtest1";
+               l7vs::realserver_element        rs_elem;
+               rs_elem.tcp_endpoint = 
+                               tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678::0000:0000:90AB:CDEF" ), (8080) );
+               rs_elem.weight  = 10;
+               elem_add_rs2.realserver_vector.push_back( rs_elem );
+       }
+       vs->add_realserver( elem_add_rs2, vs_err );
+       BOOST_CHECK( vs_err == true );
+
+       // unit_test[42]  IPv6アドレスでRS追加(VSが不一致で失敗ケース)
+       BOOST_MESSAGE( "-------42" );
+       l7vs::virtualservice_element    elem_add_rs3;
+       {
+               elem_add_rs3.udpmode                                    = false;
+               elem_add_rs3.tcp_accept_endpoint                = 
+                               tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678:90AB:CDEF:0000:0000:FEDC:0009" ), (60000) );
+               elem_add_rs3.udp_recv_endpoint                  = 
+                               udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
+               elem_add_rs3.realserver_vector.clear();
+               elem_add_rs3.protocol_module_name               = "PMtest1";
+               l7vs::realserver_element        rs_elem;
+               rs_elem.tcp_endpoint = 
+                               tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678::0000:0000:90AB:CDEF" ), (6006) );
+               rs_elem.weight  = 10;
+               elem_add_rs3.realserver_vector.push_back( rs_elem );
+       }
+       vs->add_realserver( elem_add_rs2, vs_err );
+       BOOST_CHECK( vs_err == true );
+
+       // unit_test[43]  IPv6アドレスでRS編集
+       BOOST_MESSAGE( "-------43" );
+       l7vs::virtualservice_element    elem_edit_rs1;
+       {
+               elem_edit_rs1.udpmode                                   = false;
+               elem_edit_rs1.tcp_accept_endpoint               = 
+                               tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678:90AB:CDEF:0000:0000:FEDC:BA09" ), (60000) );
+               elem_edit_rs1.udp_recv_endpoint                 = 
+                               udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
+               elem_edit_rs1.realserver_vector.clear();
+               elem_edit_rs1.protocol_module_name              = "PMtest1";
+               l7vs::realserver_element        rs_elem;
+               rs_elem.tcp_endpoint = 
+                               tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678::0000:0000:90AB:CDEF" ), (8080) );
+               rs_elem.weight  = 10;
+               elem_edit_rs1.realserver_vector.push_back( rs_elem );
+       }
+       vs->edit_realserver( elem_edit_rs1, vs_err );
+       BOOST_CHECK( vs_err == false );
+       BOOST_CHECK( vs->get_rs_list().begin()->weight == 10 );
+
+       // unit_test[44]  IPv6アドレスでRS編集(リストに一致するRSが存在しないので失敗する)
+       BOOST_MESSAGE( "-------44" );
+       l7vs::virtualservice_element    elem_edit_rs2;
+       {
+               elem_edit_rs2.udpmode                                   = false;
+               elem_edit_rs2.tcp_accept_endpoint               = 
+                               tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678:90AB:CDEF:0000:0000:FEDC:BA09" ), (60000) );
+               elem_edit_rs2.udp_recv_endpoint                 = 
+                               udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
+               elem_edit_rs2.realserver_vector.clear();
+               elem_edit_rs2.protocol_module_name              = "PMtest1";
+               l7vs::realserver_element        rs_elem;
+               rs_elem.tcp_endpoint = 
+                               tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678::0000:0000:90AB:3891" ), (8080) );
+               rs_elem.weight  = 10;
+               elem_edit_rs2.realserver_vector.push_back( rs_elem );
+       }
+       vs->edit_realserver( elem_edit_rs2, vs_err );
+       BOOST_CHECK( vs_err == true );
+
+       // unit_test[45]  IPv6アドレスでRS編集(VSが不一致で失敗する)
+       BOOST_MESSAGE( "-------45" );
+       l7vs::virtualservice_element    elem_edit_rs3;
+       {
+               elem_edit_rs3.udpmode                                   = false;
+               elem_edit_rs3.tcp_accept_endpoint               = 
+                               tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678:90AB:CDEF:0000:0000:FEDC:0009" ), (60000) );
+               elem_edit_rs3.udp_recv_endpoint                 = 
+                               udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
+               elem_edit_rs3.realserver_vector.clear();
+               elem_edit_rs3.protocol_module_name              = "PMtest1";
+               l7vs::realserver_element        rs_elem;
+               rs_elem.tcp_endpoint = 
+                               tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678::0000:0000:90AB:CDEF" ), (8080) );
+               rs_elem.weight  = 10;
+               elem_edit_rs3.realserver_vector.push_back( rs_elem );
+       }
+       vs->edit_realserver( elem_edit_rs3, vs_err );
+       BOOST_CHECK( vs_err == true );
+
+       // unit_test[46]  IPv6アドレスでRS削除(VSが一致しないので失敗する)
+       BOOST_MESSAGE( "-------46" );
+       l7vs::virtualservice_element    elem_del_rs1;
+       {
+               elem_del_rs1.udpmode                                    = false;
+               elem_del_rs1.tcp_accept_endpoint                = 
+                               tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678:90AB:CDEF:0000:0000:FEDC:0009" ), (60000) );
+               elem_del_rs1.udp_recv_endpoint                  = 
+                               udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
+               elem_del_rs1.realserver_vector.clear();
+               elem_del_rs1.protocol_module_name               = "PMtest1";
+               l7vs::realserver_element        rs_elem;
+               rs_elem.tcp_endpoint = 
+                               tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678::0000:0000:90AB:CDEF" ), (8080) );
+               rs_elem.weight  = 10;
+               elem_del_rs1.realserver_vector.push_back( rs_elem );
+       }
+       vs->del_realserver( elem_del_rs1, vs_err );
+       BOOST_CHECK( vs_err == true );
+
+       // unit_test[47]  IPv6アドレスでRS削除(リストに一致するRSが存在しないので失敗する)
+       BOOST_MESSAGE( "-------47" );
+       l7vs::virtualservice_element    elem_del_rs2;
+       {
+               elem_del_rs2.udpmode                                    = false;
+               elem_del_rs2.tcp_accept_endpoint                = 
+                               tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678:90AB:CDEF:0000:0000:FEDC:BA09" ), (60000) );
+               elem_del_rs2.udp_recv_endpoint                  = 
+                               udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
+               elem_del_rs2.realserver_vector.clear();
+               elem_del_rs2.protocol_module_name               = "PMtest1";
+               l7vs::realserver_element        rs_elem;
+               rs_elem.tcp_endpoint = 
+                               tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678::0000:0000:1111:CDEF" ), (8080) );
+               rs_elem.weight  = 10;
+               elem_del_rs2.realserver_vector.push_back( rs_elem );
+       }
+       vs->del_realserver( elem_del_rs2, vs_err );
+       BOOST_CHECK( vs_err == true );
+
+       // unit_test[48]  IPv6アドレスでRS削除
+       BOOST_MESSAGE( "-------48" );
+       l7vs::virtualservice_element    elem_del_rs3;
+       {
+               elem_del_rs3.udpmode                                    = false;
+               elem_del_rs3.tcp_accept_endpoint                = 
+                               tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678:90AB:CDEF:0000:0000:FEDC:BA09" ), (60000) );
+               elem_del_rs3.udp_recv_endpoint                  = 
+                               udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
+               elem_del_rs3.realserver_vector.clear();
+               elem_del_rs3.protocol_module_name               = "PMtest1";
+               l7vs::realserver_element        rs_elem;
+               rs_elem.tcp_endpoint = 
+                               tcp_ep_type( boost::asio::ip::address::from_string( "1234:5678::0000:0000:90AB:CDEF" ), (8080) );
+               rs_elem.weight  = 10;
+               elem_del_rs3.realserver_vector.push_back( rs_elem );
+       }
+       vs->del_realserver( elem_del_rs3, vs_err );
+       BOOST_CHECK( vs_err == false );
+       BOOST_CHECK( vs->get_rs_list().size() == 9 );
+
+       vs->finalize( vs_err );
+       delete vs;
 }
 
-void   datasize_access_test(){
-       //update_up_recvを複数スレッドから同時に呼ぶ
-       //update_up_sendを複数スレッドから同時に呼ぶ
-       //update_down_recvを複数スレッドから同時に呼ぶ
-       //update_down_sendを複数スレッドから同時に呼ぶ
-       //update_throughputとupdate_up_recvを複数スレッドから同時に呼ぶ
-       //update_throughputとupdate_up_sendを複数スレッドから同時に呼ぶ
-       //update_throughputとupdate_down_recvを複数スレッドから同時に呼ぶ
-       //update_throughputとupdate_down_sendを複数スレッドから同時に呼ぶ
-       //update_throughputとget_throughput_upを複数スレッドから同時に呼ぶ
-       //update_throughputとget_throughput_downを複数スレッドから同時に呼ぶ
+//実際にAcceptさせるテスト
+void   virtualservice_tcp_test5(){
+       // unit_test[49]  ClientからConnectさせてAcceptすることを確認する
+       BOOST_MESSAGE( "-------49" );
+       debugg_flug_struct::getInstance().param_exist_flag() = false;
+       debugg_flug_struct::getInstance().pmcontrol_err_flag()  = false;
+       debugg_flug_struct::getInstance().smcontrol_err_flag()  = false;
+
+       l7vs::error_code                        vs_err;
+       boost::system::error_code       test_err;
+
+       std::stringstream       tmp_tcp_ep;
+       std::stringstream       tmp_udp_ep;
+       std::stringstream       tmp_sorry_ep;
+
+       l7vs::l7vsd                                     vsd;
+       boost::asio::io_service         dispatcher;
+       l7vs::replication                       rep( dispatcher );
+       l7vs::virtualservice_element    elem1;
+
+       //set element value
+       elem1.udpmode                                   = false;
+       elem1.tcp_accept_endpoint               = 
+                       tcp_ep_type( boost::asio::ip::address::from_string( "10.144.169.87" ), (60000) );
+       elem1.udp_recv_endpoint                 = udp_ep_type( boost::asio::ip::address::from_string( "10.144.169.20" ), (50000) );
+       elem1.realserver_vector.clear();
+       elem1.protocol_module_name              = "PMtest1";
+       elem1.schedule_module_name              = "SMtest1";
+       elem1.protocol_args.clear();
+       elem1.sorry_maxconnection               = 1234LL;
+       elem1.sorry_endpoint                    = 
+                       tcp_ep_type( boost::asio::ip::address::from_string( "AFAF:0E08::8FDE" ), (8080) );
+       elem1.sorry_flag                                = false;
+       elem1.qos_upstream                              = 65535ULL;
+       elem1.qos_downstream                    = 32767ULL;
+
+       //vs作成
+       l7vs::vs_tcp*   vs = new l7vs::vs_tcp( vsd, rep, elem1 );
+       vs->initialize( vs_err );
+
+       boost::thread   vs_main( &l7vs::vs_tcp::run, vs );
+       boost::thread   cl_thread( &client );
+
+       //3秒待ってmainをSTOP
+       usleep( 3000000 );
+       vs->stop();
+
+       usleep( 1000 );
+       cl_thread.join();
+       vs_main.join();
+
+       vs->finalize( vs_err );
+       delete vs;
 }
 
 test_suite*    init_unit_test_suite( int argc, char* argv[] ){
@@ -550,12 +1150,10 @@ test_suite*      init_unit_test_suite( int argc, char* argv[] ){
        ts->add( BOOST_TEST_CASE( &virtualservice_tcp_test1 ) );
        ts->add( BOOST_TEST_CASE( &virtualservice_tcp_test2 ) );
        ts->add( BOOST_TEST_CASE( &virtualservice_tcp_test3 ) );
+       ts->add( BOOST_TEST_CASE( &virtualservice_tcp_test4 ) );
+       ts->add( BOOST_TEST_CASE( &virtualservice_tcp_test5 ) );
 
        framework::master_test_suite().add( ts );
 
        return 0;
 }
-
-
-
-
index 4c6b05b..e60f36a 100644 (file)
@@ -13,8 +13,7 @@ protected:
        boost::xtime    diffelencial_time;
        void    handle_replication_interrupt( const boost::system::error_code& err ){
        }
-       bool    read_replicationdata( replication_data& in_rep_data ){
-               return true;
+       void    read_replicationdata(){
        }
 
 public: