OSDN Git Service

ソースツリー再構成中(ほぼOK?)
[ultramonkey-l7/ultramonkey-l7-v3.git] / l7vsd / unit_tests / schedule_module_test / schedule_module_lc_test.cpp
1 #include <iostream>
2 #include <dlfcn.h>
3 #include <boost/test/included/unit_test.hpp>
4 #include <boost/function.hpp>
5 #include "schedule_module_base.h"
6 #include "logger.h"
7 #include "parameter.h"
8
9 #include "logger_stub.cpp"
10 #include "parameter_stub.cpp"
11
12 #include "schedule_module_control.h"
13 #include "../../module/schedule/schedule_module_lc.cpp"
14
15 using namespace boost::unit_test;
16
17 #define CHECK_NAME      "lc"
18 #define SM1                     "schedule_module_lc"
19
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 );
25
26 //test case1.
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;
30
31         // unit_test[1]  インスタンス作成のテスト
32         BOOST_MESSAGE( "unit_test[1]" );
33         control.initialize( "." );
34         try{
35 //              schedule_module_lc = create_module();
36                 schedule_module_lc = control.load_module( SM1 );
37         }
38         catch(...){
39 //              BOOST_ERROR( "exception : create_module" );
40                 BOOST_ERROR( "exception : load_module" );
41         }
42         BOOST_CHECK( NULL != schedule_module_lc );
43
44         // unit_test[2]  get_nameメソッドのテスト
45         BOOST_MESSAGE( "unit_test[2]" );
46         BOOST_CHECK_EQUAL( CHECK_NAME, schedule_module_lc->get_name() );
47
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 );
54
55         // unit_test[3]  init_logger_functionsメソッドのテスト
56         schedule_module_lc->init_logger_functions(      getloglevel,
57                                                                                                         putLogFatal,
58                                                                                                         putLogError,
59                                                                                                         putLogWarn,
60                                                                                                         putLogInfo,
61                                                                                                         putLogDebug);
62
63         // unit_test[4]  initializeメソッドのテスト
64         BOOST_MESSAGE( "unit_test[4]" );
65         schedule_module_lc->initialize();
66
67         // unit_test[5]  is_tcpメソッドのテスト
68         BOOST_MESSAGE( "unit_test[5]" );
69         BOOST_CHECK_EQUAL( true, schedule_module_lc->is_tcp() );
70
71         // unit_test[6]  is_udpメソッドのテスト(UDP非対応)
72         BOOST_MESSAGE( "unit_test[6]" );
73         BOOST_CHECK_EQUAL( false, schedule_module_lc->is_udp() );
74
75         boost::thread::id                                                       thread_id;
76         l7vs::schedule_module_base::rslist_type         rs_list;
77         l7vs::realserver        server1, server2, server3, server4;
78
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;
82
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 ;
86
87         schedule_module_lc->handle_schedule( thread_id, rslist_begin, rslist_end, rslist_next, endpoint1 ) ;
88         BOOST_CHECK( endpoint3 == endpoint1 );
89
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 );
95
96         schedule_module_lc->handle_schedule( thread_id, rslist_begin, rslist_end, rslist_next, endpoint1 ) ;
97         BOOST_CHECK( endpoint3 == endpoint1 );
98
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  ) ;
102         server1.weight = 0;
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  ) ;
105         server2.weight = 0;
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  ) ;
108         server3.weight = 0;
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  ) ;
111         server4.weight = 0;
112         rs_list.push_back( server4 );
113
114         schedule_module_lc->handle_schedule( thread_id, rslist_begin, rslist_end, rslist_next, endpoint1 ) ;
115         BOOST_CHECK( endpoint3 == endpoint1 );
116
117         // unit_test[10]  handle_schedule(tcp)メソッドのテスト4(重みが設定されているのでserver1が返る)
118         BOOST_MESSAGE( "unit_test[10]" );
119         rs_list.clear();
120         server1.weight = 2;
121         rs_list.push_back( server1 );
122         server2.weight = 1;
123         rs_list.push_back( server2 );
124         server3.weight = 3;
125         rs_list.push_back( server3 );
126         server4.weight = 0;
127         rs_list.push_back( server4 );
128
129         schedule_module_lc->handle_schedule( thread_id, rslist_begin, rslist_end, rslist_next, endpoint1 ) ;
130         BOOST_CHECK( server1.tcp_endpoint == endpoint1 );
131
132         // unit_test[11]  handle_schedule(tcp)メソッドのテスト5(重みが設定されているので次に接続数の少ないserver2が返る)
133         BOOST_MESSAGE( "unit_test[11]" );
134         rs_list.clear();
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 );
142
143         // unit_test[12]  handle_schedule(tcp)メソッドのテスト6(重みが設定されているので次に接続数の少ないserver3が返る)
144         BOOST_MESSAGE( "unit_test[12]" );
145         rs_list.clear();
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 );
153
154         // unit_test[13]  handle_schedule(tcp)メソッドのテスト7(server4には重みがないので、一巡し重みが設定されているserver1が返る)
155         BOOST_MESSAGE( "unit_test[13]" );
156         rs_list.clear();
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 );
164
165
166         // unit_test[14]  handle_schedule(udp)メソッドのテスト(UDPは非対応 endpoint2は更新されない)
167         BOOST_MESSAGE( "unit_test[14]" );
168         boost::asio::ip::udp::endpoint endpoint2, endpoint4 ;
169
170         rs_list.clear();
171         server1.udp_endpoint = boost::asio::ip::udp::endpoint ( boost::asio::ip::address::from_string( "10.144.169.87" ), 22  ) ;
172         server1.weight = 2;
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  ) ;
175         server2.weight = 1;
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  ) ;
178         server3.weight = 3;
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  ) ;
181         server4.weight = 0;
182         rs_list.push_back( server4 );
183
184         schedule_module_lc->handle_schedule( thread_id, rslist_begin, rslist_end, rslist_next, endpoint2 ) ;
185         BOOST_CHECK( endpoint4 == endpoint2 );
186
187
188         // unit_test[15]  replication_interruptメソッドのテスト
189         BOOST_MESSAGE( "unit_test[15]" );
190         schedule_module_lc->replication_interrupt();
191
192         // unit_test[16]  handle_schedule(tcp)メソッドのテスト8 server3が返る
193         BOOST_MESSAGE( "unit_test[16]" );
194         rs_list.clear();
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 );
209
210 //      destroy_module( schedule_module_lc );
211         control.unload_module( schedule_module_lc );
212         control.finalize();
213 }
214
215 //l7vs::schedule_module_base::rslist_type::iterator     list_begin( l7vs::schedule_module_base::rslist_type& list ){
216 //      return(list.begin());
217 //}
218
219 //l7vs::schedule_module_base::rslist_type::iterator     list_end( l7vs::schedule_module_base::rslist_type& list ){
220 //      return(list.end());
221 //}
222
223 l7vs::schedule_module_base::rslist_type::iterator       list_begin( l7vs::schedule_module_base::rslist_type* list ){
224         return(list->begin());
225 }
226
227 l7vs::schedule_module_base::rslist_type::iterator       list_end( l7vs::schedule_module_base::rslist_type* list ){
228         return(list->end());
229 }
230
231 l7vs::schedule_module_base::rslist_type::iterator       list_next( l7vs::schedule_module_base::rslist_type::iterator itr ){
232         return(++itr);
233 }
234
235 test_suite*     init_unit_test_suite( int argc, char* argv[] ){
236         l7vs::Logger    logger;
237         l7vs::Parameter parameter;
238
239         logger.loadConf();
240
241         // create unit test suite
242         test_suite* ts = BOOST_TEST_SUITE( "schedule_module_lc_test" );
243
244         // add test case to test suite
245         ts->add( BOOST_TEST_CASE( &schedule_module_test ) );
246
247         framework::master_test_suite().add( ts );
248
249         return 0;
250 }
251