3 #include <boost/test/included/unit_test.hpp>
4 #include <boost/function.hpp>
5 #include "schedule_module_base.h"
9 #include "logger_stub.cpp"
10 #include "parameter_stub.cpp"
12 #include "schedule_module_control.h"
13 #include "../../module/schedule/schedule_module_lc.cpp"
15 using namespace boost::unit_test;
17 #define CHECK_NAME "lc"
18 #define SM1 "schedule_module_lc"
20 //l7vs::schedule_module_base::rslist_type::iterator list_begin( l7vs::schedule_module_base::rslist_type& list );
21 //l7vs::schedule_module_base::rslist_type::iterator list_end( l7vs::schedule_module_base::rslist_type& list );
22 l7vs::schedule_module_base::rslist_type::iterator list_begin( l7vs::schedule_module_base::rslist_type* list );
23 l7vs::schedule_module_base::rslist_type::iterator list_end( l7vs::schedule_module_base::rslist_type* list );
24 l7vs::schedule_module_base::rslist_type::iterator list_next( l7vs::schedule_module_base::rslist_type::iterator itr );
27 void schedule_module_test(){
28 l7vs::schedule_module_control& control = l7vs::schedule_module_control::getInstance();
29 l7vs::schedule_module_base* schedule_module_lc = NULL;
31 // unit_test[1] インスタンス作成のテスト
32 BOOST_MESSAGE( "unit_test[1]" );
33 control.initialize( "." );
35 // schedule_module_lc = create_module();
36 schedule_module_lc = control.load_module( SM1 );
39 // BOOST_ERROR( "exception : create_module" );
40 BOOST_ERROR( "exception : load_module" );
42 BOOST_CHECK( NULL != schedule_module_lc );
44 // unit_test[2] get_nameメソッドのテスト
45 BOOST_MESSAGE( "unit_test[2]" );
46 BOOST_CHECK_EQUAL( CHECK_NAME, schedule_module_lc->get_name() );
48 l7vs::module_base::getloglevel_func_type getloglevel = boost::bind( &( l7vs::Logger::getLogLevel ), l7vs::LOG_CAT_SCHEDULE );
49 l7vs::module_base::logger_func_type putLogFatal = boost::bind( &( l7vs::Logger::putLogFatal ), l7vs::LOG_CAT_SCHEDULE, _1, _2, _3, _4 );
50 l7vs::module_base::logger_func_type putLogError = boost::bind( &( l7vs::Logger::putLogError ), l7vs::LOG_CAT_SCHEDULE, _1, _2, _3, _4 );
51 l7vs::module_base::logger_func_type putLogWarn = boost::bind( &( l7vs::Logger::putLogWarn ), l7vs::LOG_CAT_SCHEDULE, _1, _2, _3, _4 );
52 l7vs::module_base::logger_func_type putLogInfo = boost::bind( &( l7vs::Logger::putLogInfo ), l7vs::LOG_CAT_SCHEDULE, _1, _2, _3, _4 );
53 l7vs::module_base::logger_func_type putLogDebug = boost::bind( &( l7vs::Logger::putLogDebug ), l7vs::LOG_CAT_SCHEDULE, _1, _2, _3, _4 );
55 // unit_test[3] init_logger_functionsメソッドのテスト
56 schedule_module_lc->init_logger_functions( getloglevel,
63 // unit_test[4] initializeメソッドのテスト
64 BOOST_MESSAGE( "unit_test[4]" );
65 schedule_module_lc->initialize();
67 // unit_test[5] is_tcpメソッドのテスト
68 BOOST_MESSAGE( "unit_test[5]" );
69 BOOST_CHECK_EQUAL( true, schedule_module_lc->is_tcp() );
71 // unit_test[6] is_udpメソッドのテスト(UDP非対応)
72 BOOST_MESSAGE( "unit_test[6]" );
73 BOOST_CHECK_EQUAL( false, schedule_module_lc->is_udp() );
75 boost::thread::id thread_id;
76 l7vs::schedule_module_base::rslist_type rs_list;
77 l7vs::realserver server1, server2, server3, server4;
79 l7vs::schedule_module_base::rslist_iterator_begin_func_type rslist_begin;
80 l7vs::schedule_module_base::rslist_iterator_end_func_type rslist_end;
81 l7vs::schedule_module_base::rslist_iterator_next_func_type rslist_next;
83 // unit_test[7] handle_schedule(tcp)メソッドのテスト(boost::functionのempty評価のため空のままイテレターメソッドを渡す endpoint1は更新されない)
84 BOOST_MESSAGE( "unit_test[7]" );
85 boost::asio::ip::tcp::endpoint endpoint1, endpoint3 ;
87 schedule_module_lc->handle_schedule( thread_id, rslist_begin, rslist_end, rslist_next, endpoint1 ) ;
88 BOOST_CHECK( endpoint3 == endpoint1 );
90 // unit_test[8] handle_schedule(tcp)メソッドのテスト2(リストの内容が空 endpoint1は更新されない)
91 BOOST_MESSAGE( "unit_test[8]" );
92 rslist_begin = boost::bind( &list_begin, &rs_list );
93 rslist_end = boost::bind( &list_end, &rs_list );
94 rslist_next = boost::bind( &list_next, _1 );
96 schedule_module_lc->handle_schedule( thread_id, rslist_begin, rslist_end, rslist_next, endpoint1 ) ;
97 BOOST_CHECK( endpoint3 == endpoint1 );
99 // unit_test[9] handle_schedule(tcp)メソッドのテスト3(リストの項目が全て振り分け無し endpoint1は更新されない)
100 BOOST_MESSAGE( "unit_test[9]" );
101 server1.tcp_endpoint = boost::asio::ip::tcp::endpoint ( boost::asio::ip::address::from_string( "10.144.169.87" ), 22 ) ;
103 rs_list.push_back( server1 );
104 server2.tcp_endpoint = boost::asio::ip::tcp::endpoint ( boost::asio::ip::address::from_string( "10.144.169.86" ), 21 ) ;
106 rs_list.push_back( server2 );
107 server3.tcp_endpoint = boost::asio::ip::tcp::endpoint ( boost::asio::ip::address::from_string( "10.144.169.85" ), 20 ) ;
109 rs_list.push_back( server3 );
110 server4.tcp_endpoint = boost::asio::ip::tcp::endpoint ( boost::asio::ip::address::from_string( "10.144.169.84" ), 19 ) ;
112 rs_list.push_back( server4 );
114 schedule_module_lc->handle_schedule( thread_id, rslist_begin, rslist_end, rslist_next, endpoint1 ) ;
115 BOOST_CHECK( endpoint3 == endpoint1 );
117 // unit_test[10] handle_schedule(tcp)メソッドのテスト4(重みが設定されているのでserver1が返る)
118 BOOST_MESSAGE( "unit_test[10]" );
121 rs_list.push_back( server1 );
123 rs_list.push_back( server2 );
125 rs_list.push_back( server3 );
127 rs_list.push_back( server4 );
129 schedule_module_lc->handle_schedule( thread_id, rslist_begin, rslist_end, rslist_next, endpoint1 ) ;
130 BOOST_CHECK( server1.tcp_endpoint == endpoint1 );
132 // unit_test[11] handle_schedule(tcp)メソッドのテスト5(重みが設定されているので次に接続数の少ないserver2が返る)
133 BOOST_MESSAGE( "unit_test[11]" );
135 server1.increment_active();
136 rs_list.push_back( server1 );
137 rs_list.push_back( server2 );
138 rs_list.push_back( server3 );
139 rs_list.push_back( server4 );
140 schedule_module_lc->handle_schedule( thread_id, rslist_begin, rslist_end, rslist_next, endpoint1 ) ;
141 BOOST_CHECK( server2.tcp_endpoint == endpoint1 );
143 // unit_test[12] handle_schedule(tcp)メソッドのテスト6(重みが設定されているので次に接続数の少ないserver3が返る)
144 BOOST_MESSAGE( "unit_test[12]" );
146 rs_list.push_back( server1 );
147 server2.increment_active();
148 rs_list.push_back( server2 );
149 rs_list.push_back( server3 );
150 rs_list.push_back( server4 );
151 schedule_module_lc->handle_schedule( thread_id, rslist_begin, rslist_end, rslist_next, endpoint1 ) ;
152 BOOST_CHECK( server3.tcp_endpoint == endpoint1 );
154 // unit_test[13] handle_schedule(tcp)メソッドのテスト7(server4には重みがないので、一巡し重みが設定されているserver1が返る)
155 BOOST_MESSAGE( "unit_test[13]" );
157 rs_list.push_back( server1 );
158 rs_list.push_back( server2 );
159 server3.increment_active();
160 rs_list.push_back( server3 );
161 rs_list.push_back( server4 );
162 schedule_module_lc->handle_schedule( thread_id, rslist_begin, rslist_end, rslist_next, endpoint1 ) ;
163 BOOST_CHECK( server1.tcp_endpoint == endpoint1 );
166 // unit_test[14] handle_schedule(udp)メソッドのテスト(UDPは非対応 endpoint2は更新されない)
167 BOOST_MESSAGE( "unit_test[14]" );
168 boost::asio::ip::udp::endpoint endpoint2, endpoint4 ;
171 server1.udp_endpoint = boost::asio::ip::udp::endpoint ( boost::asio::ip::address::from_string( "10.144.169.87" ), 22 ) ;
173 rs_list.push_back( server1 );
174 server2.udp_endpoint = boost::asio::ip::udp::endpoint ( boost::asio::ip::address::from_string( "10.144.169.86" ), 21 ) ;
176 rs_list.push_back( server2 );
177 server3.udp_endpoint = boost::asio::ip::udp::endpoint ( boost::asio::ip::address::from_string( "10.144.169.85" ), 20 ) ;
179 rs_list.push_back( server3 );
180 server4.udp_endpoint = boost::asio::ip::udp::endpoint ( boost::asio::ip::address::from_string( "10.144.169.84" ), 19 ) ;
182 rs_list.push_back( server4 );
184 schedule_module_lc->handle_schedule( thread_id, rslist_begin, rslist_end, rslist_next, endpoint2 ) ;
185 BOOST_CHECK( endpoint4 == endpoint2 );
188 // unit_test[15] replication_interruptメソッドのテスト
189 BOOST_MESSAGE( "unit_test[15]" );
190 schedule_module_lc->replication_interrupt();
192 // unit_test[16] handle_schedule(tcp)メソッドのテスト8 server3が返る
193 BOOST_MESSAGE( "unit_test[16]" );
195 server1.increment_active();
196 server1.increment_active();
197 server1.increment_active();
198 rs_list.push_back( server1 );
199 server2.increment_active();
200 server2.increment_active();
201 rs_list.push_back( server2 );
202 server3.increment_active();
203 rs_list.push_back( server3 );
204 server4.increment_active();
205 server4.increment_active();
206 rs_list.push_back( server4 );
207 schedule_module_lc->handle_schedule( thread_id, rslist_begin, rslist_end, rslist_next, endpoint1 ) ;
208 BOOST_CHECK( server3.tcp_endpoint == endpoint1 );
210 // destroy_module( schedule_module_lc );
211 control.unload_module( schedule_module_lc );
215 //l7vs::schedule_module_base::rslist_type::iterator list_begin( l7vs::schedule_module_base::rslist_type& list ){
216 // return(list.begin());
219 //l7vs::schedule_module_base::rslist_type::iterator list_end( l7vs::schedule_module_base::rslist_type& list ){
220 // return(list.end());
223 l7vs::schedule_module_base::rslist_type::iterator list_begin( l7vs::schedule_module_base::rslist_type* list ){
224 return(list->begin());
227 l7vs::schedule_module_base::rslist_type::iterator list_end( l7vs::schedule_module_base::rslist_type* list ){
231 l7vs::schedule_module_base::rslist_type::iterator list_next( l7vs::schedule_module_base::rslist_type::iterator itr ){
235 test_suite* init_unit_test_suite( int argc, char* argv[] ){
237 l7vs::Parameter parameter;
241 // create unit test suite
242 test_suite* ts = BOOST_TEST_SUITE( "schedule_module_lc_test" );
244 // add test case to test suite
245 ts->add( BOOST_TEST_CASE( &schedule_module_test ) );
247 framework::master_test_suite().add( ts );