OSDN Git Service

trunk整理
[ultramonkey-l7/ultramonkey-l7-v3.git] / l7vsd / unit_tests / session_test / tcp_session / tcp_session_test.cpp
1 #define    TEST_CASE
2
3 #include <boost/asio.hpp>
4 #include <boost/thread/thread.hpp>
5 #include <boost/function_equal.hpp>
6 #include <boost/test/included/unit_test.hpp>
7
8 #include "../logger_stb/logger_implement_access.h"
9 #include "../logger_stb/logger.h"
10 #include "dummyclass.h"
11 #include "tcp_socket_option.h"
12 #include "tcp_session.h"
13 #include "tcp_session.cpp"
14 #include "lockfree_queue.h"
15 #include "../../../src/data_buff_base.cpp"
16 #include "../../../src/tcp_data.cpp"
17 #include "../../../src/tcp_realserver_connect_socket_list.cpp"
18
19
20 using namespace boost::unit_test_framework;
21
22 #define UP_THREAD_ALIVE        std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0001)
23 #define DOWN_THREAD_ALIVE    std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0002)
24 #define UP_THREAD_ACTIVE    std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0004)
25 #define DOWN_THREAD_ACTIVE    std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0008)
26 #define UP_THREAD_LOCK         std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0010)
27 #define DOWN_THREAD_LOCK     std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0020)
28
29
30 #define DUMMY_SERVER_IP     "127.0.0.1"
31 #define DUMMY_SERVER_IPV6     "::1"
32 #define DUMMY_SERVER_PORT     7000
33
34 #define CLIENT_CTX_LOAD_VERIFY_FILE         "ca.pem"
35 #define SERVER_CTX_CERTIFICATE_CHAIN_FILE   "server.pem"
36 #define SERVER_CTX_PRIVATE_KEY_FILE         "server.pem"
37 #define SERVER_CTX_TMP_DH_FILE              "dh512.pem"
38
39
40 // mutex lock test class
41 class mutex_lock_test : public l7vs::tcp_session{
42     public:
43         boost::thread::id befor_thread_id;
44         boost::thread::id after_thread_id;
45         l7vs::wr_mutex* pTest_mutex;
46         boost::function< void(void) > test_func;
47
48         mutex_lock_test(
49                                 l7vs::virtualservice_tcp& vs,
50                                 boost::asio::io_service& session_io,
51                                 l7vs::tcp_socket_option_info& set_socket_option,
52                                 boost::asio::ip::tcp::endpoint listen_endpoint,
53                                 bool ssl_mode,
54                                 boost::asio::ssl::context& set_ssl_context,
55                                 bool set_ssl_cache_flag,
56                                 int set_ssl_handshake_time_out,
57                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
58                                                                                                    session_io,
59                                                                                                    set_socket_option,
60                                                                                                    listen_endpoint,
61                                                                                                    ssl_mode,
62                                                                                                    set_ssl_context,
63                                                                                                    set_ssl_cache_flag,
64                                                                                                    set_ssl_handshake_time_out,
65                                                                                                    set_access_logger){
66
67             pTest_mutex = NULL;
68         };
69
70         ~mutex_lock_test(){
71         };
72
73         void test(){
74             test_func();
75         };
76  
77         void mutex_lock(){
78             if(pTest_mutex == NULL){
79                 std::cout << "Test code Error!! pTest_mutex = NULL" << std::endl;
80             }else{
81                 pTest_mutex->wrlock();
82             }
83         };
84  
85         void mutex_unlock(){
86             if(pTest_mutex == NULL){
87                 std::cout << "Test code Error!! pTest_mutex = NULL" << std::endl;
88             }else{
89                 pTest_mutex->unlock();
90             }
91         };
92
93         void set_protocol_module(l7vs::protocol_module_base* test_protocol_module){
94             protocol_module = test_protocol_module;
95         };
96
97
98 /*        bool mutex_trylock(){
99             return pTest_mutex->try_lock();
100         };*/
101
102         boost::mutex test_thread_wait;
103  
104         void test_run(){
105             boost::mutex::scoped_lock scope_lock(test_thread_wait);
106             test();
107         };
108
109 /*
110         //-------------is_thread_wait test---------------------------------
111         void set_is_thread_wait_test(){
112             //pTest_mutex = &thread_state_update_mutex;
113             pTest_mutex2 = &downthread_status_mutex;
114             test_func = boost::bind(&mutex_lock_test::is_thread_wait,this);
115         };
116
117         void is_thread_wait(){
118             befor_thread_id = boost::this_thread::get_id();
119             l7vs::tcp_session::is_thread_wait();
120             after_thread_id = boost::this_thread::get_id();
121         };
122 */
123         
124         //-------------down_thread_exit test---------------------------------
125         void set_down_thread_exit_test(){
126             pTest_mutex = &exit_flag_update_mutex;
127             test_func = boost::bind(&mutex_lock_test::down_thread_exit,this);
128         };
129         
130         void down_thread_exit(){
131             befor_thread_id = boost::this_thread::get_id();
132             l7vs::tcp_session::down_thread_exit(l7vs::tcp_session::LOCAL_PROC);
133             after_thread_id = boost::this_thread::get_id();
134         };
135         
136         //-------------up_thread_exit test---------------------------------
137         void set_up_thread_exit_test(){
138             pTest_mutex = &exit_flag_update_mutex;
139             test_func = boost::bind(&mutex_lock_test::up_thread_exit,this);
140         };
141         
142         void up_thread_exit(){
143             befor_thread_id = boost::this_thread::get_id();
144             l7vs::tcp_session::up_thread_exit(l7vs::tcp_session::LOCAL_PROC);
145             after_thread_id = boost::this_thread::get_id();
146         };
147         
148         //-------------up_thread_client_disconnetc_event test---------------------------------
149         void set_up_thread_client_disconnect_event_test(){
150             pTest_mutex = &module_function_client_disconnect_mutex;
151             test_func = boost::bind(&mutex_lock_test::up_thread_client_disconnect_event,this);
152         };
153         
154         void up_thread_client_disconnect_event(){
155             befor_thread_id = boost::this_thread::get_id();
156             l7vs::tcp_session::up_thread_client_disconnect_event(l7vs::tcp_session::LOCAL_PROC);
157             after_thread_id = boost::this_thread::get_id();
158         };
159         
160         //-------------down_thread_client_disconnetc_event test---------------------------------
161         void set_down_thread_client_disconnect_event_test(){
162             pTest_mutex = &module_function_client_disconnect_mutex;
163             test_func = boost::bind(&mutex_lock_test::down_thread_client_disconnect_event,this);
164         };
165         
166         void down_thread_client_disconnect_event(){
167             befor_thread_id = boost::this_thread::get_id();
168             l7vs::tcp_session::down_thread_client_disconnect_event(l7vs::tcp_session::LOCAL_PROC);
169             after_thread_id = boost::this_thread::get_id();
170         };
171         
172         //-------------up_thread_realserver_disconnetc_event test---------------------------------
173         void set_up_thread_realserver_disconnect_event_test(){
174             pTest_mutex = &module_function_realserver_disconnect_mutex;
175             test_func = boost::bind(&mutex_lock_test::up_thread_realserver_disconnect_event,this);
176         };
177         
178         void up_thread_realserver_disconnect_event(){
179             befor_thread_id = boost::this_thread::get_id();
180             l7vs::tcp_session::up_thread_realserver_disconnect_event(l7vs::tcp_session::LOCAL_PROC);
181             after_thread_id = boost::this_thread::get_id();
182         };
183         
184         //-------------down_thread_realserver_disconnetc_event test---------------------------------
185         void set_down_thread_realserver_disconnect_event_test(){
186             pTest_mutex = &module_function_realserver_disconnect_mutex;
187             test_func = boost::bind(&mutex_lock_test::down_thread_realserver_disconnect_event,this);
188         };
189         
190         void down_thread_realserver_disconnect_event(){
191             befor_thread_id = boost::this_thread::get_id();
192             l7vs::tcp_session::down_thread_realserver_disconnect_event(l7vs::tcp_session::LOCAL_PROC);
193             after_thread_id = boost::this_thread::get_id();
194         };
195         
196         //-------------up_thread_sorryserver_disconnetc_event test---------------------------------
197         void set_up_thread_sorryserver_disconnect_event_test(){
198             pTest_mutex = &module_function_sorryserver_disconnect_mutex;
199             test_func = boost::bind(&mutex_lock_test::up_thread_sorryserver_disconnect_event,this);
200         };
201         
202         void up_thread_sorryserver_disconnect_event(){
203             befor_thread_id = boost::this_thread::get_id();
204             l7vs::tcp_session::up_thread_sorryserver_disconnect_event(l7vs::tcp_session::LOCAL_PROC);
205             after_thread_id = boost::this_thread::get_id();
206         };
207         
208         //-------------down_thread_sorryserver_disconnetc_event test---------------------------------
209         void set_down_thread_sorryserver_disconnect_event_test(){
210             pTest_mutex = &module_function_sorryserver_disconnect_mutex;
211             test_func = boost::bind(&mutex_lock_test::down_thread_sorryserver_disconnect_event,this);
212         };
213         
214         void down_thread_sorryserver_disconnect_event(){
215             befor_thread_id = boost::this_thread::get_id();
216             l7vs::tcp_session::down_thread_sorryserver_disconnect_event(l7vs::tcp_session::LOCAL_PROC);
217             after_thread_id = boost::this_thread::get_id();
218         };
219         
220         //-------------up_thread_sorry_enable_event test---------------------------------
221         void set_up_thread_sorry_enable_event_test(){
222             pTest_mutex = &module_function_sorry_enable_mutex;
223             test_func = boost::bind(&mutex_lock_test::up_thread_sorry_enable_event,this);
224         };
225         
226         void up_thread_sorry_enable_event(){
227             befor_thread_id = boost::this_thread::get_id();
228             l7vs::tcp_session::up_thread_sorry_enable_event(l7vs::tcp_session::LOCAL_PROC);
229             after_thread_id = boost::this_thread::get_id();
230         };
231         
232         //-------------up_thread_sorry_disable_event test---------------------------------
233         void set_up_thread_sorry_disable_event_test(){
234             pTest_mutex = &module_function_sorry_disable_mutex;
235             test_func = boost::bind(&mutex_lock_test::up_thread_sorry_disable_event,this);
236         };
237         
238         void up_thread_sorry_disable_event(){
239             befor_thread_id = boost::this_thread::get_id();
240             l7vs::tcp_session::up_thread_sorry_disable_event(l7vs::tcp_session::LOCAL_PROC);
241             after_thread_id = boost::this_thread::get_id();
242         };
243         //-------------down_thread_sorry_enable_event test---------------------------------
244         void set_down_thread_sorry_enable_event_test(){
245             pTest_mutex = &module_function_sorry_enable_mutex;
246             test_func = boost::bind(&mutex_lock_test::down_thread_sorry_enable_event,this);
247         };
248         
249         void down_thread_sorry_enable_event(){
250             befor_thread_id = boost::this_thread::get_id();
251             l7vs::tcp_session::down_thread_sorry_enable_event(l7vs::tcp_session::LOCAL_PROC);
252             after_thread_id = boost::this_thread::get_id();
253         };
254         
255         //-------------down_thread_sorry_disable_event test---------------------------------
256         void set_down_thread_sorry_disable_event_test(){
257             pTest_mutex = &module_function_sorry_disable_mutex;
258             test_func = boost::bind(&mutex_lock_test::down_thread_sorry_disable_event,this);
259         };
260         
261         void down_thread_sorry_disable_event(){
262             befor_thread_id = boost::this_thread::get_id();
263             l7vs::tcp_session::down_thread_sorry_disable_event(l7vs::tcp_session::LOCAL_PROC);
264             after_thread_id = boost::this_thread::get_id();
265         };
266         
267         //-------------up_thread_client_respond_event test---------------------------------
268         void set_up_thread_client_respond_event_test(){
269             pTest_mutex = &module_function_response_send_inform_mutex;
270             test_func = boost::bind(&mutex_lock_test::up_thread_client_respond_event,this);
271         };
272         
273         void up_thread_client_respond_event(){
274             befor_thread_id = boost::this_thread::get_id();
275             l7vs::tcp_session::up_thread_client_respond_event(l7vs::tcp_session::LOCAL_PROC);
276             after_thread_id = boost::this_thread::get_id();
277         };
278         
279         //-------------down_thread_client_respond_event test---------------------------------
280         void set_down_thread_client_respond_event_test(){
281             pTest_mutex = &module_function_response_send_inform_mutex;
282             test_func = boost::bind(&mutex_lock_test::down_thread_client_respond_event,this);
283         };
284         
285         void down_thread_client_respond_event(){
286             befor_thread_id = boost::this_thread::get_id();
287             l7vs::tcp_session::down_thread_client_respond_event(l7vs::tcp_session::LOCAL_PROC);
288             after_thread_id = boost::this_thread::get_id();
289         };
290         
291 /*
292         //-------------thread_state_update test---------------------------------
293         void set_thread_state_update_test(){
294             pTest_mutex = &thread_state_update_mutex;
295             test_func = boost::bind(&mutex_lock_test::thread_state_update,this);
296         };
297         
298         void thread_state_update(){
299             befor_thread_id = boost::this_thread::get_id();
300             l7vs::tcp_session::thread_state_update(UP_THREAD_ALIVE,true);
301             after_thread_id = boost::this_thread::get_id();
302         };
303 */
304
305         //-------------handle_ssl_handshake_timer test---------------------------------
306         void set_handle_ssl_handshake_timer_test(){
307             pTest_mutex = &ssl_handshake_time_out_flag_mutex;
308             test_func = boost::bind(&mutex_lock_test::handle_ssl_handshake_timer,this);
309         };
310
311         void handle_ssl_handshake_timer(){
312             befor_thread_id = boost::this_thread::get_id();
313             boost::system::error_code ec;
314             l7vs::tcp_session::handle_ssl_handshake_timer(ec);
315             after_thread_id = boost::this_thread::get_id();
316         };
317 };
318
319 // dummy mirror server
320 #define DUMMY_SERVER_IP     "127.0.0.1"
321 #define DUMMY_SERVER_PORT     7000
322 class test_mirror_server{
323     
324     public:
325         bool bstop_flag;
326         bool brun_flag;
327         bool breq_acc_flag;
328         bool breq_close_wait_flag;
329         bool bconnect_flag;
330         bool bdisconnect_flag;
331         boost::asio::ip::tcp::endpoint accept_end;
332         boost::asio::ip::tcp::endpoint connect_end;
333         size_t receive_size;
334         int req_recv_cnt;
335         bool brecv_triger;
336         
337         test_mirror_server() : 
338                 bstop_flag(false),
339         brun_flag(false),
340         breq_acc_flag(false),
341         breq_close_wait_flag(false),
342         bconnect_flag(false),
343         bdisconnect_flag(false),
344         accept_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT),
345         connect_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT),
346         receive_size(0),
347         req_recv_cnt(0),
348         brecv_triger(false){
349         };
350         
351         ~test_mirror_server(){
352             bstop_flag = true;
353             
354             while(brun_flag){
355                 sleep(1);
356             }
357             
358         };
359         
360         void run(){
361             std::cout << "dummy mirror server run start!" << std::endl;
362             
363             brun_flag = true;
364             bconnect_flag = false;
365             bdisconnect_flag = false;
366             boost::asio::io_service io;
367             boost::asio::ip::tcp::acceptor acc(io,accept_end);
368             boost::system::error_code ec;
369             
370             boost::array<char,MAX_BUFFER_SIZE> buf;
371             receive_size = 0;
372             
373             
374             while(!bstop_flag){
375                 if(!breq_acc_flag){
376                     continue;
377                 }
378                 boost::asio::ip::tcp::socket con(io);
379                 
380                 // accept
381                 acc.accept(con,ec);
382                 if(ec){
383                     std::cout << "dummy mirror server accept NG!" << std::endl;
384                     break;
385                 }else{
386                     connect_end = con.remote_endpoint();
387                     std::cout << "dummy mirror server accept OK! from " << connect_end << std::endl;
388                     
389                     breq_acc_flag = false;
390                     // client chk
391                     
392                     bconnect_flag = true;
393                     
394                     for(int i = 0; i < req_recv_cnt ;i++){
395                         while(!brecv_triger){
396                             if(bstop_flag)
397                                 break;
398                         }
399                         brecv_triger = false;
400                         if(bstop_flag)
401                             break;
402                             
403                         // receive
404                         receive_size = con.read_some(boost::asio::buffer(buf,MAX_BUFFER_SIZE),ec);
405                         
406                         if(ec){
407                             if(ec == boost::asio::error::eof || ec == boost::asio::error::connection_reset){
408                                 std::cout << "dummy mirror server detect client disconnect!" << std::endl;
409                                 bdisconnect_flag = true;
410                             }else{
411                                 std::cout << "dummy mirror server receive NG!" << std::endl;
412                             }
413                         }else{
414                             if(receive_size > 0){
415                                 // send
416                                 con.write_some(boost::asio::buffer(buf,receive_size),ec);
417                                 if(ec){
418                                     std::cout << "dummy mirror server send NG!" << std::endl;
419                                 }
420                             }
421                         }
422                     }
423                     
424                     std::cout << "dummy mirror server connection close wait start" << std::endl;
425                     while(breq_close_wait_flag){
426                         sleep(1);
427                     }
428                     std::cout << "dummy mirror server connection close wait end" << std::endl;
429                     // close
430                     con.close(ec);
431                 }
432             }
433             
434             acc.close(ec);
435             
436             brun_flag = false;
437             
438             std::cout << "dummy mirror server run end!" << std::endl;
439         };
440 };
441
442 // dummy client
443 class test_client{
444     public:
445         // 
446         test_client(boost::asio::io_service& io_service, boost::asio::ssl::context& context) :
447             my_socket(io_service,context){
448         };
449
450         ~test_client(){
451         };
452         void all_lock(){
453
454             //! socket connect mutex
455             connect_mutex.wrlock();
456             //! socket handshake mutex
457             handshake_mutex.wrlock();
458             //! socket read mutex
459             read_mutex.wrlock();
460             //! socket write mutex
461             write_mutex.wrlock();
462             //! socket close mutex
463             close_mutex.wrlock();
464
465         }
466
467         void connect_close_only_test_run(){
468             // dummy client start
469
470             // connect
471             {
472                 l7vs::rw_scoped_lock scope_lock(connect_mutex);
473
474                 if(!connect_test()){
475                     return;
476                 }
477             }
478
479             // close 
480             {
481                 l7vs::rw_scoped_lock scope_lock(close_mutex);
482                 close_test();
483             }
484         };
485
486         void handshake_test_run(){
487             // dummy client start
488
489             // connect
490             {
491                 l7vs::rw_scoped_lock scope_lock(connect_mutex);
492
493                 if(!connect_test()){
494                     return;
495                 }
496             }
497
498             // handshake
499             {
500                 l7vs::rw_scoped_lock scope_lock(handshake_mutex);
501
502                 if(!handshake_test()){
503                     return;
504                 }
505             }
506
507             // close 
508             {
509                 l7vs::rw_scoped_lock scope_lock(close_mutex);
510                 close_test();
511             }
512
513         };
514
515         bool connect_test(){
516             sleep(1);
517             boost::system::error_code ec;
518             std::cout << "dummy client connect try" << std::endl;
519             boost::asio::ip::tcp::endpoint connect_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
520             my_socket.lowest_layer().connect(connect_end,ec);
521             if(ec){
522                 //receive error
523                 std::cout << "dummy client connect Error!" << std::endl;
524                 std::cout << ec << std::endl;
525                 return false;
526             }
527             std::cout << "dummy client connect OK" << std::endl;
528             return true;
529         };
530
531         bool handshake_test(){
532             boost::system::error_code ec;
533             std::cout << "dummy client handshake try" << std::endl;
534             my_socket.handshake(boost::asio::ssl::stream_base::client, ec);
535             if(ec){
536                 //receive error
537                 std::cout << "dummy client handshake Error!" << std::endl;
538                 std::cout << ec << std::endl;
539                 return false;
540             }
541             std::cout << "dummy client handshake OK" << std::endl;
542             return true;
543         };
544
545         bool send_test(){
546             sleep(1);
547             boost::system::error_code ec;
548             std::cout << "dummy client write try" << std::endl;
549             std::size_t write_size = my_socket.write_some(boost::asio::buffer(data_buff.data() + send_data_size,receive_data_size - send_data_size), ec);
550             if(ec){
551                 //receive error
552                 std::cout << "dummy client send Error!" << std::endl;
553                 std::cout << ec << std::endl;
554                 return false;
555             }
556             send_data_size += write_size;
557             std::cout << "dummy client send OK [" << send_data_size << "]" << std::endl;
558             return true;
559         };
560         bool receive_test(){
561             sleep(1);
562             boost::system::error_code ec;
563             std::cout << "dummy client read try" << std::endl;
564             std::size_t read_size = my_socket.read_some(boost::asio::buffer(data_buff.data() + receive_data_size,MAX_BUFFER_SIZE), ec);
565             if(ec){
566                 //receive error
567                 std::cout << "dummy client receive Error!" << std::endl;
568                 std::cout << ec << std::endl;
569                 return false;
570             }
571             receive_data_size += read_size;
572             std::cout << "dummy client receive OK [" << receive_data_size << "]" << std::endl;
573             return true;
574         };
575         void close_test(){
576             sleep(1);
577             boost::system::error_code ec;
578             std::cout << "dummy client close try" << std::endl;
579             my_socket.lowest_layer().close(ec);
580             if(ec){
581                 //close error
582                 std::cout << "dummy client close Error!" << std::endl;
583                 std::cout << ec << std::endl;
584                 return;
585             }
586             std::cout << "dummy client close OK" << std::endl;
587         };
588
589         boost::asio::ssl::stream<boost::asio::ip::tcp::socket> my_socket;
590         boost::array<char,MAX_BUFFER_SIZE> data_buff;
591         std::size_t receive_data_size;
592         std::size_t send_data_size;
593
594         //! socket connect mutex
595         l7vs::wr_mutex connect_mutex;
596         //! socket handshake mutex
597         l7vs::wr_mutex handshake_mutex;
598         //! socket read mutex
599         l7vs::wr_mutex read_mutex;
600         //! socket write mutex
601         l7vs::wr_mutex write_mutex;
602         //! socket close mutex
603         l7vs::wr_mutex close_mutex;
604 };
605
606 class authority{
607     public:
608         authority(){
609         };
610         ~authority(){
611         };
612         std::string get_password() const{
613             std::cout << "call get_password" << std::endl;
614             return "test";
615         };
616 };
617
618
619 // module event map test base class
620 class module_event_map_test_base_class : public l7vs::tcp_session{
621     public:
622         
623         std::pair<l7vs::protocol_module_base::EVENT_TAG, UP_THREAD_FUNC_TYPE_TAG> up_module_map_test_data[13];
624         std::pair<UP_THREAD_FUNC_TYPE_TAG , boost::function< void(const l7vs::tcp_session::TCP_PROCESS_TYPE_TAG) > > up_fuc_map_test_data[13];
625         std::pair<l7vs::protocol_module_base::EVENT_TAG, DOWN_THREAD_FUNC_TYPE_TAG> down_module_map_test_data[7];
626         std::pair<DOWN_THREAD_FUNC_TYPE_TAG , boost::function< void(const l7vs::tcp_session::TCP_PROCESS_TYPE_TAG) > > down_fuc_map_test_data[7];
627         
628 //        module_event_map_test_base_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){
629         module_event_map_test_base_class(
630                                 l7vs::virtualservice_tcp& vs,
631                                 boost::asio::io_service& session_io,
632                                 l7vs::tcp_socket_option_info& set_socket_option,
633                                 boost::asio::ip::tcp::endpoint listen_endpoint,
634                                 bool ssl_mode,
635                                 boost::asio::ssl::context& set_ssl_context,
636                                 bool set_ssl_cache_flag,
637                                 int set_ssl_handshake_time_out,
638                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
639                                                                                                    session_io,
640                                                                                                    set_socket_option,
641                                                                                                    listen_endpoint,
642                                                                                                    ssl_mode,
643                                                                                                    set_ssl_context,
644                                                                                                    set_ssl_cache_flag,
645                                                                                                    set_ssl_handshake_time_out,
646                                                                                                    set_access_logger){
647
648             int index;
649             boost::function< void(const l7vs::tcp_session::TCP_PROCESS_TYPE_TAG) > func;
650             // set test data
651             
652             up_thread_module_event_map.clear();
653 //            up_thread_function_map.clear();
654             
655             index = 0;
656             up_module_map_test_data[index].first = l7vs::protocol_module_base::ACCEPT;
657             up_module_map_test_data[index].second = l7vs::tcp_session::UP_FUNC_CLIENT_ACCEPT;
658             up_fuc_map_test_data[index].first = up_module_map_test_data[index].second;
659             up_fuc_map_test_data[index].second = boost::bind(&module_event_map_test_base_class::test_UP_FUNC_CLIENT_ACCEPT,this,_1);
660             up_thread_function_array[up_fuc_map_test_data[index].first] = up_fuc_map_test_data[index];
661             
662             index = 1;
663             up_module_map_test_data[index].first = l7vs::protocol_module_base::CLIENT_DISCONNECT;
664             up_module_map_test_data[index].second = l7vs::tcp_session::UP_FUNC_CLIENT_DISCONNECT;
665             up_fuc_map_test_data[index].first = up_module_map_test_data[index].second;
666             up_fuc_map_test_data[index].second = boost::bind(&module_event_map_test_base_class::test_UP_FUNC_CLIENT_DISCONNECT,this,_1);
667             up_thread_function_array[up_fuc_map_test_data[index].first] = up_fuc_map_test_data[index];
668             
669             index = 2;
670             up_module_map_test_data[index].first = l7vs::protocol_module_base::CLIENT_RECV;
671             up_module_map_test_data[index].second = l7vs::tcp_session::UP_FUNC_CLIENT_RECEIVE;
672             up_fuc_map_test_data[index].first = up_module_map_test_data[index].second;
673             up_fuc_map_test_data[index].second = boost::bind(&module_event_map_test_base_class::test_UP_FUNC_CLIENT_RECEIVE,this,_1);
674             up_thread_function_array[up_fuc_map_test_data[index].first] = up_fuc_map_test_data[index];
675             
676             index = 3;
677             up_module_map_test_data[index].first = l7vs::protocol_module_base::CLIENT_RESPONSE_SEND;
678             up_module_map_test_data[index].second = l7vs::tcp_session::UP_FUNC_CLIENT_RESPOND_SEND;
679             up_fuc_map_test_data[index].first = up_module_map_test_data[index].second;
680             up_fuc_map_test_data[index].second = boost::bind(&module_event_map_test_base_class::test_UP_FUNC_CLIENT_RESPOND_SEND,this,_1);
681             up_thread_function_array[up_fuc_map_test_data[index].first] = up_fuc_map_test_data[index];
682             
683             index = 4;
684             up_module_map_test_data[index].first = l7vs::protocol_module_base::REALSERVER_SELECT;
685             up_module_map_test_data[index].second = l7vs::tcp_session::UP_FUNC_REALSERVER_GET_DEST_EVENT;
686             up_fuc_map_test_data[index].first = up_module_map_test_data[index].second;
687             up_fuc_map_test_data[index].second = boost::bind(&module_event_map_test_base_class::test_UP_FUNC_REALSERVER_GET_DEST_EVENT,this,_1);
688             up_thread_function_array[up_fuc_map_test_data[index].first] = up_fuc_map_test_data[index];
689             
690             index = 5;
691             up_module_map_test_data[index].first = l7vs::protocol_module_base::REALSERVER_CONNECT;
692             up_module_map_test_data[index].second = l7vs::tcp_session::UP_FUNC_REALSERVER_CONNECT;
693             up_fuc_map_test_data[index].first = up_module_map_test_data[index].second;
694             up_fuc_map_test_data[index].second = boost::bind(&module_event_map_test_base_class::test_UP_FUNC_REALSERVER_CONNECT,this,_1);
695             up_thread_function_array[up_fuc_map_test_data[index].first] = up_fuc_map_test_data[index];
696             
697             index = 6;
698             up_module_map_test_data[index].first = l7vs::protocol_module_base::REALSERVER_SEND;
699             up_module_map_test_data[index].second = l7vs::tcp_session::UP_FUNC_REALSERVER_SEND;
700             up_fuc_map_test_data[index].first = up_module_map_test_data[index].second;
701             up_fuc_map_test_data[index].second = boost::bind(&module_event_map_test_base_class::test_UP_FUNC_REALSERVER_SEND,this,_1);
702             up_thread_function_array[up_fuc_map_test_data[index].first] = up_fuc_map_test_data[index];
703             
704             index = 7;
705             up_module_map_test_data[index].first = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
706             up_module_map_test_data[index].second = l7vs::tcp_session::UP_FUNC_REALSERVER_ALL_DISCONNECT;
707             up_fuc_map_test_data[index].first = up_module_map_test_data[index].second;
708             up_fuc_map_test_data[index].second = boost::bind(&module_event_map_test_base_class::test_UP_FUNC_REALSERVER_ALL_DISCONNECT,this,_1);
709             up_thread_function_array[up_fuc_map_test_data[index].first] = up_fuc_map_test_data[index];
710             
711             index = 8;
712             up_module_map_test_data[index].first = l7vs::protocol_module_base::SORRYSERVER_SELECT;
713             up_module_map_test_data[index].second = l7vs::tcp_session::UP_FUNC_SORRYSERVER_GET_DEST;
714             up_fuc_map_test_data[index].first = up_module_map_test_data[index].second;
715             up_fuc_map_test_data[index].second = boost::bind(&module_event_map_test_base_class::test_UP_FUNC_SORRYSERVER_GET_DEST,this,_1);
716             up_thread_function_array[up_fuc_map_test_data[index].first] = up_fuc_map_test_data[index];
717             
718             index = 9;
719             up_module_map_test_data[index].first = l7vs::protocol_module_base::SORRYSERVER_CONNECT;
720             up_module_map_test_data[index].second = l7vs::tcp_session::UP_FUNC_SORRYSERVER_CONNECT;
721             up_fuc_map_test_data[index].first = up_module_map_test_data[index].second;
722             up_fuc_map_test_data[index].second = boost::bind(&module_event_map_test_base_class::test_UP_FUNC_SORRYSERVER_CONNECT,this,_1);
723             up_thread_function_array[up_fuc_map_test_data[index].first] = up_fuc_map_test_data[index];
724             
725             index = 10;
726             up_module_map_test_data[index].first = l7vs::protocol_module_base::SORRYSERVER_SEND;
727             up_module_map_test_data[index].second = l7vs::tcp_session::UP_FUNC_SORRYSERVER_SEND;
728             up_fuc_map_test_data[index].first = up_module_map_test_data[index].second;
729             up_fuc_map_test_data[index].second = boost::bind(&module_event_map_test_base_class::test_UP_FUNC_SORRYSERVER_SEND,this,_1);
730             up_thread_function_array[up_fuc_map_test_data[index].first] = up_fuc_map_test_data[index];
731             
732             index = 11;
733             up_module_map_test_data[index].first = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
734             up_module_map_test_data[index].second = l7vs::tcp_session::UP_FUNC_SORRYSERVER_DISCONNECT;
735             up_fuc_map_test_data[index].first = up_module_map_test_data[index].second;
736             up_fuc_map_test_data[index].second = boost::bind(&module_event_map_test_base_class::test_UP_FUNC_SORRYSERVER_DISCONNECT,this,_1);
737             up_thread_function_array[up_fuc_map_test_data[index].first] = up_fuc_map_test_data[index];
738             
739             index = 12;
740             up_module_map_test_data[index].first = l7vs::protocol_module_base::FINALIZE;
741             up_module_map_test_data[index].second = l7vs::tcp_session::UP_FUNC_EXIT;
742             up_fuc_map_test_data[index].first = up_module_map_test_data[index].second;
743             up_fuc_map_test_data[index].second = boost::bind(&module_event_map_test_base_class::test_UP_FUNC_EXIT,this,_1);
744             up_thread_function_array[up_fuc_map_test_data[index].first] = up_fuc_map_test_data[index];
745             
746             for(int i = 0 ; i < 13;i++){
747                 up_thread_module_event_map.insert(up_module_map_test_data[i]);
748             }
749             
750             down_thread_module_event_map.clear();
751 //            down_thread_function_map.clear();
752             
753             index = 0;
754             down_module_map_test_data[index].first = l7vs::protocol_module_base::CLIENT_DISCONNECT;
755             down_module_map_test_data[index].second = l7vs::tcp_session::DOWN_FUNC_CLIENT_DISCONNECT;
756             down_fuc_map_test_data[index].first = down_module_map_test_data[index].second;
757             down_fuc_map_test_data[index].second = boost::bind(&module_event_map_test_base_class::test_DOWN_FUNC_CLIENT_DISCONNECT,this,_1);
758             down_thread_function_array[down_fuc_map_test_data[index].first] = down_fuc_map_test_data[index];
759             
760             index = 1;
761             down_module_map_test_data[index].first = l7vs::protocol_module_base::CLIENT_CONNECTION_CHECK;
762             down_module_map_test_data[index].second = l7vs::tcp_session::DOWN_FUNC_CLIENT_CONNECTION_CHK;
763             down_fuc_map_test_data[index].first = down_module_map_test_data[index].second;
764             down_fuc_map_test_data[index].second = boost::bind(&module_event_map_test_base_class::test_DOWN_FUNC_CLIENT_CONNECTION_CHK,this,_1);
765             down_thread_function_array[down_fuc_map_test_data[index].first] = down_fuc_map_test_data[index];
766             
767             index = 2;
768             down_module_map_test_data[index].first = l7vs::protocol_module_base::REALSERVER_RECV;
769             down_module_map_test_data[index].second = l7vs::tcp_session::DOWN_FUNC_REALSERVER_RECEIVE;
770             down_fuc_map_test_data[index].first = down_module_map_test_data[index].second;
771             down_fuc_map_test_data[index].second = boost::bind(&module_event_map_test_base_class::test_DOWN_FUNC_REALSERVER_RECEIVE,this,_1);
772             down_thread_function_array[down_fuc_map_test_data[index].first] = down_fuc_map_test_data[index];
773             
774             index = 3;
775             down_module_map_test_data[index].first = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
776             down_module_map_test_data[index].second = l7vs::tcp_session::DOWN_FUNC_REALSERVER_ALL_DISCONNECT;
777             down_fuc_map_test_data[index].first = down_module_map_test_data[index].second;
778             down_fuc_map_test_data[index].second = boost::bind(&module_event_map_test_base_class::test_DOWN_FUNC_REALSERVER_ALL_DISCONNECT,this,_1);
779             down_thread_function_array[down_fuc_map_test_data[index].first] = down_fuc_map_test_data[index];
780             
781             index = 4;
782             down_module_map_test_data[index].first = l7vs::protocol_module_base::SORRYSERVER_RECV;
783             down_module_map_test_data[index].second = l7vs::tcp_session::DOWN_FUNC_SORRYSERVER_RECEIVE;
784             down_fuc_map_test_data[index].first = down_module_map_test_data[index].second;
785             down_fuc_map_test_data[index].second = boost::bind(&module_event_map_test_base_class::test_DOWN_FUNC_SORRYSERVER_RECEIVE,this,_1);
786             down_thread_function_array[down_fuc_map_test_data[index].first] = down_fuc_map_test_data[index];
787             
788             index = 5;
789             down_module_map_test_data[index].first = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
790             down_module_map_test_data[index].second = l7vs::tcp_session::DOWN_FUNC_SORRYSERVER_DISCONNECT;
791             down_fuc_map_test_data[index].first = down_module_map_test_data[index].second;
792             down_fuc_map_test_data[index].second = boost::bind(&module_event_map_test_base_class::test_DOWN_FUNC_SORRYSERVER_DISCONNECT,this,_1);
793             down_thread_function_array[down_fuc_map_test_data[index].first] = down_fuc_map_test_data[index];
794             
795             index = 6;
796             down_module_map_test_data[index].first = l7vs::protocol_module_base::FINALIZE;
797             down_module_map_test_data[index].second = l7vs::tcp_session::DOWN_FUNC_EXIT;
798             down_fuc_map_test_data[index].first = down_module_map_test_data[index].second;
799             down_fuc_map_test_data[index].second = boost::bind(&module_event_map_test_base_class::test_DOWN_FUNC_EXIT,this,_1);
800             down_thread_function_array[down_fuc_map_test_data[index].first] = down_fuc_map_test_data[index];
801             
802             for(int i = 0 ; i < 7;i++){
803                 down_thread_module_event_map.insert(down_module_map_test_data[i]);
804             }
805             
806             
807         };
808         
809         ~module_event_map_test_base_class(){
810             up_thread_module_event_map_clear();
811             up_thread_function_array_clear();
812             down_thread_module_event_map_clear();
813             down_thread_function_array_clear();
814         };
815         
816         void set_protocol_module(l7vs::protocol_module_base* test_protocol_module){
817             protocol_module = test_protocol_module;
818         };
819         
820         bool chk_up_thread_next_call_function(l7vs::protocol_module_base::EVENT_TAG chk_event){
821             l7vs::tcp_session::UP_THREAD_FUNC_TYPE_TAG fnc_tag = l7vs::tcp_session::UP_FUNC_EXIT;
822             up_call_func_type = fnc_tag;
823             for(int i = 0; i < 13;i++){
824                 if( up_module_map_test_data[i].first == chk_event){
825                     fnc_tag = up_module_map_test_data[i].second;
826                     if(i < 12){
827                         up_call_func_type = up_module_map_test_data[i+1].second;
828                     }else{
829                         up_call_func_type = up_module_map_test_data[0].second;
830                     }
831                     break;
832                 }
833             }
834             if(fnc_tag == up_call_func_type){
835                 return false;
836             }
837             
838             up_thread_next_call_function.second(LOCAL_PROC);
839             
840             return fnc_tag == up_call_func_type;
841         };
842         
843         bool chk_down_thread_next_call_function(l7vs::protocol_module_base::EVENT_TAG chk_event){
844             l7vs::tcp_session::DOWN_THREAD_FUNC_TYPE_TAG fnc_tag = l7vs::tcp_session::DOWN_FUNC_EXIT;
845             down_call_func_type = fnc_tag;
846             for(int i = 0; i < 7;i++){
847                 if( down_module_map_test_data[i].first == chk_event){
848                     fnc_tag = down_module_map_test_data[i].second;
849                     if(i < 6){
850                         down_call_func_type = down_module_map_test_data[i+1].second;
851                     }else{
852                         down_call_func_type = down_module_map_test_data[0].second;
853                     }
854                     break;
855                 }
856             }
857             if(fnc_tag == down_call_func_type){
858                 return false;
859             }
860             
861             down_thread_next_call_function.second(LOCAL_PROC);
862             
863             return fnc_tag == down_call_func_type;
864         };
865         
866         
867         void up_thread_module_event_map_clear(){
868             up_thread_module_event_map.clear();
869         };
870         
871         void up_thread_function_array_clear(){
872             for(int i = 0; i <= l7vs::tcp_session::UP_FUNC_EXIT;i++){
873                 up_thread_function_array[i].second = (tcp_session_func)NULL;
874             }
875         };
876         
877         void down_thread_module_event_map_clear(){
878             down_thread_module_event_map.clear();
879         };
880         
881         void down_thread_function_array_clear(){
882             for(int i = 0; i <= l7vs::tcp_session::DOWN_FUNC_EXIT;i++){
883                 down_thread_function_array[i].second = (tcp_session_func)NULL;
884             }
885         };
886         
887         void set_up_thread_id(boost::thread::id set_thread_id){
888             up_thread_id = set_thread_id;
889         };
890         void set_down_thread_id(boost::thread::id set_thread_id){
891             down_thread_id = set_thread_id;
892         };
893         
894         void set_up_thread_data_client_side(l7vs::tcp_data& set_data){
895             up_thread_data_client_side.set_size(set_data.get_size());
896             up_thread_data_client_side.set_send_size(set_data.get_send_size());
897             up_thread_data_client_side.set_data(set_data.get_data());
898             up_thread_data_client_side.set_endpoint(set_data.get_endpoint());
899         };
900         l7vs::tcp_data& get_up_thread_data_client_side(){
901             return up_thread_data_client_side;
902         }
903         void set_up_thread_data_dest_side(l7vs::tcp_data& set_data){
904             up_thread_data_dest_side.set_size(set_data.get_size());
905             up_thread_data_dest_side.set_send_size(set_data.get_send_size());
906             up_thread_data_dest_side.set_data(set_data.get_data());
907             up_thread_data_dest_side.set_endpoint(set_data.get_endpoint());
908         };
909         l7vs::tcp_data& get_up_thread_data_dest_side(){
910             return up_thread_data_dest_side;
911         }
912         void set_up_thread_message_data(l7vs::tcp_data& set_data){
913             up_thread_message_data.set_size(set_data.get_size());
914             up_thread_message_data.set_send_size(set_data.get_send_size());
915             up_thread_message_data.set_data(set_data.get_data());
916             up_thread_message_data.set_endpoint(set_data.get_endpoint());
917         };
918         l7vs::tcp_data& get_up_thread_message_data(){
919             return up_thread_message_data;
920         }
921         void set_down_thread_data_client_side(l7vs::tcp_data& set_data){
922             down_thread_data_client_side.set_size(set_data.get_size());
923             down_thread_data_client_side.set_send_size(set_data.get_send_size());
924             down_thread_data_client_side.set_data(set_data.get_data());
925             down_thread_data_client_side.set_endpoint(set_data.get_endpoint());
926         };
927         l7vs::tcp_data& get_down_thread_data_client_side(){
928             return down_thread_data_client_side;
929         }
930         void set_down_thread_data_dest_side(l7vs::tcp_data& set_data){
931             down_thread_data_dest_side.set_size(set_data.get_size());
932             down_thread_data_dest_side.set_send_size(set_data.get_send_size());
933             down_thread_data_dest_side.set_data(set_data.get_data());
934             down_thread_data_client_side.set_endpoint(set_data.get_endpoint());
935         };
936         l7vs::tcp_data& get_down_thread_data_dest_side(){
937             return down_thread_data_dest_side;
938         }
939         void set_down_thread_message_data(l7vs::tcp_data& set_data){
940             down_thread_message_data.set_size(set_data.get_size());
941             down_thread_message_data.set_send_size(set_data.get_send_size());
942             down_thread_message_data.set_data(set_data.get_data());
943             down_thread_message_data.set_endpoint(set_data.get_endpoint());
944         };
945         l7vs::tcp_data& get_down_thread_message_data(){
946             return down_thread_message_data;
947         }
948         void test_UP_FUNC_CLIENT_ACCEPT(const l7vs::tcp_session::TCP_PROCESS_TYPE_TAG process_type){
949             up_call_func_type = l7vs::tcp_session::UP_FUNC_CLIENT_ACCEPT;
950         };
951         
952         void test_UP_FUNC_CLIENT_DISCONNECT(const l7vs::tcp_session::TCP_PROCESS_TYPE_TAG process_type){
953             up_call_func_type = l7vs::tcp_session::UP_FUNC_CLIENT_DISCONNECT;
954         };
955         
956         void test_DOWN_FUNC_CLIENT_DISCONNECT(const l7vs::tcp_session::TCP_PROCESS_TYPE_TAG process_type){
957             down_call_func_type = l7vs::tcp_session::DOWN_FUNC_CLIENT_DISCONNECT;
958         };
959         
960         void test_DOWN_FUNC_CLIENT_CONNECTION_CHK(const l7vs::tcp_session::TCP_PROCESS_TYPE_TAG process_type){
961             down_call_func_type = l7vs::tcp_session::DOWN_FUNC_CLIENT_CONNECTION_CHK;
962         };
963         
964         
965 //        void test_UP_FUNC_CLIENT_DISCONNECT_EVENT(const l7vs::tcp_session::TCP_PROCESS_TYPE_TAG process_type){
966 //            up_call_func_type = l7vs::tcp_session::UP_FUNC_CLIENT_DISCONNECT_EVENT;
967 //        };
968         
969         void test_UP_FUNC_CLIENT_RECEIVE(const l7vs::tcp_session::TCP_PROCESS_TYPE_TAG process_type){
970             up_call_func_type = l7vs::tcp_session::UP_FUNC_CLIENT_RECEIVE;
971         };
972         
973         void test_UP_FUNC_CLIENT_RESPOND_SEND(const l7vs::tcp_session::TCP_PROCESS_TYPE_TAG process_type){
974             up_call_func_type = l7vs::tcp_session::UP_FUNC_CLIENT_RESPOND_SEND;
975         };
976         
977 //        void test_UP_FUNC_CLIENT_RESPOND_SEND_EVENT(const TCP_PROCESS_TYPE_TAG process_type){
978 //            up_call_func_type = l7vs::tcp_session::UP_FUNC_CLIENT_RESPOND_SEND_EVENT;
979 //        };
980         
981         void test_DOWN_FUNC_REALSERVER_RECEIVE(const l7vs::tcp_session::TCP_PROCESS_TYPE_TAG process_type){
982             down_call_func_type = l7vs::tcp_session::DOWN_FUNC_REALSERVER_RECEIVE;
983         };
984         
985         
986         void test_UP_FUNC_REALSERVER_GET_DEST_EVENT(const TCP_PROCESS_TYPE_TAG process_type){
987             up_call_func_type = l7vs::tcp_session::UP_FUNC_REALSERVER_GET_DEST_EVENT;
988         };
989         
990         void test_UP_FUNC_REALSERVER_CONNECT(const TCP_PROCESS_TYPE_TAG process_type){
991             up_call_func_type = l7vs::tcp_session::UP_FUNC_REALSERVER_CONNECT;
992         };
993         
994 //        void test_UP_FUNC_REALSERVER_CONNECT_EVENT(const TCP_PROCESS_TYPE_TAG process_type){
995 //            up_call_func_type = l7vs::tcp_session::UP_FUNC_REALSERVER_CONNECT_EVENT;
996 //        };
997         
998 //        void test_UP_FUNC_REALSERVER_CONNECT_FAIL_EVENT(const TCP_PROCESS_TYPE_TAG process_type){
999 //            up_call_func_type = l7vs::tcp_session::UP_FUNC_REALSERVER_CONNECT_FAIL_EVENT;
1000 //        };
1001         
1002         void test_UP_FUNC_REALSERVER_SEND(const TCP_PROCESS_TYPE_TAG process_type){
1003             up_call_func_type = l7vs::tcp_session::UP_FUNC_REALSERVER_SEND;
1004         };
1005         
1006 //        void test_UP_FUNC_REALSERVER_DISCONNECT(const TCP_PROCESS_TYPE_TAG process_type){
1007 //            up_call_func_type = l7vs::tcp_session::UP_FUNC_REALSERVER_DISCONNECT;
1008 //        };
1009         
1010 //        void test_UP_FUNC_REALSERVER_DISCONNECT_EVENT(const TCP_PROCESS_TYPE_TAG process_type){
1011 //            up_call_func_type = l7vs::tcp_session::UP_FUNC_REALSERVER_DISCONNECT_EVENT;
1012 //        };
1013         
1014         void test_UP_FUNC_REALSERVER_ALL_DISCONNECT(const TCP_PROCESS_TYPE_TAG process_type){
1015             up_call_func_type = l7vs::tcp_session::UP_FUNC_REALSERVER_ALL_DISCONNECT;
1016         };
1017         
1018         void test_DOWN_FUNC_REALSERVER_ALL_DISCONNECT(const TCP_PROCESS_TYPE_TAG process_type){
1019             down_call_func_type = l7vs::tcp_session::DOWN_FUNC_REALSERVER_ALL_DISCONNECT;
1020         };
1021
1022         void test_DOWN_FUNC_SORRYSERVER_RECEIVE(const l7vs::tcp_session::TCP_PROCESS_TYPE_TAG process_type){
1023             down_call_func_type = l7vs::tcp_session::DOWN_FUNC_SORRYSERVER_RECEIVE;
1024         };
1025         
1026         void test_UP_FUNC_SORRYSERVER_GET_DEST(const TCP_PROCESS_TYPE_TAG process_type){
1027             up_call_func_type = l7vs::tcp_session::UP_FUNC_SORRYSERVER_GET_DEST;
1028         };
1029         
1030         void test_UP_FUNC_SORRYSERVER_CONNECT(const TCP_PROCESS_TYPE_TAG process_type){
1031             up_call_func_type = l7vs::tcp_session::UP_FUNC_SORRYSERVER_CONNECT;
1032         };
1033         
1034 //        void test_UP_FUNC_SORRYSERVER_CONNECT_EVENT(const TCP_PROCESS_TYPE_TAG process_type){
1035 //            up_call_func_type = l7vs::tcp_session::UP_FUNC_SORRYSERVER_CONNECT_EVENT;
1036 //        };
1037         
1038 //        void test_UP_FUNC_SORRYSERVER_CONNECT_FAIL_EVENT(const TCP_PROCESS_TYPE_TAG process_type){
1039 //            up_call_func_type = l7vs::tcp_session::UP_FUNC_SORRYSERVER_CONNECT_FAIL_EVENT;
1040 //        };
1041         
1042         void test_UP_FUNC_SORRYSERVER_SEND(const TCP_PROCESS_TYPE_TAG process_type){
1043             up_call_func_type = l7vs::tcp_session::UP_FUNC_SORRYSERVER_SEND;
1044         };
1045         
1046         void test_UP_FUNC_SORRYSERVER_DISCONNECT(const TCP_PROCESS_TYPE_TAG process_type){
1047             up_call_func_type = l7vs::tcp_session::UP_FUNC_SORRYSERVER_DISCONNECT;
1048         };
1049         
1050         void test_DOWN_FUNC_SORRYSERVER_DISCONNECT(const TCP_PROCESS_TYPE_TAG process_type){
1051             down_call_func_type = l7vs::tcp_session::DOWN_FUNC_SORRYSERVER_DISCONNECT;
1052         };
1053         
1054 //        void test_UP_FUNC_SORRYSERVER_DISCONNECT_EVENT(const TCP_PROCESS_TYPE_TAG process_type){
1055 //            up_call_func_type = l7vs::tcp_session::UP_FUNC_SORRYSERVER_DISCONNECT_EVENT;    
1056 //        };
1057         
1058 //        void test_UP_FUNC_SORRY_ENABLE_EVENT(const TCP_PROCESS_TYPE_TAG process_type){
1059 //            up_call_func_type = l7vs::tcp_session::UP_FUNC_SORRY_ENABLE_EVENT;
1060 //        };
1061         
1062 //        void test_UP_FUNC_SORRY_DISABLE_EVENT(const TCP_PROCESS_TYPE_TAG process_type){
1063 //            up_call_func_type = l7vs::tcp_session::UP_FUNC_SORRY_DISABLE_EVENT;
1064 //        };
1065         
1066         void test_UP_FUNC_EXIT(const TCP_PROCESS_TYPE_TAG process_type){
1067             up_call_func_type = l7vs::tcp_session::UP_FUNC_EXIT;
1068         };
1069         
1070         void test_DOWN_FUNC_EXIT(const TCP_PROCESS_TYPE_TAG process_type){
1071             down_call_func_type = l7vs::tcp_session::DOWN_FUNC_EXIT;
1072         };
1073         
1074         l7vs::tcp_session::UP_THREAD_FUNC_TYPE_TAG up_call_func_type;
1075         l7vs::tcp_session::DOWN_THREAD_FUNC_TYPE_TAG down_call_func_type;
1076 };
1077
1078
1079
1080 //--test case--
1081 // constructer test
1082 // constructer test class
1083 class constructer_test_class : public l7vs::tcp_session{
1084     public:
1085        constructer_test_class(
1086                                 l7vs::virtualservice_tcp& vs,
1087                                 boost::asio::io_service& session_io,
1088                                 l7vs::tcp_socket_option_info& set_socket_option,
1089                                 boost::asio::ip::tcp::endpoint listen_endpoint,
1090                                 bool ssl_mode,
1091                                 boost::asio::ssl::context& set_ssl_context,
1092                                 bool set_ssl_cache_flag,
1093                                 int set_ssl_handshake_time_out,
1094                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
1095                                                                                                    session_io,
1096                                                                                                    set_socket_option,
1097                                                                                                    listen_endpoint,
1098                                                                                                    ssl_mode,
1099                                                                                                    set_ssl_context,
1100                                                                                                    set_ssl_cache_flag,
1101                                                                                                    set_ssl_handshake_time_out,
1102                                                                                                    set_access_logger){};
1103         ~constructer_test_class(){};
1104         boost::asio::io_service& get_io(){
1105             return io;
1106         };
1107         l7vs::virtualservice_tcp& get_parent_service(){
1108             return parent_service;
1109         };
1110         bool get_exit_flag(){
1111             return (bool)exit_flag;
1112         };
1113 /*
1114         std::bitset<TCP_SESSION_THREAD_STATE_BIT> get_thread_state(){
1115             return thread_state;
1116         };
1117 */
1118         l7vs::tcp_session::UPTHREAD_STATUS_TAG& get_up_status(){
1119             return upthread_status;
1120         };
1121                 
1122         l7vs::tcp_session::DOWNTHREAD_STATUS_TAG& get_down_status(){
1123             return downthread_status;
1124         };
1125                 
1126         l7vs::protocol_module_base* get_protocol_module(){
1127             return protocol_module;
1128         };
1129 /*
1130         bool get_session_pause_flag(){
1131             return session_pause_flag;
1132         };
1133 */
1134         l7vs::tcp_socket& get_client_socket(){
1135             return client_socket;
1136         };
1137         boost::shared_ptr< l7vs::tcp_socket > get_sorry_socket(){
1138             return sorryserver_socket.second;
1139         };
1140         //! ssl context
1141         l7vs::tcp_ssl_socket& get_client_ssl_socket(){
1142             return client_ssl_socket;
1143         };
1144         //! socket option 
1145         l7vs::tcp_socket_option_info* get_socket_opt_info(){
1146             return &socket_opt_info;
1147         };
1148         //! virtualservice accept endpoint
1149         boost::asio::ip::tcp::endpoint& get_virtualservice_endpoint(){
1150             return virtualservice_endpoint;
1151         };
1152         //! access log out put flag
1153         bool get_accesslog_flag(){
1154             return access_log_flag;
1155         };
1156         //! access logger
1157         l7vs::logger_implement_access* get_access_logger(){
1158             return access_logger;
1159         };
1160         //! ssl mode flag
1161         bool get_ssl_flag(){
1162             return ssl_flag;
1163         };
1164         //! ssl context
1165         boost::asio::ssl::context& get_ssl_context(){
1166             return ssl_context;
1167         };
1168         //! ssl session cache flag
1169         bool get_ssl_cache_flag(){
1170             return ssl_cache_flag;
1171         };
1172         //! handshake timer flag
1173         bool get_ssl_handshake_timer_flag(){
1174             return ssl_handshake_timer_flag;
1175         };
1176         //! handshake timeout
1177         int get_ssl_handshake_time_out(){
1178             return ssl_handshake_time_out;
1179         };
1180         //! handshake timeout flag
1181         bool get_ssl_handshake_timeout_flag(){
1182             return ssl_handshake_time_out_flag;
1183         };
1184
1185         //! up thread raise module event of handle_accept
1186         //! @param[in]        process_type is prosecess type
1187         void up_thread_client_accept(const TCP_PROCESS_TYPE_TAG process_type){
1188             up_thread_client_accept_call_check = true;
1189         }
1190         bool up_thread_client_accept_call_check;
1191
1192         //! up thread raise module event of handle_accept
1193         //! @param[in]        process_type is prosecess type
1194         void up_thread_client_accept_event(const TCP_PROCESS_TYPE_TAG process_type){
1195             up_thread_client_accept_event_call_check = true;
1196         }
1197         bool up_thread_client_accept_event_call_check;
1198         //! up thread receive client side and raise module event of handle_client_recv
1199         //! @param[in]        process_type is prosecess type
1200         void up_thread_client_receive(const TCP_PROCESS_TYPE_TAG process_type){
1201             up_thread_client_receive_call_check = true;
1202         };
1203         bool up_thread_client_receive_call_check;
1204         //! up thread raise client respond send event message for up and down thread
1205         //! @param[in]        process_type is prosecess type
1206         void up_thread_client_respond(const TCP_PROCESS_TYPE_TAG process_type){
1207             up_thread_client_respond_call_check = true;
1208         };
1209         bool up_thread_client_respond_call_check;
1210         //! up thread raise module event of handle_response_send_inform
1211         //! @param[in]        process_type is prosecess type
1212         void up_thread_client_respond_event(const TCP_PROCESS_TYPE_TAG process_type){
1213             up_thread_client_respond_event_call_check = true;
1214         };
1215         bool up_thread_client_respond_event_call_check;
1216         //! up thread close client socket and raise client disconnect event message for up and down thread
1217         //! @param[in]        process_type is prosecess type
1218         void up_thread_client_disconnect(const TCP_PROCESS_TYPE_TAG process_type){
1219             up_thread_client_disconnect_call_check = true;
1220         };
1221         bool up_thread_client_disconnect_call_check;
1222         //! up thread raise module event of handle_client_disconnect
1223         //! @param[in]        process_type is prosecess type
1224         void up_thread_client_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){
1225             up_thread_client_disconnect_event_call_check = true;
1226         };
1227         bool up_thread_client_disconnect_event_call_check;
1228         //! up thread send realserver and raise module event of handle_client_recv
1229         //! @param[in]        process_type is prosecess type
1230         void up_thread_realserver_send(const TCP_PROCESS_TYPE_TAG process_type){
1231             up_thread_realserver_send_call_check = true;
1232         };
1233         bool up_thread_realserver_send_call_check;
1234         //! up thread raise module event of handle_realserver_select
1235         //! @param[in]        process_type is prosecess type
1236         void up_thread_realserver_get_destination_event(const TCP_PROCESS_TYPE_TAG process_type){
1237             up_thread_realserver_get_destination_event_call_check = true;
1238         };
1239         bool up_thread_realserver_get_destination_event_call_check;
1240         //! up thread connect realserver
1241         //! @param[in]        process_type is prosecess type
1242         void up_thread_realserver_connect(const TCP_PROCESS_TYPE_TAG process_type){
1243             up_thread_realserver_connect_call_check = true;
1244         };
1245         bool up_thread_realserver_connect_call_check;
1246         //! up thread raise module event of handle_realserver_connect
1247         //! @param[in]        process_type is prosecess type
1248         void up_thread_realserver_connect_event(const TCP_PROCESS_TYPE_TAG process_type){
1249             up_thread_realserver_connect_event_call_check = true;
1250         };
1251         bool up_thread_realserver_connect_event_call_check;
1252         //! up thread raise module event of handle_realserver_connection_fail
1253         //! @param[in]        process_type is prosecess type
1254         void up_thread_realserver_connection_fail_event(const TCP_PROCESS_TYPE_TAG process_type){
1255             up_thread_realserver_connection_fail_event_call_check = true;
1256         };
1257         bool up_thread_realserver_connection_fail_event_call_check;
1258         //! up thread close realserver socket and raise realserver disconnect event message for up and down thread
1259         //! @param[in]        process_type is prosecess type
1260         void up_thread_realserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){
1261             up_thread_realserver_disconnect_call_check = true;
1262         };
1263         bool up_thread_realserver_disconnect_call_check;
1264         //! up thread raise module event of handle_realserver_disconnect
1265         //! @param[in]        process_type is prosecess type
1266         void up_thread_realserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){
1267             up_thread_realserver_disconnect_event_call_check = true;
1268         };
1269         bool up_thread_realserver_disconnect_event_call_check;
1270         //! up thread close all realserver socket and raise module event of handle_realserver_disconnect
1271         //! @param[in]        process_type is prosecess type
1272         void up_thread_all_realserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){
1273             up_thread_all_realserver_disconnect_call_check = true;
1274         };
1275         bool up_thread_all_realserver_disconnect_call_check;
1276         //! up thread send sorryserver and raise module event of handle_sorryserver_send
1277         //! @param[in]        process_type is prosecess type
1278         void up_thread_sorryserver_send(const TCP_PROCESS_TYPE_TAG process_type){
1279             up_thread_sorryserver_send_call_check = true;
1280         };
1281         bool up_thread_sorryserver_send_call_check;
1282         //! up thread raise module event of handle_sorryserver_select
1283         //! @param[in]        process_type is prosecess type
1284         void up_thread_sorryserver_get_destination_event(const TCP_PROCESS_TYPE_TAG process_type){
1285             up_thread_sorryserver_get_destination_event_call_check = true;
1286         };
1287         bool up_thread_sorryserver_get_destination_event_call_check;
1288         //! up thread connect sorryserver
1289         //! @param[in]        process_type is prosecess type
1290         void up_thread_sorryserver_connect(const TCP_PROCESS_TYPE_TAG process_type){
1291             up_thread_sorryserver_connect_call_check = true;
1292         };
1293         bool up_thread_sorryserver_connect_call_check;
1294         //! up thread raise module event of handle_sorryserver_connect
1295         //! @param[in]        process_type is prosecess type
1296         void up_thread_sorryserver_connect_event(const TCP_PROCESS_TYPE_TAG process_type){
1297             up_thread_sorryserver_connect_event_call_check = true;
1298         };
1299         bool up_thread_sorryserver_connect_event_call_check;
1300         //! up thread raise module event of handle_sorryserver_connection_fail
1301         //! @param[in]        process_type is prosecess type
1302         void up_thread_sorryserver_connection_fail_event(const TCP_PROCESS_TYPE_TAG process_type){
1303             up_thread_sorryserver_connection_fail_event_call_check = true;
1304         };
1305         bool up_thread_sorryserver_connection_fail_event_call_check;
1306         //! up thread close sorryserver socket and raise sorryserver disconnect event message for up and down thread
1307         //! @param[in]        process_type is prosecess type
1308         void up_thread_sorryserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){
1309             up_thread_sorryserver_disconnect_call_check = true;
1310         };
1311         bool up_thread_sorryserver_disconnect_call_check;
1312
1313         void up_thread_sorryserver_mod_disconnect(const TCP_PROCESS_TYPE_TAG process_type){
1314             up_thread_sorryserver_mod_disconnect_call_check = true;
1315         };
1316         bool up_thread_sorryserver_mod_disconnect_call_check;
1317
1318         //! up thread raise module event of handle_sorryserver_disconnect
1319         //! @param[in]        process_type is prosecess type
1320         void up_thread_sorryserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){
1321             up_thread_sorryserver_disconnect_event_call_check = true;
1322         };
1323         bool up_thread_sorryserver_disconnect_event_call_check;
1324         //! up thread raise module event of handle_sorry_enable
1325         //! @param[in]        process_type is prosecess type
1326         void up_thread_sorry_enable_event(const TCP_PROCESS_TYPE_TAG process_type){
1327             up_thread_sorry_enable_event_call_check = true;
1328         };
1329         bool up_thread_sorry_enable_event_call_check;
1330         //! up thread raise module event of handle_sorry_disable
1331         //! @param[in]        process_type is prosecess type
1332         void up_thread_sorry_disable_event(const TCP_PROCESS_TYPE_TAG process_type){
1333             up_thread_sorry_disable_event_call_check = true;
1334         };
1335         bool up_thread_sorry_disable_event_call_check;
1336         //! up thread exit main loop
1337         //! @param[in]        process_type is prosecess type
1338         void up_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
1339             up_thread_exit_call_check = true;
1340         };
1341         bool up_thread_exit_call_check;
1342         //! down thread receive from realserver and raise module event of handle_realserver_recv
1343         //! @param[in]        process_type is prosecess type
1344         void down_thread_realserver_receive(const TCP_PROCESS_TYPE_TAG process_type){
1345             down_thread_realserver_receive_call_check = true;
1346         };
1347         bool down_thread_realserver_receive_call_check;
1348         //! down thread close realserver socket and raise realserver disconnect event message for up and down thread
1349         //! @param[in]        process_type is prosecess type
1350         void down_thread_realserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){
1351             down_thread_realserver_disconnect_call_check = true;
1352         };
1353         bool down_thread_realserver_disconnect_call_check;
1354         //! down thread raise module event of handle_realserver_disconnect
1355         //! @param[in]        process_type is prosecess type
1356         void down_thread_realserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){
1357             down_thread_realserver_disconnect_event_call_check = true;
1358         };
1359         bool down_thread_realserver_disconnect_event_call_check;
1360         //! down thread close all realserver socket and raise module event of handle_realserver_disconnect
1361         //! @param[in]        process_type is prosecess type
1362         void down_thread_all_realserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){
1363             down_thread_all_realserver_disconnect_call_check = true;
1364         };
1365         bool down_thread_all_realserver_disconnect_call_check;
1366         //! down thread raise module event of handle_client_connection_check
1367         //! @param[in]        process_type is prosecess type
1368         void down_thread_client_connection_chk_event(const TCP_PROCESS_TYPE_TAG process_type){
1369             down_thread_client_connection_chk_event_call_check = true;
1370         };
1371         bool down_thread_client_connection_chk_event_call_check;
1372         //! down thread raise module event of handle_response_send_inform
1373         //! @param[in]        process_type is prosecess type
1374         void down_thread_client_respond_event(const TCP_PROCESS_TYPE_TAG process_type){
1375             down_thread_client_respond_event_call_check = true;
1376         };
1377         bool down_thread_client_respond_event_call_check;
1378         //! down thread send for client and raise module event of handle_client_send
1379         //! @param[in]        process_type is prosecess type
1380         void down_thread_client_send(const TCP_PROCESS_TYPE_TAG process_type){
1381             down_thread_client_send_call_check = true;
1382         };
1383         bool down_thread_client_send_call_check;
1384         //! down thread close client socket and raise client disconnect event message for up and down thread 
1385         //! @param[in]        process_type is prosecess type
1386         void down_thread_client_disconnect(const TCP_PROCESS_TYPE_TAG process_type){
1387             down_thread_client_disconnect_call_check = true;
1388         };
1389         bool down_thread_client_disconnect_call_check;
1390         //! down thread raise module event of handle_client_disconnect
1391         //! @param[in]        process_type is prosecess type
1392         void down_thread_client_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){
1393             down_thread_client_disconnect_event_call_check = true;
1394         };
1395         bool down_thread_client_disconnect_event_call_check;
1396         //! down thread receive from sorryserver and raise module event of handle_sorryserver_recv
1397         //! @param[in]        process_type is prosecess type
1398         void down_thread_sorryserver_receive(const TCP_PROCESS_TYPE_TAG process_type){
1399             down_thread_sorryserver_receive_call_check = true;
1400         };
1401         bool down_thread_sorryserver_receive_call_check;
1402         //! down thread close sorryserver socket and raise sorryserver disconnect event message for up and down thread
1403         //! @param[in]        process_type is prosecess type
1404         void down_thread_sorryserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){
1405             down_thread_sorryserver_disconnect_call_check = true;
1406         };
1407         bool down_thread_sorryserver_disconnect_call_check;
1408
1409         void down_thread_sorryserver_mod_disconnect(const TCP_PROCESS_TYPE_TAG process_type){
1410             down_thread_sorryserver_mod_disconnect_call_check = true;
1411         };
1412         bool down_thread_sorryserver_mod_disconnect_call_check;
1413         //! down thread raise module event of handle_sorryserver_disconnect
1414         //! @param[in]        process_type is prosecess type
1415         void down_thread_sorryserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){
1416             down_thread_sorryserver_disconnect_event_call_check = true;
1417         };
1418         bool down_thread_sorryserver_disconnect_event_call_check;
1419         //! down thread raise module event of handle_sorry_enable
1420         //! @param[in]        process_type is prosecess type
1421         void down_thread_sorry_enable_event(const TCP_PROCESS_TYPE_TAG process_type){
1422             down_thread_sorry_enable_event_call_check = true;
1423         };
1424         bool down_thread_sorry_enable_event_call_check;
1425         //! down thread raise module event of handle_sorry_disable
1426         //! @param[in]        process_type is prosecess type
1427         void down_thread_sorry_disable_event(const TCP_PROCESS_TYPE_TAG process_type){
1428             down_thread_sorry_disable_event_call_check = true;
1429         };
1430         bool down_thread_sorry_disable_event_call_check;
1431         //! down thread exit main loop
1432         //! @param[in]        process_type is prosecess type
1433         void down_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
1434             down_thread_exit_call_check = true;
1435         };
1436         bool down_thread_exit_call_check;
1437         
1438         
1439         
1440         void check_up_thread_module_event_map(){
1441             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::INITIALIZE) == up_thread_module_event_map.end());
1442             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::ACCEPT)->second == l7vs::tcp_session::UP_FUNC_CLIENT_ACCEPT);    
1443             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::CLIENT_RECV)->second == l7vs::tcp_session::UP_FUNC_CLIENT_RECEIVE);
1444             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::REALSERVER_SELECT)->second == l7vs::tcp_session::UP_FUNC_REALSERVER_GET_DEST_EVENT);
1445             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::REALSERVER_CONNECT)->second == l7vs::tcp_session::UP_FUNC_REALSERVER_CONNECT);
1446             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::REALSERVER_SEND)->second == l7vs::tcp_session::UP_FUNC_REALSERVER_SEND);
1447             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::SORRYSERVER_SELECT)->second == l7vs::tcp_session::UP_FUNC_SORRYSERVER_GET_DEST);
1448             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::SORRYSERVER_CONNECT)->second == l7vs::tcp_session::UP_FUNC_SORRYSERVER_CONNECT);
1449             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::SORRYSERVER_SEND)->second == l7vs::tcp_session::UP_FUNC_SORRYSERVER_SEND);
1450             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::REALSERVER_RECV) == up_thread_module_event_map.end());
1451             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::SORRYSERVER_RECV) == up_thread_module_event_map.end());
1452             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::CLIENT_SELECT) == up_thread_module_event_map.end());
1453             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::CLIENT_CONNECTION_CHECK) == up_thread_module_event_map.end());
1454             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::CLIENT_SEND) == up_thread_module_event_map.end());
1455             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::CLIENT_RESPONSE_SEND)->second == l7vs::tcp_session::UP_FUNC_CLIENT_RESPOND_SEND);
1456             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::REALSERVER_DISCONNECT)->second == l7vs::tcp_session::UP_FUNC_REALSERVER_ALL_DISCONNECT);
1457             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::SORRYSERVER_DISCONNECT)->second == l7vs::tcp_session::UP_FUNC_SORRYSERVER_MOD_DISCONNECT);
1458             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::CLIENT_DISCONNECT)->second == l7vs::tcp_session::UP_FUNC_CLIENT_DISCONNECT);
1459             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::REALSERVER_CLOSE) == up_thread_module_event_map.end());
1460             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::FINALIZE)->second == l7vs::tcp_session::UP_FUNC_EXIT);
1461             BOOST_CHECK(up_thread_module_event_map.find(l7vs::protocol_module_base::STOP) == up_thread_module_event_map.end());
1462         };
1463         void check_down_thread_module_event_map(){
1464             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::INITIALIZE) == down_thread_module_event_map.end());
1465             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::ACCEPT) == down_thread_module_event_map.end());    
1466             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::CLIENT_RECV) == down_thread_module_event_map.end());
1467             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::REALSERVER_SELECT) == down_thread_module_event_map.end());
1468             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::REALSERVER_CONNECT) == down_thread_module_event_map.end());
1469             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::REALSERVER_SEND) == down_thread_module_event_map.end());
1470             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::SORRYSERVER_SELECT) == down_thread_module_event_map.end());
1471             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::SORRYSERVER_CONNECT) == down_thread_module_event_map.end());
1472             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::SORRYSERVER_SEND) == down_thread_module_event_map.end());
1473             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::REALSERVER_RECV)->second == l7vs::tcp_session::DOWN_FUNC_REALSERVER_RECEIVE);
1474             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::SORRYSERVER_RECV)->second == l7vs::tcp_session::DOWN_FUNC_SORRYSERVER_RECEIVE);
1475             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::CLIENT_SELECT) == down_thread_module_event_map.end());
1476             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::CLIENT_CONNECTION_CHECK)->second == l7vs::tcp_session::DOWN_FUNC_CLIENT_CONNECTION_CHK);
1477             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::CLIENT_SEND)->second == l7vs::tcp_session::DOWN_FUNC_CLIENT_SEND);
1478             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::CLIENT_RESPONSE_SEND) == down_thread_module_event_map.end());
1479             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::REALSERVER_DISCONNECT)->second == l7vs::tcp_session::DOWN_FUNC_REALSERVER_ALL_DISCONNECT);
1480             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::SORRYSERVER_DISCONNECT)->second == l7vs::tcp_session::DOWN_FUNC_SORRYSERVER_MOD_DISCONNECT);
1481             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::CLIENT_DISCONNECT)->second == l7vs::tcp_session::DOWN_FUNC_CLIENT_DISCONNECT);
1482             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::REALSERVER_CLOSE) == down_thread_module_event_map.end());
1483             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::FINALIZE)->second == l7vs::tcp_session::DOWN_FUNC_EXIT);
1484             BOOST_CHECK(down_thread_module_event_map.find(l7vs::protocol_module_base::STOP) == down_thread_module_event_map.end());
1485         };
1486         
1487         void check_up_thread_function_map(){
1488             up_thread_function_pair check_it;
1489
1490             // UP_FUNC_CLIENT_ACCEPT  up_thread_client_accept function
1491             check_it = up_thread_function_array[UP_FUNC_CLIENT_ACCEPT];
1492             BOOST_CHECK(check_it.second != NULL);
1493             up_thread_client_accept_call_check = false;
1494             check_it.second(LOCAL_PROC);
1495             BOOST_CHECK(up_thread_client_accept_call_check);
1496
1497
1498             // UP_FUNC_CLIENT_ACCEPT_EVENT  up_thread_client_accept_event function 
1499             check_it = up_thread_function_array[UP_FUNC_CLIENT_ACCEPT_EVENT];
1500             BOOST_CHECK(check_it.second != NULL);
1501             up_thread_client_accept_event_call_check = false;
1502             check_it.second(LOCAL_PROC);
1503             BOOST_CHECK(up_thread_client_accept_event_call_check);
1504             
1505             // UP_FUNC_CLIENT_DISCONNECT  up_thread_client_disconnect function 
1506             check_it = up_thread_function_array[UP_FUNC_CLIENT_DISCONNECT];
1507             BOOST_CHECK(check_it.second != NULL);
1508             up_thread_client_disconnect_call_check = false;
1509             check_it.second(LOCAL_PROC);
1510             BOOST_CHECK(up_thread_client_disconnect_call_check);
1511             
1512             // UP_FUNC_CLIENT_DISCONNECT_EVENT  up_thread_client_disconnect_event function 
1513             check_it = up_thread_function_array[UP_FUNC_CLIENT_DISCONNECT_EVENT];
1514             BOOST_CHECK(check_it.second != NULL);
1515             up_thread_client_disconnect_event_call_check = false;
1516             check_it.second(LOCAL_PROC);
1517             BOOST_CHECK(up_thread_client_disconnect_event_call_check);
1518             
1519             // UP_FUNC_CLIENT_RECEIVE  up_thread_client_receive function 
1520             check_it = up_thread_function_array[UP_FUNC_CLIENT_RECEIVE];
1521             BOOST_CHECK(check_it.second != NULL);
1522             up_thread_client_receive_call_check = false;
1523             check_it.second(LOCAL_PROC);
1524             BOOST_CHECK(up_thread_client_receive_call_check);
1525             
1526             // UP_FUNC_CLIENT_RESPOND_SEND  up_thread_client_respond function 
1527             check_it = up_thread_function_array[UP_FUNC_CLIENT_RESPOND_SEND];
1528             BOOST_CHECK(check_it.second != NULL);
1529             up_thread_client_respond_call_check = false;
1530             check_it.second(LOCAL_PROC);
1531             BOOST_CHECK(up_thread_client_respond_call_check);
1532             
1533             // UP_FUNC_CLIENT_RESPOND_SEND_EVENT  up_thread_client_respond_event function 
1534             check_it = up_thread_function_array[UP_FUNC_CLIENT_RESPOND_SEND_EVENT];
1535             BOOST_CHECK(check_it.second != NULL);
1536             up_thread_client_respond_event_call_check = false;
1537             check_it.second(LOCAL_PROC);
1538             BOOST_CHECK(up_thread_client_respond_event_call_check);
1539             
1540             // UP_FUNC_REALSERVER_GET_DEST_EVENT  up_thread_realserver_get_destination_event function 
1541             check_it = up_thread_function_array[UP_FUNC_REALSERVER_GET_DEST_EVENT];
1542             BOOST_CHECK(check_it.second != NULL);
1543             up_thread_realserver_get_destination_event_call_check = false;
1544             check_it.second(LOCAL_PROC);
1545             BOOST_CHECK(up_thread_realserver_get_destination_event_call_check);
1546             
1547             // UP_FUNC_REALSERVER_CONNECT  up_thread_realserver_connect function 
1548             check_it = up_thread_function_array[UP_FUNC_REALSERVER_CONNECT];
1549             BOOST_CHECK(check_it.second != NULL);
1550             up_thread_realserver_connect_call_check = false;
1551             check_it.second(LOCAL_PROC);
1552             BOOST_CHECK(up_thread_realserver_connect_call_check);
1553             
1554             // UP_FUNC_REALSERVER_CONNECT_EVENT  up_thread_realserver_connect_event function 
1555             check_it = up_thread_function_array[UP_FUNC_REALSERVER_CONNECT_EVENT];
1556             BOOST_CHECK(check_it.second != NULL);
1557             up_thread_realserver_connect_event_call_check = false;
1558             check_it.second(LOCAL_PROC);
1559             BOOST_CHECK(up_thread_realserver_connect_event_call_check);
1560             
1561             // UP_FUNC_REALSERVER_CONNECT_FAIL_EVENT  up_thread_realserver_connection_fail_event function 
1562             check_it = up_thread_function_array[UP_FUNC_REALSERVER_CONNECT_FAIL_EVENT];
1563             BOOST_CHECK(check_it.second != NULL);
1564             up_thread_realserver_connection_fail_event_call_check = false;
1565             check_it.second(LOCAL_PROC);
1566             BOOST_CHECK(up_thread_realserver_connection_fail_event_call_check);
1567             
1568             // UP_FUNC_REALSERVER_SEND  up_thread_realserver_send function 
1569             check_it = up_thread_function_array[UP_FUNC_REALSERVER_SEND];
1570             BOOST_CHECK(check_it.second != NULL);
1571             up_thread_realserver_send_call_check = false;
1572             check_it.second(LOCAL_PROC);
1573             BOOST_CHECK(up_thread_realserver_send_call_check);
1574             
1575             // UP_FUNC_REALSERVER_DISCONNECT  up_thread_realserver_disconnect function 
1576             check_it = up_thread_function_array[UP_FUNC_REALSERVER_DISCONNECT];
1577             BOOST_CHECK(check_it.second != NULL);
1578             up_thread_realserver_disconnect_call_check = false;
1579             check_it.second(LOCAL_PROC);
1580             BOOST_CHECK(up_thread_realserver_disconnect_call_check);
1581             
1582             // UP_FUNC_REALSERVER_DISCONNECT_EVENT  up_thread_realserver_disconnect_event function 
1583             check_it = up_thread_function_array[UP_FUNC_REALSERVER_DISCONNECT_EVENT];
1584             BOOST_CHECK(check_it.second != NULL);
1585             up_thread_realserver_disconnect_event_call_check = false;
1586             check_it.second(LOCAL_PROC);
1587             BOOST_CHECK(up_thread_realserver_disconnect_event_call_check);
1588             
1589             // UP_FUNC_REALSERVER_ALL_DISCONNECT  up_thread_all_realserver_disconnect function 
1590             check_it = up_thread_function_array[UP_FUNC_REALSERVER_ALL_DISCONNECT];
1591             BOOST_CHECK(check_it.second != NULL);
1592             up_thread_all_realserver_disconnect_call_check = false;
1593             check_it.second(LOCAL_PROC);
1594             BOOST_CHECK(up_thread_all_realserver_disconnect_call_check);
1595             
1596             // UP_FUNC_SORRYSERVER_GET_DEST  up_thread_sorryserver_get_destination_event function 
1597             check_it = up_thread_function_array[UP_FUNC_SORRYSERVER_GET_DEST];
1598             BOOST_CHECK(check_it.second != NULL);
1599             up_thread_sorryserver_get_destination_event_call_check = false;
1600             check_it.second(LOCAL_PROC);
1601             BOOST_CHECK(up_thread_sorryserver_get_destination_event_call_check);
1602             
1603             // UP_FUNC_SORRYSERVER_CONNECT  up_thread_sorryserver_connect function 
1604             check_it = up_thread_function_array[UP_FUNC_SORRYSERVER_CONNECT];
1605             BOOST_CHECK(check_it.second != NULL);
1606             up_thread_sorryserver_connect_call_check = false;
1607             check_it.second(LOCAL_PROC);
1608             BOOST_CHECK(up_thread_sorryserver_connect_call_check);
1609             
1610             // UP_FUNC_SORRYSERVER_CONNECT_EVENT  up_thread_sorryserver_connect_event function 
1611             check_it = up_thread_function_array[UP_FUNC_SORRYSERVER_CONNECT_EVENT];
1612             BOOST_CHECK(check_it.second != NULL);
1613             up_thread_sorryserver_connect_event_call_check = false;
1614             check_it.second(LOCAL_PROC);
1615             BOOST_CHECK(up_thread_sorryserver_connect_event_call_check);
1616             
1617             // UP_FUNC_SORRYSERVER_CONNECT_FAIL_EVENT  up_thread_sorryserver_connection_fail_event function 
1618             check_it = up_thread_function_array[UP_FUNC_SORRYSERVER_CONNECT_FAIL_EVENT];
1619             BOOST_CHECK(check_it.second != NULL);
1620             up_thread_sorryserver_connection_fail_event_call_check = false;
1621             check_it.second(LOCAL_PROC);
1622             BOOST_CHECK(up_thread_sorryserver_connection_fail_event_call_check);
1623             
1624             // UP_FUNC_SORRYSERVER_SEND  up_thread_sorryserver_send function 
1625             check_it = up_thread_function_array[UP_FUNC_SORRYSERVER_SEND];
1626             BOOST_CHECK(check_it.second != NULL);
1627             up_thread_sorryserver_send_call_check = false;
1628             check_it.second(LOCAL_PROC);
1629             BOOST_CHECK(up_thread_sorryserver_send_call_check);
1630             
1631             // UP_FUNC_SORRYSERVER_DISCONNECT  up_thread_sorryserver_disconnect function 
1632             check_it = up_thread_function_array[UP_FUNC_SORRYSERVER_DISCONNECT];
1633             BOOST_CHECK(check_it.second != NULL);
1634             up_thread_sorryserver_disconnect_call_check = false;
1635             check_it.second(LOCAL_PROC);
1636             BOOST_CHECK(up_thread_sorryserver_disconnect_call_check);
1637             
1638             // UP_FUNC_SORRYSERVER_MOD_DISCONNECT  up_thread_sorryserver_mod_disconnect function 
1639             check_it = up_thread_function_array[UP_FUNC_SORRYSERVER_MOD_DISCONNECT];
1640             BOOST_CHECK(check_it.second != NULL);
1641             up_thread_sorryserver_mod_disconnect_call_check = false;
1642             check_it.second(LOCAL_PROC);
1643             BOOST_CHECK(up_thread_sorryserver_mod_disconnect_call_check);
1644             
1645             // UP_FUNC_SORRYSERVER_DISCONNECT_EVENT  up_thread_sorryserver_disconnect_event function 
1646             check_it = up_thread_function_array[UP_FUNC_SORRYSERVER_DISCONNECT_EVENT];
1647             BOOST_CHECK(check_it.second != NULL);
1648             up_thread_sorryserver_disconnect_event_call_check = false;
1649             check_it.second(LOCAL_PROC);
1650             BOOST_CHECK(up_thread_sorryserver_disconnect_event_call_check);
1651             
1652             // UP_FUNC_SORRY_ENABLE_EVENT  up_thread_sorry_enable_event function 
1653             check_it = up_thread_function_array[UP_FUNC_SORRY_ENABLE_EVENT];
1654             BOOST_CHECK(check_it.second == NULL);
1655             
1656             // UP_FUNC_SORRY_DISABLE_EVENT  up_thread_sorry_disable_event function 
1657             check_it = up_thread_function_array[UP_FUNC_SORRY_DISABLE_EVENT];
1658             BOOST_CHECK(check_it.second == NULL);
1659             
1660             // UP_FUNC_EXIT  up_thread_exit function 
1661             check_it = up_thread_function_array[UP_FUNC_EXIT];
1662             BOOST_CHECK(check_it.second != NULL);
1663             up_thread_exit_call_check = false;
1664             check_it.second(LOCAL_PROC);
1665             BOOST_CHECK(up_thread_exit_call_check);
1666             
1667         };
1668         
1669         void check_down_thread_function_map(){
1670             down_thread_function_pair check_it;
1671             
1672             // DOWN_FUNC_CLIENT_DISCONNECT  down_thread_client_disconnect function 
1673             check_it = down_thread_function_array[DOWN_FUNC_CLIENT_DISCONNECT];
1674             BOOST_CHECK(check_it.second != NULL);
1675             down_thread_client_disconnect_call_check = false;
1676             check_it.second(LOCAL_PROC);
1677             BOOST_CHECK(down_thread_client_disconnect_call_check);
1678             
1679             // DOWN_FUNC_CLIENT_DISCONNECT_EVENT  down_thread_client_disconnect_event function 
1680             check_it = down_thread_function_array[DOWN_FUNC_CLIENT_DISCONNECT_EVENT];
1681             BOOST_CHECK(check_it.second != NULL);
1682             down_thread_client_disconnect_event_call_check = false;
1683             check_it.second(LOCAL_PROC);
1684             BOOST_CHECK(down_thread_client_disconnect_event_call_check);
1685             
1686             // DOWN_FUNC_CLIENT_CONNECTION_CHK  down_thread_client_connection_chk_event function 
1687             check_it = down_thread_function_array[DOWN_FUNC_CLIENT_CONNECTION_CHK];
1688             BOOST_CHECK(check_it.second != NULL);
1689             down_thread_client_connection_chk_event_call_check = false;
1690             check_it.second(LOCAL_PROC);
1691             BOOST_CHECK(down_thread_client_connection_chk_event_call_check);
1692             
1693             // DOWN_FUNC_CLIENT_SEND  down_thread_client_send function 
1694             check_it = down_thread_function_array[DOWN_FUNC_CLIENT_SEND];
1695             BOOST_CHECK(check_it.second != NULL);
1696             down_thread_client_send_call_check = false;
1697             check_it.second(LOCAL_PROC);
1698             BOOST_CHECK(down_thread_client_send_call_check);
1699             
1700             // DOWN_FUNC_CLIENT_RESPOND_SEND_EVENT  down_thread_client_respond_event function 
1701             check_it = down_thread_function_array[DOWN_FUNC_CLIENT_RESPOND_SEND_EVENT];
1702             BOOST_CHECK(check_it.second == NULL);
1703             
1704             // DOWN_FUNC_REALSERVER_RECEIVE  down_thread_realserver_receive function 
1705             check_it = down_thread_function_array[DOWN_FUNC_REALSERVER_RECEIVE];
1706             BOOST_CHECK(check_it.second != NULL);
1707             down_thread_realserver_receive_call_check = false;
1708             check_it.second(LOCAL_PROC);
1709             BOOST_CHECK(down_thread_realserver_receive_call_check);
1710             
1711             // DOWN_FUNC_REALSERVER_DISCONNECT  down_thread_realserver_disconnect function 
1712             check_it = down_thread_function_array[DOWN_FUNC_REALSERVER_DISCONNECT];
1713             BOOST_CHECK(check_it.second != NULL);
1714             down_thread_realserver_disconnect_call_check = false;
1715             check_it.second(LOCAL_PROC);
1716             BOOST_CHECK(down_thread_realserver_disconnect_call_check);
1717             
1718             // DOWN_FUNC_REALSERVER_DISCONNECT_EVENT  down_thread_realserver_disconnect_event function 
1719             check_it = down_thread_function_array[DOWN_FUNC_REALSERVER_DISCONNECT_EVENT];
1720             BOOST_CHECK(check_it.second != NULL);
1721             down_thread_realserver_disconnect_event_call_check = false;
1722             check_it.second(LOCAL_PROC);
1723             BOOST_CHECK(down_thread_realserver_disconnect_event_call_check);
1724             
1725             // DOWN_FUNC_REALSERVER_ALL_DISCONNECT  down_thread_all_realserver_disconnect function 
1726             check_it = down_thread_function_array[DOWN_FUNC_REALSERVER_ALL_DISCONNECT];
1727             BOOST_CHECK(check_it.second != NULL);
1728             down_thread_all_realserver_disconnect_call_check = false;
1729             check_it.second(LOCAL_PROC);
1730             BOOST_CHECK(down_thread_all_realserver_disconnect_call_check);
1731             
1732             // DOWN_FUNC_SORRYSERVER_RECEIVE  down_thread_sorryserver_receive function 
1733             check_it = down_thread_function_array[DOWN_FUNC_SORRYSERVER_RECEIVE];
1734             BOOST_CHECK(check_it.second != NULL);
1735             down_thread_sorryserver_receive_call_check = false;
1736             check_it.second(LOCAL_PROC);
1737             BOOST_CHECK(down_thread_sorryserver_receive_call_check);
1738             
1739             // DOWN_FUNC_SORRYSERVER_DISCONNECT  down_thread_sorryserver_disconnect function 
1740             check_it = down_thread_function_array[DOWN_FUNC_SORRYSERVER_DISCONNECT];
1741             BOOST_CHECK(check_it.second != NULL);
1742             down_thread_sorryserver_disconnect_call_check = false;
1743             check_it.second(LOCAL_PROC);
1744             BOOST_CHECK(down_thread_sorryserver_disconnect_call_check);
1745             
1746             // DOWN_FUNC_SORRYSERVER_MOD_DISCONNECT  down_thread_sorryserver_mod_disconnect function
1747             check_it = down_thread_function_array[DOWN_FUNC_SORRYSERVER_MOD_DISCONNECT];
1748             BOOST_CHECK(check_it.second != NULL);
1749             down_thread_sorryserver_mod_disconnect_call_check = false;
1750             check_it.second(LOCAL_PROC);
1751             BOOST_CHECK(down_thread_sorryserver_mod_disconnect_call_check);
1752             
1753             // DOWN_FUNC_SORRYSERVER_DISCONNECT_EVENT  down_thread_sorryserver_disconnect_event function 
1754             check_it = down_thread_function_array[DOWN_FUNC_SORRYSERVER_DISCONNECT_EVENT];
1755             BOOST_CHECK(check_it.second != NULL);
1756             down_thread_sorryserver_disconnect_event_call_check = false;
1757             check_it.second(LOCAL_PROC);
1758             BOOST_CHECK(down_thread_sorryserver_disconnect_event_call_check);
1759             
1760             // DOWN_FUNC_SORRY_ENABLE_EVENT  down_thread_sorry_enable_event function 
1761             check_it = down_thread_function_array[DOWN_FUNC_SORRY_ENABLE_EVENT];
1762             BOOST_CHECK(check_it.second == NULL);
1763             
1764             // DOWN_FUNC_SORRY_DISABLE_EVENT  down_thread_sorry_disable_event function 
1765             check_it = down_thread_function_array[DOWN_FUNC_SORRY_DISABLE_EVENT];
1766             BOOST_CHECK(check_it.second == NULL);
1767             
1768             // DOWN_FUNC_EXIT  down_thread_exit function 
1769             check_it = down_thread_function_array[DOWN_FUNC_EXIT];
1770             BOOST_CHECK(check_it.second != NULL);
1771             down_thread_exit_call_check = false;
1772             check_it.second(LOCAL_PROC);
1773             BOOST_CHECK(down_thread_exit_call_check);
1774             
1775         }
1776         
1777         void check_up_thread_message_down_thread_function_map(){
1778             std::map< DOWN_THREAD_FUNC_TYPE_TAG, tcp_session_func >::iterator check_it;
1779             
1780             // DOWN_FUNC_CLIENT_DISCONNECT  down_thread_client_disconnect function 
1781             check_it = up_thread_message_down_thread_function_map.find(DOWN_FUNC_CLIENT_DISCONNECT);
1782             BOOST_CHECK(check_it == up_thread_message_down_thread_function_map.end());
1783             
1784             // DOWN_FUNC_CLIENT_DISCONNECT_EVENT  down_thread_client_disconnect_event function 
1785             check_it = up_thread_message_down_thread_function_map.find(DOWN_FUNC_CLIENT_DISCONNECT_EVENT);
1786             BOOST_CHECK(check_it != up_thread_message_down_thread_function_map.end());
1787             down_thread_client_disconnect_event_call_check = false;
1788             check_it->second(LOCAL_PROC);
1789             BOOST_CHECK(down_thread_client_disconnect_event_call_check);
1790             
1791             // DOWN_FUNC_CLIENT_CONNECTION_CHK  down_thread_client_connection_chk_event function 
1792             check_it = up_thread_message_down_thread_function_map.find(DOWN_FUNC_CLIENT_CONNECTION_CHK);
1793             BOOST_CHECK(check_it == up_thread_message_down_thread_function_map.end());
1794             
1795             // DOWN_FUNC_CLIENT_SEND  down_thread_client_send function 
1796             check_it = up_thread_message_down_thread_function_map.find(DOWN_FUNC_CLIENT_SEND);
1797             BOOST_CHECK(check_it == up_thread_message_down_thread_function_map.end());
1798             
1799             // DOWN_FUNC_CLIENT_RESPOND_SEND_EVENT  down_thread_client_respond_event function 
1800             check_it = up_thread_message_down_thread_function_map.find(DOWN_FUNC_CLIENT_RESPOND_SEND_EVENT);
1801             BOOST_CHECK(check_it != up_thread_message_down_thread_function_map.end());
1802             down_thread_client_respond_event_call_check = false;
1803             check_it->second(LOCAL_PROC);
1804             BOOST_CHECK(down_thread_client_respond_event_call_check);
1805             
1806             // DOWN_FUNC_REALSERVER_RECEIVE  down_thread_realserver_receive function 
1807             check_it = up_thread_message_down_thread_function_map.find(DOWN_FUNC_REALSERVER_RECEIVE);
1808             BOOST_CHECK(check_it == up_thread_message_down_thread_function_map.end());
1809             
1810             // DOWN_FUNC_REALSERVER_DISCONNECT  down_thread_realserver_disconnect function 
1811             check_it = up_thread_message_down_thread_function_map.find(DOWN_FUNC_REALSERVER_DISCONNECT);
1812             BOOST_CHECK(check_it == up_thread_message_down_thread_function_map.end());
1813             
1814             // DOWN_FUNC_REALSERVER_DISCONNECT_EVENT  down_thread_realserver_disconnect_event function 
1815             check_it = up_thread_message_down_thread_function_map.find(DOWN_FUNC_REALSERVER_DISCONNECT_EVENT);
1816             BOOST_CHECK(check_it != up_thread_message_down_thread_function_map.end());
1817             down_thread_realserver_disconnect_event_call_check = false;
1818             check_it->second(LOCAL_PROC);
1819             BOOST_CHECK(down_thread_realserver_disconnect_event_call_check);
1820             
1821             // DOWN_FUNC_REALSERVER_ALL_DISCONNECT  down_thread_all_realserver_disconnect function 
1822             check_it = up_thread_message_down_thread_function_map.find(DOWN_FUNC_REALSERVER_ALL_DISCONNECT);
1823             BOOST_CHECK(check_it == up_thread_message_down_thread_function_map.end());
1824             
1825             // DOWN_FUNC_SORRYSERVER_RECEIVE  down_thread_sorryserver_receive function 
1826             check_it = up_thread_message_down_thread_function_map.find(DOWN_FUNC_SORRYSERVER_RECEIVE);
1827             BOOST_CHECK(check_it == up_thread_message_down_thread_function_map.end());
1828             
1829             // DOWN_FUNC_SORRYSERVER_DISCONNECT  down_thread_sorryserver_disconnect function 
1830             check_it = up_thread_message_down_thread_function_map.find(DOWN_FUNC_SORRYSERVER_DISCONNECT);
1831             BOOST_CHECK(check_it == up_thread_message_down_thread_function_map.end());
1832             
1833             // DOWN_FUNC_SORRYSERVER_DISCONNECT_EVENT  down_thread_sorryserver_disconnect_event function 
1834             check_it = up_thread_message_down_thread_function_map.find(DOWN_FUNC_SORRYSERVER_DISCONNECT_EVENT);
1835             BOOST_CHECK(check_it != up_thread_message_down_thread_function_map.end());
1836             down_thread_sorryserver_disconnect_event_call_check = false;
1837             check_it->second(LOCAL_PROC);
1838             BOOST_CHECK(down_thread_sorryserver_disconnect_event_call_check);
1839             
1840             // DOWN_FUNC_SORRY_ENABLE_EVENT  down_thread_sorry_enable_event function 
1841             check_it = up_thread_message_down_thread_function_map.find(DOWN_FUNC_SORRY_ENABLE_EVENT);
1842             BOOST_CHECK(check_it == up_thread_message_down_thread_function_map.end());
1843             
1844             // DOWN_FUNC_SORRY_DISABLE_EVENT  down_thread_sorry_disable_event function 
1845             check_it = up_thread_message_down_thread_function_map.find(DOWN_FUNC_SORRY_DISABLE_EVENT);
1846             BOOST_CHECK(check_it == up_thread_message_down_thread_function_map.end());
1847             
1848             // DOWN_FUNC_EXIT  down_thread_exit function 
1849             check_it = up_thread_message_down_thread_function_map.find(DOWN_FUNC_EXIT);
1850             BOOST_CHECK(check_it == up_thread_message_down_thread_function_map.end());
1851         }
1852         
1853         void check_down_thread_message_up_thread_function_map(){
1854             std::map< UP_THREAD_FUNC_TYPE_TAG, tcp_session_func >::iterator check_it;
1855             
1856             // UP_FUNC_CLIENT_ACCEPT  up_thread_client_accept_event function 
1857             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_CLIENT_ACCEPT);
1858             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1859             
1860             // UP_FUNC_CLIENT_DISCONNECT  up_thread_client_disconnect function 
1861             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_CLIENT_DISCONNECT);
1862             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1863             
1864             // UP_FUNC_CLIENT_DISCONNECT_EVENT  up_thread_client_disconnect_event function 
1865             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_CLIENT_DISCONNECT_EVENT);
1866             BOOST_CHECK(check_it != down_thread_message_up_thread_function_map.end());
1867             up_thread_client_disconnect_event_call_check = false;
1868             check_it->second(LOCAL_PROC);
1869             BOOST_CHECK(up_thread_client_disconnect_event_call_check);
1870             
1871             // UP_FUNC_CLIENT_RECEIVE  up_thread_client_receive function 
1872             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_CLIENT_RECEIVE);
1873             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1874             
1875             // UP_FUNC_CLIENT_RESPOND_SEND  up_thread_client_respond function 
1876             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_CLIENT_RESPOND_SEND);
1877             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1878             
1879             // UP_FUNC_CLIENT_RESPOND_SEND_EVENT  up_thread_client_respond_event function 
1880             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_CLIENT_RESPOND_SEND_EVENT);
1881             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1882             
1883             // UP_FUNC_REALSERVER_GET_DEST_EVENT  up_thread_realserver_get_distination_event function 
1884             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_REALSERVER_GET_DEST_EVENT);
1885             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1886             
1887             // UP_FUNC_REALSERVER_CONNECT  up_thread_realserver_connect function 
1888             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_REALSERVER_CONNECT);
1889             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1890             
1891             // UP_FUNC_REALSERVER_CONNECT_EVENT  _event function 
1892             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_REALSERVER_CONNECT_EVENT);
1893             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1894             
1895             // UP_FUNC_REALSERVER_CONNECT_FAIL_EVENT  up_thread_realserver_connection_fail_event function 
1896             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_REALSERVER_CONNECT_FAIL_EVENT);
1897             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1898             
1899             // UP_FUNC_REALSERVER_SEND  up_thread_realserver_send function 
1900             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_REALSERVER_SEND);
1901             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1902             
1903             // UP_FUNC_REALSERVER_DISCONNECT  up_thread_realserver_disconnect function 
1904             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_REALSERVER_DISCONNECT);
1905             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1906             
1907             // UP_FUNC_REALSERVER_DISCONNECT_EVENT  up_thread_realserver_disconnect_event function 
1908             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_REALSERVER_DISCONNECT_EVENT);
1909             BOOST_CHECK(check_it != down_thread_message_up_thread_function_map.end());
1910             up_thread_realserver_disconnect_event_call_check = false;
1911             check_it->second(LOCAL_PROC);
1912             BOOST_CHECK(up_thread_realserver_disconnect_event_call_check);
1913             
1914             // UP_FUNC_REALSERVER_ALL_DISCONNECT  up_thread_all_realserver_disconnect function 
1915             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_REALSERVER_ALL_DISCONNECT);
1916             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1917             
1918             // UP_FUNC_SORRYSERVER_GET_DEST  up_thread_sorryserver_get_destination_event function 
1919             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_SORRYSERVER_GET_DEST);
1920             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1921             
1922             // UP_FUNC_SORRYSERVER_CONNECT  up_thread_sorryserver_connect function 
1923             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_SORRYSERVER_CONNECT);
1924             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1925             
1926             // UP_FUNC_SORRYSERVER_CONNECT_EVENT  up_thread_sorryserver_connect_event function 
1927             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_SORRYSERVER_CONNECT_EVENT);
1928             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1929             
1930             // UP_FUNC_SORRYSERVER_CONNECT_FAIL_EVENT  up_thread_sorryserver_connection_fail_event function 
1931             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_SORRYSERVER_CONNECT_FAIL_EVENT);
1932             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1933             
1934             // UP_FUNC_SORRYSERVER_SEND  up_thread_sorryserver_send function 
1935             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_SORRYSERVER_SEND);
1936             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1937             
1938             // UP_FUNC_SORRYSERVER_DISCONNECT  up_thread_sorryserver_disconnect function 
1939             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_SORRYSERVER_DISCONNECT);
1940             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1941             
1942             // UP_FUNC_SORRYSERVER_DISCONNECT_EVENT  up_thread_sorryserver_disconnect_event function 
1943             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_SORRYSERVER_DISCONNECT_EVENT);
1944             BOOST_CHECK(check_it != down_thread_message_up_thread_function_map.end());
1945             up_thread_sorryserver_disconnect_event_call_check = false;
1946             check_it->second(LOCAL_PROC);
1947             BOOST_CHECK(up_thread_sorryserver_disconnect_event_call_check);
1948             
1949             // UP_FUNC_SORRY_ENABLE_EVENT  up_thread_sorry_enable_event function 
1950             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_SORRY_ENABLE_EVENT);
1951             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1952             
1953             // UP_FUNC_SORRY_DISABLE_EVENT  up_thread_sorry_disable_event function 
1954             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_SORRY_DISABLE_EVENT);
1955             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1956             
1957             // UP_FUNC_EXIT  up_thread_exit function 
1958             check_it = down_thread_message_up_thread_function_map.find(UP_FUNC_EXIT);
1959             BOOST_CHECK(check_it == down_thread_message_up_thread_function_map.end());
1960         }
1961         
1962         void check_virtual_service_message_up_thread_function_map(){
1963             std::map< TCP_VIRTUAL_SERVICE_MESSAGE_TAG, tcp_session_func >::iterator check_it;
1964             // SORRY_STATE_ENABLE  up_thread_sorry_enable_event function 
1965             check_it = virtual_service_message_up_thread_function_map.find(SORRY_STATE_ENABLE);
1966             BOOST_CHECK(check_it != virtual_service_message_up_thread_function_map.end());
1967             up_thread_sorry_enable_event_call_check = false;
1968             check_it->second(LOCAL_PROC);
1969             BOOST_CHECK(up_thread_sorry_enable_event_call_check);
1970             
1971             // SORRY_STATE_DISABLE  up_thread_sorry_disable_event function 
1972             check_it = virtual_service_message_up_thread_function_map.find(SORRY_STATE_DISABLE);
1973             BOOST_CHECK(check_it != virtual_service_message_up_thread_function_map.end());
1974             up_thread_sorry_disable_event_call_check = false;
1975             check_it->second(LOCAL_PROC);
1976             BOOST_CHECK(up_thread_sorry_disable_event_call_check);
1977             
1978             // SESSION_END  up_thread_exit function 
1979             check_it = virtual_service_message_up_thread_function_map.find(SESSION_END);
1980             BOOST_CHECK(check_it != virtual_service_message_up_thread_function_map.end());
1981             up_thread_exit_call_check = false;
1982             check_it->second(LOCAL_PROC);
1983             BOOST_CHECK(up_thread_exit_call_check);
1984             
1985             // SESSION_PAUSE_ON  non function 
1986             check_it = virtual_service_message_up_thread_function_map.find(SESSION_PAUSE_ON);
1987             BOOST_CHECK(check_it == virtual_service_message_up_thread_function_map.end());
1988             
1989             // SESSION_PAUSE_OFF  non function 
1990             check_it = virtual_service_message_up_thread_function_map.find(SESSION_PAUSE_OFF);
1991             BOOST_CHECK(check_it == virtual_service_message_up_thread_function_map.end());
1992         }
1993         
1994         void check_virtual_service_message_down_thread_function_map(){
1995             std::map< TCP_VIRTUAL_SERVICE_MESSAGE_TAG, tcp_session_func >::iterator check_it;
1996             // SORRY_STATE_ENABLE  down_thread_sorry_enable_event function 
1997             check_it = virtual_service_message_down_thread_function_map.find(SORRY_STATE_ENABLE);
1998             BOOST_CHECK(check_it != virtual_service_message_down_thread_function_map.end());
1999             down_thread_sorry_enable_event_call_check = false;
2000             check_it->second(LOCAL_PROC);
2001             BOOST_CHECK(down_thread_sorry_enable_event_call_check);
2002             
2003             // SORRY_STATE_DISABLE  down_thread_sorry_disable_event function 
2004             check_it = virtual_service_message_down_thread_function_map.find(SORRY_STATE_DISABLE);
2005             BOOST_CHECK(check_it != virtual_service_message_down_thread_function_map.end());
2006             down_thread_sorry_disable_event_call_check = false;
2007             check_it->second(LOCAL_PROC);
2008             BOOST_CHECK(down_thread_sorry_disable_event_call_check);
2009             
2010             // SESSION_END  down_thread_exit function 
2011             check_it = virtual_service_message_down_thread_function_map.find(SESSION_END);
2012             BOOST_CHECK(check_it != virtual_service_message_down_thread_function_map.end());
2013             down_thread_exit_call_check = false;
2014             check_it->second(LOCAL_PROC);
2015             BOOST_CHECK(down_thread_exit_call_check);
2016             
2017             // SESSION_PAUSE_ON  non function 
2018             check_it = virtual_service_message_down_thread_function_map.find(SESSION_PAUSE_ON);
2019             BOOST_CHECK(check_it == virtual_service_message_down_thread_function_map.end());
2020             
2021             // SESSION_PAUSE_OFF  non function 
2022             check_it = virtual_service_message_down_thread_function_map.find(SESSION_PAUSE_OFF);
2023             BOOST_CHECK(check_it == virtual_service_message_down_thread_function_map.end());
2024         }
2025 };
2026 void constructer_test(){
2027     BOOST_MESSAGE( "----- constructer test start -----" );
2028
2029     l7vs::virtualservice_tcp vs;
2030     boost::asio::io_service io;
2031     l7vs::tcp_socket_option_info set_option;
2032     //! TCP_NODELAY   (false:not set,true:set option)
2033     set_option.nodelay_opt = true;
2034     //! TCP_NODELAY option value  (false:off,true:on)
2035     set_option.nodelay_val = true;
2036     //! TCP_CORK      (false:not set,true:set option)
2037     set_option.cork_opt = true;
2038     //! TCP_CORK option value     (false:off,true:on)
2039     set_option.cork_val = true;
2040     //! TCP_QUICKACK  (false:not set,true:set option)
2041     set_option.quickack_opt = true;
2042     //! TCP_QUICKACK option value (false:off,true:on)
2043     set_option.quickack_val = true;
2044     //
2045     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
2046     bool set_mode(true);
2047     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
2048     bool set_ssl_cache_flag(true);
2049     int set_ssl_handshake_time_out = 111;
2050     std::string access_log_file_name = "test";
2051     l7vs::logger_implement_access* plogger = new l7vs::logger_implement_access(access_log_file_name);
2052     
2053     constructer_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
2054    
2055     // unit_test [1] constructer initialize member check
2056     std::cerr << "[1] constructer initialize member check" << std::endl;
2057     BOOST_CHECK_EQUAL(&io , &test_obj.get_io());
2058     BOOST_CHECK_EQUAL(&vs,&test_obj.get_parent_service());
2059     BOOST_CHECK(!test_obj.get_exit_flag());
2060 //    std::bitset<TCP_SESSION_THREAD_STATE_BIT> ref;
2061 //    ref.reset();
2062 //    BOOST_CHECK_EQUAL(ref,test_obj.get_thread_state());
2063     BOOST_CHECK_EQUAL(0, test_obj.get_up_status());
2064     BOOST_CHECK_EQUAL(0, test_obj.get_down_status());
2065     BOOST_CHECK_EQUAL((void*)NULL,test_obj.get_protocol_module());
2066 //    BOOST_CHECK(!test_obj.get_session_pause_flag());
2067     BOOST_CHECK_EQUAL(&io , &(test_obj.get_client_socket().get_socket().get_io_service()));
2068     BOOST_CHECK_EQUAL(&io , &(test_obj.get_sorry_socket()->get_socket().get_io_service()));
2069     // unit_test [2] constructer set up_thread_module_event_map check
2070     std::cerr << "[2] constructer set up_thread_module_event_map check" << std::endl;
2071     test_obj.check_up_thread_module_event_map();
2072     // unit_test [3] constructer set down_thread_module_event_map check
2073     std::cerr << "[3] constructer set down_thread_module_event_map check" << std::endl;
2074     test_obj.check_down_thread_module_event_map();
2075     // unit_test [4] constructer set up_thread_function_map check
2076     std::cerr << "[4] constructer set up_thread_function_map check" << std::endl;
2077     test_obj.check_up_thread_function_map();
2078     // unit_test [5] constructer set down_thread_function_map check
2079     std::cerr << "[5] constructer set down_thread_function_map check" << std::endl;
2080     test_obj.check_down_thread_function_map();
2081     // unit_test [6] constructer set up_thread_message_down_thread_function_map check
2082     std::cerr << "[6] constructer set up_thread_message_down_thread_function_map check" << std::endl;
2083     test_obj.check_up_thread_message_down_thread_function_map();
2084     // unit_test [7] constructer set down_thread_message_up_thread_function_map check
2085     std::cerr << "[7] constructer set down_thread_message_up_thread_function_map check" << std::endl;
2086     test_obj.check_down_thread_message_up_thread_function_map();
2087     // unit_test [8] constructer set virtual_service_message_up_thread_function_map check
2088     std::cerr << "[8] constructer set virtual_service_message_up_thread_function_map check" << std::endl;
2089     test_obj.check_virtual_service_message_up_thread_function_map();
2090     // unit_test [9] constructer set virtual_service_message_down_thread_function_map check
2091     std::cerr << "[9] constructer set virtual_service_message_down_thread_function_map check" << std::endl;
2092     test_obj.check_virtual_service_message_down_thread_function_map();
2093     
2094     // unit_test [10] constructer set socket option check
2095     std::cerr << "[10] constructer set socket option check" << std::endl;
2096     //! TCP_NODELAY
2097     BOOST_CHECK_EQUAL(test_obj.get_socket_opt_info()->nodelay_opt , set_option.nodelay_opt);
2098     BOOST_CHECK_EQUAL(test_obj.get_socket_opt_info()->nodelay_val , set_option.nodelay_val);
2099     // unit_test [11] constructer set socket option check
2100     std::cerr << "[11] constructer set socket option check" << std::endl;
2101     //! TCP_CORK
2102     BOOST_CHECK_EQUAL(test_obj.get_socket_opt_info()->cork_opt , set_option.cork_opt);
2103     BOOST_CHECK_EQUAL(test_obj.get_socket_opt_info()->cork_val , set_option.cork_val);
2104     // unit_test [12] constructer set socket option check
2105     std::cerr << "[12] constructer set socket option check" << std::endl;
2106     //! TCP_QUICKACK
2107     BOOST_CHECK_EQUAL(test_obj.get_socket_opt_info()->quickack_opt , set_option.quickack_opt);
2108     BOOST_CHECK_EQUAL(test_obj.get_socket_opt_info()->quickack_val , set_option.quickack_val);
2109     
2110     // unit_test [13] constructer client socket set socket option check
2111     std::cerr << "[13] constructer client socket set socket option check" << std::endl;
2112     //! TCP_NODELAY
2113     BOOST_CHECK_EQUAL(test_obj.get_client_socket().opt_info.nodelay_opt , set_option.nodelay_opt);
2114     BOOST_CHECK_EQUAL(test_obj.get_client_socket().opt_info.nodelay_val , set_option.nodelay_val);
2115     //! TCP_CORK
2116     BOOST_CHECK_EQUAL(test_obj.get_client_socket().opt_info.cork_opt , set_option.cork_opt);
2117     BOOST_CHECK_EQUAL(test_obj.get_client_socket().opt_info.cork_val , set_option.cork_val);
2118     //! TCP_QUICKACK
2119     BOOST_CHECK_EQUAL(test_obj.get_client_socket().opt_info.quickack_opt , set_option.quickack_opt);
2120     BOOST_CHECK_EQUAL(test_obj.get_client_socket().opt_info.quickack_val , set_option.quickack_val);
2121     
2122     // unit_test [14] constructer sorry socket set socket option check
2123     std::cerr << "[14] constructer sorry socket set socket option check" << std::endl;
2124     //! TCP_NODELAY
2125     BOOST_CHECK_EQUAL(test_obj.get_sorry_socket()->opt_info.nodelay_opt , set_option.nodelay_opt);
2126     BOOST_CHECK_EQUAL(test_obj.get_sorry_socket()->opt_info.nodelay_val , set_option.nodelay_val);
2127     //! TCP_CORK
2128     BOOST_CHECK_EQUAL(test_obj.get_sorry_socket()->opt_info.cork_opt , set_option.cork_opt);
2129     BOOST_CHECK_EQUAL(test_obj.get_sorry_socket()->opt_info.cork_val , set_option.cork_val);
2130     //! TCP_QUICKACK
2131     BOOST_CHECK_EQUAL(test_obj.get_sorry_socket()->opt_info.quickack_opt , set_option.quickack_opt);
2132     BOOST_CHECK_EQUAL(test_obj.get_sorry_socket()->opt_info.quickack_val , set_option.quickack_val);
2133
2134     // unit_test [15] constructer client ssl socket set socket option check
2135     std::cerr << "[15] constructer client ssl socket set socket option check" << std::endl;
2136     //! TCP_NODELAY
2137     BOOST_CHECK_EQUAL(test_obj.get_client_ssl_socket().opt_info.nodelay_opt , set_option.nodelay_opt);
2138     BOOST_CHECK_EQUAL(test_obj.get_client_ssl_socket().opt_info.nodelay_val , set_option.nodelay_val);
2139     //! TCP_CORK
2140     BOOST_CHECK_EQUAL(test_obj.get_client_ssl_socket().opt_info.cork_opt , set_option.cork_opt);
2141     BOOST_CHECK_EQUAL(test_obj.get_client_ssl_socket().opt_info.cork_val , set_option.cork_val);
2142     //! TCP_QUICKACK
2143     BOOST_CHECK_EQUAL(test_obj.get_client_ssl_socket().opt_info.quickack_opt , set_option.quickack_opt);
2144     BOOST_CHECK_EQUAL(test_obj.get_client_ssl_socket().opt_info.quickack_val , set_option.quickack_val);
2145
2146     // unit_test [16] virtualservice_endpoint initialize check
2147     std::cerr << "[16] virtualservice_endpoint initialize check" << std::endl;
2148     BOOST_CHECK_EQUAL(test_obj.get_virtualservice_endpoint() , listen_endpoint);
2149
2150     // unit_test [17] accesslog_flag initialize check
2151     std::cerr << "[17] accesslog_flag initialize check" << std::endl;
2152     BOOST_CHECK_EQUAL(test_obj.get_accesslog_flag() , false); 
2153     
2154     // unit_test [18] access_loger initialize check
2155     std::cerr << "[18] access_loger initialize check" << std::endl;
2156     BOOST_CHECK_EQUAL(test_obj.get_access_logger() , plogger);
2157
2158     // unit_test [19] ssl_flag initialize check
2159     std::cerr << "[18] ssl_flag initialize check" << std::endl;
2160     BOOST_CHECK_EQUAL(test_obj.get_ssl_flag() , set_mode);
2161
2162     // unit_test [20] ssl_context initialize check
2163     std::cerr << "[20] ssl_context initialize check" << std::endl;
2164     BOOST_CHECK_EQUAL(&(test_obj.get_ssl_context()) , &set_context);
2165
2166     // unit_test [21] ssl_cache_flag initialize check
2167     std::cerr << "[21] ssl_cache_flag initialize check" << std::endl;
2168     BOOST_CHECK_EQUAL(test_obj.get_ssl_cache_flag() , set_ssl_cache_flag);
2169     
2170     // unit_test [22] ssl_handshake_timer_flag initialize check
2171     std::cerr << "[21] ssl_handshake_timer_flag initialize check" << std::endl;
2172     BOOST_CHECK_EQUAL(test_obj.get_ssl_handshake_timer_flag() , false);
2173     
2174     // unit_test [23] ssl_handshake_time_out initialize check
2175     std::cerr << "[23] ssl_handshake_time_out initialize check" << std::endl;
2176     BOOST_CHECK_EQUAL(test_obj.get_ssl_handshake_time_out() , set_ssl_handshake_time_out);
2177     
2178     // unit_test [23] ssl_handshake_timeout_flag initialize check
2179     std::cerr << "[23] ssl_handshake_timeout_flag initialize check" << std::endl;
2180     BOOST_CHECK_EQUAL(test_obj.get_ssl_handshake_timeout_flag() , false);
2181
2182     delete plogger;
2183     plogger = NULL;
2184
2185     BOOST_MESSAGE( "----- constructer test end -----" );
2186 }
2187
2188 // initialize test
2189 // initialize test class
2190 class initialize_test_class : public l7vs::tcp_session{
2191     public:
2192        initialize_test_class(
2193                                 l7vs::virtualservice_tcp& vs,
2194                                 boost::asio::io_service& session_io,
2195                                 l7vs::tcp_socket_option_info& set_socket_option,
2196                                 boost::asio::ip::tcp::endpoint listen_endpoint,
2197                                 bool ssl_mode,
2198                                 boost::asio::ssl::context& set_ssl_context,
2199                                 bool set_ssl_cache_flag,
2200                                 int set_ssl_handshake_time_out,
2201                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
2202                                                                                                    session_io,
2203                                                                                                    set_socket_option,
2204                                                                                                    listen_endpoint,
2205                                                                                                    ssl_mode,
2206                                                                                                    set_ssl_context,
2207                                                                                                    set_ssl_cache_flag,
2208                                                                                                    set_ssl_handshake_time_out,
2209                                                                                                    set_access_logger){};
2210
2211
2212         ~initialize_test_class(){};
2213         bool& get_exit_flag(){
2214             return (bool&)exit_flag;
2215         };
2216         boost::thread::id& get_up_thread_id(){
2217             return up_thread_id;
2218         };
2219         boost::thread::id& get_down_thread_id(){
2220             return down_thread_id;
2221         };
2222 /*
2223         std::bitset<TCP_SESSION_THREAD_STATE_BIT>& get_thread_state(){
2224             return thread_state;
2225         };
2226 */
2227         l7vs::tcp_session::UPTHREAD_STATUS_TAG get_up_status(){
2228             return upthread_status;
2229         };
2230         l7vs::tcp_session::DOWNTHREAD_STATUS_TAG get_down_status(){
2231             return downthread_status;
2232         };
2233         void set_up_status(int s){
2234             switch(s) {
2235             case 0:
2236                 upthread_status = l7vs::tcp_session::UPTHREAD_SLEEP;
2237                 break;
2238             case 1:
2239                 upthread_status = l7vs::tcp_session::UPTHREAD_ALIVE;
2240                 break;
2241             case 2:
2242                 upthread_status = l7vs::tcp_session::UPTHREAD_ACTIVE;
2243                 break;
2244             default:
2245                 upthread_status = l7vs::tcp_session::UPTHREAD_LOCK;
2246                 break;
2247             }
2248         };
2249         void set_down_status(int s){
2250             switch(s) {
2251             case 0:
2252                 downthread_status = l7vs::tcp_session::DOWNTHREAD_SLEEP;
2253                 break;
2254             case 1:
2255                 downthread_status = l7vs::tcp_session::DOWNTHREAD_ALIVE;
2256                 break;
2257             case 2:
2258                 downthread_status = l7vs::tcp_session::DOWNTHREAD_ACTIVE;
2259                 break;
2260             default:
2261                 downthread_status = l7vs::tcp_session::DOWNTHREAD_LOCK;
2262                 break;
2263             }
2264         };
2265                 
2266         l7vs::protocol_module_base* get_protocol_module(){
2267             return protocol_module;
2268         };
2269 /*
2270         bool& get_session_pause_flag(){
2271             return session_pause_flag;
2272         };
2273 */
2274         l7vs::lockfree_queue<l7vs::tcp_thread_message>& get_up_thread_message_que(){
2275             return up_thread_message_que;
2276         };
2277         l7vs::lockfree_queue<l7vs::tcp_thread_message>& get_down_thread_message_que(){
2278             return down_thread_message_que;
2279         };
2280
2281         int get_upstream_buffer_size(){
2282             return upstream_buffer_size;
2283         }
2284
2285         int get_downstream_buffer_size(){
2286             return downstream_buffer_size;
2287         }
2288
2289 };
2290 void initialize_test(){
2291     BOOST_MESSAGE( "----- initialize test start -----" );
2292
2293     l7vs::virtualservice_tcp vs;
2294     boost::asio::io_service io;
2295     l7vs::tcp_socket_option_info set_option;
2296     //! TCP_NODELAY   (false:not set,true:set option)
2297     set_option.nodelay_opt = false;
2298     //! TCP_NODELAY option value  (false:off,true:on)
2299     set_option.nodelay_val = false;
2300     //! TCP_CORK      (false:not set,true:set option)
2301     set_option.cork_opt = false;
2302     //! TCP_CORK option value     (false:off,true:on)
2303     set_option.cork_val = false;
2304     //! TCP_QUICKACK  (false:not set,true:set option)
2305     set_option.quickack_opt = false;
2306     //! TCP_QUICKACK option value (false:off,true:on)
2307     set_option.quickack_val = false;
2308     //
2309     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
2310     bool set_mode(false);
2311     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
2312     bool set_ssl_cache_flag(false);
2313     int set_ssl_handshake_time_out = 0;
2314     //std::string access_log_file_name = "test";
2315     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
2316
2317     initialize_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
2318
2319     
2320     std::string test_protocol_name("test protocol");
2321     l7vs::test_protocol_module proto_test(test_protocol_name);
2322     vs.get_protocol_module_res = &proto_test;
2323     
2324     test_obj.get_exit_flag() = true;
2325     test_obj.get_up_thread_id() = boost::this_thread::get_id();
2326     test_obj.get_down_thread_id() = boost::this_thread::get_id();
2327 //    test_obj.get_thread_state().set();
2328     test_obj.set_up_status(1);
2329     test_obj.set_down_status(1);
2330     BOOST_CHECK(test_obj.get_protocol_module() != &proto_test);    
2331 //    test_obj.get_session_pause_flag() = true;
2332     l7vs::tcp_thread_message*    test_msg_up    = new l7vs::tcp_thread_message;
2333     l7vs::tcp_thread_message*    test_msg_dw    = new l7vs::tcp_thread_message;
2334     test_obj.get_up_thread_message_que().push(test_msg_up);
2335     BOOST_CHECK(!test_obj.get_up_thread_message_que().empty());
2336     test_obj.get_down_thread_message_que().push(test_msg_dw);
2337     BOOST_CHECK(!test_obj.get_down_thread_message_que().empty());
2338     
2339     l7vs::session_result_message res_msg = test_obj.initialize();
2340     
2341     // unit_test [1] initialize exit flag check
2342     std::cerr << "[1] initialize exit flag check" << std::endl;
2343     BOOST_CHECK(!test_obj.get_exit_flag());
2344     
2345     // unit_test [2] initialize up thread id check
2346     std::cerr << "[2] initialize up thread id check" << std::endl;
2347     BOOST_CHECK(test_obj.get_up_thread_id() == boost::thread::id());
2348     
2349     // unit_test [3] initialize down thread id check
2350     std::cerr << "[3] initialize down thread id check" << std::endl;
2351     BOOST_CHECK(test_obj.get_down_thread_id() == boost::thread::id());
2352     
2353     // unit_test [4] initialize thread state check
2354     std::cerr << "[4] initialize thread state check" << std::endl;
2355 //    BOOST_CHECK(test_obj.get_thread_state().none());
2356     BOOST_CHECK(test_obj.get_up_status() == 0);
2357     BOOST_CHECK(test_obj.get_down_status() == 0);
2358     
2359     // unit_test [5] initialize session pause flag check
2360     std::cerr << "[5] initialize session pause flag check" << std::endl;
2361 //    BOOST_CHECK(!test_obj.get_session_pause_flag());
2362     
2363     // unit_test [6] initialize up thread message que check
2364     std::cerr << "[6] initialize up thread message que check" << std::endl;
2365     BOOST_CHECK(test_obj.get_up_thread_message_que().empty());
2366         test_msg_up = NULL;
2367     
2368     // unit_test [7] initialize down thread message que check
2369     std::cerr << "[7] initialize down thread message que check" << std::endl;
2370     BOOST_CHECK(test_obj.get_down_thread_message_que().empty());
2371         test_msg_dw = NULL;
2372     
2373     // unit_test [8] initialize get protocol module pointer check
2374     std::cerr << "[8] initialize get protocol module pointer check" << std::endl;
2375     BOOST_CHECK(test_obj.get_protocol_module() == &proto_test);
2376     
2377     // unit_test [9] initialize session_result_message flag check
2378     std::cerr << "[9] initialize session_result_message flag check" << std::endl;
2379     BOOST_CHECK(!res_msg.flag);
2380     
2381     // unit_test [10] initialize upstream_buffer_size load cf check
2382     std::cerr << "[10] initialize upstream_buffer_size load cf check" << std::endl;
2383     BOOST_CHECK_EQUAL(test_obj.get_upstream_buffer_size() , 7777);
2384
2385     // unit_test [11] initialize downstream_buffer_size load cf check
2386     std::cerr << "[11] initialize downstream_buffer_size load cf check" << std::endl;
2387     BOOST_CHECK_EQUAL(test_obj.get_downstream_buffer_size() , 8888);
2388
2389     // unit_test [12] initialize protocol_module NULL error check
2390     std::cerr << "[12] initialize protocol_module NULL error check" << std::endl;
2391     vs.get_protocol_module_res = NULL;
2392     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
2393     l7vs::Logger::putLogError_id = 0;
2394     res_msg = test_obj.initialize();
2395     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
2396     BOOST_CHECK_EQUAL(5,l7vs::Logger::putLogError_id);
2397     std::cerr << l7vs::Logger::putLogError_message << std::endl;
2398     BOOST_CHECK(res_msg.flag);
2399     std::cerr << res_msg.message << std::endl;
2400     
2401     BOOST_MESSAGE( "----- initialize test end -----" );
2402 }
2403
2404
2405 // get_client_socket test
2406 // get_client_socket test class
2407 class get_client_socket_test_class : public l7vs::tcp_session{
2408     public:
2409        // get_client_socket_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){};
2410        get_client_socket_test_class(
2411                                 l7vs::virtualservice_tcp& vs,
2412                                 boost::asio::io_service& session_io,
2413                                 l7vs::tcp_socket_option_info& set_socket_option,
2414                                 boost::asio::ip::tcp::endpoint listen_endpoint,
2415                                 bool ssl_mode,
2416                                 boost::asio::ssl::context& set_ssl_context,
2417                                 bool set_ssl_cache_flag,
2418                                 int set_ssl_handshake_time_out,
2419                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
2420                                                                                                    session_io,
2421                                                                                                    set_socket_option,
2422                                                                                                    listen_endpoint,
2423                                                                                                    ssl_mode,
2424                                                                                                    set_ssl_context,
2425                                                                                                    set_ssl_cache_flag,
2426                                                                                                    set_ssl_handshake_time_out,
2427                                                                                                    set_access_logger){};
2428
2429
2430
2431         ~get_client_socket_test_class(){};
2432         l7vs::tcp_socket& get_client_tcp_socket(){
2433             return client_socket;
2434         };
2435         l7vs::tcp_ssl_socket& get_client_ssl_tcp_socket(){
2436             return client_ssl_socket;
2437         };
2438
2439 };
2440
2441 void get_client_socket_test(){
2442     BOOST_MESSAGE( "----- get_client_socket test start -----" );
2443    
2444
2445  
2446 //    boost::asio::io_service io;
2447 //    l7vs::virtualservice_tcp vs;
2448 //    get_client_socket_test_class test_obj(vs,io);
2449     l7vs::virtualservice_tcp vs;
2450     boost::asio::io_service io;
2451     l7vs::tcp_socket_option_info set_option;
2452     //! TCP_NODELAY   (false:not set,true:set option)
2453     set_option.nodelay_opt = false;
2454     //! TCP_NODELAY option value  (false:off,true:on)
2455     set_option.nodelay_val = false;
2456     //! TCP_CORK      (false:not set,true:set option)
2457     set_option.cork_opt = false;
2458     //! TCP_CORK option value     (false:off,true:on)
2459     set_option.cork_val = false;
2460     //! TCP_QUICKACK  (false:not set,true:set option)
2461     set_option.quickack_opt = false;
2462     //! TCP_QUICKACK option value (false:off,true:on)
2463     set_option.quickack_val = false;
2464     //
2465     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
2466     bool set_mode(false);
2467     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
2468     bool set_ssl_cache_flag(false);
2469     int set_ssl_handshake_time_out = 0;
2470     //std::string access_log_file_name = "test";
2471     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
2472
2473     get_client_socket_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
2474     
2475     
2476     l7vs::tcp_socket& ref_tcp_socket = test_obj.get_client_tcp_socket();
2477     boost::asio::ip::tcp::socket& ref_socket = ref_tcp_socket.my_socket;
2478     boost::asio::ip::tcp::socket& chk_socket = test_obj.get_client_socket();
2479
2480     // unit_test [1] get_client_socket check
2481     std::cerr << "[1] get_client_socket check" << std::endl;
2482     BOOST_CHECK_EQUAL(&ref_socket,&chk_socket);
2483
2484
2485     l7vs::tcp_ssl_socket& ref_tcp_ssl_socket = test_obj.get_client_ssl_tcp_socket();
2486     ssl_socket& ref_ssl_socket = ref_tcp_ssl_socket.get_socket();
2487     ssl_socket& chk_ssl_socket = test_obj.get_client_ssl_socket();
2488
2489     // unit_test [2] get_client_ssl_socket check
2490     std::cerr << "[2] get_client_ssl_socket check" << std::endl;
2491     BOOST_CHECK_EQUAL(&ref_ssl_socket,&chk_ssl_socket);
2492
2493     BOOST_MESSAGE( "----- get_client_socket test end -----" );
2494 }
2495
2496
2497 // handle_ssl_handshake_timer test
2498 // handle_ssl_handshake_timer test class
2499 class handle_ssl_handshake_timer_test_class : public l7vs::tcp_session{
2500     public:
2501 //        handle_ssl_handshake_timer_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){};
2502           handle_ssl_handshake_timer_test_class(
2503                                 l7vs::virtualservice_tcp& vs,
2504                                 boost::asio::io_service& session_io,
2505                                 l7vs::tcp_socket_option_info& set_socket_option,
2506                                 boost::asio::ip::tcp::endpoint listen_endpoint,
2507                                 bool ssl_mode,
2508                                 boost::asio::ssl::context& set_ssl_context,
2509                                 bool set_ssl_cache_flag,
2510                                 int set_ssl_handshake_time_out,
2511                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
2512                                                                                                    session_io,
2513                                                                                                    set_socket_option,
2514                                                                                                    listen_endpoint,
2515                                                                                                    ssl_mode,
2516                                                                                                    set_ssl_context,
2517                                                                                                    set_ssl_cache_flag,
2518                                                                                                    set_ssl_handshake_time_out,
2519                                                                                                    set_access_logger){};
2520
2521         ~handle_ssl_handshake_timer_test_class(){};
2522         bool& get_ssl_handshake_time_out_flag(){
2523             return ssl_handshake_time_out_flag;
2524         };
2525         void test_call(const boost::system::error_code& error){
2526             l7vs::tcp_session::handle_ssl_handshake_timer(error);
2527         };
2528 };
2529 void handle_ssl_handshake_timer_test(){
2530     
2531     BOOST_MESSAGE( "----- handle_ssl_handshake_timer test start -----" );
2532     
2533 //    boost::asio::io_service io;
2534 //    l7vs::virtualservice_tcp vs;
2535 //    up_thread_exit_test_class test_obj(vs,io);
2536
2537     l7vs::virtualservice_tcp vs;
2538     boost::asio::io_service io;
2539     l7vs::tcp_socket_option_info set_option;
2540     //! TCP_NODELAY   (false:not set,true:set option)
2541     set_option.nodelay_opt = false;
2542     //! TCP_NODELAY option value  (false:off,true:on)
2543     set_option.nodelay_val = false;
2544     //! TCP_CORK      (false:not set,true:set option)
2545     set_option.cork_opt = false;
2546     //! TCP_CORK option value     (false:off,true:on)
2547     set_option.cork_val = false;
2548     //! TCP_QUICKACK  (false:not set,true:set option)
2549     set_option.quickack_opt = false;
2550     //! TCP_QUICKACK option value (false:off,true:on)
2551     set_option.quickack_val = false;
2552     //
2553     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
2554     bool set_mode(false);
2555     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
2556     bool set_ssl_cache_flag(false);
2557     int set_ssl_handshake_time_out = 0;
2558     //std::string access_log_file_name = "test";
2559     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
2560
2561     handle_ssl_handshake_timer_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
2562
2563     // unit_test [1] ssl_handshake_time_out_flag  update check
2564     std::cerr << "[1] ssl_handshake_time_out_flag update check" << std::endl;
2565
2566     bool& ref_flag = test_obj.get_ssl_handshake_time_out_flag();
2567
2568     ref_flag = false;
2569
2570     boost::system::error_code test_call_ec;
2571     test_obj.test_call(test_call_ec);
2572
2573     BOOST_CHECK(ref_flag);
2574
2575     mutex_lock_test test_lock_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
2576
2577     test_lock_obj.set_handle_ssl_handshake_timer_test();
2578
2579     test_lock_obj.test_thread_wait.lock();
2580     boost::thread::id proc_id = boost::this_thread::get_id();
2581     test_lock_obj.befor_thread_id = proc_id;
2582     test_lock_obj.after_thread_id = proc_id;
2583     test_lock_obj.mutex_lock();
2584
2585     boost::thread test_thread(boost::bind(&mutex_lock_test::test_run,&test_lock_obj));
2586  
2587     BOOST_CHECK(test_lock_obj.befor_thread_id == proc_id);
2588     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
2589     
2590     boost::thread::id test_id = test_thread.get_id();
2591     
2592     BOOST_CHECK(test_id != proc_id);
2593     
2594     // test start
2595     test_lock_obj.test_thread_wait.unlock();
2596     sleep(1);
2597
2598     // unit_test [2] set_handle_ssl_handshake_timer_test thread block test (mutex lock)
2599     std::cerr << "[2] set_handle_ssl_handshake_timer_test thread block test (mutex lock)" << std::endl;
2600     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
2601     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
2602
2603     test_lock_obj.mutex_unlock();
2604     sleep(1);
2605
2606     // unit_test [3] set_handle_ssl_handshake_timer_test thread run test (mutex unlock)
2607     std::cerr << "[3] set_handle_ssl_handshake_timer_test thread run test (mutex unlock)" << std::endl;
2608     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
2609     BOOST_CHECK(test_lock_obj.after_thread_id == test_id);
2610
2611     BOOST_MESSAGE( "----- handle_ssl_handshake_timer test end -----" );
2612 }
2613
2614
2615 /*
2616 // is_thread_wait test
2617 // is_thread_wait test class
2618 class is_thread_wait_test_class : public l7vs::tcp_session{
2619     public:
2620 //        is_thread_wait_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){};
2621        is_thread_wait_test_class(
2622                                 l7vs::virtualservice_tcp& vs,
2623                                 boost::asio::io_service& session_io,
2624                                 l7vs::tcp_socket_option_info& set_socket_option,
2625                                 boost::asio::ip::tcp::endpoint listen_endpoint,
2626                                 bool ssl_mode,
2627                                 boost::asio::ssl::context& set_ssl_context,
2628                                 bool set_ssl_cache_flag,
2629                                 int set_ssl_handshake_time_out,
2630                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
2631                                                                                                    session_io,
2632                                                                                                    set_socket_option,
2633                                                                                                    listen_endpoint,
2634                                                                                                    ssl_mode,
2635                                                                                                    set_ssl_context,
2636                                                                                                    set_ssl_cache_flag,
2637                                                                                                    set_ssl_handshake_time_out,
2638                                                                                                    set_access_logger){};
2639
2640
2641
2642
2643         ~is_thread_wait_test_class(){};
2644         
2645         std::bitset<TCP_SESSION_THREAD_STATE_BIT>& get_thread_state(){
2646             return thread_state;
2647         };
2648         l7vs::tcp_session::UPTHREAD_STATUS_TAG get_up_status(){
2649             return upthread_status;
2650         };
2651         l7vs::tcp_session::DOWNTHREAD_STATUS_TAG get_down_status(){
2652             return downthread_status;
2653         };
2654 };
2655 void is_thread_wait_test(){
2656     BOOST_MESSAGE( "----- is_thread_wait test start -----" );
2657     
2658 //    boost::asio::io_service io;
2659 //    l7vs::virtualservice_tcp vs;
2660 //    is_thread_wait_test_class test_obj(vs,io);
2661     l7vs::virtualservice_tcp vs;
2662     boost::asio::io_service io;
2663     l7vs::tcp_socket_option_info set_option;
2664     //! TCP_NODELAY   (false:not set,true:set option)
2665     set_option.nodelay_opt = false;
2666     //! TCP_NODELAY option value  (false:off,true:on)
2667     set_option.nodelay_val = false;
2668     //! TCP_CORK      (false:not set,true:set option)
2669     set_option.cork_opt = false;
2670     //! TCP_CORK option value     (false:off,true:on)
2671     set_option.cork_val = false;
2672     //! TCP_QUICKACK  (false:not set,true:set option)
2673     set_option.quickack_opt = false;
2674     //! TCP_QUICKACK option value (false:off,true:on)
2675     set_option.quickack_val = false;
2676     //
2677     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
2678     bool set_mode(false);
2679     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
2680     bool set_ssl_cache_flag(false);
2681     int set_ssl_handshake_time_out = 0;
2682     //std::string access_log_file_name = "test";
2683     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
2684
2685     is_thread_wait_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
2686     
2687     std::bitset<TCP_SESSION_THREAD_STATE_BIT>& test_bitset = test_obj.get_thread_state();
2688     
2689     test_bitset.reset();
2690     BOOST_CHECK(test_bitset.none());
2691     BOOST_CHECK(!test_obj.is_thread_wait());
2692     
2693     // unit_test [1] is_thread_wait return check
2694     std::cerr << "[1] is_thread_wait return check" << std::endl;
2695     
2696     // UP_THREAD_ALIVE
2697     test_bitset.reset();
2698     BOOST_CHECK(test_bitset.none());
2699     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0001);
2700     BOOST_CHECK(!test_obj.is_thread_wait());
2701     
2702     // DOWN_THREAD_ALIVE
2703     test_bitset.reset();
2704     BOOST_CHECK(test_bitset.none());
2705     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0002);
2706     BOOST_CHECK(!test_obj.is_thread_wait());
2707     
2708     // UP_THREAD_ACTIVE
2709     test_bitset.reset();
2710     BOOST_CHECK(test_bitset.none());
2711     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0004);
2712     BOOST_CHECK(!test_obj.is_thread_wait());
2713     
2714     // DOWN_THREAD_ACTIVE
2715     test_bitset.reset();
2716     BOOST_CHECK(test_bitset.none());
2717     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0008);
2718     BOOST_CHECK(!test_obj.is_thread_wait());
2719     
2720     // UP_THREAD_LOCK
2721     test_bitset.reset();
2722     BOOST_CHECK(test_bitset.none());
2723     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0010);
2724     BOOST_CHECK(!test_obj.is_thread_wait());
2725     
2726     // DOWN_THREAD_LOCK
2727     test_bitset.reset();
2728     BOOST_CHECK(test_bitset.none());
2729     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0020);
2730     BOOST_CHECK(!test_obj.is_thread_wait());
2731     
2732     // UP_THREAD_LOCK & DOWN_THREAD_LOCK
2733     test_bitset.reset();
2734     BOOST_CHECK(test_bitset.none());
2735     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0010);
2736     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0020);
2737     BOOST_CHECK(test_obj.is_thread_wait());
2738     
2739     // UP_THREAD_ALIVE DOWN_THREAD_ALIVE UP_THREAD_ACTIVE DOWN_THREAD_ACTIVE
2740     test_bitset.reset();
2741     BOOST_CHECK(test_bitset.none());
2742     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0001);
2743     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0002);
2744     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0004);
2745     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0008);
2746     BOOST_CHECK(!test_obj.is_thread_wait());
2747     
2748     // UP_THREAD_ALIVE DOWN_THREAD_ALIVE UP_THREAD_ACTIVE DOWN_THREAD_ACTIVE UP_THREAD_LOCK
2749     test_bitset.reset();
2750     BOOST_CHECK(test_bitset.none());
2751     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0001);
2752     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0002);
2753     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0004);
2754     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0008);
2755     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0010);
2756     BOOST_CHECK(!test_obj.is_thread_wait());
2757     
2758     // UP_THREAD_ALIVE DOWN_THREAD_ALIVE UP_THREAD_ACTIVE DOWN_THREAD_ACTIVE DOWN_THREAD_LOCK
2759     test_bitset.reset();
2760     BOOST_CHECK(test_bitset.none());
2761     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0001);
2762     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0002);
2763     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0004);
2764     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0008);
2765     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0020);
2766     BOOST_CHECK(!test_obj.is_thread_wait());
2767     
2768     // UP_THREAD_ALIVE DOWN_THREAD_ALIVE UP_THREAD_ACTIVE DOWN_THREAD_ACTIVE UP_THREAD_LOCK DOWN_THREAD_LOCK
2769     test_bitset.reset();
2770     BOOST_CHECK(test_bitset.none());
2771     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0001);
2772     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0002);
2773     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0004);
2774     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0008);
2775     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0010);
2776     test_bitset |= std::bitset<TCP_SESSION_THREAD_STATE_BIT>(0x0020);
2777     BOOST_CHECK(test_obj.is_thread_wait());
2778     
2779     //mutex_lock_test test_lock_obj(vs,io);
2780     mutex_lock_test test_lock_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger); 
2781
2782
2783     test_lock_obj.set_up_thread_exit_test();
2784     
2785     test_lock_obj.test_thread_wait.lock();
2786     boost::thread::id proc_id = boost::this_thread::get_id();
2787     test_lock_obj.befor_thread_id = proc_id;
2788     test_lock_obj.after_thread_id = proc_id;
2789     test_lock_obj.mutex_lock();
2790     
2791     boost::thread test_thread(boost::bind(&mutex_lock_test::test_run,&test_lock_obj));
2792     
2793     BOOST_CHECK(test_lock_obj.befor_thread_id == proc_id);
2794     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
2795     
2796     boost::thread::id test_id = test_thread.get_id();
2797     
2798     BOOST_CHECK(test_id != proc_id);
2799     
2800     // test start
2801     test_lock_obj.test_thread_wait.unlock();
2802     sleep(1);
2803     
2804     // unit_test [2] is_thread_wait thread block test (mutex lock)
2805     std::cerr << "[2] is_thread_wait thread block test (mutex lock)" << std::endl;
2806     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
2807     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
2808     
2809     test_lock_obj.mutex_unlock();
2810     sleep(1);
2811     
2812     // unit_test [3] is_thread_wait thread run test (mutex unlock)
2813     std::cerr << "[3] is_thread_wait thread run test (mutex unlock)" << std::endl;
2814     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
2815     BOOST_CHECK(test_lock_obj.after_thread_id == test_id);
2816    
2817     BOOST_MESSAGE( "----- is_thread_wait test end -----" );    
2818 }
2819 */
2820
2821 // set_virtual_service_message test
2822 // set_virtual_service_message test class
2823 class set_virtual_service_message_test_class : public l7vs::tcp_session{
2824     public:
2825 //        set_virtual_service_message_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){};
2826         set_virtual_service_message_test_class(
2827                                 l7vs::virtualservice_tcp& vs,
2828                                 boost::asio::io_service& session_io,
2829                                 l7vs::tcp_socket_option_info& set_socket_option,
2830                                 boost::asio::ip::tcp::endpoint listen_endpoint,
2831                                 bool ssl_mode,
2832                                 boost::asio::ssl::context& set_ssl_context,
2833                                 bool set_ssl_cache_flag,
2834                                 int set_ssl_handshake_time_out,
2835                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
2836                                                                                                    session_io,
2837                                                                                                    set_socket_option,
2838                                                                                                    listen_endpoint,
2839                                                                                                    ssl_mode,
2840                                                                                                    set_ssl_context,
2841                                                                                                    set_ssl_cache_flag,
2842                                                                                                    set_ssl_handshake_time_out,
2843                                                                                                    set_access_logger){};
2844
2845
2846
2847
2848         ~set_virtual_service_message_test_class(){};
2849         
2850 /*
2851         bool& get_session_pause_flag(){
2852             return session_pause_flag;
2853         }
2854 */
2855
2856         bool& get_access_log_flag(){
2857             return access_log_flag;
2858         }
2859         
2860         l7vs::lockfree_queue<l7vs::tcp_thread_message>& get_up_thread_message_que(){
2861             return up_thread_message_que;
2862         };
2863         
2864         l7vs::lockfree_queue<l7vs::tcp_thread_message>& get_down_thread_message_que(){
2865             return down_thread_message_que;
2866         };
2867         
2868         std::map< TCP_VIRTUAL_SERVICE_MESSAGE_TAG, tcp_session_func>& get_virtual_service_message_up_thread_function_map(){
2869             return virtual_service_message_up_thread_function_map;
2870         };
2871         
2872         std::map< TCP_VIRTUAL_SERVICE_MESSAGE_TAG, tcp_session_func>& get_virtual_service_message_down_thread_function_map(){
2873             return virtual_service_message_down_thread_function_map;
2874         };
2875         
2876         void up_thread_sorry_enable_event(const TCP_PROCESS_TYPE_TAG process_type){
2877             up_thread_sorry_enable_event_call_check = true;
2878         };
2879         bool up_thread_sorry_enable_event_call_check;
2880         
2881         void up_thread_sorry_disable_event(const TCP_PROCESS_TYPE_TAG process_type){
2882             up_thread_sorry_disable_event_call_check = true;
2883         };
2884         bool up_thread_sorry_disable_event_call_check;
2885         
2886         void up_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
2887             up_thread_exit_call_check = true;
2888         };
2889         bool up_thread_exit_call_check;
2890         
2891         void down_thread_sorry_enable_event(const TCP_PROCESS_TYPE_TAG process_type){
2892             down_thread_sorry_enable_event_call_check = true;
2893         };
2894         bool down_thread_sorry_enable_event_call_check;
2895         
2896         void down_thread_sorry_disable_event(const TCP_PROCESS_TYPE_TAG process_type){
2897             down_thread_sorry_disable_event_call_check = true;
2898         };
2899         bool down_thread_sorry_disable_event_call_check;
2900         
2901         void down_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
2902             down_thread_exit_call_check = true;
2903         };
2904         bool down_thread_exit_call_check;
2905 };
2906 void set_virtual_service_message_test(){
2907     BOOST_MESSAGE( "----- set_virtual_service_message test start -----" );
2908     
2909 //    boost::asio::io_service io;
2910 //    l7vs::virtualservice_tcp vs;
2911 //    set_virtual_service_message_test_class test_obj(vs,io);
2912     l7vs::virtualservice_tcp vs;
2913     boost::asio::io_service io;
2914     l7vs::tcp_socket_option_info set_option;
2915     //! TCP_NODELAY   (false:not set,true:set option)
2916     set_option.nodelay_opt = false;
2917     //! TCP_NODELAY option value  (false:off,true:on)
2918     set_option.nodelay_val = false;
2919     //! TCP_CORK      (false:not set,true:set option)
2920     set_option.cork_opt = false;
2921     //! TCP_CORK option value     (false:off,true:on)
2922     set_option.cork_val = false;
2923     //! TCP_QUICKACK  (false:not set,true:set option)
2924     set_option.quickack_opt = false;
2925     //! TCP_QUICKACK option value (false:off,true:on)
2926     set_option.quickack_val = false;
2927     //
2928     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
2929     bool set_mode(false);
2930     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
2931     bool set_ssl_cache_flag(false);
2932     int set_ssl_handshake_time_out = 0;
2933     //std::string access_log_file_name = "test";
2934     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
2935
2936     set_virtual_service_message_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
2937  
2938    
2939 //    bool& ref_pause_flag = test_obj.get_session_pause_flag();
2940     bool& ref_access_log_flag = test_obj.get_access_log_flag();
2941     l7vs::lockfree_queue<l7vs::tcp_thread_message>&        ref_up_msg_que = test_obj.get_up_thread_message_que();
2942     l7vs::lockfree_queue<l7vs::tcp_thread_message>&        ref_dw_msg_que = test_obj.get_down_thread_message_que();
2943     l7vs::tcp_thread_message*    up_msg;
2944     l7vs::tcp_thread_message*    dw_msg;
2945 //    std::map< l7vs::tcp_session::TCP_VIRTUAL_SERVICE_MESSAGE_TAG, boost::function< void(l7vs::tcp_session::TCP_PROCESS_TYPE_TAG) > >& ref_vs_up_msg_map = test_obj.get_virtual_service_message_up_thread_function_map();
2946 //    std::map< l7vs::tcp_session::TCP_VIRTUAL_SERVICE_MESSAGE_TAG, boost::function< void(l7vs::tcp_session::TCP_PROCESS_TYPE_TAG) > >& ref_vs_dw_msg_map = test_obj.get_virtual_service_message_down_thread_function_map();
2947     
2948     // unit_test [1] set_virtual_service_message SORRY_STATE_ENABLE
2949     std::cerr << "[1] set_virtual_service_message SORRY_STATE_ENABLE" << std::endl;
2950     
2951     while( !ref_up_msg_que.empty() ){
2952         up_msg    = ref_up_msg_que.pop();
2953         delete    up_msg;
2954     }
2955     BOOST_CHECK(ref_up_msg_que.empty());
2956     while( !ref_dw_msg_que.empty() ){
2957         dw_msg    =ref_dw_msg_que.pop();
2958         delete    dw_msg;
2959     }
2960     BOOST_CHECK(ref_dw_msg_que.empty());
2961     
2962     test_obj.set_virtual_service_message(l7vs::tcp_session::SORRY_STATE_ENABLE);
2963     
2964     BOOST_CHECK(!ref_up_msg_que.empty());
2965     up_msg = ref_up_msg_que.pop();
2966     BOOST_CHECK(ref_up_msg_que.empty());
2967     test_obj.up_thread_sorry_enable_event_call_check = false;
2968     up_msg->message(l7vs::tcp_session::LOCAL_PROC);
2969     BOOST_CHECK(test_obj.up_thread_sorry_enable_event_call_check);
2970     delete up_msg;
2971     
2972     BOOST_CHECK(!ref_dw_msg_que.empty());
2973     dw_msg = ref_dw_msg_que.pop();
2974     BOOST_CHECK(ref_dw_msg_que.empty());
2975     test_obj.down_thread_sorry_enable_event_call_check = false;
2976     dw_msg->message(l7vs::tcp_session::LOCAL_PROC);
2977     BOOST_CHECK(test_obj.down_thread_sorry_enable_event_call_check);
2978     delete dw_msg;
2979
2980     // unit_test [2] set_virtual_service_message SORRY_STATE_DISABLE
2981     std::cerr << "[2] set_virtual_service_message SORRY_STATE_DISABLE" << std::endl;
2982     
2983     while( !ref_up_msg_que.empty() ){
2984         up_msg    = ref_up_msg_que.pop();
2985         delete    up_msg;
2986     }
2987     BOOST_CHECK(ref_up_msg_que.empty());
2988     while( !ref_dw_msg_que.empty() ){
2989         dw_msg    =ref_dw_msg_que.pop();
2990         delete    dw_msg;
2991     }
2992     BOOST_CHECK(ref_dw_msg_que.empty());
2993     
2994     test_obj.set_virtual_service_message(l7vs::tcp_session::SORRY_STATE_DISABLE);
2995     
2996     BOOST_CHECK(!ref_up_msg_que.empty());
2997     up_msg = ref_up_msg_que.pop();
2998     BOOST_CHECK(ref_up_msg_que.empty());
2999     test_obj.up_thread_sorry_disable_event_call_check = false;
3000     up_msg->message(l7vs::tcp_session::LOCAL_PROC);
3001     BOOST_CHECK(test_obj.up_thread_sorry_disable_event_call_check);
3002     delete    up_msg;
3003
3004     BOOST_CHECK(!ref_dw_msg_que.empty());
3005     dw_msg = ref_dw_msg_que.pop();
3006     BOOST_CHECK(ref_dw_msg_que.empty());
3007     test_obj.down_thread_sorry_disable_event_call_check = false;
3008     dw_msg->message(l7vs::tcp_session::LOCAL_PROC);
3009     BOOST_CHECK(test_obj.down_thread_sorry_disable_event_call_check);
3010     delete    dw_msg;
3011     
3012     // unit_test [3] set_virtual_service_message SESSION_END
3013     std::cerr << "[3] set_virtual_service_message SESSION_END" << std::endl;
3014     
3015     while( !ref_up_msg_que.empty() ){
3016         up_msg    = ref_up_msg_que.pop();
3017         delete    up_msg;
3018     }
3019     BOOST_CHECK(ref_up_msg_que.empty());
3020     while( !ref_dw_msg_que.empty() ){
3021         dw_msg    =ref_dw_msg_que.pop();
3022         delete    dw_msg;
3023     }
3024     BOOST_CHECK(ref_dw_msg_que.empty());
3025     
3026     test_obj.set_virtual_service_message(l7vs::tcp_session::SESSION_END);
3027     
3028     BOOST_CHECK(!ref_up_msg_que.empty());
3029     up_msg = ref_up_msg_que.pop();
3030     BOOST_CHECK(ref_up_msg_que.empty());
3031     test_obj.up_thread_exit_call_check = false;
3032     up_msg->message(l7vs::tcp_session::LOCAL_PROC);
3033     BOOST_CHECK(test_obj.up_thread_exit_call_check);
3034     delete    up_msg;
3035
3036     BOOST_CHECK(!ref_dw_msg_que.empty());
3037     dw_msg = ref_dw_msg_que.pop();
3038     BOOST_CHECK(ref_dw_msg_que.empty());
3039     test_obj.down_thread_exit_call_check = false;
3040     dw_msg->message(l7vs::tcp_session::LOCAL_PROC);
3041     BOOST_CHECK(test_obj.down_thread_exit_call_check);
3042     delete    dw_msg;
3043
3044     // unit_test [4] set_virtual_service_message SESSION_PAUSE_ON
3045     std::cerr << "[4] set_virtual_service_message SESSION_PAUSE_ON" << std::endl;
3046 //    ref_pause_flag = false;
3047     test_obj.set_virtual_service_message(l7vs::tcp_session::SESSION_PAUSE_ON);
3048 //    BOOST_CHECK(ref_pause_flag);
3049     
3050     // unit_test [5] set_virtual_service_message SESSION_PAUSE_OFF
3051     std::cerr << "[5] set_virtual_service_message SESSION_PAUSE_OFF" << std::endl;
3052 //    ref_pause_flag = true;
3053     test_obj.set_virtual_service_message(l7vs::tcp_session::SESSION_PAUSE_OFF);
3054 //    BOOST_CHECK(!ref_pause_flag);
3055     
3056     // unit_test [6] set_virtual_service_message ACCESS_LOG_ON
3057     std::cerr << "[6] set_virtual_service_message ACCESS_LOG__ON" << std::endl;
3058     ref_access_log_flag = false;
3059     test_obj.set_virtual_service_message(l7vs::tcp_session::ACCESS_LOG_ON);
3060     BOOST_CHECK(ref_access_log_flag);
3061
3062     // unit_test [7] set_virtual_service_message ACCESS_LOG_OFF
3063     std::cerr << "[7] set_virtual_service_message ACCESS_LOG_OFF" << std::endl;
3064     ref_access_log_flag = true;
3065     test_obj.set_virtual_service_message(l7vs::tcp_session::ACCESS_LOG_OFF);
3066     BOOST_CHECK(!ref_access_log_flag);
3067
3068 /*
3069     // unit_test [8] set_virtual_service_message up thread map find not message error
3070     std::cerr << "[8] set_virtual_service_message up thread map find not message error" << std::endl;
3071     ref_vs_up_msg_map.clear();
3072     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
3073     l7vs::Logger::putLogError_id = 0;
3074     while( !ref_up_msg_que.empty() ){
3075         up_msg    = ref_up_msg_que.pop();
3076         delete    up_msg;
3077     }
3078     BOOST_CHECK(ref_up_msg_que.empty());
3079     while( !ref_dw_msg_que.empty() ){
3080         dw_msg    =ref_dw_msg_que.pop();
3081         delete    dw_msg;
3082     }
3083     BOOST_CHECK(ref_dw_msg_que.empty());
3084     
3085     test_obj.set_virtual_service_message(l7vs::tcp_session::SORRY_STATE_ENABLE);
3086     
3087     BOOST_CHECK(ref_up_msg_que.empty());
3088     BOOST_CHECK(!ref_dw_msg_que.empty());
3089     
3090     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
3091     BOOST_CHECK_EQUAL(6,l7vs::Logger::putLogError_id);
3092     std::cerr << l7vs::Logger::putLogError_message << std::endl;
3093     
3094     // unit_test [9] set_virtual_service_message up thread map find not message error
3095     std::cerr << "[9] set_virtual_service_message up thread map find not message error" << std::endl;
3096     ref_vs_dw_msg_map.clear();
3097     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
3098     l7vs::Logger::putLogError_id = 0;
3099     ref_vs_dw_msg_map.clear();
3100     BOOST_CHECK(ref_up_msg_que.empty());
3101     while( !ref_dw_msg_que.empty() ){
3102         dw_msg    =ref_dw_msg_que.pop();
3103         delete    dw_msg;
3104     }
3105     BOOST_CHECK(ref_dw_msg_que.empty());
3106     
3107     test_obj.set_virtual_service_message(l7vs::tcp_session::SORRY_STATE_ENABLE);
3108     
3109     BOOST_CHECK(ref_up_msg_que.empty());
3110     BOOST_CHECK(ref_dw_msg_que.empty());
3111     
3112     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
3113     BOOST_CHECK_EQUAL(7,l7vs::Logger::putLogError_id);
3114     std::cerr << l7vs::Logger::putLogError_message << std::endl;
3115 */
3116     
3117     BOOST_MESSAGE( "----- set_virtual_service_message test end -----" );
3118 }
3119
3120 // up_thread_run
3121 // up_thread_run test class
3122 class up_thread_run_test_class : public l7vs::tcp_session{
3123     public:
3124 //        up_thread_run_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){
3125        up_thread_run_test_class(
3126                                 l7vs::virtualservice_tcp& vs,
3127                                 boost::asio::io_service& session_io,
3128                                 l7vs::tcp_socket_option_info& set_socket_option,
3129                                 boost::asio::ip::tcp::endpoint listen_endpoint,
3130                                 bool ssl_mode,
3131                                 boost::asio::ssl::context& set_ssl_context,
3132                                 bool set_ssl_cache_flag,
3133                                 int set_ssl_handshake_time_out,
3134                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
3135                                                                                                    session_io,
3136                                                                                                    set_socket_option,
3137                                                                                                    listen_endpoint,
3138                                                                                                    ssl_mode,
3139                                                                                                    set_ssl_context,
3140                                                                                                    set_ssl_cache_flag,
3141                                                                                                    set_ssl_handshake_time_out,
3142                                                                                                    set_access_logger){
3143             test_end = false;
3144             test_wait = true;
3145         };
3146         ~up_thread_run_test_class(){};
3147         bool& get_exit_flag(){
3148             return (bool&)exit_flag;
3149         };
3150         
3151 /*
3152         bool& get_session_pause_flag(){
3153             return session_pause_flag;
3154         };
3155 */
3156         
3157 /*
3158         std::bitset<TCP_SESSION_THREAD_STATE_BIT>& get_thread_state(){
3159             return thread_state;
3160         };
3161 */
3162         l7vs::tcp_session::UPTHREAD_STATUS_TAG& get_up_status(){
3163             return upthread_status;
3164         };
3165         l7vs::tcp_session::DOWNTHREAD_STATUS_TAG& get_down_status(){
3166             return downthread_status;
3167         };
3168         void set_up_status(int s){
3169             switch(s) {
3170             case 0:
3171                 upthread_status = l7vs::tcp_session::UPTHREAD_SLEEP;
3172                 break;
3173             case 1:
3174                 upthread_status = l7vs::tcp_session::UPTHREAD_ALIVE;
3175                 break;
3176             case 2:
3177                 upthread_status = l7vs::tcp_session::UPTHREAD_ACTIVE;
3178                 break;
3179             default:
3180                 upthread_status = l7vs::tcp_session::UPTHREAD_LOCK;
3181                 break;
3182             }
3183         };
3184         void set_down_status(int s){
3185             switch(s) {
3186             case 0:
3187                 downthread_status = l7vs::tcp_session::DOWNTHREAD_SLEEP;
3188                 break;
3189             case 1:
3190                 downthread_status = l7vs::tcp_session::DOWNTHREAD_ALIVE;
3191                 break;
3192             case 2:
3193                 downthread_status = l7vs::tcp_session::DOWNTHREAD_ACTIVE;
3194                 break;
3195             default:
3196                 downthread_status = l7vs::tcp_session::DOWNTHREAD_LOCK;
3197                 break;
3198             }
3199         };
3200         
3201         boost::mutex test_thread_wait;
3202         void test_run(){
3203             boost::mutex::scoped_lock scope_lock(test_thread_wait);
3204             while(!test_end){
3205                 std::cerr << "up_thread_run test call" << std::endl;
3206                 test_wait = true;
3207                 up_thread_run();
3208                 while(test_wait){};
3209             }
3210         };
3211         bool test_end;
3212         bool test_wait;
3213                 
3214         void set_protocol_module(l7vs::protocol_module_base* set_proto){
3215             protocol_module = set_proto;
3216         };
3217         
3218         l7vs::tcp_socket& get_client_socket(){
3219             return client_socket;
3220         };
3221         
3222         boost::thread::id& get_up_thread_id(){
3223             return up_thread_id;
3224         };
3225         
3226         boost::thread::id& get_down_thread_id(){
3227             return down_thread_id;
3228         };
3229         
3230         void up_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
3231             up_thread_exit_process_type = process_type;
3232             l7vs::tcp_session::up_thread_exit(process_type);
3233             up_thread_exit_call_check = true;
3234         };
3235         TCP_PROCESS_TYPE_TAG up_thread_exit_process_type;
3236         bool up_thread_exit_call_check;
3237         
3238         void up_thread_all_socket_close(void){
3239             up_thread_all_socket_close_call_check = true;
3240         }
3241         bool up_thread_all_socket_close_call_check;
3242         
3243         void test_message_set(boost::asio::ip::tcp::endpoint set_endpoint){
3244             l7vs::tcp_thread_message*    chk_msg    = new l7vs::tcp_thread_message;
3245             up_thread_message_que.push(chk_msg);
3246             chk_msg->endpoint_info = set_endpoint;
3247             up_thread_function_pair func = up_thread_function_array[UP_FUNC_EXIT];
3248             chk_msg->message = func.second;
3249         };
3250         
3251         l7vs::tcp_data& get_up_thread_message_data(){
3252             return up_thread_message_data;
3253         }
3254         
3255         void clear_function_array(){
3256             for(int i = 0;i <= UP_FUNC_EXIT;i++){
3257                 up_thread_function_array[i].second = NULL;
3258             }
3259         }
3260         void clear_event_map(){
3261             up_thread_module_event_map.clear();
3262         }
3263         
3264         void set_up_thread_next_call_function_client_disconnect(){
3265             up_thread_next_call_function = up_thread_function_array[UP_FUNC_CLIENT_DISCONNECT];
3266         }
3267         void set_up_thread_next_call_function_exit(){
3268             up_thread_next_call_function = up_thread_function_array[UP_FUNC_EXIT];
3269         }
3270         
3271 };
3272 void up_thread_run_test(){
3273     
3274     BOOST_MESSAGE( "----- up_thread_run test start -----" );
3275     
3276     boost::asio::io_service io;
3277     l7vs::virtualservice_tcp vs;
3278     l7vs::tcp_socket_option_info set_option;
3279     //! TCP_NODELAY   (false:not set,true:set option)
3280     set_option.nodelay_opt = false;
3281     //! TCP_NODELAY option value  (false:off,true:on)
3282     set_option.nodelay_val = false;
3283     //! TCP_CORK      (false:not set,true:set option)
3284     set_option.cork_opt = false;
3285     //! TCP_CORK option value     (false:off,true:on)
3286     set_option.cork_val = false;
3287     //! TCP_QUICKACK  (false:not set,true:set option)
3288     set_option.quickack_opt = false;
3289     //! TCP_QUICKACK option value (false:off,true:on)
3290     set_option.quickack_val = false;
3291     //
3292     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
3293     bool set_mode(false);
3294     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
3295     bool set_ssl_cache_flag(false);
3296     int set_ssl_handshake_time_out = 0;
3297     //std::string access_log_file_name = "test";
3298     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
3299
3300     boost::system::error_code ec;
3301  
3302     std::string test_protocol_name("test protocol");
3303     l7vs::test_protocol_module proto_test(test_protocol_name);
3304
3305     up_thread_run_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
3306
3307     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
3308     bool& exit_flag = test_obj.get_exit_flag();
3309 //    bool& session_pause_flag = test_obj.get_session_pause_flag();
3310     boost::thread::id& up_thread_id = test_obj.get_up_thread_id();
3311     boost::thread::id& down_thread_id = test_obj.get_down_thread_id();
3312
3313     
3314 //    std::bitset<TCP_SESSION_THREAD_STATE_BIT>& thread_state = test_obj.get_thread_state();
3315     l7vs::tcp_socket& client_socket = test_obj.get_client_socket();
3316     
3317     test_mirror_server test_server;
3318     // accept req
3319     test_server.breq_acc_flag = true;
3320     // close wait req
3321     test_server.breq_close_wait_flag = true;
3322     // recv cont
3323     test_server.req_recv_cnt = 0;
3324     // test server start
3325     boost::thread server_thread(boost::bind(&test_mirror_server::run,&test_server));
3326     while( !test_server.brun_flag ){
3327         sleep(1);
3328     }
3329     
3330     boost::asio::ip::tcp::endpoint connect_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
3331     client_socket.get_socket().connect(connect_end,ec);
3332     BOOST_CHECK(!ec);
3333     while(!test_server.bconnect_flag){
3334         sleep(1);
3335     }
3336         
3337     test_obj.test_thread_wait.lock();
3338 /*
3339     thread_state[0] = 0;    // UP_THREAD_ALIVE
3340     thread_state[1] = 0;    // DOWN_THREAD_ALIVE
3341     thread_state[2] = 0;    // UP_THREAD_ACTIVE
3342     thread_state[3] = 0;    // DOWN_THREAD_ACTIVE
3343     thread_state[4] = 0;    // UP_THREAD_LOCK
3344     thread_state[5] = 0;    // DOWN_THREAD_LOCK
3345 */
3346     up_thread_id = boost::thread::id();
3347     boost::thread test_thread(boost::bind(&up_thread_run_test_class::test_run,&test_obj));
3348     sleep(1);
3349     boost::thread::id test_id = test_thread.get_id();
3350     boost::thread::id proc_id = boost::this_thread::get_id();
3351     
3352 /*
3353     BOOST_CHECK(!thread_state.test(0));    // UP_THREAD_ALIVE
3354     BOOST_CHECK(!thread_state.test(1)); // DOWN_THREAD_ALIVE
3355     BOOST_CHECK(!thread_state.test(2)); // UP_THREAD_ACTIVE
3356     BOOST_CHECK(!thread_state.test(3)); // DOWN_THREAD_ACTIVE
3357     BOOST_CHECK(!thread_state.test(4)); // UP_THREAD_LOCK
3358     BOOST_CHECK(!thread_state.test(5)); // DOWN_THREAD_LOCK
3359 */
3360     BOOST_CHECK(test_obj.get_up_status() == 0);
3361     BOOST_CHECK(test_obj.get_down_status() == 0);
3362     BOOST_CHECK(up_thread_id != test_id);
3363     test_obj.test_thread_wait.unlock();
3364     sleep(1);
3365     
3366     // unit_test [1] up_thread_run thread id update check
3367     std::cerr << "[1] up_thread_run thread id update check" << std::endl;
3368     BOOST_CHECK(up_thread_id == test_id);
3369     
3370     // unit_test [2] up_thread_run down thread wait check
3371     std::cerr << "[2] up_thread_run down thread wait check" << std::endl;
3372 /*
3373     BOOST_CHECK(thread_state.test(0));    // UP_THREAD_ALIVE
3374     BOOST_CHECK(!thread_state.test(1)); // DOWN_THREAD_ALIVE
3375     BOOST_CHECK(!thread_state.test(2)); // UP_THREAD_ACTIVE
3376     BOOST_CHECK(!thread_state.test(3)); // DOWN_THREAD_ACTIVE
3377     BOOST_CHECK(!thread_state.test(4)); // UP_THREAD_LOCK
3378     BOOST_CHECK(!thread_state.test(5)); // DOWN_THREAD_LOCK
3379 */
3380     BOOST_CHECK(test_obj.get_up_status() == 1);
3381     BOOST_CHECK(test_obj.get_down_status() == 0);
3382     
3383     proto_test.handle_session_initialize_res_tag = l7vs::protocol_module_base::FINALIZE;
3384     proto_test.handle_session_initialize_in_up_thread_id = boost::thread::id();
3385     proto_test.handle_session_initialize_in_down_thread_id = boost::thread::id();
3386     proto_test.handle_session_initialize_in_client_endpoint_tcp = boost::asio::ip::tcp::endpoint();
3387     proto_test.handle_session_initialize_in_client_endpoint_udp.address(boost::asio::ip::address::from_string("255.255.255.255"));
3388     proto_test.handle_session_initialize_in_client_endpoint_udp.port(65535);
3389     BOOST_CHECK(proto_test.handle_session_initialize_in_up_thread_id != test_id);
3390     BOOST_CHECK(proto_test.handle_session_initialize_in_down_thread_id != proc_id);
3391     BOOST_CHECK(proto_test.handle_session_initialize_in_client_endpoint_tcp != connect_end);
3392     BOOST_CHECK(proto_test.handle_session_initialize_in_client_endpoint_udp != boost::asio::ip::udp::endpoint());
3393     down_thread_id = proc_id;
3394 //    session_pause_flag = true;
3395     
3396     // DOWN_THREAD_ALIVE
3397 //    thread_state[1] = 1;
3398     test_obj.set_down_status(1);
3399     sleep(1);
3400     
3401     // unit_test [3] up_thread_run handle_session_initialize call check
3402     std::cerr << "[3] up_thread_run handle_session_initialize call check" << std::endl;
3403     BOOST_CHECK(proto_test.handle_session_initialize_in_up_thread_id == test_id);
3404     BOOST_CHECK(proto_test.handle_session_initialize_in_down_thread_id == proc_id);
3405     BOOST_CHECK(proto_test.handle_session_initialize_in_client_endpoint_tcp == connect_end);
3406     BOOST_CHECK(proto_test.handle_session_initialize_in_client_endpoint_udp == boost::asio::ip::udp::endpoint());
3407     
3408     // unit_test [4] up_thread_run state update(UP_THREAD_ACTIVE) check
3409     std::cerr << "[4] up_thread_run state update(UP_THREAD_ACTIVE) check" << std::endl;
3410 //    BOOST_CHECK(thread_state.test(2)); // UP_THREAD_ACTIVE
3411     BOOST_CHECK(test_obj.get_up_status() == 2); // UP_THREAD_ACTIVE
3412     
3413     // unit_test [5] up_thread_run pause check
3414     std::cerr << "[5] up_thread_run  pause check" << std::endl;
3415  //   BOOST_CHECK(thread_state.test(4)); // UP_THREAD_LOCK
3416     
3417     test_obj.up_thread_exit_process_type = l7vs::tcp_session::MESSAGE_PROC;
3418     test_obj.up_thread_exit_call_check = false;
3419     test_obj.up_thread_all_socket_close_call_check = false;
3420     
3421 //    session_pause_flag = false;
3422     sleep(1);
3423     
3424     // unit_test [6] up_thread_run restart check
3425     std::cerr << "[6] up_thread_run  restart check" << std::endl;
3426 //    BOOST_CHECK(!thread_state.test(4)); // UP_THREAD_LOCK
3427     
3428     // unit_test [7] up_thread_run up_thread_next_call_function call (up_thread_exit) check
3429     std::cerr << "[7] up_thread_run up_thread_next_call_function call (up_thread_exit) check" << std::endl;
3430     BOOST_CHECK(test_obj.up_thread_exit_call_check);
3431     BOOST_CHECK(test_obj.up_thread_exit_process_type == l7vs::tcp_session::LOCAL_PROC);
3432     
3433     // unit_test [8] up_thread_run main loop exit check
3434     std::cerr << "[8] up_thread_run main loop exit check" << std::endl;
3435     BOOST_CHECK(exit_flag);
3436 //    BOOST_CHECK(!thread_state.test(2)); // UP_THREAD_ACTIVE
3437     
3438     
3439     // unit_test [9] up_thread_run up_thread_all_socket_close_call_check call check
3440     std::cerr << "[9] up_thread_run up_thread_all_socket_close_call_check call check" << std::endl;
3441     BOOST_CHECK(test_obj.up_thread_all_socket_close_call_check);
3442     
3443     // unit_test [10] up_thread_run down thread end wait check
3444     std::cerr << "[10] up_thread_run down thread wait check" << std::endl;
3445 /*
3446     BOOST_CHECK(thread_state.test(0));    // UP_THREAD_ALIVE
3447     BOOST_CHECK(thread_state.test(1)); // DOWN_THREAD_ALIVE
3448     BOOST_CHECK(!thread_state.test(2)); // UP_THREAD_ACTIVE
3449     BOOST_CHECK(!thread_state.test(3)); // DOWN_THREAD_ACTIVE
3450     BOOST_CHECK(!thread_state.test(4)); // UP_THREAD_LOCK
3451     BOOST_CHECK(!thread_state.test(5)); // DOWN_THREAD_LOCK
3452 */
3453     
3454     BOOST_CHECK(test_obj.get_up_status() == 1); // UP_THREAD_ALIVE
3455     BOOST_CHECK(test_obj.get_down_status() == 1); // DOWN_THREAD_ALIVE
3456     
3457 //     proto_test.handle_session_finalize_in_up_thread_id = boost::thread::id();
3458 //     proto_test.handle_session_finalize_in_down_thread_id = boost::thread::id();
3459 //     BOOST_CHECK(proto_test.handle_session_finalize_in_up_thread_id != test_id);
3460 //     BOOST_CHECK(proto_test.handle_session_finalize_in_down_thread_id != proc_id);
3461 //     vs.release_session_ptr = NULL;
3462 //     BOOST_CHECK(vs.release_session_ptr != test_id);
3463     
3464 //    thread_state[1] = 0;
3465     sleep(1);
3466     
3467     // unit_test [11] up_thread_run handle_session_finalize call check
3468     std::cerr << "[11] up_thread_run handle_session_finalize call check" << std::endl;
3469     BOOST_CHECK(proto_test.handle_session_finalize_in_up_thread_id == test_id);
3470     BOOST_CHECK(proto_test.handle_session_finalize_in_down_thread_id == proc_id);
3471     
3472     // unit_test [12] up_thread_run release_session_id call check
3473     std::cerr << "[12] up_thread_run release_session_id call check" << std::endl;
3474 //     BOOST_CHECK(vs.release_session_id == test_id);
3475     
3476     // unit_test [13] up_thread_run state update(UP_THREAD_ACTIVE) check
3477     std::cerr << "[13] up_thread_run state update(UP_THREAD_ACTIVE) check" << std::endl;
3478 //    BOOST_CHECK(!thread_state.test(0)); // UP_THREAD_ACTIVE
3479     
3480     // message call test
3481     exit_flag = false;
3482 //    session_pause_flag = false;
3483     l7vs::tcp_data& msg_data = test_obj.get_up_thread_message_data();
3484     test_obj.test_message_set(connect_end);
3485 /*
3486     thread_state[0] = 0;    // UP_THREAD_ALIVE
3487     thread_state[1] = 1;    // DOWN_THREAD_ALIVE
3488     thread_state[2] = 0;    // UP_THREAD_ACTIVE
3489     thread_state[3] = 0;    // DOWN_THREAD_ACTIVE
3490     thread_state[4] = 0;    // UP_THREAD_LOCK
3491     thread_state[5] = 0;    // DOWN_THREAD_LOCK
3492 */
3493     msg_data.set_endpoint(boost::asio::ip::tcp::endpoint());
3494     test_obj.up_thread_exit_call_check = false;
3495     test_obj.up_thread_exit_process_type = l7vs::tcp_session::LOCAL_PROC;
3496     proto_test.handle_session_initialize_res_tag = l7vs::protocol_module_base::CLIENT_DISCONNECT;
3497     
3498     // test thread start
3499     test_obj.test_wait = false;
3500     sleep(1);
3501 /*
3502     BOOST_CHECK(thread_state.test(0));    // UP_THREAD_ALIVE
3503     BOOST_CHECK(thread_state.test(1)); // DOWN_THREAD_ALIVE
3504     BOOST_CHECK(!thread_state.test(2)); // UP_THREAD_ACTIVE
3505     BOOST_CHECK(!thread_state.test(3)); // DOWN_THREAD_ACTIVE
3506     BOOST_CHECK(!thread_state.test(4)); // UP_THREAD_LOCK
3507     BOOST_CHECK(!thread_state.test(5)); // DOWN_THREAD_LOCK
3508 */
3509     
3510     // unit_test [14] up_thread_run message call check
3511     std::cerr << "[14] up_thread_run message call check" << std::endl;
3512     BOOST_CHECK(test_obj.up_thread_exit_call_check);
3513     BOOST_CHECK(test_obj.up_thread_exit_process_type == l7vs::tcp_session::MESSAGE_PROC);
3514     
3515     proto_test.handle_session_initialize_res_tag = l7vs::protocol_module_base::FINALIZE;
3516 //    thread_state[1] = 0;
3517     sleep(1);
3518     
3519     // error test not find function map 
3520     test_obj.clear_function_array();
3521     exit_flag = false;
3522 //    session_pause_flag = false;
3523 //    thread_state[1] = 1;
3524     
3525     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
3526     l7vs::Logger::putLogError_id = 0;
3527     
3528     test_obj.test_wait = false;
3529     sleep(1);
3530     
3531     // unit_test [15] up_thread_run not find function map error test
3532     std::cerr << "[15] up_thread_run not find function map error test" << std::endl;
3533     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
3534     BOOST_CHECK_EQUAL(15,l7vs::Logger::putLogError_id);
3535     std::cerr << l7vs::Logger::putLogError_message << std::endl;
3536
3537 //    thread_state[1] = 0;
3538     sleep(1);
3539     
3540     //error test protocol_module returnd illegal EVENT_TAG
3541     test_obj.clear_event_map();
3542     exit_flag = false;
3543 //    session_pause_flag = false;
3544 //    thread_state[1] = 1;
3545     
3546     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
3547     l7vs::Logger::putLogError_id = 0;
3548     
3549     test_obj.test_wait = false;
3550     sleep(1);
3551     
3552     // unit_test [16] up_thread_run protocol_module returnd illegal EVENT_TAG error test
3553     std::cerr << "[16] up_thread_run protocol_module returnd illegal EVENT_TAG error test" << std::endl;
3554     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
3555     BOOST_CHECK_EQUAL(14,l7vs::Logger::putLogError_id);
3556     std::cerr << l7vs::Logger::putLogError_message << std::endl;
3557     
3558 //    thread_state[1] = 0;
3559     sleep(1);
3560     
3561     
3562     // unit_test [17] up_thread_run set non blocking fail check
3563     std::cerr << "[17] up_thread_run set non blocking fail check" << std::endl;
3564     exit_flag = false;
3565 //    session_pause_flag = false;
3566 //    thread_state[1] = 1;
3567     
3568     l7vs::tcp_socket::set_non_blocking_mode_res = false;
3569     l7vs::tcp_socket::set_non_blocking_mode_ec = boost::asio::error::bad_descriptor;
3570     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
3571     l7vs::Logger::putLogError_id = 0;
3572     
3573     test_obj.test_wait = false;
3574     sleep(1);
3575     
3576     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
3577     BOOST_CHECK_EQUAL(11,l7vs::Logger::putLogError_id);
3578     std::cerr << l7vs::Logger::putLogError_message << std::endl;
3579     l7vs::tcp_socket::set_non_blocking_mode_res = true;
3580     l7vs::tcp_socket::set_non_blocking_mode_ec.clear();
3581
3582 //    thread_state[1] = 0;
3583     sleep(1);
3584     
3585     //error test client endpoint get error 
3586     client_socket.get_socket().close(ec);
3587     exit_flag = false;
3588 //    session_pause_flag = false;
3589 //    thread_state[1] = 1;
3590     
3591     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
3592     l7vs::Logger::putLogError_id = 0;
3593     
3594     test_obj.test_wait = false;
3595     sleep(1);
3596     
3597     // unit_test [18] up_thread_run client endpoint get error test
3598     std::cerr << "[18] up_thread_run client endpoint get error test" << std::endl;
3599     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
3600     BOOST_CHECK_EQUAL(9,l7vs::Logger::putLogError_id);
3601     std::cerr << l7vs::Logger::putLogError_message << std::endl;
3602     
3603 //    thread_state[1] = 0;
3604     sleep(1);
3605     
3606     //error test protocol module null error 
3607     test_obj.set_protocol_module(NULL);
3608     exit_flag = false;
3609 //    session_pause_flag = false;
3610 //    thread_state[1] = 1;
3611     
3612     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
3613     l7vs::Logger::putLogError_id = 0;
3614     
3615     test_obj.test_wait = false;
3616     sleep(1);
3617     
3618     // unit_test [19] up_thread_run protocol module null error test
3619     std::cerr << "[19] up_thread_run protocol module null error test" << std::endl;
3620     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
3621     BOOST_CHECK_EQUAL(8,l7vs::Logger::putLogError_id);
3622     std::cerr << l7vs::Logger::putLogError_message << std::endl;
3623     
3624 //    thread_state[1] = 0;
3625     sleep(1);
3626     
3627     test_obj.test_end = true;
3628     test_obj.test_wait = false;
3629     std::cerr << "test_thread.join wait" << std::endl;
3630     test_thread.join();
3631     std::cerr << "test_thread.join ok" << std::endl;
3632     
3633     
3634     test_server.breq_close_wait_flag = false;    
3635     test_server.bstop_flag = true;
3636     std::cerr << "server_thread.join wait" << std::endl;
3637     server_thread.join();
3638     std::cerr << "server_thread.join ok" << std::endl;
3639     
3640     
3641     BOOST_MESSAGE( "----- up_thread_run test end -----" );
3642     
3643 }
3644
3645
3646
3647 // down_thread_run
3648 // down_thread_run test class
3649 class down_thread_run_test_class : public l7vs::tcp_session{
3650     public:
3651 //        down_thread_run_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){
3652        down_thread_run_test_class(
3653                                 l7vs::virtualservice_tcp& vs,
3654                                 boost::asio::io_service& session_io,
3655                                 l7vs::tcp_socket_option_info& set_socket_option,
3656                                 boost::asio::ip::tcp::endpoint listen_endpoint,
3657                                 bool ssl_mode,
3658                                 boost::asio::ssl::context& set_ssl_context,
3659                                 bool set_ssl_cache_flag,
3660                                 int set_ssl_handshake_time_out,
3661                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
3662                                                                                                    session_io,
3663                                                                                                    set_socket_option,
3664                                                                                                    listen_endpoint,
3665                                                                                                    ssl_mode,
3666                                                                                                    set_ssl_context,
3667                                                                                                    set_ssl_cache_flag,
3668                                                                                                    set_ssl_handshake_time_out,
3669                                                                                                    set_access_logger){
3670             test_end = false;
3671             test_wait = true;
3672         };
3673         ~down_thread_run_test_class(){};
3674         bool& get_exit_flag(){
3675             return (bool&)exit_flag;
3676         };
3677         
3678 /*
3679         bool& get_session_pause_flag(){
3680             return session_pause_flag;
3681         };
3682 */
3683         
3684 /*
3685         std::bitset<TCP_SESSION_THREAD_STATE_BIT>& get_thread_state(){
3686             return thread_state;
3687         };
3688 */
3689         
3690         boost::mutex test_thread_wait;
3691         void test_run(){
3692             boost::mutex::scoped_lock scope_lock(test_thread_wait);
3693             while(!test_end){
3694                 test_wait = true;
3695                 down_thread_run();
3696                 while(test_wait){};
3697             }
3698         };
3699         bool test_end;
3700         bool test_wait;
3701                 
3702         void set_protocol_module(l7vs::protocol_module_base* set_proto){
3703             protocol_module = set_proto;
3704         };
3705         
3706         boost::thread::id& get_down_thread_id(){
3707             return down_thread_id;
3708         };
3709         
3710         void down_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
3711             down_thread_exit_process_type = process_type;
3712             l7vs::tcp_session::down_thread_exit(process_type);
3713             down_thread_exit_call_check = true;
3714         };
3715         TCP_PROCESS_TYPE_TAG down_thread_exit_process_type;
3716         bool down_thread_exit_call_check;
3717         
3718         void down_thread_all_socket_close(void){
3719             down_thread_all_socket_close_call_check = true;
3720         }
3721         bool down_thread_all_socket_close_call_check;
3722         
3723         void test_message_set(boost::asio::ip::tcp::endpoint set_endpoint){
3724             l7vs::tcp_thread_message*    chk_msg        = new l7vs::tcp_thread_message;
3725             down_thread_message_que.push(chk_msg);
3726             chk_msg->endpoint_info = set_endpoint;
3727             down_thread_function_pair func = down_thread_function_array[DOWN_FUNC_EXIT];
3728             chk_msg->message = func.second;
3729         };
3730         
3731         l7vs::tcp_data& get_down_thread_message_data(){
3732             return down_thread_message_data;
3733         }
3734         
3735         void clear_function_array(){
3736             for(int i = 0;i < DOWN_FUNC_EXIT;i++){
3737                 down_thread_function_array[i].second = NULL;    
3738             }
3739         }
3740         
3741         void down_thread_realserver_receive(const TCP_PROCESS_TYPE_TAG process_type){
3742             down_thread_realserver_receive_call_check = true;
3743             down_thread_realserver_receive_process_type = process_type;
3744             exit_flag = true;
3745         };
3746         bool down_thread_realserver_receive_call_check;
3747         TCP_PROCESS_TYPE_TAG down_thread_realserver_receive_process_type;
3748         
3749         void set_down_thread_connect_socket_list(){
3750             for(int i = 0 ; i < 1024;i++){
3751                 std::pair<boost::asio::ip::tcp::endpoint,tcp_socket_ptr > push_element;
3752                 boost::asio::ip::tcp::endpoint set_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), i);
3753                 push_element.first = set_end;
3754                 down_thread_connect_socket_list.push_back(push_element);
3755                 //std::cerr << push_element.first << std::endl;
3756             }
3757             if(down_thread_connect_socket_list.empty()){
3758                 std::cerr << "down_thread_connect_socket_list.empty!" << std::endl;
3759             }
3760         };
3761         
3762         bool check_down_thread_receive_realserver_socket_list(){
3763             bool bres = true;
3764             std::list<socket_element>::iterator cur_it = down_thread_receive_realserver_socket_list.begin();
3765             for(int i = 0 ; i < 1024;i++){
3766                 if(cur_it == down_thread_receive_realserver_socket_list.end()){
3767                     std::cerr << "DEBUG index[";
3768                     std::cerr << i;
3769                     std::cerr << "] not element" << std::endl;
3770                     bres = false;
3771                     break;
3772                 }
3773                 boost::asio::ip::tcp::endpoint set_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), i);
3774                 if(cur_it->first != set_end){
3775                     int port = (int)cur_it->first.port();
3776                     bres = false;
3777                     std::cerr << "DEBUG index[";
3778                     std::cerr << i;
3779                     std::cerr << "] port[";
3780                     std::cerr << port;
3781                     std::cerr << "]" << std::endl;
3782                     break;
3783                 }
3784                 cur_it++;
3785             }
3786             return bres;
3787         };
3788 };
3789 void down_thread_run_test(){
3790     
3791     BOOST_MESSAGE( "----- down_thread_run test start -----" );
3792     
3793     boost::asio::io_service io;
3794     l7vs::virtualservice_tcp vs;
3795     l7vs::tcp_socket_option_info set_option;
3796     //! TCP_NODELAY   (false:not set,true:set option)
3797     set_option.nodelay_opt = false;
3798     //! TCP_NODELAY option value  (false:off,true:on)
3799     set_option.nodelay_val = false;
3800     //! TCP_CORK      (false:not set,true:set option)
3801     set_option.cork_opt = false;
3802     //! TCP_CORK option value     (false:off,true:on)
3803     set_option.cork_val = false;
3804     //! TCP_QUICKACK  (false:not set,true:set option)
3805     set_option.quickack_opt = false;
3806     //! TCP_QUICKACK option value (false:off,true:on)
3807     set_option.quickack_val = false;
3808     //
3809     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
3810     bool set_mode(false);
3811     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
3812     bool set_ssl_cache_flag(false);
3813     int set_ssl_handshake_time_out = 0;
3814     //std::string access_log_file_name = "test";
3815     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
3816
3817     boost::system::error_code ec;
3818
3819     std::string test_protocol_name("test protocol");
3820     l7vs::test_protocol_module proto_test(test_protocol_name);
3821
3822 //    down_thread_run_test_class test_obj(vs,io);
3823     down_thread_run_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
3824
3825     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
3826     bool& exit_flag = test_obj.get_exit_flag();
3827 //    bool& session_pause_flag = test_obj.get_session_pause_flag();
3828     boost::thread::id& down_thread_id = test_obj.get_down_thread_id();
3829
3830     
3831     boost::asio::ip::tcp::endpoint connect_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
3832 //    std::bitset<TCP_SESSION_THREAD_STATE_BIT>& thread_state = test_obj.get_thread_state();
3833         
3834     test_obj.test_thread_wait.lock();
3835 /*
3836     thread_state[0] = 1;    // UP_THREAD_ALIVE
3837     thread_state[1] = 0;    // DOWN_THREAD_ALIVE
3838     thread_state[2] = 0;    // UP_THREAD_ACTIVE
3839     thread_state[3] = 0;    // DOWN_THREAD_ACTIVE
3840     thread_state[4] = 0;    // UP_THREAD_LOCK
3841     thread_state[5] = 0;    // DOWN_THREAD_LOCK
3842 */
3843     down_thread_id = boost::thread::id();
3844     boost::thread test_thread(boost::bind(&down_thread_run_test_class::test_run,&test_obj));
3845     sleep(1);
3846     boost::thread::id test_id = test_thread.get_id();
3847     boost::thread::id proc_id = boost::this_thread::get_id();
3848     
3849 /*
3850     BOOST_CHECK(thread_state.test(0));    // UP_THREAD_ALIVE
3851     BOOST_CHECK(!thread_state.test(1)); // DOWN_THREAD_ALIVE
3852     BOOST_CHECK(!thread_state.test(2)); // UP_THREAD_ACTIVE
3853     BOOST_CHECK(!thread_state.test(3)); // DOWN_THREAD_ACTIVE
3854     BOOST_CHECK(!thread_state.test(4)); // UP_THREAD_LOCK
3855     BOOST_CHECK(!thread_state.test(5)); // DOWN_THREAD_LOCK
3856 */
3857     BOOST_CHECK(down_thread_id != test_id);
3858     test_obj.test_thread_wait.unlock();
3859     sleep(1);
3860     
3861     // unit_test [1] down_thread_run thread id update check
3862     std::cerr << "[1] down_thread_run thread id update check" << std::endl;
3863     BOOST_CHECK(down_thread_id == test_id);
3864     
3865     // unit_test [2] down_thread_run up thread active wait check
3866     std::cerr << "[2] down_thread_run up thread active wait check" << std::endl;
3867 /*
3868     BOOST_CHECK(thread_state.test(0));    // UP_THREAD_ALIVE
3869     BOOST_CHECK(thread_state.test(1)); // DOWN_THREAD_ALIVE
3870     BOOST_CHECK(!thread_state.test(2)); // UP_THREAD_ACTIVE
3871     BOOST_CHECK(!thread_state.test(3)); // DOWN_THREAD_ACTIVE
3872     BOOST_CHECK(!thread_state.test(4)); // UP_THREAD_LOCK
3873     BOOST_CHECK(!thread_state.test(5)); // DOWN_THREAD_LOCK
3874 */
3875         
3876 //    session_pause_flag = true;
3877     
3878     // UP_THREAD_ACTIVE
3879 //    thread_state[2] = 1;
3880     sleep(1);
3881     
3882     // unit_test [3] down_thread_run state update(DOWN_THREAD_ACTIVE) check
3883     std::cerr << "[3] down_thread_run state update(DOWN_THREAD_ACTIVE) check" << std::endl;
3884 //    BOOST_CHECK(thread_state.test(3)); // DOWN_THREAD_ACTIVE
3885     
3886     // unit_test [4] down_thread_run pause check
3887     std::cerr << "[4] down_thread_run  pause check" << std::endl;
3888 //    BOOST_CHECK(thread_state.test(5)); // DOWN_THREAD_LOCK
3889     
3890     test_obj.down_thread_realserver_receive_call_check = false;
3891     test_obj.down_thread_realserver_receive_process_type = l7vs::tcp_session::MESSAGE_PROC;
3892     test_obj.down_thread_all_socket_close_call_check = false;
3893     
3894     test_obj.set_down_thread_connect_socket_list();
3895     
3896 //    session_pause_flag = false;
3897     sleep(1);
3898     
3899     // unit_test [5] down_thread_run restart check
3900     std::cerr << "[5] down_thread_run  restart check" << std::endl;
3901 //    BOOST_CHECK(!thread_state.test(5)); // DOWN_THREAD_LOCK
3902     
3903     
3904     // unit_test [6] down_thread_run connect realserver set receive list check
3905     std::cerr << "[6] down_thread_run connect realserver set receive list check" << std::endl;
3906     BOOST_CHECK(test_obj.check_down_thread_receive_realserver_socket_list());
3907     
3908     // unit_test [7] down_thread_run down_thread_next_call_function call (down_thread_realserver_receive) check
3909     std::cerr << "[7] down_thread_run down_thread_next_call_function call (down_thread_realserver_receive) check" << std::endl;
3910     BOOST_CHECK(test_obj.down_thread_realserver_receive_call_check);
3911     BOOST_CHECK(test_obj.down_thread_realserver_receive_process_type == l7vs::tcp_session::LOCAL_PROC);
3912     
3913     // unit_test [8] down_thread_run main loop exit check
3914     std::cerr << "[8] down_thread_run main loop exit check" << std::endl;
3915     BOOST_CHECK(exit_flag);
3916 //    BOOST_CHECK(!thread_state.test(3)); // DOWN_THREAD_ACTIVE
3917     
3918     // unit_test [9] down_thread_run down_thread_all_socket_close_call_check call check
3919     std::cerr << "[9] down_thread_run down_thread_all_socket_close_call_check call check" << std::endl;
3920     BOOST_CHECK(test_obj.down_thread_all_socket_close_call_check);
3921     
3922     // unit_test [10] down_thread_run state update(DOWN_THREAD_ACTIVE) check
3923     std::cerr << "[10] down_thread_run state update(DOWN_THREAD_ACTIVE) check" << std::endl;
3924 //    BOOST_CHECK(!thread_state.test(1)); // DOWN_THREAD_ACTIVE
3925     
3926     // message call test
3927     exit_flag = false;
3928 //    session_pause_flag = false;
3929     l7vs::tcp_data& msg_data = test_obj.get_down_thread_message_data();
3930     test_obj.test_message_set(connect_end);
3931 /*
3932     thread_state[0] = 1;    // UP_THREAD_ALIVE
3933     thread_state[2] = 1;    // UP_THREAD_ACTIVE
3934 */
3935     msg_data.set_endpoint(boost::asio::ip::tcp::endpoint());
3936     test_obj.down_thread_exit_call_check = false;
3937     test_obj.down_thread_exit_process_type = l7vs::tcp_session::LOCAL_PROC;
3938     
3939     // test thread start
3940     test_obj.test_wait = false;
3941     sleep(1);
3942     
3943     // unit_test [11] down_thread_run message call check
3944     std::cerr << "[11] down_thread_run message call check" << std::endl;
3945     BOOST_CHECK(test_obj.down_thread_exit_call_check);
3946     BOOST_CHECK(test_obj.down_thread_exit_process_type == l7vs::tcp_session::MESSAGE_PROC);
3947     
3948     // error test not find function map 
3949     test_obj.clear_function_array();
3950     exit_flag = false;
3951 //    session_pause_flag = true;
3952 /*
3953     thread_state[0] = 1;    // UP_THREAD_ALIVE
3954     thread_state[2] = 1;    // UP_THREAD_ACTIVE
3955 */
3956     
3957     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
3958     l7vs::Logger::putLogError_id = 0;
3959     
3960     test_obj.test_wait = false;
3961     sleep(1);
3962     
3963     // unit_test [12] down_thread_run not find function map error test
3964     std::cerr << "[12] down_thread_run not find function map error test" << std::endl;
3965     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
3966     BOOST_CHECK_EQUAL(16,l7vs::Logger::putLogError_id);
3967     std::cerr << l7vs::Logger::putLogError_message << std::endl;
3968     
3969     
3970     test_obj.test_end = true;
3971     test_obj.test_wait = false;
3972     test_thread.join();
3973     
3974     
3975     BOOST_MESSAGE( "----- down_thread_run test end -----" );
3976     
3977 }
3978
3979
3980 /*
3981 // thread_state_update test
3982 // thread_state_update test class
3983 class thread_state_update_test_class : public l7vs::tcp_session{
3984     public:
3985 //        thread_state_update_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){};
3986           thread_state_update_test_class(
3987                                 l7vs::virtualservice_tcp& vs,
3988                                 boost::asio::io_service& session_io,
3989                                 l7vs::tcp_socket_option_info& set_socket_option,
3990                                 boost::asio::ip::tcp::endpoint listen_endpoint,
3991                                 bool ssl_mode,
3992                                 boost::asio::ssl::context& set_ssl_context,
3993                                 bool set_ssl_cache_flag,
3994                                 int set_ssl_handshake_time_out,
3995                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
3996                                                                                                    session_io,
3997                                                                                                    set_socket_option,
3998                                                                                                    listen_endpoint,
3999                                                                                                    ssl_mode,
4000                                                                                                    set_ssl_context,
4001                                                                                                    set_ssl_cache_flag,
4002                                                                                                    set_ssl_handshake_time_out,
4003                                                                                                    set_access_logger){};
4004  
4005
4006
4007        ~thread_state_update_test_class(){};
4008         std::bitset<TCP_SESSION_THREAD_STATE_BIT>& get_thread_state(){
4009             return thread_state;
4010         };
4011         
4012         void test_call(const std::bitset<TCP_SESSION_THREAD_STATE_BIT> thread_flag,const bool regist){
4013             thread_state_update(thread_flag,regist);
4014         };
4015 };
4016 void thread_state_update_test(){
4017     
4018     BOOST_MESSAGE( "----- thread_state_update test start -----" );
4019     
4020 //    boost::asio::io_service io;
4021 //    l7vs::virtualservice_tcp vs;
4022 //    thread_state_update_test_class test_obj(vs,io);
4023     l7vs::virtualservice_tcp vs;
4024     boost::asio::io_service io;
4025     l7vs::tcp_socket_option_info set_option;
4026     //! TCP_NODELAY   (false:not set,true:set option)
4027     set_option.nodelay_opt = false;
4028     //! TCP_NODELAY option value  (false:off,true:on)
4029     set_option.nodelay_val = false;
4030     //! TCP_CORK      (false:not set,true:set option)
4031     set_option.cork_opt = false;
4032     //! TCP_CORK option value     (false:off,true:on)
4033     set_option.cork_val = false;
4034     //! TCP_QUICKACK  (false:not set,true:set option)
4035     set_option.quickack_opt = false;
4036     //! TCP_QUICKACK option value (false:off,true:on)
4037     set_option.quickack_val = false;
4038     //
4039     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
4040     bool set_mode(false);
4041     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
4042     bool set_ssl_cache_flag(false);
4043     int set_ssl_handshake_time_out = 0;
4044     //std::string access_log_file_name = "test";
4045     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
4046
4047     thread_state_update_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
4048
4049
4050
4051
4052     std::bitset<TCP_SESSION_THREAD_STATE_BIT>& thread_state = test_obj.get_thread_state();
4053     
4054     thread_state[0] = 0;    // UP_THREAD_ALIVE
4055     thread_state[1] = 0;    // DOWN_THREAD_ALIVE
4056     thread_state[2] = 0;    // UP_THREAD_ACTIVE
4057     thread_state[3] = 0;    // DOWN_THREAD_ACTIVE
4058     thread_state[4] = 0;    // UP_THREAD_LOCK
4059     thread_state[5] = 0;    // DOWN_THREAD_LOCK
4060     BOOST_CHECK(!thread_state.test(0));    // UP_THREAD_ALIVE
4061     BOOST_CHECK(!thread_state.test(1)); // DOWN_THREAD_ALIVE
4062     BOOST_CHECK(!thread_state.test(2)); // UP_THREAD_ACTIVE
4063     BOOST_CHECK(!thread_state.test(3)); // DOWN_THREAD_ACTIVE
4064     BOOST_CHECK(!thread_state.test(4)); // UP_THREAD_LOCK
4065     BOOST_CHECK(!thread_state.test(5)); // DOWN_THREAD_LOCK
4066     
4067     
4068     // unit_test [1] thread_state_update set flag test
4069     std::cerr << "[1] thread_state_update  set flag test" << std::endl;
4070     test_obj.test_call(UP_THREAD_ALIVE,true);
4071     BOOST_CHECK(thread_state.test(0));    // UP_THREAD_ALIVE
4072     BOOST_CHECK(!thread_state.test(1)); // DOWN_THREAD_ALIVE
4073     BOOST_CHECK(!thread_state.test(2)); // UP_THREAD_ACTIVE
4074     BOOST_CHECK(!thread_state.test(3)); // DOWN_THREAD_ACTIVE
4075     BOOST_CHECK(!thread_state.test(4)); // UP_THREAD_LOCK
4076     BOOST_CHECK(!thread_state.test(5)); // DOWN_THREAD_LOCK
4077     
4078     test_obj.test_call(DOWN_THREAD_ALIVE,true);
4079     BOOST_CHECK(thread_state.test(0));    // UP_THREAD_ALIVE
4080     BOOST_CHECK(thread_state.test(1)); // DOWN_THREAD_ALIVE
4081     BOOST_CHECK(!thread_state.test(2)); // UP_THREAD_ACTIVE
4082     BOOST_CHECK(!thread_state.test(3)); // DOWN_THREAD_ACTIVE
4083     BOOST_CHECK(!thread_state.test(4)); // UP_THREAD_LOCK
4084     BOOST_CHECK(!thread_state.test(5)); // DOWN_THREAD_LOCK
4085     
4086     test_obj.test_call(UP_THREAD_ACTIVE,true);
4087     BOOST_CHECK(thread_state.test(0));    // UP_THREAD_ALIVE
4088     BOOST_CHECK(thread_state.test(1)); // DOWN_THREAD_ALIVE
4089     BOOST_CHECK(thread_state.test(2)); // UP_THREAD_ACTIVE
4090     BOOST_CHECK(!thread_state.test(3)); // DOWN_THREAD_ACTIVE
4091     BOOST_CHECK(!thread_state.test(4)); // UP_THREAD_LOCK
4092     BOOST_CHECK(!thread_state.test(5)); // DOWN_THREAD_LOCK
4093     
4094     test_obj.test_call(DOWN_THREAD_ACTIVE,true);
4095     BOOST_CHECK(thread_state.test(0));    // UP_THREAD_ALIVE
4096     BOOST_CHECK(thread_state.test(1)); // DOWN_THREAD_ALIVE
4097     BOOST_CHECK(thread_state.test(2)); // UP_THREAD_ACTIVE
4098     BOOST_CHECK(thread_state.test(3)); // DOWN_THREAD_ACTIVE
4099     BOOST_CHECK(!thread_state.test(4)); // UP_THREAD_LOCK
4100     BOOST_CHECK(!thread_state.test(5)); // DOWN_THREAD_LOCK
4101     
4102     test_obj.test_call(UP_THREAD_LOCK,true);
4103     BOOST_CHECK(thread_state.test(0));    // UP_THREAD_ALIVE
4104     BOOST_CHECK(thread_state.test(1)); // DOWN_THREAD_ALIVE
4105     BOOST_CHECK(thread_state.test(2)); // UP_THREAD_ACTIVE
4106     BOOST_CHECK(thread_state.test(3)); // DOWN_THREAD_ACTIVE
4107     BOOST_CHECK(thread_state.test(4)); // UP_THREAD_LOCK
4108     BOOST_CHECK(!thread_state.test(5)); // DOWN_THREAD_LOCK
4109     
4110     test_obj.test_call(DOWN_THREAD_LOCK,true);
4111     BOOST_CHECK(thread_state.test(0));    // UP_THREAD_ALIVE
4112     BOOST_CHECK(thread_state.test(1)); // DOWN_THREAD_ALIVE
4113     BOOST_CHECK(thread_state.test(2)); // UP_THREAD_ACTIVE
4114     BOOST_CHECK(thread_state.test(3)); // DOWN_THREAD_ACTIVE
4115     BOOST_CHECK(thread_state.test(4)); // UP_THREAD_LOCK
4116     BOOST_CHECK(thread_state.test(5)); // DOWN_THREAD_LOCK
4117     
4118     // unit_test [2] thread_state_update reset flag test
4119     std::cerr << "[2] thread_state_update  reset flag test" << std::endl;
4120     test_obj.test_call(UP_THREAD_ALIVE,false);
4121     BOOST_CHECK(!thread_state.test(0));    // UP_THREAD_ALIVE
4122     BOOST_CHECK(thread_state.test(1)); // DOWN_THREAD_ALIVE
4123     BOOST_CHECK(thread_state.test(2)); // UP_THREAD_ACTIVE
4124     BOOST_CHECK(thread_state.test(3)); // DOWN_THREAD_ACTIVE
4125     BOOST_CHECK(thread_state.test(4)); // UP_THREAD_LOCK
4126     BOOST_CHECK(thread_state.test(5)); // DOWN_THREAD_LOCK
4127     
4128     test_obj.test_call(DOWN_THREAD_ALIVE,false);
4129     BOOST_CHECK(!thread_state.test(0));    // UP_THREAD_ALIVE
4130     BOOST_CHECK(!thread_state.test(1)); // DOWN_THREAD_ALIVE
4131     BOOST_CHECK(thread_state.test(2)); // UP_THREAD_ACTIVE
4132     BOOST_CHECK(thread_state.test(3)); // DOWN_THREAD_ACTIVE
4133     BOOST_CHECK(thread_state.test(4)); // UP_THREAD_LOCK
4134     BOOST_CHECK(thread_state.test(5)); // DOWN_THREAD_LOCK
4135     
4136     test_obj.test_call(UP_THREAD_ACTIVE,false);
4137     BOOST_CHECK(!thread_state.test(0));    // UP_THREAD_ALIVE
4138     BOOST_CHECK(!thread_state.test(1)); // DOWN_THREAD_ALIVE
4139     BOOST_CHECK(!thread_state.test(2)); // UP_THREAD_ACTIVE
4140     BOOST_CHECK(thread_state.test(3)); // DOWN_THREAD_ACTIVE
4141     BOOST_CHECK(thread_state.test(4)); // UP_THREAD_LOCK
4142     BOOST_CHECK(thread_state.test(5)); // DOWN_THREAD_LOCK
4143     
4144     test_obj.test_call(DOWN_THREAD_ACTIVE,false);
4145     BOOST_CHECK(!thread_state.test(0));    // UP_THREAD_ALIVE
4146     BOOST_CHECK(!thread_state.test(1)); // DOWN_THREAD_ALIVE
4147     BOOST_CHECK(!thread_state.test(2)); // UP_THREAD_ACTIVE
4148     BOOST_CHECK(!thread_state.test(3)); // DOWN_THREAD_ACTIVE
4149     BOOST_CHECK(thread_state.test(4)); // UP_THREAD_LOCK
4150     BOOST_CHECK(thread_state.test(5)); // DOWN_THREAD_LOCK
4151     
4152     test_obj.test_call(UP_THREAD_LOCK,false);
4153     BOOST_CHECK(!thread_state.test(0));    // UP_THREAD_ALIVE
4154     BOOST_CHECK(!thread_state.test(1)); // DOWN_THREAD_ALIVE
4155     BOOST_CHECK(!thread_state.test(2)); // UP_THREAD_ACTIVE
4156     BOOST_CHECK(!thread_state.test(3)); // DOWN_THREAD_ACTIVE
4157     BOOST_CHECK(!thread_state.test(4)); // UP_THREAD_LOCK
4158     BOOST_CHECK(thread_state.test(5)); // DOWN_THREAD_LOCK
4159     
4160     test_obj.test_call(DOWN_THREAD_LOCK,false);
4161     BOOST_CHECK(!thread_state.test(0));    // UP_THREAD_ALIVE
4162     BOOST_CHECK(!thread_state.test(1)); // DOWN_THREAD_ALIVE
4163     BOOST_CHECK(!thread_state.test(2)); // UP_THREAD_ACTIVE
4164     BOOST_CHECK(!thread_state.test(3)); // DOWN_THREAD_ACTIVE
4165     BOOST_CHECK(!thread_state.test(4)); // UP_THREAD_LOCK
4166     BOOST_CHECK(!thread_state.test(5)); // DOWN_THREAD_LOCK
4167     
4168     boost::thread::id proc_id = boost::this_thread::get_id();
4169 //    mutex_lock_test test_lock_obj(vs,io);
4170     mutex_lock_test test_lock_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
4171
4172     test_lock_obj.set_thread_state_update_test();
4173     
4174     test_lock_obj.test_thread_wait.lock();
4175     test_lock_obj.befor_thread_id = proc_id;
4176     test_lock_obj.after_thread_id = proc_id;
4177     test_lock_obj.mutex_lock();
4178     
4179     boost::thread test_thread(boost::bind(&mutex_lock_test::test_run,&test_lock_obj));
4180     
4181     BOOST_CHECK(test_lock_obj.befor_thread_id == proc_id);
4182     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
4183     
4184     boost::thread::id test_id = test_thread.get_id();
4185     BOOST_CHECK(test_id != proc_id);
4186     
4187     // test start
4188     test_lock_obj.test_thread_wait.unlock();
4189     sleep(1);
4190     
4191     // unit_test [3] thread_state_update thread block test (mutex lock)
4192     std::cerr << "[3] thread_state_update thread block test (mutex lock)" << std::endl;
4193     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
4194     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
4195     
4196     test_lock_obj.mutex_unlock();
4197     sleep(1);
4198     
4199     // unit_test [4] thread_state_update thread run test (mutex unlock)
4200     std::cerr << "[4] thread_state_update thread run test (mutex unlock)" << std::endl;
4201     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
4202     BOOST_CHECK(test_lock_obj.after_thread_id == test_id);
4203     
4204     BOOST_MESSAGE( "----- thread_state_update test end -----" );
4205     
4206 }
4207 */
4208
4209
4210 // up_thread_exit test
4211 // up_thread_exit test class
4212 class up_thread_exit_test_class : public l7vs::tcp_session{
4213     public:
4214 //        up_thread_exit_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){};
4215        up_thread_exit_test_class(
4216                                 l7vs::virtualservice_tcp& vs,
4217                                 boost::asio::io_service& session_io,
4218                                 l7vs::tcp_socket_option_info& set_socket_option,
4219                                 boost::asio::ip::tcp::endpoint listen_endpoint,
4220                                 bool ssl_mode,
4221                                 boost::asio::ssl::context& set_ssl_context,
4222                                 bool set_ssl_cache_flag,
4223                                 int set_ssl_handshake_time_out,
4224                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
4225                                                                                                    session_io,
4226                                                                                                    set_socket_option,
4227                                                                                                    listen_endpoint,
4228                                                                                                    ssl_mode,
4229                                                                                                    set_ssl_context,
4230                                                                                                    set_ssl_cache_flag,
4231                                                                                                    set_ssl_handshake_time_out,
4232                                                                                                    set_access_logger){};
4233         ~up_thread_exit_test_class(){};
4234         bool& get_exit_flag(){
4235             return (bool&)exit_flag;
4236         };
4237         void test_call(){
4238             l7vs::tcp_session::up_thread_exit(LOCAL_PROC);
4239         };
4240 };
4241 void up_thread_exit_test(){
4242     
4243     BOOST_MESSAGE( "----- up_thread_exit test start -----" );
4244     
4245 //    boost::asio::io_service io;
4246 //    l7vs::virtualservice_tcp vs;
4247 //    up_thread_exit_test_class test_obj(vs,io);
4248     l7vs::virtualservice_tcp vs;
4249     boost::asio::io_service io;
4250     l7vs::tcp_socket_option_info set_option;
4251     //! TCP_NODELAY   (false:not set,true:set option)
4252     set_option.nodelay_opt = false;
4253     //! TCP_NODELAY option value  (false:off,true:on)
4254     set_option.nodelay_val = false;
4255     //! TCP_CORK      (false:not set,true:set option)
4256     set_option.cork_opt = false;
4257     //! TCP_CORK option value     (false:off,true:on)
4258     set_option.cork_val = false;
4259     //! TCP_QUICKACK  (false:not set,true:set option)
4260     set_option.quickack_opt = false;
4261     //! TCP_QUICKACK option value (false:off,true:on)
4262     set_option.quickack_val = false;
4263     //
4264     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
4265     bool set_mode(false);
4266     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
4267     bool set_ssl_cache_flag(false);
4268     int set_ssl_handshake_time_out = 0;
4269     //std::string access_log_file_name = "test";
4270     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
4271     
4272     up_thread_exit_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
4273
4274     // unit_test [1] up_thread_exit update exit_flag
4275     std::cerr << "[1] up_thread_exit update exit_flag" << std::endl;
4276     
4277     
4278     bool& ref_exit_flag = test_obj.get_exit_flag();
4279     
4280     ref_exit_flag = false;
4281     
4282     test_obj.test_call();
4283     
4284     BOOST_CHECK(ref_exit_flag);
4285     
4286     
4287 //    mutex_lock_test test_lock_obj(vs,io);
4288     mutex_lock_test test_lock_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
4289
4290     test_lock_obj.set_up_thread_exit_test();
4291     
4292     
4293     test_lock_obj.test_thread_wait.lock();
4294     boost::thread::id proc_id = boost::this_thread::get_id();
4295     test_lock_obj.befor_thread_id = proc_id;
4296     test_lock_obj.after_thread_id = proc_id;
4297     test_lock_obj.mutex_lock();
4298     
4299     boost::thread test_thread(boost::bind(&mutex_lock_test::test_run,&test_lock_obj));
4300     
4301     BOOST_CHECK(test_lock_obj.befor_thread_id == proc_id);
4302     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
4303     
4304     boost::thread::id test_id = test_thread.get_id();
4305     
4306     BOOST_CHECK(test_id != proc_id);
4307     
4308     // test start
4309     test_lock_obj.test_thread_wait.unlock();
4310     sleep(1);
4311     
4312     // unit_test [2] up_thread_exit thread block test (mutex lock)
4313     std::cerr << "[2] up_thread_exit thread block test (mutex lock)" << std::endl;
4314     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
4315     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
4316     
4317     test_lock_obj.mutex_unlock();
4318     sleep(1);
4319     
4320     // unit_test [3] up_thread_exit thread run test (mutex unlock)
4321     std::cerr << "[3] up_thread_exit thread run test (mutex unlock)" << std::endl;
4322     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
4323     BOOST_CHECK(test_lock_obj.after_thread_id == test_id);
4324     
4325     
4326 //    // unit_test [4] up_thread_exit thread run after mutex unlock test
4327 //    std::cerr << "[4] up_thread_exit thread run after mutex unlock test" << std::endl;
4328 //    BOOST_CHECK(test_lock_obj.mutex_trylock());
4329 //    test_lock_obj.mutex_unlock();
4330     
4331     BOOST_MESSAGE( "----- up_thread_exit test end -----" );
4332 }
4333
4334 // down_thread_exit test
4335 // down_thread_exit test class
4336 class down_thread_exit_test_class : public l7vs::tcp_session{
4337     public:
4338 //        down_thread_exit_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){};
4339        down_thread_exit_test_class(
4340                                 l7vs::virtualservice_tcp& vs,
4341                                 boost::asio::io_service& session_io,
4342                                 l7vs::tcp_socket_option_info& set_socket_option,
4343                                 boost::asio::ip::tcp::endpoint listen_endpoint,
4344                                 bool ssl_mode,
4345                                 boost::asio::ssl::context& set_ssl_context,
4346                                 bool set_ssl_cache_flag,
4347                                 int set_ssl_handshake_time_out,
4348                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
4349                                                                                                    session_io,
4350                                                                                                    set_socket_option,
4351                                                                                                    listen_endpoint,
4352                                                                                                    ssl_mode,
4353                                                                                                    set_ssl_context,
4354                                                                                                    set_ssl_cache_flag,
4355                                                                                                    set_ssl_handshake_time_out,
4356                                                                                                    set_access_logger){};
4357
4358         ~down_thread_exit_test_class(){};
4359         bool& get_exit_flag(){
4360             return (bool&)exit_flag;
4361         };
4362         void test_call(){
4363             l7vs::tcp_session::down_thread_exit(LOCAL_PROC);
4364         };
4365 };
4366 void down_thread_exit_test(){
4367     
4368     BOOST_MESSAGE( "----- down_thread_exit test start -----" );
4369     
4370 //    boost::asio::io_service io;
4371 //    l7vs::virtualservice_tcp vs;
4372 //    down_thread_exit_test_class test_obj(vs,io);
4373     l7vs::virtualservice_tcp vs;
4374     boost::asio::io_service io;
4375     l7vs::tcp_socket_option_info set_option;
4376     //! TCP_NODELAY   (false:not set,true:set option)
4377     set_option.nodelay_opt = false;
4378     //! TCP_NODELAY option value  (false:off,true:on)
4379     set_option.nodelay_val = false;
4380     //! TCP_CORK      (false:not set,true:set option)
4381     set_option.cork_opt = false;
4382     //! TCP_CORK option value     (false:off,true:on)
4383     set_option.cork_val = false;
4384     //! TCP_QUICKACK  (false:not set,true:set option)
4385     set_option.quickack_opt = false;
4386     //! TCP_QUICKACK option value (false:off,true:on)
4387     set_option.quickack_val = false;
4388     //
4389     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
4390     bool set_mode(false);
4391     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
4392     bool set_ssl_cache_flag(false);
4393     int set_ssl_handshake_time_out = 0;
4394     //std::string access_log_file_name = "test";
4395     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
4396
4397     down_thread_exit_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
4398  
4399    // unit_test [1] down_thread_exit update exit_flag
4400     std::cerr << "[1] down_thread_exit update exit_flag" << std::endl;
4401     
4402     
4403     bool& ref_exit_flag = test_obj.get_exit_flag();
4404     
4405     ref_exit_flag = false;
4406     
4407     test_obj.test_call();
4408     
4409     BOOST_CHECK(ref_exit_flag);
4410     
4411     
4412 //    mutex_lock_test test_lock_obj(vs,io);
4413     mutex_lock_test test_lock_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
4414     test_lock_obj.set_down_thread_exit_test();
4415     
4416     
4417     test_lock_obj.test_thread_wait.lock();
4418     boost::thread::id proc_id = boost::this_thread::get_id();
4419     test_lock_obj.befor_thread_id = proc_id;
4420     test_lock_obj.after_thread_id = proc_id;
4421     test_lock_obj.mutex_lock();
4422     
4423     boost::thread test_thread(boost::bind(&mutex_lock_test::test_run,&test_lock_obj));
4424     
4425     BOOST_CHECK(test_lock_obj.befor_thread_id == proc_id);
4426     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
4427     
4428     boost::thread::id test_id = test_thread.get_id();
4429     
4430     BOOST_CHECK(test_id != proc_id);
4431     
4432     // test start
4433     test_lock_obj.test_thread_wait.unlock();
4434     sleep(1);
4435     
4436     // unit_test [2] down_thread_exit thread block test (mutex lock)
4437     std::cerr << "[2] down_thread_exit thread block test (mutex lock)" << std::endl;
4438     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
4439     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
4440     
4441     test_lock_obj.mutex_unlock();
4442     sleep(1);
4443     
4444     // unit_test [3] down_thread_exit thread run test (mutex unlock)
4445     std::cerr << "[3] down_thread_exit thread run test (mutex unlock)" << std::endl;
4446     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
4447     BOOST_CHECK(test_lock_obj.after_thread_id == test_id);
4448     
4449     
4450 //    // unit_test [4] down_thread_exit thread run after mutex unlock test
4451 //    std::cerr << "[4] down_thread_exit thread run after mutex unlock test" << std::endl;
4452 //    BOOST_CHECK(test_lock_obj.mutex_trylock());
4453 //    test_lock_obj.mutex_unlock();
4454     
4455     
4456         
4457     BOOST_MESSAGE( "----- down_thread_exit test end -----" );
4458 }
4459
4460
4461 // up_thread_client_disconnect_event test
4462 // up_thread_client_disconnect_event test class
4463 class up_thread_client_disconnect_event_test_class : public module_event_map_test_base_class{
4464     public:
4465 //        up_thread_client_disconnect_event_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : module_event_map_test_base_class(vs,session_io){
4466 //        };
4467        up_thread_client_disconnect_event_test_class(
4468                                 l7vs::virtualservice_tcp& vs,
4469                                 boost::asio::io_service& session_io,
4470                                 l7vs::tcp_socket_option_info& set_socket_option,
4471                                 boost::asio::ip::tcp::endpoint listen_endpoint,
4472                                 bool ssl_mode,
4473                                 boost::asio::ssl::context& set_ssl_context,
4474                                 bool set_ssl_cache_flag,
4475                                 int set_ssl_handshake_time_out,
4476                                 l7vs::logger_implement_access* set_access_logger) : module_event_map_test_base_class(   vs,
4477                                                                                                    session_io,
4478                                                                                                    set_socket_option,
4479                                                                                                    listen_endpoint,
4480                                                                                                    ssl_mode,
4481                                                                                                    set_ssl_context,
4482                                                                                                    set_ssl_cache_flag,
4483                                                                                                    set_ssl_handshake_time_out,
4484                                                                                                    set_access_logger){};
4485
4486         ~up_thread_client_disconnect_event_test_class(){};
4487         
4488         void test_call(){
4489             l7vs::tcp_session::up_thread_client_disconnect_event(LOCAL_PROC);
4490         };
4491 };
4492
4493 void up_thread_client_disconnect_event_test(){
4494     
4495     BOOST_MESSAGE( "----- up_thread_client_disconnect_event test start -----" );
4496     
4497 //    boost::asio::io_service io;
4498 //    l7vs::virtualservice_tcp vs;    
4499 //    up_thread_client_disconnect_event_test_class test_obj(vs,io);
4500     l7vs::virtualservice_tcp vs;
4501     boost::asio::io_service io;
4502     l7vs::tcp_socket_option_info set_option;
4503     //! TCP_NODELAY   (false:not set,true:set option)
4504     set_option.nodelay_opt = false;
4505     //! TCP_NODELAY option value  (false:off,true:on)
4506     set_option.nodelay_val = false;
4507     //! TCP_CORK      (false:not set,true:set option)
4508     set_option.cork_opt = false;
4509     //! TCP_CORK option value     (false:off,true:on)
4510     set_option.cork_val = false;
4511     //! TCP_QUICKACK  (false:not set,true:set option)
4512     set_option.quickack_opt = false;
4513     //! TCP_QUICKACK option value (false:off,true:on)
4514     set_option.quickack_val = false;
4515     //
4516     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
4517     bool set_mode(false);
4518     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
4519     bool set_ssl_cache_flag(false);
4520     int set_ssl_handshake_time_out = 0;
4521     //std::string access_log_file_name = "test";
4522     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
4523
4524     up_thread_client_disconnect_event_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
4525
4526     std::string test_protocol_name("test protocol");
4527     l7vs::test_protocol_module proto_test(test_protocol_name);
4528
4529     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
4530     
4531     l7vs::protocol_module_base::EVENT_TAG chek_event[13];
4532     chek_event[0] = l7vs::protocol_module_base::ACCEPT;
4533     chek_event[1] = l7vs::protocol_module_base::CLIENT_DISCONNECT;
4534     chek_event[2] = l7vs::protocol_module_base::CLIENT_RECV;
4535     chek_event[3] = l7vs::protocol_module_base::CLIENT_RESPONSE_SEND;
4536     chek_event[4] = l7vs::protocol_module_base::REALSERVER_SELECT;
4537     chek_event[5] = l7vs::protocol_module_base::REALSERVER_CONNECT;
4538     chek_event[6] = l7vs::protocol_module_base::REALSERVER_SEND;
4539     chek_event[7] = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
4540     chek_event[8] = l7vs::protocol_module_base::SORRYSERVER_SELECT;
4541     chek_event[9] = l7vs::protocol_module_base::SORRYSERVER_CONNECT;
4542     chek_event[10] = l7vs::protocol_module_base::SORRYSERVER_SEND;
4543     chek_event[11] = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
4544     chek_event[12] = l7vs::protocol_module_base::FINALIZE;
4545     
4546     // unit_test [1] up_thread_client_disconnect_event up_thread_next_call_function update check
4547     std::cerr << "[1] up_thread_client_disconnect_event up_thread_next_call_function update check" << std::endl;
4548     for(int i = 0; i < 13;i++){
4549         proto_test.handle_client_disconnect_res_tag = chek_event[i];
4550         test_obj.test_call();
4551         BOOST_CHECK(test_obj.chk_up_thread_next_call_function(chek_event[i]));
4552     }
4553     
4554     // unit_test [2] up_thread_client_disconnect_event module parameter check thread id
4555     std::cerr << "[2] up_thread_client_disconnect_event module parameter check thread id" << std::endl;
4556     boost::thread::id def_id;
4557     boost::thread::id proc_id = boost::this_thread::get_id();
4558     test_obj.set_up_thread_id(proc_id);
4559     proto_test.handle_client_disconnect_thread_id = def_id;    
4560     proto_test.handle_client_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
4561     BOOST_CHECK(proto_test.handle_client_disconnect_thread_id != proc_id);
4562     test_obj.test_call();
4563     BOOST_CHECK(proto_test.handle_client_disconnect_thread_id == proc_id);
4564     
4565     // unit_test [3] up_thread_client_disconnect_event not fond function error check
4566     std::cerr << "[3] up_thread_client_disconnect_event not fond function error check" << std::endl;
4567     test_obj.up_thread_function_array_clear();
4568     proto_test.handle_client_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
4569     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
4570     l7vs::Logger::putLogError_id = 0;
4571     test_obj.test_call();
4572     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
4573     BOOST_CHECK_EQUAL(29,l7vs::Logger::putLogError_id);
4574     std::cerr << l7vs::Logger::putLogError_message << std::endl;
4575     
4576     // unit_test [4] up_thread_client_disconnect_event returnd illegal EVENT_TAG error check
4577     std::cerr << "[4] up_thread_client_disconnect_event returnd illegal EVENT_TAG error check" << std::endl;
4578     test_obj.up_thread_module_event_map_clear();
4579     proto_test.handle_client_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
4580     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
4581     l7vs::Logger::putLogError_id = 0;
4582     test_obj.test_call();
4583     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
4584     BOOST_CHECK_EQUAL(28,l7vs::Logger::putLogError_id);
4585     std::cerr << l7vs::Logger::putLogError_message << std::endl;
4586     
4587 //    mutex_lock_test test_lock_obj(vs,io);
4588     mutex_lock_test test_lock_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
4589
4590     test_lock_obj.set_up_thread_client_disconnect_event_test();
4591     test_lock_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
4592     
4593     
4594     test_lock_obj.test_thread_wait.lock();
4595     test_lock_obj.befor_thread_id = proc_id;
4596     test_lock_obj.after_thread_id = proc_id;
4597     test_lock_obj.mutex_lock();
4598     
4599     boost::thread test_thread(boost::bind(&mutex_lock_test::test_run,&test_lock_obj));
4600     
4601     BOOST_CHECK(test_lock_obj.befor_thread_id == proc_id);
4602     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
4603     
4604     boost::thread::id test_id = test_thread.get_id();
4605     
4606     BOOST_CHECK(test_id != proc_id);
4607     
4608     // test start
4609     test_lock_obj.test_thread_wait.unlock();
4610     sleep(1);
4611     
4612     // unit_test [5] up_thread_client_disconnect_event thread block test (mutex lock)
4613     std::cerr << "[5] up_thread_client_disconnect_event thread block test (mutex lock)" << std::endl;
4614     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
4615     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
4616     
4617     test_lock_obj.mutex_unlock();
4618     sleep(1);
4619     
4620     // unit_test [6] up_thread_client_disconnect_event thread run test (mutex unlock)
4621     std::cerr << "[6] up_thread_client_disconnect_event thread run test (mutex unlock)" << std::endl;
4622     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
4623     BOOST_CHECK(test_lock_obj.after_thread_id == test_id);
4624     
4625     BOOST_MESSAGE( "----- up_thread_client_disconnect_event test end -----" );
4626     
4627 }
4628 // down_thread_client_disconnetc_event test
4629 // dwon_thread_client_disconnetc_event test class
4630 class down_thread_client_disconnect_event_test_class : public module_event_map_test_base_class{
4631     public:
4632 //        down_thread_client_disconnect_event_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : module_event_map_test_base_class(vs,session_io){
4633 //        };
4634        down_thread_client_disconnect_event_test_class(
4635                                 l7vs::virtualservice_tcp& vs,
4636                                 boost::asio::io_service& session_io,
4637                                 l7vs::tcp_socket_option_info& set_socket_option,
4638                                 boost::asio::ip::tcp::endpoint listen_endpoint,
4639                                 bool ssl_mode,
4640                                 boost::asio::ssl::context& set_ssl_context,
4641                                 bool set_ssl_cache_flag,
4642                                 int set_ssl_handshake_time_out,
4643                                 l7vs::logger_implement_access* set_access_logger) : module_event_map_test_base_class(   vs,
4644                                                                                                    session_io,
4645                                                                                                    set_socket_option,
4646                                                                                                    listen_endpoint,
4647                                                                                                    ssl_mode,
4648                                                                                                    set_ssl_context,
4649                                                                                                    set_ssl_cache_flag,
4650                                                                                                    set_ssl_handshake_time_out,
4651                                                                                                    set_access_logger){};
4652
4653         ~down_thread_client_disconnect_event_test_class(){};
4654         
4655         void test_call(){
4656             l7vs::tcp_session::down_thread_client_disconnect_event(LOCAL_PROC);
4657         };
4658 };
4659
4660 void down_thread_client_disconnect_event_test(){
4661     
4662     BOOST_MESSAGE( "----- down_thread_client_disconnect_event test start -----" );
4663     
4664 //    boost::asio::io_service io;
4665 //    l7vs::virtualservice_tcp vs;
4666 //    down_thread_client_disconnect_event_test_class test_obj(vs,io);
4667     l7vs::virtualservice_tcp vs;
4668     boost::asio::io_service io;
4669     l7vs::tcp_socket_option_info set_option;
4670     //! TCP_NODELAY   (false:not set,true:set option)
4671     set_option.nodelay_opt = false;
4672     //! TCP_NODELAY option value  (false:off,true:on)
4673     set_option.nodelay_val = false;
4674     //! TCP_CORK      (false:not set,true:set option)
4675     set_option.cork_opt = false;
4676     //! TCP_CORK option value     (false:off,true:on)
4677     set_option.cork_val = false;
4678     //! TCP_QUICKACK  (false:not set,true:set option)
4679     set_option.quickack_opt = false;
4680     //! TCP_QUICKACK option value (false:off,true:on)
4681     set_option.quickack_val = false;
4682     //
4683     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
4684     bool set_mode(false);
4685     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
4686     bool set_ssl_cache_flag(false);
4687     int set_ssl_handshake_time_out = 0;
4688     //std::string access_log_file_name = "test";
4689     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
4690
4691     down_thread_client_disconnect_event_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
4692
4693     std::string test_protocol_name("test protocol");
4694     l7vs::test_protocol_module proto_test(test_protocol_name);
4695
4696     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
4697
4698     l7vs::protocol_module_base::EVENT_TAG chek_event[7];
4699     chek_event[0] = l7vs::protocol_module_base::CLIENT_DISCONNECT;
4700     chek_event[1] = l7vs::protocol_module_base::CLIENT_CONNECTION_CHECK;
4701     chek_event[2] = l7vs::protocol_module_base::REALSERVER_RECV;
4702     chek_event[3] = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
4703     chek_event[4] = l7vs::protocol_module_base::SORRYSERVER_RECV;
4704     chek_event[5] = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
4705     chek_event[6] = l7vs::protocol_module_base::FINALIZE;
4706     
4707     // unit_test [1] down_thread_client_disconnect_event up_thread_next_call_function update check
4708     std::cerr << "[1] down_thread_client_disconnect_event up_thread_next_call_function update check" << std::endl;
4709     for(int i = 0; i < 7;i++){
4710         proto_test.handle_client_disconnect_res_tag = chek_event[i];
4711         test_obj.test_call();
4712         BOOST_CHECK(test_obj.chk_down_thread_next_call_function(chek_event[i]));
4713     }
4714     
4715     // unit_test [2] down_thread_client_disconnect_event module parameter check thread id
4716     std::cerr << "[2] down_thread_client_disconnect_event module parameter check thread id" << std::endl;
4717     boost::thread::id def_id;
4718     boost::thread::id proc_id = boost::this_thread::get_id();
4719     test_obj.set_down_thread_id(proc_id);
4720     proto_test.handle_client_disconnect_thread_id = def_id;    
4721     proto_test.handle_client_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
4722     BOOST_CHECK(proto_test.handle_client_disconnect_thread_id != proc_id);
4723     test_obj.test_call();
4724     BOOST_CHECK(proto_test.handle_client_disconnect_thread_id == proc_id);
4725     
4726     // unit_test [3] down_thread_client_disconnect_event not fond function error check
4727     std::cerr << "[3] down_thread_client_disconnect_event not fond function error check" << std::endl;
4728     test_obj.down_thread_function_array_clear();
4729     proto_test.handle_client_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
4730     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
4731     l7vs::Logger::putLogError_id = 0;
4732     test_obj.test_call();
4733     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
4734     BOOST_CHECK_EQUAL(87,l7vs::Logger::putLogError_id);
4735     std::cerr << l7vs::Logger::putLogError_message << std::endl;
4736     
4737     // unit_test [4] down_thread_client_disconnect_event returnd illegal EVENT_TAG error check
4738     std::cerr << "[4] down_thread_client_disconnect_event returnd illegal EVENT_TAG error check" << std::endl;
4739     test_obj.down_thread_module_event_map_clear();
4740     proto_test.handle_client_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
4741     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
4742     l7vs::Logger::putLogError_id = 0;
4743     test_obj.test_call();
4744     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
4745     BOOST_CHECK_EQUAL(86,l7vs::Logger::putLogError_id);
4746     std::cerr << l7vs::Logger::putLogError_message << std::endl;
4747     
4748 //    mutex_lock_test test_lock_obj(vs,io);
4749     mutex_lock_test test_lock_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
4750
4751     test_lock_obj.set_down_thread_client_disconnect_event_test();
4752     test_lock_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);    
4753     
4754     test_lock_obj.test_thread_wait.lock();
4755     test_lock_obj.befor_thread_id = proc_id;
4756     test_lock_obj.after_thread_id = proc_id;
4757     test_lock_obj.mutex_lock();
4758     
4759     boost::thread test_thread(boost::bind(&mutex_lock_test::test_run,&test_lock_obj));
4760     
4761     BOOST_CHECK(test_lock_obj.befor_thread_id == proc_id);
4762     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
4763     
4764     boost::thread::id test_id = test_thread.get_id();
4765     
4766     BOOST_CHECK(test_id != proc_id);
4767     
4768     // test start
4769     test_lock_obj.test_thread_wait.unlock();
4770     sleep(1);
4771     
4772     // unit_test [5] down_thread_client_disconnect_event thread block test (mutex lock)
4773     std::cerr << "[5] down_thread_client_disconnect_event thread block test (mutex lock)" << std::endl;
4774     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
4775     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
4776     
4777     test_lock_obj.mutex_unlock();
4778     sleep(1);
4779     
4780     // unit_test [6] down_thread_client_disconnect_event thread run test (mutex unlock)
4781     std::cerr << "[6] down_thread_client_disconnect_event thread run test (mutex unlock)" << std::endl;
4782     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
4783     BOOST_CHECK(test_lock_obj.after_thread_id == test_id);
4784     
4785     BOOST_MESSAGE( "----- down_thread_client_disconnect_event test end -----" );
4786 }
4787
4788 // up_thread_realserver_get_detination_event test
4789 // up_thread_realserver_get_detination_event test class
4790 class up_thread_realserver_get_detination_event_test_class : public l7vs::tcp_session{
4791     public:
4792 //        up_thread_realserver_get_detination_event_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){
4793 //        };
4794        up_thread_realserver_get_detination_event_test_class(
4795                                 l7vs::virtualservice_tcp& vs,
4796                                 boost::asio::io_service& session_io,
4797                                 l7vs::tcp_socket_option_info& set_socket_option,
4798                                 boost::asio::ip::tcp::endpoint listen_endpoint,
4799                                 bool ssl_mode,
4800                                 boost::asio::ssl::context& set_ssl_context,
4801                                 bool set_ssl_cache_flag,
4802                                 int set_ssl_handshake_time_out,
4803                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
4804                                                                                                    session_io,
4805                                                                                                    set_socket_option,
4806                                                                                                    listen_endpoint,
4807                                                                                                    ssl_mode,
4808                                                                                                    set_ssl_context,
4809                                                                                                    set_ssl_cache_flag,
4810                                                                                                    set_ssl_handshake_time_out,
4811                                                                                                    set_access_logger){};
4812
4813         ~up_thread_realserver_get_detination_event_test_class(){};
4814         
4815         void test_call(){
4816             tcp_session::up_thread_realserver_get_destination_event(LOCAL_PROC);
4817         };
4818         
4819         l7vs::tcp_data& get_up_thread_data_dest_side(){
4820             return up_thread_data_dest_side;
4821         };
4822         void next_call(){
4823             up_thread_next_call_function.second(LOCAL_PROC);
4824         }
4825         
4826         void up_thread_realserver_connect(const TCP_PROCESS_TYPE_TAG process_type){
4827             up_thread_realserver_connect_call_check = true;
4828             
4829         };
4830         bool up_thread_realserver_connect_call_check;
4831         
4832         void set_protocol_module(l7vs::protocol_module_base* set_proto){
4833             protocol_module = set_proto;
4834         };
4835         
4836         void set_up_thread_id(boost::thread::id set_id){
4837             up_thread_id = set_id;
4838         };
4839         
4840         void up_thread_function_array_clear(){
4841             for(int i = 0; i <= UP_FUNC_EXIT;i++){
4842                 up_thread_function_array[i].second = NULL;
4843             }
4844         };
4845         void up_thread_module_event_map_clear(){
4846             up_thread_module_event_map.clear();
4847         };
4848 };
4849 void up_thread_realserver_get_detination_event_test(){
4850     BOOST_MESSAGE( "----- up_thread_realserver_get_detination_event test start -----" );
4851     
4852 //    boost::asio::io_service io;
4853 //    l7vs::virtualservice_tcp vs;
4854 //    up_thread_realserver_get_detination_event_test_class test_obj(vs,io);
4855     l7vs::virtualservice_tcp vs;
4856     boost::asio::io_service io;
4857     l7vs::tcp_socket_option_info set_option;
4858     //! TCP_NODELAY   (false:not set,true:set option)
4859     set_option.nodelay_opt = false;
4860     //! TCP_NODELAY option value  (false:off,true:on)
4861     set_option.nodelay_val = false;
4862     //! TCP_CORK      (false:not set,true:set option)
4863     set_option.cork_opt = false;
4864     //! TCP_CORK option value     (false:off,true:on)
4865     set_option.cork_val = false;
4866     //! TCP_QUICKACK  (false:not set,true:set option)
4867     set_option.quickack_opt = false;
4868     //! TCP_QUICKACK option value (false:off,true:on)
4869     set_option.quickack_val = false;
4870     //
4871     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
4872     bool set_mode(false);
4873     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
4874     bool set_ssl_cache_flag(false);
4875     int set_ssl_handshake_time_out = 0;
4876     //std::string access_log_file_name = "test";
4877     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
4878
4879     up_thread_realserver_get_detination_event_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
4880
4881
4882     std::string test_protocol_name("test protocol");
4883     l7vs::test_protocol_module proto_test(test_protocol_name);
4884     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
4885     l7vs::tcp_data& up_thread_data_dest_side = test_obj.get_up_thread_data_dest_side();
4886     boost::thread::id proc_id = boost::this_thread::get_id();
4887     test_obj.set_up_thread_id(proc_id);
4888     
4889     proto_test.handle_realserver_select_tcp_res_tag = l7vs::protocol_module_base::REALSERVER_CONNECT;
4890     proto_test.handle_realserver_select_out_rs_endpoint = boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("100.101.102.103"), 7777);
4891     up_thread_data_dest_side.initialize();
4892     BOOST_CHECK(proto_test.handle_realserver_select_in_thread_id != proc_id);
4893     
4894     test_obj.test_call();
4895     
4896     // unit_test [1] up_thread_realserver_get_detination_event handle_realserver_select call check
4897     std::cerr << "[1] up_thread_realserver_get_detination_event handle_realserver_select call check" << std::endl;
4898     BOOST_CHECK(proto_test.handle_realserver_select_in_thread_id == proc_id);
4899     boost::asio::ip::tcp::endpoint get_endpoint = up_thread_data_dest_side.get_endpoint();
4900     BOOST_CHECK(get_endpoint == proto_test.handle_realserver_select_out_rs_endpoint);
4901     
4902     // unit_test [2] up_thread_realserver_get_detination_event up_thread_next_call_function update check
4903     std::cerr << "[2] up_thread_realserver_get_detination_event up_thread_next_call_function update check" << std::endl;
4904     test_obj.up_thread_realserver_connect_call_check = false;
4905     test_obj.next_call();
4906     BOOST_CHECK(test_obj.up_thread_realserver_connect_call_check);
4907     
4908     // unit_test [3] up_thread_realserver_get_detination_event not fond function error check
4909     std::cerr << "[3] up_thread_realserver_get_detination_event not fond function error check" << std::endl;
4910     test_obj.up_thread_function_array_clear();
4911     proto_test.handle_realserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
4912     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
4913     l7vs::Logger::putLogError_id = 0;
4914     test_obj.test_call();
4915     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
4916     BOOST_CHECK_EQUAL(33,l7vs::Logger::putLogError_id);
4917     std::cerr << l7vs::Logger::putLogError_message << std::endl;
4918     
4919     // unit_test [4] up_thread_realserver_get_detination_event returnd illegal EVENT_TAG error check
4920     std::cerr << "[4] up_thread_realserver_get_detination_event returnd illegal EVENT_TAG error check" << std::endl;
4921     test_obj.up_thread_module_event_map_clear();
4922     proto_test.handle_realserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
4923     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
4924     l7vs::Logger::putLogError_id = 0;
4925     test_obj.test_call();
4926     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
4927     BOOST_CHECK_EQUAL(32,l7vs::Logger::putLogError_id);
4928     std::cerr << l7vs::Logger::putLogError_message << std::endl;
4929     
4930     BOOST_MESSAGE( "----- up_thread_realserver_get_detination_event test end -----" );
4931 }
4932 // up_thread_sorryserver_get_detination_event test
4933 // up_thread_sorryserver_get_detination_event test class
4934 class up_thread_sorryserver_get_detination_event_test_class : public l7vs::tcp_session{
4935     public:
4936 //        up_thread_sorryserver_get_detination_event_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){
4937 //        };
4938        up_thread_sorryserver_get_detination_event_test_class(
4939                                 l7vs::virtualservice_tcp& vs,
4940                                 boost::asio::io_service& session_io,
4941                                 l7vs::tcp_socket_option_info& set_socket_option,
4942                                 boost::asio::ip::tcp::endpoint listen_endpoint,
4943                                 bool ssl_mode,
4944                                 boost::asio::ssl::context& set_ssl_context,
4945                                 bool set_ssl_cache_flag,
4946                                 int set_ssl_handshake_time_out,
4947                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
4948                                                                                                    session_io,
4949                                                                                                    set_socket_option,
4950                                                                                                    listen_endpoint,
4951                                                                                                    ssl_mode,
4952                                                                                                    set_ssl_context,
4953                                                                                                    set_ssl_cache_flag,
4954                                                                                                    set_ssl_handshake_time_out,
4955                                                                                                    set_access_logger){};
4956
4957         ~up_thread_sorryserver_get_detination_event_test_class(){};
4958         
4959         void test_call(){
4960             tcp_session::up_thread_sorryserver_get_destination_event(LOCAL_PROC);
4961         };
4962         
4963         l7vs::tcp_data& get_up_thread_data_dest_side(){
4964             return up_thread_data_dest_side;
4965         };
4966         void next_call(){
4967             up_thread_next_call_function.second(LOCAL_PROC);
4968         }
4969         
4970         void up_thread_sorryserver_connect(const TCP_PROCESS_TYPE_TAG process_type){
4971             up_thread_sorryserver_connect_call_check = true;
4972             
4973         };
4974         bool up_thread_sorryserver_connect_call_check;
4975         
4976         void set_protocol_module(l7vs::protocol_module_base* set_proto){
4977             protocol_module = set_proto;
4978         };
4979         
4980         void set_up_thread_id(boost::thread::id set_id){
4981             up_thread_id = set_id;
4982         };
4983         
4984         void up_thread_function_array_clear(){
4985             for(int i = 0; i <= UP_FUNC_EXIT; i++){
4986                 up_thread_function_array[i].second = NULL;
4987             }
4988         };
4989         void up_thread_module_event_map_clear(){
4990             up_thread_module_event_map.clear();
4991         };
4992 };
4993 void up_thread_sorryserver_get_detination_event_test(){
4994     BOOST_MESSAGE( "----- up_thread_sorryserver_get_detination_event test start -----" );
4995     
4996 //    boost::asio::io_service io;
4997 //    l7vs::virtualservice_tcp vs;
4998 //    up_thread_sorryserver_get_detination_event_test_class test_obj(vs,io);
4999     l7vs::virtualservice_tcp vs;
5000     boost::asio::io_service io;
5001     l7vs::tcp_socket_option_info set_option;
5002     //! TCP_NODELAY   (false:not set,true:set option)
5003     set_option.nodelay_opt = false;
5004     //! TCP_NODELAY option value  (false:off,true:on)
5005     set_option.nodelay_val = false;
5006     //! TCP_CORK      (false:not set,true:set option)
5007     set_option.cork_opt = false;
5008     //! TCP_CORK option value     (false:off,true:on)
5009     set_option.cork_val = false;
5010     //! TCP_QUICKACK  (false:not set,true:set option)
5011     set_option.quickack_opt = false;
5012     //! TCP_QUICKACK option value (false:off,true:on)
5013     set_option.quickack_val = false;
5014     //
5015     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
5016     bool set_mode(false);
5017     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
5018     bool set_ssl_cache_flag(false);
5019     int set_ssl_handshake_time_out = 0;
5020     //std::string access_log_file_name = "test";
5021     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
5022
5023     up_thread_sorryserver_get_detination_event_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
5024
5025     std::string test_protocol_name("test protocol");
5026     l7vs::test_protocol_module proto_test(test_protocol_name);
5027     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
5028     l7vs::tcp_data& up_thread_data_dest_side = test_obj.get_up_thread_data_dest_side();
5029     boost::thread::id proc_id = boost::this_thread::get_id();
5030     test_obj.set_up_thread_id(proc_id);
5031     
5032     proto_test.handle_sorryserver_select_res_tag = l7vs::protocol_module_base::SORRYSERVER_CONNECT;
5033     proto_test.handle_sorryserver_select_out_sorry_endpoint = boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("100.101.102.103"), 7777);
5034     vs.my_element.sorry_endpoint = boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("200.201.202.203"), 8888);
5035
5036     up_thread_data_dest_side.initialize();
5037     BOOST_CHECK(proto_test.handle_sorryserver_select_in_thread_id != proc_id);
5038     
5039     test_obj.test_call();
5040     
5041     // unit_test [1] up_thread_sorryserver_get_detination_event handle_realserver_select call check
5042     std::cerr << "[1] up_thread_sorryserver_get_detination_event handle_realserver_select call check" << std::endl;
5043     BOOST_CHECK(proto_test.handle_sorryserver_select_in_thread_id == proc_id);
5044     boost::asio::ip::tcp::endpoint get_endpoint = up_thread_data_dest_side.get_endpoint();
5045     BOOST_CHECK(get_endpoint == proto_test.handle_sorryserver_select_out_sorry_endpoint);
5046     BOOST_CHECK(vs.my_element.sorry_endpoint == proto_test.handle_sorryserver_select_in_sorry_endpoint);
5047     
5048     // unit_test [2] up_thread_sorryserver_get_detination_event up_thread_next_call_function update check
5049     std::cerr << "[2] up_thread_sorryserver_get_detination_event up_thread_next_call_function update check" << std::endl;
5050     test_obj.up_thread_sorryserver_connect_call_check = false;
5051     test_obj.next_call();
5052     BOOST_CHECK(test_obj.up_thread_sorryserver_connect_call_check);
5053     
5054     // unit_test [3] up_thread_sorryserver_get_detination_event not fond function error check
5055     std::cerr << "[3] up_thread_sorryserver_get_detination_event not fond function error check" << std::endl;
5056     test_obj.up_thread_function_array_clear();
5057     proto_test.handle_sorryserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
5058     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
5059     l7vs::Logger::putLogError_id = 0;
5060     test_obj.test_call();
5061     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
5062     BOOST_CHECK_EQUAL(52,l7vs::Logger::putLogError_id);
5063     std::cerr << l7vs::Logger::putLogError_message << std::endl;
5064     
5065     // unit_test [4] up_thread_sorryserver_get_detination_event returnd illegal EVENT_TAG error check
5066     std::cerr << "[4] up_thread_sorryserver_get_detination_event returnd illegal EVENT_TAG error check" << std::endl;
5067     test_obj.up_thread_module_event_map_clear();
5068     proto_test.handle_sorryserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
5069     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
5070     l7vs::Logger::putLogError_id = 0;
5071     test_obj.test_call();
5072     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
5073     BOOST_CHECK_EQUAL(51,l7vs::Logger::putLogError_id);
5074     std::cerr << l7vs::Logger::putLogError_message << std::endl;
5075     
5076     BOOST_MESSAGE( "----- up_thread_sorryserver_get_detination_event test end -----" );
5077 }
5078
5079
5080 // up_thread_realserver_disconnect_event test
5081 // up_thread_realserver_disconnect_event test class
5082 class up_thread_realserver_disconnect_event_test_class : public module_event_map_test_base_class{
5083     public:
5084 //        up_thread_realserver_disconnect_event_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : module_event_map_test_base_class(vs,session_io){
5085 //        };
5086        up_thread_realserver_disconnect_event_test_class(
5087                                 l7vs::virtualservice_tcp& vs,
5088                                 boost::asio::io_service& session_io,
5089                                 l7vs::tcp_socket_option_info& set_socket_option,
5090                                 boost::asio::ip::tcp::endpoint listen_endpoint,
5091                                 bool ssl_mode,
5092                                 boost::asio::ssl::context& set_ssl_context,
5093                                 bool set_ssl_cache_flag,
5094                                 int set_ssl_handshake_time_out,
5095                                 l7vs::logger_implement_access* set_access_logger) : module_event_map_test_base_class(   vs,
5096                                                                                                    session_io,
5097                                                                                                    set_socket_option,
5098                                                                                                    listen_endpoint,
5099                                                                                                    ssl_mode,
5100                                                                                                    set_ssl_context,
5101                                                                                                    set_ssl_cache_flag,
5102                                                                                                    set_ssl_handshake_time_out,
5103                                                                                                    set_access_logger){};
5104
5105         
5106         ~up_thread_realserver_disconnect_event_test_class(){};
5107         
5108         void test_call(){
5109             l7vs::tcp_session::up_thread_realserver_disconnect_event(LOCAL_PROC);
5110         };
5111         
5112         std::map<endpoint,tcp_socket_ptr>& get_realserver_socket_map(){
5113             return up_thread_send_realserver_socket_map;
5114         };
5115 };
5116
5117 void up_thread_realserver_disconnect_event_test(){
5118     
5119     BOOST_MESSAGE( "----- up_thread_realserver_disconnect_event test start -----" );
5120     
5121     boost::asio::io_service io;
5122     l7vs::virtualservice_tcp vs;
5123 //    up_thread_realserver_disconnect_event_test_class test_obj(vs,io);
5124     l7vs::tcp_socket_option_info set_option;
5125     //! TCP_NODELAY   (false:not set,true:set option)
5126     set_option.nodelay_opt = false;
5127     //! TCP_NODELAY option value  (false:off,true:on)
5128     set_option.nodelay_val = false;
5129     //! TCP_CORK      (false:not set,true:set option)
5130     set_option.cork_opt = false;
5131     //! TCP_CORK option value     (false:off,true:on)
5132     set_option.cork_val = false;
5133     //! TCP_QUICKACK  (false:not set,true:set option)
5134     set_option.quickack_opt = false;
5135     //! TCP_QUICKACK option value (false:off,true:on)
5136     set_option.quickack_val = false;
5137     //
5138     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
5139     bool set_mode(false);
5140     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
5141     bool set_ssl_cache_flag(false);
5142     int set_ssl_handshake_time_out = 0;
5143     //std::string access_log_file_name = "test";
5144     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
5145
5146     up_thread_realserver_disconnect_event_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
5147
5148
5149
5150
5151     std::string test_protocol_name("test protocol");
5152     l7vs::test_protocol_module proto_test(test_protocol_name);
5153
5154     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
5155     
5156     l7vs::protocol_module_base::EVENT_TAG chek_event[13];
5157     chek_event[0] = l7vs::protocol_module_base::ACCEPT;
5158     chek_event[1] = l7vs::protocol_module_base::CLIENT_DISCONNECT;
5159     chek_event[2] = l7vs::protocol_module_base::CLIENT_RECV;
5160     chek_event[3] = l7vs::protocol_module_base::CLIENT_RESPONSE_SEND;
5161     chek_event[4] = l7vs::protocol_module_base::REALSERVER_SELECT;
5162     chek_event[5] = l7vs::protocol_module_base::REALSERVER_CONNECT;
5163     chek_event[6] = l7vs::protocol_module_base::REALSERVER_SEND;
5164     chek_event[7] = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
5165     chek_event[8] = l7vs::protocol_module_base::SORRYSERVER_SELECT;
5166     chek_event[9] = l7vs::protocol_module_base::SORRYSERVER_CONNECT;
5167     chek_event[10] = l7vs::protocol_module_base::SORRYSERVER_SEND;
5168     chek_event[11] = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
5169     chek_event[12] = l7vs::protocol_module_base::FINALIZE;
5170     
5171     // unit_test [1] up_thread_realserver_disconnect_event up_thread_next_call_function update check
5172     std::cerr << "[1] up_thread_realserver_disconnect_event up_thread_next_call_function update check" << std::endl;
5173     for(int i = 0; i < 13;i++){
5174         proto_test.handle_realserver_disconnect_res_tag = chek_event[i];
5175         test_obj.test_call();
5176         BOOST_CHECK(test_obj.chk_up_thread_next_call_function(chek_event[i]));
5177     }
5178     
5179     // module parameter check
5180     boost::thread::id def_id;
5181     boost::thread::id proc_id = boost::this_thread::get_id();
5182     boost::asio::ip::tcp::endpoint test_end(boost::asio::ip::address::from_string("100.102.103.104"), 7777);
5183     l7vs::tcp_data test_message;
5184     test_message.set_endpoint(test_end);
5185     test_obj.set_up_thread_id(proc_id);
5186     test_obj.set_up_thread_message_data(test_message);
5187     proto_test.handle_realserver_disconnect_thread_id = def_id;
5188     proto_test.handle_realserver_disconnect_rs_endpoint = boost::asio::ip::tcp::endpoint();
5189     proto_test.handle_realserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
5190     BOOST_CHECK(proto_test.handle_realserver_disconnect_thread_id != proc_id);
5191     BOOST_CHECK(proto_test.handle_realserver_disconnect_rs_endpoint != test_end);
5192     test_obj.test_call();
5193     // unit_test [2] up_thread_realserver_disconnect_event module parameter check thread id
5194     std::cerr << "[2] up_thread_realserver_disconnect_event module parameter check thread id" << std::endl;
5195     BOOST_CHECK(proto_test.handle_realserver_disconnect_thread_id == proc_id);
5196     
5197     // unit_test [3] up_thread_realserver_disconnect_event module parameter check endpoint
5198     std::cerr << "[3] up_thread_realserver_disconnect_event module parameter check endpoint" << std::endl;
5199     BOOST_CHECK(proto_test.handle_realserver_disconnect_rs_endpoint == test_end);
5200     
5201     
5202     // unit_test [4] up_thread_realserver_disconnect_event realserver map erase check
5203     std::cerr << "[4] up_thread_realserver_disconnect_event  realserver map erase check" << std::endl;
5204     
5205     std::map<boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > >& realserver_map = test_obj.get_realserver_socket_map();
5206     boost::shared_ptr< l7vs::tcp_socket > test_tcp_sock0(new l7vs::tcp_socket(io));
5207     boost::shared_ptr< l7vs::tcp_socket > test_tcp_sock1(new l7vs::tcp_socket(io));
5208     boost::shared_ptr< l7vs::tcp_socket > test_tcp_sock2(new l7vs::tcp_socket(io));
5209     std::pair< boost::asio::ip::tcp::endpoint , boost::shared_ptr< l7vs::tcp_socket > > test_sock_list[3];
5210     test_sock_list[0].first = boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("100.100.100.100"), 0);
5211     test_sock_list[0].second = test_tcp_sock0;
5212     test_sock_list[1].first = boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("101.101.101.101"), 1);
5213     test_sock_list[1].second = test_tcp_sock1;
5214     test_sock_list[2].first = boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("102.102.102.102"), 2);
5215     test_sock_list[2].second = test_tcp_sock2;
5216     for(int i = 0;i < 3;i++){
5217         realserver_map.insert(test_sock_list[i]);
5218     }    
5219     proto_test.handle_realserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
5220     
5221     //erase 1
5222     test_message.set_endpoint(test_sock_list[1].first);
5223     test_obj.set_up_thread_message_data(test_message);
5224     BOOST_CHECK(realserver_map.find(test_sock_list[0].first) != realserver_map.end());
5225     BOOST_CHECK(realserver_map.find(test_sock_list[1].first) != realserver_map.end());
5226     BOOST_CHECK(realserver_map.find(test_sock_list[2].first) != realserver_map.end());
5227     test_obj.test_call();
5228     BOOST_CHECK(realserver_map.find(test_sock_list[0].first) != realserver_map.end());
5229     BOOST_CHECK(realserver_map.find(test_sock_list[1].first) == realserver_map.end());
5230     BOOST_CHECK(realserver_map.find(test_sock_list[2].first) != realserver_map.end());
5231     //erase 0
5232     test_message.set_endpoint(test_sock_list[0].first);
5233     test_obj.set_up_thread_message_data(test_message);
5234     BOOST_CHECK(realserver_map.find(test_sock_list[0].first) != realserver_map.end());
5235     BOOST_CHECK(realserver_map.find(test_sock_list[1].first) == realserver_map.end());
5236     BOOST_CHECK(realserver_map.find(test_sock_list[2].first) != realserver_map.end());
5237     test_obj.test_call();
5238     BOOST_CHECK(realserver_map.find(test_sock_list[0].first) == realserver_map.end());
5239     BOOST_CHECK(realserver_map.find(test_sock_list[1].first) == realserver_map.end());
5240     BOOST_CHECK(realserver_map.find(test_sock_list[2].first) != realserver_map.end());
5241     //erase 2
5242     test_message.set_endpoint(test_sock_list[2].first);
5243     test_obj.set_up_thread_message_data(test_message);
5244     BOOST_CHECK(realserver_map.find(test_sock_list[0].first) == realserver_map.end());
5245     BOOST_CHECK(realserver_map.find(test_sock_list[1].first) == realserver_map.end());
5246     BOOST_CHECK(realserver_map.find(test_sock_list[2].first) != realserver_map.end());
5247     test_obj.test_call();
5248     BOOST_CHECK(realserver_map.find(test_sock_list[0].first) == realserver_map.end());
5249     BOOST_CHECK(realserver_map.find(test_sock_list[1].first) == realserver_map.end());
5250     BOOST_CHECK(realserver_map.find(test_sock_list[2].first) == realserver_map.end());
5251     BOOST_CHECK(realserver_map.empty());
5252         
5253     // unit_test [5] up_thread_realserver_disconnect_event not fond function error check
5254     std::cerr << "[5] up_thread_realserver_disconnect_event not fond function error check" << std::endl;
5255     test_obj.up_thread_function_array_clear();
5256     proto_test.handle_realserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
5257     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
5258     l7vs::Logger::putLogError_id = 0;
5259     test_obj.test_call();
5260     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
5261     BOOST_CHECK_EQUAL(46,l7vs::Logger::putLogError_id);
5262     std::cerr << l7vs::Logger::putLogError_message << std::endl;
5263     
5264     // unit_test [6] up_thread_realserver_disconnect_event returnd illegal EVENT_TAG error check
5265     std::cerr << "[6] up_thread_realserver_disconnect_event returnd illegal EVENT_TAG error check" << std::endl;
5266     test_obj.up_thread_module_event_map_clear();
5267     proto_test.handle_realserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
5268     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
5269     l7vs::Logger::putLogError_id = 0;
5270     test_obj.test_call();
5271     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
5272     BOOST_CHECK_EQUAL(45,l7vs::Logger::putLogError_id);
5273     std::cerr << l7vs::Logger::putLogError_message << std::endl;
5274     
5275 //    mutex_lock_test test_lock_obj(vs,io);
5276     mutex_lock_test test_lock_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
5277
5278     test_lock_obj.set_up_thread_realserver_disconnect_event_test();
5279     test_lock_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);    
5280     
5281     test_lock_obj.test_thread_wait.lock();
5282     test_lock_obj.befor_thread_id = proc_id;
5283     test_lock_obj.after_thread_id = proc_id;
5284     test_lock_obj.mutex_lock();
5285     
5286     boost::thread test_thread(boost::bind(&mutex_lock_test::test_run,&test_lock_obj));
5287     
5288     BOOST_CHECK(test_lock_obj.befor_thread_id == proc_id);
5289     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
5290     
5291     boost::thread::id test_id = test_thread.get_id();
5292     
5293     BOOST_CHECK(test_id != proc_id);
5294     
5295     // test start
5296     test_lock_obj.test_thread_wait.unlock();
5297     sleep(1);
5298     
5299     // unit_test [7] up_thread_realserver_disconnect_event thread block test (mutex lock)
5300     std::cerr << "[7] up_thread_realserver_disconnect_event thread block test (mutex lock)" << std::endl;
5301     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
5302     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
5303     
5304     test_lock_obj.mutex_unlock();
5305     sleep(1);
5306     
5307     // unit_test [8] up_thread_realserver_disconnect_event thread run test (mutex unlock)
5308     std::cerr << "[8] up_thread_realserver_disconnect_event thread run test (mutex unlock)" << std::endl;
5309     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
5310     BOOST_CHECK(test_lock_obj.after_thread_id == test_id);
5311     
5312     BOOST_MESSAGE( "----- up_thread_realserver_disconnect_event test end -----" );
5313     
5314 }
5315
5316
5317 // down_thread_realserver_disconnetc_event test
5318 // down_thread_realserver_disconnetc_event test class
5319 class down_thread_realserver_disconnect_event_test_class : public module_event_map_test_base_class{
5320     public:
5321 //        down_thread_realserver_disconnect_event_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : module_event_map_test_base_class(vs,session_io){
5322 //        };
5323        down_thread_realserver_disconnect_event_test_class(
5324                                 l7vs::virtualservice_tcp& vs,
5325                                 boost::asio::io_service& session_io,
5326                                 l7vs::tcp_socket_option_info& set_socket_option,
5327                                 boost::asio::ip::tcp::endpoint listen_endpoint,
5328                                 bool ssl_mode,
5329                                 boost::asio::ssl::context& set_ssl_context,
5330                                 bool set_ssl_cache_flag,
5331                                 int set_ssl_handshake_time_out,
5332                                 l7vs::logger_implement_access* set_access_logger) : module_event_map_test_base_class(   vs,
5333                                                                                                    session_io,
5334                                                                                                    set_socket_option,
5335                                                                                                    listen_endpoint,
5336                                                                                                    ssl_mode,
5337                                                                                                    set_ssl_context,
5338                                                                                                    set_ssl_cache_flag,
5339                                                                                                    set_ssl_handshake_time_out,
5340                                                                                                    set_access_logger){};
5341
5342         
5343         ~down_thread_realserver_disconnect_event_test_class(){};
5344         
5345         void test_call(){
5346             l7vs::tcp_session::down_thread_realserver_disconnect_event(LOCAL_PROC);
5347         };
5348         
5349         std::list<socket_element>& get_realserver_socket_list(){
5350             return down_thread_receive_realserver_socket_list;
5351         };
5352 };
5353
5354 void down_thread_realserver_disconnect_event_test(){
5355     
5356     BOOST_MESSAGE( "----- down_thread_realserver_disconnect_event test start -----" );
5357     
5358     boost::asio::io_service io;
5359     l7vs::virtualservice_tcp vs;    
5360     l7vs::tcp_socket_option_info set_option;
5361     //! TCP_NODELAY   (false:not set,true:set option)
5362     set_option.nodelay_opt = false;
5363     //! TCP_NODELAY option value  (false:off,true:on)
5364     set_option.nodelay_val = false;
5365     //! TCP_CORK      (false:not set,true:set option)
5366     set_option.cork_opt = false;
5367     //! TCP_CORK option value     (false:off,true:on)
5368     set_option.cork_val = false;
5369     //! TCP_QUICKACK  (false:not set,true:set option)
5370     set_option.quickack_opt = false;
5371     //! TCP_QUICKACK option value (false:off,true:on)
5372     set_option.quickack_val = false;
5373     //
5374     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
5375     bool set_mode(false);
5376     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
5377     bool set_ssl_cache_flag(false);
5378     int set_ssl_handshake_time_out = 0;
5379     //std::string access_log_file_name = "test";
5380     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
5381 //    down_thread_realserver_disconnect_event_test_class test_obj(vs,io);
5382     down_thread_realserver_disconnect_event_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
5383
5384
5385
5386
5387
5388     std::string test_protocol_name("test protocol");
5389     l7vs::test_protocol_module proto_test(test_protocol_name);
5390
5391     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
5392     
5393     l7vs::protocol_module_base::EVENT_TAG chek_event[7];
5394     chek_event[0] = l7vs::protocol_module_base::CLIENT_DISCONNECT;
5395     chek_event[1] = l7vs::protocol_module_base::CLIENT_CONNECTION_CHECK;
5396     chek_event[2] = l7vs::protocol_module_base::REALSERVER_RECV;
5397     chek_event[3] = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
5398     chek_event[4] = l7vs::protocol_module_base::SORRYSERVER_RECV;
5399     chek_event[5] = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
5400     chek_event[6] = l7vs::protocol_module_base::FINALIZE;
5401     
5402     // unit_test [1] down_thread_realserver_disconnect_event down_thread_next_call_function update check
5403     std::cerr << "[1] down_thread_realserver_disconnect_event down_thread_next_call_function update check" << std::endl;
5404     for(int i = 0; i < 7;i++){
5405         proto_test.handle_realserver_disconnect_res_tag = chek_event[i];
5406         test_obj.test_call();
5407         BOOST_CHECK(test_obj.chk_down_thread_next_call_function(chek_event[i]));
5408     }
5409     
5410     // module parameter check
5411     boost::thread::id def_id;
5412     boost::thread::id proc_id = boost::this_thread::get_id();
5413     boost::asio::ip::tcp::endpoint test_end(boost::asio::ip::address::from_string("100.102.103.104"), 7777);
5414     l7vs::tcp_data test_message;
5415     test_message.set_endpoint(test_end);
5416     test_obj.set_down_thread_id(proc_id);
5417     test_obj.set_down_thread_message_data(test_message);
5418     proto_test.handle_realserver_disconnect_thread_id = def_id;
5419     proto_test.handle_realserver_disconnect_rs_endpoint = boost::asio::ip::tcp::endpoint();
5420     proto_test.handle_realserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
5421     BOOST_CHECK(proto_test.handle_realserver_disconnect_thread_id != proc_id);
5422     BOOST_CHECK(proto_test.handle_realserver_disconnect_rs_endpoint != test_end);
5423     test_obj.test_call();
5424     // unit_test [2] down_thread_realserver_disconnect_event module parameter check thread id
5425     std::cerr << "[2] down_thread_realserver_disconnect_event module parameter check thread id" << std::endl;
5426     BOOST_CHECK(proto_test.handle_realserver_disconnect_thread_id == proc_id);
5427     
5428     // unit_test [3] down_thread_realserver_disconnect_event module parameter check endpoint
5429     std::cerr << "[3] down_thread_realserver_disconnect_event module parameter check endpoint" << std::endl;
5430     BOOST_CHECK(proto_test.handle_realserver_disconnect_rs_endpoint == test_end);
5431     
5432     
5433     // unit_test [4] down_thread_realserver_disconnect_event realserver map erase check
5434     std::cerr << "[4] down_thread_realserver_disconnect_event  realserver map erase check" << std::endl;
5435     
5436     std::list< std::pair< boost::asio::ip::tcp::endpoint , boost::shared_ptr< l7vs::tcp_socket > > >& realserver_list = test_obj.get_realserver_socket_list();
5437     boost::shared_ptr< l7vs::tcp_socket > test_tcp_sock0(new l7vs::tcp_socket(io));
5438     boost::shared_ptr< l7vs::tcp_socket > test_tcp_sock1(new l7vs::tcp_socket(io));
5439     boost::shared_ptr< l7vs::tcp_socket > test_tcp_sock2(new l7vs::tcp_socket(io));
5440     std::pair< boost::asio::ip::tcp::endpoint , boost::shared_ptr< l7vs::tcp_socket > > test_sock_list[3];
5441     test_sock_list[0].first = boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("100.100.100.100"), 0);
5442     test_sock_list[0].second = test_tcp_sock0;
5443     test_sock_list[1].first = boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("101.101.101.101"), 1);
5444     test_sock_list[1].second = test_tcp_sock1;
5445     test_sock_list[2].first = boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("102.102.102.102"), 2);
5446     test_sock_list[2].second = test_tcp_sock2;
5447     for(int i = 0;i < 3;i++){
5448         realserver_list.push_back(test_sock_list[i]);
5449     }
5450     proto_test.handle_realserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
5451     std::list< std::pair< boost::asio::ip::tcp::endpoint , boost::shared_ptr< l7vs::tcp_socket > > >::iterator ret_ite; 
5452     
5453     //erase 1
5454     test_message.set_endpoint(test_sock_list[1].first);
5455     test_obj.set_down_thread_message_data(test_message);    
5456     ret_ite = realserver_list.begin();
5457     BOOST_CHECK(ret_ite->first == test_sock_list[0].first);
5458     ret_ite++;
5459     BOOST_CHECK(ret_ite->first == test_sock_list[1].first);
5460     ret_ite++;
5461     BOOST_CHECK(ret_ite->first == test_sock_list[2].first);
5462     ret_ite++;
5463     BOOST_CHECK(ret_ite == realserver_list.end());
5464     test_obj.test_call();
5465     ret_ite = realserver_list.begin();
5466     BOOST_CHECK(ret_ite->first == test_sock_list[0].first);
5467     ret_ite++;
5468     BOOST_CHECK(ret_ite->first == test_sock_list[2].first);
5469     ret_ite++;
5470     BOOST_CHECK(ret_ite == realserver_list.end());
5471     
5472     //erase 0
5473     test_message.set_endpoint(test_sock_list[0].first);
5474     test_obj.set_down_thread_message_data(test_message);    
5475     ret_ite = realserver_list.begin();
5476     BOOST_CHECK(ret_ite->first == test_sock_list[0].first);
5477     ret_ite++;
5478     BOOST_CHECK(ret_ite->first == test_sock_list[2].first);
5479     ret_ite++;
5480     BOOST_CHECK(ret_ite == realserver_list.end());
5481     test_obj.test_call();
5482     ret_ite = realserver_list.begin();
5483     BOOST_CHECK(ret_ite->first == test_sock_list[2].first);
5484     ret_ite++;
5485     BOOST_CHECK(ret_ite == realserver_list.end());
5486     
5487     //erase 2
5488     test_message.set_endpoint(test_sock_list[2].first);
5489     test_obj.set_down_thread_message_data(test_message);    
5490     ret_ite = realserver_list.begin();
5491     BOOST_CHECK(ret_ite->first == test_sock_list[2].first);
5492     ret_ite++;
5493     BOOST_CHECK(ret_ite == realserver_list.end());
5494     test_obj.test_call();
5495     ret_ite = realserver_list.begin();
5496     BOOST_CHECK(ret_ite == realserver_list.end());
5497     BOOST_CHECK(realserver_list.empty());
5498
5499     // unit_test [5] down_thread_realserver_disconnect_event not fond function error check
5500     std::cerr << "[5] down_thread_realserver_disconnect_event not fond function error check" << std::endl;
5501     test_obj.down_thread_function_array_clear();
5502     proto_test.handle_realserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
5503     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
5504     l7vs::Logger::putLogError_id = 0;
5505     test_obj.test_call();
5506     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
5507     BOOST_CHECK_EQUAL(75,l7vs::Logger::putLogError_id);
5508     std::cerr << l7vs::Logger::putLogError_message << std::endl;
5509     
5510     // unit_test [6] down_thread_realserver_disconnect_event returnd illegal EVENT_TAG error check
5511     std::cerr << "[6] down_thread_realserver_disconnect_event returnd illegal EVENT_TAG error check" << std::endl;
5512     test_obj.down_thread_module_event_map_clear();
5513     proto_test.handle_realserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
5514     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
5515     l7vs::Logger::putLogError_id = 0;
5516     test_obj.test_call();
5517     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
5518     BOOST_CHECK_EQUAL(74,l7vs::Logger::putLogError_id);
5519     std::cerr << l7vs::Logger::putLogError_message << std::endl;
5520     
5521 //    mutex_lock_test test_lock_obj(vs,io);
5522     mutex_lock_test test_lock_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
5523     test_lock_obj.set_down_thread_realserver_disconnect_event_test();
5524     test_lock_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
5525     
5526     test_lock_obj.test_thread_wait.lock();
5527     test_lock_obj.befor_thread_id = proc_id;
5528     test_lock_obj.after_thread_id = proc_id;
5529     test_lock_obj.mutex_lock();
5530     
5531     boost::thread test_thread(boost::bind(&mutex_lock_test::test_run,&test_lock_obj));
5532     
5533     BOOST_CHECK(test_lock_obj.befor_thread_id == proc_id);
5534     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
5535     
5536     boost::thread::id test_id = test_thread.get_id();
5537     
5538     BOOST_CHECK(test_id != proc_id);
5539     
5540     // test start
5541     test_lock_obj.test_thread_wait.unlock();
5542     sleep(1);
5543     
5544     // unit_test [7] down_thread_realserver_disconnect_event thread block test (mutex lock)
5545     std::cerr << "[7] down_thread_realserver_disconnect_event thread block test (mutex lock)" << std::endl;
5546     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
5547     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
5548     
5549     test_lock_obj.mutex_unlock();
5550     sleep(1);
5551     
5552     // unit_test [8] down_thread_realserver_disconnect_event thread run test (mutex unlock)
5553     std::cerr << "[8] down_thread_realserver_disconnect_event thread run test (mutex unlock)" << std::endl;
5554     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
5555     BOOST_CHECK(test_lock_obj.after_thread_id == test_id);
5556     
5557     BOOST_MESSAGE( "----- down_thread_realserver_disconnect_event test end -----" );
5558 }
5559
5560 // up_thread_sorryserver_disconnect_event test
5561 // up_thread_sorryserver_disconnect_event test class
5562 class up_thread_sorryserver_disconnect_event_test_class : public module_event_map_test_base_class{
5563     public:
5564 //        up_thread_sorryserver_disconnect_event_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : module_event_map_test_base_class(vs,session_io){
5565 //        };
5566        up_thread_sorryserver_disconnect_event_test_class(
5567                                 l7vs::virtualservice_tcp& vs,
5568                                 boost::asio::io_service& session_io,
5569                                 l7vs::tcp_socket_option_info& set_socket_option,
5570                                 boost::asio::ip::tcp::endpoint listen_endpoint,
5571                                 bool ssl_mode,
5572                                 boost::asio::ssl::context& set_ssl_context,
5573                                 bool set_ssl_cache_flag,
5574                                 int set_ssl_handshake_time_out,
5575                                 l7vs::logger_implement_access* set_access_logger) : module_event_map_test_base_class(   vs,
5576                                                                                                    session_io,
5577                                                                                                    set_socket_option,
5578                                                                                                    listen_endpoint,
5579                                                                                                    ssl_mode,
5580                                                                                                    set_ssl_context,
5581                                                                                                    set_ssl_cache_flag,
5582                                                                                                    set_ssl_handshake_time_out,
5583                                                                                                    set_access_logger){};
5584
5585         
5586         ~up_thread_sorryserver_disconnect_event_test_class(){};
5587         
5588         void test_call(){
5589             l7vs::tcp_session::up_thread_sorryserver_disconnect_event(LOCAL_PROC);
5590         };
5591 };
5592
5593 void up_thread_sorryserver_disconnect_event_test(){
5594     
5595     BOOST_MESSAGE( "----- up_thread_sorryserver_disconnect_event_test test start -----" );
5596     
5597     boost::asio::io_service io;
5598     l7vs::virtualservice_tcp vs;
5599     l7vs::tcp_socket_option_info set_option;
5600     //! TCP_NODELAY   (false:not set,true:set option)
5601     set_option.nodelay_opt = false;
5602     //! TCP_NODELAY option value  (false:off,true:on)
5603     set_option.nodelay_val = false;
5604     //! TCP_CORK      (false:not set,true:set option)
5605     set_option.cork_opt = false;
5606     //! TCP_CORK option value     (false:off,true:on)
5607     set_option.cork_val = false;
5608     //! TCP_QUICKACK  (false:not set,true:set option)
5609     set_option.quickack_opt = false;
5610     //! TCP_QUICKACK option value (false:off,true:on)
5611     set_option.quickack_val = false;
5612     //
5613     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
5614     bool set_mode(false);
5615     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
5616     bool set_ssl_cache_flag(false);
5617     int set_ssl_handshake_time_out = 0;
5618     //std::string access_log_file_name = "test";
5619     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
5620
5621 //    up_thread_sorryserver_disconnect_event_test_class test_obj(vs,io);
5622     up_thread_sorryserver_disconnect_event_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
5623
5624
5625
5626
5627     
5628     std::string test_protocol_name("test protocol");
5629     l7vs::test_protocol_module proto_test(test_protocol_name);
5630
5631     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
5632     
5633     l7vs::protocol_module_base::EVENT_TAG chek_event[13];
5634     chek_event[0] = l7vs::protocol_module_base::ACCEPT;
5635     chek_event[1] = l7vs::protocol_module_base::CLIENT_DISCONNECT;
5636     chek_event[2] = l7vs::protocol_module_base::CLIENT_RECV;
5637     chek_event[3] = l7vs::protocol_module_base::CLIENT_RESPONSE_SEND;
5638     chek_event[4] = l7vs::protocol_module_base::REALSERVER_SELECT;
5639     chek_event[5] = l7vs::protocol_module_base::REALSERVER_CONNECT;
5640     chek_event[6] = l7vs::protocol_module_base::REALSERVER_SEND;
5641     chek_event[7] = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
5642     chek_event[8] = l7vs::protocol_module_base::SORRYSERVER_SELECT;
5643     chek_event[9] = l7vs::protocol_module_base::SORRYSERVER_CONNECT;
5644     chek_event[10] = l7vs::protocol_module_base::SORRYSERVER_SEND;
5645     chek_event[11] = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
5646     chek_event[12] = l7vs::protocol_module_base::FINALIZE;
5647     
5648     // unit_test [1] up_thread_sorryserver_disconnect_event up_thread_next_call_function update check
5649     std::cerr << "[1] up_thread_sorryserver_disconnect_event up_thread_next_call_function update check" << std::endl;
5650     for(int i = 0; i < 13;i++){
5651         proto_test.handle_sorryserver_disconnect_res_tag = chek_event[i];
5652         test_obj.test_call();
5653         BOOST_CHECK(test_obj.chk_up_thread_next_call_function(chek_event[i]));
5654     }
5655     
5656     // module parameter check
5657     boost::thread::id def_id;
5658     boost::thread::id proc_id = boost::this_thread::get_id();
5659     boost::asio::ip::tcp::endpoint test_end(boost::asio::ip::address::from_string("100.102.103.104"), 7777);
5660     l7vs::tcp_data test_message;
5661     test_message.set_endpoint(test_end);
5662     test_obj.set_up_thread_id(proc_id);
5663     test_obj.set_up_thread_message_data(test_message);
5664     proto_test.handle_sorryserver_disconnect_thread_id = def_id;
5665     proto_test.handle_sorryserver_disconnect_rs_endpoint = boost::asio::ip::tcp::endpoint();
5666     proto_test.handle_sorryserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
5667     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_thread_id != proc_id);
5668     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_rs_endpoint != test_end);
5669     test_obj.test_call();
5670     // unit_test [2] up_thread_sorryserver_disconnect_event module parameter check thread id
5671     std::cerr << "[2] up_thread_sorryserver_disconnect_event module parameter check thread id" << std::endl;
5672     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_thread_id == proc_id);
5673     
5674     // unit_test [3] up_thread_sorryserver_disconnect_event module parameter check endpoint
5675     std::cerr << "[3] up_thread_sorryserver_disconnect_event module parameter check endpoint" << std::endl;
5676     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_rs_endpoint == test_end);
5677     
5678     // unit_test [4] up_thread_sorryserver_disconnect_event not fond function error check
5679     std::cerr << "[4] up_thread_sorryserver_disconnect_event not fond function error check" << std::endl;
5680     test_obj.up_thread_function_array_clear();
5681     proto_test.handle_sorryserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
5682     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
5683     l7vs::Logger::putLogError_id = 0;
5684     test_obj.test_call();
5685     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
5686     BOOST_CHECK_EQUAL(65,l7vs::Logger::putLogError_id);
5687     std::cerr << l7vs::Logger::putLogError_message << std::endl;
5688     
5689     // unit_test [5] up_thread_sorryserver_disconnect_event returnd illegal EVENT_TAG error check
5690     std::cerr << "[5] up_thread_sorryserver_disconnect_event returnd illegal EVENT_TAG error check" << std::endl;
5691     test_obj.up_thread_module_event_map_clear();
5692     proto_test.handle_sorryserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
5693     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
5694     l7vs::Logger::putLogError_id = 0;
5695     test_obj.test_call();
5696     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
5697     BOOST_CHECK_EQUAL(64,l7vs::Logger::putLogError_id);
5698     std::cerr << l7vs::Logger::putLogError_message << std::endl;
5699     
5700 //    mutex_lock_test test_lock_obj(vs,io);
5701     mutex_lock_test test_lock_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
5702     test_lock_obj.set_up_thread_sorryserver_disconnect_event_test();
5703     test_lock_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
5704     
5705     test_lock_obj.test_thread_wait.lock();
5706     test_lock_obj.befor_thread_id = proc_id;
5707     test_lock_obj.after_thread_id = proc_id;
5708     test_lock_obj.mutex_lock();
5709     
5710     boost::thread test_thread(boost::bind(&mutex_lock_test::test_run,&test_lock_obj));
5711     
5712     BOOST_CHECK(test_lock_obj.befor_thread_id == proc_id);
5713     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
5714     
5715     boost::thread::id test_id = test_thread.get_id();
5716     
5717     BOOST_CHECK(test_id != proc_id);
5718     
5719     // test start
5720     test_lock_obj.test_thread_wait.unlock();
5721     sleep(1);
5722     
5723     // unit_test [6] up_thread_sorryserver_disconnect_event thread block test (mutex lock)
5724     std::cerr << "[6] up_thread_sorryserver_disconnect_event thread block test (mutex lock)" << std::endl;
5725     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
5726     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
5727     
5728     test_lock_obj.mutex_unlock();
5729     sleep(1);
5730     
5731     // unit_test [7] up_thread_sorryserver_disconnect_event thread run test (mutex unlock)
5732     std::cerr << "[7] up_thread_sorryserver_disconnect_event thread run test (mutex unlock)" << std::endl;
5733     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
5734     BOOST_CHECK(test_lock_obj.after_thread_id == test_id);
5735     
5736     BOOST_MESSAGE( "----- up_thread_sorryserver_disconnect_event_test test end -----" );
5737 }
5738
5739 // up_thread_sorryserver_mod_disconnect test
5740 // up_thread_sorryserver_mod_disconnect test class
5741 class up_thread_sorryserver_mod_disconnect_test_class : public module_event_map_test_base_class{
5742     public:
5743 //        up_thread_sorryserver_mod_disconnect_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : module_event_map_test_base_class(vs,session_io){
5744 //        };
5745        up_thread_sorryserver_mod_disconnect_test_class(
5746                                 l7vs::virtualservice_tcp& vs,
5747                                 boost::asio::io_service& session_io,
5748                                 l7vs::tcp_socket_option_info& set_socket_option,
5749                                 boost::asio::ip::tcp::endpoint listen_endpoint,
5750                                 bool ssl_mode,
5751                                 boost::asio::ssl::context& set_ssl_context,
5752                                 bool set_ssl_cache_flag,
5753                                 int set_ssl_handshake_time_out,
5754                                 l7vs::logger_implement_access* set_access_logger) : module_event_map_test_base_class(   vs,
5755                                                                                                    session_io,
5756                                                                                                    set_socket_option,
5757                                                                                                    listen_endpoint,
5758                                                                                                    ssl_mode,
5759                                                                                                    set_ssl_context,
5760                                                                                                    set_ssl_cache_flag,
5761                                                                                                    set_ssl_handshake_time_out,
5762                                                                                                    set_access_logger){};
5763
5764         ~up_thread_sorryserver_mod_disconnect_test_class(){};
5765         
5766         void test_call(){
5767             l7vs::tcp_session::up_thread_sorryserver_mod_disconnect(LOCAL_PROC);
5768         };
5769         
5770         boost::shared_ptr< l7vs::tcp_socket > get_sorry_socket(){
5771             return sorryserver_socket.second;
5772         };
5773
5774         boost::asio::ip::tcp::endpoint& get_sorry_endpoint(){
5775             return sorryserver_socket.first;
5776         }
5777         
5778 };
5779
5780 void up_thread_sorryserver_mod_disconnect_test(){
5781     
5782     BOOST_MESSAGE( "----- up_thread_sorryserver_mod_disconnect test start -----" );
5783     
5784     boost::asio::io_service io;
5785     l7vs::virtualservice_tcp vs;
5786     l7vs::tcp_socket_option_info set_option;
5787     //! TCP_NODELAY   (false:not set,true:set option)
5788     set_option.nodelay_opt = false;
5789     //! TCP_NODELAY option value  (false:off,true:on)
5790     set_option.nodelay_val = false;
5791     //! TCP_CORK      (false:not set,true:set option)
5792     set_option.cork_opt = false;
5793     //! TCP_CORK option value     (false:off,true:on)
5794     set_option.cork_val = false;
5795     //! TCP_QUICKACK  (false:not set,true:set option)
5796     set_option.quickack_opt = false;
5797     //! TCP_QUICKACK option value (false:off,true:on)
5798     set_option.quickack_val = false;
5799     //
5800     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
5801     bool set_mode(false);
5802     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
5803     bool set_ssl_cache_flag(false);
5804     int set_ssl_handshake_time_out = 0;
5805     //std::string access_log_file_name = "test";
5806     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
5807
5808 //    up_thread_sorryserver_mod_disconnect_test_class test_obj(vs,io);
5809     up_thread_sorryserver_mod_disconnect_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
5810
5811
5812     std::string test_protocol_name("test protocol");
5813     l7vs::test_protocol_module proto_test(test_protocol_name);
5814
5815     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
5816     
5817     l7vs::protocol_module_base::EVENT_TAG chek_event[13];
5818     chek_event[0] = l7vs::protocol_module_base::ACCEPT;
5819     chek_event[1] = l7vs::protocol_module_base::CLIENT_DISCONNECT;
5820     chek_event[2] = l7vs::protocol_module_base::CLIENT_RECV;
5821     chek_event[3] = l7vs::protocol_module_base::CLIENT_RESPONSE_SEND;
5822     chek_event[4] = l7vs::protocol_module_base::REALSERVER_SELECT;
5823     chek_event[5] = l7vs::protocol_module_base::REALSERVER_CONNECT;
5824     chek_event[6] = l7vs::protocol_module_base::REALSERVER_SEND;
5825     chek_event[7] = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
5826     chek_event[8] = l7vs::protocol_module_base::SORRYSERVER_SELECT;
5827     chek_event[9] = l7vs::protocol_module_base::SORRYSERVER_CONNECT;
5828     chek_event[10] = l7vs::protocol_module_base::SORRYSERVER_SEND;
5829     chek_event[11] = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
5830     chek_event[12] = l7vs::protocol_module_base::FINALIZE;
5831     
5832     // unit_test [1] up_thread_sorryserver_mod_disconnect up_thread_next_call_function update check
5833     std::cerr << "[1] up_thread_sorryserver_mod_disconnect up_thread_next_call_function update check" << std::endl;
5834     for(int i = 0; i < 13;i++){
5835         proto_test.handle_sorryserver_disconnect_res_tag = chek_event[i];
5836         test_obj.test_call();
5837         BOOST_CHECK(test_obj.chk_up_thread_next_call_function(chek_event[i]));
5838     }
5839     
5840     // module parameter check
5841     boost::thread::id def_id;
5842     boost::thread::id proc_id = boost::this_thread::get_id();
5843     boost::asio::ip::tcp::endpoint test_end(boost::asio::ip::address::from_string("100.102.103.104"), 7777);
5844     test_obj.get_sorry_endpoint() = test_end;
5845     test_obj.set_up_thread_id(proc_id);
5846     proto_test.handle_sorryserver_disconnect_thread_id = def_id;
5847     proto_test.handle_sorryserver_disconnect_rs_endpoint = boost::asio::ip::tcp::endpoint();
5848     proto_test.handle_sorryserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
5849     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_thread_id != proc_id);
5850     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_rs_endpoint != test_end);
5851     test_obj.get_sorry_socket()->close_call_check = false;
5852     test_obj.get_sorry_socket()->close_res = true;
5853
5854     test_obj.test_call();
5855
5856     // unit_test [2] up_thread_sorryserver_mod_disconnect socket close check
5857     std::cerr << "[2] up_thread_sorryserver_mod_disconnect socket close check" << std::endl;
5858     BOOST_CHECK(test_obj.get_sorry_socket()->close_call_check);
5859
5860     // unit_test [3] up_thread_sorryserver_mod_disconnect endpoint not update check
5861     std::cerr << "[3] up_thread_sorryserver_mod_disconnect endpoint not update  check" << std::endl;
5862     BOOST_CHECK(test_obj.get_sorry_endpoint() == test_end);
5863
5864     // unit_test [4] up_thread_sorryserver_mod_disconnect module parameter check thread id
5865     std::cerr << "[4] up_thread_sorryserver_mod_disconnect module parameter check thread id" << std::endl;
5866     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_thread_id == proc_id);
5867     
5868     // unit_test [5] up_thread_sorryserver_mod_disconnect module parameter check endpoint
5869     std::cerr << "[5] up_thread_sorryserver_mod_disconnect module parameter check endpoint" << std::endl;
5870     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_rs_endpoint == test_end);
5871     
5872
5873     proto_test.handle_sorryserver_disconnect_thread_id = def_id;
5874     proto_test.handle_sorryserver_disconnect_rs_endpoint = boost::asio::ip::tcp::endpoint();
5875     proto_test.handle_sorryserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
5876     test_obj.get_sorry_socket()->close_call_check = false;
5877     test_obj.get_sorry_socket()->close_res = false;
5878
5879     test_obj.test_call();
5880
5881     // unit_test [6] up_thread_sorryserver_mod_disconnect socket close check
5882     std::cerr << "[6] up_thread_sorryserver_mod_disconnect socket close check" << std::endl;
5883     BOOST_CHECK(test_obj.get_sorry_socket()->close_call_check);
5884
5885     // unit_test [7] up_thread_sorryserver_mod_disconnect endpoint not update check
5886     std::cerr << "[7] up_thread_sorryserver_mod_disconnect endpoint not update  check" << std::endl;
5887     BOOST_CHECK(test_obj.get_sorry_endpoint() == boost::asio::ip::tcp::endpoint());
5888
5889     // unit_test [8] up_thread_sorryserver_mod_disconnect module parameter check thread id
5890     std::cerr << "[8] up_thread_sorryserver_mod_disconnect module parameter check thread id" << std::endl;
5891     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_thread_id == proc_id);
5892     
5893     // unit_test [9] up_thread_sorryserver_mod_disconnect module parameter check endpoint
5894     std::cerr << "[9] up_thread_sorryserver_mod_disconnect module parameter check endpoint" << std::endl;
5895     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_rs_endpoint == test_end);
5896     
5897     proto_test.handle_sorryserver_disconnect_thread_id = def_id;
5898     proto_test.handle_sorryserver_disconnect_rs_endpoint = boost::asio::ip::tcp::endpoint();
5899     proto_test.handle_sorryserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
5900     test_obj.get_sorry_socket()->close_call_check = false;
5901     test_obj.get_sorry_socket()->close_res = false;
5902
5903     test_obj.test_call();
5904
5905     // unit_test [10] up_thread_sorryserver_mod_disconnect socket close check
5906     std::cerr << "[10] up_thread_sorryserver_mod_disconnect socket close check" << std::endl;
5907     BOOST_CHECK(test_obj.get_sorry_socket()->close_call_check);
5908
5909     // unit_test [11] up_thread_sorryserver_mod_disconnect endpoint not update check
5910     std::cerr << "[11] up_thread_sorryserver_mod_disconnect endpoint not update  check" << std::endl;
5911     BOOST_CHECK(test_obj.get_sorry_endpoint() == boost::asio::ip::tcp::endpoint());
5912
5913     // unit_test [12] up_thread_sorryserver_mod_disconnect module parameter check thread id
5914     std::cerr << "[12] up_thread_sorryserver_mod_disconnect module parameter check thread id" << std::endl;
5915     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_thread_id == proc_id);
5916     
5917     // unit_test [13] up_thread_sorryserver_mod_disconnect module parameter check endpoint
5918     std::cerr << "[13] up_thread_sorryserver_mod_disconnect module parameter check endpoint" << std::endl;
5919     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_rs_endpoint == boost::asio::ip::tcp::endpoint());
5920     
5921     // unit_test [14] up_thread_sorryserver_mod_disconnect not fond function error check
5922     std::cerr << "[14] up_thread_sorryserver_mod_disconnect not fond function error check" << std::endl;
5923     test_obj.up_thread_function_array_clear();
5924     proto_test.handle_sorryserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
5925     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
5926     l7vs::Logger::putLogError_id = 0;
5927     test_obj.test_call();
5928     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
5929     BOOST_CHECK_EQUAL(63,l7vs::Logger::putLogError_id);
5930     std::cerr << l7vs::Logger::putLogError_message << std::endl;
5931     
5932     // unit_test [15] up_thread_sorryserver_mod_disconnect returnd illegal EVENT_TAG error check
5933     std::cerr << "[15] up_thread_sorryserver_mod_disconnect returnd illegal EVENT_TAG error check" << std::endl;
5934     test_obj.up_thread_module_event_map_clear();
5935     proto_test.handle_sorryserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
5936     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
5937     l7vs::Logger::putLogError_id = 0;
5938     test_obj.test_call();
5939     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
5940     BOOST_CHECK_EQUAL(62,l7vs::Logger::putLogError_id);
5941     std::cerr << l7vs::Logger::putLogError_message << std::endl;
5942     
5943 //    mutex_lock_test test_lock_obj(vs,io);
5944     mutex_lock_test test_lock_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
5945     test_lock_obj.set_up_thread_sorryserver_disconnect_event_test();
5946     test_lock_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
5947     
5948     test_lock_obj.test_thread_wait.lock();
5949     test_lock_obj.befor_thread_id = proc_id;
5950     test_lock_obj.after_thread_id = proc_id;
5951     test_lock_obj.mutex_lock();
5952     
5953     boost::thread test_thread(boost::bind(&mutex_lock_test::test_run,&test_lock_obj));
5954     
5955     BOOST_CHECK(test_lock_obj.befor_thread_id == proc_id);
5956     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
5957     
5958     boost::thread::id test_id = test_thread.get_id();
5959     
5960     BOOST_CHECK(test_id != proc_id);
5961     
5962     // test start
5963     test_lock_obj.test_thread_wait.unlock();
5964     sleep(1);
5965     
5966     // unit_test [16] up_thread_sorryserver_mod_disconnect thread block test (mutex lock)
5967     std::cerr << "[16] up_thread_sorryserver_mod_disconnect thread block test (mutex lock)" << std::endl;
5968     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
5969     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
5970     
5971     test_lock_obj.mutex_unlock();
5972     sleep(1);
5973     
5974     // unit_test [17] up_thread_sorryserver_mod_disconnect thread run test (mutex unlock)
5975     std::cerr << "[17] up_thread_sorryserver_mod_disconnect thread run test (mutex unlock)" << std::endl;
5976     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
5977     BOOST_CHECK(test_lock_obj.after_thread_id == test_id);
5978     
5979     BOOST_MESSAGE( "----- up_thread_sorryserver_mod_disconnect test end -----" );
5980 }
5981
5982 // down_thread_sorryserver_mod_disconnect test
5983 // down_thread_sorryserver_mod_disconnect test class
5984 class down_thread_sorryserver_mod_disconnect_test_class : public module_event_map_test_base_class{
5985     public:
5986 //        down_thread_sorryserver_mod_disconnect_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : module_event_map_test_base_class(vs,session_io){
5987 //        };
5988        down_thread_sorryserver_mod_disconnect_test_class(
5989                                 l7vs::virtualservice_tcp& vs,
5990                                 boost::asio::io_service& session_io,
5991                                 l7vs::tcp_socket_option_info& set_socket_option,
5992                                 boost::asio::ip::tcp::endpoint listen_endpoint,
5993                                 bool ssl_mode,
5994                                 boost::asio::ssl::context& set_ssl_context,
5995                                 bool set_ssl_cache_flag,
5996                                 int set_ssl_handshake_time_out,
5997                                 l7vs::logger_implement_access* set_access_logger) : module_event_map_test_base_class(   vs,
5998                                                                                                    session_io,
5999                                                                                                    set_socket_option,
6000                                                                                                    listen_endpoint,
6001                                                                                                    ssl_mode,
6002                                                                                                    set_ssl_context,
6003                                                                                                    set_ssl_cache_flag,
6004                                                                                                    set_ssl_handshake_time_out,
6005                                                                                                    set_access_logger){};
6006
6007         
6008         ~down_thread_sorryserver_mod_disconnect_test_class(){};
6009         
6010         void test_call(){
6011             l7vs::tcp_session::down_thread_sorryserver_mod_disconnect(LOCAL_PROC);
6012         };
6013         
6014         boost::shared_ptr< l7vs::tcp_socket > get_sorry_socket(){
6015             return sorryserver_socket.second;
6016         };
6017
6018         boost::asio::ip::tcp::endpoint& get_sorry_endpoint(){
6019             return sorryserver_socket.first;
6020         }
6021         
6022 };
6023
6024 void down_thread_sorryserver_mod_disconnect_test(){
6025     
6026     BOOST_MESSAGE( "----- down_thread_sorryserver_mod_disconnect test start -----" );
6027     
6028     boost::asio::io_service io;
6029     l7vs::virtualservice_tcp vs;    
6030     l7vs::tcp_socket_option_info set_option;
6031     //! TCP_NODELAY   (false:not set,true:set option)
6032     set_option.nodelay_opt = false;
6033     //! TCP_NODELAY option value  (false:off,true:on)
6034     set_option.nodelay_val = false;
6035     //! TCP_CORK      (false:not set,true:set option)
6036     set_option.cork_opt = false;
6037     //! TCP_CORK option value     (false:off,true:on)
6038     set_option.cork_val = false;
6039     //! TCP_QUICKACK  (false:not set,true:set option)
6040     set_option.quickack_opt = false;
6041     //! TCP_QUICKACK option value (false:off,true:on)
6042     set_option.quickack_val = false;
6043     //
6044     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
6045     bool set_mode(false);
6046     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
6047     bool set_ssl_cache_flag(false);
6048     int set_ssl_handshake_time_out = 0;
6049     //std::string access_log_file_name = "test";
6050     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
6051
6052 //    down_thread_sorryserver_mod_disconnect_test_class test_obj(vs,io);
6053     down_thread_sorryserver_mod_disconnect_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
6054
6055     
6056     std::string test_protocol_name("test protocol");
6057     l7vs::test_protocol_module proto_test(test_protocol_name);
6058
6059     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
6060     
6061     l7vs::protocol_module_base::EVENT_TAG chek_event[7];
6062     chek_event[0] = l7vs::protocol_module_base::CLIENT_DISCONNECT;
6063     chek_event[1] = l7vs::protocol_module_base::CLIENT_CONNECTION_CHECK;
6064     chek_event[2] = l7vs::protocol_module_base::REALSERVER_RECV;
6065     chek_event[3] = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
6066     chek_event[4] = l7vs::protocol_module_base::SORRYSERVER_RECV;
6067     chek_event[5] = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
6068     chek_event[6] = l7vs::protocol_module_base::FINALIZE;
6069     
6070     // unit_test [1] down_thread_sorryserver_mod_disconnect down_thread_next_call_function update check
6071     std::cerr << "[1] down_thread_sorryserver_mod_disconnect down_thread_next_call_function update check" << std::endl;
6072     for(int i = 0; i < 7;i++){
6073         proto_test.handle_sorryserver_disconnect_res_tag = chek_event[i];
6074         test_obj.test_call();
6075         BOOST_CHECK(test_obj.chk_down_thread_next_call_function(chek_event[i]));
6076     }
6077
6078     // module parameter check
6079     boost::thread::id def_id;
6080     boost::thread::id proc_id = boost::this_thread::get_id();
6081     boost::asio::ip::tcp::endpoint test_end(boost::asio::ip::address::from_string("100.102.103.104"), 7777);
6082     test_obj.get_sorry_endpoint() = test_end;
6083     test_obj.set_down_thread_id(proc_id);
6084     proto_test.handle_sorryserver_disconnect_thread_id = def_id;
6085     proto_test.handle_sorryserver_disconnect_rs_endpoint = boost::asio::ip::tcp::endpoint();
6086     proto_test.handle_sorryserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
6087     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_thread_id != proc_id);
6088     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_rs_endpoint != test_end);
6089     test_obj.get_sorry_socket()->close_call_check = false;
6090     test_obj.get_sorry_socket()->close_res = true;
6091
6092     test_obj.test_call();
6093
6094     // unit_test [2] down_thread_sorryserver_mod_disconnect socket close check
6095     std::cerr << "[2] down_thread_sorryserver_mod_disconnect socket close check" << std::endl;
6096     BOOST_CHECK(test_obj.get_sorry_socket()->close_call_check);
6097
6098     // unit_test [3] down_thread_sorryserver_mod_disconnect endpoint not update check
6099     std::cerr << "[3] down_thread_sorryserver_mod_disconnect endpoint not update  check" << std::endl;
6100     BOOST_CHECK(test_obj.get_sorry_endpoint() == test_end);
6101
6102     // unit_test [4] down_thread_sorryserver_mod_disconnect module parameter check thread id
6103     std::cerr << "[4] down_thread_sorryserver_mod_disconnect module parameter check thread id" << std::endl;
6104     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_thread_id == proc_id);
6105     
6106     // unit_test [5] down_thread_sorryserver_mod_disconnect module parameter check endpoint
6107     std::cerr << "[5] down_thread_sorryserver_mod_disconnect module parameter check endpoint" << std::endl;
6108     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_rs_endpoint == test_end);
6109     
6110     proto_test.handle_sorryserver_disconnect_thread_id = def_id;
6111     proto_test.handle_sorryserver_disconnect_rs_endpoint = boost::asio::ip::tcp::endpoint();
6112     proto_test.handle_sorryserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
6113     test_obj.get_sorry_socket()->close_call_check = false;
6114     test_obj.get_sorry_socket()->close_res = false;
6115
6116     test_obj.test_call();
6117
6118     // unit_test [6] down_thread_sorryserver_mod_disconnect socket close check
6119     std::cerr << "[6] down_thread_sorryserver_mod_disconnect socket close check" << std::endl;
6120     BOOST_CHECK(test_obj.get_sorry_socket()->close_call_check);
6121
6122     // unit_test [7] down_thread_sorryserver_mod_disconnect endpoint not update check
6123     std::cerr << "[7] down_thread_sorryserver_mod_disconnect endpoint not update  check" << std::endl;
6124     BOOST_CHECK(test_obj.get_sorry_endpoint() == boost::asio::ip::tcp::endpoint());
6125
6126     // unit_test [8] down_thread_sorryserver_mod_disconnect module parameter check thread id
6127     std::cerr << "[8] down_thread_sorryserver_mod_disconnect module parameter check thread id" << std::endl;
6128     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_thread_id == proc_id);
6129     
6130     // unit_test [9] down_thread_sorryserver_mod_disconnect module parameter check endpoint
6131     std::cerr << "[9] down_thread_sorryserver_mod_disconnect module parameter check endpoint" << std::endl;
6132     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_rs_endpoint == test_end);
6133     
6134     proto_test.handle_sorryserver_disconnect_thread_id = def_id;
6135     proto_test.handle_sorryserver_disconnect_rs_endpoint = boost::asio::ip::tcp::endpoint();
6136     proto_test.handle_sorryserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
6137     test_obj.get_sorry_socket()->close_call_check = false;
6138     test_obj.get_sorry_socket()->close_res = false;
6139
6140     test_obj.test_call();
6141
6142     // unit_test [10] down_thread_sorryserver_mod_disconnect socket close check
6143     std::cerr << "[10] down_thread_sorryserver_mod_disconnect socket close check" << std::endl;
6144     BOOST_CHECK(test_obj.get_sorry_socket()->close_call_check);
6145
6146     // unit_test [11] down_thread_sorryserver_mod_disconnect endpoint not update check
6147     std::cerr << "[11] down_thread_sorryserver_mod_disconnect endpoint not update  check" << std::endl;
6148     BOOST_CHECK(test_obj.get_sorry_endpoint() == boost::asio::ip::tcp::endpoint());
6149
6150     // unit_test [12] down_thread_sorryserver_mod_disconnect module parameter check thread id
6151     std::cerr << "[12] down_thread_sorryserver_mod_disconnect module parameter check thread id" << std::endl;
6152     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_thread_id == proc_id);
6153     
6154     // unit_test [13] down_thread_sorryserver_mod_disconnect module parameter check endpoint
6155     std::cerr << "[13] down_thread_sorryserver_mod_disconnect module parameter check endpoint" << std::endl;
6156     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_rs_endpoint == boost::asio::ip::tcp::endpoint());
6157     
6158     // unit_test [14] down_thread_sorryserver_mod_disconnect not fond function error check
6159     std::cerr << "[14] down_thread_sorryserver_mod_disconnect not fond function error check" << std::endl;
6160     test_obj.down_thread_function_array_clear();
6161     proto_test.handle_sorryserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
6162     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
6163     l7vs::Logger::putLogError_id = 0;
6164     test_obj.test_call();
6165     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
6166     BOOST_CHECK_EQUAL(93,l7vs::Logger::putLogError_id);
6167     std::cerr << l7vs::Logger::putLogError_message << std::endl;
6168     
6169     // unit_test [15] down_thread_sorryserver_mod_disconnect returnd illegal EVENT_TAG error check
6170     std::cerr << "[15] down_thread_sorryserver_mod_disconnect returnd illegal EVENT_TAG error check" << std::endl;
6171     test_obj.down_thread_module_event_map_clear();
6172     proto_test.handle_sorryserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
6173     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
6174     l7vs::Logger::putLogError_id = 0;
6175     test_obj.test_call();
6176     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
6177     BOOST_CHECK_EQUAL(92,l7vs::Logger::putLogError_id);
6178     std::cerr << l7vs::Logger::putLogError_message << std::endl;
6179     
6180 //    mutex_lock_test test_lock_obj(vs,io);
6181     mutex_lock_test test_lock_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
6182     test_lock_obj.set_down_thread_sorryserver_disconnect_event_test();
6183     test_lock_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
6184     
6185     test_lock_obj.test_thread_wait.lock();
6186     test_lock_obj.befor_thread_id = proc_id;
6187     test_lock_obj.after_thread_id = proc_id;
6188     test_lock_obj.mutex_lock();
6189     
6190     boost::thread test_thread(boost::bind(&mutex_lock_test::test_run,&test_lock_obj));
6191     
6192     BOOST_CHECK(test_lock_obj.befor_thread_id == proc_id);
6193     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
6194     
6195     boost::thread::id test_id = test_thread.get_id();
6196     
6197     BOOST_CHECK(test_id != proc_id);
6198     
6199     // test start
6200     test_lock_obj.test_thread_wait.unlock();
6201     sleep(1);
6202     
6203     // unit_test [16] down_thread_sorryserver_mod_disconnect thread block test (mutex lock)
6204     std::cerr << "[16] down_thread_sorryserver_mod_disconnect thread block test (mutex lock)" << std::endl;
6205     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
6206     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
6207     
6208     test_lock_obj.mutex_unlock();
6209     sleep(1);
6210     
6211     // unit_test [17] down_thread_sorryserver_mod_disconnect thread run test (mutex unlock)
6212     std::cerr << "[17] down_thread_sorryserver_mod_disconnect thread run test (mutex unlock)" << std::endl;
6213     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
6214     BOOST_CHECK(test_lock_obj.after_thread_id == test_id);
6215     
6216     BOOST_MESSAGE( "----- down_thread_sorryserver_mod_disconnect test end -----" );
6217 }
6218
6219
6220
6221 // down_thread_sorryserver_disconnetc_event test
6222 // down_thread_sorryserver_disconnetc_event test class
6223 class down_thread_sorryserver_disconnect_event_test_class : public module_event_map_test_base_class{
6224     public:
6225 //        down_thread_sorryserver_disconnect_event_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : module_event_map_test_base_class(vs,session_io){
6226 //        };
6227        down_thread_sorryserver_disconnect_event_test_class(
6228                                 l7vs::virtualservice_tcp& vs,
6229                                 boost::asio::io_service& session_io,
6230                                 l7vs::tcp_socket_option_info& set_socket_option,
6231                                 boost::asio::ip::tcp::endpoint listen_endpoint,
6232                                 bool ssl_mode,
6233                                 boost::asio::ssl::context& set_ssl_context,
6234                                 bool set_ssl_cache_flag,
6235                                 int set_ssl_handshake_time_out,
6236                                 l7vs::logger_implement_access* set_access_logger) : module_event_map_test_base_class(   vs,
6237                                                                                                    session_io,
6238                                                                                                    set_socket_option,
6239                                                                                                    listen_endpoint,
6240                                                                                                    ssl_mode,
6241                                                                                                    set_ssl_context,
6242                                                                                                    set_ssl_cache_flag,
6243                                                                                                    set_ssl_handshake_time_out,
6244                                                                                                    set_access_logger){};
6245
6246         
6247         ~down_thread_sorryserver_disconnect_event_test_class(){};
6248         
6249         void test_call(){
6250             l7vs::tcp_session::down_thread_sorryserver_disconnect_event(LOCAL_PROC);
6251         };
6252 };
6253
6254 void down_thread_sorryserver_disconnect_event_test(){
6255     
6256     BOOST_MESSAGE( "----- down_thread_sorryserver_disconnect_event test start -----" );
6257     
6258     boost::asio::io_service io;
6259     l7vs::virtualservice_tcp vs;
6260     l7vs::tcp_socket_option_info set_option;
6261     //! TCP_NODELAY   (false:not set,true:set option)
6262     set_option.nodelay_opt = false;
6263     //! TCP_NODELAY option value  (false:off,true:on)
6264     set_option.nodelay_val = false;
6265     //! TCP_CORK      (false:not set,true:set option)
6266     set_option.cork_opt = false;
6267     //! TCP_CORK option value     (false:off,true:on)
6268     set_option.cork_val = false;
6269     //! TCP_QUICKACK  (false:not set,true:set option)
6270     set_option.quickack_opt = false;
6271     //! TCP_QUICKACK option value (false:off,true:on)
6272     set_option.quickack_val = false;
6273     //
6274     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
6275     bool set_mode(false);
6276     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
6277     bool set_ssl_cache_flag(false);
6278     int set_ssl_handshake_time_out = 0;
6279     //std::string access_log_file_name = "test";
6280     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
6281
6282 //    down_thread_sorryserver_disconnect_event_test_class test_obj(vs,io);
6283     down_thread_sorryserver_disconnect_event_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
6284     
6285     std::string test_protocol_name("test protocol");
6286     l7vs::test_protocol_module proto_test(test_protocol_name);
6287
6288     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
6289     
6290     l7vs::protocol_module_base::EVENT_TAG chek_event[7];
6291     chek_event[0] = l7vs::protocol_module_base::CLIENT_DISCONNECT;
6292     chek_event[1] = l7vs::protocol_module_base::CLIENT_CONNECTION_CHECK;
6293     chek_event[2] = l7vs::protocol_module_base::REALSERVER_RECV;
6294     chek_event[3] = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
6295     chek_event[4] = l7vs::protocol_module_base::SORRYSERVER_RECV;
6296     chek_event[5] = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
6297     chek_event[6] = l7vs::protocol_module_base::FINALIZE;
6298     
6299     // unit_test [1] down_thread_sorryserver_disconnect_event down_thread_next_call_function update check
6300     std::cerr << "[1] down_thread_sorryserver_disconnect_event down_thread_next_call_function update check" << std::endl;
6301     for(int i = 0; i < 7;i++){
6302         proto_test.handle_sorryserver_disconnect_res_tag = chek_event[i];
6303         test_obj.test_call();
6304         BOOST_CHECK(test_obj.chk_down_thread_next_call_function(chek_event[i]));
6305     }
6306     
6307     // module parameter check
6308     boost::thread::id def_id;
6309     boost::thread::id proc_id = boost::this_thread::get_id();
6310     boost::asio::ip::tcp::endpoint test_end(boost::asio::ip::address::from_string("100.102.103.104"), 7777);
6311     l7vs::tcp_data test_message;
6312     test_message.set_endpoint(test_end);
6313     test_obj.set_down_thread_id(proc_id);
6314     test_obj.set_down_thread_message_data(test_message);
6315     proto_test.handle_sorryserver_disconnect_thread_id = def_id;
6316     proto_test.handle_sorryserver_disconnect_rs_endpoint = boost::asio::ip::tcp::endpoint();
6317     proto_test.handle_sorryserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
6318     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_thread_id != proc_id);
6319     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_rs_endpoint != test_end);
6320     test_obj.test_call();
6321     // unit_test [2] down_thread_sorryserver_disconnect_event module parameter check thread id
6322     std::cerr << "[2] down_thread_sorryserver_disconnect_event module parameter check thread id" << std::endl;
6323     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_thread_id == proc_id);
6324     
6325     // unit_test [3] down_thread_sorryserver_disconnect_event module parameter check endpoint
6326     std::cerr << "[3] down_thread_sorryserver_disconnect_event module parameter check endpoint" << std::endl;
6327     BOOST_CHECK(proto_test.handle_sorryserver_disconnect_rs_endpoint == test_end);
6328     
6329     // unit_test [4] down_thread_sorryserver_disconnect_event not fond function error check
6330     std::cerr << "[4] down_thread_sorryserver_disconnect_event not fond function error check" << std::endl;
6331     test_obj.down_thread_function_array_clear();
6332     proto_test.handle_sorryserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
6333     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
6334     l7vs::Logger::putLogError_id = 0;
6335     test_obj.test_call();
6336     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
6337     BOOST_CHECK_EQUAL(95,l7vs::Logger::putLogError_id);
6338     std::cerr << l7vs::Logger::putLogError_message << std::endl;
6339     
6340     // unit_test [5] down_thread_sorryserver_disconnect_event returnd illegal EVENT_TAG error check
6341     std::cerr << "[5] down_thread_sorryserver_disconnect_event returnd illegal EVENT_TAG error check" << std::endl;
6342     test_obj.down_thread_module_event_map_clear();
6343     proto_test.handle_sorryserver_disconnect_res_tag = l7vs::protocol_module_base::FINALIZE;
6344     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
6345     l7vs::Logger::putLogError_id = 0;
6346     test_obj.test_call();
6347     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
6348     BOOST_CHECK_EQUAL(94,l7vs::Logger::putLogError_id);
6349     std::cerr << l7vs::Logger::putLogError_message << std::endl;
6350     
6351 //    mutex_lock_test test_lock_obj(vs,io);
6352     mutex_lock_test test_lock_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
6353     test_lock_obj.set_down_thread_sorryserver_disconnect_event_test();
6354     test_lock_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
6355     
6356     test_lock_obj.test_thread_wait.lock();
6357     test_lock_obj.befor_thread_id = proc_id;
6358     test_lock_obj.after_thread_id = proc_id;
6359     test_lock_obj.mutex_lock();
6360     
6361     boost::thread test_thread(boost::bind(&mutex_lock_test::test_run,&test_lock_obj));
6362     
6363     BOOST_CHECK(test_lock_obj.befor_thread_id == proc_id);
6364     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
6365     
6366     boost::thread::id test_id = test_thread.get_id();
6367     
6368     BOOST_CHECK(test_id != proc_id);
6369     
6370     // test start
6371     test_lock_obj.test_thread_wait.unlock();
6372     sleep(1);
6373     
6374     // unit_test [6] down_thread_sorryserver_disconnect_event thread block test (mutex lock)
6375     std::cerr << "[6] down_thread_sorryserver_disconnect_event thread block test (mutex lock)" << std::endl;
6376     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
6377     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
6378     
6379     test_lock_obj.mutex_unlock();
6380     sleep(1);
6381     
6382     // unit_test [7] down_thread_sorryserver_disconnect_event thread run test (mutex unlock)
6383     std::cerr << "[7] down_thread_sorryserver_disconnect_event thread run test (mutex unlock)" << std::endl;
6384     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
6385     BOOST_CHECK(test_lock_obj.after_thread_id == test_id);
6386     
6387     BOOST_MESSAGE( "----- down_thread_sorryserver_disconnect_event test end -----" );
6388 }
6389
6390 // up_thread_sorry_enable_event test
6391 // up_thread_sorry_enable_event test class
6392 class up_thread_sorry_enable_event_test_class : public module_event_map_test_base_class{
6393     public:
6394 //        up_thread_sorry_enable_event_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : module_event_map_test_base_class(vs,session_io){
6395 //        };
6396        up_thread_sorry_enable_event_test_class(
6397                                 l7vs::virtualservice_tcp& vs,
6398                                 boost::asio::io_service& session_io,
6399                                 l7vs::tcp_socket_option_info& set_socket_option,
6400                                 boost::asio::ip::tcp::endpoint listen_endpoint,
6401                                 bool ssl_mode,
6402                                 boost::asio::ssl::context& set_ssl_context,
6403                                 bool set_ssl_cache_flag,
6404                                 int set_ssl_handshake_time_out,
6405                                 l7vs::logger_implement_access* set_access_logger) : module_event_map_test_base_class(   vs,
6406                                                                                                    session_io,
6407                                                                                                    set_socket_option,
6408                                                                                                    listen_endpoint,
6409                                                                                                    ssl_mode,
6410                                                                                                    set_ssl_context,
6411                                                                                                    set_ssl_cache_flag,
6412                                                                                                    set_ssl_handshake_time_out,
6413                                                                                                    set_access_logger){};
6414
6415         
6416         ~up_thread_sorry_enable_event_test_class(){};
6417         
6418         void test_call(){
6419             l7vs::tcp_session::up_thread_sorry_enable_event(LOCAL_PROC);
6420         };
6421 };
6422
6423 void up_thread_sorry_enable_event_test(){
6424     
6425     BOOST_MESSAGE( "----- up_thread_sorry_enable_event test start -----" );
6426     
6427     boost::asio::io_service io;
6428     l7vs::virtualservice_tcp vs;
6429     l7vs::tcp_socket_option_info set_option;
6430     //! TCP_NODELAY   (false:not set,true:set option)
6431     set_option.nodelay_opt = false;
6432     //! TCP_NODELAY option value  (false:off,true:on)
6433     set_option.nodelay_val = false;
6434     //! TCP_CORK      (false:not set,true:set option)
6435     set_option.cork_opt = false;
6436     //! TCP_CORK option value     (false:off,true:on)
6437     set_option.cork_val = false;
6438     //! TCP_QUICKACK  (false:not set,true:set option)
6439     set_option.quickack_opt = false;
6440     //! TCP_QUICKACK option value (false:off,true:on)
6441     set_option.quickack_val = false;
6442     //
6443     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
6444     bool set_mode(false);
6445     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
6446     bool set_ssl_cache_flag(false);
6447     int set_ssl_handshake_time_out = 0;
6448     //std::string access_log_file_name = "test";
6449     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
6450
6451 //    up_thread_sorry_enable_event_test_class test_obj(vs,io);
6452     up_thread_sorry_enable_event_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
6453
6454
6455     std::string test_protocol_name("test protocol");
6456     l7vs::test_protocol_module proto_test(test_protocol_name);
6457
6458     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
6459     
6460     l7vs::protocol_module_base::EVENT_TAG chek_event[13];
6461     chek_event[0] = l7vs::protocol_module_base::ACCEPT;
6462     chek_event[1] = l7vs::protocol_module_base::CLIENT_DISCONNECT;
6463     chek_event[2] = l7vs::protocol_module_base::CLIENT_RECV;
6464     chek_event[3] = l7vs::protocol_module_base::CLIENT_RESPONSE_SEND;
6465     chek_event[4] = l7vs::protocol_module_base::REALSERVER_SELECT;
6466     chek_event[5] = l7vs::protocol_module_base::REALSERVER_CONNECT;
6467     chek_event[6] = l7vs::protocol_module_base::REALSERVER_SEND;
6468     chek_event[7] = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
6469     chek_event[8] = l7vs::protocol_module_base::SORRYSERVER_SELECT;
6470     chek_event[9] = l7vs::protocol_module_base::SORRYSERVER_CONNECT;
6471     chek_event[10] = l7vs::protocol_module_base::SORRYSERVER_SEND;
6472     chek_event[11] = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
6473     chek_event[12] = l7vs::protocol_module_base::FINALIZE;
6474     
6475     // unit_test [1] up_thread_sorry_enable_event up_thread_next_call_function update check
6476     std::cerr << "[1] up_thread_sorry_enable_event up_thread_next_call_function update check" << std::endl;
6477     for(int i = 0; i < 13;i++){
6478         proto_test.handle_sorry_enable_res_tag = chek_event[i];
6479         test_obj.test_call();
6480         BOOST_CHECK(test_obj.chk_up_thread_next_call_function(chek_event[i]));
6481     }
6482     
6483     // unit_test [2] up_thread_sorry_enable_event module parameter check thread id
6484     std::cerr << "[2] up_thread_sorry_enable_event module parameter check thread id" << std::endl;
6485     boost::thread::id def_id;
6486     boost::thread::id proc_id = boost::this_thread::get_id();
6487     test_obj.set_up_thread_id(proc_id);
6488     proto_test.handle_sorry_enable_thread_id = def_id;    
6489     proto_test.handle_sorry_enable_res_tag = l7vs::protocol_module_base::FINALIZE;
6490     BOOST_CHECK(proto_test.handle_sorry_enable_thread_id != proc_id);
6491     test_obj.test_call();
6492     BOOST_CHECK(proto_test.handle_sorry_enable_thread_id == proc_id);
6493     
6494     // unit_test [3] up_thread_sorry_enable_event not fond function error check
6495     std::cerr << "[3] up_thread_sorry_enable_event not fond function error check" << std::endl;
6496     test_obj.up_thread_function_array_clear();
6497     proto_test.handle_sorry_enable_res_tag = l7vs::protocol_module_base::FINALIZE;
6498     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
6499     l7vs::Logger::putLogError_id = 0;
6500     test_obj.test_call();
6501     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
6502     BOOST_CHECK_EQUAL(67,l7vs::Logger::putLogError_id);
6503     std::cerr << l7vs::Logger::putLogError_message << std::endl;
6504     
6505     // unit_test [4] up_thread_sorry_enable_event returnd illegal EVENT_TAG error check
6506     std::cerr << "[4] up_thread_sorry_enable_event returnd illegal EVENT_TAG error check" << std::endl;
6507     test_obj.up_thread_module_event_map_clear();
6508     proto_test.handle_sorry_enable_res_tag = l7vs::protocol_module_base::FINALIZE;
6509     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
6510     l7vs::Logger::putLogError_id = 0;
6511     test_obj.test_call();
6512     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
6513     BOOST_CHECK_EQUAL(66,l7vs::Logger::putLogError_id);
6514     std::cerr << l7vs::Logger::putLogError_message << std::endl;
6515     
6516 //    mutex_lock_test test_lock_obj(vs,io);
6517     mutex_lock_test test_lock_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
6518     test_lock_obj.set_up_thread_sorry_enable_event_test();
6519     test_lock_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
6520     
6521     test_lock_obj.test_thread_wait.lock();
6522     test_lock_obj.befor_thread_id = proc_id;
6523     test_lock_obj.after_thread_id = proc_id;
6524     test_lock_obj.mutex_lock();
6525     
6526     boost::thread test_thread(boost::bind(&mutex_lock_test::test_run,&test_lock_obj));
6527     
6528     BOOST_CHECK(test_lock_obj.befor_thread_id == proc_id);
6529     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
6530     
6531     boost::thread::id test_id = test_thread.get_id();
6532     
6533     BOOST_CHECK(test_id != proc_id);
6534     
6535     // test start
6536     test_lock_obj.test_thread_wait.unlock();
6537     sleep(1);
6538     
6539     // unit_test [5] up_thread_sorry_enable_event thread block test (mutex lock)
6540     std::cerr << "[5] up_thread_sorry_enable_event thread block test (mutex lock)" << std::endl;
6541     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
6542     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
6543     
6544     test_lock_obj.mutex_unlock();
6545     sleep(1);
6546     
6547     // unit_test [6] up_thread_sorry_enable_event thread run test (mutex unlock)
6548     std::cerr << "[6] up_thread_sorry_enable_event thread run test (mutex unlock)" << std::endl;
6549     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
6550     BOOST_CHECK(test_lock_obj.after_thread_id == test_id);
6551     
6552     BOOST_MESSAGE( "----- up_thread_sorry_enable_event test end -----" );
6553     
6554 }
6555 // up_thread_sorry_disable_event test
6556 // up_thread_sorry_disable_event test class
6557 class up_thread_sorry_disable_event_test_class : public module_event_map_test_base_class{
6558     public:
6559 //        up_thread_sorry_disable_event_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : module_event_map_test_base_class(vs,session_io){
6560 //        };
6561        up_thread_sorry_disable_event_test_class(
6562                                 l7vs::virtualservice_tcp& vs,
6563                                 boost::asio::io_service& session_io,
6564                                 l7vs::tcp_socket_option_info& set_socket_option,
6565                                 boost::asio::ip::tcp::endpoint listen_endpoint,
6566                                 bool ssl_mode,
6567                                 boost::asio::ssl::context& set_ssl_context,
6568                                 bool set_ssl_cache_flag,
6569                                 int set_ssl_handshake_time_out,
6570                                 l7vs::logger_implement_access* set_access_logger) : module_event_map_test_base_class(   vs,
6571                                                                                                    session_io,
6572                                                                                                    set_socket_option,
6573                                                                                                    listen_endpoint,
6574                                                                                                    ssl_mode,
6575                                                                                                    set_ssl_context,
6576                                                                                                    set_ssl_cache_flag,
6577                                                                                                    set_ssl_handshake_time_out,
6578                                                                                                    set_access_logger){};
6579         
6580
6581
6582
6583         ~up_thread_sorry_disable_event_test_class(){};
6584         
6585         void test_call(){
6586             l7vs::tcp_session::up_thread_sorry_disable_event(LOCAL_PROC);
6587         };
6588 };
6589
6590 void up_thread_sorry_disable_event_test(){
6591     
6592     BOOST_MESSAGE( "----- up_thread_sorry_disable_event test start -----" );
6593     
6594     boost::asio::io_service io;
6595     l7vs::virtualservice_tcp vs;
6596     l7vs::tcp_socket_option_info set_option;
6597     //! TCP_NODELAY   (false:not set,true:set option)
6598     set_option.nodelay_opt = false;
6599     //! TCP_NODELAY option value  (false:off,true:on)
6600     set_option.nodelay_val = false;
6601     //! TCP_CORK      (false:not set,true:set option)
6602     set_option.cork_opt = false;
6603     //! TCP_CORK option value     (false:off,true:on)
6604     set_option.cork_val = false;
6605     //! TCP_QUICKACK  (false:not set,true:set option)
6606     set_option.quickack_opt = false;
6607     //! TCP_QUICKACK option value (false:off,true:on)
6608     set_option.quickack_val = false;
6609     //
6610     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
6611     bool set_mode(false);
6612     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
6613     bool set_ssl_cache_flag(false);
6614     int set_ssl_handshake_time_out = 0;
6615     //std::string access_log_file_name = "test";
6616     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
6617
6618 //    up_thread_sorry_disable_event_test_class test_obj(vs,io);
6619     up_thread_sorry_disable_event_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
6620
6621
6622
6623     std::string test_protocol_name("test protocol");
6624     l7vs::test_protocol_module proto_test(test_protocol_name);
6625
6626     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
6627     
6628     l7vs::protocol_module_base::EVENT_TAG chek_event[13];
6629     chek_event[0] = l7vs::protocol_module_base::ACCEPT;
6630     chek_event[1] = l7vs::protocol_module_base::CLIENT_DISCONNECT;
6631     chek_event[2] = l7vs::protocol_module_base::CLIENT_RECV;
6632     chek_event[3] = l7vs::protocol_module_base::CLIENT_RESPONSE_SEND;
6633     chek_event[4] = l7vs::protocol_module_base::REALSERVER_SELECT;
6634     chek_event[5] = l7vs::protocol_module_base::REALSERVER_CONNECT;
6635     chek_event[6] = l7vs::protocol_module_base::REALSERVER_SEND;
6636     chek_event[7] = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
6637     chek_event[8] = l7vs::protocol_module_base::SORRYSERVER_SELECT;
6638     chek_event[9] = l7vs::protocol_module_base::SORRYSERVER_CONNECT;
6639     chek_event[10] = l7vs::protocol_module_base::SORRYSERVER_SEND;
6640     chek_event[11] = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
6641     chek_event[12] = l7vs::protocol_module_base::FINALIZE;
6642     
6643     // unit_test [1] up_thread_sorry_disable_event up_thread_next_call_function update check
6644     std::cerr << "[1] up_thread_sorry_disable_event up_thread_next_call_function update check" << std::endl;
6645     for(int i = 0; i < 13;i++){
6646         proto_test.handle_sorry_disable_res_tag = chek_event[i];
6647         test_obj.test_call();
6648         BOOST_CHECK(test_obj.chk_up_thread_next_call_function(chek_event[i]));
6649     }
6650     
6651     // unit_test [2] up_thread_sorry_disable_event module parameter check thread id
6652     std::cerr << "[2] up_thread_sorry_disable_event module parameter check thread id" << std::endl;
6653     boost::thread::id def_id;
6654     boost::thread::id proc_id = boost::this_thread::get_id();
6655     test_obj.set_up_thread_id(proc_id);
6656     proto_test.handle_sorry_disable_thread_id = def_id;    
6657     proto_test.handle_sorry_disable_res_tag = l7vs::protocol_module_base::FINALIZE;
6658     BOOST_CHECK(proto_test.handle_sorry_disable_thread_id != proc_id);
6659     test_obj.test_call();
6660     BOOST_CHECK(proto_test.handle_sorry_disable_thread_id == proc_id);
6661     
6662     // unit_test [3] up_thread_sorry_disable_event not fond function error check
6663     std::cerr << "[3] up_thread_sorry_disable_event not fond function error check" << std::endl;
6664     test_obj.up_thread_function_array_clear();
6665     proto_test.handle_sorry_disable_res_tag = l7vs::protocol_module_base::FINALIZE;
6666     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
6667     l7vs::Logger::putLogError_id = 0;
6668     test_obj.test_call();
6669     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
6670     BOOST_CHECK_EQUAL(69,l7vs::Logger::putLogError_id);
6671     std::cerr << l7vs::Logger::putLogError_message << std::endl;
6672     
6673     // unit_test [4] up_thread_sorry_disable_event returnd illegal EVENT_TAG error check
6674     std::cerr << "[4] up_thread_sorry_disable_event returnd illegal EVENT_TAG error check" << std::endl;
6675     test_obj.up_thread_module_event_map_clear();
6676     proto_test.handle_sorry_disable_res_tag = l7vs::protocol_module_base::FINALIZE;
6677     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
6678     l7vs::Logger::putLogError_id = 0;
6679     test_obj.test_call();
6680     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
6681     BOOST_CHECK_EQUAL(68,l7vs::Logger::putLogError_id);
6682     std::cerr << l7vs::Logger::putLogError_message << std::endl;
6683     
6684 //    mutex_lock_test test_lock_obj(vs,io);
6685     mutex_lock_test test_lock_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
6686     test_lock_obj.set_up_thread_sorry_disable_event_test();
6687     test_lock_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
6688     
6689     test_lock_obj.test_thread_wait.lock();
6690     test_lock_obj.befor_thread_id = proc_id;
6691     test_lock_obj.after_thread_id = proc_id;
6692     test_lock_obj.mutex_lock();
6693     
6694     boost::thread test_thread(boost::bind(&mutex_lock_test::test_run,&test_lock_obj));
6695     
6696     BOOST_CHECK(test_lock_obj.befor_thread_id == proc_id);
6697     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
6698     
6699     boost::thread::id test_id = test_thread.get_id();
6700     
6701     BOOST_CHECK(test_id != proc_id);
6702     
6703     // test start
6704     test_lock_obj.test_thread_wait.unlock();
6705     sleep(1);
6706     
6707     // unit_test [5] up_thread_sorry_disable_event thread block test (mutex lock)
6708     std::cerr << "[5] up_thread_sorry_disable_event thread block test (mutex lock)" << std::endl;
6709     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
6710     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
6711     
6712     test_lock_obj.mutex_unlock();
6713     sleep(1);
6714     
6715     // unit_test [6] up_thread_sorry_disable_event thread run test (mutex unlock)
6716     std::cerr << "[6] up_thread_sorry_disable_event thread run test (mutex unlock)" << std::endl;
6717     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
6718     BOOST_CHECK(test_lock_obj.after_thread_id == test_id);
6719     
6720     BOOST_MESSAGE( "----- up_thread_sorry_disable_event test end -----" );
6721     
6722 }
6723
6724 // down_thread_sorry_enable_event test
6725 // dwon_thread_sorry_enable_event test class
6726 class down_thread_sorry_enable_event_test_class : public module_event_map_test_base_class{
6727     public:
6728 //        down_thread_sorry_enable_event_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : module_event_map_test_base_class(vs,session_io){
6729 //        };
6730        down_thread_sorry_enable_event_test_class(
6731                                 l7vs::virtualservice_tcp& vs,
6732                                 boost::asio::io_service& session_io,
6733                                 l7vs::tcp_socket_option_info& set_socket_option,
6734                                 boost::asio::ip::tcp::endpoint listen_endpoint,
6735                                 bool ssl_mode,
6736                                 boost::asio::ssl::context& set_ssl_context,
6737                                 bool set_ssl_cache_flag,
6738                                 int set_ssl_handshake_time_out,
6739                                 l7vs::logger_implement_access* set_access_logger) : module_event_map_test_base_class(   vs,
6740                                                                                                    session_io,
6741                                                                                                    set_socket_option,
6742                                                                                                    listen_endpoint,
6743                                                                                                    ssl_mode,
6744                                                                                                    set_ssl_context,
6745                                                                                                    set_ssl_cache_flag,
6746                                                                                                    set_ssl_handshake_time_out,
6747                                                                                                    set_access_logger){};
6748
6749
6750         
6751         ~down_thread_sorry_enable_event_test_class(){};
6752         
6753         void test_call(){
6754             l7vs::tcp_session::down_thread_sorry_enable_event(LOCAL_PROC);
6755         };
6756 };
6757
6758 void down_thread_sorry_enable_event_test(){
6759     
6760     BOOST_MESSAGE( "----- down_thread_sorry_enable_event test start -----" );
6761     
6762     boost::asio::io_service io;
6763     l7vs::virtualservice_tcp vs;
6764     l7vs::tcp_socket_option_info set_option;
6765     //! TCP_NODELAY   (false:not set,true:set option)
6766     set_option.nodelay_opt = false;
6767     //! TCP_NODELAY option value  (false:off,true:on)
6768     set_option.nodelay_val = false;
6769     //! TCP_CORK      (false:not set,true:set option)
6770     set_option.cork_opt = false;
6771     //! TCP_CORK option value     (false:off,true:on)
6772     set_option.cork_val = false;
6773     //! TCP_QUICKACK  (false:not set,true:set option)
6774     set_option.quickack_opt = false;
6775     //! TCP_QUICKACK option value (false:off,true:on)
6776     set_option.quickack_val = false;
6777     //
6778     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
6779     bool set_mode(false);
6780     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
6781     bool set_ssl_cache_flag(false);
6782     int set_ssl_handshake_time_out = 0;
6783     //std::string access_log_file_name = "test";
6784     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
6785
6786 //    down_thread_sorry_enable_event_test_class test_obj(vs,io);
6787     down_thread_sorry_enable_event_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
6788
6789     std::string test_protocol_name("test protocol");
6790     l7vs::test_protocol_module proto_test(test_protocol_name);
6791
6792     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
6793     
6794     l7vs::protocol_module_base::EVENT_TAG chek_event[7];
6795     chek_event[0] = l7vs::protocol_module_base::CLIENT_DISCONNECT;
6796     chek_event[1] = l7vs::protocol_module_base::CLIENT_CONNECTION_CHECK;
6797     chek_event[2] = l7vs::protocol_module_base::REALSERVER_RECV;
6798     chek_event[3] = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
6799     chek_event[4] = l7vs::protocol_module_base::SORRYSERVER_RECV;
6800     chek_event[5] = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
6801     chek_event[6] = l7vs::protocol_module_base::FINALIZE;
6802     
6803     // unit_test [1] down_thread_sorry_enable_event up_thread_next_call_function update check
6804     std::cerr << "[1] down_thread_sorry_enable_event up_thread_next_call_function update check" << std::endl;
6805     for(int i = 0; i < 7;i++){
6806         proto_test.handle_sorry_enable_res_tag = chek_event[i];
6807         test_obj.test_call();
6808         BOOST_CHECK(test_obj.chk_down_thread_next_call_function(chek_event[i]));
6809     }
6810     
6811     // unit_test [2] down_thread_sorry_enable_event module parameter check thread id
6812     std::cerr << "[2] down_thread_sorry_enable_event module parameter check thread id" << std::endl;
6813     boost::thread::id def_id;
6814     boost::thread::id proc_id = boost::this_thread::get_id();
6815     test_obj.set_down_thread_id(proc_id);
6816     proto_test.handle_sorry_enable_thread_id = def_id;    
6817     proto_test.handle_sorry_enable_res_tag = l7vs::protocol_module_base::FINALIZE;
6818     BOOST_CHECK(proto_test.handle_sorry_enable_thread_id != proc_id);
6819     test_obj.test_call();
6820     BOOST_CHECK(proto_test.handle_sorry_enable_thread_id == proc_id);
6821     
6822     // unit_test [3] down_thread_sorry_enable_event not fond function error check
6823     std::cerr << "[3] down_thread_sorry_enable_event not fond function error check" << std::endl;
6824     test_obj.down_thread_function_array_clear();
6825     proto_test.handle_sorry_enable_res_tag = l7vs::protocol_module_base::FINALIZE;
6826     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
6827     l7vs::Logger::putLogError_id = 0;
6828     test_obj.test_call();
6829     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
6830     BOOST_CHECK_EQUAL(97,l7vs::Logger::putLogError_id);
6831     std::cerr << l7vs::Logger::putLogError_message << std::endl;
6832     
6833     // unit_test [4] down_thread_sorry_enable_event returnd illegal EVENT_TAG error check
6834     std::cerr << "[4] down_thread_sorry_enable_event returnd illegal EVENT_TAG error check" << std::endl;
6835     test_obj.down_thread_module_event_map_clear();
6836     proto_test.handle_sorry_enable_res_tag = l7vs::protocol_module_base::FINALIZE;
6837     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
6838     l7vs::Logger::putLogError_id = 0;
6839     test_obj.test_call();
6840     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
6841     BOOST_CHECK_EQUAL(96,l7vs::Logger::putLogError_id);
6842     std::cerr << l7vs::Logger::putLogError_message << std::endl;
6843     
6844 //    mutex_lock_test test_lock_obj(vs,io);
6845     mutex_lock_test test_lock_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
6846     test_lock_obj.set_down_thread_sorry_enable_event_test();
6847     test_lock_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
6848     
6849     
6850     test_lock_obj.test_thread_wait.lock();
6851     test_lock_obj.befor_thread_id = proc_id;
6852     test_lock_obj.after_thread_id = proc_id;
6853     test_lock_obj.mutex_lock();
6854     
6855     boost::thread test_thread(boost::bind(&mutex_lock_test::test_run,&test_lock_obj));
6856     
6857     BOOST_CHECK(test_lock_obj.befor_thread_id == proc_id);
6858     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
6859     
6860     boost::thread::id test_id = test_thread.get_id();
6861     
6862     BOOST_CHECK(test_id != proc_id);
6863     
6864     // test start
6865     test_lock_obj.test_thread_wait.unlock();
6866     sleep(1);
6867     
6868     // unit_test [5] down_thread_sorry_enable_event thread block test (mutex lock)
6869     std::cerr << "[5] down_thread_sorry_enable_event thread block test (mutex lock)" << std::endl;
6870     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
6871     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
6872     
6873     test_lock_obj.mutex_unlock();
6874     sleep(1);
6875     
6876     // unit_test [6] down_thread_sorry_enable_event thread run test (mutex unlock)
6877     std::cerr << "[6] down_thread_sorry_enable_event thread run test (mutex unlock)" << std::endl;
6878     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
6879     BOOST_CHECK(test_lock_obj.after_thread_id == test_id);
6880     
6881     BOOST_MESSAGE( "----- down_thread_sorry_enable_event test end -----" );
6882 }
6883 // down_thread_sorry_disable_event test
6884 // dwon_thread_sorry_disable_event test class
6885 class down_thread_sorry_disable_event_test_class : public module_event_map_test_base_class{
6886     public:
6887 //        down_thread_sorry_disable_event_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : module_event_map_test_base_class(vs,session_io){
6888 //        };
6889        down_thread_sorry_disable_event_test_class(
6890                                 l7vs::virtualservice_tcp& vs,
6891                                 boost::asio::io_service& session_io,
6892                                 l7vs::tcp_socket_option_info& set_socket_option,
6893                                 boost::asio::ip::tcp::endpoint listen_endpoint,
6894                                 bool ssl_mode,
6895                                 boost::asio::ssl::context& set_ssl_context,
6896                                 bool set_ssl_cache_flag,
6897                                 int set_ssl_handshake_time_out,
6898                                 l7vs::logger_implement_access* set_access_logger) : module_event_map_test_base_class(   vs,
6899                                                                                                    session_io,
6900                                                                                                    set_socket_option,
6901                                                                                                    listen_endpoint,
6902                                                                                                    ssl_mode,
6903                                                                                                    set_ssl_context,
6904                                                                                                    set_ssl_cache_flag,
6905                                                                                                    set_ssl_handshake_time_out,
6906                                                                                                    set_access_logger){};
6907
6908         
6909         ~down_thread_sorry_disable_event_test_class(){};
6910         
6911         void test_call(){
6912             l7vs::tcp_session::down_thread_sorry_disable_event(LOCAL_PROC);
6913         };
6914 };
6915
6916 void down_thread_sorry_disable_event_test(){
6917     
6918     BOOST_MESSAGE( "----- down_thread_sorry_disable_event test start -----" );
6919     
6920     boost::asio::io_service io;
6921     l7vs::virtualservice_tcp vs;
6922     l7vs::tcp_socket_option_info set_option;
6923     //! TCP_NODELAY   (false:not set,true:set option)
6924     set_option.nodelay_opt = false;
6925     //! TCP_NODELAY option value  (false:off,true:on)
6926     set_option.nodelay_val = false;
6927     //! TCP_CORK      (false:not set,true:set option)
6928     set_option.cork_opt = false;
6929     //! TCP_CORK option value     (false:off,true:on)
6930     set_option.cork_val = false;
6931     //! TCP_QUICKACK  (false:not set,true:set option)
6932     set_option.quickack_opt = false;
6933     //! TCP_QUICKACK option value (false:off,true:on)
6934     set_option.quickack_val = false;
6935     //
6936     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
6937     bool set_mode(false);
6938     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
6939     bool set_ssl_cache_flag(false);
6940     int set_ssl_handshake_time_out = 0;
6941     //std::string access_log_file_name = "test";
6942     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
6943
6944 //    down_thread_sorry_disable_event_test_class test_obj(vs,io);
6945     down_thread_sorry_disable_event_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
6946
6947
6948     std::string test_protocol_name("test protocol");
6949     l7vs::test_protocol_module proto_test(test_protocol_name);
6950
6951     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
6952     
6953     l7vs::protocol_module_base::EVENT_TAG chek_event[7];
6954     chek_event[0] = l7vs::protocol_module_base::CLIENT_DISCONNECT;
6955     chek_event[1] = l7vs::protocol_module_base::CLIENT_CONNECTION_CHECK;
6956     chek_event[2] = l7vs::protocol_module_base::REALSERVER_RECV;
6957     chek_event[3] = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
6958     chek_event[4] = l7vs::protocol_module_base::SORRYSERVER_RECV;
6959     chek_event[5] = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
6960     chek_event[6] = l7vs::protocol_module_base::FINALIZE;
6961     
6962     // unit_test [1] down_thread_sorry_disable_event up_thread_next_call_function update check
6963     std::cerr << "[1] down_thread_sorry_disable_event up_thread_next_call_function update check" << std::endl;
6964     for(int i = 0; i < 7;i++){
6965         proto_test.handle_sorry_disable_res_tag = chek_event[i];
6966         test_obj.test_call();
6967         BOOST_CHECK(test_obj.chk_down_thread_next_call_function(chek_event[i]));
6968     }
6969     
6970     // unit_test [2] down_thread_sorry_disable_event module parameter check thread id
6971     std::cerr << "[2] down_thread_sorry_disable_event module parameter check thread id" << std::endl;
6972     boost::thread::id def_id;
6973     boost::thread::id proc_id = boost::this_thread::get_id();
6974     test_obj.set_down_thread_id(proc_id);
6975     proto_test.handle_sorry_disable_thread_id = def_id;    
6976     proto_test.handle_sorry_disable_res_tag = l7vs::protocol_module_base::FINALIZE;
6977     BOOST_CHECK(proto_test.handle_sorry_disable_thread_id != proc_id);
6978     test_obj.test_call();
6979     BOOST_CHECK(proto_test.handle_sorry_disable_thread_id == proc_id);
6980     
6981     // unit_test [3] down_thread_sorry_disable_event not fond function error check
6982     std::cerr << "[3] down_thread_sorry_disable_event not fond function error check" << std::endl;
6983     test_obj.down_thread_function_array_clear();
6984     proto_test.handle_sorry_disable_res_tag = l7vs::protocol_module_base::FINALIZE;
6985     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
6986     l7vs::Logger::putLogError_id = 0;
6987     test_obj.test_call();
6988     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
6989     BOOST_CHECK_EQUAL(99,l7vs::Logger::putLogError_id);
6990     std::cerr << l7vs::Logger::putLogError_message << std::endl;
6991     
6992     // unit_test [4] down_thread_sorry_disable_event returnd illegal EVENT_TAG error check
6993     std::cerr << "[4] down_thread_sorry_disable_event returnd illegal EVENT_TAG error check" << std::endl;
6994     test_obj.down_thread_module_event_map_clear();
6995     proto_test.handle_sorry_disable_res_tag = l7vs::protocol_module_base::FINALIZE;
6996     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
6997     l7vs::Logger::putLogError_id = 0;
6998     test_obj.test_call();
6999     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
7000     BOOST_CHECK_EQUAL(98,l7vs::Logger::putLogError_id);
7001     std::cerr << l7vs::Logger::putLogError_message << std::endl;
7002     
7003 //    mutex_lock_test test_lock_obj(vs,io);
7004     mutex_lock_test test_lock_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
7005     test_lock_obj.set_down_thread_sorry_disable_event_test();
7006     test_lock_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
7007     
7008     test_lock_obj.test_thread_wait.lock();
7009     test_lock_obj.befor_thread_id = proc_id;
7010     test_lock_obj.after_thread_id = proc_id;
7011     test_lock_obj.mutex_lock();
7012     
7013     boost::thread test_thread(boost::bind(&mutex_lock_test::test_run,&test_lock_obj));
7014     
7015     BOOST_CHECK(test_lock_obj.befor_thread_id == proc_id);
7016     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
7017     
7018     boost::thread::id test_id = test_thread.get_id();
7019     
7020     BOOST_CHECK(test_id != proc_id);
7021     
7022     // test start
7023     test_lock_obj.test_thread_wait.unlock();
7024     sleep(1);
7025     
7026     // unit_test [5] down_thread_sorry_disable_event thread block test (mutex lock)
7027     std::cerr << "[5] down_thread_sorry_disable_event thread block test (mutex lock)" << std::endl;
7028     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
7029     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
7030     
7031     test_lock_obj.mutex_unlock();
7032     sleep(1);
7033     
7034     // unit_test [6] down_thread_sorry_disable_event thread run test (mutex unlock)
7035     std::cerr << "[6] down_thread_sorry_disable_event thread run test (mutex unlock)" << std::endl;
7036     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
7037     BOOST_CHECK(test_lock_obj.after_thread_id == test_id);
7038     
7039     BOOST_MESSAGE( "----- down_thread_sorry_disable_event test end -----" );
7040 }
7041
7042 // up_thread_client_accept_event test
7043 // up_thread_client_accept_event test class
7044 class up_thread_client_accept_event_test_class : public module_event_map_test_base_class{
7045     public:
7046 //        up_thread_client_accept_event_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : module_event_map_test_base_class(vs,session_io){
7047 //        };
7048        up_thread_client_accept_event_test_class(
7049                                 l7vs::virtualservice_tcp& vs,
7050                                 boost::asio::io_service& session_io,
7051                                 l7vs::tcp_socket_option_info& set_socket_option,
7052                                 boost::asio::ip::tcp::endpoint listen_endpoint,
7053                                 bool ssl_mode,
7054                                 boost::asio::ssl::context& set_ssl_context,
7055                                 bool set_ssl_cache_flag,
7056                                 int set_ssl_handshake_time_out,
7057                                 l7vs::logger_implement_access* set_access_logger) : module_event_map_test_base_class(   vs,
7058                                                                                                    session_io,
7059                                                                                                    set_socket_option,
7060                                                                                                    listen_endpoint,
7061                                                                                                    ssl_mode,
7062                                                                                                    set_ssl_context,
7063                                                                                                    set_ssl_cache_flag,
7064                                                                                                    set_ssl_handshake_time_out,
7065                                                                                                    set_access_logger){};
7066
7067         
7068         ~up_thread_client_accept_event_test_class(){};
7069         
7070         void test_call(){
7071             l7vs::tcp_session::up_thread_client_accept_event(LOCAL_PROC);
7072         };
7073 };
7074
7075 void up_thread_client_accept_event_test(){
7076     
7077     BOOST_MESSAGE( "----- up_thread_client_accept_event test start -----" );
7078
7079     boost::asio::io_service io;
7080     l7vs::virtualservice_tcp vs;
7081     l7vs::tcp_socket_option_info set_option;
7082     //! TCP_NODELAY   (false:not set,true:set option)
7083     set_option.nodelay_opt = false;
7084     //! TCP_NODELAY option value  (false:off,true:on)
7085     set_option.nodelay_val = false;
7086     //! TCP_CORK      (false:not set,true:set option)
7087     set_option.cork_opt = false;
7088     //! TCP_CORK option value     (false:off,true:on)
7089     set_option.cork_val = false;
7090     //! TCP_QUICKACK  (false:not set,true:set option)
7091     set_option.quickack_opt = false;
7092     //! TCP_QUICKACK option value (false:off,true:on)
7093     set_option.quickack_val = false;
7094     //
7095     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
7096     bool set_mode(false);
7097     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
7098     bool set_ssl_cache_flag(false);
7099     int set_ssl_handshake_time_out = 0;
7100     //std::string access_log_file_name = "test";
7101     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
7102
7103 //    up_thread_client_accept_event_test_class test_obj(vs,io);
7104     up_thread_client_accept_event_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
7105     
7106     std::string test_protocol_name("test protocol");
7107     l7vs::test_protocol_module proto_test(test_protocol_name);
7108
7109     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
7110     
7111     l7vs::protocol_module_base::EVENT_TAG chek_event[13];
7112     chek_event[0] = l7vs::protocol_module_base::ACCEPT;
7113     chek_event[1] = l7vs::protocol_module_base::CLIENT_DISCONNECT;
7114     chek_event[2] = l7vs::protocol_module_base::CLIENT_RECV;
7115     chek_event[3] = l7vs::protocol_module_base::CLIENT_RESPONSE_SEND;
7116     chek_event[4] = l7vs::protocol_module_base::REALSERVER_SELECT;
7117     chek_event[5] = l7vs::protocol_module_base::REALSERVER_CONNECT;
7118     chek_event[6] = l7vs::protocol_module_base::REALSERVER_SEND;
7119     chek_event[7] = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
7120     chek_event[8] = l7vs::protocol_module_base::SORRYSERVER_SELECT;
7121     chek_event[9] = l7vs::protocol_module_base::SORRYSERVER_CONNECT;
7122     chek_event[10] = l7vs::protocol_module_base::SORRYSERVER_SEND;
7123     chek_event[11] = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
7124     chek_event[12] = l7vs::protocol_module_base::FINALIZE;
7125     
7126     // unit_test [1] up_thread_client_accept_event up_thread_next_call_function update check
7127     std::cerr << "[1] up_thread_client_accept_event up_thread_next_call_function update check" << std::endl;
7128     for(int i = 0; i < 13;i++){
7129         proto_test.handle_accept_res_tag = chek_event[i];
7130         test_obj.test_call();
7131         BOOST_CHECK(test_obj.chk_up_thread_next_call_function(chek_event[i]));
7132     }
7133     
7134     // unit_test [2] up_thread_client_accept_event module parameter check thread id
7135     std::cerr << "[2] up_thread_client_accept_event module parameter check thread id" << std::endl;
7136     boost::thread::id def_id;
7137     boost::thread::id proc_id = boost::this_thread::get_id();
7138     test_obj.set_up_thread_id(proc_id);
7139     proto_test.handle_accept_in_thread_id = def_id;    
7140     proto_test.handle_accept_res_tag = l7vs::protocol_module_base::FINALIZE;
7141     BOOST_CHECK(proto_test.handle_accept_in_thread_id != proc_id);
7142     test_obj.test_call();
7143     BOOST_CHECK(proto_test.handle_accept_in_thread_id == proc_id);
7144     
7145     // unit_test [3] up_thread_client_accept_event not fond function error check
7146     std::cerr << "[3] up_thread_client_accept_event not fond function error check" << std::endl;
7147     test_obj.up_thread_function_array_clear();
7148     proto_test.handle_accept_res_tag = l7vs::protocol_module_base::FINALIZE;
7149     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
7150     l7vs::Logger::putLogError_id = 0;
7151     test_obj.test_call();
7152     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
7153     BOOST_CHECK_EQUAL(19,l7vs::Logger::putLogError_id);
7154     std::cerr << l7vs::Logger::putLogError_message << std::endl;
7155     
7156     // unit_test [4] up_thread_client_accept_event returnd illegal EVENT_TAG error check
7157     std::cerr << "[4] up_thread_client_accept_event returnd illegal EVENT_TAG error check" << std::endl;
7158     test_obj.up_thread_module_event_map_clear();
7159     proto_test.handle_accept_res_tag = l7vs::protocol_module_base::FINALIZE;
7160     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
7161     l7vs::Logger::putLogError_id = 0;
7162     test_obj.test_call();
7163     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
7164     BOOST_CHECK_EQUAL(18,l7vs::Logger::putLogError_id);
7165     std::cerr << l7vs::Logger::putLogError_message << std::endl;
7166     
7167     BOOST_MESSAGE( "----- up_thread_client_accept_event test end -----" );
7168     
7169 }
7170
7171
7172 // up_thread_client_respond test
7173 // up_thread_client_respond test class
7174 class up_thread_client_respond_test_class : public l7vs::tcp_session{
7175     public:
7176 //        up_thread_client_respond_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){
7177 //        };
7178        up_thread_client_respond_test_class(
7179                                 l7vs::virtualservice_tcp& vs,
7180                                 boost::asio::io_service& session_io,
7181                                 l7vs::tcp_socket_option_info& set_socket_option,
7182                                 boost::asio::ip::tcp::endpoint listen_endpoint,
7183                                 bool ssl_mode,
7184                                 boost::asio::ssl::context& set_ssl_context,
7185                                 bool set_ssl_cache_flag,
7186                                 int set_ssl_handshake_time_out,
7187                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
7188                                                                                                    session_io,
7189                                                                                                    set_socket_option,
7190                                                                                                    listen_endpoint,
7191                                                                                                    ssl_mode,
7192                                                                                                    set_ssl_context,
7193                                                                                                    set_ssl_cache_flag,
7194                                                                                                    set_ssl_handshake_time_out,
7195                                                                                                    set_access_logger){};
7196
7197
7198         ~up_thread_client_respond_test_class(){};
7199         
7200         void test_call(){
7201             l7vs::tcp_session::up_thread_client_respond(LOCAL_PROC);
7202         };
7203         
7204         l7vs::lockfree_queue<l7vs::tcp_thread_message>& get_up_thread_message_que(){
7205             return up_thread_message_que;
7206         };
7207
7208         l7vs::lockfree_queue<l7vs::tcp_thread_message>& get_down_thread_message_que(){
7209             return down_thread_message_que;
7210         };
7211         
7212         void up_thread_function_array_clear(){
7213             for(int i = 0;i <= UP_FUNC_EXIT;i++){
7214                 up_thread_function_array[i].second = NULL;
7215             }
7216         };
7217         void up_thread_message_down_thread_function_map_clear(){
7218             up_thread_message_down_thread_function_map.clear();
7219         };
7220         
7221         void up_thread_client_respond_event(const TCP_PROCESS_TYPE_TAG process_type){
7222             up_thread_client_respond_event_call_chek = true;
7223         };
7224         bool up_thread_client_respond_event_call_chek;
7225         
7226         void down_thread_client_respond_event(const TCP_PROCESS_TYPE_TAG process_type){
7227             down_thread_client_respond_event_call_chek = true;
7228         };
7229         bool down_thread_client_respond_event_call_chek;
7230         
7231         void up_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
7232             up_thread_exit_call_chek = true;
7233         };
7234         bool up_thread_exit_call_chek;
7235 };
7236 void up_thread_client_respond_test(){
7237     BOOST_MESSAGE( "----- up_thread_client_respond test start -----" );
7238 //    boost::asio::io_service io;
7239 //    l7vs::virtualservice_tcp vs;
7240 //    up_thread_client_respond_test_class test_obj(vs,io);
7241
7242     l7vs::virtualservice_tcp vs;
7243     boost::asio::io_service io;
7244     l7vs::tcp_socket_option_info set_option;
7245     //! TCP_NODELAY   (false:not set,true:set option)
7246     set_option.nodelay_opt = false;
7247     //! TCP_NODELAY option value  (false:off,true:on)
7248     set_option.nodelay_val = false;
7249     //! TCP_CORK      (false:not set,true:set option)
7250     set_option.cork_opt = false;
7251     //! TCP_CORK option value     (false:off,true:on)
7252     set_option.cork_val = false;
7253     //! TCP_QUICKACK  (false:not set,true:set option)
7254     set_option.quickack_opt = false;
7255     //! TCP_QUICKACK option value (false:off,true:on)
7256     set_option.quickack_val = false;
7257     //
7258     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
7259     bool set_mode(false);
7260     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
7261     bool set_ssl_cache_flag(false);
7262     int set_ssl_handshake_time_out = 0;
7263     //std::string access_log_file_name = "test";
7264     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
7265
7266     up_thread_client_respond_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
7267
7268
7269     
7270     l7vs::lockfree_queue<l7vs::tcp_thread_message>&        up_thread_message_que    = test_obj.get_up_thread_message_que();
7271     l7vs::lockfree_queue<l7vs::tcp_thread_message>&        down_thread_message_que    = test_obj.get_down_thread_message_que();
7272     
7273     BOOST_CHECK(up_thread_message_que.empty());
7274     BOOST_CHECK(down_thread_message_que.empty());
7275     
7276     test_obj.test_call();
7277     
7278     // unit_test [1] up_thread_client_respond up thread message set check
7279     std::cerr << "[1] up_thread_client_respond up thread message set check" << std::endl;
7280     BOOST_CHECK(!up_thread_message_que.empty());
7281     l7vs::tcp_thread_message*    up_msg        = up_thread_message_que.pop();
7282     BOOST_CHECK(up_thread_message_que.empty());
7283     test_obj.up_thread_client_respond_event_call_chek = false;
7284     up_msg->message(l7vs::tcp_session::MESSAGE_PROC);
7285     BOOST_CHECK(test_obj.up_thread_client_respond_event_call_chek);
7286     delete    up_msg;
7287
7288     // unit_test [2] up_thread_client_respond down thread message set check
7289     std::cerr << "[2] up_thread_client_respond down thread message set check" << std::endl;
7290     BOOST_CHECK(!down_thread_message_que.empty());
7291     l7vs::tcp_thread_message*    down_msg    = down_thread_message_que.pop();
7292     BOOST_CHECK(down_thread_message_que.empty());
7293     test_obj.down_thread_client_respond_event_call_chek = false;
7294     down_msg->message(l7vs::tcp_session::MESSAGE_PROC);
7295     BOOST_CHECK(test_obj.down_thread_client_respond_event_call_chek);
7296     delete    down_msg;
7297
7298     // unit_test [3] up_thread_client_respond not fond down_thread_client_respond_event function error check
7299     std::cerr << "[3] up_thread_client_respond not fond down_thread_client_respond_event function error check" << std::endl;
7300     test_obj.up_thread_message_down_thread_function_map_clear();
7301     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
7302     l7vs::Logger::putLogError_id = 0;
7303     test_obj.up_thread_exit_call_chek = false;
7304     test_obj.test_call();
7305     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
7306     BOOST_CHECK_EQUAL(23,l7vs::Logger::putLogError_id);
7307     std::cerr << l7vs::Logger::putLogError_message << std::endl;
7308     BOOST_CHECK(test_obj.up_thread_exit_call_chek);
7309     
7310     // unit_test [4] up_thread_client_respond not fond up_thread_client_respond_event function error check
7311     std::cerr << "[4] up_thread_client_respond not fond up_thread_client_respond_event function error check" << std::endl;
7312     test_obj.up_thread_function_array_clear();
7313     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
7314     l7vs::Logger::putLogError_id = 0;
7315     test_obj.up_thread_exit_call_chek = false;
7316     test_obj.test_call();
7317     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
7318     BOOST_CHECK_EQUAL(22,l7vs::Logger::putLogError_id);
7319     std::cerr << l7vs::Logger::putLogError_message << std::endl;
7320     BOOST_CHECK(test_obj.up_thread_exit_call_chek);
7321     
7322     BOOST_MESSAGE( "----- up_thread_client_respond test end -----" );
7323 }
7324
7325
7326 // up_thread_client_respond_event test
7327 // up_thread_client_respond_event test class
7328 class up_thread_client_respond_event_test_class : public module_event_map_test_base_class{
7329     public:
7330 //        up_thread_client_respond_event_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : module_event_map_test_base_class(vs,session_io){
7331 //        };
7332        up_thread_client_respond_event_test_class(
7333                                 l7vs::virtualservice_tcp& vs,
7334                                 boost::asio::io_service& session_io,
7335                                 l7vs::tcp_socket_option_info& set_socket_option,
7336                                 boost::asio::ip::tcp::endpoint listen_endpoint,
7337                                 bool ssl_mode,
7338                                 boost::asio::ssl::context& set_ssl_context,
7339                                 bool set_ssl_cache_flag,
7340                                 int set_ssl_handshake_time_out,
7341                                 l7vs::logger_implement_access* set_access_logger) : module_event_map_test_base_class(   vs,
7342                                                                                                    session_io,
7343                                                                                                    set_socket_option,
7344                                                                                                    listen_endpoint,
7345                                                                                                    ssl_mode,
7346                                                                                                    set_ssl_context,
7347                                                                                                    set_ssl_cache_flag,
7348                                                                                                    set_ssl_handshake_time_out,
7349                                                                                                    set_access_logger){};
7350
7351
7352         ~up_thread_client_respond_event_test_class(){};
7353         
7354         void test_call(){
7355             l7vs::tcp_session::up_thread_client_respond_event(LOCAL_PROC);
7356         };
7357 };
7358
7359 void up_thread_client_respond_event_test(){
7360     
7361     BOOST_MESSAGE( "----- up_thread_client_respond_event test start -----" );
7362
7363 //    boost::asio::io_service io;
7364 //    l7vs::virtualservice_tcp vs;
7365 //    up_thread_client_respond_event_test_class test_obj(vs,io);
7366     l7vs::virtualservice_tcp vs;
7367     boost::asio::io_service io;
7368     l7vs::tcp_socket_option_info set_option;
7369     //! TCP_NODELAY   (false:not set,true:set option)
7370     set_option.nodelay_opt = false;
7371     //! TCP_NODELAY option value  (false:off,true:on)
7372     set_option.nodelay_val = false;
7373     //! TCP_CORK      (false:not set,true:set option)
7374     set_option.cork_opt = false;
7375     //! TCP_CORK option value     (false:off,true:on)
7376     set_option.cork_val = false;
7377     //! TCP_QUICKACK  (false:not set,true:set option)
7378     set_option.quickack_opt = false;
7379     //! TCP_QUICKACK option value (false:off,true:on)
7380     set_option.quickack_val = false;
7381     //
7382     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
7383     bool set_mode(false);
7384     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
7385     bool set_ssl_cache_flag(false);
7386     int set_ssl_handshake_time_out = 0;
7387     //std::string access_log_file_name = "test";
7388     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
7389
7390     up_thread_client_respond_event_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
7391
7392
7393     std::string test_protocol_name("test protocol");
7394     l7vs::test_protocol_module proto_test(test_protocol_name);
7395
7396     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
7397     
7398     l7vs::protocol_module_base::EVENT_TAG chek_event[13];
7399     chek_event[0] = l7vs::protocol_module_base::ACCEPT;
7400     chek_event[1] = l7vs::protocol_module_base::CLIENT_DISCONNECT;
7401     chek_event[2] = l7vs::protocol_module_base::CLIENT_RECV;
7402     chek_event[3] = l7vs::protocol_module_base::CLIENT_RESPONSE_SEND;
7403     chek_event[4] = l7vs::protocol_module_base::REALSERVER_SELECT;
7404     chek_event[5] = l7vs::protocol_module_base::REALSERVER_CONNECT;
7405     chek_event[6] = l7vs::protocol_module_base::REALSERVER_SEND;
7406     chek_event[7] = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
7407     chek_event[8] = l7vs::protocol_module_base::SORRYSERVER_SELECT;
7408     chek_event[9] = l7vs::protocol_module_base::SORRYSERVER_CONNECT;
7409     chek_event[10] = l7vs::protocol_module_base::SORRYSERVER_SEND;
7410     chek_event[11] = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
7411     chek_event[12] = l7vs::protocol_module_base::FINALIZE;
7412     
7413     // unit_test [1] up_thread_client_respond_event up_thread_next_call_function update check
7414     std::cerr << "[1] up_thread_client_respond_event up_thread_next_call_function update check" << std::endl;
7415     for(int i = 0; i < 13;i++){
7416         proto_test.handle_response_send_inform_res_tag = chek_event[i];
7417         test_obj.test_call();
7418         BOOST_CHECK(test_obj.chk_up_thread_next_call_function(chek_event[i]));
7419     }
7420     
7421     // unit_test [2] up_thread_client_respond_event module parameter check thread id
7422     std::cerr << "[2] up_thread_client_respond_event module parameter check thread id" << std::endl;
7423     boost::thread::id def_id;
7424     boost::thread::id proc_id = boost::this_thread::get_id();
7425     test_obj.set_up_thread_id(proc_id);
7426     proto_test.handle_response_send_inform_thread_id = def_id;
7427     proto_test.handle_response_send_inform_res_tag = l7vs::protocol_module_base::FINALIZE;
7428     BOOST_CHECK(proto_test.handle_response_send_inform_thread_id != proc_id);
7429     test_obj.test_call();
7430     BOOST_CHECK(proto_test.handle_response_send_inform_thread_id == proc_id);
7431     
7432     // unit_test [3] up_thread_client_respond_event not fond function error check
7433     std::cerr << "[3] up_thread_client_respond_event not fond function error check" << std::endl;
7434     test_obj.up_thread_function_array_clear();
7435     proto_test.handle_response_send_inform_res_tag = l7vs::protocol_module_base::FINALIZE;
7436     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
7437     l7vs::Logger::putLogError_id = 0;
7438     test_obj.test_call();
7439     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
7440     BOOST_CHECK_EQUAL(25,l7vs::Logger::putLogError_id);
7441     std::cerr << l7vs::Logger::putLogError_message << std::endl;
7442     
7443     // unit_test [4] up_thread_client_respond_event returnd illegal EVENT_TAG error check
7444     std::cerr << "[4] up_thread_client_respond_event returnd illegal EVENT_TAG error check" << std::endl;
7445     test_obj.up_thread_module_event_map_clear();
7446     proto_test.handle_response_send_inform_res_tag = l7vs::protocol_module_base::FINALIZE;
7447     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
7448     l7vs::Logger::putLogError_id = 0;
7449     test_obj.test_call();
7450     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
7451     BOOST_CHECK_EQUAL(24,l7vs::Logger::putLogError_id);
7452     std::cerr << l7vs::Logger::putLogError_message << std::endl;
7453     
7454 //    mutex_lock_test test_lock_obj(vs,io);
7455     mutex_lock_test test_lock_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
7456     test_lock_obj.set_up_thread_client_respond_event_test();
7457     test_lock_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
7458     
7459     test_lock_obj.test_thread_wait.lock();
7460     test_lock_obj.befor_thread_id = proc_id;
7461     test_lock_obj.after_thread_id = proc_id;
7462     test_lock_obj.mutex_lock();
7463     
7464     boost::thread test_thread(boost::bind(&mutex_lock_test::test_run,&test_lock_obj));
7465     
7466     BOOST_CHECK(test_lock_obj.befor_thread_id == proc_id);
7467     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
7468     
7469     boost::thread::id test_id = test_thread.get_id();
7470     
7471     BOOST_CHECK(test_id != proc_id);
7472     
7473     // test start
7474     test_lock_obj.test_thread_wait.unlock();
7475     sleep(1);
7476     
7477     // unit_test [5] up_thread_client_respond_event thread block test (mutex lock)
7478     std::cerr << "[5] up_thread_client_respond_event thread block test (mutex lock)" << std::endl;
7479     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
7480     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
7481     
7482     test_lock_obj.mutex_unlock();
7483     sleep(1);
7484     
7485     // unit_test [6] up_thread_client_respond_event thread run test (mutex unlock)
7486     std::cerr << "[6] up_thread_client_respond_event thread run test (mutex unlock)" << std::endl;
7487     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
7488     BOOST_CHECK(test_lock_obj.after_thread_id == test_id);
7489     
7490     BOOST_MESSAGE( "----- up_thread_client_respond_event test end -----" );
7491     
7492 }
7493
7494
7495 // down_thread_client_respond_event test
7496 // dwon_thread_client_respond_event test class
7497 class down_thread_client_respond_event_test_class : public module_event_map_test_base_class{
7498     public:
7499 //        down_thread_client_respond_event_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : module_event_map_test_base_class(vs,session_io){
7500 //        };
7501        down_thread_client_respond_event_test_class(
7502                                 l7vs::virtualservice_tcp& vs,
7503                                 boost::asio::io_service& session_io,
7504                                 l7vs::tcp_socket_option_info& set_socket_option,
7505                                 boost::asio::ip::tcp::endpoint listen_endpoint,
7506                                 bool ssl_mode,
7507                                 boost::asio::ssl::context& set_ssl_context,
7508                                 bool set_ssl_cache_flag,
7509                                 int set_ssl_handshake_time_out,
7510                                 l7vs::logger_implement_access* set_access_logger) : module_event_map_test_base_class(   vs,
7511                                                                                                    session_io,
7512                                                                                                    set_socket_option,
7513                                                                                                    listen_endpoint,
7514                                                                                                    ssl_mode,
7515                                                                                                    set_ssl_context,
7516                                                                                                    set_ssl_cache_flag,
7517                                                                                                    set_ssl_handshake_time_out,
7518                                                                                                    set_access_logger){};
7519
7520         
7521         ~down_thread_client_respond_event_test_class(){};
7522         
7523         void test_call(){
7524             l7vs::tcp_session::down_thread_client_respond_event(LOCAL_PROC);
7525         };
7526 };
7527
7528 void down_thread_client_respond_event_test(){
7529     
7530     BOOST_MESSAGE( "----- down_thread_client_respond_event test start -----" );
7531     
7532 //    boost::asio::io_service io;
7533 //    l7vs::virtualservice_tcp vs;    
7534 //    down_thread_client_respond_event_test_class test_obj(vs,io);
7535     l7vs::virtualservice_tcp vs;
7536     boost::asio::io_service io;
7537     l7vs::tcp_socket_option_info set_option;
7538     //! TCP_NODELAY   (false:not set,true:set option)
7539     set_option.nodelay_opt = false;
7540     //! TCP_NODELAY option value  (false:off,true:on)
7541     set_option.nodelay_val = false;
7542     //! TCP_CORK      (false:not set,true:set option)
7543     set_option.cork_opt = false;
7544     //! TCP_CORK option value     (false:off,true:on)
7545     set_option.cork_val = false;
7546     //! TCP_QUICKACK  (false:not set,true:set option)
7547     set_option.quickack_opt = false;
7548     //! TCP_QUICKACK option value (false:off,true:on)
7549     set_option.quickack_val = false;
7550     //
7551     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
7552     bool set_mode(false);
7553     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
7554     bool set_ssl_cache_flag(false);
7555     int set_ssl_handshake_time_out = 0;
7556     //std::string access_log_file_name = "test";
7557     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
7558
7559     down_thread_client_respond_event_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
7560
7561     
7562     std::string test_protocol_name("test protocol");
7563     l7vs::test_protocol_module proto_test(test_protocol_name);
7564
7565     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
7566     
7567     l7vs::protocol_module_base::EVENT_TAG chek_event[7];
7568     chek_event[0] = l7vs::protocol_module_base::CLIENT_DISCONNECT;
7569     chek_event[1] = l7vs::protocol_module_base::CLIENT_CONNECTION_CHECK;
7570     chek_event[2] = l7vs::protocol_module_base::REALSERVER_RECV;
7571     chek_event[3] = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
7572     chek_event[4] = l7vs::protocol_module_base::SORRYSERVER_RECV;
7573     chek_event[5] = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
7574     chek_event[6] = l7vs::protocol_module_base::FINALIZE;
7575     
7576     // unit_test [1] down_thread_client_respond_event down_thread_next_call_function update check
7577     std::cerr << "[1] down_thread_client_respond_event down_thread_next_call_function update check" << std::endl;
7578     for(int i = 0; i < 7;i++){
7579         proto_test.handle_response_send_inform_res_tag = chek_event[i];
7580         test_obj.test_call();
7581         BOOST_CHECK(test_obj.chk_down_thread_next_call_function(chek_event[i]));
7582     }
7583     
7584     // unit_test [2] down_thread_client_respond_event module parameter check thread id
7585     std::cerr << "[2] down_thread_client_respond_event module parameter check thread id" << std::endl;
7586     boost::thread::id def_id;
7587     boost::thread::id proc_id = boost::this_thread::get_id();
7588     test_obj.set_down_thread_id(proc_id);
7589     proto_test.handle_response_send_inform_thread_id = def_id;    
7590     proto_test.handle_response_send_inform_res_tag = l7vs::protocol_module_base::FINALIZE;
7591     BOOST_CHECK(proto_test.handle_response_send_inform_thread_id != proc_id);
7592     test_obj.test_call();
7593     BOOST_CHECK(proto_test.handle_response_send_inform_thread_id == proc_id);
7594     
7595     // unit_test [3] down_thread_client_respond_event not fond function error check
7596     std::cerr << "[3] down_thread_client_respond_event not fond function error check" << std::endl;
7597     test_obj.down_thread_function_array_clear();
7598     proto_test.handle_response_send_inform_res_tag = l7vs::protocol_module_base::FINALIZE;
7599     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
7600     l7vs::Logger::putLogError_id = 0;
7601     test_obj.test_call();
7602     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
7603     BOOST_CHECK_EQUAL(81,l7vs::Logger::putLogError_id);
7604     std::cerr << l7vs::Logger::putLogError_message << std::endl;
7605     
7606     // unit_test [4] down_thread_client_respond_event returnd illegal EVENT_TAG error check
7607     std::cerr << "[4] down_thread_client_respond_event returnd illegal EVENT_TAG error check" << std::endl;
7608     test_obj.down_thread_module_event_map_clear();
7609     proto_test.handle_response_send_inform_res_tag = l7vs::protocol_module_base::FINALIZE;
7610     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
7611     l7vs::Logger::putLogError_id = 0;
7612     test_obj.test_call();
7613     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
7614     BOOST_CHECK_EQUAL(80,l7vs::Logger::putLogError_id);
7615     std::cerr << l7vs::Logger::putLogError_message << std::endl;
7616     
7617 //    mutex_lock_test test_lock_obj(vs,io);
7618     mutex_lock_test test_lock_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
7619     test_lock_obj.set_down_thread_client_respond_event_test();
7620     test_lock_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
7621     
7622     test_lock_obj.test_thread_wait.lock();
7623     test_lock_obj.befor_thread_id = proc_id;
7624     test_lock_obj.after_thread_id = proc_id;
7625     test_lock_obj.mutex_lock();
7626     
7627     boost::thread test_thread(boost::bind(&mutex_lock_test::test_run,&test_lock_obj));
7628     
7629     BOOST_CHECK(test_lock_obj.befor_thread_id == proc_id);
7630     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
7631     
7632     boost::thread::id test_id = test_thread.get_id();
7633     
7634     BOOST_CHECK(test_id != proc_id);
7635     
7636     // test start
7637     test_lock_obj.test_thread_wait.unlock();
7638     sleep(1);
7639     
7640     // unit_test [5] down_thread_client_respond_event thread block test (mutex lock)
7641     std::cerr << "[5] down_thread_client_respond_event thread block test (mutex lock)" << std::endl;
7642     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
7643     BOOST_CHECK(test_lock_obj.after_thread_id == proc_id);
7644     
7645     test_lock_obj.mutex_unlock();
7646     sleep(1);
7647     
7648     // unit_test [6] down_thread_client_respond_event thread run test (mutex unlock)
7649     std::cerr << "[6] down_thread_client_respond_event thread run test (mutex unlock)" << std::endl;
7650     BOOST_CHECK(test_lock_obj.befor_thread_id == test_id);
7651     BOOST_CHECK(test_lock_obj.after_thread_id == test_id);
7652     
7653     BOOST_MESSAGE( "----- down_thread_client_respond_event test end -----" );
7654 }
7655
7656
7657 // up_thread_all_socket_close test
7658 // up_thread_all_socket_close test class
7659 class up_thread_all_socket_close_test_class : public l7vs::tcp_session{
7660     public:
7661 //        up_thread_all_socket_close_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){
7662 //        };
7663        up_thread_all_socket_close_test_class(
7664                                 l7vs::virtualservice_tcp& vs,
7665                                 boost::asio::io_service& session_io,
7666                                 l7vs::tcp_socket_option_info& set_socket_option,
7667                                 boost::asio::ip::tcp::endpoint listen_endpoint,
7668                                 bool ssl_mode,
7669                                 boost::asio::ssl::context& set_ssl_context,
7670                                 bool set_ssl_cache_flag,
7671                                 int set_ssl_handshake_time_out,
7672                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
7673                                                                                                    session_io,
7674                                                                                                    set_socket_option,
7675                                                                                                    listen_endpoint,
7676                                                                                                    ssl_mode,
7677                                                                                                    set_ssl_context,
7678                                                                                                    set_ssl_cache_flag,
7679                                                                                                    set_ssl_handshake_time_out,
7680                                                                                                    set_access_logger){};
7681
7682         ~up_thread_all_socket_close_test_class(){};
7683         
7684         void test_call(){
7685             tcp_session::up_thread_all_socket_close();
7686         };
7687         
7688         l7vs::tcp_socket& get_client_socket(){
7689             return client_socket;
7690         };
7691         l7vs::tcp_ssl_socket& get_client_ssl_socket(){
7692             return client_ssl_socket;
7693         };
7694        
7695         boost::shared_ptr< l7vs::tcp_socket > get_sorry_socket(){
7696             return sorryserver_socket.second;
7697         };
7698         
7699         std::map<endpoint,tcp_socket_ptr>& get_up_thread_send_realserver_socket_map(){
7700             return up_thread_send_realserver_socket_map;
7701         };
7702         
7703         l7vs::tcp_realserver_connect_socket_list& get_down_thread_connect_socket_list(){
7704             return down_thread_connect_socket_list;
7705         }
7706 };
7707 void up_thread_all_socket_close_test(){
7708     BOOST_MESSAGE( "----- up_thread_all_socket_close test start -----" );
7709 //    boost::asio::io_service io;
7710 //    l7vs::virtualservice_tcp vs;
7711 //    up_thread_all_socket_close_test_class test_obj(vs,io);
7712     l7vs::virtualservice_tcp vs;
7713     boost::asio::io_service io;
7714     l7vs::tcp_socket_option_info set_option;
7715     //! TCP_NODELAY   (false:not set,true:set option)
7716     set_option.nodelay_opt = false;
7717     //! TCP_NODELAY option value  (false:off,true:on)
7718     set_option.nodelay_val = false;
7719     //! TCP_CORK      (false:not set,true:set option)
7720     set_option.cork_opt = false;
7721     //! TCP_CORK option value     (false:off,true:on)
7722     set_option.cork_val = false;
7723     //! TCP_QUICKACK  (false:not set,true:set option)
7724     set_option.quickack_opt = false;
7725     //! TCP_QUICKACK option value (false:off,true:on)
7726     set_option.quickack_val = false;
7727     //
7728     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
7729     bool set_mode(false);
7730     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
7731     bool set_ssl_cache_flag(false);
7732     int set_ssl_handshake_time_out = 0;
7733     //std::string access_log_file_name = "test";
7734     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
7735
7736     up_thread_all_socket_close_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
7737
7738
7739     l7vs::tcp_socket& client_socket = test_obj.get_client_socket();
7740     client_socket.close_call_check = false;
7741     l7vs::tcp_socket& sorry_socket = *(test_obj.get_sorry_socket());
7742     sorry_socket.close_call_check = false;
7743     std::map< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > >& up_thread_send_realserver_socket_map = test_obj.get_up_thread_send_realserver_socket_map();
7744     std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > pair_socket;
7745     std::list< std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > > rs_socket_list;
7746     std::list< std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > >::iterator rs_list_it;
7747     pair_socket.first.address(boost::asio::ip::address::from_string(DUMMY_SERVER_IP));
7748     vs.connection_inactive_list.clear();
7749     std::list<boost::asio::ip::tcp::endpoint>::iterator inact_list_it;
7750     l7vs::tcp_realserver_connect_socket_list& connect_socket_list = test_obj.get_down_thread_connect_socket_list();
7751     
7752     for(int i = 0; i < 1024;i++){
7753         pair_socket.first.port(i);
7754         boost::shared_ptr< l7vs::tcp_socket > new_socket(new l7vs::tcp_socket(io));
7755         pair_socket.second = new_socket;
7756         new_socket->close_call_check = false;
7757         new_socket->close_res = true;
7758         rs_socket_list.push_back(pair_socket);
7759         up_thread_send_realserver_socket_map.insert(pair_socket);
7760         connect_socket_list.push_back(pair_socket);
7761     }
7762     BOOST_CHECK(!up_thread_send_realserver_socket_map.empty());
7763     BOOST_CHECK(!connect_socket_list.empty());
7764     BOOST_CHECK(!rs_socket_list.empty());
7765     
7766     test_obj.test_call();
7767     
7768     // unit_test [1] up_thread_all_socket_close realserver socket close call check
7769     std::cerr << "[1] up_thread_all_socket_close realserver socket close call check" << std::endl;
7770     rs_list_it = rs_socket_list.begin();
7771     for(int i = 0; i < 1024;i++){
7772         BOOST_CHECK(rs_list_it->second->close_call_check);
7773         rs_list_it++;
7774     }
7775     
7776     // unit_test [2] up_thread_all_socket_close parent virtual service connection incactive call check
7777     std::cerr << "[2] up_thread_all_socket_close parent virtual service connection incactive call check" << std::endl;
7778     rs_list_it = rs_socket_list.begin();
7779     for(int i = 0; i < 1024;i++){
7780         inact_list_it = vs.connection_inactive_list.begin();
7781         while(inact_list_it != vs.connection_inactive_list.end()){
7782             if(*inact_list_it == rs_list_it->first)
7783                 break;
7784             inact_list_it++;
7785         }
7786         BOOST_CHECK(inact_list_it != vs.connection_inactive_list.end());
7787         vs.connection_inactive_list.erase(inact_list_it);
7788         rs_list_it++;
7789     }
7790     BOOST_CHECK(vs.connection_inactive_list.empty());
7791     
7792     // unit_test [3] up_thread_all_socket_close realserver send socket map clear check
7793     std::cerr << "[3] up_thread_all_socket_close realserver send socket map clear check" << std::endl;
7794     BOOST_CHECK(up_thread_send_realserver_socket_map.empty());
7795     
7796     // unit_test [4] up_thread_all_socket_close down thread connect socket list clear check
7797     std::cerr << "[4] up_thread_all_socket_close down thread connect socket list clear check" << std::endl;
7798     BOOST_CHECK(connect_socket_list.empty());
7799     
7800     // unit_test [5] up_thread_all_socket_close client socket close call check
7801     std::cerr << "[5] up_thread_all_socket_close client socket close call check" << std::endl;
7802     BOOST_CHECK(client_socket.close_call_check);
7803     
7804     // unit_test [6] up_thread_all_socket_close sorry socket close call check
7805     std::cerr << "[6] up_thread_all_socket_close sorry socket close call check" << std::endl;
7806     BOOST_CHECK(sorry_socket.close_call_check);
7807     
7808     
7809     rs_list_it = rs_socket_list.begin();
7810     for(int i = 0; i < 1024;i++){
7811         rs_list_it->second->close_res = false;
7812         up_thread_send_realserver_socket_map.insert(*rs_list_it);
7813         rs_list_it++;
7814     }
7815     
7816     test_obj.test_call();
7817
7818     // unit_test [7] up_thread_all_socket_close closed socket parent virtual service connection incactive not call check
7819     std::cerr << "[7] up_thread_all_socket_close closed socket parent virtual service connection incactive not call check" << std::endl;
7820     BOOST_CHECK(vs.connection_inactive_list.empty());
7821
7822     // SSL mode test
7823     up_thread_all_socket_close_test_class ssl_test_obj(vs,io,set_option,listen_endpoint,true,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
7824     l7vs::tcp_ssl_socket& client_ssl_socket = ssl_test_obj.get_client_ssl_socket();
7825     client_ssl_socket.close_call_check = false;
7826
7827     ssl_test_obj.test_call();
7828
7829     // unit_test [8] up_thread_all_socket_close client ssl socket close call check
7830     std::cerr << "[8] up_thread_all_socket_close client ssl socket close call check" << std::endl;
7831     BOOST_CHECK(client_ssl_socket.close_call_check);
7832     
7833     BOOST_MESSAGE( "----- up_thread_all_socket_close test end -----" );
7834 }
7835
7836 // down_thread_all_socket_close test
7837 // down_thread_all_socket_close test class
7838 class down_thread_all_socket_close_test_class : public l7vs::tcp_session{
7839     public:
7840 //        down_thread_all_socket_close_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){
7841 //        };
7842        down_thread_all_socket_close_test_class(
7843                                 l7vs::virtualservice_tcp& vs,
7844                                 boost::asio::io_service& session_io,
7845                                 l7vs::tcp_socket_option_info& set_socket_option,
7846                                 boost::asio::ip::tcp::endpoint listen_endpoint,
7847                                 bool ssl_mode,
7848                                 boost::asio::ssl::context& set_ssl_context,
7849                                 bool set_ssl_cache_flag,
7850                                 int set_ssl_handshake_time_out,
7851                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
7852                                                                                                    session_io,
7853                                                                                                    set_socket_option,
7854                                                                                                    listen_endpoint,
7855                                                                                                    ssl_mode,
7856                                                                                                    set_ssl_context,
7857                                                                                                    set_ssl_cache_flag,
7858                                                                                                    set_ssl_handshake_time_out,
7859                                                                                                    set_access_logger){};
7860
7861         ~down_thread_all_socket_close_test_class(){};
7862         void test_call(){
7863             tcp_session::down_thread_all_socket_close();
7864         };
7865         l7vs::tcp_socket& get_client_socket(){
7866             return client_socket;
7867         };
7868         l7vs::tcp_ssl_socket& get_client_ssl_socket(){
7869             return client_ssl_socket;
7870         };
7871         boost::shared_ptr< l7vs::tcp_socket > get_sorry_socket(){
7872             return sorryserver_socket.second;
7873         };
7874         std::list<socket_element>& get_down_thread_receive_realserver_socket_list(){
7875             return down_thread_receive_realserver_socket_list;
7876         };
7877 };
7878 void down_thread_all_socket_close_test(){
7879     BOOST_MESSAGE( "----- down_thread_all_socket_close test start -----" );
7880 //    boost::asio::io_service io;
7881 //    l7vs::virtualservice_tcp vs;
7882 //    down_thread_all_socket_close_test_class test_obj(vs,io);
7883     l7vs::virtualservice_tcp vs;
7884     boost::asio::io_service io;
7885     l7vs::tcp_socket_option_info set_option;
7886     //! TCP_NODELAY   (false:not set,true:set option)
7887     set_option.nodelay_opt = false;
7888     //! TCP_NODELAY option value  (false:off,true:on)
7889     set_option.nodelay_val = false;
7890     //! TCP_CORK      (false:not set,true:set option)
7891     set_option.cork_opt = false;
7892     //! TCP_CORK option value     (false:off,true:on)
7893     set_option.cork_val = false;
7894     //! TCP_QUICKACK  (false:not set,true:set option)
7895     set_option.quickack_opt = false;
7896     //! TCP_QUICKACK option value (false:off,true:on)
7897     set_option.quickack_val = false;
7898     //
7899     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
7900     bool set_mode(false);
7901     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
7902     bool set_ssl_cache_flag(false);
7903     int set_ssl_handshake_time_out = 0;
7904     //std::string access_log_file_name = "test";
7905     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
7906
7907     down_thread_all_socket_close_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
7908
7909
7910
7911     l7vs::tcp_socket& client_socket = test_obj.get_client_socket();
7912     client_socket.close_call_check = false;
7913     l7vs::tcp_socket& sorry_socket = *(test_obj.get_sorry_socket());
7914     sorry_socket.close_call_check = false;
7915     std::list< std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > >& down_thread_receive_realserver_socket_list = test_obj.get_down_thread_receive_realserver_socket_list();
7916     std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > pair_socket;
7917     std::list< std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > > rs_socket_list;
7918     std::list< std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > >::iterator rs_list_it;
7919     pair_socket.first.address(boost::asio::ip::address::from_string(DUMMY_SERVER_IP));
7920     vs.connection_inactive_list.clear();
7921     std::list<boost::asio::ip::tcp::endpoint>::iterator inact_list_it;
7922     
7923     for(int i = 0; i < 1024;i++){
7924         pair_socket.first.port(i);
7925         boost::shared_ptr< l7vs::tcp_socket > new_socket(new l7vs::tcp_socket(io));
7926         pair_socket.second = new_socket;
7927         new_socket->close_call_check = false;
7928         new_socket->close_res = true;
7929         rs_socket_list.push_back(pair_socket);
7930         down_thread_receive_realserver_socket_list.push_back(pair_socket);
7931     }
7932     BOOST_CHECK(!down_thread_receive_realserver_socket_list.empty());
7933     BOOST_CHECK(!rs_socket_list.empty());
7934     
7935     test_obj.test_call();
7936     
7937     // unit_test [1] down_thread_all_socket_close realserver socket close call check
7938     std::cerr << "[1] down_thread_all_socket_close realserver socket close call check" << std::endl;
7939     rs_list_it = rs_socket_list.begin();
7940     for(int i = 0; i < 1024;i++){
7941         BOOST_CHECK(rs_list_it->second->close_call_check);
7942         rs_list_it++;
7943     }
7944     
7945     // unit_test [2] down_thread_all_socket_close parent virtual service connection incactive call check
7946     std::cerr << "[2] down_thread_all_socket_close parent virtual service connection incactive call check" << std::endl;
7947     rs_list_it = rs_socket_list.begin();
7948     for(int i = 0; i < 1024;i++){
7949         inact_list_it = vs.connection_inactive_list.begin();
7950         while(inact_list_it != vs.connection_inactive_list.end()){
7951             if(*inact_list_it == rs_list_it->first)
7952                 break;
7953             inact_list_it++;
7954         }
7955         BOOST_CHECK(inact_list_it != vs.connection_inactive_list.end());
7956         vs.connection_inactive_list.erase(inact_list_it);
7957         rs_list_it++;
7958     }
7959     BOOST_CHECK(vs.connection_inactive_list.empty());
7960     
7961     // unit_test [3] down_thread_all_socket_close realserver receive socket list clear check
7962     std::cerr << "[3] down_thread_all_socket_close realserver receive socket list clear check" << std::endl;
7963     BOOST_CHECK(down_thread_receive_realserver_socket_list.empty());
7964     
7965     // unit_test [4] up_thread_all_socket_close client socket close call check
7966     std::cerr << "[4] up_thread_all_socket_close client socket close call check" << std::endl;
7967     BOOST_CHECK(client_socket.close_call_check);
7968     
7969     // unit_test [5] up_thread_all_socket_close sorry socket close call check
7970     std::cerr << "[5] up_thread_all_socket_close sorry socket close call check" << std::endl;
7971     BOOST_CHECK(sorry_socket.close_call_check);
7972     
7973     rs_list_it = rs_socket_list.begin();
7974     for(int i = 0; i < 1024;i++){
7975         rs_list_it->second->close_res = false;
7976         down_thread_receive_realserver_socket_list.push_back(*rs_list_it);
7977         rs_list_it++;
7978     }
7979     
7980     test_obj.test_call();
7981
7982     // unit_test [6] down_thread_all_socket_close closed socket parent virtual service connection incactive not call check
7983     std::cerr << "[6] down_thread_all_socket_close closed socket parent virtual service connection incactive not call check" << std::endl;
7984     BOOST_CHECK(vs.connection_inactive_list.empty());
7985
7986     // SSL mode test
7987     down_thread_all_socket_close_test_class ssl_test_obj(vs,io,set_option,listen_endpoint,true,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
7988     l7vs::tcp_ssl_socket& client_ssl_socket = ssl_test_obj.get_client_ssl_socket();
7989     client_ssl_socket.close_call_check = false;
7990
7991     ssl_test_obj.test_call();
7992
7993     // unit_test [7] up_thread_all_socket_close client ssl socket close call check
7994     std::cerr << "[7] up_thread_all_socket_close client ssl socket close call check" << std::endl;
7995     BOOST_CHECK(client_ssl_socket.close_call_check);
7996
7997     BOOST_MESSAGE( "----- down_thread_all_socket_close test end -----" );
7998 }
7999
8000 // up_thread_client_disconnect test
8001 // up_thread_client_disconnect test class
8002 class up_thread_client_disconnect : public l7vs::tcp_session{
8003     public:
8004 //        up_thread_client_disconnect(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){
8005 //        };
8006        up_thread_client_disconnect(
8007                                 l7vs::virtualservice_tcp& vs,
8008                                 boost::asio::io_service& session_io,
8009                                 l7vs::tcp_socket_option_info& set_socket_option,
8010                                 boost::asio::ip::tcp::endpoint listen_endpoint,
8011                                 bool ssl_mode,
8012                                 boost::asio::ssl::context& set_ssl_context,
8013                                 bool set_ssl_cache_flag,
8014                                 int set_ssl_handshake_time_out,
8015                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
8016                                                                                                    session_io,
8017                                                                                                    set_socket_option,
8018                                                                                                    listen_endpoint,
8019                                                                                                    ssl_mode,
8020                                                                                                    set_ssl_context,
8021                                                                                                    set_ssl_cache_flag,
8022                                                                                                    set_ssl_handshake_time_out,
8023                                                                                                    set_access_logger){};
8024
8025         ~up_thread_client_disconnect(){};
8026         
8027         void test_call(){
8028             l7vs::tcp_session::up_thread_client_disconnect(LOCAL_PROC);
8029         };
8030         
8031         l7vs::lockfree_queue<l7vs::tcp_thread_message>&    get_up_thread_message_que(){
8032             return up_thread_message_que;
8033         };
8034
8035         l7vs::lockfree_queue<l7vs::tcp_thread_message>&    get_down_thread_message_que(){
8036             return down_thread_message_que;
8037         };
8038         
8039         void up_thread_function_array_clear(){
8040             for(int i = 0;i <= UP_FUNC_EXIT;i++){
8041                 up_thread_function_array[i].second = NULL;
8042             }
8043         };
8044         void up_thread_message_down_thread_function_map_clear(){
8045             up_thread_message_down_thread_function_map.clear();
8046         };
8047         
8048         void up_thread_client_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){
8049             up_thread_client_disconnect_event_call_chek = true;
8050         };
8051         bool up_thread_client_disconnect_event_call_chek;
8052         
8053         void down_thread_client_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){
8054             down_thread_client_disconnect_event_call_chek = true;
8055         };
8056         bool down_thread_client_disconnect_event_call_chek;
8057         
8058         void up_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
8059             up_thread_exit_call_chek = true;
8060         };
8061         bool up_thread_exit_call_chek;
8062         
8063         l7vs::tcp_socket& get_client_socket(){
8064             return client_socket;
8065         };
8066         l7vs::tcp_ssl_socket& get_client_ssl_socket(){
8067             return client_ssl_socket;
8068         };
8069
8070 };
8071 void up_thread_client_disconnect_test(){
8072     BOOST_MESSAGE( "----- up_thread_client_disconnect test start -----" );
8073 //    boost::asio::io_service io;
8074 //    l7vs::virtualservice_tcp vs;
8075 //    up_thread_client_disconnect test_obj(vs,io);
8076     l7vs::virtualservice_tcp vs;
8077     boost::asio::io_service io;
8078     l7vs::tcp_socket_option_info set_option;
8079     //! TCP_NODELAY   (false:not set,true:set option)
8080     set_option.nodelay_opt = false;
8081     //! TCP_NODELAY option value  (false:off,true:on)
8082     set_option.nodelay_val = false;
8083     //! TCP_CORK      (false:not set,true:set option)
8084     set_option.cork_opt = false;
8085     //! TCP_CORK option value     (false:off,true:on)
8086     set_option.cork_val = false;
8087     //! TCP_QUICKACK  (false:not set,true:set option)
8088     set_option.quickack_opt = false;
8089     //! TCP_QUICKACK option value (false:off,true:on)
8090     set_option.quickack_val = false;
8091     //
8092     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
8093     bool set_mode(false);
8094     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
8095     bool set_ssl_cache_flag(false);
8096     int set_ssl_handshake_time_out = 0;
8097     //std::string access_log_file_name = "test";
8098     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
8099
8100     up_thread_client_disconnect test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
8101
8102     
8103     l7vs::lockfree_queue<l7vs::tcp_thread_message>&        up_thread_message_que    = test_obj.get_up_thread_message_que();
8104     l7vs::lockfree_queue<l7vs::tcp_thread_message>&        down_thread_message_que    = test_obj.get_down_thread_message_que();
8105     
8106     BOOST_CHECK(up_thread_message_que.empty());
8107     BOOST_CHECK(down_thread_message_que.empty());
8108     l7vs::tcp_socket& client_socket = test_obj.get_client_socket();
8109     client_socket.close_res = true;
8110     client_socket.close_call_check = false;
8111     
8112     test_obj.test_call();
8113     
8114     // unit_test [1] up_thread_client_disconnect client socket close call check
8115     std::cerr << "[1] up_thread_client_disconnect client socket close call check" << std::endl;
8116     BOOST_CHECK(client_socket.close_call_check);
8117     
8118     // unit_test [2] up_thread_client_disconnect up thread message set check
8119     std::cerr << "[2] up_thread_client_disconnect up thread message set check" << std::endl;
8120     BOOST_CHECK(!up_thread_message_que.empty());
8121     l7vs::tcp_thread_message*    up_msg        = up_thread_message_que.pop();
8122     BOOST_CHECK(up_thread_message_que.empty());
8123     test_obj.up_thread_client_disconnect_event_call_chek = false;
8124     up_msg->message(l7vs::tcp_session::MESSAGE_PROC);
8125     BOOST_CHECK(test_obj.up_thread_client_disconnect_event_call_chek);
8126     delete    up_msg;
8127
8128     // unit_test [3] up_thread_client_disconnect down thread message set check
8129     std::cerr << "[3] up_thread_client_disconnect down thread message set check" << std::endl;
8130     BOOST_CHECK(!down_thread_message_que.empty());
8131     l7vs::tcp_thread_message*    down_msg    = down_thread_message_que.pop();
8132     BOOST_CHECK(down_thread_message_que.empty());
8133     test_obj.down_thread_client_disconnect_event_call_chek = false;
8134     down_msg->message(l7vs::tcp_session::MESSAGE_PROC);
8135     BOOST_CHECK(test_obj.down_thread_client_disconnect_event_call_chek);
8136     delete    down_msg;
8137
8138     // unit_test [4] up_thread_client_disconnect closed client socket not set message check
8139     std::cerr << "[4] up_thread_client_disconnect closed client socket not set message check" << std::endl;
8140     client_socket.close_res = false;
8141     test_obj.test_call();
8142     BOOST_CHECK(up_thread_message_que.empty());
8143     BOOST_CHECK(down_thread_message_que.empty());
8144     
8145     client_socket.close_res = true;
8146     
8147     // unit_test [5] up_thread_client_disconnect not fond down_thread_client_disconnect_event function error check
8148     std::cerr << "[5] up_thread_client_disconnect not fond down_thread_client_disconnect_event function error check" << std::endl;
8149     test_obj.up_thread_message_down_thread_function_map_clear();
8150     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
8151     l7vs::Logger::putLogError_id = 0;
8152     test_obj.up_thread_exit_call_chek = false;
8153     test_obj.test_call();
8154     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
8155     BOOST_CHECK_EQUAL(27,l7vs::Logger::putLogError_id);
8156     std::cerr << l7vs::Logger::putLogError_message << std::endl;
8157     BOOST_CHECK(test_obj.up_thread_exit_call_chek);
8158     
8159     // unit_test [6] up_thread_client_disconnect not fond up_thread_client_disconnect_event function error check
8160     std::cerr << "[6] up_thread_client_disconnect not fond up_thread_client_disconnect_event function error check" << std::endl;
8161     test_obj.up_thread_function_array_clear();
8162     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
8163     l7vs::Logger::putLogError_id = 0;
8164     test_obj.up_thread_exit_call_chek = false;
8165     test_obj.test_call();
8166     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
8167     BOOST_CHECK_EQUAL(26,l7vs::Logger::putLogError_id);
8168     std::cerr << l7vs::Logger::putLogError_message << std::endl;
8169     BOOST_CHECK(test_obj.up_thread_exit_call_chek);
8170
8171     // ----SSL Mode Test
8172     up_thread_client_disconnect ssl_test_obj(vs,io,set_option,listen_endpoint,true,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
8173
8174     l7vs::tcp_ssl_socket& client_ssl_socket = ssl_test_obj.get_client_ssl_socket();
8175     client_ssl_socket.close_res = true;
8176     client_ssl_socket.close_call_check = false;
8177     
8178     ssl_test_obj.test_call();
8179     
8180     // unit_test [7] up_thread_client_disconnect client ssl socket close call check
8181     std::cerr << "[7] up_thread_client_disconnect client ssl socket close call check" << std::endl;
8182     BOOST_CHECK(client_ssl_socket.close_call_check);
8183
8184     
8185     BOOST_MESSAGE( "----- up_thread_client_disconnect test end -----" );
8186 }
8187
8188
8189
8190 // down_thread_client_disconnect test
8191 // down_thread_client_disconnect test class
8192 class down_thread_client_disconnect_test_class : public l7vs::tcp_session{
8193     public:
8194 //        down_thread_client_disconnect_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){
8195 //        };
8196        down_thread_client_disconnect_test_class(
8197                                 l7vs::virtualservice_tcp& vs,
8198                                 boost::asio::io_service& session_io,
8199                                 l7vs::tcp_socket_option_info& set_socket_option,
8200                                 boost::asio::ip::tcp::endpoint listen_endpoint,
8201                                 bool ssl_mode,
8202                                 boost::asio::ssl::context& set_ssl_context,
8203                                 bool set_ssl_cache_flag,
8204                                 int set_ssl_handshake_time_out,
8205                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
8206                                                                                                    session_io,
8207                                                                                                    set_socket_option,
8208                                                                                                    listen_endpoint,
8209                                                                                                    ssl_mode,
8210                                                                                                    set_ssl_context,
8211                                                                                                    set_ssl_cache_flag,
8212                                                                                                    set_ssl_handshake_time_out,
8213                                                                                                    set_access_logger){};
8214
8215         ~down_thread_client_disconnect_test_class(){};
8216         
8217         void test_call(){
8218             l7vs::tcp_session::down_thread_client_disconnect(LOCAL_PROC);
8219         };
8220         
8221         l7vs::lockfree_queue<l7vs::tcp_thread_message>& get_up_thread_message_que(){
8222             return up_thread_message_que;
8223         };
8224
8225         l7vs::lockfree_queue<l7vs::tcp_thread_message>& get_down_thread_message_que(){
8226             return down_thread_message_que;
8227         };
8228         
8229         void down_thread_function_array_clear(){
8230             for(int i = 0; i <= DOWN_FUNC_EXIT; i++){
8231                 down_thread_function_array[i].second = NULL;
8232             }
8233         };
8234         void down_thread_message_up_thread_function_map_clear(){
8235             down_thread_message_up_thread_function_map.clear();
8236         };
8237         
8238         void up_thread_client_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){
8239             up_thread_client_disconnect_event_call_chek = true;
8240         };
8241         bool up_thread_client_disconnect_event_call_chek;
8242         
8243         void down_thread_client_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){
8244             down_thread_client_disconnect_event_call_chek = true;
8245         };
8246         bool down_thread_client_disconnect_event_call_chek;
8247         
8248         void down_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
8249             down_thread_exit_call_chek = true;
8250         };
8251         bool down_thread_exit_call_chek;
8252         
8253         l7vs::tcp_socket& get_client_socket(){
8254             return client_socket;
8255         };
8256         l7vs::tcp_ssl_socket& get_client_ssl_socket(){
8257             return client_ssl_socket;
8258         };
8259 };
8260 void down_thread_client_disconnect_test(){
8261     BOOST_MESSAGE( "----- down_thread_client_disconnect test start -----" );
8262 //    boost::asio::io_service io;
8263 //    l7vs::virtualservice_tcp vs;
8264 //    down_thread_client_disconnect_test_class test_obj(vs,io);
8265     l7vs::virtualservice_tcp vs;
8266     boost::asio::io_service io;
8267     l7vs::tcp_socket_option_info set_option;
8268     //! TCP_NODELAY   (false:not set,true:set option)
8269     set_option.nodelay_opt = false;
8270     //! TCP_NODELAY option value  (false:off,true:on)
8271     set_option.nodelay_val = false;
8272     //! TCP_CORK      (false:not set,true:set option)
8273     set_option.cork_opt = false;
8274     //! TCP_CORK option value     (false:off,true:on)
8275     set_option.cork_val = false;
8276     //! TCP_QUICKACK  (false:not set,true:set option)
8277     set_option.quickack_opt = false;
8278     //! TCP_QUICKACK option value (false:off,true:on)
8279     set_option.quickack_val = false;
8280     //
8281     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
8282     bool set_mode(false);
8283     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
8284     bool set_ssl_cache_flag(false);
8285     int set_ssl_handshake_time_out = 0;
8286     //std::string access_log_file_name = "test";
8287     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
8288
8289     down_thread_client_disconnect_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
8290
8291     l7vs::lockfree_queue<l7vs::tcp_thread_message>&        up_thread_message_que    = test_obj.get_up_thread_message_que();
8292     l7vs::lockfree_queue<l7vs::tcp_thread_message>&        down_thread_message_que    = test_obj.get_down_thread_message_que();
8293     
8294     BOOST_CHECK(up_thread_message_que.empty());
8295     BOOST_CHECK(down_thread_message_que.empty());
8296     l7vs::tcp_socket& client_socket = test_obj.get_client_socket();
8297     client_socket.close_res = true;
8298     client_socket.close_call_check = false;
8299     
8300     test_obj.test_call();
8301     
8302     // unit_test [1] down_thread_client_disconnect client socket close call check
8303     std::cerr << "[1] down_thread_client_disconnect client socket close call check" << std::endl;
8304     BOOST_CHECK(client_socket.close_call_check);
8305     
8306     // unit_test [2] down_thread_client_disconnect up thread message set check
8307     std::cerr << "[2] down_thread_client_disconnect up thread message set check" << std::endl;
8308     BOOST_CHECK(!up_thread_message_que.empty());
8309     l7vs::tcp_thread_message*    up_msg        = up_thread_message_que.pop();
8310     BOOST_CHECK(up_thread_message_que.empty());
8311     test_obj.up_thread_client_disconnect_event_call_chek = false;
8312     up_msg->message(l7vs::tcp_session::MESSAGE_PROC);
8313     BOOST_CHECK(test_obj.up_thread_client_disconnect_event_call_chek);
8314     delete    up_msg;
8315
8316     // unit_test [3] down_thread_client_disconnect down thread message set check
8317     std::cerr << "[3] down_thread_client_disconnect down thread message set check" << std::endl;
8318     BOOST_CHECK(!down_thread_message_que.empty());
8319     l7vs::tcp_thread_message*    down_msg    = down_thread_message_que.pop();
8320     BOOST_CHECK(down_thread_message_que.empty());
8321     test_obj.down_thread_client_disconnect_event_call_chek = false;
8322     down_msg->message(l7vs::tcp_session::MESSAGE_PROC);
8323     BOOST_CHECK(test_obj.down_thread_client_disconnect_event_call_chek);
8324     delete    down_msg;
8325
8326     // unit_test [4] down_thread_client_disconnect closed client socket not set message check
8327     std::cerr << "[4] down_thread_client_disconnect closed client socket not set message check" << std::endl;
8328     client_socket.close_res = false;
8329     test_obj.test_call();
8330     BOOST_CHECK(up_thread_message_que.empty());
8331     BOOST_CHECK(down_thread_message_que.empty());
8332     
8333     client_socket.close_res = true;
8334     
8335     // unit_test [5] down_thread_client_disconnect not fond up_thread_client_disconnect_event function error check
8336     std::cerr << "[5] down_thread_client_disconnect not fond up_thread_client_disconnect_event function error check" << std::endl;
8337     test_obj.down_thread_message_up_thread_function_map_clear();
8338     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
8339     l7vs::Logger::putLogError_id = 0;
8340     test_obj.down_thread_exit_call_chek = false;
8341     test_obj.test_call();
8342     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
8343     BOOST_CHECK_EQUAL(85,l7vs::Logger::putLogError_id);
8344     std::cerr << l7vs::Logger::putLogError_message << std::endl;
8345     BOOST_CHECK(test_obj.down_thread_exit_call_chek);
8346     
8347     // unit_test [6] down_thread_client_disconnect not fond down_thread_client_disconnect_event function error check
8348     std::cerr << "[6] down_thread_client_disconnect not fond down_thread_client_disconnect_event function error check" << std::endl;
8349     test_obj.down_thread_function_array_clear();
8350     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
8351     l7vs::Logger::putLogError_id = 0;
8352     test_obj.down_thread_exit_call_chek = false;
8353     test_obj.test_call();
8354     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
8355     BOOST_CHECK_EQUAL(84,l7vs::Logger::putLogError_id);
8356     std::cerr << l7vs::Logger::putLogError_message << std::endl;
8357     BOOST_CHECK(test_obj.down_thread_exit_call_chek);
8358     
8359
8360     // ----SSL Mode Test
8361     down_thread_client_disconnect_test_class ssl_test_obj(vs,io,set_option,listen_endpoint,true,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
8362
8363     l7vs::tcp_ssl_socket& client_ssl_socket = ssl_test_obj.get_client_ssl_socket();
8364     client_ssl_socket.close_res = true;
8365     client_ssl_socket.close_call_check = false;
8366     
8367     ssl_test_obj.test_call();
8368     
8369     // unit_test [7] down_thread_client_disconnect client ssl socket close call check
8370     std::cerr << "[7] down_thread_client_disconnect client ssl socket close call check" << std::endl;
8371     BOOST_CHECK(client_ssl_socket.close_call_check);
8372
8373
8374     BOOST_MESSAGE( "----- down_thread_client_disconnect test end -----" );
8375 }
8376
8377
8378 // up_thread_sorryserver_disconnect test
8379 // up_thread_sorryserver_disconnect test class
8380 class up_thread_sorryserver_disconnect_test_class : public l7vs::tcp_session{
8381     public:
8382 //        up_thread_sorryserver_disconnect_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){
8383 //        };
8384        up_thread_sorryserver_disconnect_test_class(
8385                                 l7vs::virtualservice_tcp& vs,
8386                                 boost::asio::io_service& session_io,
8387                                 l7vs::tcp_socket_option_info& set_socket_option,
8388                                 boost::asio::ip::tcp::endpoint listen_endpoint,
8389                                 bool ssl_mode,
8390                                 boost::asio::ssl::context& set_ssl_context,
8391                                 bool set_ssl_cache_flag,
8392                                 int set_ssl_handshake_time_out,
8393                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
8394                                                                                                    session_io,
8395                                                                                                    set_socket_option,
8396                                                                                                    listen_endpoint,
8397                                                                                                    ssl_mode,
8398                                                                                                    set_ssl_context,
8399                                                                                                    set_ssl_cache_flag,
8400                                                                                                    set_ssl_handshake_time_out,
8401                                                                                                    set_access_logger){};
8402
8403         ~up_thread_sorryserver_disconnect_test_class(){};
8404         
8405         void test_call(){
8406             l7vs::tcp_session::up_thread_sorryserver_disconnect(LOCAL_PROC);
8407         };
8408         
8409         l7vs::lockfree_queue<l7vs::tcp_thread_message>& get_up_thread_message_que(){
8410             return up_thread_message_que;
8411         };
8412
8413         l7vs::lockfree_queue<l7vs::tcp_thread_message>& get_down_thread_message_que(){
8414             return down_thread_message_que;
8415         };
8416         
8417         void up_thread_function_array_clear(){
8418             for(int i = 0;i <= UP_FUNC_EXIT;i++){
8419                 up_thread_function_array[i].second = NULL;
8420             }
8421         };
8422         void up_thread_message_down_thread_function_map_clear(){
8423             up_thread_message_down_thread_function_map.clear();
8424         };
8425         
8426         void up_thread_sorryserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){
8427             up_thread_sorryserver_disconnect_event_call_chek = true;
8428         };
8429         bool up_thread_sorryserver_disconnect_event_call_chek;
8430         
8431         void down_thread_sorryserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){
8432             down_thread_sorryserver_disconnect_event_call_chek = true;
8433         };
8434         bool down_thread_sorryserver_disconnect_event_call_chek;
8435         
8436         void up_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
8437             up_thread_exit_call_chek = true;
8438         };
8439         bool up_thread_exit_call_chek;
8440         
8441         boost::shared_ptr< l7vs::tcp_socket > get_sorry_socket(){
8442             return sorryserver_socket.second;
8443         };
8444         void set_sorry_endpoint(endpoint set_end){
8445             sorryserver_socket.first = set_end;
8446         }
8447 };
8448 void up_thread_sorryserver_disconnect_test(){
8449     BOOST_MESSAGE( "----- up_thread_sorryserver_disconnect test start -----" );
8450 //    boost::asio::io_service io;
8451 //    l7vs::virtualservice_tcp vs;
8452 //    up_thread_sorryserver_disconnect_test_class test_obj(vs,io);
8453     l7vs::virtualservice_tcp vs;
8454     boost::asio::io_service io;
8455     l7vs::tcp_socket_option_info set_option;
8456     //! TCP_NODELAY   (false:not set,true:set option)
8457     set_option.nodelay_opt = false;
8458     //! TCP_NODELAY option value  (false:off,true:on)
8459     set_option.nodelay_val = false;
8460     //! TCP_CORK      (false:not set,true:set option)
8461     set_option.cork_opt = false;
8462     //! TCP_CORK option value     (false:off,true:on)
8463     set_option.cork_val = false;
8464     //! TCP_QUICKACK  (false:not set,true:set option)
8465     set_option.quickack_opt = false;
8466     //! TCP_QUICKACK option value (false:off,true:on)
8467     set_option.quickack_val = false;
8468     //
8469     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
8470     bool set_mode(false);
8471     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
8472     bool set_ssl_cache_flag(false);
8473     int set_ssl_handshake_time_out = 0;
8474     //std::string access_log_file_name = "test";
8475     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
8476
8477     up_thread_sorryserver_disconnect_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
8478
8479
8480     
8481     l7vs::lockfree_queue<l7vs::tcp_thread_message>&        up_thread_message_que    = test_obj.get_up_thread_message_que();
8482     l7vs::lockfree_queue<l7vs::tcp_thread_message>&        down_thread_message_que    = test_obj.get_down_thread_message_que();
8483     
8484     BOOST_CHECK(up_thread_message_que.empty());
8485     BOOST_CHECK(down_thread_message_que.empty());
8486     l7vs::tcp_socket& sorry_socket = *(test_obj.get_sorry_socket());
8487     sorry_socket.close_res = true;
8488     sorry_socket.close_call_check = false;
8489     boost::asio::ip::tcp::endpoint sorry_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
8490     test_obj.set_sorry_endpoint(sorry_end);
8491     
8492     test_obj.test_call();
8493     
8494     // unit_test [1] up_thread_sorryserver_disconnect client socket close call check
8495     std::cerr << "[1] up_thread_sorryserver_disconnect client socket close call check" << std::endl;
8496     BOOST_CHECK(sorry_socket.close_call_check);
8497     
8498     // unit_test [2] up_thread_sorryserver_disconnect up thread message set check
8499     std::cerr << "[2] up_thread_sorryserver_disconnect up thread message set check" << std::endl;
8500     BOOST_CHECK(!up_thread_message_que.empty());
8501     l7vs::tcp_thread_message*    up_msg        = up_thread_message_que.pop();
8502     BOOST_CHECK(up_thread_message_que.empty());
8503     BOOST_CHECK(up_msg->endpoint_info == sorry_end);
8504     test_obj.up_thread_sorryserver_disconnect_event_call_chek = false;
8505     up_msg->message(l7vs::tcp_session::MESSAGE_PROC);
8506     BOOST_CHECK(test_obj.up_thread_sorryserver_disconnect_event_call_chek);
8507     delete    up_msg;
8508
8509     // unit_test [3] up_thread_sorryserver_disconnect down thread message set check
8510     std::cerr << "[3] up_thread_sorryserver_disconnect down thread message set check" << std::endl;
8511     BOOST_CHECK(!down_thread_message_que.empty());
8512     l7vs::tcp_thread_message*    down_msg    = down_thread_message_que.pop();
8513     BOOST_CHECK(down_thread_message_que.empty());
8514     BOOST_CHECK(down_msg->endpoint_info == sorry_end);
8515     test_obj.down_thread_sorryserver_disconnect_event_call_chek = false;
8516     down_msg->message(l7vs::tcp_session::MESSAGE_PROC);
8517     BOOST_CHECK(test_obj.down_thread_sorryserver_disconnect_event_call_chek);
8518     delete    down_msg;
8519
8520     // unit_test [4] up_thread_sorryserver_disconnect closed client socket not set message check
8521     std::cerr << "[4] up_thread_sorryserver_disconnect closed client socket not set message check" << std::endl;
8522     sorry_socket.close_res = false;
8523     test_obj.test_call();
8524     BOOST_CHECK(up_thread_message_que.empty());
8525     BOOST_CHECK(down_thread_message_que.empty());
8526     
8527     sorry_socket.close_res = true;
8528     
8529 /*
8530     // unit_test [5] up_thread_sorryserver_disconnect not fond down_thread_sorryserver_disconnect_event function error check
8531     std::cerr << "[5] up_thread_sorryserver_disconnect not fond down_thread_sorryserver_disconnect_event function error check" << std::endl;
8532     test_obj.up_thread_message_down_thread_function_map_clear();
8533     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
8534     l7vs::Logger::putLogError_id = 0;
8535     test_obj.up_thread_exit_call_chek = false;
8536     test_obj.test_call();
8537     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
8538     BOOST_CHECK_EQUAL(61,l7vs::Logger::putLogError_id);
8539     std::cerr << l7vs::Logger::putLogError_message << std::endl;
8540     BOOST_CHECK(test_obj.up_thread_exit_call_chek);
8541     
8542     // unit_test [6] up_thread_sorryserver_disconnect not fond up_thread_sorryserver_disconnect_event function error check
8543     std::cerr << "[6] up_thread_sorryserver_disconnect not fond up_thread_sorryserver_disconnect_event function error check" << std::endl;
8544     test_obj.up_thread_function_array_clear();
8545     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
8546     l7vs::Logger::putLogError_id = 0;
8547     test_obj.up_thread_exit_call_chek = false;
8548     test_obj.test_call();
8549     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
8550     BOOST_CHECK_EQUAL(60,l7vs::Logger::putLogError_id);
8551     std::cerr << l7vs::Logger::putLogError_message << std::endl;
8552     BOOST_CHECK(test_obj.up_thread_exit_call_chek);
8553 */
8554     
8555     BOOST_MESSAGE( "----- up_thread_sorryserver_disconnect test end -----" );
8556 }
8557
8558
8559 // down_thread_sorryserver_disconnect test
8560 // down_thread_sorryserver_disconnect test class
8561 class down_thread_sorryserver_disconnect_test_class : public l7vs::tcp_session{
8562     public:
8563 //        down_thread_sorryserver_disconnect_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){
8564 //        };
8565        down_thread_sorryserver_disconnect_test_class(
8566                                 l7vs::virtualservice_tcp& vs,
8567                                 boost::asio::io_service& session_io,
8568                                 l7vs::tcp_socket_option_info& set_socket_option,
8569                                 boost::asio::ip::tcp::endpoint listen_endpoint,
8570                                 bool ssl_mode,
8571                                 boost::asio::ssl::context& set_ssl_context,
8572                                 bool set_ssl_cache_flag,
8573                                 int set_ssl_handshake_time_out,
8574                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
8575                                                                                                    session_io,
8576                                                                                                    set_socket_option,
8577                                                                                                    listen_endpoint,
8578                                                                                                    ssl_mode,
8579                                                                                                    set_ssl_context,
8580                                                                                                    set_ssl_cache_flag,
8581                                                                                                    set_ssl_handshake_time_out,
8582                                                                                                    set_access_logger){};
8583
8584         ~down_thread_sorryserver_disconnect_test_class(){};
8585         
8586         void test_call(){
8587             l7vs::tcp_session::down_thread_sorryserver_disconnect(LOCAL_PROC);
8588         };
8589         
8590         l7vs::lockfree_queue<l7vs::tcp_thread_message>& get_up_thread_message_que(){
8591             return up_thread_message_que;
8592         };
8593
8594         l7vs::lockfree_queue<l7vs::tcp_thread_message>& get_down_thread_message_que(){
8595             return down_thread_message_que;
8596         };
8597         
8598         void down_thread_function_array_clear(){
8599             for(int i = 0; i <= DOWN_FUNC_EXIT;i++){
8600                 down_thread_function_array[i].second = NULL;
8601             }
8602         };
8603         void down_thread_message_up_thread_function_map_clear(){
8604             down_thread_message_up_thread_function_map.clear();
8605         };
8606         
8607         void up_thread_sorryserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){
8608             up_thread_sorryserver_disconnect_event_call_chek = true;
8609         };
8610         bool up_thread_sorryserver_disconnect_event_call_chek;
8611         
8612         void down_thread_sorryserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){
8613             down_thread_sorryserver_disconnect_event_call_chek = true;
8614         };
8615         bool down_thread_sorryserver_disconnect_event_call_chek;
8616         
8617         void down_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
8618             down_thread_exit_call_chek = true;
8619         };
8620         bool down_thread_exit_call_chek;
8621         
8622         boost::shared_ptr< l7vs::tcp_socket > get_sorry_socket(){
8623             return sorryserver_socket.second;
8624         };
8625         void set_sorry_endpoint(endpoint set_end){
8626             sorryserver_socket.first = set_end;
8627         }
8628 };
8629 void down_thread_sorryserver_disconnect_test(){
8630     BOOST_MESSAGE( "----- down_thread_sorryserver_disconnect test start -----" );
8631 //    boost::asio::io_service io;
8632 //    l7vs::virtualservice_tcp vs;
8633 //    down_thread_sorryserver_disconnect_test_class test_obj(vs,io);
8634     l7vs::virtualservice_tcp vs;
8635     boost::asio::io_service io;
8636     l7vs::tcp_socket_option_info set_option;
8637     //! TCP_NODELAY   (false:not set,true:set option)
8638     set_option.nodelay_opt = false;
8639     //! TCP_NODELAY option value  (false:off,true:on)
8640     set_option.nodelay_val = false;
8641     //! TCP_CORK      (false:not set,true:set option)
8642     set_option.cork_opt = false;
8643     //! TCP_CORK option value     (false:off,true:on)
8644     set_option.cork_val = false;
8645     //! TCP_QUICKACK  (false:not set,true:set option)
8646     set_option.quickack_opt = false;
8647     //! TCP_QUICKACK option value (false:off,true:on)
8648     set_option.quickack_val = false;
8649     //
8650     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
8651     bool set_mode(false);
8652     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
8653     bool set_ssl_cache_flag(false);
8654     int set_ssl_handshake_time_out = 0;
8655     //std::string access_log_file_name = "test";
8656     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
8657
8658     down_thread_sorryserver_disconnect_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
8659
8660     l7vs::lockfree_queue<l7vs::tcp_thread_message>& up_thread_message_que = test_obj.get_up_thread_message_que();
8661     l7vs::lockfree_queue<l7vs::tcp_thread_message>& down_thread_message_que = test_obj.get_down_thread_message_que();
8662     
8663     BOOST_CHECK(up_thread_message_que.empty());
8664     BOOST_CHECK(down_thread_message_que.empty());
8665     l7vs::tcp_socket& sorry_socket = *(test_obj.get_sorry_socket());
8666     sorry_socket.close_res = true;
8667     sorry_socket.close_call_check = false;
8668     boost::asio::ip::tcp::endpoint sorry_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
8669     test_obj.set_sorry_endpoint(sorry_end);
8670     
8671     test_obj.test_call();
8672     
8673     // unit_test [1] down_thread_sorryserver_disconnect client socket close call check
8674     std::cerr << "[1] down_thread_sorryserver_disconnect client socket close call check" << std::endl;
8675     BOOST_CHECK(sorry_socket.close_call_check);
8676     
8677     // unit_test [2] down_thread_sorryserver_disconnect up thread message set check
8678     std::cerr << "[2] down_thread_sorryserver_disconnect up thread message set check" << std::endl;
8679     BOOST_CHECK(!up_thread_message_que.empty());
8680     l7vs::tcp_thread_message*    up_msg        = up_thread_message_que.pop();
8681     BOOST_CHECK(up_thread_message_que.empty());
8682     BOOST_CHECK(up_msg->endpoint_info == sorry_end);
8683     test_obj.up_thread_sorryserver_disconnect_event_call_chek = false;
8684     up_msg->message(l7vs::tcp_session::MESSAGE_PROC);
8685     BOOST_CHECK(test_obj.up_thread_sorryserver_disconnect_event_call_chek);
8686     delete    up_msg;
8687
8688     // unit_test [3] down_thread_sorryserver_disconnect down thread message set check
8689     std::cerr << "[3] down_thread_sorryserver_disconnect down thread message set check" << std::endl;
8690     BOOST_CHECK(!down_thread_message_que.empty());
8691     l7vs::tcp_thread_message*    down_msg    = down_thread_message_que.pop();
8692     BOOST_CHECK(down_thread_message_que.empty());
8693     BOOST_CHECK(down_msg->endpoint_info == sorry_end);
8694     test_obj.down_thread_sorryserver_disconnect_event_call_chek = false;
8695     down_msg->message(l7vs::tcp_session::MESSAGE_PROC);
8696     BOOST_CHECK(test_obj.down_thread_sorryserver_disconnect_event_call_chek);
8697     delete    down_msg;
8698
8699     // unit_test [4] down_thread_sorryserver_disconnect closed client socket not set message check
8700     std::cerr << "[4] down_thread_sorryserver_disconnect closed client socket not set message check" << std::endl;
8701     sorry_socket.close_res = false;
8702     test_obj.test_call();
8703     BOOST_CHECK(up_thread_message_que.empty());
8704     BOOST_CHECK(down_thread_message_que.empty());
8705     
8706     sorry_socket.close_res = true;
8707     
8708 /*
8709     // unit_test [5] down_thread_sorryserver_disconnect not fond up_thread_sorryserver_disconnect_event function error check
8710     std::cerr << "[5] down_thread_sorryserver_disconnect not fond up_thread_sorryserver_disconnect_event function error check" << std::endl;
8711     test_obj.down_thread_message_up_thread_function_map_clear();
8712     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
8713     l7vs::Logger::putLogError_id = 0;
8714     test_obj.down_thread_exit_call_chek = false;
8715     test_obj.test_call();
8716     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
8717     BOOST_CHECK_EQUAL(91,l7vs::Logger::putLogError_id);
8718     std::cerr << l7vs::Logger::putLogError_message << std::endl;
8719     BOOST_CHECK(test_obj.down_thread_exit_call_chek);
8720     
8721     // unit_test [6] down_thread_sorryserver_disconnect not fond down_thread_sorryserver_disconnect_event function error check
8722     std::cerr << "[6] down_thread_sorryserver_disconnect not fond down_thread_sorryserver_disconnect_event function error check" << std::endl;
8723     test_obj.down_thread_function_array_clear();
8724     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
8725     l7vs::Logger::putLogError_id = 0;
8726     test_obj.down_thread_exit_call_chek = false;
8727     test_obj.test_call();
8728     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
8729     BOOST_CHECK_EQUAL(90,l7vs::Logger::putLogError_id);
8730     std::cerr << l7vs::Logger::putLogError_message << std::endl;
8731     BOOST_CHECK(test_obj.down_thread_exit_call_chek);
8732 */
8733     
8734     BOOST_MESSAGE( "----- down_thread_sorryserver_disconnect test end -----" );
8735 }
8736
8737 // up_thread_realserver_connect_event test
8738 // up_thread_realserver_connect_event test class
8739 class up_thread_realserver_connect_event_test_class : public module_event_map_test_base_class{
8740     public:
8741 //        up_thread_realserver_connect_event_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : module_event_map_test_base_class(vs,session_io){
8742 //        };
8743        up_thread_realserver_connect_event_test_class(
8744                                 l7vs::virtualservice_tcp& vs,
8745                                 boost::asio::io_service& session_io,
8746                                 l7vs::tcp_socket_option_info& set_socket_option,
8747                                 boost::asio::ip::tcp::endpoint listen_endpoint,
8748                                 bool ssl_mode,
8749                                 boost::asio::ssl::context& set_ssl_context,
8750                                 bool set_ssl_cache_flag,
8751                                 int set_ssl_handshake_time_out,
8752                                 l7vs::logger_implement_access* set_access_logger) : module_event_map_test_base_class(   vs,
8753                                                                                                    session_io,
8754                                                                                                    set_socket_option,
8755                                                                                                    listen_endpoint,
8756                                                                                                    ssl_mode,
8757                                                                                                    set_ssl_context,
8758                                                                                                    set_ssl_cache_flag,
8759                                                                                                    set_ssl_handshake_time_out,
8760                                                                                                    set_access_logger){};
8761
8762         ~up_thread_realserver_connect_event_test_class(){};
8763         
8764         void test_call(){
8765             l7vs::tcp_session::up_thread_realserver_connect_event(LOCAL_PROC);
8766         };
8767         
8768 };
8769 void up_thread_realserver_connect_event_test(){
8770     BOOST_MESSAGE( "----- up_thread_realserver_connect_event test start -----" );
8771 //    boost::asio::io_service io;
8772 //    l7vs::virtualservice_tcp vs;
8773 //    up_thread_realserver_connect_event_test_class test_obj(vs,io);
8774     l7vs::virtualservice_tcp vs;
8775     boost::asio::io_service io;
8776     l7vs::tcp_socket_option_info set_option;
8777     //! TCP_NODELAY   (false:not set,true:set option)
8778     set_option.nodelay_opt = false;
8779     //! TCP_NODELAY option value  (false:off,true:on)
8780     set_option.nodelay_val = false;
8781     //! TCP_CORK      (false:not set,true:set option)
8782     set_option.cork_opt = false;
8783     //! TCP_CORK option value     (false:off,true:on)
8784     set_option.cork_val = false;
8785     //! TCP_QUICKACK  (false:not set,true:set option)
8786     set_option.quickack_opt = false;
8787     //! TCP_QUICKACK option value (false:off,true:on)
8788     set_option.quickack_val = false;
8789     //
8790     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
8791     bool set_mode(false);
8792     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
8793     bool set_ssl_cache_flag(false);
8794     int set_ssl_handshake_time_out = 0;
8795     //std::string access_log_file_name = "test";
8796     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
8797
8798     up_thread_realserver_connect_event_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
8799
8800     
8801     std::string test_protocol_name("test protocol");
8802     l7vs::test_protocol_module proto_test(test_protocol_name);
8803
8804     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
8805     
8806     l7vs::protocol_module_base::EVENT_TAG chek_event[13];
8807     chek_event[0] = l7vs::protocol_module_base::ACCEPT;
8808     chek_event[1] = l7vs::protocol_module_base::CLIENT_DISCONNECT;
8809     chek_event[2] = l7vs::protocol_module_base::CLIENT_RECV;
8810     chek_event[3] = l7vs::protocol_module_base::CLIENT_RESPONSE_SEND;
8811     chek_event[4] = l7vs::protocol_module_base::REALSERVER_SELECT;
8812     chek_event[5] = l7vs::protocol_module_base::REALSERVER_CONNECT;
8813     chek_event[6] = l7vs::protocol_module_base::REALSERVER_SEND;
8814     chek_event[7] = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
8815     chek_event[8] = l7vs::protocol_module_base::SORRYSERVER_SELECT;
8816     chek_event[9] = l7vs::protocol_module_base::SORRYSERVER_CONNECT;
8817     chek_event[10] = l7vs::protocol_module_base::SORRYSERVER_SEND;
8818     chek_event[11] = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
8819     chek_event[12] = l7vs::protocol_module_base::FINALIZE;
8820     
8821     // unit_test [1] up_thread_realserver_connect_event up_thread_next_call_function update check
8822     std::cerr << "[1] up_thread_realserver_connect_event up_thread_next_call_function update check" << std::endl;
8823     for(int i = 0; i < 13;i++){
8824         proto_test.handle_realserver_connect_res_tag = chek_event[i];
8825         test_obj.test_call();
8826         BOOST_CHECK(test_obj.chk_up_thread_next_call_function(chek_event[i]));
8827     }
8828     
8829     // unit_test [2] up_thread_realserver_connect_event module parameter check
8830     std::cerr << "[2] up_thread_realserver_connect_event module parameter check" << std::endl;
8831     boost::thread::id def_id;
8832     boost::thread::id proc_id = boost::this_thread::get_id();
8833     test_obj.set_up_thread_id(proc_id);
8834     proto_test.handle_realserver_connect_thread_id = def_id;    
8835     proto_test.handle_realserver_connect_res_tag = l7vs::protocol_module_base::FINALIZE;
8836     BOOST_CHECK(proto_test.handle_realserver_connect_thread_id != proc_id);
8837     char set_char = CHAR_MIN;
8838     for(int i = 0;i < MAX_BUFFER_SIZE;i++){
8839         proto_test.handle_realserver_connect_sendbuffer[i] = set_char;
8840         if(set_char == CHAR_MAX){
8841             set_char = CHAR_MIN;
8842         }else{
8843             set_char++;
8844         }
8845     }
8846     proto_test.handle_realserver_connect_datalen = MAX_BUFFER_SIZE;
8847     l7vs::tcp_data& test_data = test_obj.get_up_thread_data_dest_side();
8848     test_data.initialize();
8849     boost::asio::ip::tcp::endpoint server_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
8850     test_data.set_endpoint(server_end);
8851     
8852     test_obj.test_call();
8853     
8854     BOOST_CHECK(proto_test.handle_realserver_connect_thread_id == proc_id);
8855     BOOST_CHECK(proto_test.handle_realserver_connect_sendbuffer == test_data.get_data());
8856     BOOST_CHECK(proto_test.handle_realserver_connect_datalen == test_data.get_size());
8857     BOOST_CHECK(server_end == test_data.get_endpoint());
8858     
8859     // unit_test [3] up_thread_realserver_connect_event not fond function error check
8860     std::cerr << "[3] up_thread_realserver_connect_event not fond function error check" << std::endl;
8861     test_obj.up_thread_function_array_clear();
8862     proto_test.handle_realserver_connect_res_tag = l7vs::protocol_module_base::FINALIZE;
8863     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
8864     l7vs::Logger::putLogError_id = 0;
8865     test_obj.test_call();
8866     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
8867     BOOST_CHECK_EQUAL(40,l7vs::Logger::putLogError_id);
8868     std::cerr << l7vs::Logger::putLogError_message << std::endl;
8869     
8870     // unit_test [4] up_thread_realserver_connect_event returnd illegal EVENT_TAG error check
8871     std::cerr << "[4] up_thread_realserver_connect_event returnd illegal EVENT_TAG error check" << std::endl;
8872     test_obj.up_thread_module_event_map_clear();
8873     proto_test.handle_realserver_connect_res_tag = l7vs::protocol_module_base::FINALIZE;
8874     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
8875     l7vs::Logger::putLogError_id = 0;
8876     test_obj.test_call();
8877     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
8878     BOOST_CHECK_EQUAL(39,l7vs::Logger::putLogError_id);
8879     std::cerr << l7vs::Logger::putLogError_message << std::endl;
8880     
8881     BOOST_MESSAGE( "----- up_thread_realserver_connect_event test end -----" );
8882 }
8883
8884 // up_thread_sorryserver_connect_event test
8885 // up_thread_sorryserver_connect_event test class
8886 class up_thread_sorryserver_connect_event_test_class : public module_event_map_test_base_class{
8887     public:
8888 //        up_thread_sorryserver_connect_event_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : module_event_map_test_base_class(vs,session_io){
8889 //        };
8890        up_thread_sorryserver_connect_event_test_class(
8891                                 l7vs::virtualservice_tcp& vs,
8892                                 boost::asio::io_service& session_io,
8893                                 l7vs::tcp_socket_option_info& set_socket_option,
8894                                 boost::asio::ip::tcp::endpoint listen_endpoint,
8895                                 bool ssl_mode,
8896                                 boost::asio::ssl::context& set_ssl_context,
8897                                 bool set_ssl_cache_flag,
8898                                 int set_ssl_handshake_time_out,
8899                                 l7vs::logger_implement_access* set_access_logger) : module_event_map_test_base_class(   vs,
8900                                                                                                    session_io,
8901                                                                                                    set_socket_option,
8902                                                                                                    listen_endpoint,
8903                                                                                                    ssl_mode,
8904                                                                                                    set_ssl_context,
8905                                                                                                    set_ssl_cache_flag,
8906                                                                                                    set_ssl_handshake_time_out,
8907                                                                                                    set_access_logger){};
8908
8909         ~up_thread_sorryserver_connect_event_test_class(){};
8910         
8911         void test_call(){
8912             l7vs::tcp_session::up_thread_sorryserver_connect_event(LOCAL_PROC);
8913         };
8914         
8915 };
8916 void up_thread_sorryserver_connect_event_test(){
8917     BOOST_MESSAGE( "----- up_thread_sorryserver_connect_event test start -----" );
8918 //    boost::asio::io_service io;
8919 //    l7vs::virtualservice_tcp vs;
8920 //    up_thread_sorryserver_connect_event_test_class test_obj(vs,io);
8921     l7vs::virtualservice_tcp vs;
8922     boost::asio::io_service io;
8923     l7vs::tcp_socket_option_info set_option;
8924     //! TCP_NODELAY   (false:not set,true:set option)
8925     set_option.nodelay_opt = false;
8926     //! TCP_NODELAY option value  (false:off,true:on)
8927     set_option.nodelay_val = false;
8928     //! TCP_CORK      (false:not set,true:set option)
8929     set_option.cork_opt = false;
8930     //! TCP_CORK option value     (false:off,true:on)
8931     set_option.cork_val = false;
8932     //! TCP_QUICKACK  (false:not set,true:set option)
8933     set_option.quickack_opt = false;
8934     //! TCP_QUICKACK option value (false:off,true:on)
8935     set_option.quickack_val = false;
8936     //
8937     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
8938     bool set_mode(false);
8939     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
8940     bool set_ssl_cache_flag(false);
8941     int set_ssl_handshake_time_out = 0;
8942     //std::string access_log_file_name = "test";
8943     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
8944
8945     up_thread_sorryserver_connect_event_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
8946
8947
8948     std::string test_protocol_name("test protocol");
8949     l7vs::test_protocol_module proto_test(test_protocol_name);
8950
8951     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
8952     
8953     l7vs::protocol_module_base::EVENT_TAG chek_event[13];
8954     chek_event[0] = l7vs::protocol_module_base::ACCEPT;
8955     chek_event[1] = l7vs::protocol_module_base::CLIENT_DISCONNECT;
8956     chek_event[2] = l7vs::protocol_module_base::CLIENT_RECV;
8957     chek_event[3] = l7vs::protocol_module_base::CLIENT_RESPONSE_SEND;
8958     chek_event[4] = l7vs::protocol_module_base::REALSERVER_SELECT;
8959     chek_event[5] = l7vs::protocol_module_base::REALSERVER_CONNECT;
8960     chek_event[6] = l7vs::protocol_module_base::REALSERVER_SEND;
8961     chek_event[7] = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
8962     chek_event[8] = l7vs::protocol_module_base::SORRYSERVER_SELECT;
8963     chek_event[9] = l7vs::protocol_module_base::SORRYSERVER_CONNECT;
8964     chek_event[10] = l7vs::protocol_module_base::SORRYSERVER_SEND;
8965     chek_event[11] = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
8966     chek_event[12] = l7vs::protocol_module_base::FINALIZE;
8967     
8968     // unit_test [1] up_thread_sorryserver_connect_event up_thread_next_call_function update check
8969     std::cerr << "[1] up_thread_sorryserver_connect_event up_thread_next_call_function update check" << std::endl;
8970     for(int i = 0; i < 13;i++){
8971         proto_test.handle_sorryserver_connect_res_tag = chek_event[i];
8972         test_obj.test_call();
8973         BOOST_CHECK(test_obj.chk_up_thread_next_call_function(chek_event[i]));
8974     }
8975     
8976     // unit_test [2] up_thread_sorryserver_connect_event module parameter check
8977     std::cerr << "[2] up_thread_sorryserver_connect_event module parameter check" << std::endl;
8978     boost::thread::id def_id;
8979     boost::thread::id proc_id = boost::this_thread::get_id();
8980     test_obj.set_up_thread_id(proc_id);
8981     proto_test.handle_sorryserver_connect_thread_id = def_id;    
8982     proto_test.handle_sorryserver_connect_res_tag = l7vs::protocol_module_base::FINALIZE;
8983     BOOST_CHECK(proto_test.handle_sorryserver_connect_thread_id != proc_id);
8984     char set_char = CHAR_MIN;
8985     for(int i = 0;i < MAX_BUFFER_SIZE;i++){
8986         proto_test.handle_sorryserver_connect_sendbuffer[i] = set_char;
8987         if(set_char == CHAR_MAX){
8988             set_char = CHAR_MIN;
8989         }else{
8990             set_char++;
8991         }
8992     }
8993     proto_test.handle_sorryserver_connect_datalen = MAX_BUFFER_SIZE;
8994     l7vs::tcp_data& test_data = test_obj.get_up_thread_data_dest_side();
8995     test_data.initialize();
8996     boost::asio::ip::tcp::endpoint server_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
8997     test_data.set_endpoint(server_end);
8998     
8999     test_obj.test_call();
9000     
9001     BOOST_CHECK(proto_test.handle_sorryserver_connect_thread_id == proc_id);
9002     BOOST_CHECK(proto_test.handle_sorryserver_connect_sendbuffer == test_data.get_data());
9003     BOOST_CHECK(proto_test.handle_sorryserver_connect_datalen == test_data.get_size());
9004     BOOST_CHECK(server_end == test_data.get_endpoint());
9005     
9006     // unit_test [3] up_thread_sorryserver_connect_event not fond function error check
9007     std::cerr << "[3] up_thread_sorryserver_connect_event not fond function error check" << std::endl;
9008     test_obj.up_thread_function_array_clear();
9009     proto_test.handle_sorryserver_connect_res_tag = l7vs::protocol_module_base::FINALIZE;
9010     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
9011     l7vs::Logger::putLogError_id = 0;
9012     test_obj.test_call();
9013     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
9014     BOOST_CHECK_EQUAL(57,l7vs::Logger::putLogError_id);
9015     std::cerr << l7vs::Logger::putLogError_message << std::endl;
9016     
9017     // unit_test [4] up_thread_sorryserver_connect_event returnd illegal EVENT_TAG error check
9018     std::cerr << "[4] up_thread_sorryserver_connect_event returnd illegal EVENT_TAG error check" << std::endl;
9019     test_obj.up_thread_module_event_map_clear();
9020     proto_test.handle_sorryserver_connect_res_tag = l7vs::protocol_module_base::FINALIZE;
9021     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
9022     l7vs::Logger::putLogError_id = 0;
9023     test_obj.test_call();
9024     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
9025     BOOST_CHECK_EQUAL(56,l7vs::Logger::putLogError_id);
9026     std::cerr << l7vs::Logger::putLogError_message << std::endl;
9027     
9028     BOOST_MESSAGE( "----- up_thread_sorryserver_connect_event test end -----" );
9029 }
9030 // down_thread_client_connection_chk_event test
9031 // down_thread_client_connection_chk_event test class
9032 class down_thread_client_connection_chk_event_test_class : public module_event_map_test_base_class{
9033     public:
9034 //        down_thread_client_connection_chk_event_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : module_event_map_test_base_class(vs,session_io){
9035 //        };
9036        down_thread_client_connection_chk_event_test_class(
9037                                 l7vs::virtualservice_tcp& vs,
9038                                 boost::asio::io_service& session_io,
9039                                 l7vs::tcp_socket_option_info& set_socket_option,
9040                                 boost::asio::ip::tcp::endpoint listen_endpoint,
9041                                 bool ssl_mode,
9042                                 boost::asio::ssl::context& set_ssl_context,
9043                                 bool set_ssl_cache_flag,
9044                                 int set_ssl_handshake_time_out,
9045                                 l7vs::logger_implement_access* set_access_logger) : module_event_map_test_base_class(   vs,
9046                                                                                                    session_io,
9047                                                                                                    set_socket_option,
9048                                                                                                    listen_endpoint,
9049                                                                                                    ssl_mode,
9050                                                                                                    set_ssl_context,
9051                                                                                                    set_ssl_cache_flag,
9052                                                                                                    set_ssl_handshake_time_out,
9053                                                                                                    set_access_logger){};
9054
9055         ~down_thread_client_connection_chk_event_test_class(){};
9056         
9057         void test_call(){
9058             l7vs::tcp_session::down_thread_client_connection_chk_event(LOCAL_PROC);
9059         };
9060         
9061 };
9062 void down_thread_client_connection_chk_event_test(){
9063     BOOST_MESSAGE( "----- down_thread_client_connection_chk_event test start -----" );
9064 //    boost::asio::io_service io;
9065 //    l7vs::virtualservice_tcp vs;
9066 //    down_thread_client_connection_chk_event_test_class test_obj(vs,io);
9067     l7vs::virtualservice_tcp vs;
9068     boost::asio::io_service io;
9069     l7vs::tcp_socket_option_info set_option;
9070     //! TCP_NODELAY   (false:not set,true:set option)
9071     set_option.nodelay_opt = false;
9072     //! TCP_NODELAY option value  (false:off,true:on)
9073     set_option.nodelay_val = false;
9074     //! TCP_CORK      (false:not set,true:set option)
9075     set_option.cork_opt = false;
9076     //! TCP_CORK option value     (false:off,true:on)
9077     set_option.cork_val = false;
9078     //! TCP_QUICKACK  (false:not set,true:set option)
9079     set_option.quickack_opt = false;
9080     //! TCP_QUICKACK option value (false:off,true:on)
9081     set_option.quickack_val = false;
9082     //
9083     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
9084     bool set_mode(false);
9085     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
9086     bool set_ssl_cache_flag(false);
9087     int set_ssl_handshake_time_out = 0;
9088     //std::string access_log_file_name = "test";
9089     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
9090
9091     down_thread_client_connection_chk_event_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
9092
9093
9094     std::string test_protocol_name("test protocol");
9095     l7vs::test_protocol_module proto_test(test_protocol_name);
9096
9097     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
9098     
9099     l7vs::protocol_module_base::EVENT_TAG chek_event[7];
9100     chek_event[0] = l7vs::protocol_module_base::CLIENT_DISCONNECT;
9101     chek_event[1] = l7vs::protocol_module_base::CLIENT_CONNECTION_CHECK;
9102     chek_event[2] = l7vs::protocol_module_base::REALSERVER_RECV;
9103     chek_event[3] = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
9104     chek_event[4] = l7vs::protocol_module_base::SORRYSERVER_RECV;
9105     chek_event[5] = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
9106     chek_event[6] = l7vs::protocol_module_base::FINALIZE;
9107     
9108     // unit_test [1] down_thread_client_connection_chk_event down_thread_next_call_function update check
9109     std::cerr << "[1] down_thread_client_connection_chk_event down_thread_next_call_function update check" << std::endl;
9110     for(int i = 0; i < 7;i++){
9111         proto_test.handle_client_connection_check_res_tag = chek_event[i];
9112         test_obj.test_call();
9113         BOOST_CHECK(test_obj.chk_down_thread_next_call_function(chek_event[i]));
9114     }
9115     
9116     // unit_test [2] down_thread_client_connection_chk_event module parameter check
9117     std::cerr << "[2] down_thread_client_connection_chk_event module parameter check" << std::endl;
9118     boost::thread::id def_id;
9119     boost::thread::id proc_id = boost::this_thread::get_id();
9120     test_obj.set_down_thread_id(proc_id);
9121     proto_test.handle_client_connection_check_thread_id = def_id;    
9122     proto_test.handle_client_connection_check_res_tag = l7vs::protocol_module_base::FINALIZE;
9123     BOOST_CHECK(proto_test.handle_client_connection_check_thread_id != proc_id);
9124     char set_char = CHAR_MIN;
9125     for(int i = 0;i < MAX_BUFFER_SIZE;i++){
9126         proto_test.handle_client_connection_check_sendbuffer[i] = set_char;
9127         if(set_char == CHAR_MAX){
9128             set_char = CHAR_MIN;
9129         }else{
9130             set_char++;
9131         }
9132     }
9133     proto_test.handle_client_connection_check_datalen = MAX_BUFFER_SIZE;
9134     l7vs::tcp_data& test_data = test_obj.get_down_thread_data_client_side();
9135     test_data.initialize();
9136     
9137     test_obj.test_call();
9138     
9139     BOOST_CHECK(proto_test.handle_client_connection_check_thread_id == proc_id);
9140     BOOST_CHECK(proto_test.handle_client_connection_check_sendbuffer == test_data.get_data());
9141     BOOST_CHECK(proto_test.handle_client_connection_check_datalen == test_data.get_size());
9142     
9143     // unit_test [3] down_thread_client_connection_chk_event not fond function error check
9144     std::cerr << "[3] down_thread_client_connection_chk_event not fond function error check" << std::endl;
9145     test_obj.down_thread_function_array_clear();
9146     proto_test.handle_client_connection_check_res_tag = l7vs::protocol_module_base::FINALIZE;
9147     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
9148     l7vs::Logger::putLogError_id = 0;
9149     test_obj.test_call();
9150     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
9151     BOOST_CHECK_EQUAL(79,l7vs::Logger::putLogError_id);
9152     std::cerr << l7vs::Logger::putLogError_message << std::endl;
9153     
9154     // unit_test [4] down_thread_client_connection_chk_event returnd illegal EVENT_TAG error check
9155     std::cerr << "[4] down_thread_client_connection_chk_event returnd illegal EVENT_TAG error check" << std::endl;
9156     test_obj.down_thread_module_event_map_clear();
9157     proto_test.handle_client_connection_check_res_tag = l7vs::protocol_module_base::FINALIZE;
9158     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
9159     l7vs::Logger::putLogError_id = 0;
9160     test_obj.test_call();
9161     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
9162     BOOST_CHECK_EQUAL(78,l7vs::Logger::putLogError_id);
9163     std::cerr << l7vs::Logger::putLogError_message << std::endl;
9164     
9165     BOOST_MESSAGE( "----- down_thread_client_connection_chk_event test end -----" );
9166 }
9167 // up_thread_realserver_connection_fail_event test
9168 // up_thread_realserver_connection_fail_event test class
9169 class up_thread_realserver_connection_fail_event_test_class : public module_event_map_test_base_class{
9170     public:
9171 //        up_thread_realserver_connection_fail_event_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : module_event_map_test_base_class(vs,session_io){
9172 //        };
9173        up_thread_realserver_connection_fail_event_test_class(
9174                                 l7vs::virtualservice_tcp& vs,
9175                                 boost::asio::io_service& session_io,
9176                                 l7vs::tcp_socket_option_info& set_socket_option,
9177                                 boost::asio::ip::tcp::endpoint listen_endpoint,
9178                                 bool ssl_mode,
9179                                 boost::asio::ssl::context& set_ssl_context,
9180                                 bool set_ssl_cache_flag,
9181                                 int set_ssl_handshake_time_out,
9182                                 l7vs::logger_implement_access* set_access_logger) : module_event_map_test_base_class(   vs,
9183                                                                                                    session_io,
9184                                                                                                    set_socket_option,
9185                                                                                                    listen_endpoint,
9186                                                                                                    ssl_mode,
9187                                                                                                    set_ssl_context,
9188                                                                                                    set_ssl_cache_flag,
9189                                                                                                    set_ssl_handshake_time_out,
9190                                                                                                    set_access_logger){};
9191
9192         ~up_thread_realserver_connection_fail_event_test_class(){};
9193         
9194         void test_call(){
9195             l7vs::tcp_session::up_thread_realserver_connection_fail_event(LOCAL_PROC);
9196         };
9197         
9198 };
9199 void up_thread_realserver_connection_fail_event_test(){
9200     BOOST_MESSAGE( "----- up_thread_realserver_connection_fail_event test start -----" );
9201 //    boost::asio::io_service io;
9202 //    l7vs::virtualservice_tcp vs;
9203 //    up_thread_realserver_connection_fail_event_test_class test_obj(vs,io);
9204     l7vs::virtualservice_tcp vs;
9205     boost::asio::io_service io;
9206     l7vs::tcp_socket_option_info set_option;
9207     //! TCP_NODELAY   (false:not set,true:set option)
9208     set_option.nodelay_opt = false;
9209     //! TCP_NODELAY option value  (false:off,true:on)
9210     set_option.nodelay_val = false;
9211     //! TCP_CORK      (false:not set,true:set option)
9212     set_option.cork_opt = false;
9213     //! TCP_CORK option value     (false:off,true:on)
9214     set_option.cork_val = false;
9215     //! TCP_QUICKACK  (false:not set,true:set option)
9216     set_option.quickack_opt = false;
9217     //! TCP_QUICKACK option value (false:off,true:on)
9218     set_option.quickack_val = false;
9219     //
9220     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
9221     bool set_mode(false);
9222     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
9223     bool set_ssl_cache_flag(false);
9224     int set_ssl_handshake_time_out = 0;
9225     //std::string access_log_file_name = "test";
9226     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
9227
9228     up_thread_realserver_connection_fail_event_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
9229
9230
9231     
9232     std::string test_protocol_name("test protocol");
9233     l7vs::test_protocol_module proto_test(test_protocol_name);
9234
9235     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
9236     
9237     l7vs::protocol_module_base::EVENT_TAG chek_event[13];
9238     chek_event[0] = l7vs::protocol_module_base::ACCEPT;
9239     chek_event[1] = l7vs::protocol_module_base::CLIENT_DISCONNECT;
9240     chek_event[2] = l7vs::protocol_module_base::CLIENT_RECV;
9241     chek_event[3] = l7vs::protocol_module_base::CLIENT_RESPONSE_SEND;
9242     chek_event[4] = l7vs::protocol_module_base::REALSERVER_SELECT;
9243     chek_event[5] = l7vs::protocol_module_base::REALSERVER_CONNECT;
9244     chek_event[6] = l7vs::protocol_module_base::REALSERVER_SEND;
9245     chek_event[7] = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
9246     chek_event[8] = l7vs::protocol_module_base::SORRYSERVER_SELECT;
9247     chek_event[9] = l7vs::protocol_module_base::SORRYSERVER_CONNECT;
9248     chek_event[10] = l7vs::protocol_module_base::SORRYSERVER_SEND;
9249     chek_event[11] = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
9250     chek_event[12] = l7vs::protocol_module_base::FINALIZE;
9251     
9252     // unit_test [1] up_thread_realserver_connection_fail_event up_thread_next_call_function update check
9253     std::cerr << "[1] up_thread_realserver_connection_fail_event up_thread_next_call_function update check" << std::endl;
9254     for(int i = 0; i < 13;i++){
9255         proto_test.handle_realserver_connection_fail_res_tag = chek_event[i];
9256         test_obj.test_call();
9257         BOOST_CHECK(test_obj.chk_up_thread_next_call_function(chek_event[i]));
9258     }
9259     
9260     // unit_test [2] up_thread_realserver_connection_fail_event module parameter check
9261     std::cerr << "[2] up_thread_realserver_connection_fail_event module parameter check" << std::endl;
9262     boost::thread::id def_id;
9263     boost::thread::id proc_id = boost::this_thread::get_id();
9264     test_obj.set_up_thread_id(proc_id);
9265     proto_test.handle_realserver_connection_fail_thread_id = def_id;    
9266     proto_test.handle_realserver_connection_fail_res_tag = l7vs::protocol_module_base::FINALIZE;
9267     BOOST_CHECK(proto_test.handle_realserver_connection_fail_thread_id != proc_id);
9268     boost::asio::ip::tcp::endpoint server_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
9269     l7vs::tcp_data& test_data = test_obj.get_up_thread_data_dest_side();
9270     test_data.set_endpoint(server_end);
9271     
9272     test_obj.test_call();
9273     
9274     BOOST_CHECK(proto_test.handle_realserver_connection_fail_thread_id == proc_id);
9275     BOOST_CHECK(server_end == test_data.get_endpoint());
9276     
9277     // unit_test [3] up_thread_realserver_connection_fail_event not fond function error check
9278     std::cerr << "[3] up_thread_realserver_connection_fail_event not fond function error check" << std::endl;
9279     test_obj.up_thread_function_array_clear();
9280     proto_test.handle_realserver_connection_fail_res_tag = l7vs::protocol_module_base::FINALIZE;
9281     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
9282     l7vs::Logger::putLogError_id = 0;
9283     test_obj.test_call();
9284     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
9285     BOOST_CHECK_EQUAL(42,l7vs::Logger::putLogError_id);
9286     std::cerr << l7vs::Logger::putLogError_message << std::endl;
9287     
9288     // unit_test [4] up_thread_realserver_connection_fail_event returnd illegal EVENT_TAG error check
9289     std::cerr << "[4] up_thread_realserver_connection_fail_event returnd illegal EVENT_TAG error check" << std::endl;
9290     test_obj.up_thread_module_event_map_clear();
9291     proto_test.handle_realserver_connection_fail_res_tag = l7vs::protocol_module_base::FINALIZE;
9292     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
9293     l7vs::Logger::putLogError_id = 0;
9294     test_obj.test_call();
9295     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
9296     BOOST_CHECK_EQUAL(41,l7vs::Logger::putLogError_id);
9297     std::cerr << l7vs::Logger::putLogError_message << std::endl;
9298     
9299     BOOST_MESSAGE( "----- up_thread_realserver_connection_fail_event test end -----" );
9300 }
9301
9302 // up_thread_sorryserver_connection_fail_event test
9303 // up_thread_sorryserver_connection_fail_event test class
9304 class up_thread_sorryserver_connection_fail_event_test_class : public module_event_map_test_base_class{
9305     public:
9306 //        up_thread_sorryserver_connection_fail_event_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : module_event_map_test_base_class(vs,session_io){
9307 //        };
9308        up_thread_sorryserver_connection_fail_event_test_class(
9309                                 l7vs::virtualservice_tcp& vs,
9310                                 boost::asio::io_service& session_io,
9311                                 l7vs::tcp_socket_option_info& set_socket_option,
9312                                 boost::asio::ip::tcp::endpoint listen_endpoint,
9313                                 bool ssl_mode,
9314                                 boost::asio::ssl::context& set_ssl_context,
9315                                 bool set_ssl_cache_flag,
9316                                 int set_ssl_handshake_time_out,
9317                                 l7vs::logger_implement_access* set_access_logger) : module_event_map_test_base_class(   vs,
9318                                                                                                    session_io,
9319                                                                                                    set_socket_option,
9320                                                                                                    listen_endpoint,
9321                                                                                                    ssl_mode,
9322                                                                                                    set_ssl_context,
9323                                                                                                    set_ssl_cache_flag,
9324                                                                                                    set_ssl_handshake_time_out,
9325                                                                                                    set_access_logger){};
9326
9327         ~up_thread_sorryserver_connection_fail_event_test_class(){};
9328         
9329         void test_call(){
9330             l7vs::tcp_session::up_thread_sorryserver_connection_fail_event(LOCAL_PROC);
9331         };
9332         
9333 };
9334 void up_thread_sorryserver_connection_fail_event_test(){
9335     BOOST_MESSAGE( "----- up_thread_sorryserver_connection_fail_event test start -----" );
9336 //    boost::asio::io_service io;
9337 //    l7vs::virtualservice_tcp vs;
9338 //    up_thread_sorryserver_connection_fail_event_test_class test_obj(vs,io);
9339     l7vs::virtualservice_tcp vs;
9340     boost::asio::io_service io;
9341     l7vs::tcp_socket_option_info set_option;
9342     //! TCP_NODELAY   (false:not set,true:set option)
9343     set_option.nodelay_opt = false;
9344     //! TCP_NODELAY option value  (false:off,true:on)
9345     set_option.nodelay_val = false;
9346     //! TCP_CORK      (false:not set,true:set option)
9347     set_option.cork_opt = false;
9348     //! TCP_CORK option value     (false:off,true:on)
9349     set_option.cork_val = false;
9350     //! TCP_QUICKACK  (false:not set,true:set option)
9351     set_option.quickack_opt = false;
9352     //! TCP_QUICKACK option value (false:off,true:on)
9353     set_option.quickack_val = false;
9354     //
9355     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
9356     bool set_mode(false);
9357     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
9358     bool set_ssl_cache_flag(false);
9359     int set_ssl_handshake_time_out = 0;
9360     //std::string access_log_file_name = "test";
9361     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
9362
9363     up_thread_sorryserver_connection_fail_event_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
9364
9365
9366     std::string test_protocol_name("test protocol");
9367     l7vs::test_protocol_module proto_test(test_protocol_name);
9368
9369     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
9370     
9371     l7vs::protocol_module_base::EVENT_TAG chek_event[13];
9372     chek_event[0] = l7vs::protocol_module_base::ACCEPT;
9373     chek_event[1] = l7vs::protocol_module_base::CLIENT_DISCONNECT;
9374     chek_event[2] = l7vs::protocol_module_base::CLIENT_RECV;
9375     chek_event[3] = l7vs::protocol_module_base::CLIENT_RESPONSE_SEND;
9376     chek_event[4] = l7vs::protocol_module_base::REALSERVER_SELECT;
9377     chek_event[5] = l7vs::protocol_module_base::REALSERVER_CONNECT;
9378     chek_event[6] = l7vs::protocol_module_base::REALSERVER_SEND;
9379     chek_event[7] = l7vs::protocol_module_base::REALSERVER_DISCONNECT;
9380     chek_event[8] = l7vs::protocol_module_base::SORRYSERVER_SELECT;
9381     chek_event[9] = l7vs::protocol_module_base::SORRYSERVER_CONNECT;
9382     chek_event[10] = l7vs::protocol_module_base::SORRYSERVER_SEND;
9383     chek_event[11] = l7vs::protocol_module_base::SORRYSERVER_DISCONNECT;
9384     chek_event[12] = l7vs::protocol_module_base::FINALIZE;
9385     
9386     // unit_test [1] up_thread_sorryserver_connection_fail_event up_thread_next_call_function update check
9387     std::cerr << "[1] up_thread_sorryserver_connection_fail_event up_thread_next_call_function update check" << std::endl;
9388     for(int i = 0; i < 13;i++){
9389         proto_test.handle_sorryserver_connection_fail_res_tag = chek_event[i];
9390         test_obj.test_call();
9391         BOOST_CHECK(test_obj.chk_up_thread_next_call_function(chek_event[i]));
9392     }
9393     
9394     // unit_test [2] up_thread_sorryserver_connection_fail_event module parameter check
9395     std::cerr << "[2] up_thread_sorryserver_connection_fail_event module parameter check" << std::endl;
9396     boost::thread::id def_id;
9397     boost::thread::id proc_id = boost::this_thread::get_id();
9398     test_obj.set_up_thread_id(proc_id);
9399     proto_test.handle_sorryserver_connection_fail_thread_id = def_id;    
9400     proto_test.handle_sorryserver_connection_fail_res_tag = l7vs::protocol_module_base::FINALIZE;
9401     BOOST_CHECK(proto_test.handle_sorryserver_connection_fail_thread_id != proc_id);
9402     boost::asio::ip::tcp::endpoint server_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
9403     l7vs::tcp_data& test_data = test_obj.get_up_thread_data_dest_side();
9404     test_data.set_endpoint(server_end);
9405     
9406     test_obj.test_call();
9407     
9408     BOOST_CHECK(proto_test.handle_sorryserver_connection_fail_thread_id == proc_id);
9409     BOOST_CHECK(server_end == test_data.get_endpoint());
9410     
9411     // unit_test [3] up_thread_sorryserver_connection_fail_event not fond function error check
9412     std::cerr << "[3] up_thread_sorryserver_connection_fail_event not fond function error check" << std::endl;
9413     test_obj.up_thread_function_array_clear();
9414     proto_test.handle_sorryserver_connection_fail_res_tag = l7vs::protocol_module_base::FINALIZE;
9415     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
9416     l7vs::Logger::putLogError_id = 0;
9417     test_obj.test_call();
9418     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
9419     BOOST_CHECK_EQUAL(59,l7vs::Logger::putLogError_id);
9420     std::cerr << l7vs::Logger::putLogError_message << std::endl;
9421     
9422     // unit_test [4] up_thread_sorryserver_connection_fail_event returnd illegal EVENT_TAG error check
9423     std::cerr << "[4] up_thread_sorryserver_connection_fail_event returnd illegal EVENT_TAG error check" << std::endl;
9424     test_obj.up_thread_module_event_map_clear();
9425     proto_test.handle_sorryserver_connection_fail_res_tag = l7vs::protocol_module_base::FINALIZE;
9426     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
9427     l7vs::Logger::putLogError_id = 0;
9428     test_obj.test_call();
9429     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
9430     BOOST_CHECK_EQUAL(58,l7vs::Logger::putLogError_id);
9431     std::cerr << l7vs::Logger::putLogError_message << std::endl;
9432     
9433     BOOST_MESSAGE( "----- up_thread_sorryserver_connection_fail_event test end -----" );
9434 }
9435
9436 // receive & send test class
9437 class receive_send_test_class : public l7vs::tcp_session{
9438     public:
9439 //        receive_send_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){
9440 //        };
9441        receive_send_test_class(
9442                                 l7vs::virtualservice_tcp& vs,
9443                                 boost::asio::io_service& session_io,
9444                                 l7vs::tcp_socket_option_info& set_socket_option,
9445                                 boost::asio::ip::tcp::endpoint listen_endpoint,
9446                                 bool ssl_mode,
9447                                 boost::asio::ssl::context& set_ssl_context,
9448                                 bool set_ssl_cache_flag,
9449                                 int set_ssl_handshake_time_out,
9450                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
9451                                                                                                    session_io,
9452                                                                                                    set_socket_option,
9453                                                                                                    listen_endpoint,
9454                                                                                                    ssl_mode,
9455                                                                                                    set_ssl_context,
9456                                                                                                    set_ssl_cache_flag,
9457                                                                                                    set_ssl_handshake_time_out,
9458                                                                                                    set_access_logger){};
9459
9460         ~receive_send_test_class(){};
9461         
9462         void test_call_client_receive(){
9463             l7vs::tcp_session::up_thread_client_receive(LOCAL_PROC);
9464         };
9465         void test_call_client_send(){
9466             l7vs::tcp_session::down_thread_client_send(LOCAL_PROC);
9467         };
9468         void test_call_realserver_receive(){
9469             l7vs::tcp_session::down_thread_realserver_receive(LOCAL_PROC);
9470         };
9471         void test_call_realserver_send(){
9472             l7vs::tcp_session::up_thread_realserver_send(LOCAL_PROC);
9473         };
9474         void test_call_sorryserver_receive(){
9475             l7vs::tcp_session::down_thread_sorryserver_receive(LOCAL_PROC);
9476         };
9477         void test_call_sorryserver_send(){
9478             l7vs::tcp_session::up_thread_sorryserver_send(LOCAL_PROC);
9479         };
9480         void set_protocol_module(l7vs::protocol_module_base* set_prot){
9481             protocol_module = set_prot;
9482         };
9483         l7vs::tcp_data& get_up_thread_data_client_side(){
9484             return up_thread_data_client_side;
9485         };
9486         l7vs::tcp_data& get_up_thread_data_dest_side(){
9487             return up_thread_data_dest_side;
9488         };
9489         l7vs::tcp_data& get_down_thread_data_client_side(){
9490             return down_thread_data_client_side;
9491         };
9492         l7vs::tcp_data& get_down_thread_data_dest_side(){
9493             return down_thread_data_dest_side;
9494         };
9495         l7vs::tcp_socket& get_client_socket(){
9496             return client_socket;
9497         };
9498         l7vs::tcp_ssl_socket& get_client_ssl_socket(){
9499             return client_ssl_socket;
9500         };
9501         socket_element& get_sorryserver_socket(){
9502             return sorryserver_socket;
9503         };
9504         std::list<socket_element>& get_down_thread_receive_realserver_socket_list(){
9505             return down_thread_receive_realserver_socket_list;
9506         };
9507         std::map<endpoint,tcp_socket_ptr>& get_up_thread_send_realserver_socket_map(){
9508             return up_thread_send_realserver_socket_map;
9509         };
9510         std::list<socket_element>::iterator& get_down_thread_current_receive_realserver_socket(){
9511             return down_thread_current_receive_realserver_socket;
9512         };
9513         
9514         void set_up_thread_id(boost::thread::id set_id){
9515             up_thread_id = set_id;
9516         }
9517         void set_down_thread_id(boost::thread::id set_id){
9518             down_thread_id = set_id;
9519         }
9520         
9521         void next_up_function_call(){
9522             up_thread_next_call_function.second(LOCAL_PROC);
9523         }
9524         void next_down_function_call(){
9525             down_thread_next_call_function.second(LOCAL_PROC);
9526         }
9527         
9528         void set_up_thread_next_function_call_exit(){
9529             up_thread_function_pair fun_it = up_thread_function_array[UP_FUNC_EXIT];
9530             up_thread_next_call_function = fun_it;
9531         };
9532         
9533         void set_down_thread_next_function_call_exit(){
9534             down_thread_function_pair fun_it = down_thread_function_array[DOWN_FUNC_EXIT];
9535             down_thread_next_call_function = fun_it;
9536         };
9537         
9538         // next call function check
9539         void up_thread_realserver_get_destination_event(const TCP_PROCESS_TYPE_TAG process_type){
9540             up_thread_realserver_get_destination_event_call_check = true;
9541         };
9542         bool up_thread_realserver_get_destination_event_call_check;
9543         void up_thread_sorryserver_get_destination_event(const TCP_PROCESS_TYPE_TAG process_type){
9544             up_thread_sorryserver_get_destination_event_call_check = true;
9545         };
9546         bool up_thread_sorryserver_get_destination_event_call_check;
9547         
9548         void up_thread_client_disconnect(const TCP_PROCESS_TYPE_TAG process_type){
9549             up_thread_client_disconnect_call_check = true;
9550         };
9551         bool up_thread_client_disconnect_call_check;
9552         
9553         
9554         void down_thread_client_disconnect(const TCP_PROCESS_TYPE_TAG process_type){
9555             down_thread_client_disconnect_call_check = true;
9556         };
9557         bool down_thread_client_disconnect_call_check;
9558         
9559         void up_thread_realserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){
9560             up_thread_realserver_disconnect_call_check = true;
9561         };
9562         bool up_thread_realserver_disconnect_call_check;
9563         
9564         void up_thread_sorryserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){
9565             up_thread_sorryserver_disconnect_call_check = true;
9566         };
9567         bool up_thread_sorryserver_disconnect_call_check;
9568         
9569         void down_thread_realserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){
9570             down_thread_realserver_disconnect_call_check = true;
9571         };
9572         bool down_thread_realserver_disconnect_call_check;
9573         
9574         void down_thread_sorryserver_disconnect(const TCP_PROCESS_TYPE_TAG process_type){
9575             down_thread_sorryserver_disconnect_call_check = true;
9576         };
9577         bool down_thread_sorryserver_disconnect_call_check;
9578         
9579         void up_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
9580             up_thread_exit_call_check = true;
9581         }
9582         bool up_thread_exit_call_check;
9583         
9584         void down_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
9585             down_thread_exit_call_check = true;
9586         }
9587         bool down_thread_exit_call_check;
9588         
9589         void up_thread_client_receive(const TCP_PROCESS_TYPE_TAG process_type){
9590             up_thread_client_receive_call_check = true;
9591             tcp_session::up_thread_client_receive(process_type);
9592         };
9593         bool up_thread_client_receive_call_check;
9594         
9595         void down_thread_realserver_receive(const TCP_PROCESS_TYPE_TAG process_type){
9596             down_thread_realserver_receive_call_check = true;
9597             tcp_session::down_thread_realserver_receive(process_type);
9598         };
9599         bool down_thread_realserver_receive_call_check;
9600         
9601         void down_thread_sorryserver_receive(const TCP_PROCESS_TYPE_TAG process_type){
9602             down_thread_sorryserver_receive_call_check = true;
9603             tcp_session::down_thread_sorryserver_receive(process_type);
9604         };
9605         bool down_thread_sorryserver_receive_call_check;
9606         
9607         void down_thread_client_send(const TCP_PROCESS_TYPE_TAG process_type){
9608             down_thread_client_send_call_check = true;
9609         };
9610         bool down_thread_client_send_call_check;
9611         
9612         void up_thread_realserver_send(const TCP_PROCESS_TYPE_TAG process_type){
9613             up_thread_realserver_send_call_check = true;
9614         };
9615         bool up_thread_realserver_send_call_check;
9616         
9617         void up_thread_sorryserver_send(const TCP_PROCESS_TYPE_TAG process_type){
9618             up_thread_sorryserver_send_call_check = true;
9619         };
9620         bool up_thread_sorryserver_send_call_check;
9621         
9622         void down_thread_client_connection_chk_event(const TCP_PROCESS_TYPE_TAG process_type){
9623             down_thread_client_connection_chk_event_call_check = true;;
9624         };
9625         bool down_thread_client_connection_chk_event_call_check;
9626         
9627         // map clear
9628         void up_thread_function_array_clear(){
9629             for(int i = 0;i <= UP_FUNC_EXIT;i++){
9630                 up_thread_function_array[i].second = NULL;
9631             }
9632         };
9633         void down_thread_function_array_clear(){
9634             for(int i = 0; i <= DOWN_FUNC_EXIT;i++){
9635                 down_thread_function_array[i].second = NULL;
9636             }
9637         };
9638         
9639         void up_thread_module_event_map_clear(){
9640             up_thread_module_event_map.clear();
9641         };
9642         
9643         void down_thread_module_event_map_clear(){
9644             down_thread_module_event_map.clear();
9645         };
9646 };
9647
9648 // up_thread_client_receive test
9649 void up_thread_client_receive_test(){
9650     BOOST_MESSAGE( "----- up_thread_client_receive test end -----" );
9651
9652     l7vs::virtualservice_tcp vs;
9653     boost::asio::io_service io;
9654     l7vs::tcp_socket_option_info set_option;
9655     //! TCP_NODELAY   (false:not set,true:set option)
9656     set_option.nodelay_opt = false;
9657     //! TCP_NODELAY option value  (false:off,true:on)
9658     set_option.nodelay_val = false;
9659     //! TCP_CORK      (false:not set,true:set option)
9660     set_option.cork_opt = false;
9661     //! TCP_CORK option value     (false:off,true:on)
9662     set_option.cork_val = false;
9663     //! TCP_QUICKACK  (false:not set,true:set option)
9664     set_option.quickack_opt = false;
9665     //! TCP_QUICKACK option value (false:off,true:on)
9666     set_option.quickack_val = false;
9667     //
9668     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
9669     bool set_mode(false);
9670     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
9671     bool set_ssl_cache_flag(false);
9672     int set_ssl_handshake_time_out = 0;
9673     //std::string access_log_file_name = "test";
9674     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
9675
9676     std::string test_protocol_name("test protocol");
9677     l7vs::test_protocol_module proto_test(test_protocol_name);
9678     // up_thread_client_receive
9679     receive_send_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
9680
9681     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
9682     boost::thread::id proc_id = boost::this_thread::get_id();
9683
9684     l7vs::tcp_data& up_thread_data_client_side = test_obj.get_up_thread_data_client_side();
9685     
9686     
9687     // get client socket
9688     l7vs::tcp_socket& socket = test_obj.get_client_socket();
9689     // dummy server client socket connect
9690     boost::system::error_code ec;
9691     test_mirror_server test_server;
9692     // accept req
9693     test_server.breq_acc_flag = true;
9694     // close wait req
9695     test_server.breq_close_wait_flag = true;
9696     // recv cont
9697     test_server.req_recv_cnt = 0;
9698     // test server start
9699     boost::thread server_thread(boost::bind(&test_mirror_server::run,&test_server));
9700     while( !test_server.brun_flag ){
9701         sleep(1);
9702     }
9703
9704
9705     boost::asio::ip::tcp::endpoint connect_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
9706     socket.get_socket().connect(connect_end,ec);
9707     BOOST_CHECK(!ec);
9708     socket.is_open_res = true;
9709
9710     while(!test_server.bconnect_flag){
9711         sleep(1);
9712     }
9713     boost::asio::ip::tcp::endpoint local_endpoint = socket.get_socket().local_endpoint(ec);
9714     BOOST_CHECK(!ec);
9715     
9716     // tcp_session set
9717     up_thread_data_client_side.initialize();
9718     test_obj.set_up_thread_id(proc_id);
9719     test_obj.set_down_thread_id(boost::thread::id());
9720     test_obj.up_thread_realserver_get_destination_event_call_check = false;
9721     test_obj.up_thread_client_disconnect_call_check = false;
9722     test_obj.up_thread_exit_call_check = false;
9723     test_obj.up_thread_client_receive_call_check = false;
9724     // vs set
9725     vs.get_wait_upstream_res = 0;
9726     vs.update_up_recv_size_in = 0;
9727     // socket set
9728     socket.read_some_res = MAX_BUFFER_SIZE;
9729     socket.read_some_ec.clear();
9730     char set_char = CHAR_MIN;
9731     for(int i = 0;i < MAX_BUFFER_SIZE;i++){
9732         socket.read_some_buffers_out[i] = set_char;
9733         if(set_char == CHAR_MAX)
9734             set_char = CHAR_MIN;
9735         else
9736             set_char++;
9737     }
9738     socket.read_some_buffers_size_in = 0;
9739     socket.read_some_call_check = false;
9740     // protocol module set
9741     proto_test.handle_client_recv_res_tag = l7vs::protocol_module_base::REALSERVER_SELECT;
9742     proto_test.handle_client_recv_in_thread_id = boost::thread::id();
9743     for(int i = 0;i < MAX_BUFFER_SIZE;i++){
9744         proto_test.handle_client_recv_in_recvbuffer[i] = '\0';
9745     }
9746     proto_test.handle_client_recv_in_recvlen = 0;
9747
9748     l7vs::Logger::test_loglevel = l7vs::LOG_LV_DEBUG;
9749     l7vs::Logger::putLogDebug_category = l7vs::LOG_CAT_NONE;
9750     l7vs::Logger::putLogDebug_id = 0;
9751
9752     test_obj.test_call_client_receive();
9753     
9754     // unit_test [1] up_thread_client_receive client_socket read_some call check
9755     std::cerr << "[1] up_thread_client_receive client_socket read_some call check" << std::endl;
9756     BOOST_CHECK(socket.read_some_call_check);
9757     BOOST_CHECK(socket.read_some_buffers_out == up_thread_data_client_side.get_data());
9758     BOOST_CHECK(socket.read_some_buffers_size_in == MAX_BUFFER_SIZE);
9759     BOOST_CHECK(socket.read_some_res == up_thread_data_client_side.get_size());
9760     
9761     // unit_test [2] up_thread_client_receive virtualservice update_up_recv_size_in call check
9762     std::cerr << "[2] up_thread_client_receive virtualservice update_up_recv_size_in call check" << std::endl;
9763     BOOST_CHECK(vs.update_up_recv_size_in == MAX_BUFFER_SIZE);
9764     
9765     // unit_test [3] up_thread_client_receive protocol module handle_client_recv call check
9766     std::cerr << "[3] up_thread_client_receive protocol module handle_client_recv call check" << std::endl;
9767     BOOST_CHECK(proto_test.handle_client_recv_in_thread_id == proc_id);
9768     BOOST_CHECK(proto_test.handle_client_recv_in_recvlen == socket.read_some_res);
9769     BOOST_CHECK(proto_test.handle_client_recv_in_recvbuffer == socket.read_some_buffers_out);
9770     
9771     // unit_test [4] up_thread_client_receive up_thread_next_call_function update check
9772     std::cerr << "[4] up_thread_client_receive up_thread_next_call_function update check" << std::endl;
9773     test_obj.next_up_function_call();
9774     BOOST_CHECK(test_obj.up_thread_realserver_get_destination_event_call_check);
9775
9776     // unit_test [5] up_thread_client_receive qos check
9777     std::cerr << "[5] up_thread_client_receive qos check" << std::endl;
9778     socket.read_some_res = 0;
9779      vs.get_wait_upstream_res = 1;
9780
9781     // wait = 0 >> receive
9782     socket.read_some_call_check = false;
9783     vs.get_wait_upstream_res = 0;
9784     test_obj.test_call_client_receive();
9785     BOOST_CHECK(socket.read_some_call_check);
9786
9787     // wait = 1 >> not receive
9788     socket.read_some_call_check = false;
9789     vs.get_wait_upstream_res = 1;
9790     test_obj.test_call_client_receive();
9791     BOOST_CHECK(!socket.read_some_call_check);
9792     std::cerr << l7vs::Logger::putLogDebug_message << std::endl;
9793
9794     socket.read_some_res = MAX_BUFFER_SIZE;
9795     vs.get_throughput_upstream_res = 0;
9796     vs.get_wait_upstream_res = 0;
9797     
9798     // unit_test [6] up_thread_client_receive receive size 0 check
9799     std::cerr << "[6] up_thread_client_receive receive size 0 check" << std::endl;
9800     test_obj.set_up_thread_next_function_call_exit();
9801     socket.read_some_res = 0;
9802     test_obj.test_call_client_receive();
9803     test_obj.up_thread_client_receive_call_check = false;
9804     test_obj.next_up_function_call();
9805     BOOST_CHECK(test_obj.up_thread_client_receive_call_check);
9806     socket.read_some_res = MAX_BUFFER_SIZE;
9807     
9808     // unit_test [7] up_thread_client_receive socket error (try_again) check
9809     std::cerr << "[7] up_thread_client_receive socket error (try_again) check" << std::endl;
9810     test_obj.set_up_thread_next_function_call_exit();
9811     socket.read_some_ec = boost::asio::error::try_again;
9812     test_obj.test_call_client_receive();
9813     test_obj.up_thread_client_receive_call_check = false;
9814     test_obj.next_up_function_call();
9815     BOOST_CHECK(test_obj.up_thread_client_receive_call_check);
9816     socket.read_some_ec.clear();
9817     
9818     // unit_test [8] up_thread_client_receive socket error (eof) check
9819     std::cerr << "[8] up_thread_client_receive socket error (eof) check" << std::endl;
9820     test_obj.set_up_thread_next_function_call_exit();
9821     socket.read_some_ec = boost::asio::error::eof;
9822     test_obj.test_call_client_receive();
9823     test_obj.up_thread_client_disconnect_call_check = false;
9824     test_obj.next_up_function_call();
9825     BOOST_CHECK(test_obj.up_thread_client_disconnect_call_check);
9826     socket.read_some_ec.clear();
9827     
9828     // unit_test [9] up_thread_client_receive socket error (connection_reset) check
9829     std::cerr << "[9] up_thread_client_receive socket error (connection_reset) check" << std::endl;
9830     test_obj.set_up_thread_next_function_call_exit();
9831     socket.read_some_ec = boost::asio::error::connection_reset;
9832     test_obj.test_call_client_receive();
9833     test_obj.up_thread_client_disconnect_call_check = false;
9834     test_obj.next_up_function_call();
9835     BOOST_CHECK(test_obj.up_thread_client_disconnect_call_check);
9836     socket.read_some_ec.clear();
9837     
9838     // unit_test [10] up_thread_client_receive socket error (bad_descriptor) check
9839     std::cerr << "[10] up_thread_client_receive socket error (bad_descriptor) check" << std::endl;
9840     test_obj.set_up_thread_next_function_call_exit();
9841     socket.read_some_ec = boost::asio::error::bad_descriptor;
9842     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
9843     l7vs::Logger::putLogError_id = 0;
9844     test_obj.test_call_client_receive();
9845     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE,l7vs::Logger::putLogError_category);
9846     BOOST_CHECK_EQUAL(0,l7vs::Logger::putLogError_id);
9847     test_obj.up_thread_client_disconnect_call_check = false;
9848     test_obj.next_up_function_call();
9849     BOOST_CHECK(test_obj.up_thread_client_disconnect_call_check);
9850     socket.read_some_ec.clear();
9851
9852     // unit_test [11] up_thread_client_receive closed socket error (bad_descriptor) check
9853     std::cerr << "[11] up_thread_client_receive closed socket error (bad_descriptor) check" << std::endl;
9854     test_obj.set_up_thread_next_function_call_exit();
9855     socket.read_some_ec = boost::asio::error::bad_descriptor;
9856     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
9857     l7vs::Logger::putLogError_id = 0;
9858     socket.is_open_res = false;
9859     test_obj.test_call_client_receive();
9860     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE,l7vs::Logger::putLogError_category);
9861     BOOST_CHECK_EQUAL(0,l7vs::Logger::putLogError_id);
9862     test_obj.up_thread_client_disconnect_call_check = false;
9863     test_obj.next_up_function_call();
9864     BOOST_CHECK(test_obj.up_thread_client_disconnect_call_check);
9865     socket.read_some_ec.clear();
9866     
9867     // unit_test [12] up_thread_client_receive not fond function error check
9868     std::cerr << "[12] up_thread_client_receive not fond function error check" << std::endl;
9869     test_obj.up_thread_function_array_clear();
9870     test_obj.up_thread_exit_call_check = false;
9871     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
9872     l7vs::Logger::putLogError_id = 0;
9873     test_obj.test_call_client_receive();
9874     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
9875     BOOST_CHECK_EQUAL(21,l7vs::Logger::putLogError_id);
9876     std::cerr << l7vs::Logger::putLogError_message << std::endl;
9877     BOOST_CHECK(test_obj.up_thread_exit_call_check);
9878     
9879     // unit_test [13] up_thread_client_receive returnd illegal EVENT_TAG error check
9880     std::cerr << "[13] up_thread_client_receive returnd illegal EVENT_TAG error check" << std::endl;
9881     test_obj.up_thread_module_event_map_clear();
9882     test_obj.up_thread_exit_call_check = false;
9883     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
9884     l7vs::Logger::putLogError_id = 0;
9885     test_obj.test_call_client_receive();
9886     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
9887     BOOST_CHECK_EQUAL(20,l7vs::Logger::putLogError_id);
9888     std::cerr << l7vs::Logger::putLogError_message << std::endl;
9889     BOOST_CHECK(test_obj.up_thread_exit_call_check);
9890     
9891     // dummy server stop
9892     test_server.breq_close_wait_flag = false;    
9893     test_server.bstop_flag = true;
9894     server_thread.join();
9895
9896
9897     //----ssl mode test
9898     receive_send_test_class test_ssl_mode_obj(vs,io,set_option,listen_endpoint,true,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
9899     test_ssl_mode_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
9900     l7vs::tcp_ssl_socket& ssl_socket = test_ssl_mode_obj.get_client_ssl_socket();
9901     l7vs::tcp_data& up_thread_data_ssl_client_side = test_ssl_mode_obj.get_up_thread_data_client_side();
9902
9903     // tcp_session set
9904     up_thread_data_ssl_client_side.initialize();
9905     test_ssl_mode_obj.set_up_thread_id(proc_id);
9906     test_ssl_mode_obj.set_down_thread_id(boost::thread::id());
9907     test_ssl_mode_obj.up_thread_realserver_get_destination_event_call_check = false;
9908     test_ssl_mode_obj.up_thread_client_disconnect_call_check = false;
9909     test_ssl_mode_obj.up_thread_exit_call_check = false;
9910     test_ssl_mode_obj.up_thread_client_receive_call_check = false;
9911
9912     // vs set
9913     vs.get_wait_upstream_res = 0;
9914     vs.update_up_recv_size_in = 0;
9915
9916     // socket set
9917     ssl_socket.read_some_res = MAX_BUFFER_SIZE;
9918     ssl_socket.read_some_ec.clear();
9919     set_char = CHAR_MIN;
9920     for(int i = 0;i < MAX_BUFFER_SIZE;i++){
9921         ssl_socket.read_some_buffers_out[i] = set_char;
9922         if(set_char == CHAR_MAX)
9923             set_char = CHAR_MIN;
9924         else
9925             set_char++;
9926     }
9927     ssl_socket.read_some_buffers_size_in = 0;
9928     ssl_socket.read_some_call_check = false;
9929
9930     // protocol module set
9931     proto_test.handle_client_recv_res_tag = l7vs::protocol_module_base::REALSERVER_SELECT;
9932     proto_test.handle_client_recv_in_thread_id = boost::thread::id();
9933     for(int i = 0;i < MAX_BUFFER_SIZE;i++){
9934         proto_test.handle_client_recv_in_recvbuffer[i] = '\0';
9935     }
9936     proto_test.handle_client_recv_in_recvlen = 0;
9937
9938     l7vs::Logger::test_loglevel = l7vs::LOG_LV_DEBUG;
9939     l7vs::Logger::putLogDebug_category = l7vs::LOG_CAT_NONE;
9940     l7vs::Logger::putLogDebug_id = 0;
9941
9942     test_ssl_mode_obj.test_call_client_receive();
9943     
9944     // unit_test [14] up_thread_client_receive ssl mode client_ssl_socket read_some call check
9945     std::cerr << "[14] up_thread_client_receive ssl mode client_ssl_socket read_some call check" << std::endl;
9946     BOOST_CHECK(ssl_socket.read_some_call_check);
9947     BOOST_CHECK(ssl_socket.read_some_buffers_out == up_thread_data_ssl_client_side.get_data());
9948     BOOST_CHECK(ssl_socket.read_some_buffers_size_in == MAX_BUFFER_SIZE);
9949     BOOST_CHECK(ssl_socket.read_some_res == up_thread_data_ssl_client_side.get_size());
9950
9951     BOOST_MESSAGE( "----- up_thread_client_receive test end -----" );
9952 }
9953
9954
9955 // down_thread_realserver_receive test
9956 void down_thread_realserver_receive_test(){
9957     BOOST_MESSAGE( "----- down_thread_realserver_receive test start -----" );
9958 //    boost::asio::io_service io;
9959 //    l7vs::virtualservice_tcp vs;
9960     l7vs::virtualservice_tcp vs;
9961     boost::asio::io_service io;
9962     l7vs::tcp_socket_option_info set_option;
9963     //! TCP_NODELAY   (false:not set,true:set option)
9964     set_option.nodelay_opt = false;
9965     //! TCP_NODELAY option value  (false:off,true:on)
9966     set_option.nodelay_val = false;
9967     //! TCP_CORK      (false:not set,true:set option)
9968     set_option.cork_opt = false;
9969     //! TCP_CORK option value     (false:off,true:on)
9970     set_option.cork_val = false;
9971     //! TCP_QUICKACK  (false:not set,true:set option)
9972     set_option.quickack_opt = false;
9973     //! TCP_QUICKACK option value (false:off,true:on)
9974     set_option.quickack_val = false;
9975     //
9976     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
9977     bool set_mode(false);
9978     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
9979     bool set_ssl_cache_flag(false);
9980     int set_ssl_handshake_time_out = 0;
9981     //std::string access_log_file_name = "test";
9982     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
9983
9984     std::string test_protocol_name("test protocol");
9985     l7vs::test_protocol_module proto_test(test_protocol_name);
9986 //    receive_send_test_class test_obj(vs,io);
9987     receive_send_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
9988
9989
9990     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
9991     boost::thread::id proc_id = boost::this_thread::get_id();
9992     
9993     l7vs::tcp_data& down_thread_data_dest_side = test_obj.get_down_thread_data_dest_side();
9994     
9995     // set realserver socket
9996     std::list< std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > >& rs_list = test_obj.get_down_thread_receive_realserver_socket_list();
9997     std::list< std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > >::iterator& rs_cur = test_obj.get_down_thread_current_receive_realserver_socket();
9998     std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > push_pair;
9999     
10000     for(int i = 0 ; i < 3 ;i++){
10001         boost::shared_ptr< l7vs::tcp_socket > new_socket(new l7vs::tcp_socket(io));
10002         push_pair.first.address(boost::asio::ip::address::from_string(DUMMY_SERVER_IP));
10003         push_pair.first.port(7000+i);
10004         push_pair.second = new_socket;
10005         // socket set
10006         new_socket->read_some_res = MAX_BUFFER_SIZE;
10007         new_socket->read_some_ec.clear();
10008         new_socket->is_open_res = true;
10009         char set_char = CHAR_MIN;
10010         for(int j = 0;j < MAX_BUFFER_SIZE;j++){
10011             new_socket->read_some_buffers_out[j] = set_char;
10012             if(set_char == CHAR_MAX)
10013                 set_char = CHAR_MIN;
10014             else
10015                 set_char++;
10016         }
10017         new_socket->read_some_buffers_size_in = 0;
10018         new_socket->read_some_call_check = false;
10019         rs_list.push_back(push_pair);
10020     }
10021     rs_cur = rs_list.begin();
10022     
10023     // tcp_session set
10024     down_thread_data_dest_side.initialize();
10025     test_obj.set_down_thread_id(proc_id);
10026     test_obj.set_up_thread_id(boost::thread::id());
10027     test_obj.down_thread_client_connection_chk_event_call_check = false;
10028     test_obj.down_thread_realserver_disconnect_call_check = false;
10029     test_obj.down_thread_exit_call_check = false;
10030     test_obj.down_thread_realserver_receive_call_check = false;
10031     // vs set
10032 //    vs.get_qos_downstream_res = 104857600;
10033 //    vs.get_throughput_downstream_res = 0;
10034     vs.get_wait_downstream_res = 0;
10035     vs.update_down_recv_size_in = 0;
10036     // protocol module set
10037     proto_test.handle_realserver_recv_tcp_res_tag = l7vs::protocol_module_base::CLIENT_CONNECTION_CHECK;
10038     proto_test.handle_realserver_recv_tcp_in_thread_id = boost::thread::id();
10039     for(int i = 0;i < MAX_BUFFER_SIZE;i++){
10040         proto_test.handle_realserver_recv_tcp_in_recvbuffer[i] = '\0';
10041     }
10042     proto_test.handle_realserver_recv_tcp_in_recvlen = 0;
10043     proto_test.handle_realserver_recv_tcp_in_rs_endpoint = boost::asio::ip::tcp::endpoint();
10044     
10045     boost::asio::ip::tcp::endpoint rs_end = rs_cur->first;
10046     l7vs::tcp_socket& socket = *(rs_cur->second);
10047     l7vs::Logger::test_loglevel = l7vs::LOG_LV_DEBUG;
10048     l7vs::Logger::putLogDebug_category = l7vs::LOG_CAT_NONE;
10049     l7vs::Logger::putLogDebug_id = 0;
10050     
10051     test_obj.test_call_realserver_receive();
10052     
10053     // unit_test [1] down_thread_realserver_receive realserver read_some call check
10054     std::cerr << "[1] down_thread_realserver_receive realserver read_some call check" << std::endl;
10055     BOOST_CHECK(socket.read_some_call_check);
10056     BOOST_CHECK(socket.read_some_buffers_out == down_thread_data_dest_side.get_data());
10057     BOOST_CHECK(socket.read_some_buffers_size_in == MAX_BUFFER_SIZE);
10058     BOOST_CHECK(socket.read_some_res == down_thread_data_dest_side.get_size());
10059     BOOST_CHECK(rs_end == down_thread_data_dest_side.get_endpoint());
10060     
10061     // unit_test [2] down_thread_realserver_receive virtualservice update_down_recv_size_in call check
10062     std::cerr << "[2] down_thread_realserver_receive virtualservice update_down_recv_size_in call check" << std::endl;
10063     BOOST_CHECK(vs.update_down_recv_size_in == MAX_BUFFER_SIZE);
10064     
10065     // unit_test [3] down_thread_realserver_receive protocol module handle_realserver_recv call check
10066     std::cerr << "[3] down_thread_realserver_receive protocol module handle_realserver_recv call check" << std::endl;
10067     BOOST_CHECK(proto_test.handle_realserver_recv_tcp_in_thread_id == proc_id);
10068     BOOST_CHECK(proto_test.handle_realserver_recv_tcp_in_recvlen == socket.read_some_res);
10069     BOOST_CHECK(proto_test.handle_realserver_recv_tcp_in_recvbuffer == socket.read_some_buffers_out);
10070     BOOST_CHECK(proto_test.handle_realserver_recv_tcp_in_rs_endpoint == rs_end);
10071     
10072     // unit_test [4] down_thread_realserver_receive down_thread_next_call_function update check
10073     std::cerr << "[4] down_thread_realserver_receive down_thread_next_call_function update check" << std::endl;
10074     test_obj.next_down_function_call();
10075     BOOST_CHECK(test_obj.down_thread_client_connection_chk_event_call_check);
10076
10077     // unit_test [5] down_thread_realserver_receive realserver_recv down_thread_current_receive_realserver_socket inclement & cyclic check
10078     std::cerr << "[5] down_thread_realserver_receive realserver_recv down_thread_current_receive_realserver_socket inclement & cyclic check" << std::endl;
10079     std::list< std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > >::iterator check_it;
10080     rs_cur = rs_list.begin();
10081     check_it = rs_list.begin();
10082     test_obj.test_call_realserver_receive();
10083     check_it++;
10084     BOOST_CHECK(check_it == rs_cur);
10085     test_obj.test_call_realserver_receive();
10086     check_it++;
10087     BOOST_CHECK(check_it == rs_cur);
10088     test_obj.test_call_realserver_receive();
10089     check_it = rs_list.begin();
10090     BOOST_CHECK(check_it == rs_cur);
10091     
10092     // unit_test [6] down_thread_realserver_receive qos check
10093     std::cerr << "[6] down_thread_realserver_receive qos check" << std::endl;
10094     socket.read_some_res = 0;
10095
10096     // wait = 0 >> receive
10097     rs_cur = rs_list.begin();
10098     socket.read_some_call_check = false;
10099     vs.get_wait_downstream_res = 0;
10100     test_obj.test_call_realserver_receive();
10101     BOOST_CHECK(socket.read_some_call_check);
10102
10103     // wait = 1 >> not receive
10104     rs_cur = rs_list.begin();
10105     socket.read_some_call_check = false;
10106     vs.get_wait_downstream_res = 1;
10107     test_obj.test_call_realserver_receive();
10108     BOOST_CHECK(!socket.read_some_call_check);
10109
10110     socket.read_some_res = MAX_BUFFER_SIZE;
10111     vs.get_throughput_downstream_res = 0;
10112     vs.get_wait_downstream_res = 0;
10113     
10114     // unit_test [7] down_thread_realserver_receive receive size 0 check
10115     std::cerr << "[7] down_thread_realserver_receive receive size 0 check" << std::endl;
10116     rs_cur = rs_list.begin();
10117     test_obj.set_down_thread_next_function_call_exit();
10118     socket.read_some_res = 0;
10119     test_obj.test_call_realserver_receive();
10120     test_obj.down_thread_realserver_receive_call_check = false;
10121     test_obj.next_down_function_call();
10122     BOOST_CHECK(test_obj.down_thread_realserver_receive_call_check);
10123     socket.read_some_res = MAX_BUFFER_SIZE;
10124     
10125     // unit_test [8] down_thread_realserver_receive socket error (try_again) check
10126     std::cerr << "[8] down_thread_realserver_receive socket error (try_again) check" << std::endl;
10127     rs_cur = rs_list.begin();
10128     test_obj.set_down_thread_next_function_call_exit();
10129     socket.read_some_ec = boost::asio::error::try_again;
10130     test_obj.test_call_realserver_receive();
10131     test_obj.down_thread_realserver_receive_call_check = false;
10132     test_obj.next_down_function_call();
10133     BOOST_CHECK(test_obj.down_thread_realserver_receive_call_check);
10134     socket.read_some_ec.clear();
10135     
10136     // unit_test [9] down_thread_realserver_receive socket error (eof) check
10137     std::cerr << "[9] down_thread_realserver_receive socket error (eof) check" << std::endl;
10138     rs_cur = rs_list.begin();
10139     test_obj.set_down_thread_next_function_call_exit();
10140     socket.read_some_ec = boost::asio::error::eof;
10141     test_obj.test_call_realserver_receive();
10142     test_obj.down_thread_realserver_disconnect_call_check = false;
10143     test_obj.next_down_function_call();
10144     BOOST_CHECK(test_obj.down_thread_realserver_disconnect_call_check);
10145     socket.read_some_ec.clear();
10146     
10147     // unit_test [10] down_thread_realserver_receive socket error (connection_reset) check
10148     std::cerr << "[10] down_thread_realserver_receive socket error (connection_reset) check" << std::endl;
10149     rs_cur = rs_list.begin();
10150     test_obj.set_down_thread_next_function_call_exit();
10151     socket.read_some_ec = boost::asio::error::connection_reset;
10152     test_obj.test_call_realserver_receive();
10153     test_obj.down_thread_realserver_disconnect_call_check = false;
10154     test_obj.next_down_function_call();
10155     BOOST_CHECK(test_obj.down_thread_realserver_disconnect_call_check);
10156     socket.read_some_ec.clear();
10157     
10158     // unit_test [11] down_thread_realserver_receive socket error (bad_descriptor) check
10159     std::cerr << "[11] down_thread_realserver_receive socket error (bad_descriptor) check" << std::endl;
10160     rs_cur = rs_list.begin();
10161     test_obj.set_down_thread_next_function_call_exit();
10162     socket.read_some_ec = boost::asio::error::bad_descriptor;
10163     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
10164     l7vs::Logger::putLogError_id = 0;
10165     test_obj.test_call_realserver_receive();
10166     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE,l7vs::Logger::putLogError_category);
10167     BOOST_CHECK_EQUAL(0,l7vs::Logger::putLogError_id);
10168     std::cerr << l7vs::Logger::putLogError_message << std::endl;
10169     test_obj.down_thread_realserver_disconnect_call_check = false;
10170     test_obj.next_down_function_call();
10171     BOOST_CHECK(test_obj.down_thread_realserver_disconnect_call_check);
10172     socket.read_some_ec.clear();
10173
10174     // unit_test [12] down_thread_realserver_receive closed socket error (bad_descriptor) check
10175     std::cerr << "[12] down_thread_realserver_receive closed socket error (bad_descriptor) check" << std::endl;
10176     rs_cur = rs_list.begin();
10177     test_obj.set_down_thread_next_function_call_exit();
10178     socket.read_some_ec = boost::asio::error::bad_descriptor;
10179     socket.is_open_res = false;
10180     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
10181     l7vs::Logger::putLogError_id = 0;
10182     test_obj.test_call_realserver_receive();
10183     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE,l7vs::Logger::putLogError_category);
10184     BOOST_CHECK_EQUAL(0,l7vs::Logger::putLogError_id);
10185     test_obj.down_thread_realserver_disconnect_call_check = false;
10186     test_obj.next_down_function_call();
10187     BOOST_CHECK(test_obj.down_thread_realserver_disconnect_call_check);
10188     socket.read_some_ec.clear();
10189         
10190     // unit_test [13] down_thread_realserver_receive not fond function error check
10191     std::cerr << "[13] down_thread_realserver_receive not fond function error check" << std::endl;
10192     test_obj.down_thread_function_array_clear();
10193     test_obj.down_thread_exit_call_check = false;
10194     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
10195     l7vs::Logger::putLogError_id = 0;
10196     test_obj.test_call_realserver_receive();
10197     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
10198     BOOST_CHECK_EQUAL(71,l7vs::Logger::putLogError_id);
10199     std::cerr << l7vs::Logger::putLogError_message << std::endl;
10200     BOOST_CHECK(test_obj.down_thread_exit_call_check);
10201     
10202     // unit_test [14] down_thread_realserver_receive returnd illegal EVENT_TAG error check
10203     std::cerr << "[14] down_thread_realserver_receive returnd illegal EVENT_TAG error check" << std::endl;
10204     test_obj.down_thread_module_event_map_clear();
10205     test_obj.down_thread_exit_call_check = false;
10206     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
10207     l7vs::Logger::putLogError_id = 0;
10208     test_obj.test_call_realserver_receive();
10209     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
10210     BOOST_CHECK_EQUAL(70,l7vs::Logger::putLogError_id);
10211     std::cerr << l7vs::Logger::putLogError_message << std::endl;
10212     BOOST_CHECK(test_obj.down_thread_exit_call_check);
10213     
10214     // unit_test [15] down_thread_realserver_receive  empty down_thread_receive_realserver_socket_list check
10215     std::cerr << "[15] down_thread_realserver_receive  empty down_thread_receive_realserver_socket_list check" << std::endl;
10216     rs_cur = rs_list.begin();
10217     std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > sock_pair = *rs_cur;
10218     rs_list.clear();
10219 //    BOOST_CHECK(*rs_cur == sock_pair);
10220     socket.read_some_call_check = false;
10221     test_obj.test_call_realserver_receive();
10222     BOOST_CHECK(!socket.read_some_call_check);
10223     
10224     BOOST_MESSAGE( "----- down_thread_realserver_receive test end -----" );
10225 }
10226
10227 // down_thread_sorryserver_receive test
10228 void down_thread_sorryserver_receive_test(){
10229     BOOST_MESSAGE( "----- down_thread_sorryserver_receive test start -----" );
10230 //    boost::asio::io_service io;
10231 //    l7vs::virtualservice_tcp vs;
10232     l7vs::virtualservice_tcp vs;
10233     boost::asio::io_service io;
10234     l7vs::tcp_socket_option_info set_option;
10235     //! TCP_NODELAY   (false:not set,true:set option)
10236     set_option.nodelay_opt = false;
10237     //! TCP_NODELAY option value  (false:off,true:on)
10238     set_option.nodelay_val = false;
10239     //! TCP_CORK      (false:not set,true:set option)
10240     set_option.cork_opt = false;
10241     //! TCP_CORK option value     (false:off,true:on)
10242     set_option.cork_val = false;
10243     //! TCP_QUICKACK  (false:not set,true:set option)
10244     set_option.quickack_opt = false;
10245     //! TCP_QUICKACK option value (false:off,true:on)
10246     set_option.quickack_val = false;
10247     //
10248     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
10249     bool set_mode(false);
10250     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
10251     bool set_ssl_cache_flag(false);
10252     int set_ssl_handshake_time_out = 0;
10253     //std::string access_log_file_name = "test";
10254     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
10255
10256     std::string test_protocol_name("test protocol");
10257     l7vs::test_protocol_module proto_test(test_protocol_name);
10258 //    receive_send_test_class test_obj(vs,io);
10259     receive_send_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
10260
10261     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
10262     boost::thread::id proc_id = boost::this_thread::get_id();
10263     
10264     l7vs::tcp_data& down_thread_data_dest_side = test_obj.get_down_thread_data_dest_side();
10265     
10266     // set sorryserver socket
10267     std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > >& socket_pair = test_obj.get_sorryserver_socket();
10268     boost::asio::ip::tcp::endpoint& sorry_end = socket_pair.first;
10269     l7vs::tcp_socket& socket = *(socket_pair.second);
10270     sorry_end.address(boost::asio::ip::address::from_string(DUMMY_SERVER_IP));
10271     sorry_end.port(7000);
10272     // socket set
10273     socket.read_some_res = MAX_BUFFER_SIZE;
10274     socket.read_some_ec.clear();
10275     socket.is_open_res = true;
10276     char set_char = CHAR_MIN;
10277     for(int j = 0;j < MAX_BUFFER_SIZE;j++){
10278         socket.read_some_buffers_out[j] = set_char;
10279         if(set_char == CHAR_MAX)
10280             set_char = CHAR_MIN;
10281         else
10282             set_char++;
10283     }
10284     socket.read_some_buffers_size_in = 0;
10285     socket.read_some_call_check = false;
10286     // tcp_session set
10287     down_thread_data_dest_side.initialize();
10288     test_obj.set_down_thread_id(proc_id);
10289     test_obj.set_up_thread_id(boost::thread::id());
10290     test_obj.down_thread_client_connection_chk_event_call_check = false;
10291     test_obj.down_thread_realserver_disconnect_call_check = false;
10292     test_obj.down_thread_exit_call_check = false;
10293     test_obj.down_thread_realserver_receive_call_check = false;
10294     // vs set
10295     vs.get_qos_downstream_res = 104857600;
10296     vs.get_throughput_downstream_res = 0;
10297     vs.update_down_recv_size_in = 0;
10298     // protocol module set
10299     proto_test.handle_sorryserver_recv_res_tag = l7vs::protocol_module_base::CLIENT_CONNECTION_CHECK;
10300     proto_test.handle_sorryserver_recv_in_thread_id = boost::thread::id();
10301     for(int i = 0;i < MAX_BUFFER_SIZE;i++){
10302         proto_test.handle_sorryserver_recv_in_recvbuffer[i] = '\0';
10303     }
10304     proto_test.handle_sorryserver_recv_in_recvlen = 0;
10305     proto_test.handle_sorryserver_recv_in_sorry_endpoint = boost::asio::ip::tcp::endpoint();
10306     
10307     l7vs::Logger::test_loglevel = l7vs::LOG_LV_DEBUG;
10308     l7vs::Logger::putLogDebug_category = l7vs::LOG_CAT_NONE;
10309     l7vs::Logger::putLogDebug_id = 0;
10310
10311     test_obj.test_call_sorryserver_receive();
10312
10313     // unit_test [1] down_thread_sorryserver_receive sorryserver read_some call check
10314     std::cerr << "[1] down_thread_sorryserver_receive sorryserver read_some call check" << std::endl;
10315     BOOST_CHECK(socket.read_some_call_check);
10316     BOOST_CHECK(socket.read_some_buffers_out == down_thread_data_dest_side.get_data());
10317     BOOST_CHECK(socket.read_some_buffers_size_in == MAX_BUFFER_SIZE);
10318     BOOST_CHECK(socket.read_some_res == down_thread_data_dest_side.get_size());
10319     BOOST_CHECK(sorry_end == down_thread_data_dest_side.get_endpoint());
10320     
10321     // unit_test [2] down_thread_sorryserver_receive protocol module handle_sorryserver_recv call check
10322     std::cerr << "[2] down_thread_sorryserver_receive protocol module handle_sorryserver_recv call check" << std::endl;
10323     BOOST_CHECK(proto_test.handle_sorryserver_recv_in_thread_id == proc_id);
10324     BOOST_CHECK(proto_test.handle_sorryserver_recv_in_recvlen == socket.read_some_res);
10325     BOOST_CHECK(proto_test.handle_sorryserver_recv_in_recvbuffer == socket.read_some_buffers_out);
10326     BOOST_CHECK(proto_test.handle_sorryserver_recv_in_sorry_endpoint == sorry_end);
10327     
10328     // unit_test [3] down_thread_sorryserver_receive down_thread_next_call_function update check
10329     std::cerr << "[3] down_thread_sorryserver_receive down_thread_next_call_function update check" << std::endl;
10330     test_obj.next_down_function_call();
10331     BOOST_CHECK(test_obj.down_thread_client_connection_chk_event_call_check);
10332
10333     // unit_test [4] down_thread_sorryserver_receive receive size 0 check
10334     std::cerr << "[4] down_thread_sorryserver_receive receive size 0 check" << std::endl;
10335     test_obj.set_down_thread_next_function_call_exit();
10336     socket.read_some_res = 0;
10337     test_obj.test_call_sorryserver_receive();
10338     test_obj.down_thread_sorryserver_receive_call_check = false;
10339     test_obj.next_down_function_call();
10340     BOOST_CHECK(test_obj.down_thread_sorryserver_receive_call_check);
10341     socket.read_some_res = MAX_BUFFER_SIZE;
10342     
10343     // unit_test [5] down_thread_sorryserver_receive socket error (try_again) check
10344     std::cerr << "[5] down_thread_sorryserver_receive socket error (try_again) check" << std::endl;
10345     test_obj.set_down_thread_next_function_call_exit();
10346     socket.read_some_ec = boost::asio::error::try_again;
10347     test_obj.test_call_sorryserver_receive();
10348     test_obj.down_thread_sorryserver_receive_call_check = false;
10349     test_obj.next_down_function_call();
10350     BOOST_CHECK(test_obj.down_thread_sorryserver_receive_call_check);
10351     socket.read_some_ec.clear();
10352     
10353     // unit_test [6] down_thread_sorryserver_receive socket error (eof) check
10354     std::cerr << "[6] down_thread_sorryserver_receive socket error (eof) check" << std::endl;
10355     test_obj.set_down_thread_next_function_call_exit();
10356     socket.read_some_ec = boost::asio::error::eof;
10357     test_obj.test_call_sorryserver_receive();
10358     test_obj.down_thread_sorryserver_disconnect_call_check = false;
10359     test_obj.next_down_function_call();
10360     BOOST_CHECK(test_obj.down_thread_sorryserver_disconnect_call_check);
10361     socket.read_some_ec.clear();
10362     
10363     // unit_test [7] down_thread_sorryserver_receive socket error (connection_reset) check
10364     std::cerr << "[7] down_thread_sorryserver_receive socket error (connection_reset) check" << std::endl;
10365     test_obj.set_down_thread_next_function_call_exit();
10366     socket.read_some_ec = boost::asio::error::connection_reset;
10367     test_obj.test_call_sorryserver_receive();
10368     test_obj.down_thread_sorryserver_disconnect_call_check = false;
10369     test_obj.next_down_function_call();
10370     BOOST_CHECK(test_obj.down_thread_sorryserver_disconnect_call_check);
10371     socket.read_some_ec.clear();
10372     
10373     // unit_test [8] down_thread_sorryserver_receive socket error (bad_descriptor) check
10374     std::cerr << "[8] down_thread_sorryserver_receive socket error (bad_descriptor) check" << std::endl;
10375     test_obj.set_down_thread_next_function_call_exit();
10376     socket.read_some_ec = boost::asio::error::bad_descriptor;
10377     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
10378     l7vs::Logger::putLogError_id = 0;
10379     test_obj.test_call_sorryserver_receive();
10380     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE,l7vs::Logger::putLogError_category);
10381     BOOST_CHECK_EQUAL(0,l7vs::Logger::putLogError_id);
10382     std::cerr << l7vs::Logger::putLogError_message << std::endl;
10383     test_obj.down_thread_sorryserver_disconnect_call_check = false;
10384     test_obj.next_down_function_call();
10385     BOOST_CHECK(test_obj.down_thread_sorryserver_disconnect_call_check);
10386     socket.read_some_ec.clear();
10387
10388     // unit_test [9] down_thread_sorryserver_receive closed socket error (bad_descriptor) check
10389     std::cerr << "[9] down_thread_sorryserver_receive closed socket error (bad_descriptor) check" << std::endl;
10390     test_obj.set_down_thread_next_function_call_exit();
10391     socket.read_some_ec = boost::asio::error::bad_descriptor;
10392     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
10393     l7vs::Logger::putLogError_id = 0;
10394     socket.is_open_res = false;
10395     test_obj.test_call_sorryserver_receive();
10396     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE,l7vs::Logger::putLogError_category);
10397     BOOST_CHECK_EQUAL(0,l7vs::Logger::putLogError_id);
10398     test_obj.down_thread_sorryserver_disconnect_call_check = false;
10399     test_obj.next_down_function_call();
10400     BOOST_CHECK(test_obj.down_thread_sorryserver_disconnect_call_check);
10401     socket.read_some_ec.clear();
10402
10403     // unit_test [10] down_thread_sorryserver_receive not fond function error check
10404     std::cerr << "[10] down_thread_sorryserver_receive not fond function error check" << std::endl;
10405     test_obj.down_thread_function_array_clear();
10406     test_obj.down_thread_exit_call_check = false;
10407     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
10408     l7vs::Logger::putLogError_id = 0;
10409     test_obj.test_call_sorryserver_receive();
10410     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
10411     BOOST_CHECK_EQUAL(89,l7vs::Logger::putLogError_id);
10412     std::cerr << l7vs::Logger::putLogError_message << std::endl;
10413     BOOST_CHECK(test_obj.down_thread_exit_call_check);
10414
10415     // unit_test [11] down_thread_sorryserver_receive returnd illegal EVENT_TAG error check
10416     std::cerr << "[11] down_thread_sorryserver_receive returnd illegal EVENT_TAG error check" << std::endl;
10417     test_obj.down_thread_module_event_map_clear();
10418     test_obj.down_thread_exit_call_check = false;
10419     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
10420     l7vs::Logger::putLogError_id = 0;
10421     test_obj.test_call_sorryserver_receive();
10422     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
10423     BOOST_CHECK_EQUAL(88,l7vs::Logger::putLogError_id);
10424     std::cerr << l7vs::Logger::putLogError_message << std::endl;
10425     BOOST_CHECK(test_obj.down_thread_exit_call_check);
10426
10427     BOOST_MESSAGE( "----- down_thread_sorryserver_receive test end -----" );
10428 }
10429
10430 // up_thread_realserver_send test
10431 void up_thread_realserver_send_test(){
10432     BOOST_MESSAGE( "----- up_thread_realserver_send test end -----" );
10433 //    boost::asio::io_service io;
10434 //    l7vs::virtualservice_tcp vs;
10435     l7vs::virtualservice_tcp vs;
10436     boost::asio::io_service io;
10437     l7vs::tcp_socket_option_info set_option;
10438     //! TCP_NODELAY   (false:not set,true:set option)
10439     set_option.nodelay_opt = false;
10440     //! TCP_NODELAY option value  (false:off,true:on)
10441     set_option.nodelay_val = false;
10442     //! TCP_CORK      (false:not set,true:set option)
10443     set_option.cork_opt = false;
10444     //! TCP_CORK option value     (false:off,true:on)
10445     set_option.cork_val = false;
10446     //! TCP_QUICKACK  (false:not set,true:set option)
10447     set_option.quickack_opt = false;
10448     //! TCP_QUICKACK option value (false:off,true:on)
10449     set_option.quickack_val = false;
10450     //
10451     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
10452     bool set_mode(false);
10453     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
10454     bool set_ssl_cache_flag(false);
10455     int set_ssl_handshake_time_out = 0;
10456     //std::string access_log_file_name = "test";
10457     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
10458
10459     std::string test_protocol_name("test protocol");
10460     l7vs::test_protocol_module proto_test(test_protocol_name);
10461     // up_thread_realserver_send
10462 //    receive_send_test_class test_obj(vs,io);
10463     receive_send_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
10464
10465     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
10466     boost::thread::id proc_id = boost::this_thread::get_id();
10467     
10468     l7vs::tcp_data& send_data = test_obj.get_up_thread_data_dest_side();
10469     
10470     // set realserver socket
10471     std::map<boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > >& rs_map = test_obj.get_up_thread_send_realserver_socket_map();
10472     std::map<boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > >::iterator rs_it;
10473     std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > push_pair;
10474     for(int i = 0 ; i < 3 ;i++){
10475         boost::shared_ptr< l7vs::tcp_socket > new_socket(new l7vs::tcp_socket(io));
10476         push_pair.first.address(boost::asio::ip::address::from_string(DUMMY_SERVER_IP));
10477         push_pair.first.port(7000+i);
10478         push_pair.second = new_socket;
10479         new_socket->write_some_res = MAX_BUFFER_SIZE;
10480         new_socket->write_some_ec.clear();
10481         new_socket->write_some_buffers_in = NULL;
10482         new_socket->write_some_buffers_size_in = 0;
10483         new_socket->write_some_call_check = false;
10484         rs_map.insert(push_pair);
10485     }
10486     
10487     // tcp_session set
10488     send_data.initialize();
10489     send_data.set_size(MAX_BUFFER_SIZE);
10490     boost::asio::ip::tcp::endpoint send_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP),7002);
10491     send_data.set_endpoint(send_end);
10492     test_obj.set_up_thread_id(proc_id);
10493     test_obj.set_down_thread_id(boost::thread::id());
10494     test_obj.up_thread_client_receive_call_check = false;
10495     test_obj.up_thread_realserver_disconnect_call_check = false;
10496     test_obj.up_thread_exit_call_check = false;
10497     test_obj.up_thread_realserver_get_destination_event_call_check = false;
10498     // vs set
10499     vs.update_up_send_size_in = 0;
10500     // protocol module set
10501     proto_test.handle_realserver_send_res_tag = l7vs::protocol_module_base::CLIENT_RECV;
10502     proto_test.handle_realserver_send_in_thread_id = boost::thread::id();
10503     
10504     rs_it = rs_map.find(send_end);
10505     l7vs::tcp_socket& socket = *(rs_it->second);
10506     
10507     l7vs::Logger::test_loglevel = l7vs::LOG_LV_DEBUG;
10508     l7vs::Logger::putLogDebug_category = l7vs::LOG_CAT_NONE;
10509     l7vs::Logger::putLogDebug_id = 0;
10510     
10511     test_obj.test_call_realserver_send();
10512     
10513     // unit_test [1] up_thread_realserver_send realserver_socket write_some call check
10514     std::cerr << "[1] up_thread_realserver_send realserver_socket write_some call check" << std::endl;
10515     BOOST_CHECK(socket.write_some_call_check);
10516     BOOST_CHECK(socket.write_some_buffers_in == (void*)&(send_data.get_data()));
10517     BOOST_CHECK(socket.write_some_buffers_size_in == MAX_BUFFER_SIZE);
10518     BOOST_CHECK(socket.write_some_res == send_data.get_send_size());
10519     
10520     // unit_test [2] up_thread_realserver_send virtualservice update_up_send_size_in call check
10521     std::cerr << "[2] up_thread_realserver_send virtualservice update_up_send_size_in call check" << std::endl;
10522     BOOST_CHECK(vs.update_up_send_size_in == MAX_BUFFER_SIZE);
10523     
10524     // unit_test [3] up_thread_realserver_send protocol module handle_realserver_send call check
10525     std::cerr << "[3] up_thread_realserver_send protocol module handle_realserver_send call check" << std::endl;
10526     BOOST_CHECK(proto_test.handle_realserver_send_in_thread_id == proc_id);
10527     
10528     // unit_test [4] up_thread_realserver_send up_thread_next_call_function update check
10529     std::cerr << "[4] up_thread_realserver_send up_thread_next_call_function update check" << std::endl;
10530     test_obj.next_up_function_call();
10531     BOOST_CHECK(test_obj.up_thread_client_receive_call_check);
10532
10533     // unit_test [5] up_thread_realserver_send send size check
10534     std::cerr << "[5] up_thread_realserver_send send size check" << std::endl;
10535     send_data.set_send_size(0);
10536     socket.write_some_res = 0;
10537     test_obj.set_up_thread_next_function_call_exit();
10538     socket.write_some_buffers_in = NULL;
10539     test_obj.test_call_realserver_send();
10540 //    BOOST_CHECK((char*)socket.write_some_buffers_in == (char*)&(send_data.get_data()) + 0);
10541     BOOST_CHECK((char*)socket.write_some_buffers_in == (send_data.get_data().data() + 0));
10542     test_obj.up_thread_realserver_send_call_check = false;
10543     test_obj.next_up_function_call();
10544     BOOST_CHECK(test_obj.up_thread_realserver_send_call_check);
10545     
10546     socket.write_some_res = MAX_BUFFER_SIZE / 3;
10547     test_obj.set_up_thread_next_function_call_exit();
10548     socket.write_some_buffers_in = NULL;
10549     test_obj.test_call_realserver_send();
10550 //    BOOST_CHECK((char*)socket.write_some_buffers_in == (char*)&(send_data.get_data()) + 0);
10551     BOOST_CHECK((char*)socket.write_some_buffers_in == (send_data.get_data().data() + 0));
10552     test_obj.up_thread_realserver_send_call_check = false;
10553     test_obj.next_up_function_call();
10554     BOOST_CHECK(test_obj.up_thread_realserver_send_call_check);
10555     
10556     socket.write_some_res = MAX_BUFFER_SIZE / 3;
10557     test_obj.set_up_thread_next_function_call_exit();
10558     socket.write_some_buffers_in = NULL;
10559     test_obj.test_call_realserver_send();
10560 //    BOOST_CHECK((char*)socket.write_some_buffers_in == (char*)(&(send_data.get_data()) + (MAX_BUFFER_SIZE / 3)));
10561     BOOST_CHECK((char*)socket.write_some_buffers_in == (send_data.get_data().data() + (MAX_BUFFER_SIZE / 3)));
10562     test_obj.up_thread_realserver_send_call_check = false;
10563     test_obj.next_up_function_call();
10564     BOOST_CHECK(test_obj.up_thread_realserver_send_call_check);
10565     
10566     socket.write_some_res = MAX_BUFFER_SIZE - send_data.get_send_size();
10567     test_obj.set_up_thread_next_function_call_exit();
10568     socket.write_some_buffers_in = NULL;
10569     test_obj.test_call_realserver_send();
10570 //    BOOST_CHECK((char*)socket.write_some_buffers_in == (char*)(&(send_data.get_data()) + (MAX_BUFFER_SIZE / 3) * 2));
10571     BOOST_CHECK((char*)socket.write_some_buffers_in == (send_data.get_data().data() + (MAX_BUFFER_SIZE / 3) * 2));
10572     test_obj.up_thread_client_receive_call_check = false;
10573     test_obj.next_up_function_call();
10574     BOOST_CHECK(test_obj.up_thread_client_receive_call_check);
10575     
10576     socket.write_some_res = MAX_BUFFER_SIZE;
10577     
10578     // unit_test [6] up_thread_realserver_send socket error (try_again) check
10579     std::cerr << "[6] up_thread_realserver_send socket error (try_again) check" << std::endl;
10580     send_data.set_send_size(0);
10581     test_obj.set_up_thread_next_function_call_exit();
10582     socket.write_some_ec = boost::asio::error::try_again;
10583     test_obj.test_call_realserver_send();
10584     test_obj.up_thread_realserver_send_call_check = false;
10585     test_obj.next_up_function_call();
10586     BOOST_CHECK(test_obj.up_thread_realserver_send_call_check);
10587     socket.read_some_ec.clear();
10588     
10589     // unit_test [7] up_thread_realserver_send socket error (eof) check
10590     std::cerr << "[7] up_thread_realserver_send socket error (eof) check" << std::endl;
10591     send_data.set_send_size(0);
10592     test_obj.set_up_thread_next_function_call_exit();
10593     socket.write_some_ec = boost::asio::error::eof;
10594     test_obj.test_call_realserver_send();
10595     test_obj.up_thread_realserver_disconnect_call_check = false;
10596     test_obj.next_up_function_call();
10597     BOOST_CHECK(test_obj.up_thread_realserver_disconnect_call_check);
10598     socket.read_some_ec.clear();
10599     
10600     // unit_test [8] up_thread_realserver_send socket error (connection_reset) check
10601     std::cerr << "[8] up_thread_realserver_send socket error (connection_reset) check" << std::endl;
10602     send_data.set_send_size(0);
10603     test_obj.set_up_thread_next_function_call_exit();
10604     socket.write_some_ec = boost::asio::error::connection_reset;
10605     test_obj.test_call_realserver_send();
10606     test_obj.up_thread_realserver_disconnect_call_check = false;
10607     test_obj.next_up_function_call();
10608     BOOST_CHECK(test_obj.up_thread_realserver_disconnect_call_check);
10609     socket.read_some_ec.clear();
10610     
10611     // unit_test [9] up_thread_realserver_send socket error (bad_descriptor) check
10612     std::cerr << "[9] up_thread_realserver_send socket error (bad_descriptor) check" << std::endl;
10613     send_data.set_send_size(0);
10614     test_obj.set_up_thread_next_function_call_exit();
10615     socket.write_some_ec = boost::asio::error::bad_descriptor;
10616     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
10617     l7vs::Logger::putLogError_id = 0;
10618     test_obj.test_call_realserver_send();
10619     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE,l7vs::Logger::putLogError_category);
10620     BOOST_CHECK_EQUAL(0,l7vs::Logger::putLogError_id);
10621     test_obj.up_thread_realserver_disconnect_call_check = false;
10622     test_obj.next_up_function_call();
10623     BOOST_CHECK(test_obj.up_thread_realserver_disconnect_call_check);
10624     socket.read_some_ec.clear();
10625     
10626     // unit_test [10] up_thread_realserver_send not fond function error check
10627     std::cerr << "[10] up_thread_realserver_send not fond function error check" << std::endl;
10628     send_data.set_send_size(0);
10629     test_obj.up_thread_function_array_clear();
10630     test_obj.up_thread_exit_call_check = false;
10631     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
10632     l7vs::Logger::putLogError_id = 0;
10633     test_obj.test_call_realserver_send();
10634     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
10635     BOOST_CHECK_EQUAL(31,l7vs::Logger::putLogError_id);
10636     std::cerr << l7vs::Logger::putLogError_message << std::endl;
10637     BOOST_CHECK(test_obj.up_thread_exit_call_check);
10638     
10639     // unit_test [11] up_thread_realserver_send returnd illegal EVENT_TAG error check
10640     std::cerr << "[11] up_thread_realserver_send returnd illegal EVENT_TAG error check" << std::endl;
10641     send_data.set_send_size(0);
10642     send_data.set_size(MAX_BUFFER_SIZE);
10643     socket.write_some_ec.clear();
10644     test_obj.up_thread_module_event_map_clear();
10645     test_obj.up_thread_exit_call_check = false;
10646     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
10647     l7vs::Logger::putLogError_id = 0;
10648     test_obj.test_call_realserver_send();
10649     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
10650     BOOST_CHECK_EQUAL(30,l7vs::Logger::putLogError_id);
10651     std::cerr << l7vs::Logger::putLogError_message << std::endl;
10652     BOOST_CHECK(test_obj.up_thread_exit_call_check);
10653     
10654     BOOST_MESSAGE( "----- up_thread_realserver_send test end -----" );
10655 }
10656
10657 // up_thread_sorryserver_send test
10658 void up_thread_sorryserver_send_test(){
10659     BOOST_MESSAGE( "----- up_thread_sorryserver_send test end -----" );
10660 //    boost::asio::io_service io;
10661 //    l7vs::virtualservice_tcp vs;
10662     l7vs::virtualservice_tcp vs;
10663     boost::asio::io_service io;
10664     l7vs::tcp_socket_option_info set_option;
10665     //! TCP_NODELAY   (false:not set,true:set option)
10666     set_option.nodelay_opt = false;
10667     //! TCP_NODELAY option value  (false:off,true:on)
10668     set_option.nodelay_val = false;
10669     //! TCP_CORK      (false:not set,true:set option)
10670     set_option.cork_opt = false;
10671     //! TCP_CORK option value     (false:off,true:on)
10672     set_option.cork_val = false;
10673     //! TCP_QUICKACK  (false:not set,true:set option)
10674     set_option.quickack_opt = false;
10675     //! TCP_QUICKACK option value (false:off,true:on)
10676     set_option.quickack_val = false;
10677     //
10678     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
10679     bool set_mode(false);
10680     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
10681     bool set_ssl_cache_flag(false);
10682     int set_ssl_handshake_time_out = 0;
10683     //std::string access_log_file_name = "test";
10684     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
10685
10686     std::string test_protocol_name("test protocol");
10687     l7vs::test_protocol_module proto_test(test_protocol_name);
10688     // up_thread_sorryserver_send
10689 //    receive_send_test_class test_obj(vs,io);
10690     receive_send_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
10691
10692     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
10693     boost::thread::id proc_id = boost::this_thread::get_id();
10694     
10695     l7vs::tcp_data& send_data = test_obj.get_up_thread_data_dest_side();
10696     
10697     // set sorryserver socket
10698     std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > >& sorry_pair = test_obj.get_sorryserver_socket();
10699     sorry_pair.first = boost::asio::ip::tcp::endpoint();
10700     
10701     // tcp_session set
10702     send_data.initialize();
10703     send_data.set_size(MAX_BUFFER_SIZE);
10704     boost::asio::ip::tcp::endpoint send_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP),7000);
10705     send_data.set_endpoint(send_end);
10706     test_obj.set_up_thread_id(proc_id);
10707     test_obj.set_down_thread_id(boost::thread::id());
10708     test_obj.up_thread_client_receive_call_check = false;
10709     test_obj.up_thread_sorryserver_disconnect_call_check = false;
10710     test_obj.up_thread_exit_call_check = false;
10711     test_obj.up_thread_sorryserver_get_destination_event_call_check = false;
10712     // vs set
10713     vs.update_up_send_size_in = 0;
10714     // protocol module set
10715     proto_test.handle_sorryserver_send_res_tag = l7vs::protocol_module_base::CLIENT_RECV;
10716     proto_test.handle_sorryserver_send_in_thread_id = boost::thread::id();
10717     
10718     l7vs::tcp_socket& socket = *(sorry_pair.second);
10719     socket.write_some_res = MAX_BUFFER_SIZE;
10720     socket.write_some_ec.clear();
10721     socket.write_some_buffers_in = NULL;
10722     socket.write_some_buffers_size_in = 0;
10723     socket.write_some_call_check = false;
10724     
10725     l7vs::Logger::test_loglevel = l7vs::LOG_LV_DEBUG;
10726     l7vs::Logger::putLogDebug_category = l7vs::LOG_CAT_NONE;
10727     l7vs::Logger::putLogDebug_id = 0;
10728     
10729     test_obj.test_call_sorryserver_send();
10730     
10731     // unit_test [1] up_thread_sorryserver_send realserver_socket write_some call check
10732     std::cerr << "[1] up_thread_sorryserver_send realserver_socket write_some call check" << std::endl;
10733     BOOST_CHECK(socket.write_some_call_check);
10734     BOOST_CHECK(socket.write_some_buffers_in == (void*)&(send_data.get_data()));
10735     BOOST_CHECK(socket.write_some_buffers_size_in == MAX_BUFFER_SIZE);
10736     BOOST_CHECK(socket.write_some_res == send_data.get_send_size());
10737     
10738     // unit_test [2] up_thread_sorryserver_send protocol module handle_realserver_send call check
10739     std::cerr << "[2] up_thread_sorryserver_send protocol module handle_realserver_send call check" << std::endl;
10740     BOOST_CHECK(proto_test.handle_sorryserver_send_in_thread_id == proc_id);
10741     
10742     // unit_test [3] up_thread_sorryserver_send up_thread_next_call_function update check
10743     std::cerr << "[3] up_thread_sorryserver_send up_thread_next_call_function update check" << std::endl;
10744     test_obj.next_up_function_call();
10745     BOOST_CHECK(test_obj.up_thread_client_receive_call_check);
10746
10747     // unit_test [4] up_thread_sorryserver_send send size check
10748     std::cerr << "[4] up_thread_sorryserver_send send size check" << std::endl;
10749     send_data.set_send_size(0);
10750     socket.write_some_res = 0;
10751     test_obj.set_up_thread_next_function_call_exit();
10752     socket.write_some_buffers_in = NULL;
10753     test_obj.test_call_sorryserver_send();
10754 //    BOOST_CHECK((char*)socket.write_some_buffers_in == (char*)&(send_data.get_data()) + 0);
10755     BOOST_CHECK((char*)socket.write_some_buffers_in == (send_data.get_data().data() + 0));
10756     test_obj.up_thread_sorryserver_send_call_check = false;
10757     test_obj.next_up_function_call();
10758     BOOST_CHECK(test_obj.up_thread_sorryserver_send_call_check);
10759     
10760     socket.write_some_res = MAX_BUFFER_SIZE / 3;
10761     test_obj.set_up_thread_next_function_call_exit();
10762     socket.write_some_buffers_in = NULL;
10763     test_obj.test_call_sorryserver_send();
10764 //    BOOST_CHECK((char*)socket.write_some_buffers_in == (char*)&(send_data.get_data()) + 0);
10765     BOOST_CHECK((char*)socket.write_some_buffers_in == (send_data.get_data().data() + 0));
10766     test_obj.up_thread_sorryserver_send_call_check = false;
10767     test_obj.next_up_function_call();
10768     BOOST_CHECK(test_obj.up_thread_sorryserver_send_call_check);
10769     
10770     socket.write_some_res = MAX_BUFFER_SIZE / 3;
10771     test_obj.set_up_thread_next_function_call_exit();
10772     socket.write_some_buffers_in = NULL;
10773     test_obj.test_call_sorryserver_send();
10774 //    BOOST_CHECK((char*)socket.write_some_buffers_in == (char*)(&(send_data.get_data()) + (MAX_BUFFER_SIZE / 3)));
10775     BOOST_CHECK((char*)socket.write_some_buffers_in == (send_data.get_data().data() + (MAX_BUFFER_SIZE / 3)));
10776     test_obj.up_thread_sorryserver_send_call_check = false;
10777     test_obj.next_up_function_call();
10778     BOOST_CHECK(test_obj.up_thread_sorryserver_send_call_check);
10779     
10780     socket.write_some_res = MAX_BUFFER_SIZE - send_data.get_send_size();
10781     test_obj.set_up_thread_next_function_call_exit();
10782     socket.write_some_buffers_in = NULL;
10783     test_obj.test_call_sorryserver_send();
10784 //    BOOST_CHECK((char*)socket.write_some_buffers_in == (char*)(&(send_data.get_data()) + (MAX_BUFFER_SIZE / 3) * 2));
10785     BOOST_CHECK((char*)socket.write_some_buffers_in == (send_data.get_data().data() + (MAX_BUFFER_SIZE / 3) * 2));
10786     test_obj.up_thread_client_receive_call_check = false;
10787     test_obj.next_up_function_call();
10788     BOOST_CHECK(test_obj.up_thread_client_receive_call_check);
10789     
10790     socket.write_some_res = MAX_BUFFER_SIZE;
10791         
10792     // unit_test [5] up_thread_sorryserver_send socket error (try_again) check
10793     std::cerr << "[5] up_thread_sorryserver_send socket error (try_again) check" << std::endl;
10794     send_data.set_send_size(0);
10795     test_obj.set_up_thread_next_function_call_exit();
10796     socket.write_some_ec = boost::asio::error::try_again;
10797     test_obj.test_call_sorryserver_send();
10798     test_obj.up_thread_sorryserver_send_call_check = false;
10799     test_obj.next_up_function_call();
10800     BOOST_CHECK(test_obj.up_thread_sorryserver_send_call_check);
10801     socket.read_some_ec.clear();
10802     
10803     // unit_test [6] up_thread_sorryserver_send socket error (eof) check
10804     std::cerr << "[6] up_thread_sorryserver_send socket error (eof) check" << std::endl;
10805     send_data.set_send_size(0);
10806     test_obj.set_up_thread_next_function_call_exit();
10807     socket.write_some_ec = boost::asio::error::eof;
10808     test_obj.test_call_sorryserver_send();
10809     test_obj.up_thread_sorryserver_disconnect_call_check = false;
10810     test_obj.next_up_function_call();
10811     BOOST_CHECK(test_obj.up_thread_sorryserver_disconnect_call_check);
10812     socket.read_some_ec.clear();
10813     
10814     // unit_test [7] up_thread_sorryserver_send socket error (connection_reset) check
10815     std::cerr << "[7] up_thread_sorryserver_send socket error (connection_reset) check" << std::endl;
10816     send_data.set_send_size(0);
10817     test_obj.set_up_thread_next_function_call_exit();
10818     socket.write_some_ec = boost::asio::error::connection_reset;
10819     test_obj.test_call_sorryserver_send();
10820     test_obj.up_thread_sorryserver_disconnect_call_check = false;
10821     test_obj.next_up_function_call();
10822     BOOST_CHECK(test_obj.up_thread_sorryserver_disconnect_call_check);
10823     socket.read_some_ec.clear();
10824     
10825     // unit_test [8] up_thread_sorryserver_send socket error (bad_descriptor) check
10826     std::cerr << "[8] up_thread_sorryserver_send socket error (bad_descriptor) check" << std::endl;
10827     send_data.set_send_size(0);
10828     test_obj.set_up_thread_next_function_call_exit();
10829     socket.write_some_ec = boost::asio::error::bad_descriptor;
10830     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
10831     l7vs::Logger::putLogError_id = 0;
10832     test_obj.test_call_sorryserver_send();
10833     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE,l7vs::Logger::putLogError_category);
10834     BOOST_CHECK_EQUAL(0,l7vs::Logger::putLogError_id);
10835     std::cerr << l7vs::Logger::putLogError_message << std::endl;
10836     test_obj.up_thread_sorryserver_disconnect_call_check = false;
10837     test_obj.next_up_function_call();
10838     BOOST_CHECK(test_obj.up_thread_sorryserver_disconnect_call_check);
10839     socket.write_some_ec.clear();
10840     
10841     // unit_test [9] up_thread_sorryserver_send not fond function error check
10842     std::cerr << "[9] up_thread_sorryserver_send not fond function error check" << std::endl;
10843     send_data.set_send_size(0);
10844     test_obj.up_thread_function_array_clear();
10845     test_obj.up_thread_exit_call_check = false;
10846     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
10847     l7vs::Logger::putLogError_id = 0;
10848     test_obj.test_call_sorryserver_send();
10849     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
10850     BOOST_CHECK_EQUAL(50,l7vs::Logger::putLogError_id);
10851     std::cerr << l7vs::Logger::putLogError_message << std::endl;
10852     BOOST_CHECK(test_obj.up_thread_exit_call_check);
10853     
10854     // unit_test [10] up_thread_sorryserver_send returnd illegal EVENT_TAG error check
10855     std::cerr << "[10] up_thread_sorryserver_send returnd illegal EVENT_TAG error check" << std::endl;
10856     send_data.set_size(MAX_BUFFER_SIZE);
10857     send_data.set_send_size(0);
10858     test_obj.up_thread_module_event_map_clear();
10859     test_obj.up_thread_exit_call_check = false;
10860     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
10861     l7vs::Logger::putLogError_id = 0;
10862     test_obj.test_call_sorryserver_send();
10863     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
10864     BOOST_CHECK_EQUAL(49,l7vs::Logger::putLogError_id);
10865     std::cerr << l7vs::Logger::putLogError_message << std::endl;
10866     BOOST_CHECK(test_obj.up_thread_exit_call_check);
10867     
10868     BOOST_MESSAGE( "----- up_thread_sorryserver_send test end -----" );
10869 }
10870
10871 // down_thread_client_send test
10872 void down_thread_client_send_test(){
10873     BOOST_MESSAGE( "----- down_thread_client_send test end -----" );
10874 //    boost::asio::io_service io;
10875 //    l7vs::virtualservice_tcp vs;
10876     l7vs::virtualservice_tcp vs;
10877     boost::asio::io_service io;
10878     l7vs::tcp_socket_option_info set_option;
10879     //! TCP_NODELAY   (false:not set,true:set option)
10880     set_option.nodelay_opt = false;
10881     //! TCP_NODELAY option value  (false:off,true:on)
10882     set_option.nodelay_val = false;
10883     //! TCP_CORK      (false:not set,true:set option)
10884     set_option.cork_opt = false;
10885     //! TCP_CORK option value     (false:off,true:on)
10886     set_option.cork_val = false;
10887     //! TCP_QUICKACK  (false:not set,true:set option)
10888     set_option.quickack_opt = false;
10889     //! TCP_QUICKACK option value (false:off,true:on)
10890     set_option.quickack_val = false;
10891     //
10892     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
10893     bool set_mode(false);
10894     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
10895     bool set_ssl_cache_flag(false);
10896     int set_ssl_handshake_time_out = 0;
10897     //std::string access_log_file_name = "test";
10898     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
10899
10900     std::string test_protocol_name("test protocol");
10901     l7vs::test_protocol_module proto_test(test_protocol_name);
10902     // up_thread_sorryserver_send
10903     receive_send_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
10904
10905     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
10906     boost::thread::id proc_id = boost::this_thread::get_id();
10907     
10908     l7vs::tcp_data& send_data = test_obj.get_down_thread_data_client_side();
10909     
10910     // get client socket
10911     l7vs::tcp_socket& socket = test_obj.get_client_socket();
10912     
10913     // dummy server client socket connect
10914     boost::system::error_code ec;
10915     test_mirror_server test_server;
10916     // accept req
10917     test_server.breq_acc_flag = true;
10918     // close wait req
10919     test_server.breq_close_wait_flag = true;
10920     // recv cont
10921     test_server.req_recv_cnt = 0;
10922     // test server start
10923     boost::thread server_thread(boost::bind(&test_mirror_server::run,&test_server));
10924     while( !test_server.brun_flag ){
10925         sleep(1);
10926     }
10927     
10928     boost::asio::ip::tcp::endpoint connect_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
10929     socket.get_socket().connect(connect_end,ec);
10930     BOOST_CHECK(!ec);
10931     socket.is_open_res = true;
10932
10933     while(!test_server.bconnect_flag){
10934         sleep(1);
10935     }
10936     boost::asio::ip::tcp::endpoint local_endpoint = socket.get_socket().local_endpoint(ec);
10937     BOOST_CHECK(!ec);
10938
10939     // tcp_session set
10940     send_data.initialize();
10941     send_data.set_size(MAX_BUFFER_SIZE);
10942     test_obj.set_up_thread_id(boost::thread::id());
10943     test_obj.set_down_thread_id(proc_id);
10944     test_obj.down_thread_realserver_receive_call_check = false;
10945     test_obj.down_thread_client_disconnect_call_check = false;
10946     test_obj.down_thread_exit_call_check = false;
10947     test_obj.down_thread_client_connection_chk_event_call_check = false;
10948     
10949     // vs set
10950     vs.update_down_send_size_in = 0;
10951     // protocol module set
10952     proto_test.handle_client_send_res_tag = l7vs::protocol_module_base::REALSERVER_RECV;
10953     proto_test.handle_client_send_in_thread_id = boost::thread::id();
10954     
10955     socket.write_some_res = MAX_BUFFER_SIZE;
10956     socket.write_some_ec.clear();
10957     socket.write_some_buffers_in = NULL;
10958     socket.write_some_buffers_size_in = 0;
10959     socket.write_some_call_check = false;
10960
10961     l7vs::Logger::test_loglevel = l7vs::LOG_LV_DEBUG;
10962     l7vs::Logger::putLogDebug_category = l7vs::LOG_CAT_NONE;
10963     l7vs::Logger::putLogDebug_id = 0;
10964     
10965     test_obj.test_call_client_send();
10966     
10967     // unit_test [1] down_thread_client_send socket write_some call check
10968     std::cerr << "[1] down_thread_client_send socket write_some call check" << std::endl;
10969     BOOST_CHECK(socket.write_some_call_check);
10970     BOOST_CHECK(socket.write_some_buffers_in == (void*)&(send_data.get_data()));
10971     BOOST_CHECK(socket.write_some_buffers_size_in == MAX_BUFFER_SIZE);
10972     BOOST_CHECK(socket.write_some_res == send_data.get_send_size());
10973     
10974     // unit_test [2] down_thread_client_send protocol module handle_client_send call check
10975     std::cerr << "[2] down_thread_client_send protocol module handle_client_send call check" << std::endl;
10976     BOOST_CHECK(proto_test.handle_client_send_in_thread_id == proc_id);
10977     
10978     // unit_test [3] down_thread_client_send up_thread_next_call_function update check
10979     std::cerr << "[3] down_thread_client_send up_thread_next_call_function update check" << std::endl;
10980     test_obj.next_down_function_call();
10981     BOOST_CHECK(test_obj.down_thread_realserver_receive_call_check);
10982
10983     // unit_test [4] down_thread_client_send send size check
10984     std::cerr << "[4] down_thread_client_send send size check" << std::endl;
10985     send_data.set_send_size(0);
10986     socket.write_some_res = 0;
10987     test_obj.set_down_thread_next_function_call_exit();
10988     socket.write_some_buffers_in = NULL;
10989     test_obj.test_call_client_send();
10990 //    BOOST_CHECK((char*)socket.write_some_buffers_in == (char*)&(send_data.get_data()) + 0);
10991     BOOST_CHECK((char*)socket.write_some_buffers_in == (send_data.get_data().data() + 0));
10992     test_obj.down_thread_client_send_call_check = false;
10993     test_obj.next_down_function_call();
10994     BOOST_CHECK(test_obj.down_thread_client_send_call_check);
10995     
10996     socket.write_some_res = MAX_BUFFER_SIZE / 3;
10997     test_obj.set_down_thread_next_function_call_exit();
10998     socket.write_some_buffers_in = NULL;
10999     test_obj.test_call_client_send();
11000 //    BOOST_CHECK((char*)socket.write_some_buffers_in == (char*)&(send_data.get_data()) + 0);
11001     BOOST_CHECK((char*)socket.write_some_buffers_in == (send_data.get_data().data() + 0));
11002     test_obj.down_thread_client_send_call_check = false;
11003     test_obj.next_down_function_call();
11004     BOOST_CHECK(test_obj.down_thread_client_send_call_check);
11005     
11006     socket.write_some_res = MAX_BUFFER_SIZE / 3;
11007     test_obj.set_down_thread_next_function_call_exit();
11008     socket.write_some_buffers_in = NULL;
11009     test_obj.test_call_client_send();
11010 //    BOOST_CHECK((char*)socket.write_some_buffers_in == (char*)(&(send_data.get_data()) + (MAX_BUFFER_SIZE / 3)));
11011     BOOST_CHECK((char*)socket.write_some_buffers_in == (send_data.get_data().data() + (MAX_BUFFER_SIZE / 3)));
11012     test_obj.down_thread_client_send_call_check = false;
11013     test_obj.next_down_function_call();
11014     BOOST_CHECK(test_obj.down_thread_client_send_call_check);
11015     
11016     socket.write_some_res = MAX_BUFFER_SIZE - send_data.get_send_size();
11017     test_obj.set_down_thread_next_function_call_exit();
11018     socket.write_some_buffers_in = NULL;
11019     test_obj.test_call_client_send();
11020 //    BOOST_CHECK((char*)socket.write_some_buffers_in == (char*)(&(send_data.get_data()) + (MAX_BUFFER_SIZE / 3) * 2));
11021     BOOST_CHECK((char*)socket.write_some_buffers_in == (send_data.get_data().data() + (MAX_BUFFER_SIZE / 3) * 2));
11022     test_obj.down_thread_realserver_receive_call_check = false;
11023     test_obj.next_down_function_call();
11024     BOOST_CHECK(test_obj.down_thread_realserver_receive_call_check);
11025     
11026     socket.write_some_res = MAX_BUFFER_SIZE;
11027         
11028     // unit_test [5] down_thread_client_send socket error (try_again) check
11029     std::cerr << "[5] down_thread_client_send socket error (try_again) check" << std::endl;
11030     send_data.set_send_size(0);
11031     test_obj.set_down_thread_next_function_call_exit();
11032     socket.write_some_ec = boost::asio::error::try_again;
11033     test_obj.test_call_client_send();
11034     test_obj.down_thread_client_send_call_check = false;
11035     test_obj.next_down_function_call();
11036     BOOST_CHECK(test_obj.down_thread_client_send_call_check);
11037     socket.read_some_ec.clear();
11038     
11039     // unit_test [6] down_thread_client_send socket error (eof) check
11040     std::cerr << "[6] down_thread_client_send socket error (eof) check" << std::endl;
11041     send_data.set_send_size(0);
11042     test_obj.set_down_thread_next_function_call_exit();
11043     socket.write_some_ec = boost::asio::error::eof;
11044     test_obj.test_call_client_send();
11045     test_obj.down_thread_client_disconnect_call_check = false;
11046     test_obj.next_down_function_call();
11047     BOOST_CHECK(test_obj.down_thread_client_disconnect_call_check);
11048     socket.read_some_ec.clear();
11049     
11050     // unit_test [7] down_thread_client_send socket error (connection_reset) check
11051     std::cerr << "[7] down_thread_client_send socket error (connection_reset) check" << std::endl;
11052     send_data.set_send_size(0);
11053     test_obj.set_down_thread_next_function_call_exit();
11054     socket.write_some_ec = boost::asio::error::connection_reset;
11055     test_obj.test_call_client_send();
11056     test_obj.down_thread_client_disconnect_call_check = false;
11057     test_obj.next_down_function_call();
11058     BOOST_CHECK(test_obj.down_thread_client_disconnect_call_check);
11059     socket.read_some_ec.clear();
11060     
11061     // unit_test [8] down_thread_client_send socket error (bad_descriptor) check
11062     std::cerr << "[8] down_thread_client_send socket error (bad_descriptor) check" << std::endl;
11063     send_data.set_send_size(0);
11064     test_obj.set_down_thread_next_function_call_exit();
11065     socket.write_some_ec = boost::asio::error::bad_descriptor;
11066     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
11067     l7vs::Logger::putLogError_id = 0;
11068     test_obj.test_call_client_send();
11069     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE,l7vs::Logger::putLogError_category);
11070     BOOST_CHECK_EQUAL(0,l7vs::Logger::putLogError_id);
11071     std::cerr << l7vs::Logger::putLogError_message << std::endl;
11072     test_obj.down_thread_client_disconnect_call_check = false;
11073     test_obj.next_down_function_call();
11074     BOOST_CHECK(test_obj.down_thread_client_disconnect_call_check);
11075     socket.write_some_ec.clear();
11076     
11077     // unit_test [9] down_thread_client_send not fond function error check
11078     std::cerr << "[9] down_thread_client_send not fond function error check" << std::endl;
11079     send_data.set_send_size(0);
11080     test_obj.down_thread_function_array_clear();
11081     test_obj.down_thread_exit_call_check = false;
11082     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
11083     l7vs::Logger::putLogError_id = 0;
11084     test_obj.test_call_client_send();
11085     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
11086     BOOST_CHECK_EQUAL(83,l7vs::Logger::putLogError_id);
11087     std::cerr << l7vs::Logger::putLogError_message << std::endl;
11088     BOOST_CHECK(test_obj.down_thread_exit_call_check);
11089     
11090     // unit_test [10] down_thread_client_send returnd illegal EVENT_TAG error check
11091     std::cerr << "[10] down_thread_client_send returnd illegal EVENT_TAG error check" << std::endl;
11092     send_data.set_send_size(0);
11093     test_obj.down_thread_module_event_map_clear();
11094     test_obj.down_thread_exit_call_check = false;
11095     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
11096     l7vs::Logger::putLogError_id = 0;
11097     test_obj.test_call_client_send();
11098     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
11099     BOOST_CHECK_EQUAL(82,l7vs::Logger::putLogError_id);
11100     std::cerr << l7vs::Logger::putLogError_message << std::endl;
11101     BOOST_CHECK(test_obj.down_thread_exit_call_check);
11102     
11103     // dummy server stop
11104     test_server.breq_close_wait_flag = false;    
11105     test_server.bstop_flag = true;
11106     server_thread.join();
11107
11108     // SSL mode Test
11109
11110     receive_send_test_class ssl_test_obj(vs,io,set_option,listen_endpoint,true,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
11111
11112     ssl_test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
11113
11114     l7vs::tcp_data& ssl_send_data = ssl_test_obj.get_down_thread_data_client_side();
11115     
11116     // get client socket
11117     l7vs::tcp_ssl_socket& ssl_socket = ssl_test_obj.get_client_ssl_socket();
11118
11119     // tcp_session set
11120     ssl_send_data.initialize();
11121     ssl_send_data.set_size(MAX_BUFFER_SIZE);
11122     ssl_test_obj.set_up_thread_id(boost::thread::id());
11123     ssl_test_obj.set_down_thread_id(proc_id);
11124     ssl_test_obj.down_thread_realserver_receive_call_check = false;
11125     ssl_test_obj.down_thread_client_disconnect_call_check = false;
11126     ssl_test_obj.down_thread_exit_call_check = false;
11127     ssl_test_obj.down_thread_client_connection_chk_event_call_check = false;
11128     
11129     // vs set
11130     vs.update_down_send_size_in = 0;
11131     // protocol module set
11132     proto_test.handle_client_send_res_tag = l7vs::protocol_module_base::REALSERVER_RECV;
11133     proto_test.handle_client_send_in_thread_id = boost::thread::id();
11134     
11135     ssl_socket.write_some_res = MAX_BUFFER_SIZE;
11136     ssl_socket.write_some_ec.clear();
11137     ssl_socket.write_some_buffers_in = NULL;
11138     ssl_socket.write_some_buffers_size_in = 0;
11139     ssl_socket.write_some_call_check = false;
11140
11141     ssl_test_obj.test_call_client_send();
11142     
11143     // unit_test [11] down_thread_client_send ssl mode socket write_some call check
11144     std::cerr << "[11] down_thread_client_send ssl mode socket write_some call check" << std::endl;
11145     BOOST_CHECK(ssl_socket.write_some_call_check);
11146     BOOST_CHECK(ssl_socket.write_some_buffers_in == (void*)&(ssl_send_data.get_data()));
11147     BOOST_CHECK(ssl_socket.write_some_buffers_size_in == MAX_BUFFER_SIZE);
11148     BOOST_CHECK(ssl_socket.write_some_res == ssl_send_data.get_send_size());
11149
11150
11151     BOOST_MESSAGE( "----- down_thread_client_send test end -----" );
11152 }
11153
11154
11155 //up_thread_realserver_connect test
11156 //up_thread_realserver_connect test class 
11157 class up_thread_realserver_connect_test_class : public l7vs::tcp_session{
11158     public:
11159        up_thread_realserver_connect_test_class(
11160                                 l7vs::virtualservice_tcp& vs,
11161                                 boost::asio::io_service& session_io,
11162                                 l7vs::tcp_socket_option_info& set_socket_option,
11163                                 boost::asio::ip::tcp::endpoint listen_endpoint,
11164                                 bool ssl_mode,
11165                                 boost::asio::ssl::context& set_ssl_context,
11166                                 bool set_ssl_cache_flag,
11167                                 int set_ssl_handshake_time_out,
11168                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
11169                                                                                                    session_io,
11170                                                                                                    set_socket_option,
11171                                                                                                    listen_endpoint,
11172                                                                                                    ssl_mode,
11173                                                                                                    set_ssl_context,
11174                                                                                                    set_ssl_cache_flag,
11175                                                                                                    set_ssl_handshake_time_out,
11176                                                                                                    set_access_logger){};
11177
11178         ~up_thread_realserver_connect_test_class(){};
11179         
11180         void test_call(){
11181             l7vs::tcp_session::up_thread_realserver_connect(LOCAL_PROC);
11182         };
11183         
11184         void set_protocol_module(l7vs::protocol_module_base* set_prot){
11185             protocol_module = set_prot;
11186         };
11187         l7vs::tcp_data& get_up_thread_data_client_side(){
11188             return up_thread_data_client_side;
11189         };
11190         void set_up_thread_data_dest_side(l7vs::tcp_data& set_data){
11191             up_thread_data_dest_side.set_size(set_data.get_size());
11192             up_thread_data_dest_side.set_send_size(set_data.get_send_size());
11193             up_thread_data_dest_side.set_data(set_data.get_data());
11194             up_thread_data_dest_side.set_endpoint(set_data.get_endpoint());
11195         };
11196         l7vs::tcp_data& get_up_thread_data_dest_side(){
11197             return up_thread_data_dest_side;
11198         };
11199         l7vs::tcp_data& get_down_thread_data_client_side(){
11200             return down_thread_data_client_side;
11201         };
11202         l7vs::tcp_data& get_down_thread_data_dest_side(){
11203             return down_thread_data_dest_side;
11204         };
11205         l7vs::tcp_socket& get_client_socket(){
11206             return client_socket;
11207         };
11208         socket_element& get_sorryserver_socket(){
11209             return sorryserver_socket;
11210         };
11211         std::list<socket_element>& get_down_thread_receive_realserver_socket_list(){
11212             return down_thread_receive_realserver_socket_list;
11213         };
11214         std::map<endpoint,tcp_socket_ptr>& get_up_thread_send_realserver_socket_map(){
11215             return up_thread_send_realserver_socket_map;
11216         };
11217         std::list<socket_element>::iterator& get_down_thread_current_receive_realserver_socket(){
11218             return down_thread_current_receive_realserver_socket;
11219         };
11220         l7vs::tcp_realserver_connect_socket_list& get_down_thread_connect_socket_list(){
11221             return down_thread_connect_socket_list;
11222         };
11223         
11224         
11225         void set_client_endpoint(boost::asio::ip::tcp::endpoint& set_endpoint){
11226             client_endpoint = set_endpoint;
11227         };
11228         void set_up_thread_id(boost::thread::id set_id){
11229             up_thread_id = set_id;
11230         }
11231         void set_down_thread_id(boost::thread::id set_id){
11232             down_thread_id = set_id;
11233         }
11234         
11235         void next_up_function_call(){
11236             up_thread_next_call_function.second(LOCAL_PROC);
11237         }
11238         void next_down_function_call(){
11239             down_thread_next_call_function.second(LOCAL_PROC);
11240         }
11241         
11242         void set_up_thread_next_function_call_exit(){
11243             up_thread_function_pair fun_it = up_thread_function_array[UP_FUNC_EXIT];
11244             up_thread_next_call_function = fun_it;
11245         };
11246         
11247         void set_down_thread_next_function_call_exit(){
11248             down_thread_function_pair fun_it = down_thread_function_array[DOWN_FUNC_EXIT];
11249             down_thread_next_call_function = fun_it;
11250         };
11251         
11252         // next call function check
11253         void up_thread_realserver_connect_event(const TCP_PROCESS_TYPE_TAG process_type){
11254             up_thread_realserver_connect_event_call_check = true;
11255         };
11256         bool up_thread_realserver_connect_event_call_check;
11257         void up_thread_realserver_connection_fail_event(const TCP_PROCESS_TYPE_TAG process_type){
11258             up_thread_realserver_connection_fail_event_check = true;
11259         };
11260         bool up_thread_realserver_connection_fail_event_check;
11261         
11262         void up_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
11263             up_thread_exit_call_check = true;
11264         }
11265         bool up_thread_exit_call_check;
11266         
11267         void down_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
11268             down_thread_exit_call_check = true;
11269         }
11270         bool down_thread_exit_call_check;
11271         
11272         // map clear
11273         void up_thread_function_array_clear(){
11274             for(int i = 0;i <= UP_FUNC_EXIT;i++){
11275                 up_thread_function_array[i].second = NULL;
11276             }
11277         };
11278         void down_thread_function_array_clear(){
11279             for(int i = 0;i <= DOWN_FUNC_EXIT;i++){
11280                 down_thread_function_array[i].second = NULL;
11281             }
11282         };
11283         
11284         void up_thread_module_event_map_clear(){
11285             up_thread_module_event_map.clear();
11286         };
11287         
11288         void down_thread_module_event_map_clear(){
11289             down_thread_module_event_map.clear();
11290         };
11291 };
11292
11293 void up_thread_realserver_connect_test(){
11294     BOOST_MESSAGE( "----- up_thread_realserver_connect test start -----" );
11295     
11296     boost::asio::io_service io;
11297     l7vs::virtualservice_tcp vs;
11298
11299
11300     std::string test_protocol_name("test protocol");
11301     l7vs::test_protocol_module proto_test(test_protocol_name);
11302     
11303     l7vs::tcp_socket_option_info set_option;
11304     //! TCP_NODELAY   (false:not set,true:set option)
11305     set_option.nodelay_opt = true;
11306     //! TCP_NODELAY option value  (false:off,true:on)
11307     set_option.nodelay_val = true;
11308     //! TCP_CORK      (false:not set,true:set option)
11309     set_option.cork_opt = true;
11310     //! TCP_CORK option value     (false:off,true:on)
11311     set_option.cork_val = true;
11312     //! TCP_QUICKACK  (false:not set,true:set option)
11313     set_option.quickack_opt = true;
11314     //! TCP_QUICKACK option value (false:off,true:on)
11315     set_option.quickack_val = true;
11316
11317     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
11318     bool set_mode(false);
11319     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
11320     bool set_ssl_cache_flag(false);
11321     int set_ssl_handshake_time_out = 0;
11322     l7vs::logger_implement_access* plogger = NULL;//  new l7vs::logger_implement_access(access_log_file_name);
11323
11324     up_thread_realserver_connect_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
11325
11326     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
11327     boost::thread::id proc_id = boost::this_thread::get_id();
11328     
11329     l7vs::tcp_data& con_data = test_obj.get_up_thread_data_dest_side();
11330     boost::asio::ip::tcp::endpoint con_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP),DUMMY_SERVER_PORT);
11331     
11332     //up_thread_data_dest_side set
11333     con_data.initialize();
11334     con_data.set_endpoint(con_end);
11335     // thread_id set
11336     test_obj.set_up_thread_id(boost::thread::id());
11337     test_obj.set_down_thread_id(proc_id);
11338     // socket set
11339     l7vs::tcp_socket::connect_res = true;
11340     l7vs::tcp_socket::connect_connect_endpoint = boost::asio::ip::tcp::endpoint();
11341     l7vs::tcp_socket::connect_ec = NULL;
11342     l7vs::tcp_socket::connect_call_check = false;
11343     l7vs::tcp_socket::is_connect = true;
11344     // vs set
11345     vs.connection_active_list.clear();
11346     // map set
11347     std::map< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > >& rs_map = test_obj.get_up_thread_send_realserver_socket_map();
11348     rs_map.clear();
11349     // connection list set
11350     l7vs::tcp_realserver_connect_socket_list& con_list = test_obj.get_down_thread_connect_socket_list();
11351     con_list.clear();
11352     //tcp_session set
11353     test_obj.set_up_thread_next_function_call_exit();
11354     test_obj.up_thread_realserver_connect_event_call_check = false;
11355     
11356     // dummy server 
11357     test_mirror_server test_server;
11358     // accept req
11359     test_server.breq_acc_flag = true;
11360     // close wait req
11361     test_server.breq_close_wait_flag = true;
11362     // recv cont
11363     test_server.req_recv_cnt = 0;
11364     // test server start
11365     boost::thread server_thread(boost::bind(&test_mirror_server::run,&test_server));
11366     while( !test_server.brun_flag ){
11367         sleep(1);
11368     }
11369     
11370     test_obj.test_call();
11371     
11372     // unit_test [1] up_thread_realserver_connect socket connect call check
11373     std::cerr << "[1] up_thread_realserver_connect socket connect call check" << std::endl;
11374     BOOST_CHECK(con_end == l7vs::tcp_socket::connect_connect_endpoint);
11375     BOOST_CHECK(l7vs::tcp_socket::connect_ec != NULL);
11376     BOOST_CHECK(l7vs::tcp_socket::connect_call_check);
11377     
11378     // unit_test [2] up_thread_realserver_connect virtualservice connection_active call check
11379     std::cerr << "[2] up_thread_realserver_connect virtualservice connection_active call check" << std::endl;
11380     BOOST_CHECK(!vs.connection_active_list.empty());
11381     BOOST_CHECK(*(vs.connection_active_list.begin()) == con_end);
11382     
11383     // unit_test [3] up_thread_realserver_connect up_thread_send_realserver_socket_map insert check
11384     std::cerr << "[3] up_thread_realserver_connect up_thread_send_realserver_socket_map insert check" << std::endl;
11385     BOOST_CHECK(!rs_map.empty());
11386     BOOST_CHECK(rs_map.begin()->first == con_end);
11387     BOOST_CHECK(rs_map.begin()->second != NULL);
11388     std::cerr << l7vs::Logger::putLogError_message << std::endl;
11389     
11390     // unit_test [4] up_thread_realserver_connect down_thread_connect_socket_list push check
11391     std::cerr << "[4] up_thread_realserver_connect down_thread_connect_socket_list push check" << std::endl;
11392     BOOST_CHECK(!con_list.empty());
11393     std::pair<boost::asio::ip::tcp::endpoint,boost::shared_ptr<l7vs::tcp_socket> > set_socket = con_list.get_socket();
11394     BOOST_CHECK(set_socket.first == con_end);
11395     BOOST_CHECK(set_socket.second == rs_map.begin()->second);
11396     
11397     
11398     // unit_test [5] constructer realserver socket set socket option check
11399     std::cerr << "[5] constructer realserver socket set socket option check" << std::endl;
11400     //! TCP_NODELAY
11401     BOOST_CHECK_EQUAL(rs_map.begin()->second->opt_info.nodelay_opt , set_option.nodelay_opt);
11402     BOOST_CHECK_EQUAL(rs_map.begin()->second->opt_info.nodelay_val , set_option.nodelay_val);
11403     //! TCP_CORK
11404     BOOST_CHECK_EQUAL(rs_map.begin()->second->opt_info.cork_opt , set_option.cork_opt);
11405     BOOST_CHECK_EQUAL(rs_map.begin()->second->opt_info.cork_val , set_option.cork_val);
11406     //! TCP_QUICKACK
11407     BOOST_CHECK_EQUAL(rs_map.begin()->second->opt_info.quickack_opt , set_option.quickack_opt);
11408     BOOST_CHECK_EQUAL(rs_map.begin()->second->opt_info.quickack_val , set_option.quickack_val);
11409     
11410     
11411     
11412     // unit_test [6] up_thread_realserver_connect up_thread_next_call_function update check
11413     std::cerr << "[6] up_thread_realserver_connect up_thread_next_call_function update check" << std::endl;
11414     test_obj.next_up_function_call();
11415     BOOST_CHECK(test_obj.up_thread_realserver_connect_event_call_check);
11416
11417     l7vs::tcp_socket::is_connect = false;
11418     
11419     // unit_test [7] up_thread_realserver_connect duplication check
11420     std::cerr << "[7] up_thread_realserver_connect duplication check" << std::endl;
11421     l7vs::tcp_socket::connect_call_check = false;
11422     test_obj.test_call();
11423     BOOST_CHECK(!l7vs::tcp_socket::connect_call_check);
11424     test_obj.up_thread_realserver_connect_event_call_check = false;
11425     test_obj.next_up_function_call();
11426     BOOST_CHECK(test_obj.up_thread_realserver_connect_event_call_check);
11427     
11428     // unit_test [8] up_thread_realserver_connect connect fail check
11429     std::cerr << "[8] up_thread_realserver_connect connect fail check" << std::endl;
11430     rs_map.clear();
11431     con_list.clear();
11432     l7vs::tcp_socket::connect_res = false;
11433     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
11434     l7vs::Logger::putLogError_id = 0;
11435     test_obj.test_call();
11436     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
11437     BOOST_CHECK_EQUAL(37,l7vs::Logger::putLogError_id);
11438     std::cerr << l7vs::Logger::putLogError_message << std::endl;
11439     BOOST_CHECK(rs_map.empty());
11440     BOOST_CHECK(con_list.empty());
11441     test_obj.up_thread_realserver_connection_fail_event_check = false;
11442     test_obj.next_up_function_call();
11443     BOOST_CHECK(test_obj.up_thread_realserver_connection_fail_event_check);
11444     
11445     l7vs::tcp_socket::connect_res = true;
11446     
11447     // unit_test [9] up_thread_realserver_connect set non blocking fail check
11448     std::cerr << "[9] up_thread_realserver_connect set non blocking fail check" << std::endl;
11449     rs_map.clear();
11450     con_list.clear();
11451     l7vs::tcp_socket::set_non_blocking_mode_res = false;
11452     l7vs::tcp_socket::set_non_blocking_mode_ec = boost::asio::error::bad_descriptor;
11453     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
11454     l7vs::Logger::putLogError_id = 0;
11455     test_obj.up_thread_exit_call_check = false;
11456     test_obj.test_call();
11457     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
11458     BOOST_CHECK_EQUAL(34,l7vs::Logger::putLogError_id);
11459     std::cerr << l7vs::Logger::putLogError_message << std::endl;
11460     BOOST_CHECK(test_obj.up_thread_exit_call_check);
11461     l7vs::tcp_socket::set_non_blocking_mode_res = true;
11462     l7vs::tcp_socket::set_non_blocking_mode_ec.clear();
11463
11464     // unit_test [10] up_thread_realserver_connect not fond function error check
11465 /*
11466     std::cerr << "[10] up_thread_realserver_connect not fond function error check" << std::endl;
11467     rs_map.clear();
11468     con_list.clear();
11469     test_obj.up_thread_function_array_clear();
11470     test_obj.up_thread_exit_call_check = false;
11471     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
11472     l7vs::Logger::putLogError_id = 0;
11473     test_obj.test_call();
11474     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
11475     BOOST_CHECK_EQUAL(35,l7vs::Logger::putLogError_id);
11476     std::cerr << l7vs::Logger::putLogError_message << std::endl;
11477     BOOST_CHECK(test_obj.up_thread_exit_call_check);
11478     set_socket.second->get_socket().close();
11479 */
11480     
11481     // tproxy implement test
11482     #ifndef IP_TRANSPARENT
11483     #define IP_TRANSPARENT 19
11484     #endif
11485     boost::asio::ip::tcp::endpoint dummy1(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
11486     boost::asio::ip::tcp::endpoint dummy2(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT + 1);
11487     boost::asio::ip::tcp::endpoint dummyv6(boost::asio::ip::address::from_string(DUMMY_SERVER_IPV6), DUMMY_SERVER_PORT);
11488     l7vs::realserver_element real;
11489     l7vs::tcp_data set_data;
11490
11491     // no realserver element (maybe not happen)
11492     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
11493     ::setsockopt_sock = 0;
11494     vs.my_element.realserver_vector.clear();
11495     test_obj.get_up_thread_send_realserver_socket_map().clear();
11496     test_obj.test_call();
11497     // will be no error and not called setsockopt
11498     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE, l7vs::Logger::putLogError_category);
11499     BOOST_CHECK_EQUAL(::setsockopt_sock, 0);
11500     
11501     // cannot find server_endpoint in realserver_vector (maybe not happen)
11502     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
11503     ::setsockopt_sock = 0;
11504     real.tcp_endpoint = dummy1;
11505     set_data.set_endpoint(dummy2);
11506     test_obj.set_up_thread_data_dest_side(set_data);
11507     vs.my_element.realserver_vector.clear();
11508     vs.my_element.realserver_vector.push_back(real);
11509     test_obj.get_up_thread_send_realserver_socket_map().clear();
11510     test_obj.test_call();
11511     // will be no error and not called setsockopt
11512     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE, l7vs::Logger::putLogError_category);
11513     BOOST_CHECK_EQUAL(::setsockopt_sock, 0);
11514     
11515     // server fwdmode is not FWD_TPROXY (FWD_MASQ)
11516     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
11517     ::setsockopt_sock = 0;
11518     real.tcp_endpoint = dummy1;
11519     real.fwdmode = l7vs::realserver_element::FWD_MASQ;
11520     set_data.set_endpoint(dummy1);
11521     test_obj.set_up_thread_data_dest_side(set_data);
11522     vs.my_element.realserver_vector.clear();
11523     vs.my_element.realserver_vector.push_back(real);
11524     test_obj.get_up_thread_send_realserver_socket_map().clear();
11525     test_obj.test_call();
11526     // will be no error and not called setsockopt
11527     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE, l7vs::Logger::putLogError_category);
11528     BOOST_CHECK_EQUAL(::setsockopt_sock, 0);
11529     
11530     // server fwdmode is not FWD_TPROXY (FWD_NONE) (never happen)
11531     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
11532     ::setsockopt_sock = 0;
11533     real.tcp_endpoint = dummy1;
11534     real.fwdmode = l7vs::realserver_element::FWD_NONE;
11535     set_data.set_endpoint(dummy1);
11536     test_obj.set_up_thread_data_dest_side(set_data);
11537     vs.my_element.realserver_vector.clear();
11538     vs.my_element.realserver_vector.push_back(real);
11539     test_obj.get_up_thread_send_realserver_socket_map().clear();
11540     test_obj.test_call();
11541     // will be no error and not called setsockopt
11542     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE, l7vs::Logger::putLogError_category);
11543     BOOST_CHECK_EQUAL(::setsockopt_sock, 0);
11544     
11545     // server fwdmode is FWD_TPROXY and client(IPv6), server(IPv4)
11546     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
11547     ::setsockopt_sock = 0;
11548     real.tcp_endpoint = dummy1;
11549     real.fwdmode = l7vs::realserver_element::FWD_TPROXY;
11550     set_data.set_endpoint(dummy1);
11551     test_obj.set_up_thread_data_dest_side(set_data);
11552     vs.my_element.realserver_vector.clear();
11553     vs.my_element.realserver_vector.push_back(real);
11554     test_obj.get_up_thread_send_realserver_socket_map().clear();
11555     test_obj.set_client_endpoint(dummyv6);
11556     test_obj.test_call();
11557     // will be no error and not called setsockopt
11558     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE, l7vs::Logger::putLogError_category);
11559     BOOST_CHECK_EQUAL(::setsockopt_sock, 0);
11560     
11561     // server fwdmode is FWD_TPROXY and client(IPv4), server(IPv6)
11562     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
11563     ::setsockopt_sock = 0;
11564     real.tcp_endpoint = dummyv6;
11565     real.fwdmode = l7vs::realserver_element::FWD_TPROXY;
11566     set_data.set_endpoint(dummyv6);
11567     test_obj.set_up_thread_data_dest_side(set_data);
11568     vs.my_element.realserver_vector.clear();
11569     vs.my_element.realserver_vector.push_back(real);
11570     test_obj.get_up_thread_send_realserver_socket_map().clear();
11571     test_obj.set_client_endpoint(dummy1);
11572     test_obj.test_call();
11573     // will be no error and not called setsockopt
11574     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE, l7vs::Logger::putLogError_category);
11575     BOOST_CHECK_EQUAL(::setsockopt_sock, 0);
11576     
11577     // server fwdmode is FWD_TPROXY and client(IPv4), server(IPv4), setsockopt error
11578     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
11579     ::setsockopt_sock = 0;
11580     real.tcp_endpoint = dummy1;
11581     real.fwdmode = l7vs::realserver_element::FWD_TPROXY;
11582     set_data.set_endpoint(dummy1);
11583     test_obj.set_up_thread_data_dest_side(set_data);
11584     vs.my_element.realserver_vector.clear();
11585     vs.my_element.realserver_vector.push_back(real);
11586     test_obj.get_up_thread_send_realserver_socket_map().clear();
11587     test_obj.set_client_endpoint(dummy2);
11588     setsockopt_ret = -1;
11589     setsockopt_level = -1;
11590     setsockopt_optname = 0;
11591     setsockopt_optval = NULL;
11592     setsockopt_optlen = 0;
11593     test_obj.test_call();
11594     // called setsockopt and will be session error
11595     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION, l7vs::Logger::putLogError_category);
11596     BOOST_CHECK_EQUAL(::setsockopt_level, SOL_IP);
11597     BOOST_CHECK_EQUAL(::setsockopt_optname, IP_TRANSPARENT);
11598     BOOST_CHECK_EQUAL(*((int*)::setsockopt_optval), 1);
11599     BOOST_CHECK_EQUAL(::setsockopt_optlen, sizeof(int));
11600     
11601     // server fwdmode is FWD_TPROXY and client(IPv6), server(IPv6), setsockopt error
11602     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
11603     ::setsockopt_sock = 0;
11604     real.tcp_endpoint = dummyv6;
11605     real.fwdmode = l7vs::realserver_element::FWD_TPROXY;
11606     set_data.set_endpoint(dummyv6);
11607     test_obj.set_up_thread_data_dest_side(set_data);
11608     vs.my_element.realserver_vector.clear();
11609     vs.my_element.realserver_vector.push_back(real);
11610     test_obj.get_up_thread_send_realserver_socket_map().clear();
11611     test_obj.set_client_endpoint(dummyv6);
11612     setsockopt_ret = -1;
11613     setsockopt_level = -1;
11614     setsockopt_optname = 0;
11615     setsockopt_optval = NULL;
11616     setsockopt_optlen = 0;
11617     test_obj.test_call();
11618     // called setsockopt and will be session error
11619     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION, l7vs::Logger::putLogError_category);
11620     BOOST_CHECK_EQUAL(::setsockopt_level, SOL_IPV6);
11621     BOOST_CHECK_EQUAL(::setsockopt_optname, IP_TRANSPARENT);
11622     BOOST_CHECK_EQUAL(*((int*)::setsockopt_optval), 1);
11623     BOOST_CHECK_EQUAL(::setsockopt_optlen, sizeof(int));
11624
11625     // server fwdmode is FWD_TPROXY and client(IPv4), server(IPv4)
11626     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
11627     ::setsockopt_sock = 0;
11628     real.tcp_endpoint = dummy1;
11629     real.fwdmode = l7vs::realserver_element::FWD_TPROXY;
11630     set_data.set_endpoint(dummy1);
11631     test_obj.set_up_thread_data_dest_side(set_data);
11632     vs.my_element.realserver_vector.clear();
11633     vs.my_element.realserver_vector.push_back(real);
11634     test_obj.get_up_thread_send_realserver_socket_map().clear();
11635     test_obj.set_client_endpoint(dummy2);
11636     setsockopt_ret = 0;
11637     setsockopt_level = -1;
11638     setsockopt_optname = 0;
11639     setsockopt_optval = NULL;
11640     setsockopt_optlen = 0;
11641     test_obj.test_call();
11642     // called setsockopt and will be session error
11643     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE, l7vs::Logger::putLogError_category);
11644     BOOST_CHECK_EQUAL(::setsockopt_level, SOL_IP);
11645     BOOST_CHECK_EQUAL(::setsockopt_optname, IP_TRANSPARENT);
11646     BOOST_CHECK_EQUAL(*((int*)::setsockopt_optval), 1);
11647     BOOST_CHECK_EQUAL(::setsockopt_optlen, sizeof(int));
11648
11649     // server fwdmode is FWD_TPROXY and client(IPv6), server(IPv6)
11650     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
11651     ::setsockopt_sock = 0;
11652     real.tcp_endpoint = dummyv6;
11653     real.fwdmode = l7vs::realserver_element::FWD_TPROXY;
11654     set_data.set_endpoint(dummyv6);
11655     test_obj.set_up_thread_data_dest_side(set_data);
11656     vs.my_element.realserver_vector.clear();
11657     vs.my_element.realserver_vector.push_back(real);
11658     test_obj.get_up_thread_send_realserver_socket_map().clear();
11659     test_obj.set_client_endpoint(dummyv6);
11660     setsockopt_ret = 0;
11661     setsockopt_level = -1;
11662     setsockopt_optname = 0;
11663     setsockopt_optval = NULL;
11664     setsockopt_optlen = 0;
11665     test_obj.test_call();
11666     // called setsockopt and will be session error
11667     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE, l7vs::Logger::putLogError_category);
11668     BOOST_CHECK_EQUAL(::setsockopt_level, SOL_IPV6);
11669     BOOST_CHECK_EQUAL(::setsockopt_optname, IP_TRANSPARENT);
11670     BOOST_CHECK_EQUAL(*((int*)::setsockopt_optval), 1);
11671     BOOST_CHECK_EQUAL(::setsockopt_optlen, sizeof(int));
11672
11673
11674     // dummy server stop
11675     test_server.breq_close_wait_flag = false;   
11676     test_server.bstop_flag = true;
11677     server_thread.join();
11678
11679     BOOST_MESSAGE( "----- up_thread_realserver_connect test end -----" );
11680 }
11681
11682 //up_thread_realserver_connect access log test
11683 //up_thread_realserver_connect  access log class 
11684 class up_thread_realserver_connect_access_log_test_class : public l7vs::tcp_session{
11685     public:
11686        up_thread_realserver_connect_access_log_test_class(
11687                                 l7vs::virtualservice_tcp& vs,
11688                                 boost::asio::io_service& session_io,
11689                                 l7vs::tcp_socket_option_info& set_socket_option,
11690                                 boost::asio::ip::tcp::endpoint listen_endpoint,
11691                                 bool ssl_mode,
11692                                 boost::asio::ssl::context& set_ssl_context,
11693                                 bool set_ssl_cache_flag,
11694                                 int set_ssl_handshake_time_out,
11695                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
11696                                                                                                    session_io,
11697                                                                                                    set_socket_option,
11698                                                                                                    listen_endpoint,
11699                                                                                                    ssl_mode,
11700                                                                                                    set_ssl_context,
11701                                                                                                    set_ssl_cache_flag,
11702                                                                                                    set_ssl_handshake_time_out,
11703                                                                                                    set_access_logger){};
11704
11705         ~up_thread_realserver_connect_access_log_test_class(){};
11706         
11707         void test_call(){
11708             l7vs::tcp_session::up_thread_realserver_connect(LOCAL_PROC);
11709         };
11710         
11711         void set_protocol_module(l7vs::protocol_module_base* set_prot){
11712             protocol_module = set_prot;
11713         };
11714         l7vs::tcp_data& get_up_thread_data_client_side(){
11715             return up_thread_data_client_side;
11716         };
11717         l7vs::tcp_data& get_up_thread_data_dest_side(){
11718             return up_thread_data_dest_side;
11719         };
11720         l7vs::tcp_data& get_down_thread_data_client_side(){
11721             return down_thread_data_client_side;
11722         };
11723         l7vs::tcp_data& get_down_thread_data_dest_side(){
11724             return down_thread_data_dest_side;
11725         };
11726         l7vs::tcp_socket& get_client_socket(){
11727             return client_socket;
11728         };
11729         socket_element& get_sorryserver_socket(){
11730             return sorryserver_socket;
11731         };
11732         std::list<socket_element>& get_down_thread_receive_realserver_socket_list(){
11733             return down_thread_receive_realserver_socket_list;
11734         };
11735         std::map<endpoint,tcp_socket_ptr>& get_up_thread_send_realserver_socket_map(){
11736             return up_thread_send_realserver_socket_map;
11737         };
11738         std::list<socket_element>::iterator& get_down_thread_current_receive_realserver_socket(){
11739             return down_thread_current_receive_realserver_socket;
11740         };
11741         l7vs::tcp_realserver_connect_socket_list& get_down_thread_connect_socket_list(){
11742             return down_thread_connect_socket_list;
11743         };
11744         
11745         
11746         void set_up_thread_id(boost::thread::id set_id){
11747             up_thread_id = set_id;
11748         }
11749         void set_down_thread_id(boost::thread::id set_id){
11750             down_thread_id = set_id;
11751         }
11752         
11753         void next_up_function_call(){
11754             up_thread_next_call_function.second(LOCAL_PROC);
11755         }
11756         void next_down_function_call(){
11757             down_thread_next_call_function.second(LOCAL_PROC);
11758         }
11759         
11760         void set_up_thread_next_function_call_exit(){
11761             up_thread_function_pair fun_it = up_thread_function_array[UP_FUNC_EXIT];
11762             up_thread_next_call_function = fun_it;
11763         };
11764         
11765         void set_down_thread_next_function_call_exit(){
11766             down_thread_function_pair fun_it = down_thread_function_array[DOWN_FUNC_EXIT];
11767             down_thread_next_call_function = fun_it;
11768         };
11769         
11770         // next call function check
11771         void up_thread_realserver_connect_event(const TCP_PROCESS_TYPE_TAG process_type){
11772             up_thread_realserver_connect_event_call_check = true;
11773         };
11774         bool up_thread_realserver_connect_event_call_check;
11775         void up_thread_realserver_connection_fail_event(const TCP_PROCESS_TYPE_TAG process_type){
11776             up_thread_realserver_connection_fail_event_check = true;
11777         };
11778         bool up_thread_realserver_connection_fail_event_check;
11779         
11780         void up_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
11781             up_thread_exit_call_check = true;
11782         }
11783         bool up_thread_exit_call_check;
11784         
11785         void down_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
11786             down_thread_exit_call_check = true;
11787         }
11788         bool down_thread_exit_call_check;
11789         
11790         // map clear
11791         void up_thread_function_array_clear(){
11792             for(int i = 0;i <= UP_FUNC_EXIT;i++){
11793                 up_thread_function_array[i].second = NULL;
11794             }
11795         };
11796         void down_thread_function_array_clear(){
11797             for(int i = 0;i <= DOWN_FUNC_EXIT;i++){
11798                 down_thread_function_array[i].second = NULL;
11799             }
11800         };
11801         
11802         void up_thread_module_event_map_clear(){
11803             up_thread_module_event_map.clear();
11804         };
11805         
11806         void down_thread_module_event_map_clear(){
11807             down_thread_module_event_map.clear();
11808         };
11809
11810
11811         void set_client_endpoint(boost::asio::ip::tcp::endpoint& set_endpoint){
11812             client_endpoint = set_endpoint;
11813         };
11814
11815         std::string get_test_string(boost::asio::ip::tcp::endpoint& set_endpoint){
11816             return endpoint_to_string(set_endpoint);
11817         };
11818
11819         void set_access_log_flag( bool set_flag ){
11820             access_log_flag = set_flag;
11821         };
11822 };
11823
11824 void up_thread_realserver_connect_access_log_test(){
11825     BOOST_MESSAGE( "----- up_thread_realserver_connect access log test start -----" );
11826
11827     boost::asio::io_service io;
11828     l7vs::virtualservice_tcp vs;
11829
11830     std::string test_protocol_name("test protocol");
11831     l7vs::test_protocol_module proto_test(test_protocol_name);
11832
11833     l7vs::tcp_socket_option_info set_option;
11834     //! TCP_NODELAY   (false:not set,true:set option)
11835     set_option.nodelay_opt = false;
11836     //! TCP_NODELAY option value  (false:off,true:on)
11837     set_option.nodelay_val = false;
11838     //! TCP_CORK      (false:not set,true:set option)
11839     set_option.cork_opt = false;
11840     //! TCP_CORK option value     (false:off,true:on)
11841     set_option.cork_val = false;
11842     //! TCP_QUICKACK  (false:not set,true:set option)
11843     set_option.quickack_opt = false;
11844     //! TCP_QUICKACK option value (false:off,true:on)
11845     set_option.quickack_val = false;
11846
11847     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string("192.168.0.1"), 8080);
11848     bool set_mode(false);
11849     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
11850     bool set_ssl_cache_flag(false);
11851     int set_ssl_handshake_time_out = 0;
11852     l7vs::logger_implement_access* plogger = new l7vs::logger_implement_access( "test.log" );
11853
11854     up_thread_realserver_connect_access_log_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
11855     test_obj.set_access_log_flag(true);
11856
11857
11858     boost::asio::ip::tcp::endpoint client_src_endpoint(boost::asio::ip::address::from_string("192.168.10.20"), 54321);
11859     test_obj.set_client_endpoint(client_src_endpoint);
11860
11861     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
11862     boost::thread::id proc_id = boost::this_thread::get_id();
11863
11864     l7vs::tcp_data& con_data = test_obj.get_up_thread_data_dest_side();
11865     boost::asio::ip::tcp::endpoint con_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP),DUMMY_SERVER_PORT);
11866
11867     //up_thread_data_dest_side set
11868     con_data.initialize();
11869     con_data.set_endpoint(con_end);
11870     // thread_id set
11871     test_obj.set_up_thread_id(boost::thread::id());
11872     test_obj.set_down_thread_id(proc_id);
11873     // socket set
11874     l7vs::tcp_socket::connect_res = true;
11875     l7vs::tcp_socket::connect_connect_endpoint = boost::asio::ip::tcp::endpoint();
11876     l7vs::tcp_socket::connect_ec = NULL;
11877     l7vs::tcp_socket::connect_call_check = false;
11878     l7vs::tcp_socket::is_connect = true;
11879     // vs set
11880     vs.connection_active_list.clear();
11881     // map set
11882     std::map< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > >& rs_map = test_obj.get_up_thread_send_realserver_socket_map();
11883     rs_map.clear();
11884     // connection list set
11885     l7vs::tcp_realserver_connect_socket_list& con_list = test_obj.get_down_thread_connect_socket_list();
11886     con_list.clear();
11887     //tcp_session set
11888     test_obj.set_up_thread_next_function_call_exit();
11889     test_obj.up_thread_realserver_connect_event_call_check = false;
11890
11891     // dummy server 
11892     test_mirror_server test_server;
11893     // accept req
11894     test_server.breq_acc_flag = true;
11895     // close wait req
11896     test_server.breq_close_wait_flag = true;
11897     // recv cont
11898     test_server.req_recv_cnt = 0;
11899     // test server start
11900     boost::thread server_thread(boost::bind(&test_mirror_server::run,&test_server));
11901     while( !test_server.brun_flag ){
11902         sleep(1);
11903     }
11904
11905     test_obj.test_call();
11906
11907     BOOST_CHECK(con_end == l7vs::tcp_socket::connect_connect_endpoint);
11908     BOOST_CHECK(l7vs::tcp_socket::connect_ec != NULL);
11909     BOOST_CHECK(l7vs::tcp_socket::connect_call_check);
11910
11911     BOOST_CHECK(!con_list.empty());
11912     std::pair<boost::asio::ip::tcp::endpoint,boost::shared_ptr<l7vs::tcp_socket> > set_socket = con_list.get_socket();
11913     BOOST_CHECK(set_socket.first == con_end);
11914     BOOST_CHECK(set_socket.second == rs_map.begin()->second);
11915
11916     std::string cl_rm_end = test_obj.get_test_string( client_src_endpoint );
11917     std::string cl_lo_end = test_obj.get_test_string( listen_endpoint );
11918     boost::asio::ip::tcp::endpoint rs_local = set_socket.second->get_socket().local_endpoint();
11919     std::string rs_lo_end = test_obj.get_test_string( rs_local );
11920     std::string rs_rm_end = test_obj.get_test_string( con_end );
11921
11922     // unit_test [1] up_thread_realserver_connect client endpoint string check
11923     std::cerr << "[1] up_thread_realserver_connect client endpoint string check" << std::endl;
11924     BOOST_CHECK_EQUAL( cl_rm_end , plogger->putLog_cl_con_org );
11925     // unit_test [2] up_thread_realserver_connect virtualservice endpoint string check
11926     std::cerr << "[2] up_thread_realserver_connect virtualservice endpoint string check" << std::endl;
11927     BOOST_CHECK_EQUAL( cl_lo_end , plogger->putLog_vsinfo );
11928     // unit_test [3] up_thread_realserver_connect realserver local endpoint string check
11929     std::cerr << "[3] up_thread_realserver_connect realserver local endpoint string check" << std::endl;
11930     BOOST_CHECK_EQUAL( rs_lo_end , plogger->putLog_rs_con_org );
11931     // unit_test [4] up_thread_realserver_connect realserver remote endpoint string check
11932     std::cerr << "[4] up_thread_realserver_connect realserver remote endpoint string check" << std::endl;
11933     BOOST_CHECK_EQUAL( rs_rm_end , plogger->putLog_rs_con_dest );
11934     // unit_test [5] up_thread_realserver_connect realserver local endpoint string check
11935     std::cerr << "[5] up_thread_realserver_connect realserver local endpoint string check" << std::endl;
11936     BOOST_CHECK_EQUAL( "" , plogger->putLog_msg );
11937
11938     rs_map.clear();
11939     con_list.clear();
11940
11941     set_socket.second->get_socket().close();
11942
11943     // dummy server stop
11944     test_server.breq_close_wait_flag = false;   
11945     test_server.bstop_flag = true;
11946     server_thread.join();
11947
11948     delete plogger;
11949     plogger = NULL;
11950
11951     BOOST_MESSAGE( "----- up_thread_realserver_connect access log end -----" );
11952 }
11953
11954 //up_thread_sorryserver_connect test
11955 //up_thread_sorryserver_connect test class 
11956 class up_thread_sorryserver_connect_test_class : public l7vs::tcp_session{
11957     public:
11958 //        up_thread_sorryserver_connect_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){
11959 //        };
11960        up_thread_sorryserver_connect_test_class(
11961                                 l7vs::virtualservice_tcp& vs,
11962                                 boost::asio::io_service& session_io,
11963                                 l7vs::tcp_socket_option_info& set_socket_option,
11964                                 boost::asio::ip::tcp::endpoint listen_endpoint,
11965                                 bool ssl_mode,
11966                                 boost::asio::ssl::context& set_ssl_context,
11967                                 bool set_ssl_cache_flag,
11968                                 int set_ssl_handshake_time_out,
11969                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
11970                                                                                                    session_io,
11971                                                                                                    set_socket_option,
11972                                                                                                    listen_endpoint,
11973                                                                                                    ssl_mode,
11974                                                                                                    set_ssl_context,
11975                                                                                                    set_ssl_cache_flag,
11976                                                                                                    set_ssl_handshake_time_out,
11977                                                                                                    set_access_logger){};
11978
11979         ~up_thread_sorryserver_connect_test_class(){};
11980         
11981         void test_call(){
11982             l7vs::tcp_session::up_thread_sorryserver_connect(LOCAL_PROC);
11983         };
11984         
11985         void set_protocol_module(l7vs::protocol_module_base* set_prot){
11986             protocol_module = set_prot;
11987         };
11988         void set_up_thread_data_dest_side(l7vs::tcp_data& set_data){
11989             up_thread_data_dest_side.set_size(set_data.get_size());
11990             up_thread_data_dest_side.set_send_size(set_data.get_send_size());
11991             up_thread_data_dest_side.set_data(set_data.get_data());
11992             up_thread_data_dest_side.set_endpoint(set_data.get_endpoint());
11993         };
11994         l7vs::tcp_data& get_up_thread_data_client_side(){
11995             return up_thread_data_client_side;
11996         };
11997         l7vs::tcp_data& get_up_thread_data_dest_side(){
11998             return up_thread_data_dest_side;
11999         };
12000         l7vs::tcp_data& get_down_thread_data_client_side(){
12001             return down_thread_data_client_side;
12002         };
12003         l7vs::tcp_data& get_down_thread_data_dest_side(){
12004             return down_thread_data_dest_side;
12005         };
12006         l7vs::tcp_socket& get_client_socket(){
12007             return client_socket;
12008         };
12009         socket_element& get_sorryserver_socket(){
12010             return sorryserver_socket;
12011         };
12012         std::list<socket_element>& get_down_thread_receive_realserver_socket_list(){
12013             return down_thread_receive_realserver_socket_list;
12014         };
12015         std::map<endpoint,tcp_socket_ptr>& get_up_thread_send_realserver_socket_map(){
12016             return up_thread_send_realserver_socket_map;
12017         };
12018         std::list<socket_element>::iterator& get_down_thread_current_receive_realserver_socket(){
12019             return down_thread_current_receive_realserver_socket;
12020         };
12021         l7vs::tcp_realserver_connect_socket_list& get_down_thread_connect_socket_list(){
12022             return down_thread_connect_socket_list;
12023         };
12024         
12025         
12026         void set_up_thread_id(boost::thread::id set_id){
12027             up_thread_id = set_id;
12028         }
12029         void set_down_thread_id(boost::thread::id set_id){
12030             down_thread_id = set_id;
12031         }
12032         
12033         void set_client_endpoint(boost::asio::ip::tcp::endpoint& set_endpoint){
12034             client_endpoint = set_endpoint;
12035         };
12036         void next_up_function_call(){
12037             up_thread_next_call_function.second(LOCAL_PROC);
12038         }
12039         void next_down_function_call(){
12040             down_thread_next_call_function.second(LOCAL_PROC);
12041         }
12042         
12043         void set_up_thread_next_function_call_exit(){
12044             up_thread_function_pair fun_it = up_thread_function_array[UP_FUNC_EXIT];
12045             up_thread_next_call_function = fun_it;
12046         };
12047         
12048         void set_down_thread_next_function_call_exit(){
12049             down_thread_function_pair fun_it = down_thread_function_array[DOWN_FUNC_EXIT];
12050             down_thread_next_call_function = fun_it;
12051         };
12052         
12053         // next call function check
12054         void up_thread_sorryserver_connect_event(const TCP_PROCESS_TYPE_TAG process_type){
12055             up_thread_sorryserver_connect_event_call_check = true;
12056         };
12057         bool up_thread_sorryserver_connect_event_call_check;
12058         
12059         void up_thread_sorryserver_connection_fail_event(const TCP_PROCESS_TYPE_TAG process_type){
12060             up_thread_sorryserver_connection_fail_event_check = true;
12061         };
12062         bool up_thread_sorryserver_connection_fail_event_check;
12063         
12064         void up_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
12065             up_thread_exit_call_check = true;
12066         }
12067         bool up_thread_exit_call_check;
12068         
12069         void down_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
12070             down_thread_exit_call_check = true;
12071         }
12072         bool down_thread_exit_call_check;
12073         
12074         // map clear
12075         void up_thread_function_array_clear(){
12076             for(int i = 0;i <= UP_FUNC_EXIT;i++){
12077                 up_thread_function_array[i].second = NULL;
12078             }
12079         };
12080         void down_thread_function_map_clear(){
12081             for(int i = 0;i <= DOWN_FUNC_EXIT;i++){
12082                 down_thread_function_array[i].second = NULL;
12083             }
12084         };
12085         
12086         void up_thread_module_event_map_clear(){
12087             up_thread_module_event_map.clear();
12088         };
12089         
12090         void down_thread_module_event_map_clear(){
12091             down_thread_module_event_map.clear();
12092         };
12093 };
12094
12095 void up_thread_sorryserver_connect_test(){
12096     BOOST_MESSAGE( "----- up_thread_sorryserver_connect test start -----" );
12097     l7vs::virtualservice_tcp vs;
12098     boost::asio::io_service io;
12099     l7vs::tcp_socket_option_info set_option;
12100     //! TCP_NODELAY   (false:not set,true:set option)
12101     set_option.nodelay_opt = false;
12102     //! TCP_NODELAY option value  (false:off,true:on)
12103     set_option.nodelay_val = false;
12104     //! TCP_CORK      (false:not set,true:set option)
12105     set_option.cork_opt = false;
12106     //! TCP_CORK option value     (false:off,true:on)
12107     set_option.cork_val = false;
12108     //! TCP_QUICKACK  (false:not set,true:set option)
12109     set_option.quickack_opt = false;
12110     //! TCP_QUICKACK option value (false:off,true:on)
12111     set_option.quickack_val = false;
12112     //
12113     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
12114     bool set_mode(false);
12115     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
12116     bool set_ssl_cache_flag(false);
12117     int set_ssl_handshake_time_out = 0;
12118     //std::string access_log_file_name = "test";
12119     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
12120
12121     std::string test_protocol_name("test protocol");
12122     l7vs::test_protocol_module proto_test(test_protocol_name);
12123     // up_thread_sorryserver_send
12124 //    up_thread_sorryserver_connect_test_class test_obj(vs,io);
12125     up_thread_sorryserver_connect_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
12126
12127     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
12128     boost::thread::id proc_id = boost::this_thread::get_id();
12129     
12130     l7vs::tcp_data& con_data = test_obj.get_up_thread_data_dest_side();
12131     boost::asio::ip::tcp::endpoint con_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP),7000);
12132     
12133     //up_thread_data_dest_side set
12134     con_data.initialize();
12135     con_data.set_endpoint(con_end);
12136     // thread_id set
12137     test_obj.set_up_thread_id(boost::thread::id());
12138     test_obj.set_down_thread_id(proc_id);
12139     // socket set
12140     l7vs::tcp_socket::connect_res = true;
12141     l7vs::tcp_socket::connect_connect_endpoint = boost::asio::ip::tcp::endpoint();
12142     l7vs::tcp_socket::connect_ec = NULL;
12143     l7vs::tcp_socket::connect_call_check = false;
12144     //tcp_session set
12145     test_obj.set_up_thread_next_function_call_exit();
12146     test_obj.up_thread_sorryserver_connect_event_call_check = false;
12147     
12148     test_obj.test_call();
12149     
12150     // unit_test [1] up_thread_sorryserver_connect socket connect call check
12151     std::cerr << "[1] up_thread_sorryserver_connect socket connect call check" << std::endl;
12152     BOOST_CHECK(con_end == l7vs::tcp_socket::connect_connect_endpoint);
12153     BOOST_CHECK(l7vs::tcp_socket::connect_ec != NULL);
12154     BOOST_CHECK(l7vs::tcp_socket::connect_call_check);
12155     
12156     // unit_test [2] up_thread_sorryserver_connect up_thread_next_call_function update check
12157     std::cerr << "[2] up_thread_sorryserver_connect up_thread_next_call_function update check" << std::endl;
12158     test_obj.next_up_function_call();
12159     BOOST_CHECK(test_obj.up_thread_sorryserver_connect_event_call_check);
12160     
12161     // unit_test [3] up_thread_sorryserver_connect connect fail check
12162     std::cerr << "[3] up_thread_sorryserver_connect connect fail check" << std::endl;
12163     l7vs::tcp_socket::connect_res = false;
12164     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
12165     l7vs::Logger::putLogError_id = 0;
12166     test_obj.test_call();
12167     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
12168     BOOST_CHECK_EQUAL(54,l7vs::Logger::putLogError_id);
12169     std::cerr << l7vs::Logger::putLogError_message << std::endl;
12170     test_obj.up_thread_sorryserver_connection_fail_event_check = false;
12171     test_obj.next_up_function_call();
12172     BOOST_CHECK(test_obj.up_thread_sorryserver_connection_fail_event_check);
12173     
12174     l7vs::tcp_socket::connect_res = true;
12175
12176     // unit_test [4] up_thread_realserver_connect set non blocking fail check
12177     std::cerr << "[4] up_thread_realserver_connect set non blocking fail check" << std::endl;
12178     l7vs::tcp_socket::set_non_blocking_mode_res = false;
12179     l7vs::tcp_socket::set_non_blocking_mode_ec = boost::asio::error::bad_descriptor;
12180     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
12181     l7vs::Logger::putLogError_id = 0;
12182     test_obj.up_thread_exit_call_check = false;
12183     test_obj.test_call();
12184     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
12185     BOOST_CHECK_EQUAL(53,l7vs::Logger::putLogError_id);
12186     std::cerr << l7vs::Logger::putLogError_message << std::endl;
12187     BOOST_CHECK(test_obj.up_thread_exit_call_check);
12188     l7vs::tcp_socket::set_non_blocking_mode_res = true;
12189     l7vs::tcp_socket::set_non_blocking_mode_ec.clear();
12190     
12191     // unit_test [5] up_thread_sorryserver_connect not fond function error check
12192 /*
12193     std::cerr << "[5] up_thread_sorryserver_connect not fond function error check" << std::endl;
12194     test_obj.up_thread_function_array_clear();
12195     test_obj.up_thread_exit_call_check = false;
12196     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
12197     l7vs::Logger::putLogError_id = 0;
12198     test_obj.test_call();
12199     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
12200     BOOST_CHECK_EQUAL(55,l7vs::Logger::putLogError_id);
12201     std::cerr << l7vs::Logger::putLogError_message << std::endl;
12202     BOOST_CHECK(test_obj.up_thread_exit_call_check);
12203 */
12204
12205     // tproxy implement test
12206     #ifndef IP_TRANSPARENT
12207     #define IP_TRANSPARENT 19
12208     #endif
12209     boost::asio::ip::tcp::endpoint dummy_v4_1(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
12210     boost::asio::ip::tcp::endpoint dummy_v4_2(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT + 1);
12211     boost::asio::ip::tcp::endpoint dummy_v6_1(boost::asio::ip::address::from_string(DUMMY_SERVER_IPV6), DUMMY_SERVER_PORT);
12212     boost::asio::ip::tcp::endpoint dummy_v6_2(boost::asio::ip::address::from_string(DUMMY_SERVER_IPV6), DUMMY_SERVER_PORT + 1);
12213     l7vs::tcp_data set_data;
12214
12215     // server fwdmode is not FWD_TPROXY (FWD_MASQ)
12216     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
12217     ::setsockopt_sock = 0;
12218     vs.my_element.sorry_fwdmode = l7vs::virtualservice_element::FWD_MASQ;
12219     set_data.set_endpoint(dummy_v4_1);
12220     test_obj.set_up_thread_data_dest_side(set_data);
12221     if (test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().is_open()) {
12222         test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().close();
12223     }
12224     test_obj.test_call();
12225     // will be no error and not called setsockopt
12226     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE, l7vs::Logger::putLogError_category);
12227     BOOST_CHECK_EQUAL(::setsockopt_sock, 0);
12228     
12229     // server fwdmode is not FWD_TPROXY (FWD_NONE) (never happen)
12230     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
12231     ::setsockopt_sock = 0;
12232     vs.my_element.sorry_fwdmode = l7vs::virtualservice_element::FWD_NONE;
12233     set_data.set_endpoint(dummy_v4_1);
12234     test_obj.set_up_thread_data_dest_side(set_data);
12235     if (test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().is_open()) {
12236         test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().close();
12237     }
12238     test_obj.test_call();
12239     // will be no error and not called setsockopt
12240     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE, l7vs::Logger::putLogError_category);
12241     BOOST_CHECK_EQUAL(::setsockopt_sock, 0);
12242     
12243     // server fwdmode is FWD_TPROXY and client(IPv6), server(IPv4)
12244     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
12245     ::setsockopt_sock = 0;
12246     vs.my_element.sorry_fwdmode = l7vs::virtualservice_element::FWD_TPROXY;
12247     set_data.set_endpoint(dummy_v4_1);
12248     test_obj.set_up_thread_data_dest_side(set_data);
12249     test_obj.set_client_endpoint(dummy_v6_1);
12250     if (test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().is_open()) {
12251         test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().close();
12252     }
12253     test_obj.test_call();
12254     // will be no error and not called setsockopt
12255     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE, l7vs::Logger::putLogError_category);
12256     BOOST_CHECK_EQUAL(::setsockopt_sock, 0);
12257     
12258     // server fwdmode is FWD_TPROXY and client(IPv4), server(IPv6)
12259     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
12260     ::setsockopt_sock = 0;
12261     vs.my_element.sorry_fwdmode = l7vs::virtualservice_element::FWD_TPROXY;
12262     set_data.set_endpoint(dummy_v6_1);
12263     test_obj.set_up_thread_data_dest_side(set_data);
12264     test_obj.set_client_endpoint(dummy_v4_1);
12265     if (test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().is_open()) {
12266         test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().close();
12267     }
12268     test_obj.test_call();
12269     // will be no error and not called setsockopt
12270     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE, l7vs::Logger::putLogError_category);
12271     BOOST_CHECK_EQUAL(::setsockopt_sock, 0);
12272     
12273     // server fwdmode is FWD_TPROXY and client(IPv4), server(IPv4), setsockopt error
12274     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
12275     ::setsockopt_sock = 0;
12276     vs.my_element.sorry_fwdmode = l7vs::virtualservice_element::FWD_TPROXY;
12277     set_data.set_endpoint(dummy_v4_1);
12278     test_obj.set_up_thread_data_dest_side(set_data);
12279     test_obj.set_client_endpoint(dummy_v4_2);
12280     setsockopt_ret = -1;
12281     setsockopt_level = -1;
12282     setsockopt_optname = 0;
12283     setsockopt_optval = NULL;
12284     setsockopt_optlen = 0;
12285     if (test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().is_open()) {
12286         test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().close();
12287     }
12288     test_obj.test_call();
12289     // called setsockopt and will be session error
12290     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION, l7vs::Logger::putLogError_category);
12291     BOOST_CHECK_EQUAL(::setsockopt_level, SOL_IP);
12292     BOOST_CHECK_EQUAL(::setsockopt_optname, IP_TRANSPARENT);
12293     BOOST_CHECK_EQUAL(*((int*)::setsockopt_optval), 1);
12294     BOOST_CHECK_EQUAL(::setsockopt_optlen, sizeof(int));
12295     
12296     // server fwdmode is FWD_TPROXY and client(IPv6), server(IPv6), setsockopt error
12297     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
12298     ::setsockopt_sock = 0;
12299     vs.my_element.sorry_fwdmode = l7vs::virtualservice_element::FWD_TPROXY;
12300     set_data.set_endpoint(dummy_v6_1);
12301     test_obj.set_up_thread_data_dest_side(set_data);
12302     test_obj.set_client_endpoint(dummy_v6_2);
12303     setsockopt_ret = -1;
12304     setsockopt_level = -1;
12305     setsockopt_optname = 0;
12306     setsockopt_optval = NULL;
12307     setsockopt_optlen = 0;
12308     if (test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().is_open()) {
12309         test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().close();
12310     }
12311     test_obj.test_call();
12312     // called setsockopt and will be session error
12313     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION, l7vs::Logger::putLogError_category);
12314     BOOST_CHECK_EQUAL(::setsockopt_level, SOL_IPV6);
12315     BOOST_CHECK_EQUAL(::setsockopt_optname, IP_TRANSPARENT);
12316     BOOST_CHECK_EQUAL(*((int*)::setsockopt_optval), 1);
12317     BOOST_CHECK_EQUAL(::setsockopt_optlen, sizeof(int));
12318
12319     // server fwdmode is FWD_TPROXY and client(IPv4), server(IPv4)
12320     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
12321     ::setsockopt_sock = 0;
12322     vs.my_element.sorry_fwdmode = l7vs::virtualservice_element::FWD_TPROXY;
12323     set_data.set_endpoint(dummy_v4_1);
12324     test_obj.set_up_thread_data_dest_side(set_data);
12325     test_obj.set_client_endpoint(dummy_v4_2);
12326     setsockopt_ret = 0;
12327     setsockopt_level = -1;
12328     setsockopt_optname = 0;
12329     setsockopt_optval = NULL;
12330     setsockopt_optlen = 0;
12331     if (test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().is_open()) {
12332         test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().close();
12333     }
12334     test_obj.test_call();
12335     // called setsockopt and will be session error
12336     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE, l7vs::Logger::putLogError_category);
12337     BOOST_CHECK_EQUAL(::setsockopt_level, SOL_IP);
12338     BOOST_CHECK_EQUAL(::setsockopt_optname, IP_TRANSPARENT);
12339     BOOST_CHECK_EQUAL(*((int*)::setsockopt_optval), 1);
12340     BOOST_CHECK_EQUAL(::setsockopt_optlen, sizeof(int));
12341
12342     // server fwdmode is FWD_TPROXY and client(IPv6), server(IPv6)
12343     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
12344     ::setsockopt_sock = 0;
12345     vs.my_element.sorry_fwdmode = l7vs::virtualservice_element::FWD_TPROXY;
12346     set_data.set_endpoint(dummy_v6_1);
12347     test_obj.set_up_thread_data_dest_side(set_data);
12348     test_obj.set_client_endpoint(dummy_v6_2);
12349     setsockopt_ret = 0;
12350     setsockopt_level = -1;
12351     setsockopt_optname = 0;
12352     setsockopt_optval = NULL;
12353     setsockopt_optlen = 0;
12354     if (test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().is_open()) {
12355         test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().close();
12356     }
12357     test_obj.test_call();
12358     // called setsockopt and will be session error
12359     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE, l7vs::Logger::putLogError_category);
12360     BOOST_CHECK_EQUAL(::setsockopt_level, SOL_IPV6);
12361     BOOST_CHECK_EQUAL(::setsockopt_optname, IP_TRANSPARENT);
12362     BOOST_CHECK_EQUAL(*((int*)::setsockopt_optval), 1);
12363     BOOST_CHECK_EQUAL(::setsockopt_optlen, sizeof(int));
12364
12365     
12366     BOOST_MESSAGE( "----- up_thread_sorryserver_connect test end -----" );
12367 }
12368
12369 //realserver_disconnect test class 
12370 class realserver_disconnect_test_class : public l7vs::tcp_session{
12371     public:
12372 //        realserver_disconnect_test_class(l7vs::virtualservice_tcp& vs,boost::asio::io_service& session_io) : l7vs::tcp_session(vs,session_io){
12373 //        };
12374        realserver_disconnect_test_class(
12375                                 l7vs::virtualservice_tcp& vs,
12376                                 boost::asio::io_service& session_io,
12377                                 l7vs::tcp_socket_option_info& set_socket_option,
12378                                 boost::asio::ip::tcp::endpoint listen_endpoint,
12379                                 bool ssl_mode,
12380                                 boost::asio::ssl::context& set_ssl_context,
12381                                 bool set_ssl_cache_flag,
12382                                 int set_ssl_handshake_time_out,
12383                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
12384                                                                                                    session_io,
12385                                                                                                    set_socket_option,
12386                                                                                                    listen_endpoint,
12387                                                                                                    ssl_mode,
12388                                                                                                    set_ssl_context,
12389                                                                                                    set_ssl_cache_flag,
12390                                                                                                    set_ssl_handshake_time_out,
12391                                                                                                    set_access_logger){};
12392
12393         ~realserver_disconnect_test_class(){};
12394         
12395         
12396         void test_up_call(){
12397             l7vs::tcp_session::up_thread_realserver_disconnect(LOCAL_PROC);
12398         };
12399         void test_down_call(){
12400             l7vs::tcp_session::down_thread_realserver_disconnect(LOCAL_PROC);
12401         };
12402         
12403         void test_up_all_call(){
12404             l7vs::tcp_session::up_thread_all_realserver_disconnect(LOCAL_PROC);
12405         };
12406         void test_down_all_call(){
12407             l7vs::tcp_session::down_thread_all_realserver_disconnect(LOCAL_PROC);
12408         };
12409         void mutex_lock(){
12410             module_function_realserver_disconnect_mutex.wrlock();
12411         };
12412         void mutex_unlock(){
12413             module_function_realserver_disconnect_mutex.unlock();
12414         };
12415 //        bool mutex_trylock(){
12416 //           return module_function_realserver_disconnect_mutex.try_lock();
12417 //        };
12418         
12419         void set_protocol_module(l7vs::protocol_module_base* set_prot){
12420             protocol_module = set_prot;
12421         };
12422         l7vs::tcp_data& get_up_thread_data_client_side(){
12423             return up_thread_data_client_side;
12424         };
12425         l7vs::tcp_data& get_up_thread_data_dest_side(){
12426             return up_thread_data_dest_side;
12427         };
12428         l7vs::tcp_data& get_down_thread_data_client_side(){
12429             return down_thread_data_client_side;
12430         };
12431         l7vs::tcp_data& get_down_thread_data_dest_side(){
12432             return down_thread_data_dest_side;
12433         };
12434         l7vs::tcp_socket& get_client_socket(){
12435             return client_socket;
12436         };
12437         socket_element& get_sorryserver_socket(){
12438             return sorryserver_socket;
12439         };
12440         std::list<socket_element>& get_down_thread_receive_realserver_socket_list(){
12441             return down_thread_receive_realserver_socket_list;
12442         };
12443         std::map<endpoint,tcp_socket_ptr>& get_up_thread_send_realserver_socket_map(){
12444             return up_thread_send_realserver_socket_map;
12445         };
12446         std::list<socket_element>::iterator& get_down_thread_current_receive_realserver_socket(){
12447             return down_thread_current_receive_realserver_socket;
12448         };
12449         l7vs::tcp_realserver_connect_socket_list& get_down_thread_connect_socket_list(){
12450             return down_thread_connect_socket_list;
12451         };
12452         l7vs::lockfree_queue<l7vs::tcp_thread_message>& get_down_thread_message_que(){
12453             return down_thread_message_que;
12454         };
12455         l7vs::lockfree_queue<l7vs::tcp_thread_message>& get_up_thread_message_que(){
12456             return up_thread_message_que;
12457         };
12458         
12459         void set_up_thread_id(boost::thread::id set_id){
12460             up_thread_id = set_id;
12461         }
12462         void set_down_thread_id(boost::thread::id set_id){
12463             down_thread_id = set_id;
12464         }
12465         
12466         void next_up_function_call(){
12467             up_thread_next_call_function.second(LOCAL_PROC);
12468         }
12469         void next_down_function_call(){
12470             down_thread_next_call_function.second(LOCAL_PROC);
12471         }
12472         
12473         void set_up_thread_next_function_call_exit(){
12474             up_thread_function_pair fun_it = up_thread_function_array[UP_FUNC_EXIT];
12475             up_thread_next_call_function = fun_it;
12476         };
12477         
12478         void set_down_thread_next_function_call_exit(){
12479             down_thread_function_pair fun_it = down_thread_function_array[DOWN_FUNC_EXIT];
12480             down_thread_next_call_function = fun_it;
12481         };
12482         
12483         // next call function check
12484         void up_thread_realserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){
12485             up_thread_realserver_disconnect_event_call_check = true;
12486         };
12487         bool up_thread_realserver_disconnect_event_call_check;
12488         
12489         void down_thread_realserver_disconnect_event(const TCP_PROCESS_TYPE_TAG process_type){
12490             down_thread_realserver_disconnect_event_call_check = true;
12491         };
12492         bool down_thread_realserver_disconnect_event_call_check;
12493         
12494         void up_thread_client_disconnect(const TCP_PROCESS_TYPE_TAG process_type){
12495             up_thread_client_disconnect_call_check = true;
12496         };
12497         bool up_thread_client_disconnect_call_check;
12498         
12499         void down_thread_client_disconnect(const TCP_PROCESS_TYPE_TAG process_type){
12500             down_thread_client_disconnect_call_check = true;
12501         };
12502         bool down_thread_client_disconnect_call_check;
12503         
12504         void up_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
12505             up_thread_exit_call_check = true;
12506         }
12507         bool up_thread_exit_call_check;
12508         
12509         void down_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
12510             down_thread_exit_call_check = true;
12511         }
12512         bool down_thread_exit_call_check;
12513         
12514         // map clear
12515         void up_thread_function_array_clear(){
12516             for(int i = 0;i <= UP_FUNC_EXIT;i++){
12517                 up_thread_function_array[i].second = NULL;
12518             }
12519         };
12520         void down_thread_function_array_clear(){
12521             for(int i = 0;i <= DOWN_FUNC_EXIT;i++){
12522                 down_thread_function_array[i].second = NULL;
12523             }
12524         };
12525         
12526         void up_thread_module_event_map_clear(){
12527             up_thread_module_event_map.clear();
12528         };
12529         
12530         void down_thread_module_event_map_clear(){
12531             down_thread_module_event_map.clear();
12532         };
12533         
12534         void up_thread_message_down_thread_function_map_clear(){
12535             up_thread_message_down_thread_function_map.clear();
12536         };
12537         
12538         void down_thread_message_up_thread_function_map_clear(){
12539             down_thread_message_up_thread_function_map.clear();
12540         };
12541         
12542 };
12543 //up_thread_realserver_disconnect test
12544 void up_thread_realserver_disconnect_test(){
12545     BOOST_MESSAGE( "----- up_thread_realserver_disconnect test start -----" );
12546     
12547     boost::asio::io_service io;
12548     l7vs::virtualservice_tcp vs;
12549     l7vs::tcp_socket_option_info set_option;
12550     //! TCP_NODELAY   (false:not set,true:set option)
12551     set_option.nodelay_opt = false;
12552     //! TCP_NODELAY option value  (false:off,true:on)
12553     set_option.nodelay_val = false;
12554     //! TCP_CORK      (false:not set,true:set option)
12555     set_option.cork_opt = false;
12556     //! TCP_CORK option value     (false:off,true:on)
12557     set_option.cork_val = false;
12558     //! TCP_QUICKACK  (false:not set,true:set option)
12559     set_option.quickack_opt = false;
12560     //! TCP_QUICKACK option value (false:off,true:on)
12561     set_option.quickack_val = false;
12562     //
12563     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
12564     bool set_mode(false);
12565     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
12566     bool set_ssl_cache_flag(false);
12567     int set_ssl_handshake_time_out = 0;
12568     //std::string access_log_file_name = "test";
12569     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
12570
12571     std::string test_protocol_name("test protocol");
12572     l7vs::test_protocol_module proto_test(test_protocol_name);
12573 //    realserver_disconnect_test_class test_obj(vs,io);
12574     realserver_disconnect_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
12575
12576     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
12577     boost::thread::id proc_id = boost::this_thread::get_id();
12578     
12579     l7vs::tcp_data& discon_data = test_obj.get_up_thread_data_dest_side();
12580     
12581     //up_thread_data_dest_side set
12582     boost::asio::ip::tcp::endpoint discon_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP),7001);
12583     discon_data.initialize();
12584     discon_data.set_endpoint(discon_end);
12585     // thread_id set
12586     test_obj.set_down_thread_id(boost::thread::id());
12587     test_obj.set_up_thread_id(proc_id);
12588     // vs set
12589     vs.connection_inactive_list.clear();
12590     // map set
12591     // set realserver socket
12592     std::map<boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > >& rs_map = test_obj.get_up_thread_send_realserver_socket_map();
12593     std::map<boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > >::iterator rs_it;
12594     std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > push_pair;
12595     for(int i = 0 ; i < 3 ;i++){
12596         boost::shared_ptr< l7vs::tcp_socket > new_socket(new l7vs::tcp_socket(io));
12597         push_pair.first.address(boost::asio::ip::address::from_string(DUMMY_SERVER_IP));
12598         push_pair.first.port(7000+i);
12599         push_pair.second = new_socket;
12600         new_socket->close_res = true;
12601         new_socket->close_out_ec.clear();
12602         new_socket->close_call_check = false;
12603         rs_map.insert(push_pair);
12604     }
12605     // message que
12606     l7vs::lockfree_queue<l7vs::tcp_thread_message>& down_thread_message_que    = test_obj.get_down_thread_message_que();
12607     l7vs::lockfree_queue<l7vs::tcp_thread_message>& up_thread_message_que    = test_obj.get_up_thread_message_que();
12608     while( !down_thread_message_que.empty() ){
12609         l7vs::tcp_thread_message*    tmp_ptr    = down_thread_message_que.pop();
12610         delete    tmp_ptr;
12611     }
12612     while( !up_thread_message_que.empty() ){
12613         l7vs::tcp_thread_message*    tmp_ptr    = up_thread_message_que.pop();
12614         delete    tmp_ptr;
12615     }
12616     
12617     //tcp_session set
12618     test_obj.set_up_thread_next_function_call_exit();
12619     test_obj.up_thread_realserver_disconnect_event_call_check = false;
12620     
12621     test_obj.test_up_call();
12622     
12623     rs_it = rs_map.find(discon_end);
12624     
12625     // unit_test [1] up_thread_realserver_disconnect socket close call check
12626     std::cerr << "[1] up_thread_realserver_disconnect socket close call check" << std::endl;
12627     BOOST_CHECK(rs_it != rs_map.end());
12628     BOOST_CHECK(rs_it->second->close_call_check);
12629     
12630     // unit_test [2] up_thread_realserver_disconnect virtualservice connection_inactive call check
12631     std::cerr << "[2] up_thread_realserver_disconnect virtualservice connection_inactive call check" << std::endl;
12632     BOOST_CHECK(!vs.connection_inactive_list.empty());
12633     BOOST_CHECK(*(vs.connection_inactive_list.begin()) == discon_end);
12634     
12635     // unit_test [3] up_thread_realserver_disconnect up thread message set check
12636     std::cerr << "[3] up_thread_realserver_disconnect up thread message set check" << std::endl;
12637     BOOST_CHECK(!up_thread_message_que.empty());
12638     l7vs::tcp_thread_message*    up_msg        = up_thread_message_que.pop();
12639     BOOST_CHECK(up_thread_message_que.empty());
12640     BOOST_CHECK(up_msg->endpoint_info == discon_end);
12641     test_obj.up_thread_realserver_disconnect_event_call_check = false;
12642     up_msg->message(l7vs::tcp_session::MESSAGE_PROC);
12643     BOOST_CHECK(test_obj.up_thread_realserver_disconnect_event_call_check);
12644     delete    up_msg;
12645
12646     // unit_test [4] up_thread_realserver_disconnect down thread message set check
12647     std::cerr << "[4] up_thread_realserver_disconnect down thread message set check" << std::endl;
12648     BOOST_CHECK(!down_thread_message_que.empty());
12649     l7vs::tcp_thread_message*    down_msg    = down_thread_message_que.pop();
12650     BOOST_CHECK(down_thread_message_que.empty());
12651     BOOST_CHECK(down_msg->endpoint_info == discon_end);
12652     test_obj.down_thread_realserver_disconnect_event_call_check = false;
12653     down_msg->message(l7vs::tcp_session::MESSAGE_PROC);
12654     BOOST_CHECK(test_obj.down_thread_realserver_disconnect_event_call_check);
12655     delete    down_msg;
12656
12657     // unit_test [5] up_thread_realserver_disconnect closed socket not set message check
12658     std::cerr << "[5] up_thread_realserver_disconnect closed socket not set message check" << std::endl;
12659     rs_it->second->close_res = false;
12660     test_obj.test_up_call();
12661     BOOST_CHECK(up_thread_message_que.empty());
12662     BOOST_CHECK(down_thread_message_que.empty());
12663     
12664     rs_it->second->close_res = true;
12665     
12666     // unit_test [6] up_thread_realserver_disconnect not fond down_thread_realserver_disconnect_event function error check
12667     std::cerr << "[6] up_thread_realserver_disconnect not fond down_thread_realserver_disconnect_event function error check" << std::endl;
12668     test_obj.up_thread_message_down_thread_function_map_clear();
12669     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
12670     l7vs::Logger::putLogError_id = 0;
12671     test_obj.up_thread_exit_call_check = false;
12672     test_obj.test_up_call();
12673     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
12674     BOOST_CHECK_EQUAL(44,l7vs::Logger::putLogError_id);
12675     std::cerr << l7vs::Logger::putLogError_message << std::endl;
12676     BOOST_CHECK(test_obj.up_thread_exit_call_check);
12677     
12678     // unit_test [7] up_thread_realserver_disconnect not fond up_thread_sorryserver_disconnect_event function error check
12679     std::cerr << "[7] up_thread_realserver_disconnect not fond up_thread_sorryserver_disconnect_event function error check" << std::endl;
12680     test_obj.up_thread_function_array_clear();
12681     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
12682     l7vs::Logger::putLogError_id = 0;
12683     test_obj.up_thread_exit_call_check = false;
12684     test_obj.test_up_call();
12685     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
12686     BOOST_CHECK_EQUAL(43,l7vs::Logger::putLogError_id);
12687     std::cerr << l7vs::Logger::putLogError_message << std::endl;
12688     BOOST_CHECK(test_obj.up_thread_exit_call_check);
12689     
12690     BOOST_MESSAGE( "----- up_thread_realserver_disconnect test end -----" );
12691 }
12692
12693 //down_thread_realserver_disconnect test
12694 void down_thread_realserver_disconnect_test(){
12695     BOOST_MESSAGE( "----- down_thread_realserver_disconnect test start -----" );
12696     
12697     boost::asio::io_service io;
12698     l7vs::virtualservice_tcp vs;
12699     l7vs::tcp_socket_option_info set_option;
12700     //! TCP_NODELAY   (false:not set,true:set option)
12701     set_option.nodelay_opt = false;
12702     //! TCP_NODELAY option value  (false:off,true:on)
12703     set_option.nodelay_val = false;
12704     //! TCP_CORK      (false:not set,true:set option)
12705     set_option.cork_opt = false;
12706     //! TCP_CORK option value     (false:off,true:on)
12707     set_option.cork_val = false;
12708     //! TCP_QUICKACK  (false:not set,true:set option)
12709     set_option.quickack_opt = false;
12710     //! TCP_QUICKACK option value (false:off,true:on)
12711     set_option.quickack_val = false;
12712     //
12713     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
12714     bool set_mode(false);
12715     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
12716     bool set_ssl_cache_flag(false);
12717     int set_ssl_handshake_time_out = 0;
12718     //std::string access_log_file_name = "test";
12719     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
12720
12721     std::string test_protocol_name("test protocol");
12722     l7vs::test_protocol_module proto_test(test_protocol_name);
12723 //    realserver_disconnect_test_class test_obj(vs,io);
12724     realserver_disconnect_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
12725     
12726     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
12727     boost::thread::id proc_id = boost::this_thread::get_id();
12728     
12729     l7vs::tcp_data& discon_data = test_obj.get_down_thread_data_dest_side();
12730     
12731     //up_thread_data_dest_side set
12732     boost::asio::ip::tcp::endpoint discon_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP),7001);
12733     discon_data.initialize();
12734     discon_data.set_endpoint(discon_end);
12735     // thread_id set
12736     test_obj.set_up_thread_id(boost::thread::id());
12737     test_obj.set_down_thread_id(proc_id);
12738     // vs set
12739     vs.connection_inactive_list.clear();
12740     // map set
12741     // set realserver socket
12742     std::list< std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > >& rs_list = test_obj.get_down_thread_receive_realserver_socket_list();
12743     std::list< std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > >::iterator rs_it;
12744     std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > push_pair;
12745     for(int i = 0 ; i < 3 ;i++){
12746         boost::shared_ptr< l7vs::tcp_socket > new_socket(new l7vs::tcp_socket(io));
12747         push_pair.first.address(boost::asio::ip::address::from_string(DUMMY_SERVER_IP));
12748         push_pair.first.port(7000+i);
12749         push_pair.second = new_socket;
12750         new_socket->close_res = true;
12751         new_socket->close_out_ec.clear();
12752         new_socket->close_call_check = false;
12753         rs_list.push_back(push_pair);
12754     }
12755     
12756     // message que
12757     l7vs::lockfree_queue<l7vs::tcp_thread_message>& down_thread_message_que = test_obj.get_down_thread_message_que();
12758     l7vs::lockfree_queue<l7vs::tcp_thread_message>& up_thread_message_que = test_obj.get_up_thread_message_que();
12759     while( !down_thread_message_que.empty() ){
12760         l7vs::tcp_thread_message*    tmp_ptr    = down_thread_message_que.pop();
12761         delete    tmp_ptr;
12762     }
12763     while( !up_thread_message_que.empty() ){
12764         l7vs::tcp_thread_message*    tmp_ptr    = up_thread_message_que.pop();
12765         delete    tmp_ptr;
12766     }
12767     
12768     //tcp_session set
12769     test_obj.set_down_thread_next_function_call_exit();
12770     test_obj.down_thread_realserver_disconnect_event_call_check = false;
12771     
12772     test_obj.test_down_call();
12773     
12774     rs_it = rs_list.begin();
12775     while(rs_it != rs_list.end()){
12776         if( rs_it->first == discon_end )
12777             break;
12778         rs_it++;
12779     }
12780     
12781     // unit_test [1] down_thread_realserver_disconnect socket close call check
12782     std::cerr << "[1] down_thread_realserver_disconnect socket close call check" << std::endl;
12783     BOOST_CHECK(rs_it != rs_list.end());
12784     BOOST_CHECK(rs_it->second->close_call_check);
12785     
12786     // unit_test [2] down_thread_realserver_disconnect virtualservice connection_inactive call check
12787     std::cerr << "[2] down_thread_realserver_disconnect virtualservice connection_inactive call check" << std::endl;
12788     BOOST_CHECK(!vs.connection_inactive_list.empty());
12789     BOOST_CHECK(*(vs.connection_inactive_list.begin()) == discon_end);
12790     
12791     // unit_test [3] down_thread_realserver_disconnect up thread message set check
12792     std::cerr << "[3] down_thread_realserver_disconnect up thread message set check" << std::endl;
12793     BOOST_CHECK(!up_thread_message_que.empty());
12794     l7vs::tcp_thread_message*    up_msg        = up_thread_message_que.pop();
12795     BOOST_CHECK(up_thread_message_que.empty());
12796     BOOST_CHECK(up_msg->endpoint_info == discon_end);
12797     test_obj.up_thread_realserver_disconnect_event_call_check = false;
12798     up_msg->message(l7vs::tcp_session::MESSAGE_PROC);
12799     BOOST_CHECK(test_obj.up_thread_realserver_disconnect_event_call_check);
12800     delete    up_msg;
12801
12802     // unit_test [4] up_thread_sorryserver_disconnect down thread message set check
12803     std::cerr << "[4] up_thread_sorryserver_disconnect down thread message set check" << std::endl;
12804     BOOST_CHECK(!down_thread_message_que.empty());
12805     l7vs::tcp_thread_message*    down_msg    = down_thread_message_que.pop();
12806     BOOST_CHECK(down_thread_message_que.empty());
12807     BOOST_CHECK(down_msg->endpoint_info == discon_end);
12808     test_obj.down_thread_realserver_disconnect_event_call_check = false;
12809     down_msg->message(l7vs::tcp_session::MESSAGE_PROC);
12810     BOOST_CHECK(test_obj.down_thread_realserver_disconnect_event_call_check);
12811     delete    down_msg;
12812
12813     // unit_test [5] down_thread_realserver_disconnect closed socket not set message check
12814     std::cerr << "[5] down_thread_realserver_disconnect closed socket not set message check" << std::endl;
12815     rs_it->second->close_res = false;
12816     test_obj.test_down_call();
12817     BOOST_CHECK(up_thread_message_que.empty());
12818     BOOST_CHECK(down_thread_message_que.empty());
12819     
12820     rs_it->second->close_res = true;
12821     
12822     // unit_test [6] down_thread_realserver_disconnect not fond down_thread_realserver_disconnect_event function error check
12823     std::cerr << "[6] down_thread_realserver_disconnect not fond down_thread_realserver_disconnect_event function error check" << std::endl;
12824     test_obj.down_thread_message_up_thread_function_map_clear();
12825     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
12826     l7vs::Logger::putLogError_id = 0;
12827     test_obj.down_thread_exit_call_check = false;
12828     test_obj.test_down_call();
12829     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
12830     BOOST_CHECK_EQUAL(73,l7vs::Logger::putLogError_id);
12831     std::cerr << l7vs::Logger::putLogError_message << std::endl;
12832     BOOST_CHECK(test_obj.down_thread_exit_call_check);
12833     
12834     // unit_test [7] down_thread_realserver_disconnect not fond up_thread_sorryserver_disconnect_event function error check
12835     std::cerr << "[7] down_thread_realserver_disconnect not fond up_thread_sorryserver_disconnect_event function error check" << std::endl;
12836     test_obj.down_thread_function_array_clear();
12837     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
12838     l7vs::Logger::putLogError_id = 0;
12839     test_obj.down_thread_exit_call_check = false;
12840     test_obj.test_down_call();
12841     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
12842     BOOST_CHECK_EQUAL(72,l7vs::Logger::putLogError_id);
12843     std::cerr << l7vs::Logger::putLogError_message << std::endl;
12844     BOOST_CHECK(test_obj.down_thread_exit_call_check);
12845     
12846     BOOST_MESSAGE( "----- down_thread_realserver_disconnect test end -----" );
12847 }
12848
12849
12850 //up_thread_all_realserver_disconnect test
12851 void up_thread_all_realserver_disconnect_test(){
12852     BOOST_MESSAGE( "----- up_thread_all_realserver_disconnect test start -----" );
12853     
12854     boost::asio::io_service io;
12855     l7vs::virtualservice_tcp vs;
12856     l7vs::tcp_socket_option_info set_option;
12857     //! TCP_NODELAY   (false:not set,true:set option)
12858     set_option.nodelay_opt = false;
12859     //! TCP_NODELAY option value  (false:off,true:on)
12860     set_option.nodelay_val = false;
12861     //! TCP_CORK      (false:not set,true:set option)
12862     set_option.cork_opt = false;
12863     //! TCP_CORK option value     (false:off,true:on)
12864     set_option.cork_val = false;
12865     //! TCP_QUICKACK  (false:not set,true:set option)
12866     set_option.quickack_opt = false;
12867     //! TCP_QUICKACK option value (false:off,true:on)
12868     set_option.quickack_val = false;
12869     //
12870     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
12871     bool set_mode(false);
12872     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
12873     bool set_ssl_cache_flag(false);
12874     int set_ssl_handshake_time_out = 0;
12875     //std::string access_log_file_name = "test";
12876     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
12877
12878     std::string test_protocol_name("test protocol");
12879     l7vs::test_protocol_module proto_test(test_protocol_name);
12880 //    realserver_disconnect_test_class test_obj(vs,io);
12881     realserver_disconnect_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
12882     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
12883     boost::thread::id proc_id = boost::this_thread::get_id();
12884     
12885     l7vs::tcp_data& discon_data = test_obj.get_up_thread_data_dest_side();
12886     
12887     //up_thread_data_dest_side set
12888     boost::asio::ip::tcp::endpoint discon_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP),7001);
12889     discon_data.initialize();
12890     discon_data.set_endpoint(discon_end);
12891     // thread_id set
12892     test_obj.set_down_thread_id(boost::thread::id());
12893     test_obj.set_up_thread_id(proc_id);
12894     // vs set
12895     vs.connection_inactive_list.clear();
12896     // map set
12897     // set realserver socket
12898     std::map<boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > >& rs_map = test_obj.get_up_thread_send_realserver_socket_map();
12899     std::map<boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > >::iterator rs_it;
12900     std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > push_pair;
12901     std::list< std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > > ref_rs_list;
12902     std::list< std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > >::iterator ref_rs_it;
12903     for(int i = 0 ; i < 3 ;i++){
12904         boost::shared_ptr< l7vs::tcp_socket > new_socket(new l7vs::tcp_socket(io));
12905         push_pair.first.address(boost::asio::ip::address::from_string(DUMMY_SERVER_IP));
12906         push_pair.first.port(7000+i);
12907         push_pair.second = new_socket;
12908         new_socket->close_res = true;
12909         new_socket->close_out_ec.clear();
12910         new_socket->close_call_check = false;
12911         rs_map.insert(push_pair);
12912         ref_rs_list.push_back(push_pair);
12913     }
12914     // message que
12915     l7vs::lockfree_queue<l7vs::tcp_thread_message>& down_thread_message_que = test_obj.get_down_thread_message_que();
12916     l7vs::lockfree_queue<l7vs::tcp_thread_message>& up_thread_message_que = test_obj.get_up_thread_message_que();
12917     while( !down_thread_message_que.empty() ){
12918         l7vs::tcp_thread_message*    tmp_ptr    = down_thread_message_que.pop();
12919         delete    tmp_ptr;
12920     }
12921     while( !up_thread_message_que.empty() ){
12922         l7vs::tcp_thread_message*    tmp_ptr    = up_thread_message_que.pop();
12923         delete    tmp_ptr;
12924     }
12925     
12926     //tcp_session set
12927     test_obj.set_up_thread_next_function_call_exit();
12928     test_obj.up_thread_client_disconnect_call_check = false;
12929     
12930     //protocol module set
12931     proto_test.handle_realserver_disconnect_res_tag = l7vs::protocol_module_base::CLIENT_DISCONNECT;
12932     proto_test.handle_realserver_disconnect_thread_id = boost::thread::id();
12933     proto_test.handle_realserver_disconnect_rs_endpoint_list.clear();
12934     
12935     test_obj.test_up_all_call();
12936     
12937     // unit_test [1] up_thread_all_realserver_disconnect socket close call check
12938     std::cerr << "[1] up_thread_all_realserver_disconnect socket close call check" << std::endl;
12939     ref_rs_it = ref_rs_list.begin();
12940     while(ref_rs_it != ref_rs_list.end()){
12941         BOOST_CHECK(ref_rs_it->second->close_call_check);
12942         ref_rs_it++;
12943     }
12944
12945     // unit_test [2] up_thread_all_realserver_disconnect virtualservice connection_inactive call check
12946     std::cerr << "[2] up_thread_all_realserver_disconnect virtualservice connection_inactive call check" << std::endl;
12947     BOOST_CHECK(!vs.connection_inactive_list.empty());
12948     ref_rs_it = ref_rs_list.begin();
12949     while(ref_rs_it != ref_rs_list.end()){
12950         std::list<boost::asio::ip::tcp::endpoint>::iterator end_list_it = vs.connection_inactive_list.begin();
12951         while(end_list_it == vs.connection_inactive_list.end()){
12952             if(ref_rs_it->first == *end_list_it)
12953                 break;
12954             end_list_it++;
12955         }
12956         BOOST_CHECK(end_list_it != vs.connection_inactive_list.end());
12957         ref_rs_it++;
12958     }
12959     
12960     // unit_test [3] up_thread_all_realserver_disconnect handle_realserver_disconnect call check
12961     std::cerr << "[3] up_thread_all_realserver_disconnect handle_realserver_disconnect call check" << std::endl;
12962     BOOST_CHECK(proto_test.handle_realserver_disconnect_thread_id == proc_id);
12963     BOOST_CHECK(!proto_test.handle_realserver_disconnect_rs_endpoint_list.empty());
12964     ref_rs_it = ref_rs_list.begin();
12965     while(ref_rs_it != ref_rs_list.end()){
12966         std::list<boost::asio::ip::tcp::endpoint>::iterator end_list_it = proto_test.handle_realserver_disconnect_rs_endpoint_list.begin();
12967         while(end_list_it == vs.connection_inactive_list.end()){
12968             if(ref_rs_it->first == *end_list_it)
12969                 break;
12970             end_list_it++;
12971         }
12972         BOOST_CHECK(end_list_it != proto_test.handle_realserver_disconnect_rs_endpoint_list.end());
12973         ref_rs_it++;
12974     }
12975     
12976     // unit_test [4] up_thread_all_realserver_disconnect update up_thread_next_call_function check
12977     std::cerr << "[4] up_thread_all_realserver_disconnect update up_thread_next_call_function check" << std::endl;
12978     test_obj.next_up_function_call();
12979     BOOST_CHECK(test_obj.up_thread_client_disconnect_call_check);
12980     
12981     // unit_test [5] up_thread_all_realserver_disconnect realserver not fond check
12982     std::cerr << "[5] up_thread_all_realserver_disconnect realserver not fond check" << std::endl;
12983     proto_test.handle_realserver_disconnect_thread_id = boost::thread::id();
12984     proto_test.handle_realserver_disconnect_rs_endpoint_list.clear();
12985     test_obj.up_thread_client_disconnect_call_check = false;
12986
12987     test_obj.test_up_all_call();
12988
12989     BOOST_CHECK(proto_test.handle_realserver_disconnect_thread_id == proc_id);
12990     BOOST_CHECK(!proto_test.handle_realserver_disconnect_rs_endpoint_list.empty());
12991     BOOST_CHECK( *(proto_test.handle_realserver_disconnect_rs_endpoint_list.begin()) == boost::asio::ip::tcp::endpoint() );
12992     test_obj.next_up_function_call();
12993     BOOST_CHECK(test_obj.up_thread_client_disconnect_call_check);
12994
12995     // unit_test [6] up_thread_all_realserver_disconnect handle_realserver_disconnect mutex lock check
12996     std::cerr << "[6] up_thread_all_realserver_disconnect handle_realserver_disconnect mutex lock check" << std::endl;
12997     ref_rs_it = ref_rs_list.begin();
12998     while(ref_rs_it != ref_rs_list.end()){
12999         rs_map.insert(*ref_rs_it);
13000         ref_rs_it++;
13001     }
13002     proto_test.handle_realserver_disconnect_thread_id = boost::thread::id();
13003     test_obj.mutex_lock();
13004     boost::thread test_thread(boost::bind(&realserver_disconnect_test_class::test_up_all_call,&test_obj));
13005     sleep(1);
13006     BOOST_CHECK(proto_test.handle_realserver_disconnect_thread_id == boost::thread::id());
13007     
13008     // unit_test [7] up_thread_all_realserver_disconnect handle_realserver_disconnect mutex unlock run check
13009     std::cerr << "[7] up_thread_all_realserver_disconnect handle_realserver_disconnect mutex unlock run check" << std::endl;
13010     boost::thread::id test_id = test_thread.get_id();
13011     test_obj.set_up_thread_id(test_id);
13012     test_obj.mutex_unlock();
13013     sleep(1);
13014     BOOST_CHECK(proto_test.handle_realserver_disconnect_thread_id == test_id);
13015     test_thread.join();
13016     
13017     // unit_test [8] up_thread_all_realserver_disconnect not fond function error check
13018     std::cerr << "[8] up_thread_all_realserver_disconnect not fond function error check" << std::endl;
13019     ref_rs_it = ref_rs_list.begin();
13020     while(ref_rs_it != ref_rs_list.end()){
13021         rs_map.insert(*ref_rs_it);
13022         ref_rs_it++;
13023     }
13024     test_obj.up_thread_function_array_clear();
13025     test_obj.up_thread_exit_call_check = false;
13026     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
13027     l7vs::Logger::putLogError_id = 0;
13028     test_obj.test_up_all_call();
13029     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
13030     BOOST_CHECK_EQUAL(48,l7vs::Logger::putLogError_id);
13031     std::cerr << l7vs::Logger::putLogError_message << std::endl;
13032     BOOST_CHECK(test_obj.up_thread_exit_call_check);
13033     
13034     // unit_test [9] up_thread_all_realserver_disconnect returnd illegal EVENT_TAG error check
13035     std::cerr << "[9] up_thread_all_realserver_disconnect returnd illegal EVENT_TAG error check" << std::endl;
13036     ref_rs_it = ref_rs_list.begin();
13037     while(ref_rs_it != ref_rs_list.end()){
13038         rs_map.insert(*ref_rs_it);
13039         ref_rs_it++;
13040     }
13041     test_obj.up_thread_module_event_map_clear();
13042     test_obj.up_thread_exit_call_check = false;
13043     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
13044     l7vs::Logger::putLogError_id = 0;
13045     test_obj.test_up_all_call();
13046     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
13047     BOOST_CHECK_EQUAL(47,l7vs::Logger::putLogError_id);
13048     std::cerr << l7vs::Logger::putLogError_message << std::endl;
13049     BOOST_CHECK(test_obj.up_thread_exit_call_check);
13050     
13051     BOOST_MESSAGE( "----- up_thread_all_realserver_disconnect test end -----" );
13052 }
13053
13054 //down_thread_all_realserver_disconnect test
13055 void down_thread_all_realserver_disconnect_test(){
13056     BOOST_MESSAGE( "----- down_thread_all_realserver_disconnect test start -----" );
13057     
13058     boost::asio::io_service io;
13059     l7vs::virtualservice_tcp vs;
13060     l7vs::tcp_socket_option_info set_option;
13061     //! TCP_NODELAY   (false:not set,true:set option)
13062     set_option.nodelay_opt = false;
13063     //! TCP_NODELAY option value  (false:off,true:on)
13064     set_option.nodelay_val = false;
13065     //! TCP_CORK      (false:not set,true:set option)
13066     set_option.cork_opt = false;
13067     //! TCP_CORK option value     (false:off,true:on)
13068     set_option.cork_val = false;
13069     //! TCP_QUICKACK  (false:not set,true:set option)
13070     set_option.quickack_opt = false;
13071     //! TCP_QUICKACK option value (false:off,true:on)
13072     set_option.quickack_val = false;
13073     //
13074     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
13075     bool set_mode(false);
13076     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
13077     bool set_ssl_cache_flag(false);
13078     int set_ssl_handshake_time_out = 0;
13079     //std::string access_log_file_name = "test";
13080     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
13081
13082     std::string test_protocol_name("test protocol");
13083     l7vs::test_protocol_module proto_test(test_protocol_name);
13084 //    realserver_disconnect_test_class test_obj(vs,io);
13085     realserver_disconnect_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
13086     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
13087     boost::thread::id proc_id = boost::this_thread::get_id();
13088     
13089     l7vs::tcp_data& discon_data = test_obj.get_down_thread_data_dest_side();
13090     
13091     //down_thread_data_dest_side set
13092     boost::asio::ip::tcp::endpoint discon_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP),7001);
13093     discon_data.initialize();
13094     discon_data.set_endpoint(discon_end);
13095     // thread_id set
13096     test_obj.set_up_thread_id(boost::thread::id());
13097     test_obj.set_down_thread_id(proc_id);
13098     // vs set
13099     vs.connection_inactive_list.clear();
13100     // map set
13101     // set realserver socket
13102     std::list< std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > >& rs_list = test_obj.get_down_thread_receive_realserver_socket_list();
13103     std::list< std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > >::iterator rs_it;
13104     std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > push_pair;
13105     std::list< std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > > ref_rs_list;
13106     std::list< std::pair< boost::asio::ip::tcp::endpoint, boost::shared_ptr< l7vs::tcp_socket > > >::iterator ref_rs_it;
13107     for(int i = 0 ; i < 3 ;i++){
13108         boost::shared_ptr< l7vs::tcp_socket > new_socket(new l7vs::tcp_socket(io));
13109         push_pair.first.address(boost::asio::ip::address::from_string(DUMMY_SERVER_IP));
13110         push_pair.first.port(7000+i);
13111         push_pair.second = new_socket;
13112         new_socket->close_res = true;
13113         new_socket->close_out_ec.clear();
13114         new_socket->close_call_check = false;
13115         rs_list.push_back(push_pair);
13116         ref_rs_list.push_back(push_pair);
13117     }
13118     // message que
13119     l7vs::lockfree_queue<l7vs::tcp_thread_message>&    down_thread_message_que        = test_obj.get_down_thread_message_que();
13120     l7vs::lockfree_queue<l7vs::tcp_thread_message>&    up_thread_message_que        = test_obj.get_up_thread_message_que();
13121     while( !down_thread_message_que.empty() ){
13122         l7vs::tcp_thread_message*    tmp_ptr    = down_thread_message_que.pop();
13123         delete    tmp_ptr;
13124     }
13125     while( !up_thread_message_que.empty() ){
13126         l7vs::tcp_thread_message*    tmp_ptr    = up_thread_message_que.pop();
13127         delete    tmp_ptr;
13128     }
13129     
13130     //tcp_session set
13131     test_obj.set_down_thread_next_function_call_exit();
13132     test_obj.down_thread_client_disconnect_call_check = false;
13133     
13134     //protocol module set
13135     proto_test.handle_realserver_disconnect_res_tag = l7vs::protocol_module_base::CLIENT_DISCONNECT;
13136     proto_test.handle_realserver_disconnect_thread_id = boost::thread::id();
13137     proto_test.handle_realserver_disconnect_rs_endpoint_list.clear();
13138     
13139     test_obj.test_down_all_call();
13140     
13141     // unit_test [1] down_thread_all_realserver_disconnect socket close call check
13142     std::cerr << "[1] down_thread_all_realserver_disconnect socket close call check" << std::endl;
13143     ref_rs_it = ref_rs_list.begin();
13144     while(ref_rs_it != ref_rs_list.end()){
13145         BOOST_CHECK(ref_rs_it->second->close_call_check);
13146         ref_rs_it++;
13147     }
13148
13149     // unit_test [2] down_thread_all_realserver_disconnect virtualservice connection_inactive call check
13150     std::cerr << "[2] down_thread_all_realserver_disconnect virtualservice connection_inactive call check" << std::endl;
13151     BOOST_CHECK(!vs.connection_inactive_list.empty());
13152     ref_rs_it = ref_rs_list.begin();
13153     while(ref_rs_it != ref_rs_list.end()){
13154         std::list<boost::asio::ip::tcp::endpoint>::iterator end_list_it = vs.connection_inactive_list.begin();
13155         while(end_list_it == vs.connection_inactive_list.end()){
13156             if(ref_rs_it->first == *end_list_it)
13157                 break;
13158             end_list_it++;
13159         }
13160         BOOST_CHECK(end_list_it != vs.connection_inactive_list.end());
13161         ref_rs_it++;
13162     }
13163     
13164     // unit_test [3] down_thread_all_realserver_disconnect handle_realserver_disconnect call check
13165     std::cerr << "[3] down_thread_all_realserver_disconnect handle_realserver_disconnect call check" << std::endl;
13166     BOOST_CHECK(proto_test.handle_realserver_disconnect_thread_id == proc_id);
13167     BOOST_CHECK(!proto_test.handle_realserver_disconnect_rs_endpoint_list.empty());
13168     ref_rs_it = ref_rs_list.begin();
13169     while(ref_rs_it != ref_rs_list.end()){
13170         std::list<boost::asio::ip::tcp::endpoint>::iterator end_list_it = proto_test.handle_realserver_disconnect_rs_endpoint_list.begin();
13171         while(end_list_it == vs.connection_inactive_list.end()){
13172             if(ref_rs_it->first == *end_list_it)
13173                 break;
13174             end_list_it++;
13175         }
13176         BOOST_CHECK(end_list_it != proto_test.handle_realserver_disconnect_rs_endpoint_list.end());
13177         ref_rs_it++;
13178     }
13179     
13180     // unit_test [4] down_thread_all_realserver_disconnect update up_thread_next_call_function check
13181     std::cerr << "[4] down_thread_all_realserver_disconnect update up_thread_next_call_function check" << std::endl;
13182     test_obj.next_down_function_call();
13183     BOOST_CHECK(test_obj.down_thread_client_disconnect_call_check);
13184
13185     // unit_test [5] down_thread_all_realserver_disconnect realserver not fond check
13186     std::cerr << "[5] down_thread_all_realserver_disconnect realserver not fond check" << std::endl;
13187     proto_test.handle_realserver_disconnect_thread_id = boost::thread::id();
13188     proto_test.handle_realserver_disconnect_rs_endpoint_list.clear();
13189     test_obj.down_thread_client_disconnect_call_check = false;
13190
13191     test_obj.test_down_all_call();
13192
13193     BOOST_CHECK(proto_test.handle_realserver_disconnect_thread_id == proc_id);
13194     BOOST_CHECK(!proto_test.handle_realserver_disconnect_rs_endpoint_list.empty());
13195     BOOST_CHECK( *(proto_test.handle_realserver_disconnect_rs_endpoint_list.begin()) == boost::asio::ip::tcp::endpoint() );
13196     test_obj.next_down_function_call();
13197     BOOST_CHECK(test_obj.down_thread_client_disconnect_call_check);
13198     
13199     // unit_test [6] down_thread_all_realserver_disconnect handle_realserver_disconnect mutex lock check
13200     std::cerr << "[6] down_thread_all_realserver_disconnect handle_realserver_disconnect mutex lock check" << std::endl;
13201     ref_rs_it = ref_rs_list.begin();
13202     while(ref_rs_it != ref_rs_list.end()){
13203         rs_list.push_back(*ref_rs_it);
13204         ref_rs_it++;
13205     }
13206     proto_test.handle_realserver_disconnect_thread_id = boost::thread::id();
13207     test_obj.mutex_lock();
13208     boost::thread test_thread(boost::bind(&realserver_disconnect_test_class::test_down_all_call,&test_obj));
13209     sleep(1);
13210     BOOST_CHECK(proto_test.handle_realserver_disconnect_thread_id == boost::thread::id());
13211     
13212     // unit_test [7] down_thread_all_realserver_disconnect handle_realserver_disconnect mutex unlock run check
13213     std::cerr << "[7] down_thread_all_realserver_disconnect handle_realserver_disconnect mutex unlock run check" << std::endl;
13214     boost::thread::id test_id = test_thread.get_id();
13215     test_obj.set_down_thread_id(test_id);
13216     test_obj.mutex_unlock();
13217     sleep(1);
13218     BOOST_CHECK(proto_test.handle_realserver_disconnect_thread_id == test_id);
13219     test_thread.join();
13220     
13221     // unit_test [8] down_thread_all_realserver_disconnect not fond function error check
13222     std::cerr << "[8] down_thread_all_realserver_disconnect not fond function error check" << std::endl;
13223     ref_rs_it = ref_rs_list.begin();
13224     while(ref_rs_it != ref_rs_list.end()){
13225         rs_list.push_back(*ref_rs_it);
13226         ref_rs_it++;
13227     }
13228     test_obj.down_thread_function_array_clear();
13229     test_obj.down_thread_exit_call_check = false;
13230     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
13231     l7vs::Logger::putLogError_id = 0;
13232     test_obj.test_down_all_call();
13233     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
13234     BOOST_CHECK_EQUAL(77,l7vs::Logger::putLogError_id);
13235     std::cerr << l7vs::Logger::putLogError_message << std::endl;
13236     BOOST_CHECK(test_obj.down_thread_exit_call_check);
13237     
13238     // unit_test [9] down_thread_all_realserver_disconnect returnd illegal EVENT_TAG error check
13239     std::cerr << "[9] down_thread_all_realserver_disconnect returnd illegal EVENT_TAG error check" << std::endl;
13240     ref_rs_it = ref_rs_list.begin();
13241     while(ref_rs_it != ref_rs_list.end()){
13242         rs_list.push_back(*ref_rs_it);
13243         ref_rs_it++;
13244     }
13245     test_obj.down_thread_module_event_map_clear();
13246     test_obj.down_thread_exit_call_check = false;
13247     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
13248     l7vs::Logger::putLogError_id = 0;
13249     test_obj.test_down_all_call();
13250     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
13251     BOOST_CHECK_EQUAL(76,l7vs::Logger::putLogError_id);
13252     std::cerr << l7vs::Logger::putLogError_message << std::endl;
13253     BOOST_CHECK(test_obj.down_thread_exit_call_check);
13254     
13255     BOOST_MESSAGE( "----- down_thread_all_realserver_disconnect test end -----" );
13256 }
13257
13258
13259
13260
13261
13262
13263 // ssl_clear_keep_cache test class
13264 class ssl_clear_keep_cache_test_class : public l7vs::tcp_session{
13265     public:
13266        ssl_clear_keep_cache_test_class(
13267                                 l7vs::virtualservice_tcp& vs,
13268                                 boost::asio::io_service& session_io,
13269                                 l7vs::tcp_socket_option_info& set_socket_option,
13270                                 boost::asio::ip::tcp::endpoint listen_endpoint,
13271                                 bool ssl_mode,
13272                                 boost::asio::ssl::context& set_ssl_context,
13273                                 bool set_ssl_cache_flag,
13274                                 int set_ssl_handshake_time_out,
13275                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
13276                                                                                                    session_io,
13277                                                                                                    set_socket_option,
13278                                                                                                    listen_endpoint,
13279                                                                                                    ssl_mode,
13280                                                                                                    set_ssl_context,
13281                                                                                                    set_ssl_cache_flag,
13282                                                                                                    set_ssl_handshake_time_out,
13283                                                                                                    set_access_logger){};
13284
13285
13286         ~ssl_clear_keep_cache_test_class(){};
13287         bool& get_exit_flag(){
13288             return (bool&)exit_flag;
13289         };
13290
13291         bool test_call(SSL *clear_ssl){
13292             return ssl_clear_keep_cache(clear_ssl);
13293         };
13294 };
13295
13296 //ssl_clear_keep_cache_test test
13297 void ssl_clear_keep_cache_test(){
13298     BOOST_MESSAGE( "----- ssl_clear_keep_cache test start -----" );
13299
13300     boost::asio::io_service io;
13301     boost::system::error_code ec;
13302     authority test_auth;
13303
13304     // Client context
13305     boost::asio::ssl::context client_ctx(io,boost::asio::ssl::context::sslv23);
13306     client_ctx.set_verify_mode(boost::asio::ssl::context::verify_peer);
13307     client_ctx.load_verify_file(CLIENT_CTX_LOAD_VERIFY_FILE);
13308
13309     // Server context
13310     boost::asio::ssl::context server_ctx(io,boost::asio::ssl::context::sslv23);
13311     server_ctx.set_options(
13312         boost::asio::ssl::context::default_workarounds
13313         | boost::asio::ssl::context::no_sslv2
13314         | boost::asio::ssl::context::single_dh_use);
13315     server_ctx.set_password_callback(boost::bind(&authority::get_password, &test_auth));
13316     server_ctx.use_certificate_chain_file(SERVER_CTX_CERTIFICATE_CHAIN_FILE);
13317     server_ctx.use_private_key_file(SERVER_CTX_PRIVATE_KEY_FILE, boost::asio::ssl::context::pem);
13318     server_ctx.use_tmp_dh_file(SERVER_CTX_TMP_DH_FILE);
13319
13320     // Set session cache mode on the context.
13321     SSL_CTX_set_session_cache_mode(server_ctx.impl(), (SSL_SESS_CACHE_SERVER | SSL_SESS_CACHE_NO_AUTO_CLEAR));
13322     // Set session cache size on the context.
13323     SSL_CTX_sess_set_cache_size(server_ctx.impl(), 10);
13324     // Set session cache timeout on the context.
13325     SSL_CTX_set_timeout(server_ctx.impl(), 60);
13326
13327
13328     // test socket
13329     boost::asio::ssl::stream<boost::asio::ip::tcp::socket> test_sock(io,server_ctx);
13330
13331     // test acceptor
13332     boost::asio::ip::tcp::endpoint listen_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
13333     boost::asio::ip::tcp::acceptor test_acceptor(io,listen_end,ec);
13334
13335     // test client
13336     test_client dummy_cl(io,client_ctx);
13337     dummy_cl.all_lock();
13338
13339     // client start
13340     boost::thread cl_thread(boost::bind(&test_client::handshake_test_run,&dummy_cl));
13341
13342     // accept
13343     dummy_cl.connect_mutex.unlock();
13344     test_acceptor.accept(test_sock.lowest_layer(),ec);
13345     if(ec){
13346         std::cerr << "server side client connect ERROR" << std::endl;
13347         std::cerr << ec << std::endl;
13348     }else{
13349         std::cerr << "server side client connect OK" << std::endl;
13350     }
13351     BOOST_CHECK(!ec);
13352
13353     // handshake
13354     dummy_cl.handshake_mutex.unlock();
13355     test_sock.handshake(boost::asio::ssl::stream_base::server,ec);
13356     if(ec){
13357         std::cerr << "server side client handshake ERROR" << std::endl;
13358         std::cerr << ec << std::endl;
13359     }else{
13360         std::cerr << "server side handshake OK" << std::endl;
13361     }
13362     BOOST_CHECK(!ec);
13363
13364     BOOST_CHECK( SSL_CTX_sess_number(server_ctx.impl()) == 1);
13365
13366
13367     // close
13368     dummy_cl.close_mutex.unlock();
13369     cl_thread.join();
13370
13371     test_sock.lowest_layer().close();
13372
13373     BOOST_CHECK(test_sock.impl()->ssl->method != NULL);
13374     BOOST_CHECK(!test_sock.impl()->ssl->new_session);
13375 //    BOOST_CHECK(test_sock.impl()->ssl->init_buf != NULL);
13376     BOOST_CHECK(test_sock.impl()->ssl->enc_read_ctx != NULL);
13377     BOOST_CHECK(test_sock.impl()->ssl->enc_write_ctx != NULL);
13378 //    BOOST_CHECK(test_sock.impl()->ssl->expand != NULL);
13379 //    BOOST_CHECK(test_sock.impl()->ssl->compress != NULL);
13380
13381     test_sock.impl()->ssl->first_packet = 1;  //0
13382     test_sock.impl()->ssl->session = (SSL_SESSION*)99;      //NULL;
13383     test_sock.impl()->ssl->type = 2;          //0;
13384     test_sock.impl()->ssl->error = 3;         //0;
13385     test_sock.impl()->ssl->hit = 4;           //0;
13386     test_sock.impl()->ssl->shutdown = 5;      //0;
13387     test_sock.impl()->ssl->version = 6;       // clear_ssl->method->version;
13388     test_sock.impl()->ssl->client_version = 0;//clear_ssl->version;
13389     test_sock.impl()->ssl->rwstate = 0;       //SSL_NOTHING;
13390     test_sock.impl()->ssl->rstate = 0;  //SSL_ST_READ_HEADER;
13391     test_sock.impl()->ssl->state = 0; //SSL_ST_BEFORE | ( ( clear_ssl->server ) ? SSL_ST_ACCEPT : SSL_ST_CONNECT);
13392
13393  //   BOOST_CHECK( test_sock.impl()->ssl->in_handshake || ( test_sock.impl()->ssl->method == test_sock.impl()->ssl->ctx->method ));
13394    // if ( !clear_ssl->in_handshake && ( clear_ssl->method != clear_ssl->ctx->method )) 
13395
13396     l7vs::virtualservice_tcp vs;
13397     l7vs::tcp_socket_option_info set_option;
13398     //! TCP_NODELAY   (false:not set,true:set option)
13399     set_option.nodelay_opt = true;
13400     //! TCP_NODELAY option value  (false:off,true:on)
13401     set_option.nodelay_val = true;
13402     //! TCP_CORK      (false:not set,true:set option)
13403     set_option.cork_opt = true;
13404     //! TCP_CORK option value     (false:off,true:on)
13405     set_option.cork_val = true;
13406     //! TCP_QUICKACK  (false:not set,true:set option)
13407     set_option.quickack_opt = true;
13408     //! TCP_QUICKACK option value (false:off,true:on)
13409     set_option.quickack_val = true;
13410     //
13411     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
13412     bool set_mode(true);
13413     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
13414     bool set_ssl_cache_flag(true);
13415     int set_ssl_handshake_time_out = 111;
13416     std::string access_log_file_name = "test";
13417     l7vs::logger_implement_access* plogger = new l7vs::logger_implement_access(access_log_file_name);
13418     
13419     ssl_clear_keep_cache_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
13420
13421
13422     BOOST_CHECK( SSL_CTX_sess_number(server_ctx.impl()) == 1);
13423
13424     bool bres = test_obj.test_call(test_sock.impl()->ssl);
13425
13426     // unit_test [1] ssl_clear_keep_cache result check
13427     std::cerr << "[1] ssl_clear_keep_cache result check" << std::endl;
13428     BOOST_CHECK( bres == true);
13429
13430     // unit_test [2] ssl_clear_keep_cache keep chach check
13431     std::cerr << "[2] ssl_clear_keep_cache keep chach check" << std::endl;
13432     BOOST_CHECK( SSL_CTX_sess_number(server_ctx.impl()) == 1);
13433
13434
13435     // unit_test [3] ssl_clear_keep_cache init_buf initialize check
13436     std::cerr << "[3] ssl_clear_keep_cache init_buf initialize check" << std::endl;
13437     BOOST_CHECK(test_sock.impl()->ssl->init_buf == NULL);
13438     // unit_test [4] ssl_clear_keep_cache enc_read_ctx initialize check
13439     std::cerr << "[4] ssl_clear_keep_cache enc_read_ctx initialize check" << std::endl;
13440     BOOST_CHECK(test_sock.impl()->ssl->enc_read_ctx == NULL);
13441     // unit_test [5] ssl_clear_keep_cache enc_write_ctx initialize check
13442     std::cerr << "[5] ssl_clear_keep_cache enc_write_ctx initialize check" << std::endl;
13443     BOOST_CHECK(test_sock.impl()->ssl->enc_write_ctx == NULL);
13444     // unit_test [6] ssl_clear_keep_cache expand initialize check
13445     std::cerr << "[6] ssl_clear_keep_cache expand initialize check" << std::endl;
13446     BOOST_CHECK(test_sock.impl()->ssl->expand == NULL);
13447     // unit_test [7] ssl_clear_keep_cache compress initialize check
13448     std::cerr << "[7] ssl_clear_keep_cache compress initialize check" << std::endl;
13449     BOOST_CHECK(test_sock.impl()->ssl->compress == NULL);
13450
13451     // unit_test [8] ssl_clear_keep_cache first_packet initialize check
13452     std::cerr << "[8] ssl_clear_keep_cache first_packet initialize check" << std::endl;
13453     BOOST_CHECK(test_sock.impl()->ssl->first_packet == 0);                           //0
13454     // unit_test [9] ssl_clear_keep_cache session initialize check
13455     std::cerr << "[9] ssl_clear_keep_cache session initialize check" << std::endl;
13456     BOOST_CHECK(test_sock.impl()->ssl->session == NULL);                             //NULL;
13457     // unit_test [10] ssl_clear_keep_cache type initialize check
13458     std::cerr << "[10] ssl_clear_keep_cache type initialize check" << std::endl;
13459     BOOST_CHECK(test_sock.impl()->ssl->type == 0);                                   //0;
13460     // unit_test [11] ssl_clear_keep_cache error initialize check
13461     std::cerr << "[11] ssl_clear_keep_cache error initialize check" << std::endl;
13462     BOOST_CHECK(test_sock.impl()->ssl->error == 0);                                  //0;
13463     // unit_test [12] ssl_clear_keep_cache hit initialize check
13464     std::cerr << "[12] ssl_clear_keep_cache hit initialize check" << std::endl;
13465     BOOST_CHECK(test_sock.impl()->ssl->hit == 0);                                    //0;
13466     // unit_test [13] ssl_clear_keep_cache shutdown initialize check
13467     std::cerr << "[13] ssl_clear_keep_cache shutdown initialize check" << std::endl;
13468     BOOST_CHECK(test_sock.impl()->ssl->shutdown == 0);                               //0;
13469     // unit_test [14] ssl_clear_keep_cache version initialize check
13470     std::cerr << "[14] ssl_clear_keep_cache version initialize check" << std::endl;
13471     BOOST_CHECK(test_sock.impl()->ssl->version == test_sock.impl()->ssl->method->version);          // clear_ssl->method->version;
13472     // unit_test [15] ssl_clear_keep_cache client_version initialize check
13473     std::cerr << "[15] ssl_clear_keep_cache client_version initialize check" << std::endl;
13474     BOOST_CHECK(test_sock.impl()->ssl->client_version == test_sock.impl()->ssl->method->version);   // clear_ssl->version;
13475     // unit_test [16] ssl_clear_keep_cache rwstate initialize check
13476     std::cerr << "[16] ssl_clear_keep_cache rwstate initialize check" << std::endl;
13477     BOOST_CHECK(test_sock.impl()->ssl->rwstate == SSL_NOTHING);                      // SSL_NOTHING;
13478     // unit_test [17] ssl_clear_keep_cache rstate initialize check
13479     std::cerr << "[17] ssl_clear_keep_cache rstate initialize check" << std::endl;
13480     BOOST_CHECK(test_sock.impl()->ssl->rstate == SSL_ST_READ_HEADER);  // SSL_ST_READ_HEADER;
13481     // unit_test [18] ssl_clear_keep_cache state initialize check
13482     std::cerr << "[18] ssl_clear_keep_cache state initialize check" << std::endl;
13483     BOOST_CHECK(test_sock.impl()->ssl->state == (SSL_ST_BEFORE | SSL_ST_ACCEPT));      // SSL_ST_BEFORE | ( ( clear_ssl->server ) ? SSL_ST_ACCEPT : SSL_ST_CONNECT);
13484
13485
13486     // accepter close
13487     test_acceptor.close();
13488
13489     BOOST_MESSAGE( "----- ssl_clear_keep_cache test end -----" );
13490 }
13491
13492 // initialize_ssl_mode test
13493 // initialize_ssl_mode test class
13494 class initialize_ssl_mode_test_class : public l7vs::tcp_session{
13495     public:
13496        initialize_ssl_mode_test_class(
13497                                 l7vs::virtualservice_tcp& vs,
13498                                 boost::asio::io_service& session_io,
13499                                 l7vs::tcp_socket_option_info& set_socket_option,
13500                                 boost::asio::ip::tcp::endpoint listen_endpoint,
13501                                 bool ssl_mode,
13502                                 boost::asio::ssl::context& set_ssl_context,
13503                                 bool set_ssl_cache_flag,
13504                                 int set_ssl_handshake_time_out,
13505                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
13506                                                                                                    session_io,
13507                                                                                                    set_socket_option,
13508                                                                                                    listen_endpoint,
13509                                                                                                    ssl_mode,
13510                                                                                                    set_ssl_context,
13511                                                                                                    set_ssl_cache_flag,
13512                                                                                                    set_ssl_handshake_time_out,
13513                                                                                                    set_access_logger){};
13514         ~initialize_ssl_mode_test_class(){};
13515         
13516         bool ssl_clear_keep_cache(SSL *clear_ssl){
13517             ssl_clear_keep_cache_call_chk = true;
13518             ssl_clear_keep_cache_set_clear_ssl = clear_ssl;
13519             return ssl_clear_keep_cache_res;
13520         }
13521         bool ssl_clear_keep_cache_call_chk;
13522         SSL* ssl_clear_keep_cache_set_clear_ssl;
13523         bool ssl_clear_keep_cache_res;
13524
13525
13526 };
13527 void initialize_ssl_mode_test(){
13528     BOOST_MESSAGE( "----- initialize_ssl_mode test start -----" );
13529     
13530     boost::asio::io_service io;
13531     boost::system::error_code ec;
13532
13533     //vs set protocol module
13534     l7vs::virtualservice_tcp vs;
13535     std::string test_protocol_name("test protocol");
13536     l7vs::test_protocol_module proto_test(test_protocol_name);
13537     vs.get_protocol_module_res = &proto_test;
13538
13539     // socket option
13540     l7vs::tcp_socket_option_info set_option;
13541     //! TCP_NODELAY   (false:not set,true:set option)
13542     set_option.nodelay_opt = false;
13543     //! TCP_NODELAY option value  (false:off,true:on)
13544     set_option.nodelay_val = false;
13545     //! TCP_CORK      (false:not set,true:set option)
13546     set_option.cork_opt = false;
13547     //! TCP_CORK option value     (false:off,true:on)
13548     set_option.cork_val = false;
13549     //! TCP_QUICKACK  (false:not set,true:set option)
13550     set_option.quickack_opt = false;
13551     //! TCP_QUICKACK option value (false:off,true:on)
13552     set_option.quickack_val = false;
13553
13554     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
13555     bool set_mode(true);
13556     int set_ssl_handshake_time_out = 0;
13557     //std::string access_log_file_name = "test";
13558     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
13559
13560     //tset case 1 ssl_cache_flag on 
13561     boost::asio::ssl::context set_context1(io,boost::asio::ssl::context::sslv23);
13562     bool set_ssl_cache_flag1(true);
13563     initialize_ssl_mode_test_class test_obj1(vs,io,set_option,listen_endpoint,set_mode,set_context1,set_ssl_cache_flag1,set_ssl_handshake_time_out,plogger);
13564
13565     // ssl_clear_keep_cache call OK
13566     test_obj1.ssl_clear_keep_cache_call_chk = false;
13567     test_obj1.ssl_clear_keep_cache_set_clear_ssl = NULL;
13568     test_obj1.ssl_clear_keep_cache_res = true;
13569
13570     // test call
13571     l7vs::session_result_message msg = test_obj1.initialize();
13572
13573     // unit_test [1] initialize ssl_clear_keep_cache call check
13574     std::cerr << "[1] initialize ssl_clear_keep_cache call check" << std::endl;
13575     BOOST_CHECK(test_obj1.ssl_clear_keep_cache_call_chk);
13576     BOOST_CHECK(test_obj1.ssl_clear_keep_cache_set_clear_ssl == test_obj1.get_client_ssl_socket().impl()->ssl);
13577     BOOST_CHECK(msg.flag == false);
13578
13579
13580     // ssl_clear_keep_cache call NG
13581     test_obj1.ssl_clear_keep_cache_call_chk = false;
13582     test_obj1.ssl_clear_keep_cache_set_clear_ssl = NULL;
13583     test_obj1.ssl_clear_keep_cache_res = false;
13584
13585     // test call
13586     msg = test_obj1.initialize();
13587
13588     // unit_test [2] initialize ssl_clear_keep_cache call check Error case
13589     std::cerr << "[2] initialize ssl_clear_keep_cache call check Error case" << std::endl;
13590     BOOST_CHECK(test_obj1.ssl_clear_keep_cache_call_chk);
13591     BOOST_CHECK(test_obj1.ssl_clear_keep_cache_set_clear_ssl == test_obj1.get_client_ssl_socket().impl()->ssl);
13592     BOOST_CHECK(msg.flag == true);
13593
13594
13595     //tset case 2 ssl_cache_flag off 
13596     boost::asio::ssl::context set_context2(io,boost::asio::ssl::context::sslv23);
13597     bool set_ssl_cache_flag2(false);
13598     initialize_ssl_mode_test_class test_obj2(vs,io,set_option,listen_endpoint,set_mode,set_context2,set_ssl_cache_flag2,set_ssl_handshake_time_out,plogger);
13599
13600     SSL_METHOD* pRet = const_cast<SSL_METHOD*>(test_obj2.get_client_ssl_socket().impl()->ssl->method);
13601     test_obj2.get_client_ssl_socket().impl()->ssl->method = NULL;
13602
13603
13604     // test call
13605     msg = test_obj2.initialize();
13606
13607     // unit_test [3] initialize SSL_clear Error case
13608     std::cerr << "[3] initialize SSL_clear Error case" << std::endl;
13609     BOOST_CHECK(msg.flag == true);
13610
13611     test_obj2.get_client_ssl_socket().impl()->ssl->method = pRet;
13612
13613     // Client context
13614     boost::asio::ssl::context client_ctx(io,boost::asio::ssl::context::sslv23);
13615     client_ctx.set_verify_mode(boost::asio::ssl::context::verify_peer);
13616     client_ctx.load_verify_file(CLIENT_CTX_LOAD_VERIFY_FILE);
13617
13618     // Server context
13619     authority test_auth;
13620     boost::asio::ssl::context server_ctx(io,boost::asio::ssl::context::sslv23);
13621     server_ctx.set_options(
13622         boost::asio::ssl::context::default_workarounds
13623         | boost::asio::ssl::context::no_sslv2
13624         | boost::asio::ssl::context::single_dh_use);
13625     server_ctx.set_password_callback(boost::bind(&authority::get_password, &test_auth));
13626     server_ctx.use_certificate_chain_file(SERVER_CTX_CERTIFICATE_CHAIN_FILE);
13627     server_ctx.use_private_key_file(SERVER_CTX_PRIVATE_KEY_FILE, boost::asio::ssl::context::pem);
13628     server_ctx.use_tmp_dh_file(SERVER_CTX_TMP_DH_FILE);
13629
13630     // Set session cache mode on the context.
13631     SSL_CTX_set_session_cache_mode(server_ctx.impl(), (SSL_SESS_CACHE_SERVER | SSL_SESS_CACHE_NO_AUTO_CLEAR));
13632     // Set session cache size on the context.
13633     SSL_CTX_sess_set_cache_size(server_ctx.impl(), 10);
13634     // Set session cache timeout on the context.
13635     SSL_CTX_set_timeout(server_ctx.impl(), 60);
13636
13637     // test object
13638     bool set_ssl_cache_flag3(false);
13639     initialize_ssl_mode_test_class test_obj3(vs,io,set_option,listen_endpoint,set_mode,server_ctx,set_ssl_cache_flag3,set_ssl_handshake_time_out,plogger);
13640
13641
13642     // test acceptor
13643     boost::asio::ip::tcp::endpoint listen_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
13644     boost::asio::ip::tcp::acceptor test_acceptor(io,listen_end,ec);
13645
13646     // test client
13647     test_client dummy_cl(io,client_ctx);
13648     dummy_cl.all_lock();
13649
13650     // client start
13651     boost::thread cl_thread(boost::bind(&test_client::handshake_test_run,&dummy_cl));
13652
13653     // accept
13654     dummy_cl.connect_mutex.unlock();
13655     test_acceptor.accept(test_obj3.get_client_ssl_socket().lowest_layer(),ec);
13656     if(ec){
13657         std::cerr << "server side client connect ERROR" << std::endl;
13658         std::cerr << ec << std::endl;
13659     }else{
13660         std::cerr << "server side client connect OK" << std::endl;
13661     }
13662     BOOST_CHECK(!ec);
13663
13664     // handshake
13665     dummy_cl.handshake_mutex.unlock();
13666     test_obj3.get_client_ssl_socket().handshake(boost::asio::ssl::stream_base::server,ec);
13667     if(ec){
13668         std::cerr << "server side client handshake ERROR" << std::endl;
13669         std::cerr << ec << std::endl;
13670     }else{
13671         std::cerr << "server side handshake OK" << std::endl;
13672     }
13673     BOOST_CHECK(!ec);
13674
13675     // close
13676     dummy_cl.close_mutex.unlock();
13677     cl_thread.join();
13678
13679     test_obj3.get_client_ssl_socket().lowest_layer().close();
13680
13681     BOOST_CHECK( SSL_CTX_sess_number(server_ctx.impl()) == 1);
13682
13683     // test call
13684     msg = test_obj3.initialize();
13685
13686     // unit_test [4] initialize SSL_clear call check
13687     std::cerr << "[4] initialize SSL_clear call check" << std::endl;
13688
13689     BOOST_CHECK(msg.flag == false);
13690     BOOST_CHECK( SSL_CTX_sess_number(server_ctx.impl()) == 0);
13691
13692     BOOST_MESSAGE( "----- initialize_ssl_mode test end -----" );
13693 }
13694
13695 // up_thread_client_accept test
13696 // up_thread_client_accept test class
13697 class up_thread_client_accept_test_class : public l7vs::tcp_session{
13698     public:
13699        up_thread_client_accept_test_class(
13700                                 l7vs::virtualservice_tcp& vs,
13701                                 boost::asio::io_service& session_io,
13702                                 l7vs::tcp_socket_option_info& set_socket_option,
13703                                 boost::asio::ip::tcp::endpoint listen_endpoint,
13704                                 bool ssl_mode,
13705                                 boost::asio::ssl::context& set_ssl_context,
13706                                 bool set_ssl_cache_flag,
13707                                 int set_ssl_handshake_time_out,
13708                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
13709                                                                                                    session_io,
13710                                                                                                    set_socket_option,
13711                                                                                                    listen_endpoint,
13712                                                                                                    ssl_mode,
13713                                                                                                    set_ssl_context,
13714                                                                                                    set_ssl_cache_flag,
13715                                                                                                    set_ssl_handshake_time_out,
13716                                                                                                    set_access_logger){};
13717         ~up_thread_client_accept_test_class(){};
13718
13719         void test_call(){
13720             up_thread_client_accept(LOCAL_PROC);
13721         }
13722
13723         void handle_ssl_handshake_timer(const boost::system::error_code&){
13724             handle_ssl_handshake_timer_call_chk = true;
13725         };
13726
13727         bool handle_ssl_handshake_timer_call_chk;
13728
13729         up_thread_function_pair& get_up_thread_next_call_function(){
13730             return up_thread_next_call_function;
13731         };
13732         
13733         bool& get_ssl_flag(){
13734             return ssl_flag;
13735         };
13736
13737         bool& get_ssl_handshake_timer_flag(){
13738             return ssl_handshake_timer_flag;
13739         };
13740
13741         int& get_ssl_handshake_time_out(){
13742             return ssl_handshake_time_out;
13743         };
13744
13745         bool& get_ssl_handshake_time_out_flag(){
13746             return ssl_handshake_time_out_flag;
13747         };
13748
13749         bool next_func_chk_accept_event(){
13750             return up_thread_next_call_function.first == UP_FUNC_CLIENT_ACCEPT_EVENT;
13751         };
13752         bool next_func_chk_accept(){
13753             return up_thread_next_call_function.first == UP_FUNC_CLIENT_ACCEPT;
13754         };
13755         bool next_func_chk_client_disconnect(){
13756             return up_thread_next_call_function.first == UP_FUNC_CLIENT_DISCONNECT;
13757         };
13758
13759         l7vs::tcp_ssl_socket& get_tcp_client_ssl_socket(){
13760             return client_ssl_socket;
13761         };
13762
13763 };
13764 void up_thread_client_accept_test(){
13765     BOOST_MESSAGE( "----- up_thread_client_accept test start -----" );
13766
13767     l7vs::virtualservice_tcp vs;
13768     boost::asio::io_service io;
13769     l7vs::tcp_socket_option_info set_option;
13770     //! TCP_NODELAY   (false:not set,true:set option)
13771     set_option.nodelay_opt = false;
13772     //! TCP_NODELAY option value  (false:off,true:on)
13773     set_option.nodelay_val = false;
13774     //! TCP_CORK      (false:not set,true:set option)
13775     set_option.cork_opt = false;
13776     //! TCP_CORK option value     (false:off,true:on)
13777     set_option.cork_val = false;
13778     //! TCP_QUICKACK  (false:not set,true:set option)
13779     set_option.quickack_opt = false;
13780     //! TCP_QUICKACK option value (false:off,true:on)
13781     set_option.quickack_val = false;
13782
13783     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
13784     bool set_mode(false);
13785     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
13786     bool set_ssl_cache_flag(false);
13787     int set_ssl_handshake_time_out = 0;
13788     //std::string access_log_file_name = "test";
13789     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
13790
13791     up_thread_client_accept_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
13792
13793     // test case 1 not ssl mode
13794     test_obj.test_call();
13795
13796     // unit_test [1] up_thread_client_accept no ssl mode next func check
13797     std::cerr << "[1] up_thread_client_accept no ssl mode next func check" << std::endl;
13798     BOOST_CHECK( test_obj.next_func_chk_accept_event() );
13799
13800     // tset case 2 ssl mode and handshaek time out
13801     test_obj.get_ssl_flag() = true;                     //SSL mode
13802     test_obj.get_ssl_handshake_time_out_flag() = true;    //handshake time out
13803
13804     test_obj.test_call();
13805
13806     // unit_test [2] up_thread_client_accept ssl mode time out case next func check
13807     std::cerr << "[2] up_thread_client_accept ssl mode time out case next func check" << std::endl;
13808     BOOST_CHECK( test_obj.next_func_chk_client_disconnect() );
13809
13810
13811     // tset case 3 ssl mode and set timer snd handshake try_again error case check
13812     test_obj.get_ssl_flag() = true;                      //SSL mode
13813     test_obj.get_ssl_handshake_time_out_flag() = false;  //handshake time out
13814     test_obj.get_ssl_handshake_timer_flag() = false;     //timer not set
13815     test_obj.get_ssl_handshake_time_out() = 3;          //timer set second
13816     test_obj.handle_ssl_handshake_timer_call_chk = false;
13817     test_obj.get_tcp_client_ssl_socket().handshake_call_check = false;
13818     test_obj.get_tcp_client_ssl_socket().handshake_res = false;
13819     test_obj.get_tcp_client_ssl_socket().handshake_set_ec = boost::asio::error::try_again;
13820
13821     test_obj.test_call();
13822     
13823     // timer thread start
13824     boost::thread timer_thread(boost::bind(&boost::asio::io_service::run,&io));
13825
13826     // unit_test [3] up_thread_client_accept set timer check
13827     std::cerr << "[3] up_thread_client_accept set timer check" << std::endl;
13828     BOOST_CHECK( test_obj.get_ssl_handshake_timer_flag() == true);
13829     // after 1 second
13830     sleep(1);
13831     std::cerr << "1 sec" << std::endl;
13832     BOOST_CHECK( test_obj.handle_ssl_handshake_timer_call_chk == false );
13833     // after 2 second
13834     sleep(1);
13835     std::cerr << "2 sec" << std::endl;
13836     BOOST_CHECK( test_obj.handle_ssl_handshake_timer_call_chk == false );
13837     // after 3 second
13838     sleep(1);
13839     std::cerr << "3 sec" << std::endl;
13840     BOOST_CHECK( test_obj.handle_ssl_handshake_timer_call_chk == true );
13841
13842     timer_thread.join();
13843
13844     // unit_test [4] up_thread_client_accept socket handshake call check
13845     std::cerr << "[4] up_thread_client_accept socket handshake call check" << std::endl;
13846     BOOST_CHECK( test_obj.get_tcp_client_ssl_socket().handshake_call_check == true );
13847
13848     // unit_test [5] up_thread_client_accept socket handshake try_again error next func check
13849     std::cerr << "[5] up_thread_client_accept socket handshake try_again error next func check" << std::endl;
13850     BOOST_CHECK( test_obj.next_func_chk_accept() );
13851
13852
13853     // tset case 4 ssl mode and handshake ok case check
13854     test_obj.get_ssl_flag() = true;                      //SSL mode
13855     test_obj.get_ssl_handshake_time_out_flag() = false;  //handshake time out
13856     test_obj.get_ssl_handshake_timer_flag() = true;     //timer not set
13857     test_obj.get_ssl_handshake_time_out() = 3;          //timer set second
13858     test_obj.handle_ssl_handshake_timer_call_chk = false;
13859     test_obj.get_tcp_client_ssl_socket().handshake_call_check = false;
13860     test_obj.get_tcp_client_ssl_socket().handshake_res = true;
13861     test_obj.get_tcp_client_ssl_socket().handshake_set_ec.clear();
13862
13863
13864     test_obj.test_call();
13865
13866     // unit_test [6] up_thread_client_accept socket handshake no error next func check
13867     std::cerr << "[6] up_thread_client_accept socket handshake no error next func check" << std::endl;
13868     BOOST_CHECK( test_obj.next_func_chk_accept_event() );
13869
13870
13871     // tset case 5 ssl mode and handshake error case check
13872     test_obj.get_ssl_flag() = true;                      //SSL mode
13873     test_obj.get_ssl_handshake_time_out_flag() = false;  //handshake time out
13874     test_obj.get_ssl_handshake_timer_flag() = true;     //timer not set
13875     test_obj.get_ssl_handshake_time_out() = 3;          //timer set second
13876     test_obj.handle_ssl_handshake_timer_call_chk = false;
13877     test_obj.get_tcp_client_ssl_socket().handshake_call_check = false;
13878     test_obj.get_tcp_client_ssl_socket().handshake_res = false;
13879     test_obj.get_tcp_client_ssl_socket().handshake_set_ec =  boost::asio::error::eof;
13880
13881     test_obj.test_call();
13882
13883     // unit_test [7] up_thread_client_accept socket handshake no error next func check
13884     std::cerr << "[7] up_thread_client_accept socket handshake no error next func check" << std::endl;
13885     BOOST_CHECK( test_obj.next_func_chk_client_disconnect() );
13886
13887     BOOST_MESSAGE( "----- up_thread_client_accept test end -----" );
13888 }
13889
13890 // up_thread_run ssl mode
13891 // up_thread_run ssl mode test class
13892 class up_thread_run_ssl_mode_test_class : public l7vs::tcp_session{
13893     public:
13894        up_thread_run_ssl_mode_test_class(
13895                                 l7vs::virtualservice_tcp& vs,
13896                                 boost::asio::io_service& session_io,
13897                                 l7vs::tcp_socket_option_info& set_socket_option,
13898                                 boost::asio::ip::tcp::endpoint listen_endpoint,
13899                                 bool ssl_mode,
13900                                 boost::asio::ssl::context& set_ssl_context,
13901                                 bool set_ssl_cache_flag,
13902                                 int set_ssl_handshake_time_out,
13903                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
13904                                                                                                    session_io,
13905                                                                                                    set_socket_option,
13906                                                                                                    listen_endpoint,
13907                                                                                                    ssl_mode,
13908                                                                                                    set_ssl_context,
13909                                                                                                    set_ssl_cache_flag,
13910                                                                                                    set_ssl_handshake_time_out,
13911                                                                                                    set_access_logger){
13912             test_end = false;
13913             test_wait = true;
13914         };
13915         ~up_thread_run_ssl_mode_test_class(){};
13916         bool& get_exit_flag(){
13917             return (bool&)exit_flag;
13918         };
13919         
13920 /*
13921         bool& get_session_pause_flag(){
13922             return session_pause_flag;
13923         };
13924 */
13925         
13926 /*
13927         std::bitset<TCP_SESSION_THREAD_STATE_BIT>& get_thread_state(){
13928             return thread_state;
13929         };
13930 */
13931         
13932         boost::mutex test_thread_wait;
13933         void test_run(){
13934             boost::mutex::scoped_lock scope_lock(test_thread_wait);
13935             while(!test_end){
13936                 std::cerr << "up_thread_run test call" << std::endl;
13937                 test_wait = true;
13938                 up_thread_run();
13939                 while(test_wait){};
13940             }
13941         };
13942         bool test_end;
13943         bool test_wait;
13944                 
13945         void set_protocol_module(l7vs::protocol_module_base* set_proto){
13946             protocol_module = set_proto;
13947         };
13948
13949         boost::asio::ssl::stream<boost::asio::ip::tcp::socket>& get_client_socket(){
13950             return client_ssl_socket.get_socket();
13951         };
13952
13953         
13954         boost::thread::id& get_up_thread_id(){
13955             return up_thread_id;
13956         };
13957         
13958         boost::thread::id& get_down_thread_id(){
13959             return down_thread_id;
13960         };
13961         
13962         void up_thread_exit(const TCP_PROCESS_TYPE_TAG process_type){
13963             up_thread_exit_process_type = process_type;
13964             l7vs::tcp_session::up_thread_exit(process_type);
13965             up_thread_exit_call_check = true;
13966         };
13967         TCP_PROCESS_TYPE_TAG up_thread_exit_process_type;
13968         bool up_thread_exit_call_check;
13969         
13970         void up_thread_all_socket_close(void){
13971             up_thread_all_socket_close_call_check = true;
13972         };
13973         bool up_thread_all_socket_close_call_check;
13974         
13975         void test_message_set(boost::asio::ip::tcp::endpoint set_endpoint){
13976             l7vs::tcp_thread_message*    chk_msg    = new l7vs::tcp_thread_message;
13977             up_thread_message_que.push(chk_msg);
13978             chk_msg->endpoint_info = set_endpoint;
13979             up_thread_function_pair func = up_thread_function_array[UP_FUNC_EXIT];
13980             chk_msg->message = func.second;
13981         };
13982         
13983         l7vs::tcp_data& get_up_thread_message_data(){
13984             return up_thread_message_data;
13985         };
13986         
13987         void clear_function_array(){
13988             for(int i = 0;i <= UP_FUNC_EXIT;i++){
13989                 up_thread_function_array[i].second = NULL;
13990             }
13991         };
13992         void clear_event_map(){
13993             up_thread_module_event_map.clear();
13994         };
13995         
13996         void set_up_thread_next_call_function_client_disconnect(){
13997             up_thread_next_call_function = up_thread_function_array[UP_FUNC_CLIENT_DISCONNECT];
13998         };
13999         void set_up_thread_next_call_function_exit(){
14000             up_thread_next_call_function = up_thread_function_array[UP_FUNC_EXIT];
14001         };
14002         
14003 };
14004 void up_thread_run_ssl_mode_test(){
14005     
14006     BOOST_MESSAGE( "----- up_thread_run ssl mode test start -----" );
14007  
14008     boost::asio::io_service io;
14009     l7vs::virtualservice_tcp vs;
14010     l7vs::tcp_socket_option_info set_option;
14011     //! TCP_NODELAY   (false:not set,true:set option)
14012     set_option.nodelay_opt = false;
14013     //! TCP_NODELAY option value  (false:off,true:on)
14014     set_option.nodelay_val = false;
14015     //! TCP_CORK      (false:not set,true:set option)
14016     set_option.cork_opt = false;
14017     //! TCP_CORK option value     (false:off,true:on)
14018     set_option.cork_val = false;
14019     //! TCP_QUICKACK  (false:not set,true:set option)
14020     set_option.quickack_opt = false;
14021     //! TCP_QUICKACK option value (false:off,true:on)
14022     set_option.quickack_val = false;
14023     //
14024     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
14025     bool set_mode(true);
14026     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
14027     bool set_ssl_cache_flag(false);
14028     int set_ssl_handshake_time_out = 0;
14029     //std::string access_log_file_name = "test";
14030     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
14031
14032     boost::system::error_code ec;
14033  
14034     std::string test_protocol_name("test protocol");
14035     l7vs::test_protocol_module proto_test(test_protocol_name);
14036
14037     up_thread_run_ssl_mode_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
14038
14039     test_obj.set_protocol_module((l7vs::protocol_module_base*)&proto_test);
14040     bool& exit_flag = test_obj.get_exit_flag();
14041 //    bool& session_pause_flag = test_obj.get_session_pause_flag();
14042     boost::thread::id& up_thread_id = test_obj.get_up_thread_id();
14043     boost::thread::id& down_thread_id = test_obj.get_down_thread_id();
14044
14045     
14046 //    std::bitset<TCP_SESSION_THREAD_STATE_BIT>& thread_state = test_obj.get_thread_state();
14047     boost::asio::ssl::stream<boost::asio::ip::tcp::socket>& client_socket = test_obj.get_client_socket();
14048     
14049     test_mirror_server test_server;
14050     // accept req
14051     test_server.breq_acc_flag = true;
14052     // close wait req
14053     test_server.breq_close_wait_flag = true;
14054     // recv cont
14055     test_server.req_recv_cnt = 0;
14056     // test server start
14057     boost::thread server_thread(boost::bind(&test_mirror_server::run,&test_server));
14058     while( !test_server.brun_flag ){
14059         sleep(1);
14060     }
14061     
14062     boost::asio::ip::tcp::endpoint connect_end(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
14063     client_socket.lowest_layer().connect(connect_end,ec);
14064     BOOST_CHECK(!ec);
14065     while(!test_server.bconnect_flag){
14066         sleep(1);
14067     }
14068
14069     test_obj.test_thread_wait.lock();
14070 /*
14071     thread_state[0] = 0;    // UP_THREAD_ALIVE
14072     thread_state[1] = 0;    // DOWN_THREAD_ALIVE
14073     thread_state[2] = 0;    // UP_THREAD_ACTIVE
14074     thread_state[3] = 0;    // DOWN_THREAD_ACTIVE
14075     thread_state[4] = 0;    // UP_THREAD_LOCK
14076     thread_state[5] = 0;    // DOWN_THREAD_LOCK
14077 */
14078     up_thread_id = boost::thread::id();
14079     boost::thread test_thread(boost::bind(&up_thread_run_ssl_mode_test_class::test_run,&test_obj));
14080     sleep(1);
14081     boost::thread::id test_id = test_thread.get_id();
14082     boost::thread::id proc_id = boost::this_thread::get_id();
14083     
14084 /*
14085     BOOST_CHECK(!thread_state.test(0));    // UP_THREAD_ALIVE
14086     BOOST_CHECK(!thread_state.test(1)); // DOWN_THREAD_ALIVE
14087     BOOST_CHECK(!thread_state.test(2)); // UP_THREAD_ACTIVE
14088     BOOST_CHECK(!thread_state.test(3)); // DOWN_THREAD_ACTIVE
14089     BOOST_CHECK(!thread_state.test(4)); // UP_THREAD_LOCK
14090     BOOST_CHECK(!thread_state.test(5)); // DOWN_THREAD_LOCK
14091 */
14092     BOOST_CHECK(up_thread_id != test_id);
14093     test_obj.test_thread_wait.unlock();
14094     sleep(1);
14095    
14096     // unit_test [1] up_thread_run ssl mode test thread id update check
14097     std::cerr << "[1] up_thread_run ssl mode test thread id update check" << std::endl;
14098     BOOST_CHECK(up_thread_id == test_id);
14099     
14100     // unit_test [2] up_thread_run ssl mode test down thread wait check
14101     std::cerr << "[2] up_thread_run ssl mode test down thread wait check" << std::endl;
14102 /*
14103     BOOST_CHECK(thread_state.test(0));    // UP_THREAD_ALIVE
14104     BOOST_CHECK(!thread_state.test(1)); // DOWN_THREAD_ALIVE
14105     BOOST_CHECK(!thread_state.test(2)); // UP_THREAD_ACTIVE
14106     BOOST_CHECK(!thread_state.test(3)); // DOWN_THREAD_ACTIVE
14107     BOOST_CHECK(!thread_state.test(4)); // UP_THREAD_LOCK
14108     BOOST_CHECK(!thread_state.test(5)); // DOWN_THREAD_LOCK
14109 */
14110     
14111     proto_test.handle_session_initialize_res_tag = l7vs::protocol_module_base::FINALIZE;
14112     proto_test.handle_session_initialize_in_up_thread_id = boost::thread::id();
14113     proto_test.handle_session_initialize_in_down_thread_id = boost::thread::id();
14114     proto_test.handle_session_initialize_in_client_endpoint_tcp = boost::asio::ip::tcp::endpoint();
14115     proto_test.handle_session_initialize_in_client_endpoint_udp.address(boost::asio::ip::address::from_string("255.255.255.255"));
14116     proto_test.handle_session_initialize_in_client_endpoint_udp.port(65535);
14117     BOOST_CHECK(proto_test.handle_session_initialize_in_up_thread_id != test_id);
14118     BOOST_CHECK(proto_test.handle_session_initialize_in_down_thread_id != proc_id);
14119     BOOST_CHECK(proto_test.handle_session_initialize_in_client_endpoint_tcp != connect_end);
14120     BOOST_CHECK(proto_test.handle_session_initialize_in_client_endpoint_udp != boost::asio::ip::udp::endpoint());
14121     down_thread_id = proc_id;
14122 //    session_pause_flag = true;
14123     
14124     // DOWN_THREAD_ALIVE
14125 //    thread_state[1] = 1;
14126     sleep(1);
14127     
14128     // unit_test [3] up_thread_run ssl mode test handle_session_initialize call check
14129     std::cerr << "[3] up_thread_run ssl mode test handle_session_initialize call check" << std::endl;
14130     BOOST_CHECK(proto_test.handle_session_initialize_in_up_thread_id == test_id);
14131     BOOST_CHECK(proto_test.handle_session_initialize_in_down_thread_id == proc_id);
14132     BOOST_CHECK(proto_test.handle_session_initialize_in_client_endpoint_tcp == connect_end);
14133     BOOST_CHECK(proto_test.handle_session_initialize_in_client_endpoint_udp == boost::asio::ip::udp::endpoint());
14134     
14135     // unit_test [4] up_thread_run ssl mode test state update(UP_THREAD_ACTIVE) check
14136     std::cerr << "[4] up_thread_run ssl mode test state update(UP_THREAD_ACTIVE) check" << std::endl;
14137 //    BOOST_CHECK(thread_state.test(2)); // UP_THREAD_ACTIVE
14138     
14139     // unit_test [5] up_thread_run ssl mode test pause check
14140     std::cerr << "[5] up_thread_run ssl mode test  pause check" << std::endl;
14141 //    BOOST_CHECK(thread_state.test(4)); // UP_THREAD_LOCK
14142     
14143     test_obj.up_thread_exit_process_type = l7vs::tcp_session::MESSAGE_PROC;
14144     test_obj.up_thread_exit_call_check = false;
14145     test_obj.up_thread_all_socket_close_call_check = false;
14146     
14147 //    session_pause_flag = false;
14148     sleep(1);
14149     
14150     // unit_test [6] up_thread_run ssl mode test restart check
14151     std::cerr << "[6] up_thread_run ssl mode test  restart check" << std::endl;
14152 //    BOOST_CHECK(!thread_state.test(4)); // UP_THREAD_LOCK
14153     
14154     // unit_test [7] up_thread_run ssl mode test up_thread_next_call_function call (up_thread_exit) check
14155     std::cerr << "[7] up_thread_run ssl mode test up_thread_next_call_function call (up_thread_exit) check" << std::endl;
14156     BOOST_CHECK(test_obj.up_thread_exit_call_check);
14157     BOOST_CHECK(test_obj.up_thread_exit_process_type == l7vs::tcp_session::LOCAL_PROC);
14158     
14159     // unit_test [8] up_thread_run ssl mode test main loop exit check
14160     std::cerr << "[8] up_thread_run ssl mode test main loop exit check" << std::endl;
14161     BOOST_CHECK(exit_flag);
14162 //    BOOST_CHECK(!thread_state.test(2)); // UP_THREAD_ACTIVE
14163     
14164     
14165     // unit_test [9] up_thread_run ssl mode test up_thread_all_socket_close_call_check call check
14166     std::cerr << "[9] up_thread_run ssl mode test up_thread_all_socket_close_call_check call check" << std::endl;
14167     BOOST_CHECK(test_obj.up_thread_all_socket_close_call_check);
14168     
14169     // unit_test [10] up_thread_run ssl mode test down thread end wait check
14170     std::cerr << "[10] up_thread_run ssl mode test down thread wait check" << std::endl;
14171 /*
14172     BOOST_CHECK(thread_state.test(0));    // UP_THREAD_ALIVE
14173     BOOST_CHECK(thread_state.test(1)); // DOWN_THREAD_ALIVE
14174     BOOST_CHECK(!thread_state.test(2)); // UP_THREAD_ACTIVE
14175     BOOST_CHECK(!thread_state.test(3)); // DOWN_THREAD_ACTIVE
14176     BOOST_CHECK(!thread_state.test(4)); // UP_THREAD_LOCK
14177     BOOST_CHECK(!thread_state.test(5)); // DOWN_THREAD_LOCK
14178 */
14179     
14180     
14181 //     proto_test.handle_session_finalize_in_up_thread_id = boost::thread::id();
14182 //     proto_test.handle_session_finalize_in_down_thread_id = boost::thread::id();
14183 //     BOOST_CHECK(proto_test.handle_session_finalize_in_up_thread_id != test_id);
14184 //     BOOST_CHECK(proto_test.handle_session_finalize_in_down_thread_id != proc_id);
14185 //     vs.release_session_ptr = NULL;
14186 //     BOOST_CHECK(vs.release_session_ptr != test_id);
14187     
14188 //    thread_state[1] = 0;
14189     sleep(1);
14190     
14191     // unit_test [11] up_thread_run ssl mode test handle_session_finalize call check
14192     std::cerr << "[11] up_thread_run ssl mode test handle_session_finalize call check" << std::endl;
14193     BOOST_CHECK(proto_test.handle_session_finalize_in_up_thread_id == test_id);
14194     BOOST_CHECK(proto_test.handle_session_finalize_in_down_thread_id == proc_id);
14195     
14196     // unit_test [12] up_thread_run ssl mode test release_session_id call check
14197     std::cerr << "[12] up_thread_run ssl mode test release_session_id call check" << std::endl;
14198 //     BOOST_CHECK(vs.release_session_id == test_id);
14199     
14200     // unit_test [13] up_thread_run ssl mode test state update(UP_THREAD_ACTIVE) check
14201     std::cerr << "[13] up_thread_run state update(UP_THREAD_ACTIVE) check" << std::endl;
14202 //    BOOST_CHECK(!thread_state.test(0)); // UP_THREAD_ACTIVE
14203     
14204     // message call test
14205     exit_flag = false;
14206 //    session_pause_flag = false;
14207     l7vs::tcp_data& msg_data = test_obj.get_up_thread_message_data();
14208     test_obj.test_message_set(connect_end);
14209 /*
14210     thread_state[0] = 0;    // UP_THREAD_ALIVE
14211     thread_state[1] = 1;    // DOWN_THREAD_ALIVE
14212     thread_state[2] = 0;    // UP_THREAD_ACTIVE
14213     thread_state[3] = 0;    // DOWN_THREAD_ACTIVE
14214     thread_state[4] = 0;    // UP_THREAD_LOCK
14215     thread_state[5] = 0;    // DOWN_THREAD_LOCK
14216 */
14217     msg_data.set_endpoint(boost::asio::ip::tcp::endpoint());
14218     test_obj.up_thread_exit_call_check = false;
14219     test_obj.up_thread_exit_process_type = l7vs::tcp_session::LOCAL_PROC;
14220     proto_test.handle_session_initialize_res_tag = l7vs::protocol_module_base::CLIENT_DISCONNECT;
14221     
14222     // test thread start
14223     test_obj.test_wait = false;
14224     sleep(1);
14225 /*
14226     BOOST_CHECK(thread_state.test(0));    // UP_THREAD_ALIVE
14227     BOOST_CHECK(thread_state.test(1)); // DOWN_THREAD_ALIVE
14228     BOOST_CHECK(!thread_state.test(2)); // UP_THREAD_ACTIVE
14229     BOOST_CHECK(!thread_state.test(3)); // DOWN_THREAD_ACTIVE
14230     BOOST_CHECK(!thread_state.test(4)); // UP_THREAD_LOCK
14231     BOOST_CHECK(!thread_state.test(5)); // DOWN_THREAD_LOCK
14232 */
14233     
14234     // unit_test [14] up_thread_run ssl mode test message call check
14235     std::cerr << "[14] up_thread_run ssl mode test message call check" << std::endl;
14236     BOOST_CHECK(test_obj.up_thread_exit_call_check);
14237     BOOST_CHECK(test_obj.up_thread_exit_process_type == l7vs::tcp_session::MESSAGE_PROC);
14238     
14239     proto_test.handle_session_initialize_res_tag = l7vs::protocol_module_base::FINALIZE;
14240 //    thread_state[1] = 0;
14241     sleep(1);
14242     
14243     // error test not find function map 
14244     test_obj.clear_function_array();
14245     exit_flag = false;
14246 //    session_pause_flag = false;
14247 //    thread_state[1] = 1;
14248     
14249     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
14250     l7vs::Logger::putLogError_id = 0;
14251     
14252     test_obj.test_wait = false;
14253     sleep(1);
14254     
14255     // unit_test [15] up_thread_run ssl mode test not find function map error test
14256     std::cerr << "[15] up_thread_run ssl mode test not find function map error test" << std::endl;
14257     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
14258     BOOST_CHECK_EQUAL(15,l7vs::Logger::putLogError_id);
14259     std::cerr << l7vs::Logger::putLogError_message << std::endl;
14260
14261 //    thread_state[1] = 0;
14262     sleep(1);
14263     
14264     //error test protocol_module returnd illegal EVENT_TAG
14265     test_obj.clear_event_map();
14266     exit_flag = false;
14267 //    session_pause_flag = false;
14268 //    thread_state[1] = 1;
14269     
14270     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
14271     l7vs::Logger::putLogError_id = 0;
14272     
14273     test_obj.test_wait = false;
14274     sleep(1);
14275     
14276     // unit_test [16] up_thread_run ssl mode test protocol_module returnd illegal EVENT_TAG error test
14277     std::cerr << "[16] up_thread_run ssl mode test protocol_module returnd illegal EVENT_TAG error test" << std::endl;
14278     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
14279     BOOST_CHECK_EQUAL(14,l7vs::Logger::putLogError_id);
14280     std::cerr << l7vs::Logger::putLogError_message << std::endl;
14281     
14282 //    thread_state[1] = 0;
14283     sleep(1);
14284     
14285     
14286     // unit_test [17] up_thread_run ssl mode test set non blocking fail check
14287     std::cerr << "[17] up_thread_run ssl mode test set non blocking fail check" << std::endl;
14288     exit_flag = false;
14289 //    session_pause_flag = false;
14290 //    thread_state[1] = 1;
14291     
14292     l7vs::tcp_socket::set_non_blocking_mode_res = false;
14293     l7vs::tcp_socket::set_non_blocking_mode_ec = boost::asio::error::bad_descriptor;
14294     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
14295     l7vs::Logger::putLogError_id = 0;
14296     
14297     test_obj.test_wait = false;
14298     sleep(1);
14299     
14300     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
14301     BOOST_CHECK_EQUAL(11,l7vs::Logger::putLogError_id);
14302     std::cerr << l7vs::Logger::putLogError_message << std::endl;
14303     l7vs::tcp_socket::set_non_blocking_mode_res = true;
14304     l7vs::tcp_socket::set_non_blocking_mode_ec.clear();
14305
14306 //    thread_state[1] = 0;
14307     sleep(1);
14308     
14309     //error test client endpoint get error 
14310     client_socket.lowest_layer().close(ec);
14311     exit_flag = false;
14312 //    session_pause_flag = false;
14313 //    thread_state[1] = 1;
14314     
14315     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
14316     l7vs::Logger::putLogError_id = 0;
14317     
14318     test_obj.test_wait = false;
14319     sleep(1);
14320     
14321     // unit_test [18] up_thread_run ssl mode test client endpoint get error test
14322     std::cerr << "[18] up_thread_run ssl mode test client endpoint get error test" << std::endl;
14323     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
14324     BOOST_CHECK_EQUAL(9,l7vs::Logger::putLogError_id);
14325     std::cerr << l7vs::Logger::putLogError_message << std::endl;
14326     
14327 //    thread_state[1] = 0;
14328     sleep(1);
14329     
14330     //error test protocol module null error 
14331     test_obj.set_protocol_module(NULL);
14332     exit_flag = false;
14333 //    session_pause_flag = false;
14334 //    thread_state[1] = 1;
14335     
14336     l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
14337     l7vs::Logger::putLogError_id = 0;
14338     
14339     test_obj.test_wait = false;
14340     sleep(1);
14341     
14342     // unit_test [19] up_thread_run ssl mode test protocol module null error test
14343     std::cerr << "[19] up_thread_run ssl mode test protocol module null error test" << std::endl;
14344     BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION,l7vs::Logger::putLogError_category);
14345     BOOST_CHECK_EQUAL(8,l7vs::Logger::putLogError_id);
14346     std::cerr << l7vs::Logger::putLogError_message << std::endl;
14347     
14348 //    thread_state[1] = 0;
14349     sleep(1);
14350     
14351     test_obj.test_end = true;
14352     test_obj.test_wait = false;
14353     std::cerr << "test_thread.join wait" << std::endl;
14354     test_thread.join();
14355     std::cerr << "test_thread.join ok" << std::endl;
14356     
14357     
14358     test_server.breq_close_wait_flag = false;    
14359     test_server.bstop_flag = true;
14360     std::cerr << "server_thread.join wait" << std::endl;
14361     server_thread.join();
14362     std::cerr << "server_thread.join ok" << std::endl;
14363     
14364   
14365     BOOST_MESSAGE( "----- up_thread_run ssl mode test end -----" );
14366     
14367 }
14368 // endpoint_to_string test
14369 // endpoint_to_string test class
14370 class endpoint_to_string_test_class : public l7vs::tcp_session{
14371     public:
14372        endpoint_to_string_test_class(
14373                                 l7vs::virtualservice_tcp& vs,
14374                                 boost::asio::io_service& session_io,
14375                                 l7vs::tcp_socket_option_info& set_socket_option,
14376                                 boost::asio::ip::tcp::endpoint listen_endpoint,
14377                                 bool ssl_mode,
14378                                 boost::asio::ssl::context& set_ssl_context,
14379                                 bool set_ssl_cache_flag,
14380                                 int set_ssl_handshake_time_out,
14381                                 l7vs::logger_implement_access* set_access_logger) : l7vs::tcp_session(   vs,
14382                                                                                                    session_io,
14383                                                                                                    set_socket_option,
14384                                                                                                    listen_endpoint,
14385                                                                                                    ssl_mode,
14386                                                                                                    set_ssl_context,
14387                                                                                                    set_ssl_cache_flag,
14388                                                                                                    set_ssl_handshake_time_out,
14389                                                                                                    set_access_logger){};
14390         ~endpoint_to_string_test_class(){};
14391
14392         std::string test_call(boost::asio::ip::tcp::endpoint& test_endpoint){
14393             return endpoint_to_string(test_endpoint);
14394         };
14395
14396 };
14397 void endpoint_to_string_test(){
14398
14399     BOOST_MESSAGE( "----- endpoint_to_string test start -----" );
14400
14401     boost::asio::io_service io;
14402     l7vs::virtualservice_tcp vs;
14403     l7vs::tcp_socket_option_info set_option;
14404     //! TCP_NODELAY   (false:not set,true:set option)
14405     set_option.nodelay_opt = false;
14406     //! TCP_NODELAY option value  (false:off,true:on)
14407     set_option.nodelay_val = false;
14408     //! TCP_CORK      (false:not set,true:set option)
14409     set_option.cork_opt = false;
14410     //! TCP_CORK option value     (false:off,true:on)
14411     set_option.cork_val = false;
14412     //! TCP_QUICKACK  (false:not set,true:set option)
14413     set_option.quickack_opt = false;
14414     //! TCP_QUICKACK option value (false:off,true:on)
14415     set_option.quickack_val = false;
14416     //
14417     boost::asio::ip::tcp::endpoint listen_endpoint(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
14418     bool set_mode(true);
14419     boost::asio::ssl::context set_context(io,boost::asio::ssl::context::sslv23);
14420     bool set_ssl_cache_flag(false);
14421     int set_ssl_handshake_time_out = 0;
14422     //std::string access_log_file_name = "test";
14423     l7vs::logger_implement_access* plogger = NULL;//new l7vs::logger_implement_access(access_log_file_name);
14424
14425     boost::system::error_code ec;
14426
14427     endpoint_to_string_test_class test_obj(vs,io,set_option,listen_endpoint,set_mode,set_context,set_ssl_cache_flag,set_ssl_handshake_time_out,plogger);
14428
14429     // unit_test [1] endpoint_to_string test IPv4 Address case 1(192.168.0.1:8080) test
14430     std::cerr << "[1] endpoint_to_string test IPv4 Address case 1(192.168.0.1:8080) test" << std::endl;
14431     {
14432         boost::asio::ip::tcp::endpoint test_endpoint(boost::asio::ip::address::from_string("192.168.0.1"), 8080);
14433         std::string ref("192.168.0.1:8080");
14434         std::string test_string = test_obj.test_call(test_endpoint);
14435         BOOST_CHECK_EQUAL(ref,test_string);
14436     }
14437     // unit_test [2] endpoint_to_string test IPv4 Address case 2(0.0.0.0:0) test
14438     std::cerr << "[2] endpoint_to_string test IPv4 Address case 2(0.0.0.0:0) test" << std::endl;
14439     {
14440         boost::asio::ip::tcp::endpoint test_endpoint(boost::asio::ip::address::from_string("0.0.0.0"), 0);
14441         std::string ref("0.0.0.0:0");
14442         std::string test_string = test_obj.test_call(test_endpoint);
14443         BOOST_CHECK_EQUAL(ref,test_string);
14444     }
14445     // unit_test [3] endpoint_to_string test IPv4 Address case 3(255.255.255.255:65535) test
14446     std::cerr << "[3] endpoint_to_string test IPv4 Address case 3(255.255.255.255:65535) test" << std::endl;
14447     {        boost::asio::ip::tcp::endpoint test_endpoint(boost::asio::ip::address::from_string("255.255.255.255"), 65535);
14448         std::string ref("255.255.255.255:65535");
14449         std::string test_string = test_obj.test_call(test_endpoint);
14450         BOOST_CHECK_EQUAL(ref,test_string);
14451     }
14452     // unit_test [4] endpoint_to_string test IPv6 Address case 1([2031:130f:876a::156a]:8080) test
14453     std::cerr << "[4] endpoint_to_string test IPv6 Address case 1([2031:130f:876a::156a]:8080) test" << std::endl;
14454     {
14455         boost::asio::ip::tcp::endpoint test_endpoint(boost::asio::ip::address::from_string("2031:130f:876a::156a"), 8080);
14456         std::string ref("[2031:130f:876a::156a]:8080");
14457         std::string test_string = test_obj.test_call(test_endpoint);
14458         BOOST_CHECK_EQUAL(ref,test_string);
14459     }
14460     // unit_test [5] endpoint_to_string test IPv6 Address case 2([::]:0) test
14461     std::cerr << "[5] endpoint_to_string test IPv6 Address case 2([::]:0) test" << std::endl;
14462     {
14463         boost::asio::ip::tcp::endpoint test_endpoint(boost::asio::ip::address::from_string("::"), 0);
14464         std::string ref("[::]:0");
14465         std::string test_string = test_obj.test_call(test_endpoint);
14466         BOOST_CHECK_EQUAL(ref,test_string);
14467     }
14468     // unit_test [6] endpoint_to_string test IPv6 Address case 3([ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]:65535) test
14469     std::cerr << "[6] endpoint_to_string test IPv6 Address case 3([ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]:65535) test" << std::endl;
14470     {
14471         boost::asio::ip::tcp::endpoint test_endpoint(boost::asio::ip::address::from_string("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"), 65535);
14472         std::string ref("[ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]:65535");
14473         std::string test_string = test_obj.test_call(test_endpoint);
14474         BOOST_CHECK_EQUAL(ref,test_string);
14475     }
14476     // unit_test [7] endpoint_to_string test IPv6 Address case 4([fe80::2%<1st ifname>]:8080) test
14477     std::cerr << "[7] endpoint_to_string test IPv6 Address case 4([fe80::2%<1st ifname>]:8080) test" << std::endl;
14478     {
14479         boost::asio::ip::address_v6 v6addr(boost::asio::ip::address_v6::from_string("fe80::2"));
14480         v6addr.scope_id(1);
14481         boost::asio::ip::tcp::endpoint test_endpoint(v6addr, 8080);
14482         BOOST_CHECK( test_endpoint.address().to_v6().scope_id() == 1);
14483         BOOST_CHECK(test_endpoint.address().to_v6().is_link_local());
14484         char if_name[IF_NAMESIZE];
14485         memset(if_name,0,IF_NAMESIZE);
14486         if_indextoname(1,if_name);
14487         std::string set_if_name(if_name);
14488         std::string ref = "[fe80::2%" + set_if_name  + "]:8080";
14489         std::string test_string = test_obj.test_call(test_endpoint);
14490         BOOST_CHECK_EQUAL(ref,test_string);
14491     }
14492     // unit_test [8] endpoint_to_string test IPv6 Address case 5([::ffff:192.168.0.1]:8080) test
14493     std::cerr << "[8] endpoint_to_string test IPv6 Address case 5([::ffff:192.168.0.1]:8080) test" << std::endl;
14494     {
14495         boost::asio::ip::tcp::endpoint test_endpoint(boost::asio::ip::address::from_string("::ffff:192.168.0.1"), 8080);
14496         std::string ref("[::ffff:192.168.0.1]:8080");
14497         std::string test_string = test_obj.test_call(test_endpoint);
14498         BOOST_CHECK_EQUAL(ref,test_string);
14499     }
14500
14501     BOOST_MESSAGE( "----- endpoint_to_string test end -----" );
14502 }
14503
14504
14505
14506
14507 test_suite*    init_unit_test_suite( int argc, char* argv[] ){
14508
14509     test_suite* ts = BOOST_TEST_SUITE( "l7vs::tcp_socket class test" );
14510
14511 //    ts->add( BOOST_TEST_CASE( &constructer_test ) );
14512 //    ts->add( BOOST_TEST_CASE( &initialize_test ) );
14513 //    ts->add( BOOST_TEST_CASE( &initialize_ssl_mode_test ) );
14514 //    ts->add( BOOST_TEST_CASE( &ssl_clear_keep_cache_test ) );
14515 //    ts->add( BOOST_TEST_CASE( &get_client_socket_test) );
14516 //    ts->add( BOOST_TEST_CASE( &handle_ssl_handshake_timer_test) );
14517 //    ts->add( BOOST_TEST_CASE( &is_thread_wait_test) );
14518 //    ts->add( BOOST_TEST_CASE( &set_virtual_service_message_test) );
14519 //    ts->add( BOOST_TEST_CASE( &endpoint_to_string_test ));
14520
14521 //    ts->add( BOOST_TEST_CASE( &up_thread_run_test) );
14522 //    ts->add( BOOST_TEST_CASE( &up_thread_run_ssl_mode_test ) );
14523 //    ts->add( BOOST_TEST_CASE( &down_thread_run_test) );
14524 //    ts->add( BOOST_TEST_CASE( &thread_state_update_test) );
14525 //    ts->add( BOOST_TEST_CASE( &up_thread_client_respond_test) );
14526 //    ts->add( BOOST_TEST_CASE( &up_thread_realserver_get_detination_event_test) );
14527 //    ts->add( BOOST_TEST_CASE( &up_thread_sorryserver_get_detination_event_test) );
14528
14529 //    ts->add( BOOST_TEST_CASE( &up_thread_all_socket_close_test) );
14530 //    ts->add( BOOST_TEST_CASE( &down_thread_all_socket_close_test) );
14531 //    ts->add( BOOST_TEST_CASE( &up_thread_client_disconnect_test) );
14532 //    ts->add( BOOST_TEST_CASE( &down_thread_client_disconnect_test) );
14533 //    ts->add( BOOST_TEST_CASE( &up_thread_sorryserver_disconnect_test) );
14534 //    ts->add( BOOST_TEST_CASE( &down_thread_sorryserver_disconnect_test) );
14535 //    ts->add( BOOST_TEST_CASE( &up_thread_realserver_connect_event_test) );
14536 //    ts->add( BOOST_TEST_CASE( &up_thread_sorryserver_connect_event_test) );
14537 //    ts->add( BOOST_TEST_CASE( &down_thread_client_connection_chk_event_test) );
14538 //    ts->add( BOOST_TEST_CASE( &up_thread_realserver_connection_fail_event_test) );
14539 //    ts->add( BOOST_TEST_CASE( &up_thread_sorryserver_connection_fail_event_test) );
14540
14541 //    ts->add( BOOST_TEST_CASE( &up_thread_client_accept_test ) );
14542 //    ts->add( BOOST_TEST_CASE( &up_thread_client_receive_test) );
14543 //    ts->add( BOOST_TEST_CASE( &down_thread_realserver_receive_test) );
14544 //    ts->add( BOOST_TEST_CASE( &down_thread_sorryserver_receive_test) );
14545 //    ts->add( BOOST_TEST_CASE( &up_thread_realserver_send_test) );
14546 //    ts->add( BOOST_TEST_CASE( &up_thread_sorryserver_send_test) );
14547 //    ts->add( BOOST_TEST_CASE( &down_thread_client_send_test) );
14548     ts->add( BOOST_TEST_CASE( &up_thread_realserver_connect_test) );
14549 //    ts->add( BOOST_TEST_CASE( &up_thread_realserver_connect_access_log_test) );
14550     ts->add( BOOST_TEST_CASE( &up_thread_sorryserver_connect_test) );
14551 //    ts->add( BOOST_TEST_CASE( &up_thread_realserver_disconnect_test) );
14552 //    ts->add( BOOST_TEST_CASE( &down_thread_realserver_disconnect_test) );
14553 //    ts->add( BOOST_TEST_CASE( &up_thread_all_realserver_disconnect_test) );
14554 //    ts->add( BOOST_TEST_CASE( &down_thread_all_realserver_disconnect_test) );
14555
14556 //    ts->add( BOOST_TEST_CASE( &up_thread_exit_test ) );
14557 //    ts->add( BOOST_TEST_CASE( &down_thread_exit_test ) );
14558 //    ts->add( BOOST_TEST_CASE( &up_thread_client_disconnect_event_test ) );
14559 //    ts->add( BOOST_TEST_CASE( &down_thread_client_disconnect_event_test ) );
14560 //    ts->add( BOOST_TEST_CASE( &up_thread_realserver_disconnect_event_test ) );
14561 //    ts->add( BOOST_TEST_CASE( &down_thread_realserver_disconnect_event_test ) );
14562 //    ts->add( BOOST_TEST_CASE( &up_thread_sorryserver_disconnect_event_test ) );
14563 //    ts->add( BOOST_TEST_CASE( &down_thread_sorryserver_disconnect_event_test ) );
14564 //    ts->add( BOOST_TEST_CASE( &up_thread_sorryserver_mod_disconnect_test ) );
14565 //    ts->add( BOOST_TEST_CASE( &down_thread_sorryserver_mod_disconnect_test ) );
14566
14567 //    ts->add( BOOST_TEST_CASE( &up_thread_sorry_enable_event_test ) );
14568 //    ts->add( BOOST_TEST_CASE( &up_thread_sorry_disable_event_test ) );
14569 //    ts->add( BOOST_TEST_CASE( &down_thread_sorry_enable_event_test ) );
14570 //    ts->add( BOOST_TEST_CASE( &down_thread_sorry_disable_event_test ) );
14571 //    ts->add( BOOST_TEST_CASE( &up_thread_client_accept_event_test ) );
14572 //    ts->add( BOOST_TEST_CASE( &up_thread_client_respond_event_test ) );
14573 //    ts->add( BOOST_TEST_CASE( &down_thread_client_respond_event_test ) );
14574
14575     framework::master_test_suite().add( ts );
14576
14577     return NULL;
14578 }