2 #include <boost/test/included/unit_test.hpp>
3 #include <boost/thread/condition.hpp>
4 #include "realserver.h"
8 //class l7vs::realserver;
10 using namespace boost::unit_test;
16 class realserver_fake : public realserver
19 boost::mutex starting_mutex;
20 boost::condition starting_condition;
27 void set_active( const int in_active ){
28 boost::mutex::scoped_lock lock( *active_mutex_ptr );
32 void set_inact( const int in_inact ){
33 boost::mutex::scoped_lock lock( *inact_mutex_ptr );
38 void increment_active2( const std::string& msg1, const std::string& msg2, const std::string& msg3, const std::string& msg4 ){
40 boost::mutex::scoped_lock lock( starting_mutex );
41 starting_condition.wait( lock );
44 BOOST_MESSAGE( msg1 );
45 // increment_active();
47 boost::mutex::scoped_lock lock( *active_mutex_ptr );
49 BOOST_MESSAGE( msg3 );
51 if ( nactive == INT_MAX ){
54 BOOST_MESSAGE( msg4 );
57 BOOST_MESSAGE( msg2 );
60 void decrement_active2( const std::string& msg1, const std::string& msg2, const std::string& msg3, const std::string& msg4 ){
62 boost::mutex::scoped_lock lock( starting_mutex );
63 starting_condition.wait( lock );
66 BOOST_MESSAGE( msg1 );
67 // decrement_active();
69 boost::mutex::scoped_lock lock( *active_mutex_ptr );
71 BOOST_MESSAGE( msg3 );
75 BOOST_MESSAGE( msg4 );
78 BOOST_MESSAGE( msg2 );
81 void increment_inact2( const std::string& msg1, const std::string& msg2, const std::string& msg3, const std::string& msg4 ){
83 boost::mutex::scoped_lock lock( starting_mutex );
84 starting_condition.wait( lock );
87 BOOST_MESSAGE( msg1 );
90 boost::mutex::scoped_lock lock( *inact_mutex_ptr );
92 BOOST_MESSAGE( msg3 );
94 if ( ninact == INT_MAX ){
97 BOOST_MESSAGE( msg4 );
100 BOOST_MESSAGE( msg2 );
106 l7vs::realserver_fake rush_server;
108 void starting_thread( int id )
111 std::stringstream msg1, msg2, msg3, msg4;
113 msg1 << "start increment_active <Thread:" << id << ">";
114 msg2 << "complete increment_active <Thread:" << id << ">";
115 msg3 << "start inside <Thread:" << id << ">";
116 msg4 << "complete inside <Thread:" << id << ">";
117 rush_server.increment_active2( msg1.str(), msg2.str(), msg3.str(), msg4.str() );
120 std::stringstream msg1, msg2, msg3, msg4;
122 msg1 << "start decrement_active <Thread:" << id << ">";
123 msg2 << "complete decrement_active <Thread:" << id << ">";
124 msg3 << "start inside <Thread:" << id << ">";
125 msg4 << "complete inside <Thread:" << id << ">";
126 rush_server.decrement_active2( msg1.str(), msg2.str(), msg3.str(), msg4.str() );
129 std::stringstream msg1, msg2, msg3, msg4;
131 msg1 << "start increment_inact <Thread:" << id << ">";
132 msg2 << "complete increment_inact <Thread:" << id << ">";
133 msg3 << "start inside <Thread:" << id << ">";
134 msg4 << "complete inside <Thread:" << id << ">";
135 rush_server.increment_inact2( msg1.str(), msg2.str(), msg3.str(), msg4.str() );
141 void realserver_test(){
144 unsigned long long send_byte = 0ULL;
147 // unit_test[1] コンストラクタのテスト(全てが初期化済み)
148 l7vs::realserver server1;
150 BOOST_CHECK_EQUAL( nactive, server1.get_active() );
151 BOOST_CHECK_EQUAL( ninact, server1.get_inact() );
152 BOOST_CHECK_EQUAL( send_byte, server1.send_byte );
153 BOOST_CHECK_EQUAL( weight, server1.weight );
155 // unit_test[2] コピーコンストラクタのテスト(全てがコピー元と同じ)
156 server1.tcp_endpoint = boost::asio::ip::tcp::endpoint ( boost::asio::ip::address::from_string( "11.11.11.11" ), 11 ) ;
157 server1.udp_endpoint = boost::asio::ip::udp::endpoint ( boost::asio::ip::address::from_string( "22.22.22.22" ), 22 ) ;
158 server1.send_byte = 10;
160 server1.increment_active();
161 server1.increment_inact();
163 l7vs::realserver server2( server1 );
165 BOOST_CHECK_EQUAL( server2.get_active(), server1.get_active() );
166 BOOST_CHECK_EQUAL( server2.get_inact(), server1.get_inact() );
167 BOOST_CHECK_EQUAL( server2.send_byte, server1.send_byte );
168 BOOST_CHECK_EQUAL( server2.weight, server1.weight );
169 BOOST_CHECK( server2.tcp_endpoint == server1.tcp_endpoint );
170 BOOST_CHECK( server2.udp_endpoint == server1.udp_endpoint );
173 // unit_test[3] 比較オペレータのテスト(TCPエンドポイントが異なるとエラー)
174 BOOST_CHECK_EQUAL( ( server1 == server2 ), true );
176 server1.tcp_endpoint = boost::asio::ip::tcp::endpoint ( boost::asio::ip::address::from_string( "33.33.33.33" ), 33 ) ;
177 BOOST_CHECK_EQUAL( ( server1 == server2 ), false );
178 BOOST_CHECK_EQUAL( server2.get_active(), server1.get_active() );
179 BOOST_CHECK_EQUAL( server2.get_inact(), server1.get_inact() );
180 BOOST_CHECK_EQUAL( server2.send_byte, server1.send_byte );
181 BOOST_CHECK_EQUAL( server2.weight, server1.weight );
182 BOOST_CHECK( server2.tcp_endpoint != server1.tcp_endpoint );
183 BOOST_CHECK( server2.udp_endpoint == server1.udp_endpoint );
185 // unit_test[4] 比較オペレータのテスト2(UDPエンドポイントが異なるとエラー)
187 server1.udp_endpoint = boost::asio::ip::udp::endpoint ( boost::asio::ip::address::from_string( "44.44.44.44" ), 44 ) ;
188 BOOST_CHECK_EQUAL( ( server1 == server2 ), false );
189 BOOST_CHECK_EQUAL( server2.get_active(), server1.get_active() );
190 BOOST_CHECK_EQUAL( server2.get_inact(), server1.get_inact() );
191 BOOST_CHECK_EQUAL( server2.send_byte, server1.send_byte );
192 BOOST_CHECK_EQUAL( server2.weight, server1.weight );
193 BOOST_CHECK( server2.tcp_endpoint == server1.tcp_endpoint );
194 BOOST_CHECK( server2.udp_endpoint != server1.udp_endpoint );
196 // unit_test[5] 比較オペレータのテスト3(weightが異なるとエラー)
199 BOOST_CHECK_EQUAL( ( server1 == server2 ), false );
200 BOOST_CHECK_EQUAL( server2.get_active(), server1.get_active() );
201 BOOST_CHECK_EQUAL( server2.get_inact(), server1.get_inact() );
202 BOOST_CHECK_EQUAL( server2.send_byte, server1.send_byte );
203 BOOST_CHECK( server2.weight != server1.weight );
204 BOOST_CHECK( server2.tcp_endpoint == server1.tcp_endpoint );
205 BOOST_CHECK( server2.udp_endpoint == server1.udp_endpoint );
207 // unit_test[6] 比較オペレータのテスト4(接続数が異なっても問題無し)
209 server1.increment_active();
210 BOOST_CHECK_EQUAL( ( server1 == server2 ), true );
211 BOOST_CHECK( server2.get_active() != server1.get_active() );
212 BOOST_CHECK_EQUAL( server2.get_inact(), server1.get_inact() );
213 BOOST_CHECK_EQUAL( server2.send_byte, server1.send_byte );
214 BOOST_CHECK_EQUAL( server2.weight, server1.weight );
215 BOOST_CHECK( server2.tcp_endpoint == server1.tcp_endpoint );
216 BOOST_CHECK( server2.udp_endpoint == server1.udp_endpoint );
218 // unit_test[7] 比較オペレータのテスト5(切断数が異なっても問題無し)
220 server1.increment_inact();
221 BOOST_CHECK_EQUAL( ( server1 == server2 ), true );
222 BOOST_CHECK_EQUAL( server2.get_active(), server1.get_active() );
223 BOOST_CHECK( server2.get_inact() != server1.get_inact() );
224 BOOST_CHECK_EQUAL( server2.send_byte, server1.send_byte );
225 BOOST_CHECK_EQUAL( server2.weight, server1.weight );
226 BOOST_CHECK( server2.tcp_endpoint == server1.tcp_endpoint );
227 BOOST_CHECK( server2.udp_endpoint == server1.udp_endpoint );
229 // unit_test[8] 比較オペレータのテスト6(送信バイト数が異なっても問題無し)
231 server1.send_byte = 100;
232 BOOST_CHECK_EQUAL( ( server1 == server2 ), true );
233 BOOST_CHECK_EQUAL( server2.get_active(), server1.get_active() );
234 BOOST_CHECK_EQUAL( server2.get_inact(), server1.get_inact() );
235 BOOST_CHECK( server2.send_byte != server1.send_byte );
236 BOOST_CHECK_EQUAL( server2.weight, server1.weight );
237 BOOST_CHECK( server2.tcp_endpoint == server1.tcp_endpoint );
238 BOOST_CHECK( server2.udp_endpoint == server1.udp_endpoint );
240 // unit_test[9] 否定オペレータのテスト(TCPエンドポイントが異なると検出)
243 BOOST_CHECK_EQUAL( ( server1 != server2 ), false);
245 server1.tcp_endpoint = boost::asio::ip::tcp::endpoint ( boost::asio::ip::address::from_string( "33.33.33.33" ), 33 ) ;
246 BOOST_CHECK_EQUAL( ( server1 != server2 ), true );
247 BOOST_CHECK_EQUAL( server2.get_active(), server1.get_active() );
248 BOOST_CHECK_EQUAL( server2.get_inact(), server1.get_inact() );
249 BOOST_CHECK_EQUAL( server2.send_byte, server1.send_byte );
250 BOOST_CHECK_EQUAL( server2.weight, server1.weight );
251 BOOST_CHECK( server2.tcp_endpoint != server1.tcp_endpoint );
252 BOOST_CHECK( server2.udp_endpoint == server1.udp_endpoint );
254 // unit_test[10] 否定オペレータのテスト2(UDPエンドポイントが異なると検出)
256 server1.udp_endpoint = boost::asio::ip::udp::endpoint ( boost::asio::ip::address::from_string( "44.44.44.44" ), 44 ) ;
257 BOOST_CHECK_EQUAL( ( server1 != server2 ), true );
258 BOOST_CHECK_EQUAL( server2.get_active(), server1.get_active() );
259 BOOST_CHECK_EQUAL( server2.get_inact(), server1.get_inact() );
260 BOOST_CHECK_EQUAL( server2.send_byte, server1.send_byte );
261 BOOST_CHECK_EQUAL( server2.weight, server1.weight );
262 BOOST_CHECK( server2.tcp_endpoint == server1.tcp_endpoint );
263 BOOST_CHECK( server2.udp_endpoint != server1.udp_endpoint );
265 // unit_test[11] 否定オペレータのテスト3(weightが異なると検出)
268 BOOST_CHECK_EQUAL( ( server1 != server2 ), true );
269 BOOST_CHECK_EQUAL( server2.get_active(), server1.get_active() );
270 BOOST_CHECK_EQUAL( server2.get_inact(), server1.get_inact() );
271 BOOST_CHECK_EQUAL( server2.send_byte, server1.send_byte );
272 BOOST_CHECK( server2.weight != server1.weight );
273 BOOST_CHECK( server2.tcp_endpoint == server1.tcp_endpoint );
274 BOOST_CHECK( server2.udp_endpoint == server1.udp_endpoint );
276 // unit_test[12] 否定オペレータのテスト4(接続数が異なっても問題無し)
278 server1.increment_active();
279 BOOST_CHECK_EQUAL( ( server1 != server2 ), false );
280 BOOST_CHECK( server2.get_active() != server1.get_active() );
281 BOOST_CHECK_EQUAL( server2.get_inact(), server1.get_inact() );
282 BOOST_CHECK_EQUAL( server2.send_byte, server1.send_byte );
283 BOOST_CHECK_EQUAL( server2.weight, server1.weight );
284 BOOST_CHECK( server2.tcp_endpoint == server1.tcp_endpoint );
285 BOOST_CHECK( server2.udp_endpoint == server1.udp_endpoint );
287 // unit_test[13] 否定オペレータのテスト5(切断数が異なっても問題無し)
289 server1.increment_inact();
290 BOOST_CHECK_EQUAL( ( server1 != server2 ), false );
291 BOOST_CHECK_EQUAL( server2.get_active(), server1.get_active() );
292 BOOST_CHECK( server2.get_inact() != server1.get_inact() );
293 BOOST_CHECK_EQUAL( server2.send_byte, server1.send_byte );
294 BOOST_CHECK_EQUAL( server2.weight, server1.weight );
295 BOOST_CHECK( server2.tcp_endpoint == server1.tcp_endpoint );
296 BOOST_CHECK( server2.udp_endpoint == server1.udp_endpoint );
298 // unit_test[14] 否定オペレータのテスト6(送信バイト数が異なっても問題無し)
300 server1.send_byte = 100;
301 BOOST_CHECK_EQUAL( ( server1 != server2 ), false );
302 BOOST_CHECK_EQUAL( server2.get_active(), server1.get_active() );
303 BOOST_CHECK_EQUAL( server2.get_inact(), server1.get_inact() );
304 BOOST_CHECK( server2.send_byte != server1.send_byte );
305 BOOST_CHECK_EQUAL( server2.weight, server1.weight );
306 BOOST_CHECK( server2.tcp_endpoint == server1.tcp_endpoint );
307 BOOST_CHECK( server2.udp_endpoint == server1.udp_endpoint );
309 // unit_test[15] コピーオペレータのテスト(全てがコピー元と同じ)
310 server1 = l7vs::realserver();
313 BOOST_CHECK_EQUAL( server2.get_active(), server1.get_active() );
314 BOOST_CHECK_EQUAL( server2.get_inact(), server1.get_inact() );
315 BOOST_CHECK_EQUAL( server2.send_byte, server1.send_byte );
316 BOOST_CHECK_EQUAL( server2.weight, server1.weight );
317 BOOST_CHECK( server2.tcp_endpoint == server1.tcp_endpoint );
318 BOOST_CHECK( server2.udp_endpoint == server1.udp_endpoint );
320 BOOST_CHECK( server1 == server2 );
322 // unit_test[16] 大小比較オペレータのテスト(TCPエンドポイントが大きいと検出)
323 server1.tcp_endpoint = boost::asio::ip::tcp::endpoint ( boost::asio::ip::address::from_string( "10.144.169.86" ), 21 ) ;
325 BOOST_CHECK_EQUAL( ( server2 < server1 ), true );
326 BOOST_CHECK_EQUAL( server2.get_active(), server1.get_active() );
327 BOOST_CHECK_EQUAL( server2.get_inact(), server1.get_inact() );
328 BOOST_CHECK_EQUAL( server2.send_byte, server1.send_byte );
329 BOOST_CHECK_EQUAL( server2.weight, server1.weight );
330 BOOST_CHECK( server2.tcp_endpoint < server1.tcp_endpoint );
331 BOOST_CHECK( server2.udp_endpoint == server1.udp_endpoint );
333 // unit_test[17] 大小比較オペレータのテスト2(UDPエンドポイントが異なっても問題無し)
335 server1.udp_endpoint = boost::asio::ip::udp::endpoint ( boost::asio::ip::address::from_string( "10.144.169.86" ), 21 ) ;
337 BOOST_CHECK_EQUAL( ( server2 < server1 ), false );
338 BOOST_CHECK_EQUAL( server2.get_active(), server1.get_active() );
339 BOOST_CHECK_EQUAL( server2.get_inact(), server1.get_inact() );
340 BOOST_CHECK_EQUAL( server2.send_byte, server1.send_byte );
341 BOOST_CHECK_EQUAL( server2.weight, server1.weight );
342 BOOST_CHECK( server2.tcp_endpoint == server1.tcp_endpoint );
343 BOOST_CHECK( server2.udp_endpoint < server1.udp_endpoint );
345 // unit_test[18] 大小比較オペレータのテスト3(TCPが等しくweightが大きいと検出)
349 BOOST_CHECK_EQUAL( ( server2 < server1 ), true );
350 BOOST_CHECK_EQUAL( server2.get_active(), server1.get_active() );
351 BOOST_CHECK_EQUAL( server2.get_inact(), server1.get_inact() );
352 BOOST_CHECK_EQUAL( server2.send_byte, server1.send_byte );
353 BOOST_CHECK( server2.weight < server1.weight );
354 BOOST_CHECK( server2.tcp_endpoint == server1.tcp_endpoint );
355 BOOST_CHECK( server2.udp_endpoint == server1.udp_endpoint );
357 // unit_test[19] 大小比較オペレータのテスト4(接続数が異なっても問題無し)
359 server1.increment_active();
360 BOOST_CHECK_EQUAL( ( server2 < server1 ), false );
361 BOOST_CHECK( server2.get_active() != server1.get_active() );
362 BOOST_CHECK_EQUAL( server2.get_inact(), server1.get_inact() );
363 BOOST_CHECK_EQUAL( server2.send_byte, server1.send_byte );
364 BOOST_CHECK_EQUAL( server2.weight, server1.weight );
365 BOOST_CHECK( server2.tcp_endpoint == server1.tcp_endpoint );
366 BOOST_CHECK( server2.udp_endpoint == server1.udp_endpoint );
368 // unit_test[20] 大小比較オペレータのテスト5(切断数が異なっても問題無し)
370 server1.increment_inact();
371 BOOST_CHECK_EQUAL( ( server2 < server1 ), false );
372 BOOST_CHECK_EQUAL( server2.get_active(), server1.get_active() );
373 BOOST_CHECK( server2.get_inact() != server1.get_inact() );
374 BOOST_CHECK_EQUAL( server2.send_byte, server1.send_byte );
375 BOOST_CHECK_EQUAL( server2.weight, server1.weight );
376 BOOST_CHECK( server2.tcp_endpoint == server1.tcp_endpoint );
377 BOOST_CHECK( server2.udp_endpoint == server1.udp_endpoint );
379 // unit_test[21] 大小比較オペレータのテスト6(送信バイト数が異なっても問題無し)
381 server1.send_byte = 100;
382 BOOST_CHECK_EQUAL( ( server2 < server1 ), false );
383 BOOST_CHECK_EQUAL( server2.get_active(), server1.get_active() );
384 BOOST_CHECK_EQUAL( server2.get_inact(), server1.get_inact() );
385 BOOST_CHECK( server2.send_byte != server1.send_byte );
386 BOOST_CHECK_EQUAL( server2.weight, server1.weight );
387 BOOST_CHECK( server2.tcp_endpoint == server1.tcp_endpoint );
388 BOOST_CHECK( server2.udp_endpoint == server1.udp_endpoint );
390 // unit_test[22] 接続数取得メソッドのテスト
391 BOOST_CHECK_EQUAL( server1.get_active(), nactive );
393 // unit_test[23] 切断数取得メソッドのテスト
394 BOOST_CHECK_EQUAL( server1.get_inact(), ninact );
396 // unit_test[24] 接続数インクリメントメソッドのテスト
397 server1.increment_active();
398 BOOST_CHECK_EQUAL( server1.get_active(), 1 );
400 // unit_test[25] 接続数デクリメントメソッドのテスト
401 server1.decrement_active();
402 BOOST_CHECK_EQUAL( server1.get_active(), 0 );
404 // unit_test[26] 接続数インクリメントメソッドのテスト2(上限INT_MAXに達すると0にクリア)
405 // BOOST_MESSAGE( "wait a minute to INT_MAX" );
406 // for ( int loop = 0; loop < INT_MAX; loop++ ){
407 // server1.increment_active();
409 // BOOST_CHECK_EQUAL( server1.get_active(), 0 );
411 l7vs::realserver_fake server3;
413 nactive = INT_MAX - 1 ;
414 server3.set_active( nactive );
415 BOOST_CHECK_EQUAL( server3.get_active(), nactive );
417 server3.increment_active();
418 BOOST_CHECK_EQUAL( server3.get_active(), 0 );
420 // unit_test[27] 接続数デクリメントメソッドのテスト2(0に対しては何も行わない)
421 server1.decrement_active();
422 BOOST_CHECK_EQUAL( server1.get_active(), 0 );
424 // unit_test[28] 切断数インクリメントメソッドのテスト
425 server1.increment_inact();
426 BOOST_CHECK_EQUAL( server1.get_inact(), 1 );
428 // unit_test[29] 切断数インクリメントメソッドのテスト2(上限INT_MAXに達すると0にクリア)
429 // BOOST_MESSAGE( "wait a minute to INT_MAX" );
430 // for ( int loop = server1.get_inact(); loop < INT_MAX; loop++ ){
431 // server1.increment_inact();
433 // BOOST_CHECK_EQUAL( server1.get_inact(), 0 );
435 ninact = INT_MAX - 1 ;
436 server3.set_inact( ninact );
437 BOOST_CHECK_EQUAL( server3.get_inact(), ninact );
439 server3.increment_inact();
440 BOOST_CHECK_EQUAL( server3.get_inact(), 0 );
443 boost::thread thread_item1( boost::bind ( &starting_thread, 1 ) );
444 boost::thread thread_item2( boost::bind ( &starting_thread, 2 ) );
445 boost::thread thread_item3( boost::bind ( &starting_thread, 3 ) );
446 boost::thread thread_item4( boost::bind ( &starting_thread, 4 ) );
447 boost::thread thread_item5( boost::bind ( &starting_thread, 5 ) );
449 // unit_test[30] 接続数インクリメントメソッドのテスト3(複数スレッドから同時アクセス)
450 BOOST_MESSAGE( "sleep in" );
452 rush_server.starting_condition.notify_all();
454 BOOST_CHECK_EQUAL( rush_server.get_active(), 5 );
456 // unit_test[31] 接続数デクリメントメソッドのテスト3(複数スレッドから同時アクセス)
457 BOOST_MESSAGE( "sleep in" );
459 rush_server.starting_condition.notify_all();
461 BOOST_CHECK_EQUAL( rush_server.get_active(), 0 );
463 // unit_test[32] 切断数インクリメントメソッドのテスト3(複数スレッドから同時アクセス)
464 BOOST_MESSAGE( "sleep in" );
466 rush_server.starting_condition.notify_all();
475 BOOST_CHECK_EQUAL( rush_server.get_inact(), 5 );
478 // nactive, ninactをelement時のみsettter有効にする評価
480 rs.increment_active();
481 // rs.set_active( 10 ); // protectedなので変更できない(コンパイルエラー)
482 BOOST_CHECK( rs.get_active() != 10 );
483 rs.increment_inact();
484 // rs.set_inact( 10 ); // protectedなので変更できない(コンパイルエラー)
485 BOOST_CHECK( rs.get_inact() != 10 );
487 // こんなことするとrealserver上からも変更できてしまうけどそれは不正なので無視とする
488 // l7vs::realserver_element& rs_elem2( rs );
489 // rs_elem2.set_active( 10 );
490 // BOOST_CHECK( rs.get_active() != 10 );
491 // rs_elem2.set_inact( 10 );
492 // BOOST_CHECK( rs.get_inact() != 10 );
495 l7vs::realserver_element rs_elem( rs );
496 BOOST_CHECK_EQUAL( rs_elem.get_active(), 1 );
497 BOOST_CHECK_EQUAL( rs_elem.get_inact(), 1 );
498 rs_elem.set_active( 0 ); // publicなので設定可能
499 rs_elem.set_inact( 0 ); // publicなので設定可能
500 BOOST_CHECK_EQUAL( rs_elem.get_active(), 0 );
501 BOOST_CHECK_EQUAL( rs_elem.get_inact(), 0 );
504 test_suite* init_unit_test_suite( int argc, char* argv[] ){
505 // l7vs::Logger logger;
506 // l7vs::Parameter parameter;
508 // logger.loadConf();
510 // create unit test suite
511 test_suite* ts = BOOST_TEST_SUITE( "realserver_test" );
513 // add test case to test suite
514 ts->add( BOOST_TEST_CASE( &realserver_test ) );
516 framework::master_test_suite().add( ts );